ZGlmZiAtLWdpdCBhLy5lZGl0b3Jjb25maWcgYi8uZWRpdG9yY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNTRkN2QKLS0tIC9kZXYvbnVsbAorKysgYi8uZWRpdG9yY29uZmlnCkBAIC0wLDAgKzEsMjU3IEBACityb290ID0gdHJ1ZQorCitbKl0KKworaW5kZW50X3N0eWxlID0gc3BhY2UKK2luZGVudF9zaXplID0gMgordGFiX3dpZHRoID0gMgoraW5zZXJ0X2ZpbmFsX25ld2xpbmUgPSB0cnVlCitlbmRfb2ZfbGluZSA9IGxmCit0cmltX3RyYWlsaW5nX3doaXRlc3BhY2UgPSB0cnVlCitjaGFyc2V0ID0gdXRmLTgKK3Jlc2hhcnBlcl9lbmZvcmNlX2xpbmVfZW5kaW5nX3N0eWxlID0gdHJ1ZQorcmVzaGFycGVyX2FwcGx5X2F1dG9fZGV0ZWN0ZWRfcnVsZXMgPSBmYWxzZQorcmVzaGFycGVyX3VzZV9pbmRlbnRfZnJvbV92cyA9IGZhbHNlCisKKworWyoue2NzLCBjc3gsIGNha2UsIHZiLCB2Ynh9XQorCisjIEVuZm9yY2UgZ28vY3NzdHlsZQorIyBOYW1pbmcgcnVsZXMKKyMgSURFMTAwNiBtdXN0IGJlIHRyZWF0ZWQgYXMgYW4gZXJyb3IgZm9yIGFueSBvZiB0aGUgZm9sbG93aW5nIG5hbWluZyBydWxlcyB0byBhZmZlY3QgYnVpbGRzCitkb3RuZXRfZGlhZ25vc3RpYy5JREUxMDA2LnNldmVyaXR5ID0gZXJyb3IKKworIyB0aGlzLiBwcmVmZXJlbmNlcworZG90bmV0X3N0eWxlX3F1YWxpZmljYXRpb25fZm9yX2ZpZWxkID0gZmFsc2U6ZXJyb3IKK2RvdG5ldF9zdHlsZV9xdWFsaWZpY2F0aW9uX2Zvcl9wcm9wZXJ0eSA9IGZhbHNlOmVycm9yCitkb3RuZXRfc3R5bGVfcXVhbGlmaWNhdGlvbl9mb3JfbWV0aG9kID0gZmFsc2U6ZXJyb3IKK2RvdG5ldF9zdHlsZV9xdWFsaWZpY2F0aW9uX2Zvcl9ldmVudCA9IGZhbHNlOmVycm9yCisKKyMgUGFzY2FsIGNhc2Ugc3R5bGUKK2RvdG5ldF9uYW1pbmdfc3R5bGUucGFzY2FsLmNhcGl0YWxpemF0aW9uID0gcGFzY2FsX2Nhc2UKKyMgSW50ZXJmYWNlIHN0eWxlCitkb3RuZXRfbmFtaW5nX3N0eWxlLmludGVyZmFjZS5jYXBpdGFsaXphdGlvbiA9IHBhc2NhbF9jYXNlCitkb3RuZXRfbmFtaW5nX3N0eWxlLmludGVyZmFjZS5yZXF1aXJlZF9wcmVmaXggPSBJCisjIENhbWVsLWNhc2Ugc3R5bGUKK2RvdG5ldF9uYW1pbmdfc3R5bGUuY2FtZWwuY2FwaXRhbGl6YXRpb24gPSBjYW1lbF9jYXNlCisjIENhbWVsLWNhc2UgYmVnaW5uaW5nIHdpdGggdW5kZXJzY29yZSBzdHlsZQorZG90bmV0X25hbWluZ19zdHlsZS51bmRlcnNjb3JlX2NhbWVsLmNhcGl0YWxpemF0aW9uID0gY2FtZWxfY2FzZQorZG90bmV0X25hbWluZ19zdHlsZS51bmRlcnNjb3JlX2NhbWVsLnJlcXVpcmVkX3ByZWZpeCA9IF8KKworIyBTeW1ib2xzIGZvciBuYW1lc3BhY2VzCitkb3RuZXRfbmFtaW5nX3N5bWJvbHMubmFtZXNwYWNlcy5hcHBsaWNhYmxlX2tpbmRzID0gbmFtZXNwYWNlCitkb3RuZXRfbmFtaW5nX3N5bWJvbHMubmFtZXNwYWNlcy5hcHBsaWNhYmxlX2FjY2Vzc2liaWxpdGllcyA9ICoKKyMgU3ltYm9scyBmb3IgdHlwZXMKK2RvdG5ldF9uYW1pbmdfc3ltYm9scy50eXBlcy5hcHBsaWNhYmxlX2tpbmRzID0gY2xhc3MsIHN0cnVjdCwgZGVsZWdhdGUsIHR5cGVfcGFyYW1ldGVyCitkb3RuZXRfbmFtaW5nX3N5bWJvbHMudHlwZXMuYXBwbGljYWJsZV9hY2Nlc3NpYmlsaXRpZXMgPSAqCisjIFN5bWJvbHMgZm9yIGludGVyZmFjZXMKK2RvdG5ldF9uYW1pbmdfc3ltYm9scy5pbnRlcmZhY2VzLmFwcGxpY2FibGVfa2luZHMgPSBpbnRlcmZhY2UKK2RvdG5ldF9uYW1pbmdfc3ltYm9scy5pbnRlcmZhY2VzLmFwcGxpY2FibGVfYWNjZXNzaWJpbGl0aWVzID0gKgorIyBTeW1ib2xzIGZvciBlbnVtcworZG90bmV0X25hbWluZ19zeW1ib2xzLmVudW1zLmFwcGxpY2FibGVfa2luZHMgPSBlbnVtCitkb3RuZXRfbmFtaW5nX3N5bWJvbHMuZW51bXMuYXBwbGljYWJsZV9hY2Nlc3NpYmlsaXRpZXMgPSAqCisjIFN5bWJvbHMgZm9yIHB1YmxpYyBmaWVsZHMgYW5kIHByb3BlcnRpZXMKK2RvdG5ldF9uYW1pbmdfc3ltYm9scy5wdWJsaWNfZmllbGRzX3Byb3BlcnRpZXMuYXBwbGljYWJsZV9raW5kcyA9IGZpZWxkLCBwcm9wZXJ0eQorZG90bmV0X25hbWluZ19zeW1ib2xzLnB1YmxpY19maWVsZHNfcHJvcGVydGllcy5hcHBsaWNhYmxlX2FjY2Vzc2liaWxpdGllcyA9IHB1YmxpYworIyBTeW1ib2xzIGZvciBub24tcHVibGljIGZpZWxkcyBhbmQgcHJvcGVydGllcyAtIFVuZW5mb3JjZWQKK2RvdG5ldF9uYW1pbmdfc3ltYm9scy5ub25fcHVibGljX2ZpZWxkc19wcm9wZXJ0aWVzLmFwcGxpY2FibGVfa2luZHMgPSBmaWVsZCwgcHJvcGVydHkKK2RvdG5ldF9uYW1pbmdfc3ltYm9scy5ub25fcHVibGljX2ZpZWxkc19wcm9wZXJ0aWVzLmFwcGxpY2FibGVfYWNjZXNzaWJpbGl0aWVzID0gaW50ZXJuYWwsIHByaXZhdGUsIHByb3RlY3RlZCwgcHJvdGVjdGVkX2ludGVybmFsCisjIFN5bWJvbHMgZm9yIG5vbi1wdWJsaWMgY29uc3RhbnRzCitkb3RuZXRfbmFtaW5nX3N5bWJvbHMucHJpdmF0ZV9jb25zdGFudHMuYXBwbGljYWJsZV9raW5kcyA9IGZpZWxkCitkb3RuZXRfbmFtaW5nX3N5bWJvbHMucHJpdmF0ZV9jb25zdGFudHMuYXBwbGljYWJsZV9hY2Nlc3NpYmlsaXRpZXMgPSBwcml2YXRlLCBwcm90ZWN0ZWQsIGludGVybmFsLCBwcm90ZWN0ZWRfaW50ZXJuYWwKK2RvdG5ldF9uYW1pbmdfc3ltYm9scy5wcml2YXRlX2NvbnN0YW50cy5yZXF1aXJlZF9tb2RpZmllcnMgPSBjb25zdAorIyBTeW1ib2xzIGZvciBwdWJsaWMgY29uc3RhbnRzCitkb3RuZXRfbmFtaW5nX3N5bWJvbHMucHVibGljX2NvbnN0YW50cy5hcHBsaWNhYmxlX2tpbmRzID0gZmllbGQKK2RvdG5ldF9uYW1pbmdfc3ltYm9scy5wdWJsaWNfY29uc3RhbnRzLmFwcGxpY2FibGVfYWNjZXNzaWJpbGl0aWVzID0gcHVibGljCitkb3RuZXRfbmFtaW5nX3N5bWJvbHMucHVibGljX2NvbnN0YW50cy5yZXF1aXJlZF9tb2RpZmllcnMgPSBjb25zdAorIyBTeW1ib2xzIGZvciBub24tcHVibGljIHN0YXRpYyByZWFkb25seSBmaWVsZHMgYW5kIHByb3BlcnRpZXMKK2RvdG5ldF9uYW1pbmdfc3ltYm9scy5wcml2YXRlX3N0YXRpY19yZWFkb25seS5hcHBsaWNhYmxlX2tpbmRzID0gZmllbGQsIHByb3BlcnR5Citkb3RuZXRfbmFtaW5nX3N5bWJvbHMucHJpdmF0ZV9zdGF0aWNfcmVhZG9ubHkuYXBwbGljYWJsZV9hY2Nlc3NpYmlsaXRpZXMgPSBwcml2YXRlLCBwcm90ZWN0ZWQsIGludGVybmFsLCBwcm90ZWN0ZWRfaW50ZXJuYWwKK2RvdG5ldF9uYW1pbmdfc3ltYm9scy5wcml2YXRlX3N0YXRpY19yZWFkb25seS5yZXF1aXJlZF9tb2RpZmllcnMgPSBzdGF0aWMsIHJlYWRvbmx5CisjIFN5bWJvbHMgZm9yIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZmllbGRzIGFuZCBwcm9wZXJ0aWVzCitkb3RuZXRfbmFtaW5nX3N5bWJvbHMucHVibGljX3N0YXRpY19yZWFkb25seS5hcHBsaWNhYmxlX2tpbmRzID0gZmllbGQsIHByb3BlcnR5Citkb3RuZXRfbmFtaW5nX3N5bWJvbHMucHVibGljX3N0YXRpY19yZWFkb25seS5hcHBsaWNhYmxlX2FjY2Vzc2liaWxpdGllcyA9IHB1YmxpYworZG90bmV0X25hbWluZ19zeW1ib2xzLnB1YmxpY19zdGF0aWNfcmVhZG9ubHkucmVxdWlyZWRfbW9kaWZpZXJzID0gc3RhdGljLCByZWFkb25seQorIyBTeW1ib2xzIGZvciBtZXRob2RzIGFuZCBldmVudHMKK2RvdG5ldF9uYW1pbmdfc3ltYm9scy5tZXRob2RzLmFwcGxpY2FibGVfa2luZHMgPSBtZXRob2QsIGV2ZW50LCBsb2NhbF9mdW5jdGlvbgorZG90bmV0X25hbWluZ19zeW1ib2xzLm1ldGhvZHMuYXBwbGljYWJsZV9hY2Nlc3NpYmlsaXRpZXMgPSAqCisjIFN5bWJvbHMgZm9yIGxvY2FsIHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycworZG90bmV0X25hbWluZ19zeW1ib2xzLmxvY2FsX3ZhcmlhYmxlcy5hcHBsaWNhYmxlX2tpbmRzID0gbG9jYWwsIHBhcmFtZXRlcgorZG90bmV0X25hbWluZ19zeW1ib2xzLmxvY2FsX3ZhcmlhYmxlcy5hcHBsaWNhYmxlX2FjY2Vzc2liaWxpdGllcyA9ICoKKworIyBSdWxlIGZvciBuYW1lc3BhY2VzCitkb3RuZXRfbmFtaW5nX3J1bGUubmFtZXNwYWNlX3J1bGUuc3ltYm9scyA9IG5hbWVzcGFjZXMKK2RvdG5ldF9uYW1pbmdfcnVsZS5uYW1lc3BhY2VfcnVsZS5zdHlsZSA9IHBhc2NhbAorZG90bmV0X25hbWluZ19ydWxlLm5hbWVzcGFjZV9ydWxlLnNldmVyaXR5ID0gZXJyb3IKKyMgUnVsZSBmb3IgdHlwZXMKK2RvdG5ldF9uYW1pbmdfcnVsZS50eXBlX3J1bGUuc3ltYm9scyA9IHR5cGVzCitkb3RuZXRfbmFtaW5nX3J1bGUudHlwZV9ydWxlLnN0eWxlID0gcGFzY2FsCitkb3RuZXRfbmFtaW5nX3J1bGUudHlwZV9ydWxlLnNldmVyaXR5ID0gZXJyb3IKKyMgUnVsZSBmb3IgaW50ZXJmYWNlcworZG90bmV0X25hbWluZ19ydWxlLmludGVyZmFjZV9ydWxlLnN5bWJvbHMgPSBpbnRlcmZhY2VzCitkb3RuZXRfbmFtaW5nX3J1bGUuaW50ZXJmYWNlX3J1bGUuc3R5bGUgPSBpbnRlcmZhY2UKK2RvdG5ldF9uYW1pbmdfcnVsZS5pbnRlcmZhY2VfcnVsZS5zZXZlcml0eSA9IGVycm9yCisjIFJ1bGUgZm9yIGVudW1zIC0gRm9yIG5vdywgZG8gbm90IGVuZm9yY2UgZHVlIHRvIHNlcmlhbGl6YXRpb24KK2RvdG5ldF9uYW1pbmdfcnVsZS5lbnVtX3J1bGUuc3ltYm9scyA9IGVudW1zCitkb3RuZXRfbmFtaW5nX3J1bGUuZW51bV9ydWxlLnN0eWxlID0gcGFzY2FsCitkb3RuZXRfbmFtaW5nX3J1bGUuZW51bV9ydWxlLnNldmVyaXR5ID0gbm9uZQorIyBSdWxlIGZvciBwdWJsaWMgZmllbGRzIGFuZCBwcm9wZXJ0aWVzIC0gRm9yIG5vdywgZG8gbm90IGVuZm9yY2UgZHVlIHRvIHNlcmlhbGl6YXRpb24KK2RvdG5ldF9uYW1pbmdfcnVsZS5wdWJsaWNfZmllbGRfcHJvcGVydHlfcnVsZS5zeW1ib2xzID0gcHVibGljX2ZpZWxkc19wcm9wZXJ0aWVzCitkb3RuZXRfbmFtaW5nX3J1bGUucHVibGljX2ZpZWxkX3Byb3BlcnR5X3J1bGUuc3R5bGUgPSBwYXNjYWwKK2RvdG5ldF9uYW1pbmdfcnVsZS5wdWJsaWNfZmllbGRfcHJvcGVydHlfcnVsZS5zZXZlcml0eSA9IG5vbmUKKyMgUnVsZSBmb3Igbm9uLXB1YmxpYyBmaWVsZHMgYW5kIHByb3BlcnRpZXMgLSBOb3QgZW5mb3JjZWQKK2RvdG5ldF9uYW1pbmdfcnVsZS5ub25fcHVibGljX2ZpZWxkX3Byb3BlcnR5X3J1bGUuc3ltYm9scyA9IG5vbl9wdWJsaWNfZmllbGRzX3Byb3BlcnRpZXMKK2RvdG5ldF9uYW1pbmdfcnVsZS5ub25fcHVibGljX2ZpZWxkX3Byb3BlcnR5X3J1bGUuc3R5bGUgPSB1bmRlcnNjb3JlX2NhbWVsCitkb3RuZXRfbmFtaW5nX3J1bGUubm9uX3B1YmxpY19maWVsZF9wcm9wZXJ0eV9ydWxlLnNldmVyaXR5ID0gbm9uZQorIyBSdWxlIGZvciBub24tcHVibGljIGNvbnN0YW50cworZG90bmV0X25hbWluZ19ydWxlLnByaXZhdGVfY29uc3RhbnRfcnVsZS5zeW1ib2xzID0gcHJpdmF0ZV9jb25zdGFudHMKK2RvdG5ldF9uYW1pbmdfcnVsZS5wcml2YXRlX2NvbnN0YW50X3J1bGUuc3R5bGUgPSB1bmRlcnNjb3JlX2NhbWVsCitkb3RuZXRfbmFtaW5nX3J1bGUucHJpdmF0ZV9jb25zdGFudF9ydWxlLnNldmVyaXR5ID0gZXJyb3IKKyMgUnVsZSBmb3IgcHVibGljIGNvbnN0YW50cworZG90bmV0X25hbWluZ19ydWxlLnB1YmxpY19jb25zdGFudF9ydWxlLnN5bWJvbHMgPSBwdWJsaWNfY29uc3RhbnRzCitkb3RuZXRfbmFtaW5nX3J1bGUucHVibGljX2NvbnN0YW50X3J1bGUuc3R5bGUgPSBwYXNjYWwKK2RvdG5ldF9uYW1pbmdfcnVsZS5wdWJsaWNfY29uc3RhbnRfcnVsZS5zZXZlcml0eSA9IGVycm9yCisjIFJ1bGUgZm9yIG5vbi1wdWJsaWMgc3RhdGljIHJlYWRvbmx5IGZpZWxkcyBhbmQgcHJvcGVydGllcworZG90bmV0X25hbWluZ19ydWxlLnByaXZhdGVfc3RhdGljX3JlYWRvbmx5X3J1bGUuc3ltYm9scyA9IHByaXZhdGVfc3RhdGljX3JlYWRvbmx5Citkb3RuZXRfbmFtaW5nX3J1bGUucHJpdmF0ZV9zdGF0aWNfcmVhZG9ubHlfcnVsZS5zdHlsZSA9IHVuZGVyc2NvcmVfY2FtZWwKK2RvdG5ldF9uYW1pbmdfcnVsZS5wcml2YXRlX3N0YXRpY19yZWFkb25seV9ydWxlLnNldmVyaXR5ID0gZXJyb3IKKyMgUnVsZSBmb3IgcHVibGljIHN0YXRpYyByZWFkb25seSBmaWVsZHMgYW5kIHByb3BlcnRpZXMKK2RvdG5ldF9uYW1pbmdfcnVsZS5wcml2YXRlX3N0YXRpY19yZWFkb25seV9ydWxlLnN5bWJvbHMgPSBwdWJsaWNfc3RhdGljX3JlYWRvbmx5Citkb3RuZXRfbmFtaW5nX3J1bGUucHJpdmF0ZV9zdGF0aWNfcmVhZG9ubHlfcnVsZS5zdHlsZSA9IHBhc2NhbAorZG90bmV0X25hbWluZ19ydWxlLnByaXZhdGVfc3RhdGljX3JlYWRvbmx5X3J1bGUuc2V2ZXJpdHkgPSBlcnJvcgorIyBSdWxlIGZvciBtZXRob2RzIGFuZCBldmVudHMKK2RvdG5ldF9uYW1pbmdfcnVsZS5tZXRob2RfcnVsZS5zeW1ib2xzID0gbWV0aG9kcworZG90bmV0X25hbWluZ19ydWxlLm1ldGhvZF9ydWxlLnN0eWxlID0gcGFzY2FsCitkb3RuZXRfbmFtaW5nX3J1bGUubWV0aG9kX3J1bGUuc2V2ZXJpdHkgPSBlcnJvcgorIyBSdWxlIGZvciBsb2NhbCB2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnMKK2RvdG5ldF9uYW1pbmdfcnVsZS52YXJpYWJsZV9ydWxlLnN5bWJvbHMgPSBsb2NhbF92YXJpYWJsZXMKK2RvdG5ldF9uYW1pbmdfcnVsZS52YXJpYWJsZV9ydWxlLnN0eWxlID0gY2FtZWwKK2RvdG5ldF9uYW1pbmdfcnVsZS52YXJpYWJsZV9ydWxlLnNldmVyaXR5ID0gZXJyb3IKKworIyBPcmdhbml6YXRpb24KKworZG90bmV0X3N0eWxlX3JlcXVpcmVfYWNjZXNzaWJpbGl0eV9tb2RpZmllcnMgPSBmb3Jfbm9uX2ludGVyZmFjZV9tZW1iZXJzOnN1Z2dlc3Rpb24KK2RvdG5ldF9zb3J0X3N5c3RlbV9kaXJlY3RpdmVzX2ZpcnN0ID0gdHJ1ZQorcmVzaGFycGVyX3NvcnRfdXNpbmdzX3dpdGhfc3lzdGVtX2ZpcnN0ID0gdHJ1ZQorY3NoYXJwX3ByZXNlcnZlX3NpbmdsZV9saW5lX3N0YXRlbWVudHMgPSBmYWxzZQorIyBTaW5nbGUtbGluZSBibG9ja3MgY2FuIGJlIHRoaW5ncyBsaWtlIGF1dG8gcHJvcGVydGllcworY3NoYXJwX3ByZXNlcnZlX3NpbmdsZV9saW5lX2Jsb2NrcyA9IHRydWUKK2NzaGFycF91c2luZ19kaXJlY3RpdmVfcGxhY2VtZW50ID0gb3V0c2lkZV9uYW1lc3BhY2UKK2NzaGFycF90cmFpbGluZ19jb21tYV9pbl9tdWx0aWxpbmVfbGlzdHMgPSB0cnVlCitjc2hhcnBfdHJhaWxpbmdfY29tbWFfaW5fc2luZ2xlbGluZV9saXN0cyA9IGZhbHNlCityZXNoYXJwZXJfYXJyYW5nZV90cmFpbGluZ19jb21tYV9pbl9tdWx0aWxpbmVfbGlzdHNfaGlnaGxpZ2h0aW5nID0gd2FybmluZworcmVzaGFycGVyX2FycmFuZ2VfdHJhaWxpbmdfY29tbWFfaW5fc2luZ2xlbGluZV9saXN0c19oaWdobGlnaHRpbmcgPSB3YXJuaW5nCitkb3RuZXRfc3R5bGVfcHJlZGVmaW5lZF90eXBlX2Zvcl9tZW1iZXJfYWNjZXNzID0gdHJ1ZTp3YXJuaW5nCitkb3RuZXRfc3R5bGVfcHJlZGVmaW5lZF90eXBlX2Zvcl9sb2NhbHNfcGFyYW1ldGVyc19tZW1iZXJzID0gdHJ1ZTp3YXJuaW5nCityZXNoYXJwZXJfYXJyYW5nZV9zdGF0aWNfbWVtYmVyX3F1YWxpZmllcl9oaWdobGlnaHRpbmcgPSB3YXJuaW5nCisKKyMgV2hpdGVzcGFjZQorCittYXhfbGluZV9sZW5ndGggPSAxMDAKK2NzaGFycF9tYXhfbGluZV9sZW5ndGggPSAxMDAKK3Jlc2hhcnBlcl9jc2hhcnBfbWF4X2xpbmVfbGVuZ3RoID0gMTAwCityZXNoYXJwZXJfd3JhcF9saW5lcyA9IHRydWUKK3Jlc2hhcnBlcl9jb250aW51b3VzX2luZGVudF9tdWx0aXBsaWVyID0gMgorcmVzaGFycGVyX2FsaWduX211bHRpbGluZV9iaW5hcnlfZXhwcmVzc2lvbnNfY2hhaW4gPSBmYWxzZQorcmVzaGFycGVyX2FsaWduX211bHRpbGluZV9zdGF0ZW1lbnRfY29uZGl0aW9ucyA9IGZhbHNlCitjc2hhcnBfbmV3X2xpbmVfYmVmb3JlX29wZW5fYnJhY2UgPSBub25lCitjc2hhcnBfbmV3X2xpbmVfYmVmb3JlX2Vsc2UgPSBmYWxzZQorY3NoYXJwX25ld19saW5lX2JlZm9yZV9jYXRjaCA9IGZhbHNlCitjc2hhcnBfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHkgPSBmYWxzZQorY3NoYXJwX25ld19saW5lX2JlZm9yZV9tZW1iZXJzX2luX29iamVjdF9pbml0aWFsaXplcnMgPSBmYWxzZQorY3NoYXJwX25ld19saW5lX2JlZm9yZV9tZW1iZXJzX2luX2Fub255bW91c190eXBlcyA9IGZhbHNlCitjc2hhcnBfbmV3X2xpbmVfYmV0d2Vlbl9xdWVyeV9leHByZXNzaW9uX2NsYXVzZXMgPSB0cnVlCityZXNoYXJwZXJfYmxhbmtfbGluZXNfYWZ0ZXJfYmxvY2tfc3RhdGVtZW50cyA9IDAKK3Jlc2hhcnBlcl9ibGFua19saW5lc19hcm91bmRfc2luZ2xlX2xpbmVfYXV0b19wcm9wZXJ0eSA9IDEKK3Jlc2hhcnBlcl9ibGFua19saW5lc19hcm91bmRfc2luZ2xlX2xpbmVfcHJvcGVydHkgPSAxCityZXNoYXJwZXJfY3NoYXJwX2JsYW5rX2xpbmVzX2Fyb3VuZF9maWVsZCA9IDAKK3Jlc2hhcnBlcl9jc2hhcnBfYmxhbmtfbGluZXNfYXJvdW5kX3NpbmdsZV9saW5lX2ludm9jYWJsZSA9IDEKK3Jlc2hhcnBlcl9jc2hhcnBfYmxhbmtfbGluZXNfaW5zaWRlX3JlZ2lvbiA9IDAKK3Jlc2hhcnBlcl9jc2hhcnBfa2VlcF9ibGFua19saW5lc19pbl9jb2RlID0gMQorcmVzaGFycGVyX2NzaGFycF9rZWVwX2JsYW5rX2xpbmVzX2luX2RlY2xhcmF0aW9ucyA9IDEKK3Jlc2hhcnBlcl9jc2hhcnBfd3JhcF9hZnRlcl9kZWNsYXJhdGlvbl9scGFyID0gdHJ1ZQorcmVzaGFycGVyX2NzaGFycF93cmFwX2FmdGVyX2ludm9jYXRpb25fbHBhciA9IHRydWUKK3Jlc2hhcnBlcl9jc2hhcnBfd3JhcF9hcmd1bWVudHNfc3R5bGUgPSBjaG9wX2lmX2xvbmcKK3Jlc2hhcnBlcl9jc2hhcnBfd3JhcF9leHRlbmRzX2xpc3Rfc3R5bGUgPSBjaG9wX2lmX2xvbmcKK3Jlc2hhcnBlcl9jc2hhcnBfd3JhcF9wYXJhbWV0ZXJzX3N0eWxlID0gY2hvcF9pZl9sb25nCityZXNoYXJwZXJfa2VlcF9leGlzdGluZ19kZWNsYXJhdGlvbl9wYXJlbnNfYXJyYW5nZW1lbnQgPSBmYWxzZQorcmVzaGFycGVyX2tlZXBfZXhpc3RpbmdfZW1iZWRkZWRfYXJyYW5nZW1lbnQgPSBmYWxzZQorcmVzaGFycGVyX2tlZXBfZXhpc3RpbmdfaW52b2NhdGlvbl9wYXJlbnNfYXJyYW5nZW1lbnQgPSBmYWxzZQorcmVzaGFycGVyX2tlZXBfZXhpc3RpbmdfcHJvcGVydHlfcGF0dGVybnNfYXJyYW5nZW1lbnQgPSBmYWxzZQorcmVzaGFycGVyX2tlZXBfZXhpc3Rpbmdfc3dpdGNoX2V4cHJlc3Npb25fYXJyYW5nZW1lbnQgPSBmYWxzZQorcmVzaGFycGVyX21heF9hcnJheV9pbml0aWFsaXplcl9lbGVtZW50c19vbl9saW5lID0gMworcmVzaGFycGVyX21heF9pbml0aWFsaXplcl9lbGVtZW50c19vbl9saW5lID0gMworcmVzaGFycGVyX3BsYWNlX2FjY2Vzc29yaG9sZGVyX2F0dHJpYnV0ZV9vbl9zYW1lX2xpbmUgPSBmYWxzZQorcmVzaGFycGVyX3BsYWNlX2ZpZWxkX2F0dHJpYnV0ZV9vbl9zYW1lX2xpbmUgPSBmYWxzZQorcmVzaGFycGVyX3BsYWNlX3NpbXBsZV9lbWJlZGRlZF9zdGF0ZW1lbnRfb25fc2FtZV9saW5lID0gZmFsc2UKK3Jlc2hhcnBlcl93cmFwX2FycmF5X2luaXRpYWxpemVyX3N0eWxlID0gY2hvcF9pZl9sb25nCityZXNoYXJwZXJfd3JhcF9jaGFpbmVkX21ldGhvZF9jYWxscyA9IGNob3BfaWZfbG9uZworcmVzaGFycGVyX3dyYXBfdmVyYmF0aW1faW50ZXJwb2xhdGVkX3N0cmluZ3MgPSB3cmFwX2lmX2xvbmcKKyMgQnJhY2VzCitjc2hhcnBfcHJlZmVyX2JyYWNlcyA9IHRydWU6c2lsZW50CityZXNoYXJwZXJfYnJhY2VzX3JlZHVuZGFudCA9IHRydWUKK3Jlc2hhcnBlcl9jc2hhcnBfZW1wdHlfYmxvY2tfc3R5bGUgPSB0b2dldGhlcl9zYW1lX2xpbmUKK3Jlc2hhcnBlcl9lbmZvcmNlX2RvX3doaWxlX3N0YXRlbWVudF9icmFjZXNfaGlnaGxpZ2h0aW5nID0gd2FybmluZworcmVzaGFycGVyX2VuZm9yY2VfZml4ZWRfc3RhdGVtZW50X2JyYWNlc19oaWdobGlnaHRpbmcgPSB3YXJuaW5nCityZXNoYXJwZXJfZW5mb3JjZV9mb3JlYWNoX3N0YXRlbWVudF9icmFjZXNfaGlnaGxpZ2h0aW5nID0gd2FybmluZworcmVzaGFycGVyX2VuZm9yY2VfZm9yX3N0YXRlbWVudF9icmFjZXNfaGlnaGxpZ2h0aW5nID0gd2FybmluZworcmVzaGFycGVyX2VuZm9yY2VfaWZfc3RhdGVtZW50X2JyYWNlc19oaWdobGlnaHRpbmcgPSB3YXJuaW5nCityZXNoYXJwZXJfZW5mb3JjZV9sb2NrX3N0YXRlbWVudF9icmFjZXNfaGlnaGxpZ2h0aW5nID0gd2FybmluZworcmVzaGFycGVyX2VuZm9yY2VfdXNpbmdfc3RhdGVtZW50X2JyYWNlc19oaWdobGlnaHRpbmcgPSB3YXJuaW5nCityZXNoYXJwZXJfZW5mb3JjZV93aGlsZV9zdGF0ZW1lbnRfYnJhY2VzX2hpZ2hsaWdodGluZyA9IHdhcm5pbmcKK2NzaGFycF9pbmRlbnRfY2FzZV9jb250ZW50cyA9IHRydWUKK2NzaGFycF9pbmRlbnRfc3dpdGNoX2xhYmVscyA9IHRydWUKK2NzaGFycF9pbmRlbnRfYmxvY2tfY29udGVudHMgPSB0cnVlCitjc2hhcnBfaW5kZW50X2JyYWNlcyA9IGZhbHNlCitjc2hhcnBfaW5kZW50X2Nhc2VfY29udGVudHNfd2hlbl9ibG9jayA9IGZhbHNlCitjc2hhcnBfc3BhY2VfYWZ0ZXJfY2FzdCA9IGZhbHNlCityZXNoYXJwZXJfc3BhY2VfYWZ0ZXJfY2FzdCA9IGZhbHNlCityZXNoYXJwZXJfc3BhY2Vfd2l0aGluX3NpbmdsZV9saW5lX2FycmF5X2luaXRpYWxpemVyX2JyYWNlcyA9IHRydWUKK3Jlc2hhcnBlcl9zcGFjZV93aXRoaW5fZW1wdHlfYnJhY2VzID0gZmFsc2UKK2NzaGFycF9zcGFjZV9iZWZvcmVfY29tbWEgPSBmYWxzZQorY3NoYXJwX3NwYWNlX2FmdGVyX2NvbW1hID0gdHJ1ZQorY3NoYXJwX3NwYWNlX2FmdGVyX2RvdCA9IGZhbHNlCitjc2hhcnBfc3BhY2VfYWZ0ZXJfa2V5d29yZHNfaW5fY29udHJvbF9mbG93X3N0YXRlbWVudHMgPSB0cnVlCitjc2hhcnBfc3BhY2VfYmV0d2Vlbl9tZXRob2RfY2FsbF9wYXJhbWV0ZXJfbGlzdF9wYXJlbnRoZXNlcyA9IGZhbHNlCitjc2hhcnBfc3BhY2VfYmV0d2Vlbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVyX2xpc3RfcGFyZW50aGVzZXMgPSBmYWxzZQorY3NoYXJwX3NwYWNlX2JldHdlZW5fbWV0aG9kX2RlY2xhcmF0aW9uX2VtcHR5X3BhcmFtZXRlcl9saXN0X3BhcmVudGhlc2VzID0gZmFsc2UKK2NzaGFycF9zcGFjZV9iZWZvcmVfY29sb25faW5faW5oZXJpdGFuY2VfY2xhdXNlID0gdHJ1ZQorY3NoYXJwX3NwYWNlX2FmdGVyX2NvbG9uX2luX2luaGVyaXRhbmNlX2NsYXVzZSA9IHRydWUKK2NzaGFycF9zcGFjZV9hcm91bmRfYmluYXJ5X29wZXJhdG9ycyA9IGJlZm9yZV9hbmRfYWZ0ZXIKK2NzaGFycF9zcGFjZV9iZXR3ZWVuX21ldGhvZF9jYWxsX25hbWVfYW5kX29wZW5pbmdfcGFyZW50aGVzaXMgPSBmYWxzZQorY3NoYXJwX3NwYWNlX2JldHdlZW5fbWV0aG9kX2NhbGxfZW1wdHlfcGFyYW1ldGVyX2xpc3RfcGFyZW50aGVzZXMgPSBmYWxzZQorY3NoYXJwX3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3Jfc3RhdGVtZW50ID0gdHJ1ZQorY3NoYXJwX3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yX3N0YXRlbWVudCA9IGZhbHNlCitjc2hhcnBfc3BhY2VfYXJvdW5kX2RlY2xhcmF0aW9uX3N0YXRlbWVudHMgPSBmYWxzZQorY3NoYXJwX3NwYWNlX2JlZm9yZV9vcGVuX3NxdWFyZV9icmFja2V0cyA9IGZhbHNlCitjc2hhcnBfc3BhY2VfYmV0d2Vlbl9lbXB0eV9zcXVhcmVfYnJhY2tldHMgPSBmYWxzZQorY3NoYXJwX3NwYWNlX2JldHdlZW5fc3F1YXJlX2JyYWNrZXRzID0gZmFsc2UKK2NzaGFycF9wbGFjZV9hdHRyaWJ1dGVfb25fc2FtZV9saW5lID0gZmFsc2UKK3Jlc2hhcnBlcl9wbGFjZV9hdHRyaWJ1dGVfb25fc2FtZV9saW5lID0gZmFsc2UKK3Jlc2hhcnBlcl9hcnJhbmdlX2F0dHJpYnV0ZXNfaGlnaGxpZ2h0aW5nID0gd2FybmluZworY3NoYXJwX2ZvcmNlX2F0dHJpYnV0ZV9zdHlsZSA9IFNlcGFyYXRlCisjIEJyYWNlcyByZXF1aXJlZCBldmVuIHdoZW4gb3B0aW9uYWwKK2NzaGFycF9icmFjZXNfZm9yX2lmZWxzZSA9IHJlcXVpcmVkCitjc2hhcnBfYnJhY2VzX2Zvcl9mb3IgPSByZXF1aXJlZAorY3NoYXJwX2JyYWNlc19mb3JfZm9yZWFjaCA9IHJlcXVpcmVkCitjc2hhcnBfYnJhY2VzX2Zvcl93aGlsZSA9IHJlcXVpcmVkCitjc2hhcnBfYnJhY2VzX2Zvcl9kb3doaWxlID0gcmVxdWlyZWQKK2NzaGFycF9icmFjZXNfZm9yX2xvY2sgPSByZXF1aXJlZAorY3NoYXJwX2JyYWNlc19mb3JfZml4ZWQgPSByZXF1aXJlZAorcmVzaGFycGVyX2JyYWNlc19mb3JfZm9yID0gcmVxdWlyZWQKK3Jlc2hhcnBlcl9icmFjZXNfZm9yX2ZvcmVhY2ggPSByZXF1aXJlZAorcmVzaGFycGVyX2JyYWNlc19mb3JfaWZlbHNlID0gcmVxdWlyZWQKK3Jlc2hhcnBlcl9icmFjZXNfZm9yX3doaWxlID0gcmVxdWlyZWQKK3Jlc2hhcnBlcl9icmFjZXNfcmVkdW5kYW50ID0gZmFsc2UKK3Jlc2hhcnBlcl9rZWVwX2V4aXN0aW5nX2RlY2xhcmF0aW9uX2Jsb2NrX2FycmFuZ2VtZW50ID0gdHJ1ZQorcmVzaGFycGVyX2tlZXBfZXhpc3RpbmdfZW1iZWRkZWRfYmxvY2tfYXJyYW5nZW1lbnQgPSB0cnVlCisjIEFzeW5jL2F3YWl0IHJ1bGVzLiBUaGVzZSBkb24ndCBzZWVtIHRvIGZhaWwgdGhlIGJ1aWxkIGluIFJpZGVyIGV2ZW4gdGhvdWdoIHRoZXkgc2hvdyB1cCBhcyBlcnJvcnMKKyMgaW4gdGhlICJQcm9ibGVtcyIgYm94IGFuZCBpbiB0aGUgY29kZSwgYnV0IGF0IGxlYXN0IHRoZXkgYXJlIHZpc3VhbGx5IG1hcmtlZCBhcyBlcnJvcnMuCityZXNoYXJwZXJfYXN5bmNfdm9pZF9sYW1iZGFfaGlnaGxpZ2h0aW5nID0gZXJyb3IKK3Jlc2hhcnBlcl9hc3luY192b2lkX21ldGhvZF9oaWdobGlnaHRpbmcgPSBlcnJvcgorZG90bmV0X2RpYWdub3N0aWMuQXN5bmNGaXhlcjAxLnNldmVyaXR5ID0gbm9uZQorZG90bmV0X2RpYWdub3N0aWMuQXN5bmNGaXhlcjAyLnNldmVyaXR5ID0gZXJyb3IKK2RvdG5ldF9kaWFnbm9zdGljLkFzeW5jRml4ZXIwMy5zZXZlcml0eSA9IGVycm9yCitkb3RuZXRfZGlhZ25vc3RpYy5Bc3luY0ZpeGVyMDQuc2V2ZXJpdHkgPSBlcnJvcgorZG90bmV0X2RpYWdub3N0aWMuQXN5bmNGaXhlcjA1LnNldmVyaXR5ID0gZXJyb3IKK3Jlc2hhcnBlcl9rZWVwX2V4aXN0aW5nX2VudW1fYXJyYW5nZW1lbnQgPSB0cnVlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ2VsbFN0b3JlLmNzIGIvRVBQbHVzL0NlbGxTdG9yZS5jcwppbmRleCA5ZTA1YTA2Li5jNzY3YTgyIDEwMDY0NAotLS0gYS9FUFBsdXMvQ2VsbFN0b3JlLmNzCisrKyBiL0VQUGx1cy9DZWxsU3RvcmUuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDE5MzkgKzEzLDE3MTQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTItMTEtMjUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIE9mZmljZU9wZW5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXA7CiAKLWludGVybmFsIGNsYXNzIEluZGV4QmFzZSA6IElDb21wYXJhYmxlPEluZGV4QmFzZT4KLSAgICB7ICAgICAgICAKLSAgICAgICAgaW50ZXJuYWwgc2hvcnQgSW5kZXg7Ci0gICAgICAgIHB1YmxpYyBpbnQgQ29tcGFyZVRvKEluZGV4QmFzZSBvdGhlcikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEluZGV4IDwgb3RoZXIuSW5kZXggPyAtMSA6IEluZGV4ID4gb3RoZXIuSW5kZXggPyAxIDogMDsKLSAgICAgICAgfQoraW50ZXJuYWwgY2xhc3MgSW5kZXhCYXNlIDogSUNvbXBhcmFibGU8SW5kZXhCYXNlPiB7CisgIGludGVybmFsIHNob3J0IEluZGV4OworCisgIHB1YmxpYyBpbnQgQ29tcGFyZVRvKEluZGV4QmFzZSBvdGhlcikgeworICAgIHJldHVybiBJbmRleCA8IG90aGVyLkluZGV4CisgICAgICAgID8gLTEKKyAgICAgICAgOiBJbmRleCA+IG90aGVyLkluZGV4CisgICAgICAgICAgICA/IDEKKyAgICAgICAgICAgIDogMDsKKyAgfQorfQorCitpbnRlcm5hbCBjbGFzcyBJbmRleEl0ZW0gOiBJbmRleEJhc2UgeworICBpbnRlcm5hbCBpbnQgSW5kZXhQb2ludGVyIHsgZ2V0OyBzZXQ7IH0KK30KKworaW50ZXJuYWwgY2xhc3MgQ29sdW1uSW5kZXggOiBJbmRleEJhc2UgeworICBpbnRlcm5hbCBJbmRleEJhc2UgX3NlYXJjaEl4ID0gbmV3KCk7CisKKyAgcHVibGljIENvbHVtbkluZGV4KCkgeworICAgIF9wYWdlcyA9IG5ldyBQYWdlSW5kZXhbQ2VsbFN0b3JlPGludD4uX3BhZ2VzUGVyQ29sdW1uTWluXTsKKyAgICBQYWdlQ291bnQgPSAwOworICB9CisKKyAgfkNvbHVtbkluZGV4KCkgeworICAgIF9wYWdlcyA9IG51bGw7CisgIH0KKworICBpbnRlcm5hbCBpbnQgR2V0UG9zaXRpb24oaW50IHJvdykgeworICAgIHZhciBwYWdlID0gKHNob3J0KShyb3cgPj4gQ2VsbFN0b3JlPGludD4uX3BhZ2VCaXRzKTsKKyAgICBfc2VhcmNoSXguSW5kZXggPSBwYWdlOworICAgIHZhciByZXMgPQorICAgICAgICAoX3BhZ2VzICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBwYWdlID49IDAKKyAgICAgICAgICAgICAgICAmJiBwYWdlIDwgUGFnZUNvdW50CisgICAgICAgICAgICAgICAgJiYgcGFnZSA8IF9wYWdlcy5MZW5ndGgKKyAgICAgICAgICAgICAgICAmJiBfcGFnZXNbcGFnZV0gIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIF9wYWdlc1twYWdlXS5JbmRleCA9PSBwYWdlKQorICAgICAgICAgICAgPyBwYWdlCisgICAgICAgICAgICA6IEFycmF5LkJpbmFyeVNlYXJjaChfcGFnZXMsIDAsIFBhZ2VDb3VudCwgX3NlYXJjaEl4KTsKKyAgICBpZiAocmVzID49IDApIHsKKyAgICAgIEdldFBhZ2Uocm93LCByZWYgcmVzKTsKKyAgICAgIHJldHVybiByZXM7CiAgICAgfQotICAgIGludGVybmFsIGNsYXNzIEluZGV4SXRlbSA6ICBJbmRleEJhc2UKLSAgICB7Ci0gICAgICAgIGludGVybmFsIGludCBJbmRleFBvaW50ZXIgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsgCi0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICB9ICAgICAgICAKLSAgICBpbnRlcm5hbCBjbGFzcyBDb2x1bW5JbmRleCA6IEluZGV4QmFzZQotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgSW5kZXhCYXNlIF9zZWFyY2hJeD1uZXcgSW5kZXhCYXNlKCk7Ci0gICAgICAgIHB1YmxpYyBDb2x1bW5JbmRleCAoKQotCSAgICB7Ci0gICAgICAgICAgICBfcGFnZXM9bmV3IFBhZ2VJbmRleFtDZWxsU3RvcmU8aW50Pi5QYWdlc1BlckNvbHVtbk1pbl07Ci0gICAgICAgICAgICBQYWdlQ291bnQ9MDsKLQkgICAgfQotICAgICAgICB+Q29sdW1uSW5kZXgoKQotCSAgICB7Ci0gICAgICAgICAgICBfcGFnZXM9bnVsbDsgICAgICAgICAgICAKLQkgICAgfQotICAgICAgICBpbnRlcm5hbCBpbnQgR2V0UG9zaXRpb24oaW50IFJvdykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhZ2UgPSAoc2hvcnQpKFJvdyA+PiBDZWxsU3RvcmU8aW50Pi5wYWdlQml0cyk7Ci0gICAgICAgICAgICBfc2VhcmNoSXguSW5kZXggPSBwYWdlOwotICAgICAgICAgICAgdmFyIHJlcyA9IChfcGFnZXMgIT0gbnVsbCAmJiBwYWdlID49IDAgJiYgcGFnZSA8IFBhZ2VDb3VudCAmJiBwYWdlIDwgX3BhZ2VzLkxlbmd0aCAmJiBfcGFnZXNbcGFnZV0gIT0gbnVsbCAmJiBfcGFnZXNbcGFnZV0uSW5kZXggPT0gcGFnZSkgPyBwYWdlIDogQXJyYXkuQmluYXJ5U2VhcmNoKF9wYWdlcywgMCwgUGFnZUNvdW50LCBfc2VhcmNoSXgpOwotICAgICAgICAgICAgaWYgKHJlcyA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEdldFBhZ2UoUm93LCByZWYgcmVzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBwID0gfnJlczsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoR2V0UGFnZShSb3csIHJlZiBwKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIHZhciBwID0gfnJlczsKIAotICAgICAgICBwcml2YXRlIGJvb2wgR2V0UGFnZShpbnQgUm93LCByZWYgaW50IHJlcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlcyA8IFBhZ2VDb3VudCAmJiBfcGFnZXNbcmVzXS5NaW5JbmRleCA8PSBSb3cgJiYgX3BhZ2VzW3Jlc10uTWF4SW5kZXggPj0gUm93KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChyZXMgKyAxIDwgUGFnZUNvdW50ICYmIChfcGFnZXNbcmVzICsgMV0uTWluSW5kZXggPD0gUm93KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcysrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZXMgKyAxIDwgUGFnZUNvdW50ICYmIF9wYWdlc1tyZXMgKyAxXS5NaW5JbmRleCA8PSBSb3cpOwotICAgICAgICAgICAgICAgICAgICAvL2lmIChyZXMgKyAxIDwgUGFnZUNvdW50ICYmIF9wYWdlc1tyZXMgKyAxXS5NYXhJbmRleCA+PSBSb3cpCi0gICAgICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgICAgICAgICAvL2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcyAtIDEgPj0gMCAmJiBfcGFnZXNbcmVzIC0gMV0uTWF4SW5kZXggPj0gUm93KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzLS07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJlcy0xID4gMCAmJiBfcGFnZXNbcmVzLTFdLk1heEluZGV4ID49IFJvdyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vaWYgKHJlcyA+IDApCi0gICAgICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgICAgICAgICAvL2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBpbnQgR2V0TmV4dFJvdyhpbnQgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL3ZhciBwYWdlID0gKGludCkoKHVsb25nKXJvdyA+PiBDZWxsU3RvcmU8aW50Pi5wYWdlQml0cyk7Ci0gICAgICAgICAgICB2YXIgcCA9IEdldFBvc2l0aW9uKHJvdyk7Ci0gICAgICAgICAgICBpZiAocCA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcCA9IH5wOwotICAgICAgICAgICAgICAgIGlmIChwID49IFBhZ2VDb3VudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoX3BhZ2VzW3BdLkluZGV4T2Zmc2V0ICsgX3BhZ2VzW3BdLlJvd3NbMF0uSW5kZXggPCByb3cpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwICsgMSA+PSBQYWdlQ291bnQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcGFnZXNbcCArIDFdLkluZGV4T2Zmc2V0ICsgX3BhZ2VzW3BdLlJvd3NbMF0uSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3BhZ2VzW3BdLkluZGV4T2Zmc2V0ICsgX3BhZ2VzW3BdLlJvd3NbMF0uSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHAgPCBQYWdlQ291bnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgciA9IF9wYWdlc1twXS5HZXROZXh0Um93KHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyID49IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfcGFnZXNbcF0uSW5kZXhPZmZzZXQgKyBfcGFnZXNbcF0uUm93c1tyXS5JbmRleDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK3AgPCBQYWdlQ291bnQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9wYWdlc1twXS5JbmRleE9mZnNldCArIF9wYWdlc1twXS5Sb3dzWzBdLkluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGludCBGaW5kTmV4dChpbnQgUGFnZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHAgPSBHZXRQb3NpdGlvbihQYWdlKTsKLSAgICAgICAgICAgIGlmIChwIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gfnA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBQYWdlSW5kZXhbXSBfcGFnZXM7Ci0gICAgICAgIGludGVybmFsIGludCBQYWdlQ291bnQ7CisgICAgaWYgKEdldFBhZ2Uocm93LCByZWYgcCkpIHsKKyAgICAgIHJldHVybiBwOwogICAgIH0KKyAgICByZXR1cm4gcmVzOworICB9CiAKLSAgICBpbnRlcm5hbCBjbGFzcyBQYWdlSW5kZXggOiBJbmRleEJhc2UKLSAgICB7Ci0gICAgICAgIGludGVybmFsIEluZGV4QmFzZSBfc2VhcmNoSXggPSBuZXcgSW5kZXhCYXNlKCk7Ci0gICAgICAgIHB1YmxpYyBQYWdlSW5kZXgoKQotCSAgICB7Ci0gICAgICAgICAgICBSb3dzID0gbmV3IEluZGV4SXRlbVtDZWxsU3RvcmU8aW50Pi5QYWdlU2l6ZU1pbl07Ci0gICAgICAgICAgICBSb3dDb3VudCA9IDA7Ci0JICAgIH0KLSAgICAgICAgcHVibGljIFBhZ2VJbmRleChJbmRleEl0ZW1bXSByb3dzLCBpbnQgY291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvd3MgPSByb3dzOwotICAgICAgICAgICAgUm93Q291bnQgPSBjb3VudDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgUGFnZUluZGV4KFBhZ2VJbmRleCBwYWdlSXRlbSwgaW50IHN0YXJ0LCBpbnQgc2l6ZSkKLSAgICAgICAgICAgIDp0aGlzKHBhZ2VJdGVtLCBzdGFydCwgc2l6ZSwgcGFnZUl0ZW0uSW5kZXgsIHBhZ2VJdGVtLk9mZnNldCkKLSAgICAgICAgewotCi0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFBhZ2VJbmRleChQYWdlSW5kZXggcGFnZUl0ZW0sIGludCBzdGFydCwgaW50IHNpemUsIHNob3J0IGluZGV4LCBpbnQgb2Zmc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICBSb3dzID0gbmV3IEluZGV4SXRlbVtDZWxsU3RvcmU8aW50Pi5HZXRTaXplKHNpemUpXTsKLSAgICAgICAgICAgIEFycmF5LkNvcHkocGFnZUl0ZW0uUm93cywgc3RhcnQsIFJvd3MsMCxzaXplKTsKLSAgICAgICAgICAgIFJvd0NvdW50ID0gc2l6ZTsKLSAgICAgICAgICAgIEluZGV4ID0gaW5kZXg7Ci0gICAgICAgICAgICBPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgflBhZ2VJbmRleCgpCi0JICAgIHsKLSAgICAgICAgICAgIFJvd3M9bnVsbDsKLQkgICAgfQotICAgICAgICBpbnRlcm5hbCBpbnQgT2Zmc2V0ID0gMDsKLSAgICAgICAgaW50ZXJuYWwgaW50IEluZGV4T2Zmc2V0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBJbmRleEV4cGFuZGVkICsgKGludClPZmZzZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgaW50IEluZGV4RXhwYW5kZWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChJbmRleCA8PCBDZWxsU3RvcmU8aW50Pi5wYWdlQml0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgSW5kZXhJdGVtW10gUm93cyB7IGdldDsgc2V0OyB9Ci0gICAgICAgIGludGVybmFsIGludCBSb3dDb3VudDsKLQotICAgICAgICBpbnRlcm5hbCBpbnQgR2V0UG9zaXRpb24oaW50IG9mZnNldCkKLSAgICAgICAgewotICAgICAgICAgICAgX3NlYXJjaEl4LkluZGV4ID0gKHNob3J0KW9mZnNldDsKLSAgICAgICAgICAgIHJldHVybiAoUm93cyAhPSBudWxsICYmIG9mZnNldCA+IDAgJiYgb2Zmc2V0IC0gMSA8IFJvd0NvdW50ICYmIG9mZnNldCAtIDEgPCBSb3dzLkxlbmd0aCAmJiBSb3dzW29mZnNldCAtIDFdICE9IG51bGwgJiYgUm93c1tvZmZzZXQgLSAxXS5JbmRleCA9PSBvZmZzZXQpID8gb2Zmc2V0IC0gMSA6IEFycmF5LkJpbmFyeVNlYXJjaChSb3dzLCAwLCBSb3dDb3VudCwgX3NlYXJjaEl4KTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBpbnQgR2V0TmV4dFJvdyhpbnQgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgb2Zmc2V0ID0gcm93IC0gSW5kZXhPZmZzZXQ7Ci0gICAgICAgICAgICB2YXIgbz0gR2V0UG9zaXRpb24ob2Zmc2V0KTsKLSAgICAgICAgICAgIGlmIChvIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvID0gfm87Ci0gICAgICAgICAgICAgICAgaWYgKG8gPCBSb3dDb3VudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBvOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG87Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IE1pbkluZGV4Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChSb3dzLkxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW5kZXhPZmZzZXQgKyBSb3dzWzBdLkluZGV4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBpbnQgTWF4SW5kZXgKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKFJvd0NvdW50ID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJbmRleE9mZnNldCArIFJvd3NbUm93Q291bnQtMV0uSW5kZXg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGludCBHZXRJbmRleChpbnQgcG9zKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gSW5kZXhPZmZzZXQgKyBSb3dzW3Bvc10uSW5kZXg7Ci0gICAgICAgIH0KKyAgcHJpdmF0ZSBib29sIEdldFBhZ2UoaW50IHJvdywgcmVmIGludCByZXMpIHsKKyAgICBpZiAocmVzIDwgUGFnZUNvdW50ICYmIF9wYWdlc1tyZXNdLk1pbkluZGV4IDw9IHJvdyAmJiBfcGFnZXNbcmVzXS5NYXhJbmRleCA+PSByb3cpIHsKKyAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgaXMgdGhlIHN0b3JlIGZvciBhbGwgUm93cywgQ29sdW1ucyBhbmQgQ2VsbHMuCi0gICAgLy8vIEl0IGlzIGEgRGljdGlvbmFyeSBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsbG93cyB5b3UgdG8gY2hhbmdlIHRoZSBLZXkgKHRoZSBSb3dJRCwgQ29sdW1uSUQgb3IgQ2VsbElEICkKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIGludGVybmFsIGNsYXNzIENlbGxTdG9yZTxUPgotICAgIHsKLSAgICAgICAgLyoqKiogU2l6ZSBjb25zdGFudHMgKioqKi8KLSAgICAgICAgaW50ZXJuYWwgY29uc3QgaW50IHBhZ2VCaXRzID0gMTA7ICAgLy8xM2JpdHM9ODE5MiAgTm90ZTogTWF4aW11bSBpcyAxMyBiaXRzIHNpbmNlIHNob3J0IGlzIHVzZWQgKFBhZ2VNYXg9MTZLKQotICAgICAgICBpbnRlcm5hbCBjb25zdCBpbnQgUGFnZVNpemUgPSAxIDw8IHBhZ2VCaXRzOwotICAgICAgICBpbnRlcm5hbCBjb25zdCBpbnQgUGFnZVNpemVNaW4gPSAxPDwxMDsKLSAgICAgICAgaW50ZXJuYWwgY29uc3QgaW50IFBhZ2VTaXplTWF4ID0gUGFnZVNpemUgPDwgMTsgLy9Eb3VibGUgcGFnZSBzaXplCi0gICAgICAgIGludGVybmFsIGNvbnN0IGludCBDb2xTaXplTWluID0gMzI7Ci0gICAgICAgIGludGVybmFsIGNvbnN0IGludCBQYWdlc1BlckNvbHVtbk1pbiA9IDMyOworICAgIGlmIChyZXMgKyAxIDwgUGFnZUNvdW50ICYmIChfcGFnZXNbcmVzICsgMV0uTWluSW5kZXggPD0gcm93KSkgeworICAgICAgZG8geworICAgICAgICByZXMrKzsKKyAgICAgIH0gd2hpbGUgKHJlcyArIDEgPCBQYWdlQ291bnQgJiYgX3BhZ2VzW3JlcyArIDFdLk1pbkluZGV4IDw9IHJvdyk7CisgICAgICAvL2lmIChyZXMgKyAxIDwgUGFnZUNvdW50ICYmIF9wYWdlc1tyZXMgKyAxXS5NYXhJbmRleCA+PSBSb3cpCisgICAgICAvL3sKKyAgICAgIHJldHVybiB0cnVlOworICAgICAgLy99CisgICAgICAvL2Vsc2UKKyAgICAgIC8veworICAgICAgLy8gICAgcmV0dXJuIGZhbHNlOworICAgICAgLy99CisgICAgfQorICAgIGlmIChyZXMgLSAxID49IDAgJiYgX3BhZ2VzW3JlcyAtIDFdLk1heEluZGV4ID49IHJvdykgeworICAgICAgZG8geworICAgICAgICByZXMtLTsKKyAgICAgIH0gd2hpbGUgKHJlcyAtIDEgPiAwICYmIF9wYWdlc1tyZXMgLSAxXS5NYXhJbmRleCA+PSByb3cpOworICAgICAgLy9pZiAocmVzID4gMCkKKyAgICAgIC8veworICAgICAgcmV0dXJuIHRydWU7CisgICAgICAvL30KKyAgICAgIC8vZWxzZQorICAgICAgLy97CisgICAgICAvLyAgICByZXR1cm4gZmFsc2U7CisgICAgICAvL30KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CiAKLSAgICAgICAgTGlzdDxUPiBfdmFsdWVzID0gbmV3IExpc3Q8VD4oKTsKLSAgICAgICAgaW50ZXJuYWwgQ29sdW1uSW5kZXhbXSBfY29sdW1uSW5kZXg7Ci0gICAgICAgIGludGVybmFsIEluZGV4QmFzZSBfc2VhcmNoSXggPSBuZXcgSW5kZXhCYXNlKCk7Ci0gICAgICAgIGludGVybmFsIGludCBDb2x1bW5Db3VudDsKLSAgICAgICAgcHVibGljIENlbGxTdG9yZSAoKQotCSAgICB7Ci0gICAgICAgICAgICBfY29sdW1uSW5kZXggPSBuZXcgQ29sdW1uSW5kZXhbQ29sU2l6ZU1pbl07Ci0JICAgIH0KLSAgICAgICAgfkNlbGxTdG9yZSgpCi0JICAgIHsKLSAgICAgICAgICAgIGlmIChfdmFsdWVzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3ZhbHVlcy5DbGVhcigpOwotICAgICAgICAgICAgICAgIF92YWx1ZXMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2NvbHVtbkluZGV4PW51bGw7Ci0JICAgIH0KLSAgICAgICAgaW50ZXJuYWwgaW50IEdldFBvc2l0aW9uKGludCBDb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9zZWFyY2hJeC5JbmRleCA9IChzaG9ydClDb2x1bW47Ci0gICAgICAgICAgICByZXR1cm4gKF9jb2x1bW5JbmRleCAhPSBudWxsICYmIENvbHVtbiA+IDAgJiYgQ29sdW1uIC0gMSA8IENvbHVtbkNvdW50ICYmIENvbHVtbiAtIDEgPCBfY29sdW1uSW5kZXguTGVuZ3RoICYmIF9jb2x1bW5JbmRleFtDb2x1bW4gLSAxXSAhPSBudWxsICYmIF9jb2x1bW5JbmRleFtDb2x1bW4gLSAxXS5JbmRleCA9PSBDb2x1bW4pID8gQ29sdW1uIC0gMSA6IEFycmF5LkJpbmFyeVNlYXJjaChfY29sdW1uSW5kZXgsIDAsIENvbHVtbkNvdW50LCBfc2VhcmNoSXgpOworICBpbnRlcm5hbCBpbnQgR2V0TmV4dFJvdyhpbnQgcm93KSB7CisgICAgLy92YXIgcGFnZSA9IChpbnQpKCh1bG9uZylyb3cgPj4gQ2VsbFN0b3JlPGludD4ucGFnZUJpdHMpOworICAgIHZhciBwID0gR2V0UG9zaXRpb24ocm93KTsKKyAgICBpZiAocCA8IDApIHsKKyAgICAgIHAgPSB+cDsKKyAgICAgIGlmIChwID49IFBhZ2VDb3VudCkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoX3BhZ2VzW3BdLkluZGV4T2Zmc2V0ICsgX3BhZ2VzW3BdLlJvd3NbMF0uSW5kZXggPCByb3cpIHsKKyAgICAgICAgaWYgKHAgKyAxID49IFBhZ2VDb3VudCkgeworICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBDZWxsU3RvcmU8VD4gQ2xvbmUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcm93LGNvbDsKLSAgICAgICAgICAgIHZhciByZXQ9bmV3IENlbGxTdG9yZTxUPigpOwotICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBDb2x1bW5Db3VudDsgYysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbCA9IF9jb2x1bW5JbmRleFtjXS5JbmRleDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBwID0gMDtwIDwgX2NvbHVtbkluZGV4W2NdLlBhZ2VDb3VudDsgcCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCBfY29sdW1uSW5kZXhbY10uX3BhZ2VzW3BdLlJvd0NvdW50OyByKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA9IF9jb2x1bW5JbmRleFtjXS5fcGFnZXNbcF0uSW5kZXhPZmZzZXQgKyBfY29sdW1uSW5kZXhbY10uX3BhZ2VzW3BdLlJvd3Nbcl0uSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQuU2V0VmFsdWUocm93LCBjb2wsIF92YWx1ZXNbX2NvbHVtbkluZGV4W2NdLl9wYWdlc1twXS5Sb3dzW3JdLkluZGV4UG9pbnRlcl0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcmV0dXJuIF9wYWdlc1twICsgMV0uSW5kZXhPZmZzZXQgKyBfcGFnZXNbcF0uUm93c1swXS5JbmRleDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfcGFnZXNbcF0uSW5kZXhPZmZzZXQgKyBfcGFnZXNbcF0uUm93c1swXS5JbmRleDsKKyAgICB9CisgICAgaWYgKHAgPCBQYWdlQ291bnQpIHsKKyAgICAgIHZhciByID0gX3BhZ2VzW3BdLkdldE5leHRSb3cocm93KTsKKyAgICAgIGlmIChyID49IDApIHsKKyAgICAgICAgcmV0dXJuIF9wYWdlc1twXS5JbmRleE9mZnNldCArIF9wYWdlc1twXS5Sb3dzW3JdLkluZGV4OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCsrcCA8IFBhZ2VDb3VudCkgeworICAgICAgICAgIHJldHVybiBfcGFnZXNbcF0uSW5kZXhPZmZzZXQgKyBfcGFnZXNbcF0uUm93c1swXS5JbmRleDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgaW50IENvdW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBjb3VudD0wOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgQ29sdW1uQ291bnQ7IGMrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgX2NvbHVtbkluZGV4W2NdLlBhZ2VDb3VudDsgcCsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBfY29sdW1uSW5kZXhbY10uX3BhZ2VzW3BdLlJvd0NvdW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBib29sIEdldERpbWVuc2lvbihvdXQgaW50IGZyb21Sb3csIG91dCBpbnQgZnJvbUNvbCwgb3V0IGludCB0b1Jvdywgb3V0IGludCB0b0NvbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKENvbHVtbkNvdW50ID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJvbVJvdyA9IGZyb21Db2wgPSB0b1JvdyA9IHRvQ29sID0gMDsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJvbUNvbD1fY29sdW1uSW5kZXhbMF0uSW5kZXg7Ci0gICAgICAgICAgICAgICAgdmFyIGZyb21JbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKGZyb21Db2wgPD0gMCAmJiBDb2x1bW5Db3VudCA+IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcm9tQ29sID0gX2NvbHVtbkluZGV4WzFdLkluZGV4OwotICAgICAgICAgICAgICAgICAgICBmcm9tSW5kZXggPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKENvbHVtbkNvdW50ID09IDEgJiYgZnJvbUNvbCA8PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJvbVJvdyA9IGZyb21Db2wgPSB0b1JvdyA9IHRvQ29sID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YXIgY29sID0gQ29sdW1uQ291bnQgLSAxOwotICAgICAgICAgICAgICAgIHdoaWxlIChjb2wgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9jb2x1bW5JbmRleFtjb2xdLlBhZ2VDb3VudCA9PSAwIHx8IF9jb2x1bW5JbmRleFtjb2xdLl9wYWdlc1swXS5Sb3dDb3VudCA+IDEgfHwgX2NvbHVtbkluZGV4W2NvbF0uX3BhZ2VzWzBdLlJvd3NbMF0uSW5kZXggPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb2wtLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdG9Db2w9X2NvbHVtbkluZGV4W2NvbF0uSW5kZXg7Ci0gICAgICAgICAgICAgICAgaWYgKHRvQ29sID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcm9tUm93ID0gZnJvbUNvbCA9IHRvUm93ID0gdG9Db2wgPSAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZnJvbVJvdyA9IHRvUm93PSAwOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGMgPSBmcm9tSW5kZXg7IGMgPCBDb2x1bW5Db3VudDsgYysrKQotICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3QsIGxhc3Q7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfY29sdW1uSW5kZXhbY10uUGFnZUNvdW50ID09IDApIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChfY29sdW1uSW5kZXhbY10uX3BhZ2VzWzBdLlJvd0NvdW50ID4gMCAmJiBfY29sdW1uSW5kZXhbY10uX3BhZ2VzWzBdLlJvd3NbMF0uSW5kZXggPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IF9jb2x1bW5JbmRleFtjXS5fcGFnZXNbMF0uSW5kZXhPZmZzZXQgKyBfY29sdW1uSW5kZXhbY10uX3BhZ2VzWzBdLlJvd3NbMF0uSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihfY29sdW1uSW5kZXhbY10uX3BhZ2VzWzBdLlJvd0NvdW50PjEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBfY29sdW1uSW5kZXhbY10uX3BhZ2VzWzBdLkluZGV4T2Zmc2V0ICsgX2NvbHVtbkluZGV4W2NdLl9wYWdlc1swXS5Sb3dzWzFdLkluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX2NvbHVtbkluZGV4W2NdLlBhZ2VDb3VudCA+IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBfY29sdW1uSW5kZXhbY10uX3BhZ2VzWzBdLkluZGV4T2Zmc2V0ICsgX2NvbHVtbkluZGV4W2NdLl9wYWdlc1sxXS5Sb3dzWzBdLkluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2YXIgbHAgPSBfY29sdW1uSW5kZXhbY10uUGFnZUNvdW50IC0gMTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUoX2NvbHVtbkluZGV4W2NdLl9wYWdlc1tscF0uUm93Q291bnQ9PTAgJiYgbHAhPTApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLS07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdmFyIHAgPSBfY29sdW1uSW5kZXhbY10uX3BhZ2VzW2xwXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHAuUm93Q291bnQgPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gcC5JbmRleE9mZnNldCArIHAuUm93c1twLlJvd0NvdW50IC0gMV0uSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID4gMCAmJiAoZmlyc3QgPCBmcm9tUm93IHx8IGZyb21Sb3cgPT0gMCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyb21Sb3c9Zmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0PjAgJiYgKGxhc3QgPiB0b1JvdyB8fCB0b1JvdyA9PSAwKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9Sb3c9bGFzdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZnJvbVJvdyA8PSAwIHx8IHRvUm93IDw9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcm9tUm93ID0gZnJvbUNvbCA9IHRvUm93ID0gdG9Db2wgPSAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBpbnQgRmluZE5leHQoaW50IENvbHVtbikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGMgPSBHZXRQb3NpdGlvbihDb2x1bW4pOwotICAgICAgICAgICAgaWYgKGMgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB+YzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIFQgR2V0VmFsdWUoaW50IFJvdywgaW50IENvbHVtbikKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGkgPSBHZXRQb2ludGVyKFJvdywgQ29sdW1uKTsKLSAgICAgICAgICAgIGlmIChpID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF92YWx1ZXNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQoVCk7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy92YXIgY29sID0gR2V0UG9zaXRpb24oQ29sdW1uKTsKLSAgICAgICAgICAgIC8vaWYgKGNvbCA+PSAwKSAgCi0gICAgICAgICAgICAvL3sKLSAgICAgICAgICAgIC8vICAgIHZhciBwb3MgPSBfY29sdW1uSW5kZXhbY29sXS5HZXRQb3NpdGlvbihSb3cpOwotICAgICAgICAgICAgLy8gICAgaWYgKHBvcyA+PSAwKSAKLSAgICAgICAgICAgIC8vICAgIHsKLSAgICAgICAgICAgIC8vICAgICAgICB2YXIgcGFnZUl0ZW0gPSBfY29sdW1uSW5kZXhbY29sXS5QYWdlc1twb3NdOwotICAgICAgICAgICAgLy8gICAgICAgIGlmIChwYWdlSXRlbS5NaW5JbmRleCA+IFJvdykKLSAgICAgICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIHBvcy0tOwotICAgICAgICAgICAgLy8gICAgICAgICAgICBpZiAocG9zIDwgMCkKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgewotICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQoVCk7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgLy8gICAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBwYWdlSXRlbSA9IF9jb2x1bW5JbmRleFtjb2xdLlBhZ2VzW3Bvc107Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgICAgICAvLyAgICAgICAgc2hvcnQgaXggPSAoc2hvcnQpKFJvdyAtIHBhZ2VJdGVtLkluZGV4T2Zmc2V0KTsKLSAgICAgICAgICAgIC8vICAgICAgICB2YXIgY2VsbFBvcyA9IEFycmF5LkJpbmFyeVNlYXJjaChwYWdlSXRlbS5Sb3dzLCAwLCBwYWdlSXRlbS5Sb3dDb3VudCwgbmV3IEluZGV4QmFzZSgpIHsgSW5kZXggPSBpeCB9KTsKLSAgICAgICAgICAgIC8vICAgICAgICBpZiAoY2VsbFBvcyA+PSAwKSAKLSAgICAgICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBfdmFsdWVzW3BhZ2VJdGVtLlJvd3NbY2VsbFBvc10uSW5kZXhQb2ludGVyXTsKLSAgICAgICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgICAgICAvLyAgICAgICAgZWxzZSAvL0NlbGwgZG9lcyBub3QgZXhpc3QKLSAgICAgICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KFQpOwotICAgICAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgICAgIC8vICAgIH0KLSAgICAgICAgICAgIC8vICAgIGVsc2UgLy9QYWdlIGRvZXMgbm90IGV4aXN0Ci0gICAgICAgICAgICAvLyAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgcmV0dXJuIGRlZmF1bHQoVCk7Ci0gICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgICAgIC8vZWxzZSAvL0NvbHVtbiBkb2VzIG5vdCBleGlzdAotICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAvLyAgICByZXR1cm4gZGVmYXVsdChUKTsKLSAgICAgICAgICAgIC8vfQotICAgICAgICB9Ci0gICAgICAgIGludCBHZXRQb2ludGVyKGludCBSb3csIGludCBDb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjb2wgPSBHZXRQb3NpdGlvbihDb2x1bW4pOwotICAgICAgICAgICAgaWYgKGNvbCA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBwb3MgPSBfY29sdW1uSW5kZXhbY29sXS5HZXRQb3NpdGlvbihSb3cpOwotICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gMCAmJiBwb3MgPCBfY29sdW1uSW5kZXhbY29sXS5QYWdlQ291bnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgcGFnZUl0ZW0gPSBfY29sdW1uSW5kZXhbY29sXS5fcGFnZXNbcG9zXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhZ2VJdGVtLk1pbkluZGV4ID4gUm93KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3MtLTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlSXRlbSA9IF9jb2x1bW5JbmRleFtjb2xdLl9wYWdlc1twb3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNob3J0IGl4ID0gKHNob3J0KShSb3cgLSBwYWdlSXRlbS5JbmRleE9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIF9zZWFyY2hJeC5JbmRleCA9IGl4OwotICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbFBvcyA9IChwYWdlSXRlbS5Sb3dzICE9IG51bGwgJiYgaXggPiAwICYmIGl4IC0gMSA8IHBhZ2VJdGVtLlJvd0NvdW50ICYmIGl4IC0gMSA8IHBhZ2VJdGVtLlJvd3MuTGVuZ3RoICYmIHBhZ2VJdGVtLlJvd3NbaXggLSAxXSAhPSBudWxsICYmIHBhZ2VJdGVtLlJvd3NbaXggLSAxXS5JbmRleCA9PSBpeCkgPyBpeCAtIDEgOiBBcnJheS5CaW5hcnlTZWFyY2gocGFnZUl0ZW0uUm93cywgMCwgcGFnZUl0ZW0uUm93Q291bnQsIF9zZWFyY2hJeCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjZWxsUG9zID49IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWdlSXRlbS5Sb3dzW2NlbGxQb3NdLkluZGV4UG9pbnRlcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIC8vQ2VsbCBkb2VzIG5vdCBleGlzdAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvL1BhZ2UgZG9lcyBub3QgZXhpc3QKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIC8vQ29sdW1uIGRvZXMgbm90IGV4aXN0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGJvb2wgRXhpc3RzKGludCBSb3csaW50IENvbHVtbikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEdldFBvaW50ZXIoUm93LCBDb2x1bW4pPj0wOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGJvb2wgRXhpc3RzKGludCBSb3csIGludCBDb2x1bW4sIHJlZiBUIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcD1HZXRQb2ludGVyKFJvdywgQ29sdW1uKTsKLSAgICAgICAgICAgIGlmIChwID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBfdmFsdWVzW3BdOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBTZXRWYWx1ZShpbnQgUm93LCBpbnQgQ29sdW1uLCBUIFZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2NrIChfY29sdW1uSW5kZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGNvbCA9IChfY29sdW1uSW5kZXggIT0gbnVsbCAmJiBDb2x1bW4gPiAwICYmIENvbHVtbiAtIDEgPCBDb2x1bW5Db3VudCAmJiBDb2x1bW4gLSAxIDwgX2NvbHVtbkluZGV4Lkxlbmd0aCAmJiBfY29sdW1uSW5kZXhbQ29sdW1uIC0gMV0gIT0gbnVsbCAmJiBfY29sdW1uSW5kZXhbQ29sdW1uIC0gMV0uSW5kZXggPT0gQ29sdW1uKSA/IENvbHVtbiAtIDEgOiBBcnJheS5CaW5hcnlTZWFyY2goX2NvbHVtbkluZGV4LCAwLCBDb2x1bW5Db3VudCwgbmV3IEluZGV4QmFzZSgpIHsgSW5kZXggPSAoc2hvcnQpKENvbHVtbikgfSk7Ci0gICAgICAgICAgICAgICAgdmFyIHBhZ2UgPSAoc2hvcnQpKFJvdyA+PiBwYWdlQml0cyk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbCA+PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy92YXIgcG9zID0gQXJyYXkuQmluYXJ5U2VhcmNoKF9jb2x1bW5JbmRleFtjb2xdLlBhZ2VzLCAwLCBfY29sdW1uSW5kZXhbY29sXS5Db3VudCwgbmV3IEluZGV4QmFzZSgpIHsgSW5kZXggPSBwYWdlIH0pOwotICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gX2NvbHVtbkluZGV4W2NvbF0uR2V0UG9zaXRpb24oUm93KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IH5wb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zIC0gMSA8IDAgfHwgX2NvbHVtbkluZGV4W2NvbF0uX3BhZ2VzW3BvcyAtIDFdLkluZGV4T2Zmc2V0ICsgUGFnZVNpemUgLSAxIDwgUm93KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhZ2UoX2NvbHVtbkluZGV4W2NvbF0sIHBvcywgcGFnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA+PSBfY29sdW1uSW5kZXhbY29sXS5QYWdlQ291bnQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZFBhZ2UoX2NvbHVtbkluZGV4W2NvbF0sIHBvcywgcGFnZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2VJdGVtID0gX2NvbHVtbkluZGV4W2NvbF0uX3BhZ2VzW3Bvc107Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWdlSXRlbS5JbmRleE9mZnNldCA+IFJvdykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9zLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiVW5leHBlY3RlZCBlcnJvciB3aGVuIHNldHRpbmcgdmFsdWUiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWdlSXRlbSA9IF9jb2x1bW5JbmRleFtjb2xdLl9wYWdlc1twb3NdOwotICAgICAgICAgICAgICAgICAgICB9CisgIGludGVybmFsIGludCBGaW5kTmV4dChpbnQgcGFnZSkgeworICAgIHZhciBwID0gR2V0UG9zaXRpb24ocGFnZSk7CisgICAgaWYgKHAgPCAwKSB7CisgICAgICByZXR1cm4gfnA7CisgICAgfQorICAgIHJldHVybiBwOworICB9CiAKLSAgICAgICAgICAgICAgICAgICAgc2hvcnQgaXggPSAoc2hvcnQpKFJvdyAtICgocGFnZUl0ZW0uSW5kZXggPDwgcGFnZUJpdHMpICsgcGFnZUl0ZW0uT2Zmc2V0KSk7Ci0gICAgICAgICAgICAgICAgICAgIF9zZWFyY2hJeC5JbmRleCA9IGl4OwotICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbFBvcyA9IChwYWdlSXRlbS5Sb3dzICE9IG51bGwgJiYgaXggPj0gMCAmJiBpeCA8IHBhZ2VJdGVtLlJvd0NvdW50ICYmIGl4IDwgcGFnZUl0ZW0uUm93cy5MZW5ndGggJiYgcGFnZUl0ZW0uUm93c1tpeF0gIT0gbnVsbCAmJiBwYWdlSXRlbS5Sb3dzW2l4XS5JbmRleCA9PSBpeCkgPyBpeCA6IEFycmF5LkJpbmFyeVNlYXJjaChwYWdlSXRlbS5Sb3dzLCAwLCBwYWdlSXRlbS5Sb3dDb3VudCwgX3NlYXJjaEl4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGxQb3MgPCAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjZWxsUG9zID0gfmNlbGxQb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZGRDZWxsKF9jb2x1bW5JbmRleFtjb2xdLCBwb3MsIGNlbGxQb3MsIGl4LCBWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWVzW3BhZ2VJdGVtLlJvd3NbY2VsbFBvc10uSW5kZXhQb2ludGVyXSA9IFZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgLy9Db2x1bW4gZG9lcyBub3QgZXhpc3QKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbCA9IH5jb2w7Ci0gICAgICAgICAgICAgICAgICAgIEFkZENvbHVtbihjb2wsIENvbHVtbik7Ci0gICAgICAgICAgICAgICAgICAgIEFkZFBhZ2UoX2NvbHVtbkluZGV4W2NvbF0sIDAsIHBhZ2UpOwotICAgICAgICAgICAgICAgICAgICBzaG9ydCBpeCA9IChzaG9ydCkoUm93IC0gKHBhZ2UgPDwgcGFnZUJpdHMpKTsKLSAgICAgICAgICAgICAgICAgICAgQWRkQ2VsbChfY29sdW1uSW5kZXhbY29sXSwgMCwgMCwgaXgsIFZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgIGludGVybmFsIFBhZ2VJbmRleFtdIF9wYWdlczsKKyAgaW50ZXJuYWwgaW50IFBhZ2VDb3VudDsKK30KKworaW50ZXJuYWwgY2xhc3MgUGFnZUluZGV4IDogSW5kZXhCYXNlIHsKKyAgaW50ZXJuYWwgSW5kZXhCYXNlIF9zZWFyY2hJeCA9IG5ldygpOworCisgIHB1YmxpYyBQYWdlSW5kZXgoKSB7CisgICAgUm93cyA9IG5ldyBJbmRleEl0ZW1bQ2VsbFN0b3JlPGludD4uX3BhZ2VTaXplTWluXTsKKyAgICBSb3dDb3VudCA9IDA7CisgIH0KKworICBwdWJsaWMgUGFnZUluZGV4KEluZGV4SXRlbVtdIHJvd3MsIGludCBjb3VudCkgeworICAgIFJvd3MgPSByb3dzOworICAgIFJvd0NvdW50ID0gY291bnQ7CisgIH0KKworICBwdWJsaWMgUGFnZUluZGV4KFBhZ2VJbmRleCBwYWdlSXRlbSwgaW50IHN0YXJ0LCBpbnQgc2l6ZSkKKyAgICAgIDogdGhpcyhwYWdlSXRlbSwgc3RhcnQsIHNpemUsIHBhZ2VJdGVtLkluZGV4LCBwYWdlSXRlbS5PZmZzZXQpIHt9CisKKyAgcHVibGljIFBhZ2VJbmRleChQYWdlSW5kZXggcGFnZUl0ZW0sIGludCBzdGFydCwgaW50IHNpemUsIHNob3J0IGluZGV4LCBpbnQgb2Zmc2V0KSB7CisgICAgUm93cyA9IG5ldyBJbmRleEl0ZW1bQ2VsbFN0b3JlPGludD4uR2V0U2l6ZShzaXplKV07CisgICAgQXJyYXkuQ29weShwYWdlSXRlbS5Sb3dzLCBzdGFydCwgUm93cywgMCwgc2l6ZSk7CisgICAgUm93Q291bnQgPSBzaXplOworICAgIEluZGV4ID0gaW5kZXg7CisgICAgT2Zmc2V0ID0gb2Zmc2V0OworICB9CisKKyAgflBhZ2VJbmRleCgpIHsKKyAgICBSb3dzID0gbnVsbDsKKyAgfQorCisgIGludGVybmFsIGludCBPZmZzZXQ7CisKKyAgaW50ZXJuYWwgaW50IEluZGV4T2Zmc2V0ID0+IEluZGV4RXhwYW5kZWQgKyBPZmZzZXQ7CisKKyAgaW50ZXJuYWwgaW50IEluZGV4RXhwYW5kZWQgPT4gKEluZGV4IDw8IENlbGxTdG9yZTxpbnQ+Ll9wYWdlQml0cyk7CisKKyAgaW50ZXJuYWwgSW5kZXhJdGVtW10gUm93cyB7IGdldDsgc2V0OyB9CisKKyAgaW50ZXJuYWwgaW50IFJvd0NvdW50OworCisgIGludGVybmFsIGludCBHZXRQb3NpdGlvbihpbnQgb2Zmc2V0KSB7CisgICAgX3NlYXJjaEl4LkluZGV4ID0gKHNob3J0KW9mZnNldDsKKyAgICByZXR1cm4gKFJvd3MgIT0gbnVsbAorICAgICAgICAgICAgJiYgb2Zmc2V0ID4gMAorICAgICAgICAgICAgJiYgb2Zmc2V0IC0gMSA8IFJvd0NvdW50CisgICAgICAgICAgICAmJiBvZmZzZXQgLSAxIDwgUm93cy5MZW5ndGgKKyAgICAgICAgICAgICYmIFJvd3Nbb2Zmc2V0IC0gMV0gIT0gbnVsbAorICAgICAgICAgICAgJiYgUm93c1tvZmZzZXQgLSAxXS5JbmRleCA9PSBvZmZzZXQpCisgICAgICAgID8gb2Zmc2V0IC0gMQorICAgICAgICA6IEFycmF5LkJpbmFyeVNlYXJjaChSb3dzLCAwLCBSb3dDb3VudCwgX3NlYXJjaEl4KTsKKyAgfQorCisgIGludGVybmFsIGludCBHZXROZXh0Um93KGludCByb3cpIHsKKyAgICBpbnQgb2Zmc2V0ID0gcm93IC0gSW5kZXhPZmZzZXQ7CisgICAgdmFyIG8gPSBHZXRQb3NpdGlvbihvZmZzZXQpOworICAgIGlmIChvIDwgMCkgeworICAgICAgbyA9IH5vOworICAgICAgaWYgKG8gPCBSb3dDb3VudCkgeworICAgICAgICByZXR1cm4gbzsKKyAgICAgIH0KKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIG87CisgIH0KKworICBwdWJsaWMgaW50IE1pbkluZGV4IHsKKyAgICBnZXQgeworICAgICAgaWYgKFJvd3MuTGVuZ3RoID4gMCkgeworICAgICAgICByZXR1cm4gSW5kZXhPZmZzZXQgKyBSb3dzWzBdLkluZGV4OworICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBpbnQgTWF4SW5kZXggeworICAgIGdldCB7CisgICAgICBpZiAoUm93Q291bnQgPiAwKSB7CisgICAgICAgIHJldHVybiBJbmRleE9mZnNldCArIFJvd3NbUm93Q291bnQgLSAxXS5JbmRleDsKKyAgICAgIH0KKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgaW50IEdldEluZGV4KGludCBwb3MpIHsKKyAgICByZXR1cm4gSW5kZXhPZmZzZXQgKyBSb3dzW3Bvc10uSW5kZXg7CisgIH0KK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIFRoaXMgaXMgdGhlIHN0b3JlIGZvciBhbGwgUm93cywgQ29sdW1ucyBhbmQgQ2VsbHMuCisvLy8gSXQgaXMgYSBEaWN0aW9uYXJ5IGltcGxlbWVudGF0aW9uIHRoYXQgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIEtleSAodGhlIFJvd0lELCBDb2x1bW5JRCBvciBDZWxsSUQgKQorLy8vIDwvc3VtbWFyeT4KK2ludGVybmFsIGNsYXNzIENlbGxTdG9yZTxUPiB7CisgIC8qKioqIFNpemUgY29uc3RhbnRzICoqKiovCisgIGludGVybmFsIGNvbnN0IGludCBfcGFnZUJpdHMgPSAxMDsgLy8xM2JpdHM9ODE5MiAgTm90ZTogTWF4aW11bSBpcyAxMyBiaXRzIHNpbmNlIHNob3J0IGlzIHVzZWQgKFBhZ2VNYXg9MTZLKQorICBpbnRlcm5hbCBjb25zdCBpbnQgX3BhZ2VTaXplID0gMSA8PCBfcGFnZUJpdHM7CisgIGludGVybmFsIGNvbnN0IGludCBfcGFnZVNpemVNaW4gPSAxIDw8IDEwOworICBpbnRlcm5hbCBjb25zdCBpbnQgX3BhZ2VTaXplTWF4ID0gX3BhZ2VTaXplIDw8IDE7IC8vRG91YmxlIHBhZ2Ugc2l6ZQorICBpbnRlcm5hbCBjb25zdCBpbnQgX2NvbFNpemVNaW4gPSAzMjsKKyAgaW50ZXJuYWwgY29uc3QgaW50IF9wYWdlc1BlckNvbHVtbk1pbiA9IDMyOworCisgIHByaXZhdGUgTGlzdDxUPiBfdmFsdWVzID0gbmV3KCk7CisgIGludGVybmFsIENvbHVtbkluZGV4W10gX2NvbHVtbkluZGV4OworICBpbnRlcm5hbCBJbmRleEJhc2UgX3NlYXJjaEl4ID0gbmV3KCk7CisgIGludGVybmFsIGludCBDb2x1bW5Db3VudDsKKworICBwdWJsaWMgQ2VsbFN0b3JlKCkgeworICAgIF9jb2x1bW5JbmRleCA9IG5ldyBDb2x1bW5JbmRleFtfY29sU2l6ZU1pbl07CisgIH0KKworICB+Q2VsbFN0b3JlKCkgeworICAgIGlmIChfdmFsdWVzICE9IG51bGwpIHsKKyAgICAgIF92YWx1ZXMuQ2xlYXIoKTsKKyAgICAgIF92YWx1ZXMgPSBudWxsOworICAgIH0KKyAgICBfY29sdW1uSW5kZXggPSBudWxsOworICB9CisKKyAgaW50ZXJuYWwgaW50IEdldFBvc2l0aW9uKGludCBjb2x1bW4pIHsKKyAgICBfc2VhcmNoSXguSW5kZXggPSAoc2hvcnQpY29sdW1uOworICAgIHJldHVybiAoX2NvbHVtbkluZGV4ICE9IG51bGwKKyAgICAgICAgICAgICYmIGNvbHVtbiA+IDAKKyAgICAgICAgICAgICYmIGNvbHVtbiAtIDEgPCBDb2x1bW5Db3VudAorICAgICAgICAgICAgJiYgY29sdW1uIC0gMSA8IF9jb2x1bW5JbmRleC5MZW5ndGgKKyAgICAgICAgICAgICYmIF9jb2x1bW5JbmRleFtjb2x1bW4gLSAxXSAhPSBudWxsCisgICAgICAgICAgICAmJiBfY29sdW1uSW5kZXhbY29sdW1uIC0gMV0uSW5kZXggPT0gY29sdW1uKQorICAgICAgICA/IGNvbHVtbiAtIDEKKyAgICAgICAgOiBBcnJheS5CaW5hcnlTZWFyY2goX2NvbHVtbkluZGV4LCAwLCBDb2x1bW5Db3VudCwgX3NlYXJjaEl4KTsKKyAgfQorCisgIGludGVybmFsIENlbGxTdG9yZTxUPiBDbG9uZSgpIHsKKyAgICBpbnQgcm93LAorICAgICAgICBjb2w7CisgICAgdmFyIHJldCA9IG5ldyBDZWxsU3RvcmU8VD4oKTsKKyAgICBmb3IgKGludCBjID0gMDsgYyA8IENvbHVtbkNvdW50OyBjKyspIHsKKyAgICAgIGNvbCA9IF9jb2x1bW5JbmRleFtjXS5JbmRleDsKKyAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgX2NvbHVtbkluZGV4W2NdLlBhZ2VDb3VudDsgcCsrKSB7CisgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgX2NvbHVtbkluZGV4W2NdLl9wYWdlc1twXS5Sb3dDb3VudDsgcisrKSB7CisgICAgICAgICAgcm93ID0gX2NvbHVtbkluZGV4W2NdLl9wYWdlc1twXS5JbmRleE9mZnNldCArIF9jb2x1bW5JbmRleFtjXS5fcGFnZXNbcF0uUm93c1tyXS5JbmRleDsKKyAgICAgICAgICByZXQuU2V0VmFsdWUocm93LCBjb2wsIF92YWx1ZXNbX2NvbHVtbkluZGV4W2NdLl9wYWdlc1twXS5Sb3dzW3JdLkluZGV4UG9pbnRlcl0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICBpbnRlcm5hbCBpbnQgQ291bnQgeworICAgIGdldCB7CisgICAgICBpbnQgY291bnQgPSAwOworICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBDb2x1bW5Db3VudDsgYysrKSB7CisgICAgICAgIGZvciAoaW50IHAgPSAwOyBwIDwgX2NvbHVtbkluZGV4W2NdLlBhZ2VDb3VudDsgcCsrKSB7CisgICAgICAgICAgY291bnQgKz0gX2NvbHVtbkluZGV4W2NdLl9wYWdlc1twXS5Sb3dDb3VudDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKyAgfQorCisgIGludGVybmFsIGJvb2wgR2V0RGltZW5zaW9uKG91dCBpbnQgZnJvbVJvdywgb3V0IGludCBmcm9tQ29sLCBvdXQgaW50IHRvUm93LCBvdXQgaW50IHRvQ29sKSB7CisgICAgaWYgKENvbHVtbkNvdW50ID09IDApIHsKKyAgICAgIGZyb21Sb3cgPSBmcm9tQ29sID0gdG9Sb3cgPSB0b0NvbCA9IDA7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZyb21Db2wgPSBfY29sdW1uSW5kZXhbMF0uSW5kZXg7CisgICAgdmFyIGZyb21JbmRleCA9IDA7CisgICAgaWYgKGZyb21Db2wgPD0gMCAmJiBDb2x1bW5Db3VudCA+IDEpIHsKKyAgICAgIGZyb21Db2wgPSBfY29sdW1uSW5kZXhbMV0uSW5kZXg7CisgICAgICBmcm9tSW5kZXggPSAxOworICAgIH0gZWxzZSBpZiAoQ29sdW1uQ291bnQgPT0gMSAmJiBmcm9tQ29sIDw9IDApIHsKKyAgICAgIGZyb21Sb3cgPSBmcm9tQ29sID0gdG9Sb3cgPSB0b0NvbCA9IDA7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhciBjb2wgPSBDb2x1bW5Db3VudCAtIDE7CisgICAgd2hpbGUgKGNvbCA+IDApIHsKKyAgICAgIGlmIChfY29sdW1uSW5kZXhbY29sXS5QYWdlQ291bnQgPT0gMAorICAgICAgICAgIHx8IF9jb2x1bW5JbmRleFtjb2xdLl9wYWdlc1swXS5Sb3dDb3VudCA+IDEKKyAgICAgICAgICB8fCBfY29sdW1uSW5kZXhbY29sXS5fcGFnZXNbMF0uUm93c1swXS5JbmRleCA+IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjb2wtLTsKKyAgICB9CisgICAgdG9Db2wgPSBfY29sdW1uSW5kZXhbY29sXS5JbmRleDsKKyAgICBpZiAodG9Db2wgPT0gMCkgeworICAgICAgZnJvbVJvdyA9IGZyb21Db2wgPSB0b1JvdyA9IHRvQ29sID0gMDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZnJvbVJvdyA9IHRvUm93ID0gMDsKKworICAgIGZvciAoaW50IGMgPSBmcm9tSW5kZXg7IGMgPCBDb2x1bW5Db3VudDsgYysrKSB7CisgICAgICBpbnQgZmlyc3QsCisgICAgICAgICAgbGFzdDsKKyAgICAgIGlmIChfY29sdW1uSW5kZXhbY10uUGFnZUNvdW50ID09IDApIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoX2NvbHVtbkluZGV4W2NdLl9wYWdlc1swXS5Sb3dDb3VudCA+IDAgJiYgX2NvbHVtbkluZGV4W2NdLl9wYWdlc1swXS5Sb3dzWzBdLkluZGV4ID4gMCkgeworICAgICAgICBmaXJzdCA9IF9jb2x1bW5JbmRleFtjXS5fcGFnZXNbMF0uSW5kZXhPZmZzZXQgKyBfY29sdW1uSW5kZXhbY10uX3BhZ2VzWzBdLlJvd3NbMF0uSW5kZXg7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoX2NvbHVtbkluZGV4W2NdLl9wYWdlc1swXS5Sb3dDb3VudCA+IDEpIHsKKyAgICAgICAgICBmaXJzdCA9IF9jb2x1bW5JbmRleFtjXS5fcGFnZXNbMF0uSW5kZXhPZmZzZXQgKyBfY29sdW1uSW5kZXhbY10uX3BhZ2VzWzBdLlJvd3NbMV0uSW5kZXg7CisgICAgICAgIH0gZWxzZSBpZiAoX2NvbHVtbkluZGV4W2NdLlBhZ2VDb3VudCA+IDEpIHsKKyAgICAgICAgICBmaXJzdCA9IF9jb2x1bW5JbmRleFtjXS5fcGFnZXNbMF0uSW5kZXhPZmZzZXQgKyBfY29sdW1uSW5kZXhbY10uX3BhZ2VzWzFdLlJvd3NbMF0uSW5kZXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZmlyc3QgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgICB2YXIgbHAgPSBfY29sdW1uSW5kZXhbY10uUGFnZUNvdW50IC0gMTsKKyAgICAgIHdoaWxlIChfY29sdW1uSW5kZXhbY10uX3BhZ2VzW2xwXS5Sb3dDb3VudCA9PSAwICYmIGxwICE9IDApIHsKKyAgICAgICAgbHAtLTsKKyAgICAgIH0KKyAgICAgIHZhciBwID0gX2NvbHVtbkluZGV4W2NdLl9wYWdlc1tscF07CisgICAgICBpZiAocC5Sb3dDb3VudCA+IDApIHsKKyAgICAgICAgbGFzdCA9IHAuSW5kZXhPZmZzZXQgKyBwLlJvd3NbcC5Sb3dDb3VudCAtIDFdLkluZGV4OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbGFzdCA9IGZpcnN0OworICAgICAgfQorICAgICAgaWYgKGZpcnN0ID4gMCAmJiAoZmlyc3QgPCBmcm9tUm93IHx8IGZyb21Sb3cgPT0gMCkpIHsKKyAgICAgICAgZnJvbVJvdyA9IGZpcnN0OworICAgICAgfQorICAgICAgaWYgKGZpcnN0ID4gMCAmJiAobGFzdCA+IHRvUm93IHx8IHRvUm93ID09IDApKSB7CisgICAgICAgIHRvUm93ID0gbGFzdDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGZyb21Sb3cgPD0gMCB8fCB0b1JvdyA8PSAwKSB7CisgICAgICBmcm9tUm93ID0gZnJvbUNvbCA9IHRvUm93ID0gdG9Db2wgPSAwOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGludGVybmFsIGludCBGaW5kTmV4dChpbnQgY29sdW1uKSB7CisgICAgdmFyIGMgPSBHZXRQb3NpdGlvbihjb2x1bW4pOworICAgIGlmIChjIDwgMCkgeworICAgICAgcmV0dXJuIH5jOworICAgIH0KKyAgICByZXR1cm4gYzsKKyAgfQorCisgIGludGVybmFsIFQgR2V0VmFsdWUoaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIGludCBpID0gR2V0UG9pbnRlcihyb3csIGNvbHVtbik7CisgICAgaWYgKGkgPj0gMCkgeworICAgICAgcmV0dXJuIF92YWx1ZXNbaV07CisgICAgfQorICAgIHJldHVybiBkZWZhdWx0KFQpOworICAgIC8vdmFyIGNvbCA9IEdldFBvc2l0aW9uKENvbHVtbik7CisgICAgLy9pZiAoY29sID49IDApCisgICAgLy97CisgICAgLy8gICAgdmFyIHBvcyA9IF9jb2x1bW5JbmRleFtjb2xdLkdldFBvc2l0aW9uKFJvdyk7CisgICAgLy8gICAgaWYgKHBvcyA+PSAwKQorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICAgdmFyIHBhZ2VJdGVtID0gX2NvbHVtbkluZGV4W2NvbF0uUGFnZXNbcG9zXTsKKyAgICAvLyAgICAgICAgaWYgKHBhZ2VJdGVtLk1pbkluZGV4ID4gUm93KQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICBwb3MtLTsKKyAgICAvLyAgICAgICAgICAgIGlmIChwb3MgPCAwKQorICAgIC8vICAgICAgICAgICAgeworICAgIC8vICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KFQpOworICAgIC8vICAgICAgICAgICAgfQorICAgIC8vICAgICAgICAgICAgZWxzZQorICAgIC8vICAgICAgICAgICAgeworICAgIC8vICAgICAgICAgICAgICAgIHBhZ2VJdGVtID0gX2NvbHVtbkluZGV4W2NvbF0uUGFnZXNbcG9zXTsKKyAgICAvLyAgICAgICAgICAgIH0KKyAgICAvLyAgICAgICAgfQorICAgIC8vICAgICAgICBzaG9ydCBpeCA9IChzaG9ydCkoUm93IC0gcGFnZUl0ZW0uSW5kZXhPZmZzZXQpOworICAgIC8vICAgICAgICB2YXIgY2VsbFBvcyA9IEFycmF5LkJpbmFyeVNlYXJjaChwYWdlSXRlbS5Sb3dzLCAwLCBwYWdlSXRlbS5Sb3dDb3VudCwgbmV3IEluZGV4QmFzZSgpIHsgSW5kZXggPSBpeCB9KTsKKyAgICAvLyAgICAgICAgaWYgKGNlbGxQb3MgPj0gMCkKKyAgICAvLyAgICAgICAgeworICAgIC8vICAgICAgICAgICAgcmV0dXJuIF92YWx1ZXNbcGFnZUl0ZW0uUm93c1tjZWxsUG9zXS5JbmRleFBvaW50ZXJdOworICAgIC8vICAgICAgICB9CisgICAgLy8gICAgICAgIGVsc2UgLy9DZWxsIGRvZXMgbm90IGV4aXN0CisgICAgLy8gICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KFQpOworICAgIC8vICAgICAgICB9CisgICAgLy8gICAgfQorICAgIC8vICAgIGVsc2UgLy9QYWdlIGRvZXMgbm90IGV4aXN0CisgICAgLy8gICAgeworICAgIC8vICAgICAgICByZXR1cm4gZGVmYXVsdChUKTsKKyAgICAvLyAgICB9CisgICAgLy99CisgICAgLy9lbHNlIC8vQ29sdW1uIGRvZXMgbm90IGV4aXN0CisgICAgLy97CisgICAgLy8gICAgcmV0dXJuIGRlZmF1bHQoVCk7CisgICAgLy99CisgIH0KKworICBwcml2YXRlIGludCBHZXRQb2ludGVyKGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICB2YXIgY29sID0gR2V0UG9zaXRpb24oY29sdW1uKTsKKyAgICBpZiAoY29sID49IDApIHsKKyAgICAgIHZhciBwb3MgPSBfY29sdW1uSW5kZXhbY29sXS5HZXRQb3NpdGlvbihyb3cpOworICAgICAgaWYgKHBvcyA+PSAwICYmIHBvcyA8IF9jb2x1bW5JbmRleFtjb2xdLlBhZ2VDb3VudCkgeworICAgICAgICB2YXIgcGFnZUl0ZW0gPSBfY29sdW1uSW5kZXhbY29sXS5fcGFnZXNbcG9zXTsKKyAgICAgICAgaWYgKHBhZ2VJdGVtLk1pbkluZGV4ID4gcm93KSB7CisgICAgICAgICAgcG9zLS07CisgICAgICAgICAgaWYgKHBvcyA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICB9CisgICAgICAgICAgcGFnZUl0ZW0gPSBfY29sdW1uSW5kZXhbY29sXS5fcGFnZXNbcG9zXTsKKyAgICAgICAgfQorICAgICAgICBzaG9ydCBpeCA9IChzaG9ydCkocm93IC0gcGFnZUl0ZW0uSW5kZXhPZmZzZXQpOworICAgICAgICBfc2VhcmNoSXguSW5kZXggPSBpeDsKKyAgICAgICAgdmFyIGNlbGxQb3MgPQorICAgICAgICAgICAgKHBhZ2VJdGVtLlJvd3MgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBpeCA+IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgaXggLSAxIDwgcGFnZUl0ZW0uUm93Q291bnQKKyAgICAgICAgICAgICAgICAgICAgJiYgaXggLSAxIDwgcGFnZUl0ZW0uUm93cy5MZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgJiYgcGFnZUl0ZW0uUm93c1tpeCAtIDFdICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgcGFnZUl0ZW0uUm93c1tpeCAtIDFdLkluZGV4ID09IGl4KQorICAgICAgICAgICAgICAgID8gaXggLSAxCisgICAgICAgICAgICAgICAgOiBBcnJheS5CaW5hcnlTZWFyY2gocGFnZUl0ZW0uUm93cywgMCwgcGFnZUl0ZW0uUm93Q291bnQsIF9zZWFyY2hJeCk7CisgICAgICAgIGlmIChjZWxsUG9zID49IDApIHsKKyAgICAgICAgICByZXR1cm4gcGFnZUl0ZW0uUm93c1tjZWxsUG9zXS5JbmRleFBvaW50ZXI7CisgICAgICAgIH0gLy9DZWxsIGRvZXMgbm90IGV4aXN0CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0gLy9QYWdlIGRvZXMgbm90IGV4aXN0CisgICAgICByZXR1cm4gLTE7CisgICAgfSAvL0NvbHVtbiBkb2VzIG5vdCBleGlzdAorICAgIHJldHVybiAtMTsKKyAgfQorCisgIGludGVybmFsIGJvb2wgRXhpc3RzKGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcihyb3csIGNvbHVtbikgPj0gMDsKKyAgfQorCisgIGludGVybmFsIGJvb2wgRXhpc3RzKGludCByb3csIGludCBjb2x1bW4sIHJlZiBUIHZhbHVlKSB7CisgICAgdmFyIHAgPSBHZXRQb2ludGVyKHJvdywgY29sdW1uKTsKKyAgICBpZiAocCA+PSAwKSB7CisgICAgICB2YWx1ZSA9IF92YWx1ZXNbcF07CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBTZXRWYWx1ZShpbnQgcm93LCBpbnQgY29sdW1uLCBUIHZhbHVlKSB7CisgICAgbG9jayAoX2NvbHVtbkluZGV4KSB7CisgICAgICB2YXIgY29sID0KKyAgICAgICAgICAoX2NvbHVtbkluZGV4ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICYmIGNvbHVtbiA+IDAKKyAgICAgICAgICAgICAgICAgICYmIGNvbHVtbiAtIDEgPCBDb2x1bW5Db3VudAorICAgICAgICAgICAgICAgICAgJiYgY29sdW1uIC0gMSA8IF9jb2x1bW5JbmRleC5MZW5ndGgKKyAgICAgICAgICAgICAgICAgICYmIF9jb2x1bW5JbmRleFtjb2x1bW4gLSAxXSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAmJiBfY29sdW1uSW5kZXhbY29sdW1uIC0gMV0uSW5kZXggPT0gY29sdW1uKQorICAgICAgICAgICAgICA/IGNvbHVtbiAtIDEKKyAgICAgICAgICAgICAgOiBBcnJheS5CaW5hcnlTZWFyY2goCisgICAgICAgICAgICAgICAgICBfY29sdW1uSW5kZXgsCisgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgQ29sdW1uQ291bnQsCisgICAgICAgICAgICAgICAgICBuZXcgSW5kZXhCYXNlIHsKKyAgICAgICAgICAgICAgICAgICAgSW5kZXggPSAoc2hvcnQpKGNvbHVtbiksCisgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgIHZhciBwYWdlID0gKHNob3J0KShyb3cgPj4gX3BhZ2VCaXRzKTsKKyAgICAgIGlmIChjb2wgPj0gMCkgeworICAgICAgICAvL3ZhciBwb3MgPSBBcnJheS5CaW5hcnlTZWFyY2goX2NvbHVtbkluZGV4W2NvbF0uUGFnZXMsIDAsIF9jb2x1bW5JbmRleFtjb2xdLkNvdW50LCBuZXcgSW5kZXhCYXNlKCkgeyBJbmRleCA9IHBhZ2UgfSk7CisgICAgICAgIHZhciBwb3MgPSBfY29sdW1uSW5kZXhbY29sXS5HZXRQb3NpdGlvbihyb3cpOworICAgICAgICBpZiAocG9zIDwgMCkgeworICAgICAgICAgIHBvcyA9IH5wb3M7CisgICAgICAgICAgaWYgKHBvcyAtIDEgPCAwIHx8IF9jb2x1bW5JbmRleFtjb2xdLl9wYWdlc1twb3MgLSAxXS5JbmRleE9mZnNldCArIF9wYWdlU2l6ZSAtIDEgPCByb3cpIHsKKyAgICAgICAgICAgIEFkZFBhZ2UoX2NvbHVtbkluZGV4W2NvbF0sIHBvcywgcGFnZSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBvcy0tOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocG9zID49IF9jb2x1bW5JbmRleFtjb2xdLlBhZ2VDb3VudCkgeworICAgICAgICAgIEFkZFBhZ2UoX2NvbHVtbkluZGV4W2NvbF0sIHBvcywgcGFnZSk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIHBhZ2VJdGVtID0gX2NvbHVtbkluZGV4W2NvbF0uX3BhZ2VzW3Bvc107CisgICAgICAgIGlmIChwYWdlSXRlbS5JbmRleE9mZnNldCA+IHJvdykgeworICAgICAgICAgIHBvcy0tOworICAgICAgICAgIHBhZ2UtLTsKKyAgICAgICAgICBpZiAocG9zIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgKG5ldygiVW5leHBlY3RlZCBlcnJvciB3aGVuIHNldHRpbmcgdmFsdWUiKSk7CisgICAgICAgICAgfQorICAgICAgICAgIHBhZ2VJdGVtID0gX2NvbHVtbkluZGV4W2NvbF0uX3BhZ2VzW3Bvc107CiAgICAgICAgIH0KIAotICAgICAgICBpbnRlcm5hbCB2b2lkIEluc2VydChpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCByb3dzLCBpbnQgY29sdW1ucykKLSAgICAgICAgewotICAgICAgICAgICAgbG9jayAoX2NvbHVtbkluZGV4KQotICAgICAgICAgICAgeworICAgICAgICBzaG9ydCBpeCA9IChzaG9ydCkocm93IC0gKChwYWdlSXRlbS5JbmRleCA8PCBfcGFnZUJpdHMpICsgcGFnZUl0ZW0uT2Zmc2V0KSk7CisgICAgICAgIF9zZWFyY2hJeC5JbmRleCA9IGl4OworICAgICAgICB2YXIgY2VsbFBvcyA9CisgICAgICAgICAgICAocGFnZUl0ZW0uUm93cyAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIGl4ID49IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgaXggPCBwYWdlSXRlbS5Sb3dDb3VudAorICAgICAgICAgICAgICAgICAgICAmJiBpeCA8IHBhZ2VJdGVtLlJvd3MuTGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICYmIHBhZ2VJdGVtLlJvd3NbaXhdICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgcGFnZUl0ZW0uUm93c1tpeF0uSW5kZXggPT0gaXgpCisgICAgICAgICAgICAgICAgPyBpeAorICAgICAgICAgICAgICAgIDogQXJyYXkuQmluYXJ5U2VhcmNoKHBhZ2VJdGVtLlJvd3MsIDAsIHBhZ2VJdGVtLlJvd0NvdW50LCBfc2VhcmNoSXgpOworICAgICAgICBpZiAoY2VsbFBvcyA8IDApIHsKKyAgICAgICAgICBjZWxsUG9zID0gfmNlbGxQb3M7CisgICAgICAgICAgQWRkQ2VsbChfY29sdW1uSW5kZXhbY29sXSwgcG9zLCBjZWxsUG9zLCBpeCwgdmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIF92YWx1ZXNbcGFnZUl0ZW0uUm93c1tjZWxsUG9zXS5JbmRleFBvaW50ZXJdID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSAvL0NvbHVtbiBkb2VzIG5vdCBleGlzdAorICAgICAgeworICAgICAgICBjb2wgPSB+Y29sOworICAgICAgICBBZGRDb2x1bW4oY29sLCBjb2x1bW4pOworICAgICAgICBBZGRQYWdlKF9jb2x1bW5JbmRleFtjb2xdLCAwLCBwYWdlKTsKKyAgICAgICAgc2hvcnQgaXggPSAoc2hvcnQpKHJvdyAtIChwYWdlIDw8IF9wYWdlQml0cykpOworICAgICAgICBBZGRDZWxsKF9jb2x1bW5JbmRleFtjb2xdLCAwLCAwLCBpeCwgdmFsdWUpOworICAgICAgfQorICAgIH0KKyAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGNvbHVtbnMgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGNvbCA9IEdldFBvc2l0aW9uKGZyb21Db2wpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29sIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gfmNvbDsKKyAgaW50ZXJuYWwgdm9pZCBJbnNlcnQoaW50IGZyb21Sb3csIGludCBmcm9tQ29sLCBpbnQgcm93cywgaW50IGNvbHVtbnMpIHsKKyAgICBsb2NrIChfY29sdW1uSW5kZXgpIHsKKyAgICAgIGlmIChjb2x1bW5zID4gMCkgeworICAgICAgICB2YXIgY29sID0gR2V0UG9zaXRpb24oZnJvbUNvbCk7CisgICAgICAgIGlmIChjb2wgPCAwKSB7CisgICAgICAgICAgY29sID0gfmNvbDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHZhciBjID0gY29sOyBjIDwgQ29sdW1uQ291bnQ7IGMrKykgeworICAgICAgICAgIF9jb2x1bW5JbmRleFtjXS5JbmRleCArPSAoc2hvcnQpY29sdW1uczsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIHBhZ2UgPSBmcm9tUm93ID4+IF9wYWdlQml0czsKKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBDb2x1bW5Db3VudDsgYysrKSB7CisgICAgICAgICAgdmFyIGNvbHVtbiA9IF9jb2x1bW5JbmRleFtjXTsKKyAgICAgICAgICB2YXIgcGFnZVBvcyA9IGNvbHVtbi5HZXRQb3NpdGlvbihmcm9tUm93KTsKKyAgICAgICAgICBpZiAocGFnZVBvcyA+PSAwKSB7CisgICAgICAgICAgICBpZiAoZnJvbVJvdyA+PSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLk1pbkluZGV4CisgICAgICAgICAgICAgICAgJiYgZnJvbVJvdworICAgICAgICAgICAgICAgICAgICA8PSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLk1heEluZGV4KSAvL1RoZSByb3cgaXMgaW5zaWRlIHRoZSBwYWdlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBmcm9tUm93IC0gY29sdW1uLl9wYWdlc1twYWdlUG9zXS5JbmRleE9mZnNldDsKKyAgICAgICAgICAgICAgdmFyIHJvd1BvcyA9IGNvbHVtbi5fcGFnZXNbcGFnZVBvc10uR2V0UG9zaXRpb24ob2Zmc2V0KTsKKyAgICAgICAgICAgICAgaWYgKHJvd1BvcyA8IDApIHsKKyAgICAgICAgICAgICAgICByb3dQb3MgPSB+cm93UG9zOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFVwZGF0ZUluZGV4T2Zmc2V0KGNvbHVtbiwgcGFnZVBvcywgcm93UG9zLCBmcm9tUm93LCByb3dzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29sdW1uLl9wYWdlc1twYWdlUG9zXS5NaW5JbmRleCA+IGZyb21Sb3cgLSAxCisgICAgICAgICAgICAgICAgJiYgcGFnZVBvcworICAgICAgICAgICAgICAgICAgICA+IDApIC8vVGhlIHJvdyBpcyBvbiB0aGUgcGFnZSBiZWZvcmUuCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBmcm9tUm93IC0gKChwYWdlIC0gMSkgPDwgX3BhZ2VCaXRzKTsKKyAgICAgICAgICAgICAgdmFyIHJvd1BvcyA9IGNvbHVtbi5fcGFnZXNbcGFnZVBvcyAtIDFdLkdldFBvc2l0aW9uKG9mZnNldCk7CisgICAgICAgICAgICAgIGlmIChyb3dQb3MgPiAwICYmIHBhZ2VQb3MgPiAwKSB7CisgICAgICAgICAgICAgICAgVXBkYXRlSW5kZXhPZmZzZXQoY29sdW1uLCBwYWdlUG9zIC0gMSwgcm93UG9zLCBmcm9tUm93LCByb3dzKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjb2x1bW4uUGFnZUNvdW50ID49IHBhZ2VQb3MgKyAxKSB7CisgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBmcm9tUm93IC0gY29sdW1uLl9wYWdlc1twYWdlUG9zXS5JbmRleE9mZnNldDsKKyAgICAgICAgICAgICAgdmFyIHJvd1BvcyA9IGNvbHVtbi5fcGFnZXNbcGFnZVBvc10uR2V0UG9zaXRpb24ob2Zmc2V0KTsKKyAgICAgICAgICAgICAgaWYgKHJvd1BvcyA8IDApIHsKKyAgICAgICAgICAgICAgICByb3dQb3MgPSB+cm93UG9zOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLlJvd0NvdW50ID4gcm93UG9zKSB7CisgICAgICAgICAgICAgICAgVXBkYXRlSW5kZXhPZmZzZXQoY29sdW1uLCBwYWdlUG9zLCByb3dQb3MsIGZyb21Sb3csIHJvd3MpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFVwZGF0ZUluZGV4T2Zmc2V0KGNvbHVtbiwgcGFnZVBvcyArIDEsIDAsIGZyb21Sb3csIHJvd3MpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFVwZGF0ZUluZGV4T2Zmc2V0KGNvbHVtbiwgfnBhZ2VQb3MsIDAsIGZyb21Sb3csIHJvd3MpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGludGVybmFsIHZvaWQgQ2xlYXIoaW50IGZyb21Sb3csIGludCBmcm9tQ29sLCBpbnQgcm93cywgaW50IGNvbHVtbnMpIHsKKyAgICBEZWxldGUoZnJvbVJvdywgZnJvbUNvbCwgcm93cywgY29sdW1ucywgZmFsc2UpOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBEZWxldGUoaW50IGZyb21Sb3csIGludCBmcm9tQ29sLCBpbnQgcm93cywgaW50IGNvbHVtbnMpIHsKKyAgICBEZWxldGUoZnJvbVJvdywgZnJvbUNvbCwgcm93cywgY29sdW1ucywgdHJ1ZSk7CisgIH0KKworICBpbnRlcm5hbCB2b2lkIERlbGV0ZShpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCByb3dzLCBpbnQgY29sdW1ucywgYm9vbCBzaGlmdCkgeworICAgIGxvY2sgKF9jb2x1bW5JbmRleCkgeworICAgICAgaWYgKGNvbHVtbnMgPiAwICYmIGZyb21Sb3cgPT0gMSAmJiByb3dzID49IEV4Y2VsUGFja2FnZS5NYXhSb3dzKSB7CisgICAgICAgIERlbGV0ZUNvbHVtbnMoZnJvbUNvbCwgY29sdW1ucywgc2hpZnQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIHRvQ29sID0gZnJvbUNvbCArIGNvbHVtbnMgLSAxOworICAgICAgICB2YXIgcGFnZUZyb21Sb3cgPSBmcm9tUm93ID4+IF9wYWdlQml0czsKKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBDb2x1bW5Db3VudDsgYysrKSB7CisgICAgICAgICAgdmFyIGNvbHVtbiA9IF9jb2x1bW5JbmRleFtjXTsKKyAgICAgICAgICBpZiAoY29sdW1uLkluZGV4ID49IGZyb21Db2wpIHsKKyAgICAgICAgICAgIGlmIChjb2x1bW4uSW5kZXggPiB0b0NvbCkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBwYWdlUG9zID0gY29sdW1uLkdldFBvc2l0aW9uKGZyb21Sb3cpOworICAgICAgICAgICAgaWYgKHBhZ2VQb3MgPCAwKSB7CisgICAgICAgICAgICAgIHBhZ2VQb3MgPSB+cGFnZVBvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYWdlUG9zIDwgY29sdW1uLlBhZ2VDb3VudCkgeworICAgICAgICAgICAgICB2YXIgcGFnZSA9IGNvbHVtbi5fcGFnZXNbcGFnZVBvc107CisgICAgICAgICAgICAgIGlmIChzaGlmdAorICAgICAgICAgICAgICAgICAgJiYgcGFnZS5Sb3dDb3VudCA+IDAKKyAgICAgICAgICAgICAgICAgICYmIHBhZ2UuTWluSW5kZXggPiBmcm9tUm93CisgICAgICAgICAgICAgICAgICAmJiBwYWdlLk1heEluZGV4ID49IGZyb21Sb3cgKyByb3dzKSB7CisgICAgICAgICAgICAgICAgdmFyIG8gPSBwYWdlLk1pbkluZGV4IC0gZnJvbVJvdzsKKyAgICAgICAgICAgICAgICBpZiAobyA8IHJvd3MpIHsKKyAgICAgICAgICAgICAgICAgIHJvd3MgLT0gbzsKKyAgICAgICAgICAgICAgICAgIHBhZ2UuT2Zmc2V0IC09IG87CisgICAgICAgICAgICAgICAgICBVcGRhdGVQYWdlT2Zmc2V0KGNvbHVtbiwgcGFnZVBvcywgbyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHBhZ2UuT2Zmc2V0IC09IHJvd3M7CisgICAgICAgICAgICAgICAgICBVcGRhdGVQYWdlT2Zmc2V0KGNvbHVtbiwgcGFnZVBvcywgcm93cyk7CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHBhZ2UuUm93Q291bnQgPiAwCisgICAgICAgICAgICAgICAgICAmJiBwYWdlLk1pbkluZGV4IDw9IGZyb21Sb3cgKyByb3dzIC0gMQorICAgICAgICAgICAgICAgICAgJiYgcGFnZS5NYXhJbmRleAorICAgICAgICAgICAgICAgICAgICAgID49IGZyb21Sb3cpIC8vVGhlIHJvdyBpcyBpbnNpZGUgdGhlIHBhZ2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciBlbmRSb3cgPSBmcm9tUm93ICsgcm93czsKKyAgICAgICAgICAgICAgICB2YXIgZGVsRW5kUm93ID0gRGVsZXRlQ2VsbHMoY29sdW1uLl9wYWdlc1twYWdlUG9zXSwgZnJvbVJvdywgZW5kUm93LCBzaGlmdCk7CisgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ICYmIGRlbEVuZFJvdyAhPSBmcm9tUm93KSB7CisgICAgICAgICAgICAgICAgICBVcGRhdGVQYWdlT2Zmc2V0KGNvbHVtbiwgcGFnZVBvcywgZGVsRW5kUm93IC0gZnJvbVJvdyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlbmRSb3cgPiBkZWxFbmRSb3cKKyAgICAgICAgICAgICAgICAgICAgJiYgcGFnZVBvcyA8IGNvbHVtbi5QYWdlQ291bnQKKyAgICAgICAgICAgICAgICAgICAgJiYgY29sdW1uLl9wYWdlc1twYWdlUG9zXS5NaW5JbmRleCA8IGVuZFJvdykgeworICAgICAgICAgICAgICAgICAgcGFnZVBvcyA9IChkZWxFbmRSb3cgPT0gZnJvbVJvdyA/IHBhZ2VQb3MgOiBwYWdlUG9zICsgMSk7CisgICAgICAgICAgICAgICAgICB2YXIgcm93c0xlZnQgPSBEZWxldGVQYWdlKAorICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID8gZnJvbVJvdyA6IGRlbEVuZFJvdywKKyAgICAgICAgICAgICAgICAgICAgICBlbmRSb3cgLSBkZWxFbmRSb3csCisgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgIHBhZ2VQb3MsCisgICAgICAgICAgICAgICAgICAgICAgc2hpZnQpOworICAgICAgICAgICAgICAgICAgLy9pZiAoc2hpZnQpIFVwZGF0ZVBhZ2VPZmZzZXQoY29sdW1uLCBwYWdlUG9zLCBlbmRSb3cgLSBmcm9tUm93IC0gcm93c0xlZnQpOworICAgICAgICAgICAgICAgICAgaWYgKHJvd3NMZWZ0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICB2YXIgZnIgPSBzaGlmdCA/IGZyb21Sb3cgOiBlbmRSb3cgLSByb3dzTGVmdDsKKyAgICAgICAgICAgICAgICAgICAgcGFnZVBvcyA9IGNvbHVtbi5HZXRQb3NpdGlvbihmcik7CisgICAgICAgICAgICAgICAgICAgIGRlbEVuZFJvdyA9IERlbGV0ZUNlbGxzKAorICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLl9wYWdlc1twYWdlUG9zXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPyBmciArIHJvd3NMZWZ0IDogZW5kUm93LAorICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVQYWdlT2Zmc2V0KGNvbHVtbiwgcGFnZVBvcywgcm93c0xlZnQpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSBjb2w7IGMgPCBDb2x1bW5Db3VudDsgYysrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfY29sdW1uSW5kZXhbY10uSW5kZXggKz0gKHNob3J0KWNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHBhZ2UgPSBmcm9tUm93ID4+IHBhZ2VCaXRzOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IENvbHVtbkNvdW50OyBjKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW4gPSBfY29sdW1uSW5kZXhbY107Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGFnZVBvcyA9IGNvbHVtbi5HZXRQb3NpdGlvbihmcm9tUm93KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlUG9zID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21Sb3cgPj0gY29sdW1uLl9wYWdlc1twYWdlUG9zXS5NaW5JbmRleCAmJiBmcm9tUm93IDw9IGNvbHVtbi5fcGFnZXNbcGFnZVBvc10uTWF4SW5kZXgpIC8vVGhlIHJvdyBpcyBpbnNpZGUgdGhlIHBhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSBmcm9tUm93IC0gY29sdW1uLl9wYWdlc1twYWdlUG9zXS5JbmRleE9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvd1BvcyA9IGNvbHVtbi5fcGFnZXNbcGFnZVBvc10uR2V0UG9zaXRpb24ob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvd1BvcyA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd1BvcyA9IH5yb3dQb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlSW5kZXhPZmZzZXQoY29sdW1uLCBwYWdlUG9zLCByb3dQb3MsIGZyb21Sb3csIHJvd3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLk1pbkluZGV4ID4gZnJvbVJvdyAtIDEgJiYgcGFnZVBvcyA+IDApIC8vVGhlIHJvdyBpcyBvbiB0aGUgcGFnZSBiZWZvcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gZnJvbVJvdyAtICgocGFnZSAtIDEpIDw8IHBhZ2VCaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvd1BvcyA9IGNvbHVtbi5fcGFnZXNbcGFnZVBvcyAtIDFdLkdldFBvc2l0aW9uKG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dQb3MgPiAwICYmIHBhZ2VQb3MgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVJbmRleE9mZnNldChjb2x1bW4sIHBhZ2VQb3MgLSAxLCByb3dQb3MsIGZyb21Sb3csIHJvd3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbHVtbi5QYWdlQ291bnQgPj0gcGFnZVBvcyArIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gZnJvbVJvdyAtIGNvbHVtbi5fcGFnZXNbcGFnZVBvc10uSW5kZXhPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByb3dQb3MgPSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLkdldFBvc2l0aW9uKG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dQb3MgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dQb3MgPSB+cm93UG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLlJvd0NvdW50ID4gcm93UG9zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVJbmRleE9mZnNldChjb2x1bW4sIHBhZ2VQb3MsIHJvd1BvcywgZnJvbVJvdywgcm93cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVJbmRleE9mZnNldChjb2x1bW4sIHBhZ2VQb3MgKyAxLCAwLCBmcm9tUm93LCByb3dzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGVJbmRleE9mZnNldChjb2x1bW4sIH5wYWdlUG9zLCAwLCBmcm9tUm93LCByb3dzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhZ2VQb3MgPiAwCisgICAgICAgICAgICAgICAgICAmJiBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLkluZGV4T2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgPiBmcm9tUm93KSAvL1RoZSByb3cgaXMgb24gdGhlIHBhZ2UgYmVmb3JlLgorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IGZyb21Sb3cgKyByb3dzIC0gMSAtICgocGFnZUZyb21Sb3cgLSAxKSA8PCBfcGFnZUJpdHMpOworICAgICAgICAgICAgICAgIHZhciByb3dQb3MgPSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3MgLSAxXS5HZXRQb3NpdGlvbihvZmZzZXQpOworICAgICAgICAgICAgICAgIGlmIChyb3dQb3MgPiAwICYmIHBhZ2VQb3MgPiAwKSB7CisgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQpIHsKKyAgICAgICAgICAgICAgICAgICAgVXBkYXRlSW5kZXhPZmZzZXQoY29sdW1uLCBwYWdlUG9zIC0gMSwgcm93UG9zLCBmcm9tUm93ICsgcm93cyAtIDEsIC1yb3dzKTsKKyAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ICYmIHBhZ2VQb3MgKyAxIDwgY29sdW1uLlBhZ2VDb3VudCkgeworICAgICAgICAgICAgICAgICAgVXBkYXRlSW5kZXhPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgIHBhZ2VQb3MgKyAxLAorICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLl9wYWdlc1twYWdlUG9zICsgMV0uTWluSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgLXJvd3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCB2b2lkIENsZWFyKGludCBmcm9tUm93LCBpbnQgZnJvbUNvbCwgaW50IHJvd3MsIGludCBjb2x1bW5zKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZWxldGUoZnJvbVJvdywgZnJvbUNvbCwgcm93cywgY29sdW1ucywgZmFsc2UpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBVcGRhdGVQYWdlT2Zmc2V0KENvbHVtbkluZGV4IGNvbHVtbiwgaW50IHBhZ2VQb3MsIGludCByb3dzKSB7CisgICAgLy9VcGRhdGUgUGFnZW9mZnNldAorCisgICAgaWYgKCsrcGFnZVBvcyA8IGNvbHVtbi5QYWdlQ291bnQpIHsKKyAgICAgIGZvciAoaW50IHAgPSBwYWdlUG9zOyBwIDwgY29sdW1uLlBhZ2VDb3VudDsgcCsrKSB7CisgICAgICAgIGlmIChjb2x1bW4uX3BhZ2VzW3BdLk9mZnNldCAtIHJvd3MgPD0gLV9wYWdlU2l6ZSkgeworICAgICAgICAgIGNvbHVtbi5fcGFnZXNbcF0uSW5kZXgtLTsKKyAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3BdLk9mZnNldCAtPSByb3dzIC0gX3BhZ2VTaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbHVtbi5fcGFnZXNbcF0uT2Zmc2V0IC09IHJvd3M7CiAgICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBEZWxldGUoaW50IGZyb21Sb3csIGludCBmcm9tQ29sLCBpbnQgcm93cywgaW50IGNvbHVtbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlbGV0ZShmcm9tUm93LCBmcm9tQ29sLCByb3dzLCBjb2x1bW5zLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCB2b2lkIERlbGV0ZShpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCByb3dzLCBpbnQgY29sdW1ucywgYm9vbCBzaGlmdCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9jayAoX2NvbHVtbkluZGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjb2x1bW5zID4gMCAmJiBmcm9tUm93ID09IDEgJiYgcm93cyA+PSBFeGNlbFBhY2thZ2UuTWF4Um93cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0ZUNvbHVtbnMoZnJvbUNvbCwgY29sdW1ucywgc2hpZnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgdG9Db2wgPSBmcm9tQ29sICsgY29sdW1ucyAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBwYWdlRnJvbVJvdyA9IGZyb21Sb3cgPj4gcGFnZUJpdHM7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgQ29sdW1uQ291bnQ7IGMrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbiA9IF9jb2x1bW5JbmRleFtjXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uSW5kZXggPj0gZnJvbUNvbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLkluZGV4ID4gdG9Db2wpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYWdlUG9zID0gY29sdW1uLkdldFBvc2l0aW9uKGZyb21Sb3cpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlUG9zIDwgMCkgcGFnZVBvcyA9IH5wYWdlUG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWdlUG9zIDwgY29sdW1uLlBhZ2VDb3VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYWdlID0gY29sdW1uLl9wYWdlc1twYWdlUG9zXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ICYmIHBhZ2UuUm93Q291bnQgPiAwICYmIHBhZ2UuTWluSW5kZXggPiBmcm9tUm93ICYmIHBhZ2UuTWF4SW5kZXggPj0gZnJvbVJvdyArIHJvd3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvPXBhZ2UuTWluSW5kZXggLSBmcm9tUm93OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG8gPCByb3dzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MgLT0gbzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlLk9mZnNldCAtPSBvOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZVBhZ2VPZmZzZXQoY29sdW1uLCBwYWdlUG9zLCBvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlLk9mZnNldCAtPSByb3dzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZVBhZ2VPZmZzZXQoY29sdW1uLCBwYWdlUG9zLCByb3dzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFnZS5Sb3dDb3VudCA+IDAgJiYgcGFnZS5NaW5JbmRleCA8PSBmcm9tUm93K3Jvd3MtMSAmJiBwYWdlLk1heEluZGV4ID49IGZyb21Sb3cpIC8vVGhlIHJvdyBpcyBpbnNpZGUgdGhlIHBhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZFJvdyA9IGZyb21Sb3cgKyByb3dzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbEVuZFJvdyA9IERlbGV0ZUNlbGxzKGNvbHVtbi5fcGFnZXNbcGFnZVBvc10sIGZyb21Sb3csIGVuZFJvdywgc2hpZnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0ICYmIGRlbEVuZFJvdyAhPSBmcm9tUm93KSBVcGRhdGVQYWdlT2Zmc2V0KGNvbHVtbiwgcGFnZVBvcywgZGVsRW5kUm93IC0gZnJvbVJvdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5kUm93ID4gZGVsRW5kUm93ICYmIHBhZ2VQb3MgPCBjb2x1bW4uUGFnZUNvdW50ICYmIGNvbHVtbi5fcGFnZXNbcGFnZVBvc10uTWluSW5kZXggPCBlbmRSb3cpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVBvcyA9IChkZWxFbmRSb3cgPT0gZnJvbVJvdyA/IHBhZ2VQb3MgOiBwYWdlUG9zICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3NMZWZ0ID0gRGVsZXRlUGFnZShzaGlmdCA/IGZyb21Sb3cgOiBkZWxFbmRSb3csIGVuZFJvdyAtIGRlbEVuZFJvdywgY29sdW1uLCBwYWdlUG9zLCBzaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoc2hpZnQpIFVwZGF0ZVBhZ2VPZmZzZXQoY29sdW1uLCBwYWdlUG9zLCBlbmRSb3cgLSBmcm9tUm93IC0gcm93c0xlZnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dzTGVmdCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZnIgPSBzaGlmdCA/IGZyb21Sb3cgOiBlbmRSb3cgLSByb3dzTGVmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVBvcyA9IGNvbHVtbi5HZXRQb3NpdGlvbihmcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbEVuZFJvdyA9IERlbGV0ZUNlbGxzKGNvbHVtbi5fcGFnZXNbcGFnZVBvc10sIGZyLCBzaGlmdCA/IGZyICsgcm93c0xlZnQgOiBlbmRSb3csIHNoaWZ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0KSBVcGRhdGVQYWdlT2Zmc2V0KGNvbHVtbiwgcGFnZVBvcywgcm93c0xlZnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYWdlUG9zID4gMCAmJiBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLkluZGV4T2Zmc2V0ID4gZnJvbVJvdykgLy9UaGUgcm93IGlzIG9uIHRoZSBwYWdlIGJlZm9yZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IGZyb21Sb3cgKyByb3dzIC0gMSAtICgocGFnZUZyb21Sb3cgLSAxKSA8PCBwYWdlQml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm93UG9zID0gY29sdW1uLl9wYWdlc1twYWdlUG9zIC0gMV0uR2V0UG9zaXRpb24ob2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dQb3MgPiAwICYmIHBhZ2VQb3MgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCkgVXBkYXRlSW5kZXhPZmZzZXQoY29sdW1uLCBwYWdlUG9zIC0gMSwgcm93UG9zLCBmcm9tUm93ICsgcm93cyAtIDEsIC1yb3dzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdCAmJiBwYWdlUG9zICsgMSA8IGNvbHVtbi5QYWdlQ291bnQpIFVwZGF0ZUluZGV4T2Zmc2V0KGNvbHVtbiwgcGFnZVBvcyArIDEsIDAsIGNvbHVtbi5fcGFnZXNbcGFnZVBvcyArIDFdLk1pbkluZGV4LCAtcm93cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFVwZGF0ZVBhZ2VPZmZzZXQoQ29sdW1uSW5kZXggY29sdW1uLCBpbnQgcGFnZVBvcywgaW50IHJvd3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vVXBkYXRlIFBhZ2VvZmZzZXQKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCsrcGFnZVBvcyA8IGNvbHVtbi5QYWdlQ291bnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcCA9IHBhZ2VQb3M7IHAgPCBjb2x1bW4uUGFnZUNvdW50OyBwKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLl9wYWdlc1twXS5PZmZzZXQgLSByb3dzIDw9IC1QYWdlU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLl9wYWdlc1twXS5JbmRleC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLl9wYWdlc1twXS5PZmZzZXQgLT0gcm93cy1QYWdlU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5fcGFnZXNbcF0uT2Zmc2V0IC09IHJvd3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoTWF0aC5BYnMoY29sdW1uLl9wYWdlc1twYWdlUG9zXS5PZmZzZXQpID4gUGFnZVNpemUgfHwKLSAgICAgICAgICAgICAgICAgICAgTWF0aC5BYnMoY29sdW1uLl9wYWdlc1twYWdlUG9zXS5Sb3dzW2NvbHVtbi5fcGFnZXNbcGFnZVBvc10uUm93Q291bnQtMV0uSW5kZXgpID4gUGFnZVNpemVNYXgpIC8vU3BsaXQgb3IgTWVyZ2U/Pz8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJvd3M9UmVzZXRQYWdlT2Zmc2V0KGNvbHVtbiwgcGFnZVBvcywgcm93cyk7Ci0gICAgICAgICAgICAgICAgICAgIC8vLy9NZXJnZVBhZ2VzCi0gICAgICAgICAgICAgICAgICAgIC8vaWYgKGNvbHVtbi5QYWdlc1twYWdlUG9zIC0gMV0uSW5kZXggKyAxID09IGNvbHVtbi5QYWdlc1twYWdlUG9zXS5JbmRleCkKLSAgICAgICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIGlmIChjb2x1bW4uUGFnZXNbcGFnZVBvc10uSW5kZXhPZmZzZXQgKyBjb2x1bW4uUGFnZXNbcGFnZVBvc10uUm93c1tjb2x1bW4uUGFnZXNbcGFnZVBvc10uUm93Q291bnQgLSAxXS5JbmRleCArIHJvd3MgLQotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgY29sdW1uLlBhZ2VzW3BhZ2VQb3MgLSAxXS5JbmRleE9mZnNldCArIGNvbHVtbi5QYWdlc1twYWdlUG9zIC0gMV0uUm93c1swXS5JbmRleCA8PSBQYWdlU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgewotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgLy9NZXJnZQotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgTWVyZ2VQYWdlKGNvbHVtbiwgcGFnZVBvcyAtIDEsIC1yb3dzKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgfQotICAgICAgICAgICAgICAgICAgICAvLyAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIC8vU3BsaXQKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgfQotICAgICAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICAgICAgLy9yb3dzIC09IFBhZ2VTaXplOwotICAgICAgICAgICAgICAgICAgICAvL2ZvciAoaW50IHAgPSBwYWdlUG9zOyBwIDwgY29sdW1uLlBhZ2VDb3VudDsgcCsrKQotICAgICAgICAgICAgICAgICAgICAvL3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIGNvbHVtbi5QYWdlc1twXS5JbmRleCAtPSAxOwotICAgICAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IFJlc2V0UGFnZU9mZnNldChDb2x1bW5JbmRleCBjb2x1bW4sIGludCBwYWdlUG9zLCBpbnQgcm93cykKLSAgICAgICAgewotICAgICAgICAgICAgUGFnZUluZGV4IGZyb21QYWdlPWNvbHVtbi5fcGFnZXNbcGFnZVBvc107Ci0gICAgICAgICAgICBQYWdlSW5kZXggdG9QYWdlOwotICAgICAgICAgICAgc2hvcnQgcGFnZUFkZCA9IDA7Ci0gICAgICAgICAgICBpZiAoZnJvbVBhZ2UuT2Zmc2V0IDwgLVBhZ2VTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRvUGFnZT1jb2x1bW4uX3BhZ2VzW3BhZ2VQb3MtMV07Ci0gICAgICAgICAgICAgICAgcGFnZUFkZCA9IC0xOwotICAgICAgICAgICAgICAgIGlmIChmcm9tUGFnZS5JbmRleCAtIDEgPT0gdG9QYWdlLkluZGV4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21QYWdlLkluZGV4T2Zmc2V0ICsgZnJvbVBhZ2UuUm93c1tmcm9tUGFnZS5Sb3dDb3VudCAtIDFdLkluZGV4IC0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRvUGFnZS5JbmRleE9mZnNldCArIHRvUGFnZS5Sb3dzWzBdLkluZGV4IDw9IFBhZ2VTaXplTWF4KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXJnZVBhZ2UoY29sdW1uLCBwYWdlUG9zIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3ZhciBuZXdQYWdlID0gbmV3IFBhZ2VJbmRleCh0b1BhZ2UsIDAsIEdldFNpemUoZnJvbVBhZ2UuUm93Q291bnQgKyB0b1BhZ2UuUm93Q291bnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV3UGFnZS5Sb3dDb3VudCA9IGZyb21QYWdlLlJvd0NvdW50ICsgZnJvbVBhZ2UuUm93Q291bnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0FycmF5LkNvcHkodG9QYWdlLlJvd3MsIDAsIG5ld1BhZ2UuUm93cywgMCwgdG9QYWdlLlJvd0NvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vQXJyYXkuQ29weShmcm9tUGFnZS5Sb3dzLCAwLCBuZXdQYWdlLlJvd3MsIHRvUGFnZS5Sb3dDb3VudCwgZnJvbVBhZ2UuUm93Q291bnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3IgKGludCByID0gdG9QYWdlLlJvd0NvdW50OyByIDwgbmV3UGFnZS5Sb3dDb3VudDsgcisrKQotICAgICAgICAgICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBuZXdQYWdlLlJvd3Nbcl0uSW5kZXggKz0gKHNob3J0KShmcm9tUGFnZS5JbmRleE9mZnNldCAtIHRvUGFnZS5JbmRleE9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgLy9ObyBwYWdlIGFmdGVyIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnJvbVBhZ2UuSW5kZXggLT0gcGFnZUFkZDsKLSAgICAgICAgICAgICAgICAgICAgZnJvbVBhZ2UuT2Zmc2V0ICs9IFBhZ2VTaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGZyb21QYWdlLk9mZnNldCA+IFBhZ2VTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRvUGFnZSA9IGNvbHVtbi5fcGFnZXNbcGFnZVBvcyArIDFdOwotICAgICAgICAgICAgICAgIHBhZ2VBZGQgPSAxOwotICAgICAgICAgICAgICAgIGlmIChmcm9tUGFnZS5JbmRleCArIDEgPT0gdG9QYWdlLkluZGV4KQotICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmcm9tUGFnZS5JbmRleCArPSBwYWdlQWRkOwotICAgICAgICAgICAgICAgICAgICBmcm9tUGFnZS5PZmZzZXQgKz0gUGFnZVNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJvd3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBEZWxldGVQYWdlKGludCBmcm9tUm93LCBpbnQgcm93cywgQ29sdW1uSW5kZXggY29sdW1uLCBpbnQgcGFnZVBvcywgYm9vbCBzaGlmdCkKLSAgICAgICAgewotICAgICAgICAgICAgUGFnZUluZGV4IHBhZ2UgPSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdOwotICAgICAgICAgICAgdmFyIHN0YXJ0Um93cyA9IHJvd3M7Ci0gICAgICAgICAgICB3aGlsZSAocGFnZSAhPSBudWxsICYmIHBhZ2UuTWluSW5kZXggPj0gZnJvbVJvdyAmJiAoKHNoaWZ0ICYmIHBhZ2UuTWF4SW5kZXggPCBmcm9tUm93ICsgcm93cykgfHwgKCFzaGlmdCAmJiBwYWdlLk1heEluZGV4IDwgZnJvbVJvdyArIHN0YXJ0Um93cykpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vRGVsZXRlIGVudGlyZSBwYWdlLgotICAgICAgICAgICAgICAgIHZhciBkZWxTaXplPXBhZ2UuTWF4SW5kZXggLSBwYWdlLk1pbkluZGV4KzE7Ci0gICAgICAgICAgICAgICAgcm93cyAtPSBkZWxTaXplOwotICAgICAgICAgICAgICAgIHZhciBwcmV2T2Zmc2V0ID0gcGFnZS5PZmZzZXQ7Ci0gICAgICAgICAgICAgICAgQXJyYXkuQ29weShjb2x1bW4uX3BhZ2VzLCBwYWdlUG9zICsgMSwgY29sdW1uLl9wYWdlcywgcGFnZVBvcywgY29sdW1uLlBhZ2VDb3VudCAtIHBhZ2VQb3MgKyAxKTsKLSAgICAgICAgICAgICAgICBjb2x1bW4uUGFnZUNvdW50LS07Ci0gICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5QYWdlQ291bnQgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihzaGlmdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwYWdlUG9zOyBpIDwgY29sdW1uLlBhZ2VDb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uX3BhZ2VzW2ldLk9mZnNldCAtPSBkZWxTaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5fcGFnZXNbaV0uT2Zmc2V0IDw9IC1QYWdlU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uX3BhZ2VzW2ldLkluZGV4LS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLl9wYWdlc1tpXS5PZmZzZXQgKz0gUGFnZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uUGFnZUNvdW50ID4gcGFnZVBvcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBhZ2UgPSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdOwotICAgICAgICAgICAgICAgICAgICAvL3BhZ2UuT2Zmc2V0ID0gcGFnZVBvcyA9PSAwID8gMSA6IHByZXZPZmZzZXQ7ICAvL0ZpcnN0IHBhZ2UgY2FuIG9ubHkgcmVmZXJlbmNlIHRvIHJvd3Mgc3RhcnRpbmcgZnJvbSBJbmRleCA9PSAxCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vTm8gbW9yZSBwYWdlcywgcmV0dXJuIDAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJvd3M7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vCi0gICAgICAgIHByaXZhdGUgaW50IERlbGV0ZUNlbGxzKFBhZ2VJbmRleCBwYWdlLCAgaW50IGZyb21Sb3csIGludCB0b1JvdywgYm9vbCBzaGlmdCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZyb21Qb3MgPSBwYWdlLkdldFBvc2l0aW9uKGZyb21Sb3cgLSAocGFnZS5JbmRleE9mZnNldCkpOwotICAgICAgICAgICAgaWYgKGZyb21Qb3MgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyb21Qb3MgPSB+ZnJvbVBvczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBtYXhSb3cgPSBwYWdlLk1heEluZGV4OwotICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRvUm93IC0gcGFnZS5JbmRleE9mZnNldDsKLSAgICAgICAgICAgIGlmIChvZmZzZXQgPiBQYWdlU2l6ZU1heCkgb2Zmc2V0ID0gUGFnZVNpemVNYXg7Ci0gICAgICAgICAgICB2YXIgdG9Qb3MgPSBwYWdlLkdldFBvc2l0aW9uKG9mZnNldCk7Ci0gICAgICAgICAgICBpZiAodG9Qb3MgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRvUG9zID0gfnRvUG9zOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZnJvbVBvcyA8PSB0b1BvcyAmJiBmcm9tUG9zIDwgcGFnZS5Sb3dDb3VudCAmJiBwYWdlLkdldEluZGV4KGZyb21Qb3MpIDwgdG9Sb3cpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHRvUm93ID4gcGFnZS5NYXhJbmRleCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmcm9tUm93ID09IHBhZ2UuTWluSW5kZXgpIC8vRGVsZXRlIGVudGlyZSBwYWdlLCBsYXRlIGluIHRoZSBwYWdlIGRlbGV0ZSBtZXRob2QKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21Sb3c7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBwYWdlLk1heEluZGV4OwotICAgICAgICAgICAgICAgICAgICB2YXIgZGVsZXRlZFJvdyA9IHBhZ2UuUm93Q291bnQgLSBmcm9tUG9zOyAKLSAgICAgICAgICAgICAgICAgICAgcGFnZS5Sb3dDb3VudCAtPSBkZWxldGVkUm93OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcisxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgcm93cyA9IHRvUm93IC0gZnJvbVJvdzsKLSAgICAgICAgICAgICAgICAgICAgaWYoc2hpZnQpIFVwZGF0ZVJvd0luZGV4KHBhZ2UsIHRvUG9zLCByb3dzKTsKLSAgICAgICAgICAgICAgICAgICAgQXJyYXkuQ29weShwYWdlLlJvd3MsIHRvUG9zLCBwYWdlLlJvd3MsIGZyb21Qb3MsIHBhZ2UuUm93Q291bnQgLSB0b1Bvcyk7Ci0gICAgICAgICAgICAgICAgICAgIHBhZ2UuUm93Q291bnQgLT0gdG9Qb3MtZnJvbVBvczsKLQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9Sb3c7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihzaGlmdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVcGRhdGVSb3dJbmRleChwYWdlLCB0b1BvcywgdG9Sb3cgLSBmcm9tUm93KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0b1JvdyA8IG1heFJvdyA/IHRvUm93IDogbWF4Um93OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBVcGRhdGVSb3dJbmRleChQYWdlSW5kZXggcGFnZSwgaW50IHRvUG9zLCBpbnQgcm93cykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgciA9IHRvUG9zOyByIDwgcGFnZS5Sb3dDb3VudDsgcisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhZ2UuUm93c1tyXS5JbmRleCAtPSAoc2hvcnQpIHJvd3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgRGVsZXRlQ29sdW1ucyhpbnQgZnJvbUNvbCwgaW50IGNvbHVtbnMsIGJvb2wgc2hpZnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmUG9zID0gR2V0UG9zaXRpb24oZnJvbUNvbCk7Ci0gICAgICAgICAgICBpZiAoZlBvcyA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZlBvcyA9IH5mUG9zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHRQb3MgPSBmUG9zOwotICAgICAgICAgICAgZm9yICh2YXIgYyA9IGZQb3M7IGMgPD0gQ29sdW1uQ291bnQ7IGMrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0UG9zID0gYzsKLSAgICAgICAgICAgICAgICBpZiAodFBvcz09Q29sdW1uQ291bnQgfHwgX2NvbHVtbkluZGV4W2NdLkluZGV4ID49IGZyb21Db2wgKyBjb2x1bW5zKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoQ29sdW1uQ291bnQgPD0gZlBvcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChfY29sdW1uSW5kZXhbZlBvc10uSW5kZXggPj0gZnJvbUNvbCAmJiBfY29sdW1uSW5kZXhbZlBvc10uSW5kZXggPD0gZnJvbUNvbCArIGNvbHVtbnMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9pZiAoX2NvbHVtbkluZGV4W2ZQb3NdLkluZGV4IDwgQ29sdW1uQ291bnQpCi0gICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0UG9zIDwgQ29sdW1uQ291bnQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoX2NvbHVtbkluZGV4LCB0UG9zLCBfY29sdW1uSW5kZXgsIGZQb3MsIENvbHVtbkNvdW50IC0gdFBvcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQ29sdW1uQ291bnQgLT0gKHRQb3MgLSBmUG9zKTsKLSAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaGlmdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gZlBvczsgYyA8IENvbHVtbkNvdW50OyBjKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfY29sdW1uSW5kZXhbY10uSW5kZXggLT0gKHNob3J0KWNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFVwZGF0ZUluZGV4T2Zmc2V0KENvbHVtbkluZGV4IGNvbHVtbiwgaW50IHBhZ2VQb3MsIGludCByb3dQb3MsIGludCByb3csIGludCByb3dzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocGFnZVBvcyA+PSBjb2x1bW4uUGFnZUNvdW50KSByZXR1cm47ICAgIC8vQSBwYWdlIGFmdGVyIGxhc3QgY2VsbC4KLSAgICAgICAgICAgIHZhciBwYWdlID0gY29sdW1uLl9wYWdlc1twYWdlUG9zXTsKLSAgICAgICAgICAgIGlmIChyb3dzID4gUGFnZVNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2hvcnQgYWRkUGFnZXMgPSAoc2hvcnQpKHJvd3MgPj4gcGFnZUJpdHMpOwotICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSArKGludCkocm93cyAtIChQYWdlU2l6ZSphZGRQYWdlcykpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IHAgPSBwYWdlUG9zICsgMTsgcCA8IGNvbHVtbi5QYWdlQ291bnQ7IHArKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uX3BhZ2VzW3BdLk9mZnNldCArIG9mZnNldCA+IFBhZ2VTaXplKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3BdLkluZGV4ICs9IChzaG9ydCkoYWRkUGFnZXMgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5fcGFnZXNbcF0uT2Zmc2V0ICs9IG9mZnNldCAtIFBhZ2VTaXplOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLl9wYWdlc1twXS5JbmRleCArPSBhZGRQYWdlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5fcGFnZXNbcF0uT2Zmc2V0ICs9IG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHBhZ2UuUm93Q291bnQgLSByb3dQb3M7Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2UuUm93Q291bnQgPiByb3dQb3MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLlBhZ2VDb3VudC0xID09IHBhZ2VQb3MpIC8vTm8gcGFnZSBhZnRlciwgY3JlYXRlIGEgbmV3IG9uZS4KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9Db3B5IHJvd3MgdG8gbmV4dCBwYWdlLgotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1BhZ2UgPSBDb3B5TmV3KHBhZ2UsIHJvd1Bvcywgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdQYWdlLkluZGV4ID0gKHNob3J0KSgocm93ICsgcm93cykgPj4gcGFnZUJpdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFnZS5PZmZzZXQgPSByb3cgKyByb3dzIC0gKG5ld1BhZ2UuSW5kZXggKiBQYWdlU2l6ZSkgLSBuZXdQYWdlLlJvd3NbMF0uSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3UGFnZS5PZmZzZXQgPiBQYWdlU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYWdlLkluZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGFnZS5PZmZzZXQgLT0gUGFnZVNpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZGRQYWdlKGNvbHVtbiwgcGFnZVBvcyArIDEsIG5ld1BhZ2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5Sb3dDb3VudCA9IHJvd1BvczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uX3BhZ2VzW3BhZ2VQb3MgKyAxXS5Sb3dDb3VudCArIHNpemUgPiBQYWdlU2l6ZU1heCkgLy9TcGxpdCBQYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BsaXRQYWdlSW5zZXJ0KGNvbHVtbixwYWdlUG9zLCByb3dQb3MsIHJvd3MsIHNpemUsIGFkZFBhZ2VzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgLy9Db3B5IFBhZ2UuCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weU1lcmdlUGFnZShwYWdlLCByb3dQb3MsIHJvd3MsIHNpemUsIGNvbHVtbi5fcGFnZXNbcGFnZVBvcyArIDFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9BZGQgdG8gUGFnZXMuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IHJvd1BvczsgciA8IHBhZ2UuUm93Q291bnQ7IHIrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBhZ2UuUm93c1tyXS5JbmRleCArPSAoc2hvcnQpcm93czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2UuT2Zmc2V0ICsgcGFnZS5Sb3dzW3BhZ2UuUm93Q291bnQtMV0uSW5kZXggPj0gUGFnZVNpemVNYXgpICAgLy9DYW4gbm90IGJlIGxhcmdlciB0aGFuIHRoZSBtYXggc2l6ZSBvZiB0aGUgcGFnZS4KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFkanVzdEluZGV4KGNvbHVtbiwgcGFnZVBvcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWdlLk9mZnNldCArIHBhZ2UuUm93c1twYWdlLlJvd0NvdW50IC0gMV0uSW5kZXggPj0gUGFnZVNpemVNYXgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VQb3M9U3BsaXRQYWdlKGNvbHVtbiwgcGFnZVBvcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9JbmRleEl0ZW1bXSBuZXdSb3dzID0gbmV3IEluZGV4SXRlbVtHZXRTaXplKHBhZ2UuUm93Q291bnQgLSBwYWdlLlJvd3Nbcl0uSW5kZXgpXTsKLSAgICAgICAgICAgICAgICAgICAgLy92YXIgbmV3UGFnZSA9IG5ldyBQYWdlSW5kZXgobmV3Um93cywgcik7Ci0gICAgICAgICAgICAgICAgICAgIC8vbmV3UGFnZS5JbmRleCA9IChzaG9ydCkocGFnZVBvcyArIDEpOwotICAgICAgICAgICAgICAgICAgICAvL1RPRE86IE1vdmVSb3dzIHRvIG5leHQgcGFnZS4KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBwID0gcGFnZVBvcyArIDE7IHAgPCBjb2x1bW4uUGFnZUNvdW50OyBwKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uLl9wYWdlc1twXS5PZmZzZXQgKyByb3dzIDwgUGFnZVNpemUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5fcGFnZXNbcF0uT2Zmc2V0ICs9IHJvd3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3BdLkluZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3BdLk9mZnNldCA9IChjb2x1bW4uX3BhZ2VzW3BdLk9mZnNldCtyb3dzKSAlIFBhZ2VTaXplOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNwbGl0UGFnZUluc2VydChDb2x1bW5JbmRleCBjb2x1bW4saW50IHBhZ2VQb3MsIGludCByb3dQb3MsIGludCByb3dzLCBpbnQgc2l6ZSwgaW50IGFkZFBhZ2VzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbmV3Um93cyA9IG5ldyBJbmRleEl0ZW1bR2V0U2l6ZShzaXplKV07Ci0gICAgICAgICAgICB2YXIgcGFnZT1jb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdOwotCi0gICAgICAgICAgICB2YXIgclN0YXJ0PS0xOwotICAgICAgICAgICAgZm9yIChpbnQgciA9IHJvd1BvczsgciA8IHBhZ2UuUm93Q291bnQ7IHIrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocGFnZS5JbmRleEV4cGFuZGVkIC0gKHBhZ2UuUm93c1tyXS5JbmRleCArIHJvd3MpID4gUGFnZVNpemUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByU3RhcnQgPSByOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGFnZS5Sb3dzW3JdLkluZGV4ICs9IChzaG9ydClyb3dzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciByYyA9IHBhZ2UuUm93Q291bnQgLSByU3RhcnQ7Ci0gICAgICAgICAgICBwYWdlLlJvd0NvdW50PXJTdGFydDsKLSAgICAgICAgICAgIGlmKHJjPjApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9Db3B5IHRvIGEgbmV3IHBhZ2UKLSAgICAgICAgICAgICAgICB2YXIgcm93ID0gcGFnZS5JbmRleE9mZnNldDsKLSAgICAgICAgICAgICAgICB2YXIgbmV3UGFnZT1Db3B5TmV3KHBhZ2UsclN0YXJ0LHJjKTsKLSAgICAgICAgICAgICAgICB2YXIgaXggPSAoc2hvcnQpKHBhZ2UuSW5kZXggKyBhZGRQYWdlcyk7Ci0gICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IHBhZ2UuSW5kZXhPZmZzZXQgKyByb3dzIC0gKGl4ICogUGFnZVNpemUpOwotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPiBQYWdlU2l6ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGl4ICs9IChzaG9ydCkob2Zmc2V0IC8gUGFnZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgJT0gUGFnZVNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5ld1BhZ2UuSW5kZXggPSBpeDsKLSAgICAgICAgICAgICAgICBuZXdQYWdlLk9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgICAgICAgICBBZGRQYWdlKGNvbHVtbiwgcGFnZVBvcyArIDEsIG5ld1BhZ2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL0NvcHkgZnJvbSBuZXh0IFJvdwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIENvcHlNZXJnZVBhZ2UoUGFnZUluZGV4IHBhZ2UsIGludCByb3dQb3MsIGludCByb3dzLCBpbnQgc2l6ZSwgUGFnZUluZGV4IFRvUGFnZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHN0YXJ0Um93ID0gcGFnZS5JbmRleE9mZnNldCArIHBhZ2UuUm93c1tyb3dQb3NdLkluZGV4ICsgcm93czsKLSAgICAgICAgICAgIHZhciBuZXdSb3dzID0gbmV3IEluZGV4SXRlbVtHZXRTaXplKFRvUGFnZS5Sb3dDb3VudCArIHNpemUpXTsKLSAgICAgICAgICAgIHBhZ2UuUm93Q291bnQgLT0gc2l6ZTsKLSAgICAgICAgICAgIEFycmF5LkNvcHkocGFnZS5Sb3dzLCByb3dQb3MsIG5ld1Jvd3MsIDAsIHNpemUpOwotICAgICAgICAgICAgZm9yIChpbnQgciA9IDA7IHIgPCBzaXplOyByKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3Um93c1tyXS5JbmRleCArPSAoc2hvcnQpKHBhZ2UuSW5kZXhPZmZzZXQgKyByb3dzIC0gVG9QYWdlLkluZGV4T2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQXJyYXkuQ29weShUb1BhZ2UuUm93cywgMCwgbmV3Um93cywgc2l6ZSwgVG9QYWdlLlJvd0NvdW50KTsKLSAgICAgICAgICAgIFRvUGFnZS5Sb3dzID0gbmV3Um93czsKLSAgICAgICAgICAgIFRvUGFnZS5Sb3dDb3VudCArPSBzaXplOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBNZXJnZVBhZ2UoQ29sdW1uSW5kZXggY29sdW1uLCBpbnQgcGFnZVBvcykKLSAgICAgICAgewotICAgICAgICAgICAgUGFnZUluZGV4IFBhZ2UxPWNvbHVtbi5fcGFnZXNbcGFnZVBvc107Ci0gICAgICAgICAgICBQYWdlSW5kZXggUGFnZTIgPSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3MgKyAxXTsKLQotICAgICAgICAgICAgdmFyIG5ld1BhZ2UgPSBuZXcgUGFnZUluZGV4KFBhZ2UxLCAwLCBQYWdlMS5Sb3dDb3VudCArIFBhZ2UyLlJvd0NvdW50KTsKLSAgICAgICAgICAgIG5ld1BhZ2UuUm93Q291bnQgPSBQYWdlMS5Sb3dDb3VudCArIFBhZ2UyLlJvd0NvdW50OwotICAgICAgICAgICAgQXJyYXkuQ29weShQYWdlMS5Sb3dzLCAwLCBuZXdQYWdlLlJvd3MsIDAsIFBhZ2UxLlJvd0NvdW50KTsKLSAgICAgICAgICAgIEFycmF5LkNvcHkoUGFnZTIuUm93cywgMCwgbmV3UGFnZS5Sb3dzLCBQYWdlMS5Sb3dDb3VudCwgUGFnZTIuUm93Q291bnQpOwotICAgICAgICAgICAgZm9yIChpbnQgciA9IFBhZ2UxLlJvd0NvdW50OyByIDwgbmV3UGFnZS5Sb3dDb3VudDsgcisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ld1BhZ2UuUm93c1tyXS5JbmRleCArPSAoc2hvcnQpKFBhZ2UyLkluZGV4T2Zmc2V0IC0gUGFnZTEuSW5kZXhPZmZzZXQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdID0gbmV3UGFnZTsKLSAgICAgICAgICAgIGNvbHVtbi5QYWdlQ291bnQtLTsKLQotICAgICAgICAgICAgaWYgKGNvbHVtbi5QYWdlQ291bnQgPiAocGFnZVBvcyArIDEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoY29sdW1uLl9wYWdlcywgcGFnZVBvcysyLCBjb2x1bW4uX3BhZ2VzLHBhZ2VQb3MrMSxjb2x1bW4uUGFnZUNvdW50LShwYWdlUG9zKzEpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBwID0gcGFnZVBvcyArIDE7IHAgPCBjb2x1bW4uUGFnZUNvdW50OyBwKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3BdLkluZGV4LS07Ci0gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5fcGFnZXNbcF0uT2Zmc2V0ICs9IFBhZ2VTaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUGFnZUluZGV4IENvcHlOZXcoUGFnZUluZGV4IHBhZ2VGcm9tLCBpbnQgcm93UG9zLCBpbnQgc2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgSW5kZXhJdGVtW10gbmV3Um93cyA9IG5ldyBJbmRleEl0ZW1bR2V0U2l6ZShzaXplKV07Ci0gICAgICAgICAgICBBcnJheS5Db3B5KHBhZ2VGcm9tLlJvd3MsIHJvd1BvcywgbmV3Um93cywgMCwgc2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBhZ2VJbmRleChuZXdSb3dzLCBzaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBpbnQgR2V0U2l6ZShpbnQgc2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG5ld1NpemU9MjU2OwotICAgICAgICAgICAgd2hpbGUgKG5ld1NpemUgPCBzaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ld1NpemUgPDw9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3U2l6ZTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgQWRkQ2VsbChDb2x1bW5JbmRleCBjb2x1bW5JbmRleCwgaW50IHBhZ2VQb3MsIGludCBwb3MsIHNob3J0IGl4LCBUIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBQYWdlSW5kZXggcGFnZUl0ZW0gPSBjb2x1bW5JbmRleC5fcGFnZXNbcGFnZVBvc107Ci0gICAgICAgICAgICBpZiAocGFnZUl0ZW0uUm93Q291bnQgPT0gcGFnZUl0ZW0uUm93cy5MZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHBhZ2VJdGVtLlJvd0NvdW50ID09IFBhZ2VTaXplTWF4KSAvL01heCBzaXplLS0+U3BsaXQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBhZ2VQb3M9U3BsaXRQYWdlKGNvbHVtbkluZGV4LCBwYWdlUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4Ll9wYWdlc1twYWdlUG9zIC0gMV0uUm93Q291bnQgPiBwb3MpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VQb3MtLTsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcyAtPSBjb2x1bW5JbmRleC5fcGFnZXNbcGFnZVBvcyAtIDFdLlJvd0NvdW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBhZ2VJdGVtID0gY29sdW1uSW5kZXguX3BhZ2VzW3BhZ2VQb3NdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIC8vRXhwYW5kIHRvIGRvdWJsZSBzaXplLgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3NUbXAgPSBuZXcgSW5kZXhJdGVtW3BhZ2VJdGVtLlJvd3MuTGVuZ3RoIDw8IDFdOwotICAgICAgICAgICAgICAgICAgICBBcnJheS5Db3B5KHBhZ2VJdGVtLlJvd3MsIDAsIHJvd3NUbXAsIDAsIHBhZ2VJdGVtLlJvd0NvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgcGFnZUl0ZW0uUm93cyA9IHJvd3NUbXA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBvcyA8IHBhZ2VJdGVtLlJvd0NvdW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFycmF5LkNvcHkocGFnZUl0ZW0uUm93cywgcG9zLCBwYWdlSXRlbS5Sb3dzLCBwb3MgKyAxLCBwYWdlSXRlbS5Sb3dDb3VudCAtIHBvcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYWdlSXRlbS5Sb3dzW3Bvc10gPSBuZXcgSW5kZXhJdGVtKCkgeyBJbmRleCA9IGl4LEluZGV4UG9pbnRlcj1fdmFsdWVzLkNvdW50IH07Ci0gICAgICAgICAgICBfdmFsdWVzLkFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICBwYWdlSXRlbS5Sb3dDb3VudCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgU3BsaXRQYWdlKENvbHVtbkluZGV4IGNvbHVtbkluZGV4LCBpbnQgcGFnZVBvcykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhZ2UgPSBjb2x1bW5JbmRleC5fcGFnZXNbcGFnZVBvc107Ci0gICAgICAgICAgICBpZiAocGFnZS5PZmZzZXQgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gcGFnZS5PZmZzZXQ7Ci0gICAgICAgICAgICAgICAgcGFnZS5PZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IHIgPSAwOyByIDwgcGFnZS5Sb3dDb3VudDsgcisrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGFnZS5Sb3dzW3JdLkluZGV4IC09IChzaG9ydClvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9GaW5kIFNwbGl0IHBvcwotICAgICAgICAgICAgaW50IHNwbGl0UG9zPTA7ICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8IHBhZ2UuUm93Q291bnQ7IHIrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocGFnZS5Sb3dzW3JdLkluZGV4ID4gUGFnZVNpemUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzcGxpdFBvcz1yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgbmV3UGFnZSA9IG5ldyBQYWdlSW5kZXgocGFnZSwgMCwgc3BsaXRQb3MpOwotICAgICAgICAgICAgdmFyIG5leHRQYWdlID0gbmV3IFBhZ2VJbmRleChwYWdlLCBzcGxpdFBvcywgcGFnZS5Sb3dDb3VudCAtIHNwbGl0UG9zLCAoc2hvcnQpKHBhZ2UuSW5kZXggKyAxKSwgcGFnZS5PZmZzZXQpOwotCi0gICAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8IG5leHRQYWdlLlJvd0NvdW50OyByKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV4dFBhZ2UuUm93c1tyXS5JbmRleCA9IChzaG9ydCkobmV4dFBhZ2UuUm93c1tyXS5JbmRleCAtIFBhZ2VTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgY29sdW1uSW5kZXguX3BhZ2VzW3BhZ2VQb3NdID0gbmV3UGFnZTsKLSAgICAgICAgICAgIGlmIChjb2x1bW5JbmRleC5QYWdlQ291bnQgKyAxID4gY29sdW1uSW5kZXguX3BhZ2VzLkxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgcGFnZVRtcCA9IG5ldyBQYWdlSW5kZXhbY29sdW1uSW5kZXguX3BhZ2VzLkxlbmd0aCA8PCAxXTsKLSAgICAgICAgICAgICAgICBBcnJheS5Db3B5KGNvbHVtbkluZGV4Ll9wYWdlcywgMCwgcGFnZVRtcCwgMCwgY29sdW1uSW5kZXguUGFnZUNvdW50KTsKLSAgICAgICAgICAgICAgICBjb2x1bW5JbmRleC5fcGFnZXMgPSBwYWdlVG1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXJyYXkuQ29weShjb2x1bW5JbmRleC5fcGFnZXMsIHBhZ2VQb3MgKyAxLCBjb2x1bW5JbmRleC5fcGFnZXMsIHBhZ2VQb3MgKyAyLCBjb2x1bW5JbmRleC5QYWdlQ291bnQgLSBwYWdlUG9zIC0gMSk7Ci0gICAgICAgICAgICBjb2x1bW5JbmRleC5fcGFnZXNbcGFnZVBvcyArIDFdID0gbmV4dFBhZ2U7Ci0gICAgICAgICAgICBwYWdlID0gbmV4dFBhZ2U7Ci0gICAgICAgICAgICAvL3BvcyAtPSBQYWdlU2l6ZTsKLSAgICAgICAgICAgIGNvbHVtbkluZGV4LlBhZ2VDb3VudCsrOwotICAgICAgICAgICAgcmV0dXJuIHBhZ2VQb3MrMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgUGFnZUluZGV4IEFkanVzdEluZGV4KENvbHVtbkluZGV4IGNvbHVtbkluZGV4LCBpbnQgcGFnZVBvcykKLSAgICAgICAgewotICAgICAgICAgICAgUGFnZUluZGV4IHBhZ2UgPSBjb2x1bW5JbmRleC5fcGFnZXNbcGFnZVBvc107Ci0gICAgICAgICAgICAvL0ZpcnN0IEFkanVzdCBpbmRleGVzCi0gICAgICAgICAgICBpZiAocGFnZS5PZmZzZXQgKyBwYWdlLlJvd3NbMF0uSW5kZXggPj0gUGFnZVNpemUgfHwKLSAgICAgICAgICAgICAgICBwYWdlLk9mZnNldCA+PSBQYWdlU2l6ZSB8fAotICAgICAgICAgICAgICAgIHBhZ2UuUm93c1swXS5JbmRleCA+PSBQYWdlU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYWdlLkluZGV4Kys7Ci0gICAgICAgICAgICAgICAgcGFnZS5PZmZzZXQgLT0gUGFnZVNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChwYWdlLk9mZnNldCArIHBhZ2UuUm93c1swXS5JbmRleCAgPD0gLVBhZ2VTaXplIHx8IAotICAgICAgICAgICAgICAgICAgICAgcGFnZS5PZmZzZXQgPD0gLVBhZ2VTaXplIHx8Ci0gICAgICAgICAgICAgICAgICAgICBwYWdlLlJvd3NbMF0uSW5kZXggPD0gLVBhZ2VTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhZ2UuSW5kZXgtLTsKLSAgICAgICAgICAgICAgICBwYWdlLk9mZnNldCArPSBQYWdlU2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vZWxzZSBpZiAocGFnZS5Sb3dzWzBdLkluZGV4ID49IFBhZ2VTaXplKSAvL0RlbGV0ZQotICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAvLyAgICBwYWdlLkluZGV4Kys7Ci0gICAgICAgICAgICAvLyAgICBBZGRQYWdlUm93T2Zmc2V0KHBhZ2UsIC1QYWdlU2l6ZSk7Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgICAgIC8vZWxzZSBpZiAocGFnZS5Sb3dzWzBdLkluZGV4IDw9IC1QYWdlU2l6ZSkgICAvL0RlbGV0ZQotICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAvLyAgICBwYWdlLkluZGV4LS07Ci0gICAgICAgICAgICAvLyAgICBBZGRQYWdlUm93T2Zmc2V0KHBhZ2UsIFBhZ2VTaXplKTsKLSAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgcmV0dXJuIHBhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgQWRkUGFnZVJvd09mZnNldChQYWdlSW5kZXggcGFnZSwgc2hvcnQgb2Zmc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCByID0gMDsgciA8IHBhZ2UuUm93Q291bnQ7IHIrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYWdlLlJvd3Nbcl0uSW5kZXggKz0gb2Zmc2V0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBBZGRQYWdlKENvbHVtbkluZGV4IGNvbHVtbiwgaW50IHBvcywgc2hvcnQgaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZFBhZ2UoY29sdW1uLCBwb3MpOwotICAgICAgICAgICAgY29sdW1uLl9wYWdlc1twb3NdID0gbmV3IFBhZ2VJbmRleCgpIHsgSW5kZXggPSBpbmRleCB9OwotICAgICAgICAgICAgaWYgKHBvcyA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHBwPWNvbHVtbi5fcGFnZXNbcG9zLTFdOwotICAgICAgICAgICAgICAgIGlmKHBwLlJvd0NvdW50PjAgJiYgcHAuUm93c1twcC5Sb3dDb3VudC0xXS5JbmRleCA+IFBhZ2VTaXplKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29sdW1uLl9wYWdlc1twb3NdLk9mZnNldCA9IHBwLlJvd3NbcHAuUm93Q291bnQtMV0uSW5kZXgtUGFnZVNpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZCBhIG5ldyBwYWdlIHRvIHRoZSBjb2xsZWN0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1uIj5UaGUgY29sdW1uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3MiPlBvc2l0aW9uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYWdlIj5UaGUgbmV3IHBhZ2Ugb2JqZWN0IHRvIGFkZDwvcGFyYW0+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBBZGRQYWdlKENvbHVtbkluZGV4IGNvbHVtbiwgaW50IHBvcywgUGFnZUluZGV4IHBhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZFBhZ2UoY29sdW1uLCBwb3MpOwotICAgICAgICAgICAgY29sdW1uLl9wYWdlc1twb3NdID0gcGFnZSA7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkIGEgbmV3IHBhZ2UgdG8gdGhlIGNvbGxlY3Rpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPlRoZSBjb2x1bW48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InBvcyI+UG9zaXRpb248L3BhcmFtPgotICAgICAgICBwcml2YXRlIHZvaWQgQWRkUGFnZShDb2x1bW5JbmRleCBjb2x1bW4sIGludCBwb3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb2x1bW4uUGFnZUNvdW50ID09Y29sdW1uLl9wYWdlcy5MZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHBhZ2VUbXAgPSBuZXcgUGFnZUluZGV4W2NvbHVtbi5fcGFnZXMuTGVuZ3RoICogMl07Ci0gICAgICAgICAgICAgICAgQXJyYXkuQ29weShjb2x1bW4uX3BhZ2VzLCAwLCBwYWdlVG1wLCAwLCBjb2x1bW4uUGFnZUNvdW50KTsKLSAgICAgICAgICAgICAgICBjb2x1bW4uX3BhZ2VzID0gcGFnZVRtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwb3MgPCBjb2x1bW4uUGFnZUNvdW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoY29sdW1uLl9wYWdlcywgcG9zLCBjb2x1bW4uX3BhZ2VzLCBwb3MgKyAxLCBjb2x1bW4uUGFnZUNvdW50IC0gcG9zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbHVtbi5QYWdlQ291bnQrKzsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgQWRkQ29sdW1uKGludCBwb3MsIGludCBDb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChDb2x1bW5Db3VudCA9PSBfY29sdW1uSW5kZXguTGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBjb2xUbXAgPSBuZXcgQ29sdW1uSW5kZXhbX2NvbHVtbkluZGV4Lkxlbmd0aCoyXTsKLSAgICAgICAgICAgICAgICBBcnJheS5Db3B5KF9jb2x1bW5JbmRleCwgMCwgY29sVG1wLCAwLCBDb2x1bW5Db3VudCk7Ci0gICAgICAgICAgICAgICAgX2NvbHVtbkluZGV4ID0gY29sVG1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBvcyA8IENvbHVtbkNvdW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoX2NvbHVtbkluZGV4LCBwb3MsIF9jb2x1bW5JbmRleCwgcG9zICsgMSwgQ29sdW1uQ291bnQgLSBwb3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2NvbHVtbkluZGV4W3Bvc10gPSBuZXcgQ29sdW1uSW5kZXgoKSB7IEluZGV4ID0gKHNob3J0KShDb2x1bW4pIH07Ci0gICAgICAgICAgICBDb2x1bW5Db3VudCsrOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgaW50IF9jb2xQb3MgPSAtMSwgX3JvdzsKLSAgICAgICAgcHVibGljIHVsb25nIEN1cnJlbnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgodWxvbmcpX3JvdyA8PCAzMikgfCAodWludCkoX2NvbHVtbkluZGV4W19jb2xQb3NdLkluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vb2JqZWN0IElFbnVtZXJhdG9yLkN1cnJlbnQKKyAgICAgIGlmIChNYXRoLkFicyhjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLk9mZnNldCkgPiBfcGFnZVNpemUKKyAgICAgICAgICB8fCBNYXRoLkFicyhjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdLlJvd3NbY29sdW1uLl9wYWdlc1twYWdlUG9zXS5Sb3dDb3VudCAtIDFdLkluZGV4KQorICAgICAgICAgICAgICA+IF9wYWdlU2l6ZU1heCkgLy9TcGxpdCBvciBNZXJnZT8/PworICAgICAgeworICAgICAgICByb3dzID0gUmVzZXRQYWdlT2Zmc2V0KGNvbHVtbiwgcGFnZVBvcywgcm93cyk7CisgICAgICAgIC8vLy9NZXJnZVBhZ2VzCisgICAgICAgIC8vaWYgKGNvbHVtbi5QYWdlc1twYWdlUG9zIC0gMV0uSW5kZXggKyAxID09IGNvbHVtbi5QYWdlc1twYWdlUG9zXS5JbmRleCkKICAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIGdldCAKKyAgICAgICAgLy8gICAgaWYgKGNvbHVtbi5QYWdlc1twYWdlUG9zXS5JbmRleE9mZnNldCArIGNvbHVtbi5QYWdlc1twYWdlUG9zXS5Sb3dzW2NvbHVtbi5QYWdlc1twYWdlUG9zXS5Sb3dDb3VudCAtIDFdLkluZGV4ICsgcm93cyAtCisgICAgICAgIC8vICAgICAgICBjb2x1bW4uUGFnZXNbcGFnZVBvcyAtIDFdLkluZGV4T2Zmc2V0ICsgY29sdW1uLlBhZ2VzW3BhZ2VQb3MgLSAxXS5Sb3dzWzBdLkluZGV4IDw9IFBhZ2VTaXplKQogICAgICAgICAvLyAgICB7Ci0gICAgICAgIC8vICAgICAgICByZXR1cm4gR2V0VmFsdWUoX3JvdysxLCBfY29sdW1uSW5kZXhbX2NvbFBvc10uSW5kZXgpOworICAgICAgICAvLyAgICAgICAgLy9NZXJnZQorICAgICAgICAvLyAgICAgICAgTWVyZ2VQYWdlKGNvbHVtbiwgcGFnZVBvcyAtIDEsIC1yb3dzKTsKKyAgICAgICAgLy8gICAgfQorICAgICAgICAvLyAgICBlbHNlCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIC8vU3BsaXQKICAgICAgICAgLy8gICAgfQogICAgICAgICAvL30KLSAgICAgICAgcHVibGljIGJvb2wgTW92ZU5leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gR2V0TmV4dENlbGwocmVmIF9yb3csIHJlZiBfY29sUG9zLCAwLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGJvb2wgTmV4dENlbGwocmVmIGludCByb3csIHJlZiBpbnQgY29sKQotICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBOZXh0Q2VsbChyZWYgcm93LCByZWYgY29sLCAwLDAsIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgYm9vbCBOZXh0Q2VsbChyZWYgaW50IHJvdywgcmVmIGludCBjb2wsIGludCBtaW5Sb3csIGludCBtaW5Db2xQb3MsaW50IG1heFJvdywgaW50IG1heENvbFBvcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG1pbkNvbFBvcyA+PSBDb2x1bW5Db3VudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWF4Q29sUG9zID49IENvbHVtbkNvdW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1heENvbFBvcyA9IENvbHVtbkNvdW50LTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgYz1HZXRQb3NpdGlvbihjb2wpOwotICAgICAgICAgICAgaWYoYz49MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYyA+IG1heENvbFBvcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2wgPD0gbWluQ29sUG9zKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29sID0gbWluQ29sUG9zOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmV4dENlbGwocmVmIHJvdywgcmVmIGNvbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciByPUdldE5leHRDZWxsKHJlZiByb3csIHJlZiBjLCBtaW5Db2xQb3MsIG1heFJvdywgbWF4Q29sUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgY29sID0gX2NvbHVtbkluZGV4W2NdLkluZGV4OwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYz1+YzsKLSAgICAgICAgICAgICAgICBpZiAoYyA+IF9jb2x1bW5JbmRleFtjXS5JbmRleCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2wgPD0gbWluQ29sUG9zKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29sID0gbWluQ29sUG9zOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gTmV4dENlbGwocmVmIHJvdywgcmVmIGNvbCwgbWluUm93LCBtaW5Db2xQb3MsIG1heFJvdywgbWF4Q29sUG9zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB2YXIgcj1HZXROZXh0Q2VsbChyZWYgYywgcmVmIHJvdywgbWluQ29sUG9zLCBtYXhSb3csIG1heENvbFBvcyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbCA9IF9jb2x1bW5JbmRleFtjXS5JbmRleDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGJvb2wgR2V0TmV4dENlbGwocmVmIGludCByb3csIHJlZiBpbnQgY29sUG9zLCBpbnQgc3RhcnRDb2xQb3MsIGludCBlbmRSb3csIGludCBlbmRDb2xQb3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChDb2x1bW5Db3VudCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKytjb2xQb3MgPCBDb2x1bW5Db3VudCAmJiBjb2xQb3MgPD1lbmRDb2xQb3MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgciA9IF9jb2x1bW5JbmRleFtjb2xQb3NdLkdldE5leHRSb3cocm93KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gcm93KSAvL0V4aXN0cyBuZXh0IFJvdwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5Sb3csIG1pbkNvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID4gcm93KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblJvdyA9IHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluQ29sID0gY29sUG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblJvdyA9IGludC5NYXhWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Db2wgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAvL3Jvd3MgLT0gUGFnZVNpemU7CisgICAgICAgIC8vZm9yIChpbnQgcCA9IHBhZ2VQb3M7IHAgPCBjb2x1bW4uUGFnZUNvdW50OyBwKyspCisgICAgICAgIC8veworICAgICAgICAvLyAgICBjb2x1bW4uUGFnZXNbcF0uSW5kZXggLT0gMTsKKyAgICAgICAgLy99CisgICAgICB9CisgICAgfQorICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gY29sUG9zICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjIDwgQ29sdW1uQ291bnQgJiYgYyA8PSBlbmRDb2xQb3MpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IF9jb2x1bW5JbmRleFtjXS5HZXROZXh0Um93KHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gcm93KSAvL0V4aXN0cyBuZXh0IFJvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sUG9zID0gYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID4gcm93ICYmIHIgPCBtaW5Sb3cpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Sb3cgPSByOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Db2wgPSBjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID0gc3RhcnRDb2xQb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93IDwgZW5kUm93KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjIDwgY29sUG9zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IF9jb2x1bW5JbmRleFtjXS5HZXROZXh0Um93KHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID09IHJvdykgLy9FeGlzdHMgbmV4dCBSb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sUG9zID0gYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID4gcm93ICYmIChyIDwgbWluUm93IHx8IChyPT1taW5Sb3cgJiYgYzxtaW5Db2wpKSAmJiByIDw9IGVuZFJvdykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUm93ID0gcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkNvbCA9IGM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pblJvdyA9PSBpbnQuTWF4VmFsdWUgfHwgbWluUm93ID4gZW5kUm93KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBtaW5Sb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sUG9zID0gbWluQ29sOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2xQb3MgPD0gc3RhcnRDb2xQb3MgfHwgcm93Pj1lbmRSb3cpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb2xQb3MgPSBzdGFydENvbFBvcyAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIHJvdysrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0TmV4dENlbGwocmVmIHJvdywgcmVmIGNvbFBvcywgc3RhcnRDb2xQb3MsIGVuZFJvdywgZW5kQ29sUG9zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgIHByaXZhdGUgaW50IFJlc2V0UGFnZU9mZnNldChDb2x1bW5JbmRleCBjb2x1bW4sIGludCBwYWdlUG9zLCBpbnQgcm93cykgeworICAgIFBhZ2VJbmRleCBmcm9tUGFnZSA9IGNvbHVtbi5fcGFnZXNbcGFnZVBvc107CisgICAgUGFnZUluZGV4IHRvUGFnZTsKKyAgICBzaG9ydCBwYWdlQWRkID0gMDsKKyAgICBpZiAoZnJvbVBhZ2UuT2Zmc2V0IDwgLV9wYWdlU2l6ZSkgeworICAgICAgdG9QYWdlID0gY29sdW1uLl9wYWdlc1twYWdlUG9zIC0gMV07CisgICAgICBwYWdlQWRkID0gLTE7CisgICAgICBpZiAoZnJvbVBhZ2UuSW5kZXggLSAxID09IHRvUGFnZS5JbmRleCkgeworICAgICAgICBpZiAoZnJvbVBhZ2UuSW5kZXhPZmZzZXQKKyAgICAgICAgICAgICAgICArIGZyb21QYWdlLlJvd3NbZnJvbVBhZ2UuUm93Q291bnQgLSAxXS5JbmRleAorICAgICAgICAgICAgICAgIC0gdG9QYWdlLkluZGV4T2Zmc2V0CisgICAgICAgICAgICAgICAgKyB0b1BhZ2UuUm93c1swXS5JbmRleAorICAgICAgICAgICAgPD0gX3BhZ2VTaXplTWF4KSB7CisgICAgICAgICAgTWVyZ2VQYWdlKGNvbHVtbiwgcGFnZVBvcyAtIDEpOworICAgICAgICAgIC8vdmFyIG5ld1BhZ2UgPSBuZXcgUGFnZUluZGV4KHRvUGFnZSwgMCwgR2V0U2l6ZShmcm9tUGFnZS5Sb3dDb3VudCArIHRvUGFnZS5Sb3dDb3VudCkpOworICAgICAgICAgIC8vbmV3UGFnZS5Sb3dDb3VudCA9IGZyb21QYWdlLlJvd0NvdW50ICsgZnJvbVBhZ2UuUm93Q291bnQ7CisgICAgICAgICAgLy9BcnJheS5Db3B5KHRvUGFnZS5Sb3dzLCAwLCBuZXdQYWdlLlJvd3MsIDAsIHRvUGFnZS5Sb3dDb3VudCk7CisgICAgICAgICAgLy9BcnJheS5Db3B5KGZyb21QYWdlLlJvd3MsIDAsIG5ld1BhZ2UuUm93cywgdG9QYWdlLlJvd0NvdW50LCBmcm9tUGFnZS5Sb3dDb3VudCk7CisgICAgICAgICAgLy9mb3IgKGludCByID0gdG9QYWdlLlJvd0NvdW50OyByIDwgbmV3UGFnZS5Sb3dDb3VudDsgcisrKQorICAgICAgICAgIC8veworICAgICAgICAgIC8vICAgIG5ld1BhZ2UuUm93c1tyXS5JbmRleCArPSAoc2hvcnQpKGZyb21QYWdlLkluZGV4T2Zmc2V0IC0gdG9QYWdlLkluZGV4T2Zmc2V0KTsKKyAgICAgICAgICAvL30KICAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBib29sIEdldE5leHRDZWxsKHJlZiBpbnQgcm93LCByZWYgaW50IGNvbFBvcywgaW50IHN0YXJ0Q29sUG9zLCBpbnQgZW5kUm93LCBpbnQgZW5kQ29sUG9zLCByZWYgaW50W10gcGFnZVBvcywgcmVmIGludFtdIGNlbGxQb3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb2xQb3MgPT0gZW5kQ29sUG9zKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbFBvcyA9IHN0YXJ0Q29sUG9zOwotICAgICAgICAgICAgICAgIHJvdysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbFBvcysrOwotICAgICAgICAgICAgfQorICAgICAgfSBlbHNlIC8vTm8gcGFnZSBhZnRlcgorICAgICAgeworICAgICAgICBmcm9tUGFnZS5JbmRleCAtPSBwYWdlQWRkOworICAgICAgICBmcm9tUGFnZS5PZmZzZXQgKz0gX3BhZ2VTaXplOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZnJvbVBhZ2UuT2Zmc2V0ID4gX3BhZ2VTaXplKSB7CisgICAgICB0b1BhZ2UgPSBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3MgKyAxXTsKKyAgICAgIHBhZ2VBZGQgPSAxOworICAgICAgaWYgKGZyb21QYWdlLkluZGV4ICsgMSA9PSB0b1BhZ2UuSW5kZXgpIHt9IGVsc2UgeworICAgICAgICBmcm9tUGFnZS5JbmRleCArPSBwYWdlQWRkOworICAgICAgICBmcm9tUGFnZS5PZmZzZXQgKz0gX3BhZ2VTaXplOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcm93czsKKyAgfQogCi0gICAgICAgICAgICBpZiAocGFnZVBvc1tjb2xQb3NdIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihwYWdlUG9zW2NvbFBvc109PS0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGFnZVBvc1tjb2xQb3NdID0gX2NvbHVtbkluZGV4W2NvbFBvc10uR2V0UG9zaXRpb24ocm93KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChfY29sdW1uSW5kZXhbY29sUG9zXS5fcGFnZXNbcGFnZVBvc1tjb2xQb3NdXS5Sb3dDb3VudCA8PSByb3cpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9jb2x1bW5JbmRleFtjb2xQb3NdLlBhZ2VDb3VudCA+IHBhZ2VQb3NbY29sUG9zXSkKLSAgICAgICAgICAgICAgICAgICAgcGFnZVBvc1tjb2xQb3NdKys7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGFnZVBvc1tjb2xQb3NdPS0yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFyIHIgPSBfY29sdW1uSW5kZXhbY29sUG9zXS5fcGFnZXNbcGFnZVBvc1tjb2xQb3NdXS5JbmRleE9mZnNldCArIF9jb2x1bW5JbmRleFtjb2xQb3NdLl9wYWdlc1twYWdlUG9zW2NvbFBvc11dLlJvd3NbY2VsbFBvc1tjb2xQb3NdXS5JbmRleDsKLSAgICAgICAgICAgIGlmIChyID09IHJvdykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByb3cgPSByOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQorICBwcml2YXRlIGludCBEZWxldGVQYWdlKGludCBmcm9tUm93LCBpbnQgcm93cywgQ29sdW1uSW5kZXggY29sdW1uLCBpbnQgcGFnZVBvcywgYm9vbCBzaGlmdCkgeworICAgIFBhZ2VJbmRleCBwYWdlID0gY29sdW1uLl9wYWdlc1twYWdlUG9zXTsKKyAgICB2YXIgc3RhcnRSb3dzID0gcm93czsKKyAgICB3aGlsZSAocGFnZSAhPSBudWxsCisgICAgICAgICAgICAmJiBwYWdlLk1pbkluZGV4ID49IGZyb21Sb3cKKyAgICAgICAgICAgICYmICgoc2hpZnQgJiYgcGFnZS5NYXhJbmRleCA8IGZyb21Sb3cgKyByb3dzKQorICAgICAgICAgICAgICAgICAgICB8fCAoIXNoaWZ0ICYmIHBhZ2UuTWF4SW5kZXggPCBmcm9tUm93ICsgc3RhcnRSb3dzKSkpIHsKKyAgICAgIC8vRGVsZXRlIGVudGlyZSBwYWdlLgorICAgICAgdmFyIGRlbFNpemUgPSBwYWdlLk1heEluZGV4IC0gcGFnZS5NaW5JbmRleCArIDE7CisgICAgICByb3dzIC09IGRlbFNpemU7CisgICAgICB2YXIgcHJldk9mZnNldCA9IHBhZ2UuT2Zmc2V0OworICAgICAgQXJyYXkuQ29weSgKKyAgICAgICAgICBjb2x1bW4uX3BhZ2VzLAorICAgICAgICAgIHBhZ2VQb3MgKyAxLAorICAgICAgICAgIGNvbHVtbi5fcGFnZXMsCisgICAgICAgICAgcGFnZVBvcywKKyAgICAgICAgICBjb2x1bW4uUGFnZUNvdW50IC0gcGFnZVBvcyArIDEpOworICAgICAgY29sdW1uLlBhZ2VDb3VudC0tOworICAgICAgaWYgKGNvbHVtbi5QYWdlQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGlmIChzaGlmdCkgeworICAgICAgICBmb3IgKGludCBpID0gcGFnZVBvczsgaSA8IGNvbHVtbi5QYWdlQ291bnQ7IGkrKykgeworICAgICAgICAgIGNvbHVtbi5fcGFnZXNbaV0uT2Zmc2V0IC09IGRlbFNpemU7CisgICAgICAgICAgaWYgKGNvbHVtbi5fcGFnZXNbaV0uT2Zmc2V0IDw9IC1fcGFnZVNpemUpIHsKKyAgICAgICAgICAgIGNvbHVtbi5fcGFnZXNbaV0uSW5kZXgtLTsKKyAgICAgICAgICAgIGNvbHVtbi5fcGFnZXNbaV0uT2Zmc2V0ICs9IF9wYWdlU2l6ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChjb2x1bW4uUGFnZUNvdW50ID4gcGFnZVBvcykgeworICAgICAgICBwYWdlID0gY29sdW1uLl9wYWdlc1twYWdlUG9zXTsKKyAgICAgICAgLy9wYWdlLk9mZnNldCA9IHBhZ2VQb3MgPT0gMCA/IDEgOiBwcmV2T2Zmc2V0OyAgLy9GaXJzdCBwYWdlIGNhbiBvbmx5IHJlZmVyZW5jZSB0byByb3dzIHN0YXJ0aW5nIGZyb20gSW5kZXggPT0gMQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy9ObyBtb3JlIHBhZ2VzLCByZXR1cm4gMAorICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJvd3M7CisgIH0KKworICAvLy8KKyAgcHJpdmF0ZSBpbnQgRGVsZXRlQ2VsbHMoUGFnZUluZGV4IHBhZ2UsIGludCBmcm9tUm93LCBpbnQgdG9Sb3csIGJvb2wgc2hpZnQpIHsKKyAgICB2YXIgZnJvbVBvcyA9IHBhZ2UuR2V0UG9zaXRpb24oZnJvbVJvdyAtIChwYWdlLkluZGV4T2Zmc2V0KSk7CisgICAgaWYgKGZyb21Qb3MgPCAwKSB7CisgICAgICBmcm9tUG9zID0gfmZyb21Qb3M7CisgICAgfQorICAgIHZhciBtYXhSb3cgPSBwYWdlLk1heEluZGV4OworICAgIHZhciBvZmZzZXQgPSB0b1JvdyAtIHBhZ2UuSW5kZXhPZmZzZXQ7CisgICAgaWYgKG9mZnNldCA+IF9wYWdlU2l6ZU1heCkgeworICAgICAgb2Zmc2V0ID0gX3BhZ2VTaXplTWF4OworICAgIH0KKyAgICB2YXIgdG9Qb3MgPSBwYWdlLkdldFBvc2l0aW9uKG9mZnNldCk7CisgICAgaWYgKHRvUG9zIDwgMCkgeworICAgICAgdG9Qb3MgPSB+dG9Qb3M7CisgICAgfQorCisgICAgaWYgKGZyb21Qb3MgPD0gdG9Qb3MgJiYgZnJvbVBvcyA8IHBhZ2UuUm93Q291bnQgJiYgcGFnZS5HZXRJbmRleChmcm9tUG9zKSA8IHRvUm93KSB7CisgICAgICBpZiAodG9Sb3cgPiBwYWdlLk1heEluZGV4KSB7CisgICAgICAgIGlmIChmcm9tUm93CisgICAgICAgICAgICA9PSBwYWdlLk1pbkluZGV4KSAvL0RlbGV0ZSBlbnRpcmUgcGFnZSwgbGF0ZSBpbiB0aGUgcGFnZSBkZWxldGUgbWV0aG9kCisgICAgICAgIHsKKyAgICAgICAgICByZXR1cm4gZnJvbVJvdzsKKyAgICAgICAgfQorICAgICAgICB2YXIgciA9IHBhZ2UuTWF4SW5kZXg7CisgICAgICAgIHZhciBkZWxldGVkUm93ID0gcGFnZS5Sb3dDb3VudCAtIGZyb21Qb3M7CisgICAgICAgIHBhZ2UuUm93Q291bnQgLT0gZGVsZXRlZFJvdzsKKyAgICAgICAgcmV0dXJuIHIgKyAxOworICAgICAgfQorICAgICAgdmFyIHJvd3MgPSB0b1JvdyAtIGZyb21Sb3c7CisgICAgICBpZiAoc2hpZnQpIHsKKyAgICAgICAgVXBkYXRlUm93SW5kZXgocGFnZSwgdG9Qb3MsIHJvd3MpOworICAgICAgfQorICAgICAgQXJyYXkuQ29weShwYWdlLlJvd3MsIHRvUG9zLCBwYWdlLlJvd3MsIGZyb21Qb3MsIHBhZ2UuUm93Q291bnQgLSB0b1Bvcyk7CisgICAgICBwYWdlLlJvd0NvdW50IC09IHRvUG9zIC0gZnJvbVBvczsKKworICAgICAgcmV0dXJuIHRvUm93OworICAgIH0KKyAgICBpZiAoc2hpZnQpIHsKKyAgICAgIFVwZGF0ZVJvd0luZGV4KHBhZ2UsIHRvUG9zLCB0b1JvdyAtIGZyb21Sb3cpOworICAgIH0KKyAgICByZXR1cm4gdG9Sb3cgPCBtYXhSb3cgPyB0b1JvdyA6IG1heFJvdzsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgVXBkYXRlUm93SW5kZXgoUGFnZUluZGV4IHBhZ2UsIGludCB0b1BvcywgaW50IHJvd3MpIHsKKyAgICBmb3IgKGludCByID0gdG9Qb3M7IHIgPCBwYWdlLlJvd0NvdW50OyByKyspIHsKKyAgICAgIHBhZ2UuUm93c1tyXS5JbmRleCAtPSAoc2hvcnQpcm93czsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgRGVsZXRlQ29sdW1ucyhpbnQgZnJvbUNvbCwgaW50IGNvbHVtbnMsIGJvb2wgc2hpZnQpIHsKKyAgICB2YXIgZlBvcyA9IEdldFBvc2l0aW9uKGZyb21Db2wpOworICAgIGlmIChmUG9zIDwgMCkgeworICAgICAgZlBvcyA9IH5mUG9zOworICAgIH0KKyAgICBpbnQgdFBvcyA9IGZQb3M7CisgICAgZm9yICh2YXIgYyA9IGZQb3M7IGMgPD0gQ29sdW1uQ291bnQ7IGMrKykgeworICAgICAgdFBvcyA9IGM7CisgICAgICBpZiAodFBvcyA9PSBDb2x1bW5Db3VudCB8fCBfY29sdW1uSW5kZXhbY10uSW5kZXggPj0gZnJvbUNvbCArIGNvbHVtbnMpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKENvbHVtbkNvdW50IDw9IGZQb3MpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoX2NvbHVtbkluZGV4W2ZQb3NdLkluZGV4ID49IGZyb21Db2wgJiYgX2NvbHVtbkluZGV4W2ZQb3NdLkluZGV4IDw9IGZyb21Db2wgKyBjb2x1bW5zKSB7CisgICAgICAvL2lmIChfY29sdW1uSW5kZXhbZlBvc10uSW5kZXggPCBDb2x1bW5Db3VudCkKKyAgICAgIC8veworICAgICAgaWYgKHRQb3MgPCBDb2x1bW5Db3VudCkgeworICAgICAgICBBcnJheS5Db3B5KF9jb2x1bW5JbmRleCwgdFBvcywgX2NvbHVtbkluZGV4LCBmUG9zLCBDb2x1bW5Db3VudCAtIHRQb3MpOworICAgICAgfQorICAgICAgQ29sdW1uQ291bnQgLT0gKHRQb3MgLSBmUG9zKTsKKyAgICAgIC8vfQorICAgIH0KKyAgICBpZiAoc2hpZnQpIHsKKyAgICAgIGZvciAodmFyIGMgPSBmUG9zOyBjIDwgQ29sdW1uQ291bnQ7IGMrKykgeworICAgICAgICBfY29sdW1uSW5kZXhbY10uSW5kZXggLT0gKHNob3J0KWNvbHVtbnM7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIFVwZGF0ZUluZGV4T2Zmc2V0KENvbHVtbkluZGV4IGNvbHVtbiwgaW50IHBhZ2VQb3MsIGludCByb3dQb3MsIGludCByb3csIGludCByb3dzKSB7CisgICAgaWYgKHBhZ2VQb3MgPj0gY29sdW1uLlBhZ2VDb3VudCkgeworICAgICAgcmV0dXJuOyAvL0EgcGFnZSBhZnRlciBsYXN0IGNlbGwuCisgICAgfQorICAgIHZhciBwYWdlID0gY29sdW1uLl9wYWdlc1twYWdlUG9zXTsKKyAgICBpZiAocm93cyA+IF9wYWdlU2l6ZSkgeworICAgICAgc2hvcnQgYWRkUGFnZXMgPSAoc2hvcnQpKHJvd3MgPj4gX3BhZ2VCaXRzKTsKKyAgICAgIGludCBvZmZzZXQgPSArKHJvd3MgLSAoX3BhZ2VTaXplICogYWRkUGFnZXMpKTsKKyAgICAgIGZvciAoaW50IHAgPSBwYWdlUG9zICsgMTsgcCA8IGNvbHVtbi5QYWdlQ291bnQ7IHArKykgeworICAgICAgICBpZiAoY29sdW1uLl9wYWdlc1twXS5PZmZzZXQgKyBvZmZzZXQgPiBfcGFnZVNpemUpIHsKKyAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3BdLkluZGV4ICs9IChzaG9ydCkoYWRkUGFnZXMgKyAxKTsKKyAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3BdLk9mZnNldCArPSBvZmZzZXQgLSBfcGFnZVNpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29sdW1uLl9wYWdlc1twXS5JbmRleCArPSBhZGRQYWdlczsKKyAgICAgICAgICBjb2x1bW4uX3BhZ2VzW3BdLk9mZnNldCArPSBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgdmFyIHNpemUgPSBwYWdlLlJvd0NvdW50IC0gcm93UG9zOworICAgICAgaWYgKHBhZ2UuUm93Q291bnQgPiByb3dQb3MpIHsKKyAgICAgICAgaWYgKGNvbHVtbi5QYWdlQ291bnQgLSAxCisgICAgICAgICAgICA9PSBwYWdlUG9zKSAvL05vIHBhZ2UgYWZ0ZXIsIGNyZWF0ZSBhIG5ldyBvbmUuCisgICAgICAgIHsKKyAgICAgICAgICAvL0NvcHkgcm93cyB0byBuZXh0IHBhZ2UuCisgICAgICAgICAgdmFyIG5ld1BhZ2UgPSBDb3B5TmV3KHBhZ2UsIHJvd1Bvcywgc2l6ZSk7CisgICAgICAgICAgbmV3UGFnZS5JbmRleCA9IChzaG9ydCkoKHJvdyArIHJvd3MpID4+IF9wYWdlQml0cyk7CisgICAgICAgICAgbmV3UGFnZS5PZmZzZXQgPSByb3cgKyByb3dzIC0gKG5ld1BhZ2UuSW5kZXggKiBfcGFnZVNpemUpIC0gbmV3UGFnZS5Sb3dzWzBdLkluZGV4OworICAgICAgICAgIGlmIChuZXdQYWdlLk9mZnNldCA+IF9wYWdlU2l6ZSkgeworICAgICAgICAgICAgbmV3UGFnZS5JbmRleCsrOworICAgICAgICAgICAgbmV3UGFnZS5PZmZzZXQgLT0gX3BhZ2VTaXplOworICAgICAgICAgIH0KKyAgICAgICAgICBBZGRQYWdlKGNvbHVtbiwgcGFnZVBvcyArIDEsIG5ld1BhZ2UpOworICAgICAgICAgIHBhZ2UuUm93Q291bnQgPSByb3dQb3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGNvbHVtbi5fcGFnZXNbcGFnZVBvcyArIDFdLlJvd0NvdW50ICsgc2l6ZQorICAgICAgICAgICAgICA+IF9wYWdlU2l6ZU1heCkgLy9TcGxpdCBQYWdlCisgICAgICAgICAgeworICAgICAgICAgICAgU3BsaXRQYWdlSW5zZXJ0KGNvbHVtbiwgcGFnZVBvcywgcm93UG9zLCByb3dzLCBzaXplLCBhZGRQYWdlcyk7CisgICAgICAgICAgfSBlbHNlIC8vQ29weSBQYWdlLgorICAgICAgICAgIHsKKyAgICAgICAgICAgIENvcHlNZXJnZVBhZ2UocGFnZSwgcm93UG9zLCByb3dzLCBzaXplLCBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3MgKyAxXSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vQWRkIHRvIFBhZ2VzLgorICAgICAgZm9yIChpbnQgciA9IHJvd1BvczsgciA8IHBhZ2UuUm93Q291bnQ7IHIrKykgeworICAgICAgICBwYWdlLlJvd3Nbcl0uSW5kZXggKz0gKHNob3J0KXJvd3M7CisgICAgICB9CisgICAgICBpZiAocGFnZS5PZmZzZXQgKyBwYWdlLlJvd3NbcGFnZS5Sb3dDb3VudCAtIDFdLkluZGV4CisgICAgICAgICAgPj0gX3BhZ2VTaXplTWF4KSAvL0NhbiBub3QgYmUgbGFyZ2VyIHRoYW4gdGhlIG1heCBzaXplIG9mIHRoZSBwYWdlLgorICAgICAgeworICAgICAgICBBZGp1c3RJbmRleChjb2x1bW4sIHBhZ2VQb3MpOworICAgICAgICBpZiAocGFnZS5PZmZzZXQgKyBwYWdlLlJvd3NbcGFnZS5Sb3dDb3VudCAtIDFdLkluZGV4ID49IF9wYWdlU2l6ZU1heCkgeworICAgICAgICAgIHBhZ2VQb3MgPSBTcGxpdFBhZ2UoY29sdW1uLCBwYWdlUG9zKTsKKyAgICAgICAgfQorICAgICAgICAvL0luZGV4SXRlbVtdIG5ld1Jvd3MgPSBuZXcgSW5kZXhJdGVtW0dldFNpemUocGFnZS5Sb3dDb3VudCAtIHBhZ2UuUm93c1tyXS5JbmRleCldOworICAgICAgICAvL3ZhciBuZXdQYWdlID0gbmV3IFBhZ2VJbmRleChuZXdSb3dzLCByKTsKKyAgICAgICAgLy9uZXdQYWdlLkluZGV4ID0gKHNob3J0KShwYWdlUG9zICsgMSk7CisgICAgICAgIC8vVE9ETzogTW92ZVJvd3MgdG8gbmV4dCBwYWdlLgorICAgICAgfQorCisgICAgICBmb3IgKGludCBwID0gcGFnZVBvcyArIDE7IHAgPCBjb2x1bW4uUGFnZUNvdW50OyBwKyspIHsKKyAgICAgICAgaWYgKGNvbHVtbi5fcGFnZXNbcF0uT2Zmc2V0ICsgcm93cyA8IF9wYWdlU2l6ZSkgeworICAgICAgICAgIGNvbHVtbi5fcGFnZXNbcF0uT2Zmc2V0ICs9IHJvd3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29sdW1uLl9wYWdlc1twXS5JbmRleCsrOworICAgICAgICAgIGNvbHVtbi5fcGFnZXNbcF0uT2Zmc2V0ID0gKGNvbHVtbi5fcGFnZXNbcF0uT2Zmc2V0ICsgcm93cykgJSBfcGFnZVNpemU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgU3BsaXRQYWdlSW5zZXJ0KAorICAgICAgQ29sdW1uSW5kZXggY29sdW1uLAorICAgICAgaW50IHBhZ2VQb3MsCisgICAgICBpbnQgcm93UG9zLAorICAgICAgaW50IHJvd3MsCisgICAgICBpbnQgc2l6ZSwKKyAgICAgIGludCBhZGRQYWdlcykgeworICAgIHZhciBuZXdSb3dzID0gbmV3IEluZGV4SXRlbVtHZXRTaXplKHNpemUpXTsKKyAgICB2YXIgcGFnZSA9IGNvbHVtbi5fcGFnZXNbcGFnZVBvc107CisKKyAgICB2YXIgclN0YXJ0ID0gLTE7CisgICAgZm9yIChpbnQgciA9IHJvd1BvczsgciA8IHBhZ2UuUm93Q291bnQ7IHIrKykgeworICAgICAgaWYgKHBhZ2UuSW5kZXhFeHBhbmRlZCAtIChwYWdlLlJvd3Nbcl0uSW5kZXggKyByb3dzKSA+IF9wYWdlU2l6ZSkgeworICAgICAgICByU3RhcnQgPSByOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHBhZ2UuUm93c1tyXS5JbmRleCArPSAoc2hvcnQpcm93czsKKyAgICB9CisgICAgdmFyIHJjID0gcGFnZS5Sb3dDb3VudCAtIHJTdGFydDsKKyAgICBwYWdlLlJvd0NvdW50ID0gclN0YXJ0OworICAgIGlmIChyYyA+IDApIHsKKyAgICAgIC8vQ29weSB0byBhIG5ldyBwYWdlCisgICAgICB2YXIgcm93ID0gcGFnZS5JbmRleE9mZnNldDsKKyAgICAgIHZhciBuZXdQYWdlID0gQ29weU5ldyhwYWdlLCByU3RhcnQsIHJjKTsKKyAgICAgIHZhciBpeCA9IChzaG9ydCkocGFnZS5JbmRleCArIGFkZFBhZ2VzKTsKKyAgICAgIHZhciBvZmZzZXQgPSBwYWdlLkluZGV4T2Zmc2V0ICsgcm93cyAtIChpeCAqIF9wYWdlU2l6ZSk7CisgICAgICBpZiAob2Zmc2V0ID4gX3BhZ2VTaXplKSB7CisgICAgICAgIGl4ICs9IChzaG9ydCkob2Zmc2V0IC8gX3BhZ2VTaXplKTsKKyAgICAgICAgb2Zmc2V0ICU9IF9wYWdlU2l6ZTsKKyAgICAgIH0KKyAgICAgIG5ld1BhZ2UuSW5kZXggPSBpeDsKKyAgICAgIG5ld1BhZ2UuT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgQWRkUGFnZShjb2x1bW4sIHBhZ2VQb3MgKyAxLCBuZXdQYWdlKTsKKyAgICB9CisKKyAgICAvL0NvcHkgZnJvbSBuZXh0IFJvdworICB9CisKKyAgcHJpdmF0ZSB2b2lkIENvcHlNZXJnZVBhZ2UoUGFnZUluZGV4IHBhZ2UsIGludCByb3dQb3MsIGludCByb3dzLCBpbnQgc2l6ZSwgUGFnZUluZGV4IHRvUGFnZSkgeworICAgIHZhciBzdGFydFJvdyA9IHBhZ2UuSW5kZXhPZmZzZXQgKyBwYWdlLlJvd3Nbcm93UG9zXS5JbmRleCArIHJvd3M7CisgICAgdmFyIG5ld1Jvd3MgPSBuZXcgSW5kZXhJdGVtW0dldFNpemUodG9QYWdlLlJvd0NvdW50ICsgc2l6ZSldOworICAgIHBhZ2UuUm93Q291bnQgLT0gc2l6ZTsKKyAgICBBcnJheS5Db3B5KHBhZ2UuUm93cywgcm93UG9zLCBuZXdSb3dzLCAwLCBzaXplKTsKKyAgICBmb3IgKGludCByID0gMDsgciA8IHNpemU7IHIrKykgeworICAgICAgbmV3Um93c1tyXS5JbmRleCArPSAoc2hvcnQpKHBhZ2UuSW5kZXhPZmZzZXQgKyByb3dzIC0gdG9QYWdlLkluZGV4T2Zmc2V0KTsKKyAgICB9CisKKyAgICBBcnJheS5Db3B5KHRvUGFnZS5Sb3dzLCAwLCBuZXdSb3dzLCBzaXplLCB0b1BhZ2UuUm93Q291bnQpOworICAgIHRvUGFnZS5Sb3dzID0gbmV3Um93czsKKyAgICB0b1BhZ2UuUm93Q291bnQgKz0gc2l6ZTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBNZXJnZVBhZ2UoQ29sdW1uSW5kZXggY29sdW1uLCBpbnQgcGFnZVBvcykgeworICAgIFBhZ2VJbmRleCBwYWdlMSA9IGNvbHVtbi5fcGFnZXNbcGFnZVBvc107CisgICAgUGFnZUluZGV4IHBhZ2UyID0gY29sdW1uLl9wYWdlc1twYWdlUG9zICsgMV07CisKKyAgICB2YXIgbmV3UGFnZSA9IG5ldyBQYWdlSW5kZXgocGFnZTEsIDAsIHBhZ2UxLlJvd0NvdW50ICsgcGFnZTIuUm93Q291bnQpOworICAgIG5ld1BhZ2UuUm93Q291bnQgPSBwYWdlMS5Sb3dDb3VudCArIHBhZ2UyLlJvd0NvdW50OworICAgIEFycmF5LkNvcHkocGFnZTEuUm93cywgMCwgbmV3UGFnZS5Sb3dzLCAwLCBwYWdlMS5Sb3dDb3VudCk7CisgICAgQXJyYXkuQ29weShwYWdlMi5Sb3dzLCAwLCBuZXdQYWdlLlJvd3MsIHBhZ2UxLlJvd0NvdW50LCBwYWdlMi5Sb3dDb3VudCk7CisgICAgZm9yIChpbnQgciA9IHBhZ2UxLlJvd0NvdW50OyByIDwgbmV3UGFnZS5Sb3dDb3VudDsgcisrKSB7CisgICAgICBuZXdQYWdlLlJvd3Nbcl0uSW5kZXggKz0gKHNob3J0KShwYWdlMi5JbmRleE9mZnNldCAtIHBhZ2UxLkluZGV4T2Zmc2V0KTsKKyAgICB9CisKKyAgICBjb2x1bW4uX3BhZ2VzW3BhZ2VQb3NdID0gbmV3UGFnZTsKKyAgICBjb2x1bW4uUGFnZUNvdW50LS07CisKKyAgICBpZiAoY29sdW1uLlBhZ2VDb3VudCA+IChwYWdlUG9zICsgMSkpIHsKKyAgICAgIEFycmF5LkNvcHkoCisgICAgICAgICAgY29sdW1uLl9wYWdlcywKKyAgICAgICAgICBwYWdlUG9zICsgMiwKKyAgICAgICAgICBjb2x1bW4uX3BhZ2VzLAorICAgICAgICAgIHBhZ2VQb3MgKyAxLAorICAgICAgICAgIGNvbHVtbi5QYWdlQ291bnQgLSAocGFnZVBvcyArIDEpKTsKKyAgICAgIGZvciAoaW50IHAgPSBwYWdlUG9zICsgMTsgcCA8IGNvbHVtbi5QYWdlQ291bnQ7IHArKykgeworICAgICAgICBjb2x1bW4uX3BhZ2VzW3BdLkluZGV4LS07CisgICAgICAgIGNvbHVtbi5fcGFnZXNbcF0uT2Zmc2V0ICs9IF9wYWdlU2l6ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIFBhZ2VJbmRleCBDb3B5TmV3KFBhZ2VJbmRleCBwYWdlRnJvbSwgaW50IHJvd1BvcywgaW50IHNpemUpIHsKKyAgICBJbmRleEl0ZW1bXSBuZXdSb3dzID0gbmV3IEluZGV4SXRlbVtHZXRTaXplKHNpemUpXTsKKyAgICBBcnJheS5Db3B5KHBhZ2VGcm9tLlJvd3MsIHJvd1BvcywgbmV3Um93cywgMCwgc2l6ZSk7CisgICAgcmV0dXJuIG5ldyhuZXdSb3dzLCBzaXplKTsKKyAgfQorCisgIGludGVybmFsIHN0YXRpYyBpbnQgR2V0U2l6ZShpbnQgc2l6ZSkgeworICAgIHZhciBuZXdTaXplID0gMjU2OworICAgIHdoaWxlIChuZXdTaXplIDwgc2l6ZSkgeworICAgICAgbmV3U2l6ZSA8PD0gMTsKKyAgICB9CisgICAgcmV0dXJuIG5ld1NpemU7CisgIH0KKworICBwcml2YXRlIHZvaWQgQWRkQ2VsbChDb2x1bW5JbmRleCBjb2x1bW5JbmRleCwgaW50IHBhZ2VQb3MsIGludCBwb3MsIHNob3J0IGl4LCBUIHZhbHVlKSB7CisgICAgUGFnZUluZGV4IHBhZ2VJdGVtID0gY29sdW1uSW5kZXguX3BhZ2VzW3BhZ2VQb3NdOworICAgIGlmIChwYWdlSXRlbS5Sb3dDb3VudCA9PSBwYWdlSXRlbS5Sb3dzLkxlbmd0aCkgeworICAgICAgaWYgKHBhZ2VJdGVtLlJvd0NvdW50CisgICAgICAgICAgPT0gX3BhZ2VTaXplTWF4KSAvL01heCBzaXplLS0+U3BsaXQKKyAgICAgIHsKKyAgICAgICAgcGFnZVBvcyA9IFNwbGl0UGFnZShjb2x1bW5JbmRleCwgcGFnZVBvcyk7CisgICAgICAgIGlmIChjb2x1bW5JbmRleC5fcGFnZXNbcGFnZVBvcyAtIDFdLlJvd0NvdW50ID4gcG9zKSB7CisgICAgICAgICAgcGFnZVBvcy0tOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBvcyAtPSBjb2x1bW5JbmRleC5fcGFnZXNbcGFnZVBvcyAtIDFdLlJvd0NvdW50OworICAgICAgICB9CisgICAgICAgIHBhZ2VJdGVtID0gY29sdW1uSW5kZXguX3BhZ2VzW3BhZ2VQb3NdOworICAgICAgfSBlbHNlIC8vRXhwYW5kIHRvIGRvdWJsZSBzaXplLgorICAgICAgeworICAgICAgICB2YXIgcm93c1RtcCA9IG5ldyBJbmRleEl0ZW1bcGFnZUl0ZW0uUm93cy5MZW5ndGggPDwgMV07CisgICAgICAgIEFycmF5LkNvcHkocGFnZUl0ZW0uUm93cywgMCwgcm93c1RtcCwgMCwgcGFnZUl0ZW0uUm93Q291bnQpOworICAgICAgICBwYWdlSXRlbS5Sb3dzID0gcm93c1RtcDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHBvcyA8IHBhZ2VJdGVtLlJvd0NvdW50KSB7CisgICAgICBBcnJheS5Db3B5KHBhZ2VJdGVtLlJvd3MsIHBvcywgcGFnZUl0ZW0uUm93cywgcG9zICsgMSwgcGFnZUl0ZW0uUm93Q291bnQgLSBwb3MpOworICAgIH0KKyAgICBwYWdlSXRlbS5Sb3dzW3Bvc10gPSBuZXcoKSB7CisgICAgICBJbmRleCA9IGl4LAorICAgICAgSW5kZXhQb2ludGVyID0gX3ZhbHVlcy5Db3VudCwKKyAgICB9OworICAgIF92YWx1ZXMuQWRkKHZhbHVlKTsKKyAgICBwYWdlSXRlbS5Sb3dDb3VudCsrOworICB9CisKKyAgcHJpdmF0ZSBpbnQgU3BsaXRQYWdlKENvbHVtbkluZGV4IGNvbHVtbkluZGV4LCBpbnQgcGFnZVBvcykgeworICAgIHZhciBwYWdlID0gY29sdW1uSW5kZXguX3BhZ2VzW3BhZ2VQb3NdOworICAgIGlmIChwYWdlLk9mZnNldCAhPSAwKSB7CisgICAgICB2YXIgb2Zmc2V0ID0gcGFnZS5PZmZzZXQ7CisgICAgICBwYWdlLk9mZnNldCA9IDA7CisgICAgICBmb3IgKGludCByID0gMDsgciA8IHBhZ2UuUm93Q291bnQ7IHIrKykgeworICAgICAgICBwYWdlLlJvd3Nbcl0uSW5kZXggLT0gKHNob3J0KW9mZnNldDsKKyAgICAgIH0KKyAgICB9CisgICAgLy9GaW5kIFNwbGl0IHBvcworICAgIGludCBzcGxpdFBvcyA9IDA7CisgICAgZm9yIChpbnQgciA9IDA7IHIgPCBwYWdlLlJvd0NvdW50OyByKyspIHsKKyAgICAgIGlmIChwYWdlLlJvd3Nbcl0uSW5kZXggPiBfcGFnZVNpemUpIHsKKyAgICAgICAgc3BsaXRQb3MgPSByOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgdmFyIG5ld1BhZ2UgPSBuZXcgUGFnZUluZGV4KHBhZ2UsIDAsIHNwbGl0UG9zKTsKKyAgICB2YXIgbmV4dFBhZ2UgPSBuZXcgUGFnZUluZGV4KAorICAgICAgICBwYWdlLAorICAgICAgICBzcGxpdFBvcywKKyAgICAgICAgcGFnZS5Sb3dDb3VudCAtIHNwbGl0UG9zLAorICAgICAgICAoc2hvcnQpKHBhZ2UuSW5kZXggKyAxKSwKKyAgICAgICAgcGFnZS5PZmZzZXQpOworCisgICAgZm9yIChpbnQgciA9IDA7IHIgPCBuZXh0UGFnZS5Sb3dDb3VudDsgcisrKSB7CisgICAgICBuZXh0UGFnZS5Sb3dzW3JdLkluZGV4ID0gKHNob3J0KShuZXh0UGFnZS5Sb3dzW3JdLkluZGV4IC0gX3BhZ2VTaXplKTsKKyAgICB9CisKKyAgICBjb2x1bW5JbmRleC5fcGFnZXNbcGFnZVBvc10gPSBuZXdQYWdlOworICAgIGlmIChjb2x1bW5JbmRleC5QYWdlQ291bnQgKyAxID4gY29sdW1uSW5kZXguX3BhZ2VzLkxlbmd0aCkgeworICAgICAgdmFyIHBhZ2VUbXAgPSBuZXcgUGFnZUluZGV4W2NvbHVtbkluZGV4Ll9wYWdlcy5MZW5ndGggPDwgMV07CisgICAgICBBcnJheS5Db3B5KGNvbHVtbkluZGV4Ll9wYWdlcywgMCwgcGFnZVRtcCwgMCwgY29sdW1uSW5kZXguUGFnZUNvdW50KTsKKyAgICAgIGNvbHVtbkluZGV4Ll9wYWdlcyA9IHBhZ2VUbXA7CisgICAgfQorICAgIEFycmF5LkNvcHkoCisgICAgICAgIGNvbHVtbkluZGV4Ll9wYWdlcywKKyAgICAgICAgcGFnZVBvcyArIDEsCisgICAgICAgIGNvbHVtbkluZGV4Ll9wYWdlcywKKyAgICAgICAgcGFnZVBvcyArIDIsCisgICAgICAgIGNvbHVtbkluZGV4LlBhZ2VDb3VudCAtIHBhZ2VQb3MgLSAxKTsKKyAgICBjb2x1bW5JbmRleC5fcGFnZXNbcGFnZVBvcyArIDFdID0gbmV4dFBhZ2U7CisgICAgcGFnZSA9IG5leHRQYWdlOworICAgIC8vcG9zIC09IFBhZ2VTaXplOworICAgIGNvbHVtbkluZGV4LlBhZ2VDb3VudCsrOworICAgIHJldHVybiBwYWdlUG9zICsgMTsKKyAgfQorCisgIHByaXZhdGUgUGFnZUluZGV4IEFkanVzdEluZGV4KENvbHVtbkluZGV4IGNvbHVtbkluZGV4LCBpbnQgcGFnZVBvcykgeworICAgIFBhZ2VJbmRleCBwYWdlID0gY29sdW1uSW5kZXguX3BhZ2VzW3BhZ2VQb3NdOworICAgIC8vRmlyc3QgQWRqdXN0IGluZGV4ZXMKKyAgICBpZiAocGFnZS5PZmZzZXQgKyBwYWdlLlJvd3NbMF0uSW5kZXggPj0gX3BhZ2VTaXplCisgICAgICAgIHx8IHBhZ2UuT2Zmc2V0ID49IF9wYWdlU2l6ZQorICAgICAgICB8fCBwYWdlLlJvd3NbMF0uSW5kZXggPj0gX3BhZ2VTaXplKSB7CisgICAgICBwYWdlLkluZGV4Kys7CisgICAgICBwYWdlLk9mZnNldCAtPSBfcGFnZVNpemU7CisgICAgfSBlbHNlIGlmIChwYWdlLk9mZnNldCArIHBhZ2UuUm93c1swXS5JbmRleCA8PSAtX3BhZ2VTaXplCisgICAgICAgIHx8IHBhZ2UuT2Zmc2V0IDw9IC1fcGFnZVNpemUKKyAgICAgICAgfHwgcGFnZS5Sb3dzWzBdLkluZGV4IDw9IC1fcGFnZVNpemUpIHsKKyAgICAgIHBhZ2UuSW5kZXgtLTsKKyAgICAgIHBhZ2UuT2Zmc2V0ICs9IF9wYWdlU2l6ZTsKKyAgICB9CisgICAgLy9lbHNlIGlmIChwYWdlLlJvd3NbMF0uSW5kZXggPj0gUGFnZVNpemUpIC8vRGVsZXRlCisgICAgLy97CisgICAgLy8gICAgcGFnZS5JbmRleCsrOworICAgIC8vICAgIEFkZFBhZ2VSb3dPZmZzZXQocGFnZSwgLVBhZ2VTaXplKTsKKyAgICAvL30KKyAgICAvL2Vsc2UgaWYgKHBhZ2UuUm93c1swXS5JbmRleCA8PSAtUGFnZVNpemUpICAgLy9EZWxldGUKKyAgICAvL3sKKyAgICAvLyAgICBwYWdlLkluZGV4LS07CisgICAgLy8gICAgQWRkUGFnZVJvd09mZnNldChwYWdlLCBQYWdlU2l6ZSk7CisgICAgLy99CisgICAgcmV0dXJuIHBhZ2U7CisgIH0KKworICBwcml2YXRlIHZvaWQgQWRkUGFnZVJvd09mZnNldChQYWdlSW5kZXggcGFnZSwgc2hvcnQgb2Zmc2V0KSB7CisgICAgZm9yIChpbnQgciA9IDA7IHIgPCBwYWdlLlJvd0NvdW50OyByKyspIHsKKyAgICAgIHBhZ2UuUm93c1tyXS5JbmRleCArPSBvZmZzZXQ7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIEFkZFBhZ2UoQ29sdW1uSW5kZXggY29sdW1uLCBpbnQgcG9zLCBzaG9ydCBpbmRleCkgeworICAgIEFkZFBhZ2UoY29sdW1uLCBwb3MpOworICAgIGNvbHVtbi5fcGFnZXNbcG9zXSA9IG5ldygpIHsKKyAgICAgIEluZGV4ID0gaW5kZXgsCisgICAgfTsKKyAgICBpZiAocG9zID4gMCkgeworICAgICAgdmFyIHBwID0gY29sdW1uLl9wYWdlc1twb3MgLSAxXTsKKyAgICAgIGlmIChwcC5Sb3dDb3VudCA+IDAgJiYgcHAuUm93c1twcC5Sb3dDb3VudCAtIDFdLkluZGV4ID4gX3BhZ2VTaXplKSB7CisgICAgICAgIGNvbHVtbi5fcGFnZXNbcG9zXS5PZmZzZXQgPSBwcC5Sb3dzW3BwLlJvd0NvdW50IC0gMV0uSW5kZXggLSBfcGFnZVNpemU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIGEgbmV3IHBhZ2UgdG8gdGhlIGNvbGxlY3Rpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPlRoZSBjb2x1bW48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InBvcyI+UG9zaXRpb248L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InBhZ2UiPlRoZSBuZXcgcGFnZSBvYmplY3QgdG8gYWRkPC9wYXJhbT4KKyAgcHJpdmF0ZSB2b2lkIEFkZFBhZ2UoQ29sdW1uSW5kZXggY29sdW1uLCBpbnQgcG9zLCBQYWdlSW5kZXggcGFnZSkgeworICAgIEFkZFBhZ2UoY29sdW1uLCBwb3MpOworICAgIGNvbHVtbi5fcGFnZXNbcG9zXSA9IHBhZ2U7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgYSBuZXcgcGFnZSB0byB0aGUgY29sbGVjdGlvbgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+VGhlIGNvbHVtbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icG9zIj5Qb3NpdGlvbjwvcGFyYW0+CisgIHByaXZhdGUgdm9pZCBBZGRQYWdlKENvbHVtbkluZGV4IGNvbHVtbiwgaW50IHBvcykgeworICAgIGlmIChjb2x1bW4uUGFnZUNvdW50ID09IGNvbHVtbi5fcGFnZXMuTGVuZ3RoKSB7CisgICAgICB2YXIgcGFnZVRtcCA9IG5ldyBQYWdlSW5kZXhbY29sdW1uLl9wYWdlcy5MZW5ndGggKiAyXTsKKyAgICAgIEFycmF5LkNvcHkoY29sdW1uLl9wYWdlcywgMCwgcGFnZVRtcCwgMCwgY29sdW1uLlBhZ2VDb3VudCk7CisgICAgICBjb2x1bW4uX3BhZ2VzID0gcGFnZVRtcDsKKyAgICB9CisgICAgaWYgKHBvcyA8IGNvbHVtbi5QYWdlQ291bnQpIHsKKyAgICAgIEFycmF5LkNvcHkoY29sdW1uLl9wYWdlcywgcG9zLCBjb2x1bW4uX3BhZ2VzLCBwb3MgKyAxLCBjb2x1bW4uUGFnZUNvdW50IC0gcG9zKTsKKyAgICB9CisgICAgY29sdW1uLlBhZ2VDb3VudCsrOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIEFkZENvbHVtbihpbnQgcG9zLCBpbnQgY29sdW1uKSB7CisgICAgaWYgKENvbHVtbkNvdW50ID09IF9jb2x1bW5JbmRleC5MZW5ndGgpIHsKKyAgICAgIHZhciBjb2xUbXAgPSBuZXcgQ29sdW1uSW5kZXhbX2NvbHVtbkluZGV4Lkxlbmd0aCAqIDJdOworICAgICAgQXJyYXkuQ29weShfY29sdW1uSW5kZXgsIDAsIGNvbFRtcCwgMCwgQ29sdW1uQ291bnQpOworICAgICAgX2NvbHVtbkluZGV4ID0gY29sVG1wOworICAgIH0KKyAgICBpZiAocG9zIDwgQ29sdW1uQ291bnQpIHsKKyAgICAgIEFycmF5LkNvcHkoX2NvbHVtbkluZGV4LCBwb3MsIF9jb2x1bW5JbmRleCwgcG9zICsgMSwgQ29sdW1uQ291bnQgLSBwb3MpOworICAgIH0KKyAgICBfY29sdW1uSW5kZXhbcG9zXSA9IG5ldygpIHsKKyAgICAgIEluZGV4ID0gKHNob3J0KShjb2x1bW4pLAorICAgIH07CisgICAgQ29sdW1uQ291bnQrKzsKKyAgfQorCisgIHByaXZhdGUgaW50IF9jb2xQb3MgPSAtMSwKKyAgICAgIF9yb3c7CisKKyAgcHVibGljIHVsb25nIEN1cnJlbnQgPT4gKCh1bG9uZylfcm93IDw8IDMyKSB8ICh1aW50KShfY29sdW1uSW5kZXhbX2NvbFBvc10uSW5kZXgpOworCisgIC8vb2JqZWN0IElFbnVtZXJhdG9yLkN1cnJlbnQKKyAgLy97CisgIC8vICAgIGdldAorICAvLyAgICB7CisgIC8vICAgICAgICByZXR1cm4gR2V0VmFsdWUoX3JvdysxLCBfY29sdW1uSW5kZXhbX2NvbFBvc10uSW5kZXgpOworICAvLyAgICB9CisgIC8vfQorICBwdWJsaWMgYm9vbCBNb3ZlTmV4dCgpIHsKKyAgICByZXR1cm4gR2V0TmV4dENlbGwocmVmIF9yb3csIHJlZiBfY29sUG9zLCAwLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOworICB9CisKKyAgaW50ZXJuYWwgYm9vbCBOZXh0Q2VsbChyZWYgaW50IHJvdywgcmVmIGludCBjb2wpIHsKKyAgICByZXR1cm4gTmV4dENlbGwocmVmIHJvdywgcmVmIGNvbCwgMCwgMCwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgfQorCisgIGludGVybmFsIGJvb2wgTmV4dENlbGwoCisgICAgICByZWYgaW50IHJvdywKKyAgICAgIHJlZiBpbnQgY29sLAorICAgICAgaW50IG1pblJvdywKKyAgICAgIGludCBtaW5Db2xQb3MsCisgICAgICBpbnQgbWF4Um93LAorICAgICAgaW50IG1heENvbFBvcykgeworICAgIGlmIChtaW5Db2xQb3MgPj0gQ29sdW1uQ291bnQpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1heENvbFBvcyA+PSBDb2x1bW5Db3VudCkgeworICAgICAgbWF4Q29sUG9zID0gQ29sdW1uQ291bnQgLSAxOworICAgIH0KKyAgICB2YXIgYyA9IEdldFBvc2l0aW9uKGNvbCk7CisgICAgaWYgKGMgPj0gMCkgeworICAgICAgaWYgKGMgPiBtYXhDb2xQb3MpIHsKKyAgICAgICAgaWYgKGNvbCA8PSBtaW5Db2xQb3MpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY29sID0gbWluQ29sUG9zOworICAgICAgICByZXR1cm4gTmV4dENlbGwocmVmIHJvdywgcmVmIGNvbCk7CisgICAgICB9CisgICAgICB2YXIgciA9IEdldE5leHRDZWxsKHJlZiByb3csIHJlZiBjLCBtaW5Db2xQb3MsIG1heFJvdywgbWF4Q29sUG9zKTsKKyAgICAgIGNvbCA9IF9jb2x1bW5JbmRleFtjXS5JbmRleDsKKyAgICAgIHJldHVybiByOworICAgIH0KKyAgICBjID0gfmM7CisgICAgaWYgKGMgPiBfY29sdW1uSW5kZXhbY10uSW5kZXgpIHsKKyAgICAgIGlmIChjb2wgPD0gbWluQ29sUG9zKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGNvbCA9IG1pbkNvbFBvczsKKyAgICAgIHJldHVybiBOZXh0Q2VsbChyZWYgcm93LCByZWYgY29sLCBtaW5Sb3csIG1pbkNvbFBvcywgbWF4Um93LCBtYXhDb2xQb3MpOworICAgIH0KKyAgICB7CisgICAgICB2YXIgciA9IEdldE5leHRDZWxsKHJlZiBjLCByZWYgcm93LCBtaW5Db2xQb3MsIG1heFJvdywgbWF4Q29sUG9zKTsKKyAgICAgIGNvbCA9IF9jb2x1bW5JbmRleFtjXS5JbmRleDsKKyAgICAgIHJldHVybiByOworICAgIH0KKyAgfQorCisgIGludGVybmFsIGJvb2wgR2V0TmV4dENlbGwoCisgICAgICByZWYgaW50IHJvdywKKyAgICAgIHJlZiBpbnQgY29sUG9zLAorICAgICAgaW50IHN0YXJ0Q29sUG9zLAorICAgICAgaW50IGVuZFJvdywKKyAgICAgIGludCBlbmRDb2xQb3MpIHsKKyAgICBpZiAoQ29sdW1uQ291bnQgPT0gMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoKytjb2xQb3MgPCBDb2x1bW5Db3VudCAmJiBjb2xQb3MgPD0gZW5kQ29sUG9zKSB7CisgICAgICB2YXIgciA9IF9jb2x1bW5JbmRleFtjb2xQb3NdLkdldE5leHRSb3cocm93KTsKKyAgICAgIGlmIChyCisgICAgICAgICAgPT0gcm93KSAvL0V4aXN0cyBuZXh0IFJvdworICAgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGludCBtaW5Sb3csCisgICAgICAgICAgbWluQ29sOworICAgICAgaWYgKHIgPiByb3cpIHsKKyAgICAgICAgbWluUm93ID0gcjsKKyAgICAgICAgbWluQ29sID0gY29sUG9zOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbWluUm93ID0gaW50Lk1heFZhbHVlOworICAgICAgICBtaW5Db2wgPSAwOworICAgICAgfQorCisgICAgICB2YXIgYyA9IGNvbFBvcyArIDE7CisgICAgICB3aGlsZSAoYyA8IENvbHVtbkNvdW50ICYmIGMgPD0gZW5kQ29sUG9zKSB7CisgICAgICAgIHIgPSBfY29sdW1uSW5kZXhbY10uR2V0TmV4dFJvdyhyb3cpOworICAgICAgICBpZiAocgorICAgICAgICAgICAgPT0gcm93KSAvL0V4aXN0cyBuZXh0IFJvdworICAgICAgICB7CisgICAgICAgICAgY29sUG9zID0gYzsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAociA+IHJvdyAmJiByIDwgbWluUm93KSB7CisgICAgICAgICAgbWluUm93ID0gcjsKKyAgICAgICAgICBtaW5Db2wgPSBjOworICAgICAgICB9CisgICAgICAgIGMrKzsKKyAgICAgIH0KKyAgICAgIGMgPSBzdGFydENvbFBvczsKKyAgICAgIGlmIChyb3cgPCBlbmRSb3cpIHsKKyAgICAgICAgcm93Kys7CisgICAgICAgIHdoaWxlIChjIDwgY29sUG9zKSB7CisgICAgICAgICAgciA9IF9jb2x1bW5JbmRleFtjXS5HZXROZXh0Um93KHJvdyk7CisgICAgICAgICAgaWYgKHIKKyAgICAgICAgICAgICAgPT0gcm93KSAvL0V4aXN0cyBuZXh0IFJvdworICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbFBvcyA9IGM7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHIgPiByb3cgJiYgKHIgPCBtaW5Sb3cgfHwgKHIgPT0gbWluUm93ICYmIGMgPCBtaW5Db2wpKSAmJiByIDw9IGVuZFJvdykgeworICAgICAgICAgICAgbWluUm93ID0gcjsKKyAgICAgICAgICAgIG1pbkNvbCA9IGM7CisgICAgICAgICAgfQorICAgICAgICAgIGMrKzsKICAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBib29sIFByZXZDZWxsKHJlZiBpbnQgcm93LCByZWYgaW50IGNvbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFByZXZDZWxsKHJlZiByb3csIHJlZiBjb2wsIDAsIDAsIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgYm9vbCBQcmV2Q2VsbChyZWYgaW50IHJvdywgcmVmIGludCBjb2wsIGludCBtaW5Sb3csIGludCBtaW5Db2xQb3MsIGludCBtYXhSb3csIGludCBtYXhDb2xQb3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtaW5Db2xQb3MgPj0gQ29sdW1uQ291bnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1heENvbFBvcyA+PSBDb2x1bW5Db3VudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXhDb2xQb3MgPSBDb2x1bW5Db3VudCAtIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgYyA9IEdldFBvc2l0aW9uKGNvbCk7Ci0gICAgICAgICAgICBpZihjPj0wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29sID49IG1heENvbFBvcykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyb3cgPT0gbWluUm93KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcm93LS07Ci0gICAgICAgICAgICAgICAgICAgIGNvbCA9IG1heENvbFBvczsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJldkNlbGwocmVmIHJvdywgcmVmIGNvbCwgbWluUm93LCBtaW5Db2xQb3MsIG1heFJvdywgbWF4Q29sUG9zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHJldD1HZXRQcmV2Q2VsbChyZWYgcm93LCByZWYgYywgbWluUm93LCBtaW5Db2xQb3MsIG1heENvbFBvcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IF9jb2x1bW5JbmRleFtjXS5JbmRleDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjPX5jOwotICAgICAgICAgICAgICAgIGlmIChjID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29sID49IG1heENvbFBvcyB8fCByb3c8PTApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb2wgPSBtYXhDb2xQb3M7Ci0gICAgICAgICAgICAgICAgICAgIHJvdy0tOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJldkNlbGwocmVmIHJvdywgcmVmIGNvbCwgbWluUm93LCBtaW5Db2xQb3MsIG1heFJvdywgbWF4Q29sUG9zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHJldCA9IEdldFByZXZDZWxsKHJlZiByb3csIHJlZiBjLCBtaW5Sb3csIG1pbkNvbFBvcywgbWF4Q29sUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gX2NvbHVtbkluZGV4W2NdLkluZGV4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGJvb2wgR2V0UHJldkNlbGwocmVmIGludCByb3csIHJlZiBpbnQgY29sUG9zLCBpbnQgc3RhcnRSb3csIGludCBzdGFydENvbFBvcywgaW50IGVuZENvbFBvcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKENvbHVtbkNvdW50ID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgtLWNvbFBvcyA+PSBzdGFydENvbFBvcykKLS8vICAgICAgICAgICAgICAgIGlmICgrK2NvbFBvcyA8IENvbHVtbkNvdW50ICYmIGNvbFBvcyA8PSBlbmRDb2xQb3MpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgciA9IF9jb2x1bW5JbmRleFtjb2xQb3NdLkdldE5leHRSb3cocm93KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHIgPT0gcm93KSAvL0V4aXN0cyBuZXh0IFJvdwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5Sb3csIG1pbkNvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID4gcm93ICYmIHIgPj0gc3RhcnRSb3cpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUm93ID0gcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5Db2wgPSBjb2xQb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUm93ID0gaW50Lk1heFZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkNvbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjID0gY29sUG9zIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID49IHN0YXJ0Q29sUG9zKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjID49IHN0YXJ0Q29sUG9zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IF9jb2x1bW5JbmRleFtjXS5HZXROZXh0Um93KHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID09IHJvdykgLy9FeGlzdHMgbmV4dCBSb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sUG9zID0gYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID4gcm93ICYmIHIgPCBtaW5Sb3cgJiYgciA+PSBzdGFydFJvdykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUm93ID0gcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkNvbCA9IGM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3cgPiBzdGFydFJvdykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gZW5kQ29sUG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdy0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjID4gY29sUG9zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IF9jb2x1bW5JbmRleFtjXS5HZXROZXh0Um93KHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID09IHJvdykgLy9FeGlzdHMgbmV4dCBSb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sUG9zID0gYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID4gcm93ICYmIHIgPCBtaW5Sb3cgJiYgciA+PSBzdGFydFJvdykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluUm93ID0gcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkNvbCA9IGM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW5Sb3cgPT0gaW50Lk1heFZhbHVlIHx8IHN0YXJ0Um93IDwgbWluUm93KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPSBtaW5Sb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sUG9zID0gbWluQ29sOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbFBvcyA9IENvbHVtbkNvdW50OwotICAgICAgICAgICAgICAgICAgICByb3ctLTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvdyA8IHN0YXJ0Um93KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZXNldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdldFByZXZDZWxsKHJlZiBjb2xQb3MsIHJlZiByb3csIHN0YXJ0Um93LCBzdGFydENvbFBvcywgZW5kQ29sUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb2xQb3MgPSAtMTsgICAgICAgICAgICAKLSAgICAgICAgICAgIF9yb3c9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3B1YmxpYyBJRW51bWVyYXRvcjx1bG9uZz4gR2V0RW51bWVyYXRvcigpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICB0aGlzLlJlc2V0KCk7Ci0gICAgICAgIC8vICAgIHJldHVybiB0aGlzOwotICAgICAgICAvL30KLQotICAgICAgICAvL0lFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgdGhpcy5SZXNldCgpOwotICAgICAgICAvLyAgICByZXR1cm4gdGhpczsKLSAgICAgICAgLy99Ci0KKyAgICAgIGlmIChtaW5Sb3cgPT0gaW50Lk1heFZhbHVlIHx8IG1pblJvdyA+IGVuZFJvdykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByb3cgPSBtaW5Sb3c7CisgICAgICBjb2xQb3MgPSBtaW5Db2w7CisgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0gICAgaW50ZXJuYWwgY2xhc3MgQ2VsbHNTdG9yZUVudW1lcmF0b3I8VD4gOiBJRW51bWVyYWJsZTxUPiwgSUVudW1lcmF0b3I8VD4KKyAgICBpZiAoY29sUG9zIDw9IHN0YXJ0Q29sUG9zIHx8IHJvdyA+PSBlbmRSb3cpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29sUG9zID0gc3RhcnRDb2xQb3MgLSAxOworICAgIHJvdysrOworICAgIHJldHVybiBHZXROZXh0Q2VsbChyZWYgcm93LCByZWYgY29sUG9zLCBzdGFydENvbFBvcywgZW5kUm93LCBlbmRDb2xQb3MpOworICB9CisKKyAgaW50ZXJuYWwgYm9vbCBHZXROZXh0Q2VsbCgKKyAgICAgIHJlZiBpbnQgcm93LAorICAgICAgcmVmIGludCBjb2xQb3MsCisgICAgICBpbnQgc3RhcnRDb2xQb3MsCisgICAgICBpbnQgZW5kUm93LAorICAgICAgaW50IGVuZENvbFBvcywKKyAgICAgIHJlZiBpbnRbXSBwYWdlUG9zLAorICAgICAgcmVmIGludFtdIGNlbGxQb3MpIHsKKyAgICBpZiAoY29sUG9zID09IGVuZENvbFBvcykgeworICAgICAgY29sUG9zID0gc3RhcnRDb2xQb3M7CisgICAgICByb3crKzsKKyAgICB9IGVsc2UgeworICAgICAgY29sUG9zKys7CisgICAgfQorCisgICAgaWYgKHBhZ2VQb3NbY29sUG9zXSA8IDApIHsKKyAgICAgIGlmIChwYWdlUG9zW2NvbFBvc10gPT0gLTEpIHsKKyAgICAgICAgcGFnZVBvc1tjb2xQb3NdID0gX2NvbHVtbkluZGV4W2NvbFBvc10uR2V0UG9zaXRpb24ocm93KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKF9jb2x1bW5JbmRleFtjb2xQb3NdLl9wYWdlc1twYWdlUG9zW2NvbFBvc11dLlJvd0NvdW50IDw9IHJvdykgeworICAgICAgaWYgKF9jb2x1bW5JbmRleFtjb2xQb3NdLlBhZ2VDb3VudCA+IHBhZ2VQb3NbY29sUG9zXSkgeworICAgICAgICBwYWdlUG9zW2NvbFBvc10rKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhZ2VQb3NbY29sUG9zXSA9IC0yOworICAgICAgfQorICAgIH0KKworICAgIHZhciByID0KKyAgICAgICAgX2NvbHVtbkluZGV4W2NvbFBvc10uX3BhZ2VzW3BhZ2VQb3NbY29sUG9zXV0uSW5kZXhPZmZzZXQKKyAgICAgICAgICAgICsgX2NvbHVtbkluZGV4W2NvbFBvc10uX3BhZ2VzW3BhZ2VQb3NbY29sUG9zXV0uUm93c1tjZWxsUG9zW2NvbFBvc11dLkluZGV4OworICAgIGlmIChyID09IHJvdykgeworICAgICAgcm93ID0gcjsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpbnRlcm5hbCBib29sIFByZXZDZWxsKHJlZiBpbnQgcm93LCByZWYgaW50IGNvbCkgeworICAgIHJldHVybiBQcmV2Q2VsbChyZWYgcm93LCByZWYgY29sLCAwLCAwLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOworICB9CisKKyAgaW50ZXJuYWwgYm9vbCBQcmV2Q2VsbCgKKyAgICAgIHJlZiBpbnQgcm93LAorICAgICAgcmVmIGludCBjb2wsCisgICAgICBpbnQgbWluUm93LAorICAgICAgaW50IG1pbkNvbFBvcywKKyAgICAgIGludCBtYXhSb3csCisgICAgICBpbnQgbWF4Q29sUG9zKSB7CisgICAgaWYgKG1pbkNvbFBvcyA+PSBDb2x1bW5Db3VudCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobWF4Q29sUG9zID49IENvbHVtbkNvdW50KSB7CisgICAgICBtYXhDb2xQb3MgPSBDb2x1bW5Db3VudCAtIDE7CisgICAgfQorICAgIHZhciBjID0gR2V0UG9zaXRpb24oY29sKTsKKyAgICBpZiAoYyA+PSAwKSB7CisgICAgICBpZiAoYyA9PSAwKSB7CisgICAgICAgIGlmIChjb2wgPj0gbWF4Q29sUG9zKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChyb3cgPT0gbWluUm93KSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJvdy0tOworICAgICAgICBjb2wgPSBtYXhDb2xQb3M7CisgICAgICAgIHJldHVybiBQcmV2Q2VsbChyZWYgcm93LCByZWYgY29sLCBtaW5Sb3csIG1pbkNvbFBvcywgbWF4Um93LCBtYXhDb2xQb3MpOworICAgICAgfQorICAgICAgdmFyIHJldCA9IEdldFByZXZDZWxsKHJlZiByb3csIHJlZiBjLCBtaW5Sb3csIG1pbkNvbFBvcywgbWF4Q29sUG9zKTsKKyAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgY29sID0gX2NvbHVtbkluZGV4W2NdLkluZGV4OworICAgICAgfQorICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgYyA9IH5jOworICAgIGlmIChjID09IDApIHsKKyAgICAgIGlmIChjb2wgPj0gbWF4Q29sUG9zIHx8IHJvdyA8PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGNvbCA9IG1heENvbFBvczsKKyAgICAgIHJvdy0tOworICAgICAgcmV0dXJuIFByZXZDZWxsKHJlZiByb3csIHJlZiBjb2wsIG1pblJvdywgbWluQ29sUG9zLCBtYXhSb3csIG1heENvbFBvcyk7CisgICAgfQogICAgIHsKLSAgICAgICAgQ2VsbFN0b3JlPFQ+IF9jZWxsU3RvcmU7Ci0gICAgICAgIGludCByb3csIGNvbFBvczsKLSAgICAgICAgaW50W10gcGFnZVBvcywgY2VsbFBvczsKLSAgICAgICAgaW50IF9zdGFydFJvdywgX3N0YXJ0Q29sLCBfZW5kUm93LCBfZW5kQ29sOwotICAgICAgICBpbnQgbWluUm93LCBtaW5Db2xQb3MsIG1heFJvdywgbWF4Q29sUG9zOwotICAgICAgICBwdWJsaWMgQ2VsbHNTdG9yZUVudW1lcmF0b3IoQ2VsbFN0b3JlPFQ+IGNlbGxTdG9yZSkgOgotICAgICAgICAgICAgdGhpcyhjZWxsU3RvcmUsIDAsMCxFeGNlbFBhY2thZ2UuTWF4Um93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpICAgICAgICAKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBDZWxsc1N0b3JlRW51bWVyYXRvcihDZWxsU3RvcmU8VD4gY2VsbFN0b3JlLCBpbnQgU3RhcnRSb3csIGludCBTdGFydENvbCwgaW50IEVuZFJvdywgaW50IEVuZENvbCkKLSAgICAgICAgewotICAgICAgICAgICAgX2NlbGxTdG9yZSA9IGNlbGxTdG9yZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgX3N0YXJ0Um93PVN0YXJ0Um93OwotICAgICAgICAgICAgX3N0YXJ0Q29sPVN0YXJ0Q29sOwotICAgICAgICAgICAgX2VuZFJvdz1FbmRSb3c7Ci0gICAgICAgICAgICBfZW5kQ29sPUVuZENvbDsKLQotICAgICAgICAgICAgSW5pdCgpOwotCi0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCB2b2lkIEluaXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBtaW5Sb3cgPSBfc3RhcnRSb3c7Ci0gICAgICAgICAgICBtYXhSb3cgPSBfZW5kUm93OwotCi0gICAgICAgICAgICBtaW5Db2xQb3MgPSBfY2VsbFN0b3JlLkdldFBvc2l0aW9uKF9zdGFydENvbCk7Ci0gICAgICAgICAgICBpZiAobWluQ29sUG9zIDwgMCkgbWluQ29sUG9zID0gfm1pbkNvbFBvczsKLSAgICAgICAgICAgIG1heENvbFBvcyA9IF9jZWxsU3RvcmUuR2V0UG9zaXRpb24oX2VuZENvbCk7Ci0gICAgICAgICAgICBpZiAobWF4Q29sUG9zIDwgMCkgbWF4Q29sUG9zID0gfm1heENvbFBvcy0xOwotICAgICAgICAgICAgcm93ID0gbWluUm93OwotICAgICAgICAgICAgY29sUG9zID0gbWluQ29sUG9zIC0gMTsKLQotICAgICAgICAgICAgdmFyIGNvbHMgPSBtYXhDb2xQb3MgLSBtaW5Db2xQb3MgKyAxOwotICAgICAgICAgICAgcGFnZVBvcyA9IG5ldyBpbnRbY29sc107Ci0gICAgICAgICAgICBjZWxsUG9zID0gbmV3IGludFtjb2xzXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sczsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhZ2VQb3NbaV0gPSAtMTsKLSAgICAgICAgICAgICAgICBjZWxsUG9zW2ldID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgaW50IFJvdyAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJvdzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBpbnQgQ29sdW1uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjb2xQb3MgPT0gLTEpIE1vdmVOZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbFBvcyA9PSAtMSkgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9jZWxsU3RvcmUuX2NvbHVtbkluZGV4W2NvbFBvc10uSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgVCBWYWx1ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2NrIChfY2VsbFN0b3JlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jZWxsU3RvcmUuR2V0VmFsdWUocm93LCBDb2x1bW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvY2sgKF9jZWxsU3RvcmUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfY2VsbFN0b3JlLlNldFZhbHVlKHJvdywgQ29sdW1uLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGJvb2wgTmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vcmV0dXJuIF9jZWxsU3RvcmUuR2V0TmV4dENlbGwocmVmIHJvdywgcmVmIGNvbFBvcywgbWluQ29sUG9zLCBtYXhSb3csIG1heENvbFBvcyk7Ci0gICAgICAgICAgICByZXR1cm4gX2NlbGxTdG9yZS5HZXROZXh0Q2VsbChyZWYgcm93LCByZWYgY29sUG9zLCBtaW5Db2xQb3MsIG1heFJvdywgbWF4Q29sUG9zKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBib29sIFByZXZpb3VzKCkKLSAgICAgICAgewotICAgICAgICAgICAgbG9jayAoX2NlbGxTdG9yZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2NlbGxTdG9yZS5HZXRQcmV2Q2VsbChyZWYgcm93LCByZWYgY29sUG9zLCBtaW5Sb3csIG1pbkNvbFBvcywgbWF4Q29sUG9zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdHJpbmcgQ2VsbEFkZHJlc3MgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbEFkZHJlc3NCYXNlLkdldEFkZHJlc3MoUm93LCBDb2x1bW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElFbnVtZXJhdG9yPFQ+IEdldEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXNldCgpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgUmVzZXQoKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFQgQ3VycmVudAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkgeyB9Ci0KLSAgICAgICAgb2JqZWN0IElFbnVtZXJhdG9yLkN1cnJlbnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbCBNb3ZlTmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluaXQoKTsKLSAgICAgICAgfQorICAgICAgdmFyIHJldCA9IEdldFByZXZDZWxsKHJlZiByb3csIHJlZiBjLCBtaW5Sb3csIG1pbkNvbFBvcywgbWF4Q29sUG9zKTsKKyAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgY29sID0gX2NvbHVtbkluZGV4W2NdLkluZGV4OworICAgICAgfQorICAgICAgcmV0dXJuIHJldDsKICAgICB9Ci0gICAgaW50ZXJuYWwgY2xhc3MgRmxhZ0NlbGxTdG9yZSA6IENlbGxTdG9yZTxieXRlPgorICB9CisKKyAgaW50ZXJuYWwgYm9vbCBHZXRQcmV2Q2VsbCgKKyAgICAgIHJlZiBpbnQgcm93LAorICAgICAgcmVmIGludCBjb2xQb3MsCisgICAgICBpbnQgc3RhcnRSb3csCisgICAgICBpbnQgc3RhcnRDb2xQb3MsCisgICAgICBpbnQgZW5kQ29sUG9zKSB7CisgICAgaWYgKENvbHVtbkNvdW50ID09IDApIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKC0tY29sUG9zID49IHN0YXJ0Q29sUG9zKQorICAgIC8vICAgICAgICAgICAgICAgIGlmICgrK2NvbFBvcyA8IENvbHVtbkNvdW50ICYmIGNvbFBvcyA8PSBlbmRDb2xQb3MpCiAgICAgewotICAgICAgICBpbnRlcm5hbCB2b2lkIFNldEZsYWdWYWx1ZShpbnQgUm93LCBpbnQgQ29sLCBib29sIHZhbHVlLCBDZWxsRmxhZ3MgY2VsbEZsYWdzKQotICAgICAgICB7Ci0gICAgICAgICAgICBDZWxsRmxhZ3MgY3VycmVudFZhbHVlID0gKENlbGxGbGFncykgR2V0VmFsdWUoUm93LCBDb2wpOwotICAgICAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFZhbHVlKFJvdywgQ29sLCAoYnl0ZSkoY3VycmVudFZhbHVlIHwgY2VsbEZsYWdzKSk7IC8vIGFkZCB0aGUgQ2VsbEZsYWcgYml0Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0VmFsdWUoUm93LCBDb2wsIChieXRlKShjdXJyZW50VmFsdWUgJiB+Y2VsbEZsYWdzKSk7IC8vIHJlbW92ZSB0aGUgQ2VsbEZsYWcgYml0Ci0gICAgICAgICAgICB9CisgICAgICB2YXIgciA9IF9jb2x1bW5JbmRleFtjb2xQb3NdLkdldE5leHRSb3cocm93KTsKKyAgICAgIGlmIChyCisgICAgICAgICAgPT0gcm93KSAvL0V4aXN0cyBuZXh0IFJvdworICAgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGludCBtaW5Sb3csCisgICAgICAgICAgbWluQ29sOworICAgICAgaWYgKHIgPiByb3cgJiYgciA+PSBzdGFydFJvdykgeworICAgICAgICBtaW5Sb3cgPSByOworICAgICAgICBtaW5Db2wgPSBjb2xQb3M7CisgICAgICB9IGVsc2UgeworICAgICAgICBtaW5Sb3cgPSBpbnQuTWF4VmFsdWU7CisgICAgICAgIG1pbkNvbCA9IDA7CisgICAgICB9CisKKyAgICAgIHZhciBjID0gY29sUG9zIC0gMTsKKyAgICAgIGlmIChjID49IHN0YXJ0Q29sUG9zKSB7CisgICAgICAgIHdoaWxlIChjID49IHN0YXJ0Q29sUG9zKSB7CisgICAgICAgICAgciA9IF9jb2x1bW5JbmRleFtjXS5HZXROZXh0Um93KHJvdyk7CisgICAgICAgICAgaWYgKHIKKyAgICAgICAgICAgICAgPT0gcm93KSAvL0V4aXN0cyBuZXh0IFJvdworICAgICAgICAgIHsKKyAgICAgICAgICAgIGNvbFBvcyA9IGM7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHIgPiByb3cgJiYgciA8IG1pblJvdyAmJiByID49IHN0YXJ0Um93KSB7CisgICAgICAgICAgICBtaW5Sb3cgPSByOworICAgICAgICAgICAgbWluQ29sID0gYzsKKyAgICAgICAgICB9CisgICAgICAgICAgYy0tOwogICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGJvb2wgR2V0RmxhZ1ZhbHVlKGludCBSb3csIGludCBDb2wsIENlbGxGbGFncyBjZWxsRmxhZ3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAhKCgoYnl0ZSljZWxsRmxhZ3MgJiBHZXRWYWx1ZShSb3csIENvbCkpID09IDApOworICAgICAgfQorICAgICAgaWYgKHJvdyA+IHN0YXJ0Um93KSB7CisgICAgICAgIGMgPSBlbmRDb2xQb3M7CisgICAgICAgIHJvdy0tOworICAgICAgICB3aGlsZSAoYyA+IGNvbFBvcykgeworICAgICAgICAgIHIgPSBfY29sdW1uSW5kZXhbY10uR2V0TmV4dFJvdyhyb3cpOworICAgICAgICAgIGlmIChyCisgICAgICAgICAgICAgID09IHJvdykgLy9FeGlzdHMgbmV4dCBSb3cKKyAgICAgICAgICB7CisgICAgICAgICAgICBjb2xQb3MgPSBjOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChyID4gcm93ICYmIHIgPCBtaW5Sb3cgJiYgciA+PSBzdGFydFJvdykgeworICAgICAgICAgICAgbWluUm93ID0gcjsKKyAgICAgICAgICAgIG1pbkNvbCA9IGM7CisgICAgICAgICAgfQorICAgICAgICAgIGMtLTsKICAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKG1pblJvdyA9PSBpbnQuTWF4VmFsdWUgfHwgc3RhcnRSb3cgPCBtaW5Sb3cpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgcm93ID0gbWluUm93OworICAgICAgY29sUG9zID0gbWluQ29sOworICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorICAgIGNvbFBvcyA9IENvbHVtbkNvdW50OworICAgIHJvdy0tOworICAgIGlmIChyb3cgPCBzdGFydFJvdykgeworICAgICAgUmVzZXQoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEdldFByZXZDZWxsKHJlZiBjb2xQb3MsIHJlZiByb3csIHN0YXJ0Um93LCBzdGFydENvbFBvcywgZW5kQ29sUG9zKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlc2V0KCkgeworICAgIF9jb2xQb3MgPSAtMTsKKyAgICBfcm93ID0gMDsKKyAgfQorCisgIC8vcHVibGljIElFbnVtZXJhdG9yPHVsb25nPiBHZXRFbnVtZXJhdG9yKCkKKyAgLy97CisgIC8vICAgIHRoaXMuUmVzZXQoKTsKKyAgLy8gICAgcmV0dXJuIHRoaXM7CisgIC8vfQorCisgIC8vSUVudW1lcmF0b3IgSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCisgIC8veworICAvLyAgICB0aGlzLlJlc2V0KCk7CisgIC8vICAgIHJldHVybiB0aGlzOworICAvL30KK30KKworaW50ZXJuYWwgY2xhc3MgQ2VsbHNTdG9yZUVudW1lcmF0b3I8VD4gOiBJRW51bWVyYWJsZTxUPiwgSUVudW1lcmF0b3I8VD4geworICBwcml2YXRlIENlbGxTdG9yZTxUPiBfY2VsbFN0b3JlOworICBwcml2YXRlIGludCByb3csCisgICAgICBjb2xQb3M7CisgIHByaXZhdGUgaW50W10gcGFnZVBvcywKKyAgICAgIGNlbGxQb3M7CisgIHByaXZhdGUgaW50IF9zdGFydFJvdywKKyAgICAgIF9zdGFydENvbCwKKyAgICAgIF9lbmRSb3csCisgICAgICBfZW5kQ29sOworICBwcml2YXRlIGludCBtaW5Sb3csCisgICAgICBtaW5Db2xQb3MsCisgICAgICBtYXhSb3csCisgICAgICBtYXhDb2xQb3M7CisKKyAgcHVibGljIENlbGxzU3RvcmVFbnVtZXJhdG9yKENlbGxTdG9yZTxUPiBjZWxsU3RvcmUpCisgICAgICA6IHRoaXMoY2VsbFN0b3JlLCAwLCAwLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpIHt9CisKKyAgcHVibGljIENlbGxzU3RvcmVFbnVtZXJhdG9yKAorICAgICAgQ2VsbFN0b3JlPFQ+IGNlbGxTdG9yZSwKKyAgICAgIGludCBzdGFydFJvdywKKyAgICAgIGludCBzdGFydENvbCwKKyAgICAgIGludCBlbmRSb3csCisgICAgICBpbnQgZW5kQ29sKSB7CisgICAgX2NlbGxTdG9yZSA9IGNlbGxTdG9yZTsKKworICAgIF9zdGFydFJvdyA9IHN0YXJ0Um93OworICAgIF9zdGFydENvbCA9IHN0YXJ0Q29sOworICAgIF9lbmRSb3cgPSBlbmRSb3c7CisgICAgX2VuZENvbCA9IGVuZENvbDsKKworICAgIEluaXQoKTsKKyAgfQorCisgIGludGVybmFsIHZvaWQgSW5pdCgpIHsKKyAgICBtaW5Sb3cgPSBfc3RhcnRSb3c7CisgICAgbWF4Um93ID0gX2VuZFJvdzsKKworICAgIG1pbkNvbFBvcyA9IF9jZWxsU3RvcmUuR2V0UG9zaXRpb24oX3N0YXJ0Q29sKTsKKyAgICBpZiAobWluQ29sUG9zIDwgMCkgeworICAgICAgbWluQ29sUG9zID0gfm1pbkNvbFBvczsKKyAgICB9CisgICAgbWF4Q29sUG9zID0gX2NlbGxTdG9yZS5HZXRQb3NpdGlvbihfZW5kQ29sKTsKKyAgICBpZiAobWF4Q29sUG9zIDwgMCkgeworICAgICAgbWF4Q29sUG9zID0gfm1heENvbFBvcyAtIDE7CisgICAgfQorICAgIHJvdyA9IG1pblJvdzsKKyAgICBjb2xQb3MgPSBtaW5Db2xQb3MgLSAxOworCisgICAgdmFyIGNvbHMgPSBtYXhDb2xQb3MgLSBtaW5Db2xQb3MgKyAxOworICAgIHBhZ2VQb3MgPSBuZXcgaW50W2NvbHNdOworICAgIGNlbGxQb3MgPSBuZXcgaW50W2NvbHNdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sczsgaSsrKSB7CisgICAgICBwYWdlUG9zW2ldID0gLTE7CisgICAgICBjZWxsUG9zW2ldID0gLTE7CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgaW50IFJvdyA9PiByb3c7CisKKyAgaW50ZXJuYWwgaW50IENvbHVtbiB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChjb2xQb3MgPT0gLTEpIHsKKyAgICAgICAgTW92ZU5leHQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChjb2xQb3MgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByZXR1cm4gX2NlbGxTdG9yZS5fY29sdW1uSW5kZXhbY29sUG9zXS5JbmRleDsKKyAgICB9CisgIH0KKworICBpbnRlcm5hbCBUIFZhbHVlIHsKKyAgICBnZXQgeworICAgICAgbG9jayAoX2NlbGxTdG9yZSkgeworICAgICAgICByZXR1cm4gX2NlbGxTdG9yZS5HZXRWYWx1ZShyb3csIENvbHVtbik7CisgICAgICB9CisgICAgfQorICAgIHNldCB7CisgICAgICBsb2NrIChfY2VsbFN0b3JlKSB7CisgICAgICAgIF9jZWxsU3RvcmUuU2V0VmFsdWUocm93LCBDb2x1bW4sIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbnRlcm5hbCBib29sIE5leHQoKSB7CisgICAgLy9yZXR1cm4gX2NlbGxTdG9yZS5HZXROZXh0Q2VsbChyZWYgcm93LCByZWYgY29sUG9zLCBtaW5Db2xQb3MsIG1heFJvdywgbWF4Q29sUG9zKTsKKyAgICByZXR1cm4gX2NlbGxTdG9yZS5HZXROZXh0Q2VsbChyZWYgcm93LCByZWYgY29sUG9zLCBtaW5Db2xQb3MsIG1heFJvdywgbWF4Q29sUG9zKTsKKyAgfQorCisgIGludGVybmFsIGJvb2wgUHJldmlvdXMoKSB7CisgICAgbG9jayAoX2NlbGxTdG9yZSkgeworICAgICAgcmV0dXJuIF9jZWxsU3RvcmUuR2V0UHJldkNlbGwocmVmIHJvdywgcmVmIGNvbFBvcywgbWluUm93LCBtaW5Db2xQb3MsIG1heENvbFBvcyk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0cmluZyBDZWxsQWRkcmVzcyA9PiBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoUm93LCBDb2x1bW4pOworCisgIHB1YmxpYyBJRW51bWVyYXRvcjxUPiBHZXRFbnVtZXJhdG9yKCkgeworICAgIFJlc2V0KCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkgeworICAgIFJlc2V0KCk7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICBwdWJsaWMgVCBDdXJyZW50ID0+IFZhbHVlOworCisgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKSB7fQorCisgIG9iamVjdCBJRW51bWVyYXRvci5DdXJyZW50IHsKKyAgICBnZXQgeworICAgICAgUmVzZXQoKTsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sIE1vdmVOZXh0KCkgeworICAgIHJldHVybiBOZXh0KCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBSZXNldCgpIHsKKyAgICBJbml0KCk7CisgIH0KK30KKworaW50ZXJuYWwgY2xhc3MgRmxhZ0NlbGxTdG9yZSA6IENlbGxTdG9yZTxieXRlPiB7CisgIGludGVybmFsIHZvaWQgU2V0RmxhZ1ZhbHVlKGludCByb3csIGludCBjb2wsIGJvb2wgdmFsdWUsIENlbGxGbGFncyBjZWxsRmxhZ3MpIHsKKyAgICBDZWxsRmxhZ3MgY3VycmVudFZhbHVlID0gKENlbGxGbGFncylHZXRWYWx1ZShyb3csIGNvbCk7CisgICAgaWYgKHZhbHVlKSB7CisgICAgICBTZXRWYWx1ZShyb3csIGNvbCwgKGJ5dGUpKGN1cnJlbnRWYWx1ZSB8IGNlbGxGbGFncykpOyAvLyBhZGQgdGhlIENlbGxGbGFnIGJpdAorICAgIH0gZWxzZSB7CisgICAgICBTZXRWYWx1ZShyb3csIGNvbCwgKGJ5dGUpKGN1cnJlbnRWYWx1ZSAmIH5jZWxsRmxhZ3MpKTsgLy8gcmVtb3ZlIHRoZSBDZWxsRmxhZyBiaXQKKyAgICB9CisgIH0KKworICBpbnRlcm5hbCBib29sIEdldEZsYWdWYWx1ZShpbnQgcm93LCBpbnQgY29sLCBDZWxsRmxhZ3MgY2VsbEZsYWdzKSB7CisgICAgcmV0dXJuICEoKChieXRlKWNlbGxGbGFncyAmIEdldFZhbHVlKHJvdywgY29sKSkgPT0gMCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ0YgSW1wbGVtZW50YXRpb24uY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NGIEltcGxlbWVudGF0aW9uLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzdkM2M0Li4wMDAwMDAwCi0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ0YgSW1wbGVtZW50YXRpb24uY3MKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAot77u/I3JlZ2lvbiBUT0RPCi0vL1RPRE86IEFkZCB0aGUgIkRhdGFCYXIiIGV4dGVuZGVkIG9wdGlvbnMKLS8vVE9ETzogQWRkIHRlc3RzIGZvciBhbGwgdGhlIHJ1bGVzCi0vL1RPRE86IEFkZCB0aGUgSWNvblNldCBvcHRpb25zCi0vL1RPRE86IEFkZCBhbGwgdGhlICJleHRMaXN0IiBvcHRpb25zCi0jZW5kcmVnaW9uCi0KLSNyZWdpb24gwqcxOC4zLjEuMTggY29uZGl0aW9uYWxGb3JtYXR0aW5nIChDb25kaXRpb25hbCBGb3JtYXR0aW5nKQotLy9DaGlsZHM6Ci0vL2NmUnVsZSAgICAgICAgICAoQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBSdWxlKSDCpzE4LjMuMS4xMAotLy9leHRMc3QgICAgICAgICAgKEZ1dHVyZSBGZWF0dXJlIERhdGEgU3RvcmFnZSBBcmVhKSDCpzE4LjIuMTAKLQotLy9BdHRyaWJ1dGVzOgotLy9waXZvdAotLy9zcXJlZiAgICAgICAgICAgU1RfU3FyZWYgc2ltcGxlIHR5cGUgKMKnMTguMTguNzYpCi0jZW5kcmVnaW9uCi0KLSNyZWdpb24gwqcxOC4zLjEuMTAgY2ZSdWxlIChDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGUpCi0vL0NoaWxkczoKLS8vY29sb3JTY2FsZSAgICAgIChDb2xvciBTY2FsZSkgwqcxOC4zLjEuMTYKLS8vZGF0YUJhciAgICAgICAgIChEYXRhIEJhcikgwqcxOC4zLjEuMjgKLS8vZXh0THN0ICAgICAgICAgIChGdXR1cmUgRmVhdHVyZSBEYXRhIFN0b3JhZ2UgQXJlYSkgwqcxOC4yLjEwCi0vL2Zvcm11bGEgICAgICAgICAoRm9ybXVsYSkgwqcxOC4zLjEuNDMKLS8vaWNvblNldCAgICAgICAgIChJY29uIFNldCkgwqcxOC4zLjEuNDkKLQotLy9BdHRyaWJ1dGVzOgotLy8tLS0tLS0tLS0tLQotLy9wcmlvcml0eSAgICAgICAgKFByaW9yaXR5KSBUaGUgcHJpb3JpdHkgb2YgdGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUuIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2gKLS8vICAgICAgICAgICAgICAgIGZvcm1hdCBzaG91bGQgYmUgZXZhbHVhdGVkIGFuZCByZW5kZXJlZC4gTG93ZXIgbnVtZXJpYyB2YWx1ZXMgYXJlIGhpZ2hlciBwcmlvcml0eSB0aGFuCi0vLyAgICAgICAgICAgICAgICBoaWdoZXIgbnVtZXJpYyB2YWx1ZXMsIHdoZXJlIDEgaXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCi0vL3N0b3BJZlRydWUgICAgICAoU3RvcCBJZiBUcnVlKSBJZiB0aGlzIGZsYWcgaXMgMSwgbm8gcnVsZXMgd2l0aCBsb3dlciBwcmlvcml0eSBzaGFsbCBiZSBhcHBsaWVkIG92ZXIgdGhpcyBydWxlLCB3aGVuIHRoaXMgcnVsZQotLy8gICAgICAgICAgICAgICAgZXZhbHVhdGVzIHRvIHRydWUuCi0vL3R5cGUgICAgICAgICAgICAoVHlwZSkgVHlwZSBvZiBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUuIFNUX0NmVHlwZSDCpzE4LjE4LjEyLgotLy9hYm92ZUF2ZXJhZ2UgICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJ1bGUgaXMgYW4gImFib3ZlIGF2ZXJhZ2UiIHJ1bGUuIDEgaW5kaWNhdGVzICdhYm92ZSBhdmVyYWdlJy4KLS8vICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIGlnbm9yZWQgaWYgdHlwZSBpcyBub3QgZXF1YWwgdG8gYWJvdmVBdmVyYWdlLgotLy9lcXVhbEF2ZXJhZ2UgICAgKEVxdWFsIEF2ZXJhZ2UpCi0vLyAgICAgICAgICAgICAgICBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgJ2Fib3ZlQXZlcmFnZScgYW5kICdiZWxvd0F2ZXJhZ2UnIGNyaXRlcmlhIGlzIGluY2x1c2l2ZSBvZiB0aGUKLS8vICAgICAgICAgICAgICAgIGF2ZXJhZ2UgaXRzZWxmLCBvciBleGNsdXNpdmUgb2YgdGhhdCB2YWx1ZS4gMSBpbmRpY2F0ZXMgdG8gaW5jbHVkZSB0aGUgYXZlcmFnZSB2YWx1ZSBpbiB0aGUKLS8vICAgICAgICAgICAgICAgIGNyaXRlcmlhLiBUaGlzIGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGlmIHR5cGUgaXMgbm90IGVxdWFsIHRvIGFib3ZlQXZlcmFnZS4KLS8vYm90dG9tICAgICAgICAgIChCb3R0b20gTikgSW5kaWNhdGVzIHdoZXRoZXIgYSAidG9wL2JvdHRvbSBuIiBydWxlIGlzIGEgImJvdHRvbSBuIiBydWxlLiAxIGluZGljYXRlcyAnYm90dG9tJy4KLS8vICAgICAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIGlnbm9yZWQgaWYgdHlwZSBpcyBub3QgZXF1YWwgdG8gdG9wMTAuCi0vL2R4ZklkICAgICAgICAgICAoRGlmZmVyZW50aWFsIEZvcm1hdHRpbmcgSWQpCi0vLyAgICAgICAgICAgICAgICBUaGlzIGlzIGFuIGluZGV4IHRvIGEgZHhmIGVsZW1lbnQgaW4gdGhlIFN0eWxlcyBQYXJ0IGluZGljYXRpbmcgd2hpY2ggY2VsbCBmb3JtYXR0aW5nIHRvCi0vLyAgICAgICAgICAgICAgICBhcHBseSB3aGVuIHRoZSBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgY3JpdGVyaWEgaXMgbWV0LiBTVF9EeGZJZCBzaW1wbGUgdHlwZSAowqcxOC4xOC4yNSkuCi0vL29wZXJhdG9yICAgICAgICAoT3BlcmF0b3IpIFRoZSBvcGVyYXRvciBpbiBhICJjZWxsIHZhbHVlIGlzIiBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUuIFRoaXMgYXR0cmlidXRlIGlzIGlnbm9yZWQgaWYKLS8vICAgICAgICAgICAgICAgIHR5cGUgaXMgbm90IGVxdWFsIHRvIGNlbGxJcy4gVGhlIHBvc3NpYmxlIHZhbHVlcyBTVF9Db25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvciBzaW1wbGUgdHlwZSAowqcxOC4xOC4xNSkuCi0vL3BlcmNlbnQgICAgICAgICAoVG9wIDEwIFBlcmNlbnQpCi0vLyAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciBhICJ0b3AvYm90dG9tIG4iIHJ1bGUgaXMgYSAidG9wL2JvdHRvbSBuIHBlcmNlbnQiIHJ1bGUuIFRoaXMgYXR0cmlidXRlCi0vLyAgICAgICAgICAgICAgICBpcyBpZ25vcmVkIGlmIHR5cGUgaXMgbm90IGVxdWFsIHRvIHRvcDEwLgotLy9yYW5rICAgICAgICAgICAgKFJhbmspIFRoZSB2YWx1ZSBvZiAibiIgaW4gYSAidG9wL2JvdHRvbSBuIiBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUuIFRoaXMgYXR0cmlidXRlIGlzIGlnbm9yZWQKLS8vICAgICAgICAgICAgICAgIGlmIHR5cGUgaXMgbm90IGVxdWFsIHRvIHRvcDEwLgotLy9zdGREZXYgICAgICAgICAgKFN0ZERldikgVGhlIG51bWJlciBvZiBzdGFuZGFyZCBkZXZpYXRpb25zIHRvIGluY2x1ZGUgYWJvdmUgb3IgYmVsb3cgdGhlIGF2ZXJhZ2UgaW4gdGhlCi0vLyAgICAgICAgICAgICAgICBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUuIFRoaXMgYXR0cmlidXRlIGlzIGlnbm9yZWQgaWYgdHlwZSBpcyBub3QgZXF1YWwgdG8gYWJvdmVBdmVyYWdlLgotLy8gICAgICAgICAgICAgICAgSWYgYSB2YWx1ZSBpcyBwcmVzZW50IGZvciBzdGREZXYgYW5kIHRoZSBydWxlIHR5cGUgPSBhYm92ZUF2ZXJhZ2UsIHRoZW4gdGhpcyBydWxlIGlzIGF1dG9tYXRpY2FsbHkgYW4KLS8vICAgICAgICAgICAgICAgICJhYm92ZSBvciBiZWxvdyBOIHN0YW5kYXJkIGRldmlhdGlvbnMiIHJ1bGUuCi0vL3RleHQgICAgICAgICAgICAoVGV4dCkgVGhlIHRleHQgdmFsdWUgaW4gYSAidGV4dCBjb250YWlucyIgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlLiBUaGlzIGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGlmCi0vLyAgICAgICAgICAgICAgICB0eXBlIGlzIG5vdCBlcXVhbCB0byBjb250YWluc1RleHQuCi0vL3RpbWVQZXJpb2QgICAgICAoVGltZSBQZXJpb2QpIFRoZSBhcHBsaWNhYmxlIHRpbWUgcGVyaW9kIGluIGEgImRhdGUgb2NjdXJyaW5n4oCmIiBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUuIFRoaXMKLS8vICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSBpcyBpZ25vcmVkIGlmIHR5cGUgaXMgbm90IGVxdWFsIHRvIHRpbWVQZXJpb2QuIFNUX1RpbWVQZXJpb2QgwqcxOC4xOC44Mi4KLSNlbmRyZWdpb24KLQotI3JlZ2lvbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFhNTCBleGFtcGxlcwotLy8gQWxsIHRoZSBleGFtcGxlcyBhcmUgYXNzdW1lZCB0byBiZSBpbnNpZGUgPGNvbmRpdGlvbmFsRm9ybWF0dGluZyBzcXJlZj0iQTE6QTEwIj4KLQotI3JlZ2lvbiBFeGFtcGxlICJiZWdpbnNXaXRoIgotLy88eDpjZlJ1bGUgdHlwZT0iYmVnaW5zV2l0aCIgZHhmSWQ9IjYiIHByaW9yaXR5PSI1IiBvcGVyYXRvcj0iYmVnaW5zV2l0aCIgdGV4dD0iYSI+Ci0vLyAgPHg6Zm9ybXVsYT5MRUZUKEExLExFTigiYSIpKT0iYSI8L3g6Zm9ybXVsYT4KLS8vPC94OmNmUnVsZT4KLQotLy88eDpjZlJ1bGUgdHlwZT0iYmVnaW5zV2l0aCIgZHhmSWQ9IjUiIHByaW9yaXR5PSIxNCIgb3BlcmF0b3I9ImJlZ2luc1dpdGgiIHRleHQ9IiZxdW90OyZsdDsmZ3Q7Ij4KLS8vICA8eDpmb3JtdWxhPkxFRlQoQTMsTEVOKCIiIiZsdDsmZ3Q7IikpPSIiIiZsdDsmZ3Q7IjwveDpmb3JtdWxhPgotLy88L3g6Y2ZSdWxlPgotI2VuZHJlZ2lvbgotCi0jcmVnaW9uIEV4YW1wbGUgImJldHdlZW4iCi0vLzx4OmNmUnVsZSB0eXBlPSJjZWxsSXMiIGR4ZklkPSI4IiBwcmlvcml0eT0iMTAiIG9wZXJhdG9yPSJiZXR3ZWVuIj4KLS8vICA8eDpmb3JtdWxhPjM8L3g6Zm9ybXVsYT4KLS8vICA8eDpmb3JtdWxhPjc8L3g6Zm9ybXVsYT4KLS8vPC94OmNmUnVsZT4KLSNlbmRyZWdpb24KLQotI3JlZ2lvbiBFeGFtcGxlICJjb250YWluc1RleHQiCi0vLzx4OmNmUnVsZSB0eXBlPSJjb250YWluc1RleHQiIGR4ZklkPSI1IiBwcmlvcml0eT0iNCIgb3BlcmF0b3I9ImNvbnRhaW5zVGV4dCIgdGV4dD0iYyI+Ci0vLyAgPHg6Zm9ybXVsYT5OT1QoSVNFUlJPUihTRUFSQ0goImMiLEExKSkpPC94OmZvcm11bGE+Ci0vLzwveDpjZlJ1bGU+Ci0jZW5kcmVnaW9uCi0KLSNyZWdpb24gRXhhbXBsZSAiZW5kc1dpdGgiCi0vLzx4OmNmUnVsZSB0eXBlPSJlbmRzV2l0aCIgZHhmSWQ9IjkiIHByaW9yaXR5PSIxMSIgb3BlcmF0b3I9ImVuZHNXaXRoIiB0ZXh0PSJjIj4KLS8vICA8eDpmb3JtdWxhPlJJR0hUKEExLExFTigiYyIpKT0iYyI8L3g6Zm9ybXVsYT4KLS8vPC94OmNmUnVsZT4KLSNlbmRyZWdpb24KLQotI3JlZ2lvbiBFeGFtcGxlICJlcXVhbCIKLS8vPHg6Y2ZSdWxlIHR5cGU9ImNlbGxJcyIgZHhmSWQ9IjciIHByaW9yaXR5PSI4IiBvcGVyYXRvcj0iZXF1YWwiPgotLy8gIDx4OmZvcm11bGE+ImFiIjwveDpmb3JtdWxhPgotLy88L3g6Y2ZSdWxlPgotI2VuZHJlZ2lvbgotCi0jcmVnaW9uIEV4YW1wbGUgImdyZWF0ZXJUaGFuIgotLy88eDpjZlJ1bGUgdHlwZT0iY2VsbElzIiBkeGZJZD0iNiIgcHJpb3JpdHk9IjciIG9wZXJhdG9yPSJncmVhdGVyVGhhbiI+Ci0vLyAgPHg6Zm9ybXVsYT40PC94OmZvcm11bGE+Ci0vLzwveDpjZlJ1bGU+Ci0jZW5kcmVnaW9uCi0KLSNyZWdpb24gRXhhbXBsZSAiZ3JlYXRlclRoYW5PckVxdWFsIgotLy88eDpjZlJ1bGUgdHlwZT0iY2VsbElzIiBkeGZJZD0iMyIgcHJpb3JpdHk9IjQiIG9wZXJhdG9yPSJncmVhdGVyVGhhbk9yRXF1YWwiPgotLy8gIDx4OmZvcm11bGE+NDwveDpmb3JtdWxhPgotLy88L3g6Y2ZSdWxlPgotI2VuZHJlZ2lvbgotCi0jcmVnaW9uIEV4YW1wbGUgImxlc3NUaGFuIgotLy88eDpjZlJ1bGUgdHlwZT0iY2VsbElzIiBkeGZJZD0iNSIgcHJpb3JpdHk9IjYiIG9wZXJhdG9yPSJsZXNzVGhhbiI+Ci0vLyAgPHg6Zm9ybXVsYT40PC94OmZvcm11bGE+Ci0vLzwveDpjZlJ1bGU+Ci0jZW5kcmVnaW9uCi0KLSNyZWdpb24gRXhhbXBsZSAibGVzc1RoYW5PckVxdWFsIgotLy88eDpjZlJ1bGUgdHlwZT0iY2VsbElzIiBkeGZJZD0iNCIgcHJpb3JpdHk9IjUiIG9wZXJhdG9yPSJsZXNzVGhhbk9yRXF1YWwiPgotLy8gIDx4OmZvcm11bGE+NDwveDpmb3JtdWxhPgotLy88L3g6Y2ZSdWxlPgotI2VuZHJlZ2lvbgotCi0jcmVnaW9uIEV4YW1wbGUgIm5vdEJldHdlZW4iCi0vLzx4OmNmUnVsZSB0eXBlPSJjZWxsSXMiIGR4ZklkPSIyIiBwcmlvcml0eT0iMyIgb3BlcmF0b3I9Im5vdEJldHdlZW4iPgotLy8gIDx4OmZvcm11bGE+MzwveDpmb3JtdWxhPgotLy8gIDx4OmZvcm11bGE+NzwveDpmb3JtdWxhPgotLy88L3g6Y2ZSdWxlPgotI2VuZHJlZ2lvbgotCi0jcmVnaW9uIEV4YW1wbGUgIm5vdENvbnRhaW5zVGV4dCIKLS8vPHg6Y2ZSdWxlIHR5cGU9Im5vdENvbnRhaW5zVGV4dCIgZHhmSWQ9IjQiIHByaW9yaXR5PSIzIiBvcGVyYXRvcj0ibm90Q29udGFpbnMiIHRleHQ9ImMiPgotLy8gIDx4OmZvcm11bGE+SVNFUlJPUihTRUFSQ0goImMiLEExKSk8L3g6Zm9ybXVsYT4KLS8vPC94OmNmUnVsZT4KLSNlbmRyZWdpb24KLQotI3JlZ2lvbiBFeGFtcGxlICJub3RFcXVhbCIKLS8vPHg6Y2ZSdWxlIHR5cGU9ImNlbGxJcyIgZHhmSWQ9IjEiIHByaW9yaXR5PSIyIiBvcGVyYXRvcj0ibm90RXF1YWwiPgotLy8gIDx4OmZvcm11bGE+ImFiIjwveDpmb3JtdWxhPgotLy88L3g6Y2ZSdWxlPgotI2VuZHJlZ2lvbgotCi0jcmVnaW9uIEV4YW1wbGUgImNvbnRhaW5zQmxhbmtzIgotLy88eDpjZlJ1bGUgdHlwZT0iY29udGFpbnNCbGFua3MiIGR4ZklkPSIyMCIgcHJpb3JpdHk9IjM3Ij4KLS8vICA8eDpmb3JtdWxhPkxFTihUUklNKEExKSk9MDwveDpmb3JtdWxhPgotLy88L3g6Y2ZSdWxlPgotI2VuZHJlZ2lvbgotCi0jcmVnaW9uIEV4YW1wbGUgImNvbnRhaW5zRXJyb3JzIgotLy88eDpjZlJ1bGUgdHlwZT0iY29udGFpbnNFcnJvcnMiIGR4ZklkPSIxNSIgcHJpb3JpdHk9IjE5Ij4KLS8vICA8eDpmb3JtdWxhPklTRVJST1IoQTEpPC94OmZvcm11bGE+Ci0vLzwveDpjZlJ1bGU+Ci0jZW5kcmVnaW9uCi0KLSNyZWdpb24gRXhhbXBsZSAiZXhwcmVzc2lvbiIKLS8vPHg6Y2ZSdWxlIHR5cGU9ImV4cHJlc3Npb24iIGR4ZklkPSIwIiBwcmlvcml0eT0iMSI+Ci0vLyAgPHg6Zm9ybXVsYT5SSUdIVChKMTYsMSk9ImIiPC94OmZvcm11bGE+Ci0vLzwveDpjZlJ1bGU+Ci0jZW5kcmVnaW9uCi0KLSNyZWdpb24gRXhhbXBsZSAiZHVwbGljYXRlVmFsdWVzIgotLy88eDpjZlJ1bGUgdHlwZT0iZHVwbGljYXRlVmFsdWVzIiBkeGZJZD0iMTQiIHByaW9yaXR5PSIxNiIgLz4KLSNlbmRyZWdpb24KLQotI3JlZ2lvbiBFeGFtcGxlICJub3RDb250YWluc0JsYW5rcyIKLS8vPHg6Y2ZSdWxlIHR5cGU9Im5vdENvbnRhaW5zQmxhbmtzIiBkeGZJZD0iMTIiIHByaW9yaXR5PSIxNCI+Ci0vLyAgPHg6Zm9ybXVsYT5MRU4oVFJJTShBMSkpJmd0OzA8L3g6Zm9ybXVsYT4KLS8vPC94OmNmUnVsZT4KLSNlbmRyZWdpb24KLQotI3JlZ2lvbiBFeGFtcGxlICJub3RDb250YWluc0Vycm9ycyIKLS8vPHg6Y2ZSdWxlIHR5cGU9Im5vdENvbnRhaW5zRXJyb3JzIiBkeGZJZD0iMTEiIHByaW9yaXR5PSIzNiI+Ci0vLyAgPHg6Zm9ybXVsYT5OT1QoSVNFUlJPUihBMSkpPC94OmZvcm11bGE+Ci0vLzwveDpjZlJ1bGU+Ci0jZW5kcmVnaW9uCi0KLSNyZWdpb24gRXhhbXBsZSAidW5pcXVlVmFsdWVzIgotLy88eDpjZlJ1bGUgdHlwZT0idW5pcXVlVmFsdWVzIiBkeGZJZD0iMTMiIHByaW9yaXR5PSIxNSIgLz4KLSNlbmRyZWdpb24KLQotI3JlZ2lvbiBFeGFtcGxlICJsYXN0N0RheXMiCi0vLzx4OmNmUnVsZSB0eXBlPSJ0aW1lUGVyaW9kIiBkeGZJZD0iMzkiIHByaW9yaXR5PSIxMCIgdGltZVBlcmlvZD0ibGFzdDdEYXlzIj4KLS8vICA8eDpmb3JtdWxhPkFORChUT0RBWSgpLUZMT09SKEExLDEpJmx0Oz02LEZMT09SKEExLDEpJmx0Oz1UT0RBWSgpKTwveDpmb3JtdWxhPgotLy88L3g6Y2ZSdWxlPgotI2VuZHJlZ2lvbgotCi0jcmVnaW9uIEV4YW1wbGUgImxhc3RNb250aCIKLS8vPHg6Y2ZSdWxlIHR5cGU9InRpbWVQZXJpb2QiIGR4ZklkPSIzOCIgcHJpb3JpdHk9IjkiIHRpbWVQZXJpb2Q9Imxhc3RNb250aCI+Ci0vLyAgPHg6Zm9ybXVsYT5BTkQoTU9OVEgoQTEpPU1PTlRIKEVEQVRFKFRPREFZKCksMC0xKSksWUVBUihBMSk9WUVBUihFREFURShUT0RBWSgpLDAtMSkpKTwveDpmb3JtdWxhPgotLy88L3g6Y2ZSdWxlPgotI2VuZHJlZ2lvbgotCi0jcmVnaW9uIEV4YW1wbGUgImxhc3RXZWVrIgotLy88eDpjZlJ1bGUgdHlwZT0idGltZVBlcmlvZCIgZHhmSWQ9IjM3IiBwcmlvcml0eT0iOCIgdGltZVBlcmlvZD0ibGFzdFdlZWsiPgotLy8gIDx4OmZvcm11bGE+QU5EKFRPREFZKCktUk9VTkRET1dOKEExLDApJmd0Oz0oV0VFS0RBWShUT0RBWSgpKSksVE9EQVkoKS1ST1VORERPV04oQTEsMCkmbHQ7KFdFRUtEQVkoVE9EQVkoKSkrNykpPC94OmZvcm11bGE+Ci0vLzwveDpjZlJ1bGU+Ci0jZW5kcmVnaW9uCi0KLSNyZWdpb24gRXhhbXBsZSAibmV4dE1vbnRoIgotLy88eDpjZlJ1bGUgdHlwZT0idGltZVBlcmlvZCIgZHhmSWQ9IjM2IiBwcmlvcml0eT0iNyIgdGltZVBlcmlvZD0ibmV4dE1vbnRoIj4KLS8vICA8eDpmb3JtdWxhPkFORChNT05USChBMSk9TU9OVEgoRURBVEUoVE9EQVkoKSwwKzEpKSxZRUFSKEExKT1ZRUFSKEVEQVRFKFRPREFZKCksMCsxKSkpPC94OmZvcm11bGE+Ci0vLzwveDpjZlJ1bGU+Ci0jZW5kcmVnaW9uCi0KLSNyZWdpb24gRXhhbXBsZSAibmV4dFdlZWsiCi0vLzx4OmNmUnVsZSB0eXBlPSJ0aW1lUGVyaW9kIiBkeGZJZD0iMzUiIHByaW9yaXR5PSI2IiB0aW1lUGVyaW9kPSJuZXh0V2VlayI+Ci0vLyAgPHg6Zm9ybXVsYT5BTkQoUk9VTkRET1dOKEExLDApLVRPREFZKCkmZ3Q7KDctV0VFS0RBWShUT0RBWSgpKSksUk9VTkRET1dOKEExLDApLVRPREFZKCkmbHQ7KDE1LVdFRUtEQVkoVE9EQVkoKSkpKTwveDpmb3JtdWxhPgotLy88L3g6Y2ZSdWxlPgotI2VuZHJlZ2lvbgotCi0jcmVnaW9uIEV4YW1wbGUgInRoaXNNb250aCIKLS8vPHg6Y2ZSdWxlIHR5cGU9InRpbWVQZXJpb2QiIGR4ZklkPSIzNCIgcHJpb3JpdHk9IjUiIHRpbWVQZXJpb2Q9InRoaXNNb250aCI+Ci0vLyAgPHg6Zm9ybXVsYT5BTkQoTU9OVEgoQTEpPU1PTlRIKFRPREFZKCkpLFlFQVIoQTEpPVlFQVIoVE9EQVkoKSkpPC94OmZvcm11bGE+Ci0vLzwveDpjZlJ1bGU+Ci0jZW5kcmVnaW9uCi0KLSNyZWdpb24gRXhhbXBsZSAidGhpc1dlZWsiCi0vLzx4OmNmUnVsZSB0eXBlPSJ0aW1lUGVyaW9kIiBkeGZJZD0iMzMiIHByaW9yaXR5PSI0IiB0aW1lUGVyaW9kPSJ0aGlzV2VlayI+Ci0vLyAgPHg6Zm9ybXVsYT5BTkQoVE9EQVkoKS1ST1VORERPV04oQTEsMCkmbHQ7PVdFRUtEQVkoVE9EQVkoKSktMSxST1VORERPV04oQTEsMCktVE9EQVkoKSZsdDs9Ny1XRUVLREFZKFRPREFZKCkpKTwveDpmb3JtdWxhPgotLy88L3g6Y2ZSdWxlPgotI2VuZHJlZ2lvbgotCi0jcmVnaW9uIEV4YW1wbGUgInRvZGF5IgotLy88eDpjZlJ1bGUgdHlwZT0idGltZVBlcmlvZCIgZHhmSWQ9IjMyIiBwcmlvcml0eT0iMyIgdGltZVBlcmlvZD0idG9kYXkiPgotLy8gIDx4OmZvcm11bGE+RkxPT1IoQTEsMSk9VE9EQVkoKTwveDpmb3JtdWxhPgotLy88L3g6Y2ZSdWxlPgotI2VuZHJlZ2lvbgotCi0jcmVnaW9uIEV4YW1wbGUgInRvbW9ycm93IgotLy88eDpjZlJ1bGUgdHlwZT0idGltZVBlcmlvZCIgZHhmSWQ9IjMxIiBwcmlvcml0eT0iMiIgdGltZVBlcmlvZD0idG9tb3Jyb3ciPgotLy8gIDx4OmZvcm11bGE+RkxPT1IoQTEsMSk9VE9EQVkoKSsxPC94OmZvcm11bGE+Ci0vLzwveDpjZlJ1bGU+Ci0jZW5kcmVnaW9uCi0KLSNyZWdpb24gRXhhbXBsZSAieWVzdGVyZGF5IgotLy88eDpjZlJ1bGUgdHlwZT0idGltZVBlcmlvZCIgZHhmSWQ9IjEiIHByaW9yaXR5PSIxIiB0aW1lUGVyaW9kPSJ5ZXN0ZXJkYXkiPgotLy8gIDx4OmZvcm11bGE+RkxPT1IoQTEsMSk9VE9EQVkoKS0xPC94OmZvcm11bGE+Ci0vLzwveDpjZlJ1bGU+Ci0jZW5kcmVnaW9uCi0KLSNyZWdpb24gRXhhbXBsZSAidHdvQ29sb3JTY2FsZSIKLS8vPGNmUnVsZSB0eXBlPSJjb2xvclNjYWxlIiBwcmlvcml0eT0iMSI+Ci0vLyAgPGNvbG9yU2NhbGU+Ci0vLyAgICA8Y2Z2byB0eXBlPSJtaW4iLz4KLS8vICAgIDxjZnZvIHR5cGU9Im1heCIvPgotLy8gICAgPGNvbG9yIHJnYj0iRkZGODY5NkIiLz4KLS8vICAgIDxjb2xvciByZ2I9IkZGNjNCRTdCIi8+Ci0vLyAgPC9jb2xvclNjYWxlPgotLy88L2NmUnVsZT4KLSNlbmRyZWdpb24KLQotI3JlZ2lvbiBFeGFtcGxlcyAiaWNvblNldDMiICh4IGFsbCB0aGUgMyBJY29uU2V0IG9wdGlvbnMpCi0vLzx4OmNmUnVsZSB0eXBlPSJpY29uU2V0IiBwcmlvcml0eT0iMzAiPgotLy8gIDx4Omljb25TZXQ+Ci0vLyAgICA8eDpjZnZvIHR5cGU9InBlcmNlbnQiIHZhbD0iMCIgLz4KLS8vICAgIDx4OmNmdm8gdHlwZT0icGVyY2VudCIgdmFsPSIzMyIgLz4KLS8vICAgIDx4OmNmdm8gdHlwZT0icGVyY2VudCIgdmFsPSI2NyIgLz4KLS8vICA8L3g6aWNvblNldD4KLS8vPC94OmNmUnVsZT4KLQotLy88eDpjZlJ1bGUgdHlwZT0iaWNvblNldCIgcHJpb3JpdHk9IjM4Ij4KLS8vICA8eDppY29uU2V0IGljb25TZXQ9IjNBcnJvd3MiPgotLy8gICAgPHg6Y2Z2byB0eXBlPSJwZXJjZW50IiB2YWw9IjAiIC8+Ci0vLyAgICA8eDpjZnZvIHR5cGU9InBlcmNlbnQiIHZhbD0iMzMiIC8+Ci0vLyAgICA8eDpjZnZvIHR5cGU9InBlcmNlbnQiIHZhbD0iNjciIC8+Ci0vLyAgPC94Omljb25TZXQ+Ci0vLzwveDpjZlJ1bGU+Ci0jZW5kcmVnaW9uCi0KLSNyZWdpb24gRXhhbXBsZXMgImljb25TZXQ0IiAoeCBhbGwgdGhlIDQgSWNvblNldCBvcHRpb25zKQotLy88eDpjZlJ1bGUgdHlwZT0iaWNvblNldCIgcHJpb3JpdHk9IjM0Ij4KLS8vICA8eDppY29uU2V0IGljb25TZXQ9IjRBcnJvd3NHcmF5Ij4KLS8vICAgIDx4OmNmdm8gdHlwZT0icGVyY2VudCIgdmFsPSIwIiAvPgotLy8gICAgPHg6Y2Z2byB0eXBlPSJwZXJjZW50IiB2YWw9IjI1IiAvPgotLy8gICAgPHg6Y2Z2byB0eXBlPSJwZXJjZW50IiB2YWw9IjUwIiAvPgotLy8gICAgPHg6Y2Z2byB0eXBlPSJwZXJjZW50IiB2YWw9Ijc1IiAvPgotLy8gIDwveDppY29uU2V0PgotLy88L3g6Y2ZSdWxlPgotI2VuZHJlZ2lvbgotCi0jcmVnaW9uIEV4YW1wbGVzICJpY29uU2V0NSIgKHggYWxsIHRoZSA1IEljb25TZXQgb3B0aW9ucykKLS8vPHg6Y2ZSdWxlIHR5cGU9Imljb25TZXQiIHByaW9yaXR5PSIzMiI+Ci0vLyAgPHg6aWNvblNldCBpY29uU2V0PSI1QXJyb3dzR3JheSI+Ci0vLyAgICA8eDpjZnZvIHR5cGU9InBlcmNlbnQiIHZhbD0iMCIgLz4KLS8vICAgIDx4OmNmdm8gdHlwZT0icGVyY2VudCIgdmFsPSIyMCIgLz4KLS8vICAgIDx4OmNmdm8gdHlwZT0icGVyY2VudCIgdmFsPSI0MCIgLz4KLS8vICAgIDx4OmNmdm8gdHlwZT0icGVyY2VudCIgdmFsPSI2MCIgLz4KLS8vICAgIDx4OmNmdm8gdHlwZT0icGVyY2VudCIgdmFsPSI4MCIgLz4KLS8vICA8L3g6aWNvblNldD4KLS8vPC94OmNmUnVsZT4KLSNlbmRyZWdpb24KLQotI3JlZ2lvbiBFeGFtcGxlcyAiaWNvblNldCIgRXh0ZW5kZWQgKG5vdCBpbXBsZW1lbnRlZCB5ZXQpCi0vLzx4OmV4dExzdD4KLS8vICA8eDpleHQgeG1sbnM6eDE0PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS9zcHJlYWRzaGVldG1sLzIwMDkvOS9tYWluIiB1cmk9Ins3OEMwRDkzMS02NDM3LTQwN2QtQThFRS1GMEFBRDc1MzlFNjV9Ij4KLS8vICAgIDx4MTQ6Y29uZGl0aW9uYWxGb3JtYXR0aW5ncz4KLS8vICAgICAgPHgxNDpjb25kaXRpb25hbEZvcm1hdHRpbmcgeG1sbnM6eG09Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL2V4Y2VsLzIwMDYvbWFpbiI+Ci0vLyAgICAgICAgPHgxNDpjZlJ1bGUgdHlwZT0iaWNvblNldCIgcHJpb3JpdHk9IjM1IiBpZD0ie0Y1MTE0MzY5LTA4MEEtNDdFNi1CN0VFLTQ5OTEzN0EzQzg5Nn0iPgotLy8gICAgICAgICAgPHgxNDppY29uU2V0IGljb25TZXQ9IjNUcmlhbmdsZXMiPgotLy8gICAgICAgICAgICA8eDE0OmNmdm8gdHlwZT0icGVyY2VudCI+Ci0vLyAgICAgICAgICAgICAgPHhtOmY+MDwveG06Zj4KLS8vICAgICAgICAgICAgPC94MTQ6Y2Z2bz4KLS8vICAgICAgICAgICAgPHgxNDpjZnZvIHR5cGU9InBlcmNlbnQiPgotLy8gICAgICAgICAgICAgIDx4bTpmPjMzPC94bTpmPgotLy8gICAgICAgICAgICA8L3gxNDpjZnZvPgotLy8gICAgICAgICAgICA8eDE0OmNmdm8gdHlwZT0icGVyY2VudCI+Ci0vLyAgICAgICAgICAgICAgPHhtOmY+Njc8L3htOmY+Ci0vLyAgICAgICAgICAgIDwveDE0OmNmdm8+Ci0vLyAgICAgICAgICA8L3gxNDppY29uU2V0PgotLy8gICAgICAgIDwveDE0OmNmUnVsZT4KLS8vICAgICAgICA8eG06c3FyZWY+QzM6QzEyPC94bTpzcXJlZj4KLS8vICAgICAgPC94MTQ6Y29uZGl0aW9uYWxGb3JtYXR0aW5nPgotLy8gICAgICA8eDE0OmNvbmRpdGlvbmFsRm9ybWF0dGluZyB4bWxuczp4bT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvZXhjZWwvMjAwNi9tYWluIj4KLS8vICAgICAgICA8eDE0OmNmUnVsZSB0eXBlPSJpY29uU2V0IiBwcmlvcml0eT0iNiIgaWQ9InswQTMyNzM4NC1CRjJGLTRCRjUtOTc2Ny0xMjNDRDY5MEE1MzZ9Ij4KLS8vICAgICAgICAgIDx4MTQ6aWNvblNldCBpY29uU2V0PSIzU3RhcnMiPgotLy8gICAgICAgICAgICA8eDE0OmNmdm8gdHlwZT0icGVyY2VudCI+Ci0vLyAgICAgICAgICAgICAgPHhtOmY+MDwveG06Zj4KLS8vICAgICAgICAgICAgPC94MTQ6Y2Z2bz4KLS8vICAgICAgICAgICAgPHgxNDpjZnZvIHR5cGU9InBlcmNlbnQiPgotLy8gICAgICAgICAgICAgIDx4bTpmPjMzPC94bTpmPgotLy8gICAgICAgICAgICA8L3gxNDpjZnZvPgotLy8gICAgICAgICAgICA8eDE0OmNmdm8gdHlwZT0icGVyY2VudCI+Ci0vLyAgICAgICAgICAgICAgPHhtOmY+Njc8L3htOmY+Ci0vLyAgICAgICAgICAgIDwveDE0OmNmdm8+Ci0vLyAgICAgICAgICA8L3gxNDppY29uU2V0PgotLy8gICAgICAgIDwveDE0OmNmUnVsZT4KLS8vICAgICAgICA8eG06c3FyZWY+QTE2OkEyNTwveG06c3FyZWY+Ci0vLyAgICAgIDwveDE0OmNvbmRpdGlvbmFsRm9ybWF0dGluZz4KLS8vICAgICAgPHgxNDpjb25kaXRpb25hbEZvcm1hdHRpbmcgeG1sbnM6eG09Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL2V4Y2VsLzIwMDYvbWFpbiI+Ci0vLyAgICAgICAgPHgxNDpjZlJ1bGUgdHlwZT0iaWNvblNldCIgcHJpb3JpdHk9IjE5IiBpZD0iezBERENBM0U0LTM1MzYtNDRCMy1BNjYzLTQ4Nzc1ODcyOTVCOH0iPgotLy8gICAgICAgICAgPHgxNDppY29uU2V0IGljb25TZXQ9IjNUcmlhbmdsZXMiPgotLy8gICAgICAgICAgICA8eDE0OmNmdm8gdHlwZT0icGVyY2VudCI+Ci0vLyAgICAgICAgICAgICAgPHhtOmY+MDwveG06Zj4KLS8vICAgICAgICAgICAgPC94MTQ6Y2Z2bz4KLS8vICAgICAgICAgICAgPHgxNDpjZnZvIHR5cGU9InBlcmNlbnQiPgotLy8gICAgICAgICAgICAgIDx4bTpmPjMzPC94bTpmPgotLy8gICAgICAgICAgICA8L3gxNDpjZnZvPgotLy8gICAgICAgICAgICA8eDE0OmNmdm8gdHlwZT0icGVyY2VudCI+Ci0vLyAgICAgICAgICAgICAgPHhtOmY+Njc8L3htOmY+Ci0vLyAgICAgICAgICAgIDwveDE0OmNmdm8+Ci0vLyAgICAgICAgICA8L3gxNDppY29uU2V0PgotLy8gICAgICAgIDwveDE0OmNmUnVsZT4KLS8vICAgICAgICA8eG06c3FyZWY+QzE2OkMyNTwveG06c3FyZWY+Ci0vLyAgICAgIDwveDE0OmNvbmRpdGlvbmFsRm9ybWF0dGluZz4KLS8vICAgICAgPHgxNDpjb25kaXRpb25hbEZvcm1hdHRpbmcgeG1sbnM6eG09Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vb2ZmaWNlL2V4Y2VsLzIwMDYvbWFpbiI+Ci0vLyAgICAgICAgPHgxNDpjZlJ1bGUgdHlwZT0iaWNvblNldCIgcHJpb3JpdHk9IjIiIGlkPSJ7RTRFREQ3RkItODgwQy00MDhGLUI4N0MtQzhEQTQ0NkFFQjc4fSI+Ci0vLyAgICAgICAgICA8eDE0Omljb25TZXQgaWNvblNldD0iNUJveGVzIj4KLS8vICAgICAgICAgICAgPHgxNDpjZnZvIHR5cGU9InBlcmNlbnQiPgotLy8gICAgICAgICAgICAgIDx4bTpmPjA8L3htOmY+Ci0vLyAgICAgICAgICAgIDwveDE0OmNmdm8+Ci0vLyAgICAgICAgICAgIDx4MTQ6Y2Z2byB0eXBlPSJwZXJjZW50Ij4KLS8vICAgICAgICAgICAgICA8eG06Zj4yMDwveG06Zj4KLS8vICAgICAgICAgICAgPC94MTQ6Y2Z2bz4KLS8vICAgICAgICAgICAgPHgxNDpjZnZvIHR5cGU9InBlcmNlbnQiPgotLy8gICAgICAgICAgICAgIDx4bTpmPjQwPC94bTpmPgotLy8gICAgICAgICAgICA8L3gxNDpjZnZvPgotLy8gICAgICAgICAgICA8eDE0OmNmdm8gdHlwZT0icGVyY2VudCI+Ci0vLyAgICAgICAgICAgICAgPHhtOmY+NjA8L3htOmY+Ci0vLyAgICAgICAgICAgIDwveDE0OmNmdm8+Ci0vLyAgICAgICAgICAgIDx4MTQ6Y2Z2byB0eXBlPSJwZXJjZW50Ij4KLS8vICAgICAgICAgICAgICA8eG06Zj44MDwveG06Zj4KLS8vICAgICAgICAgICAgPC94MTQ6Y2Z2bz4KLS8vICAgICAgICAgIDwveDE0Omljb25TZXQ+Ci0vLyAgICAgICAgPC94MTQ6Y2ZSdWxlPgotLy8gICAgICAgIDx4bTpzcXJlZj5FMTY6RTI1PC94bTpzcXJlZj4KLS8vICAgICAgPC94MTQ6Y29uZGl0aW9uYWxGb3JtYXR0aW5nPgotLy8gICAgICA8eDE0OmNvbmRpdGlvbmFsRm9ybWF0dGluZyB4bWxuczp4bT0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9vZmZpY2UvZXhjZWwvMjAwNi9tYWluIj4KLS8vICAgICAgICA8eDE0OmNmUnVsZSB0eXBlPSJpY29uU2V0IiBwcmlvcml0eT0iMSIgaWQ9Ins0Q0M4MjA2MC1DQjBBLTRBMzEtQUVGMi1EMUE1ODdBQzE2NzR9Ij4KLS8vICAgICAgICAgIDx4MTQ6aWNvblNldCBpY29uU2V0PSIzU3RhcnMiIHNob3dWYWx1ZT0iMCIgY3VzdG9tPSIxIj4KLS8vICAgICAgICAgICAgPHgxNDpjZnZvIHR5cGU9InBlcmNlbnQiPgotLy8gICAgICAgICAgICAgIDx4bTpmPjA8L3htOmY+Ci0vLyAgICAgICAgICAgIDwveDE0OmNmdm8+Ci0vLyAgICAgICAgICAgIDx4MTQ6Y2Z2byB0eXBlPSJmb3JtdWxhIj4KLS8vICAgICAgICAgICAgICA8eG06Zj4kRiQxNzwveG06Zj4KLS8vICAgICAgICAgICAgPC94MTQ6Y2Z2bz4KLS8vICAgICAgICAgICAgPHgxNDpjZnZvIHR5cGU9Im51bSI+Ci0vLyAgICAgICAgICAgICAgPHhtOmY+NDwveG06Zj4KLS8vICAgICAgICAgICAgPC94MTQ6Y2Z2bz4KLS8vICAgICAgICAgICAgPHgxNDpjZkljb24gaWNvblNldD0iM1RyaWFuZ2xlcyIgaWNvbklkPSIxIiAvPgotLy8gICAgICAgICAgICA8eDE0OmNmSWNvbiBpY29uU2V0PSI0UmVkVG9CbGFjayIgaWNvbklkPSIzIiAvPgotLy8gICAgICAgICAgICA8eDE0OmNmSWNvbiBpY29uU2V0PSIzU3RhcnMiIGljb25JZD0iMiIgLz4KLS8vICAgICAgICAgIDwveDE0Omljb25TZXQ+Ci0vLyAgICAgICAgPC94MTQ6Y2ZSdWxlPgotLy8gICAgICAgIDx4bTpzcXJlZj5GMTY6RjI1PC94bTpzcXJlZj4KLS8vICAgICAgPC94MTQ6Y29uZGl0aW9uYWxGb3JtYXR0aW5nPgotLy8gICAgPC94MTQ6Y29uZGl0aW9uYWxGb3JtYXR0aW5ncz4KLS8vICA8L3g6ZXh0PgotLy88L3g6ZXh0THN0PgotI2VuZHJlZ2lvbgotCi0KLSNlbmRyZWdpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAuY3MKaW5kZXggZGE1YmM4My4uNzdlZmMzZiAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cC5jcwpAQCAtMTMsMzcgKzEzLDI1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwCi0gICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlCi0gIHsKLSAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICB9Ci19CisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlIHt9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aC5jcwppbmRleCA5MWJjMTFiLi44YmM3YzhmIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGguY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDM4ICsxMywyNyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGgKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoCisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aAogICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoVGV4dAotICB7Ci0gICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhUZXh0IHt9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2Vlbi5jcwppbmRleCA4Njg5NWE4Li42ZDU2YTllIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4uY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDM4ICsxMywyNyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuCisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2VlbgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2VlbgogICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYTIKLSAgewotICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYTIge30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVHcm91cC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVHcm91cC5jcwppbmRleCA0Mjc2MjExLi44ZjMzZmMwIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlR3JvdXAuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZUdyb3VwLmNzCkBAIC0xMywzNyArMTMsMjUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cwotewotCS8vLyA8c3VtbWFyeT4KLSAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVHcm91cAotCS8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZUdyb3VwCi0JCTogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZQotCXsKLQkJI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotCQkjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy8vLyA8c3VtbWFyeT4KKy8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlR3JvdXAKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVHcm91cCA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUge30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MuY3MKaW5kZXggNzM4MWUzMi4uNGQwNTEwOSAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MuY3MKQEAgLTEzLDM3ICsxMywyNSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MKLSAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUKLSAgewotICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSB7fQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycy5jcwppbmRleCAzN2ZlMzE3Li5hNjY4ZTExIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycy5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycy5jcwpAQCAtMTMsMzcgKzEzLDI1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycwotICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZQotICB7Ci0gICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy8vLyA8c3VtbWFyeT4KKy8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlIHt9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQuY3MKaW5kZXggMDY5YjljOC4uNTkxOWY5MCAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0LmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMzggKzEzLDI3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0Ci0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0CisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQKICAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFRleHQKLSAgewotICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoVGV4dCB7fQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhckdyb3VwLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhckdyb3VwLmNzCmluZGV4IDMxYjkwMDIuLjk5YTQ0YTEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXJHcm91cC5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyR3JvdXAuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDU1ICsxMyw0NyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiB1c2luZyBTeXN0ZW0uRHJhd2luZzsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cwotewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhcgotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyR3JvdXAKLSAgICAgICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlCi0JewotCQkjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNob3dWYWx1ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBib29sIFNob3dWYWx1ZSB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERhdGFiYXIgTG93IFZhbHVlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSBMb3dWYWx1ZSB7IGdldDsgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGF0YWJhciBIaWdoIFZhbHVlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSBIaWdoVmFsdWUgeyBnZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGNvbG9yIG9mIHRoZSBkYXRhYmFyCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIENvbG9yIENvbG9yIHsgZ2V0OyBzZXQ7fQotICAgICAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKy8vLyA8c3VtbWFyeT4KKy8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyR3JvdXAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2hvd1ZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIGJvb2wgU2hvd1ZhbHVlIHsgZ2V0OyBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBEYXRhYmFyIExvdyBWYWx1ZQorICAvLy8gPC9zdW1tYXJ5PgorICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgTG93VmFsdWUgeyBnZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBEYXRhYmFyIEhpZ2ggVmFsdWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIEhpZ2hWYWx1ZSB7IGdldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBjb2xvciBvZiB0aGUgZGF0YWJhcgorICAvLy8gPC9zdW1tYXJ5PgorICBDb2xvciBDb2xvciB7IGdldDsgc2V0OyB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMuY3MKaW5kZXggNzY4YmUzNy4uMzI0MjdmOSAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcy5jcwpAQCAtMTMsMzcgKzEzLDI1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzCi0gICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlCi0gIHsKLSAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLy8vIDxzdW1tYXJ5PgorLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSB7fQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGguY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aC5jcwppbmRleCAwN2Y1OGQxLi5kNDVjMjk2IDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aC5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMzggKzEzLDI3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGgKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aAorLy8vIDxzdW1tYXJ5PgorLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aAogICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoVGV4dAotICB7Ci0gICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhUZXh0IHt9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsLmNzCmluZGV4IDE2YmNlMTYuLjkxYzk2NjMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywzOCArMTMsMjcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbAotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsCisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsCiAgICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhCi0gIHsKLSAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEge30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24uY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uLmNzCmluZGV4IDM0MGRiNTIuLmFhMjNhNjkgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24uY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMzggKzEzLDI3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbgotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24KKy8vLyA8c3VtbWFyeT4KKy8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uCiAgICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhCi0gIHsKLSAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEge30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0LmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQuY3MKaW5kZXggZTgxZDQ5OS4uMjk1NGIzZSAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDQwICsxMywzMSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCi17CisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQKKy8vLyA8L3N1bW1hcnk+ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZQorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldAorICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNUljb25zU2V0VHlwZT4gewogICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldAotICAvLy8gPC9zdW1tYXJ5PmVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzRJY29uc1NldFR5cGUKLSAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0IDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNUljb25zU2V0VHlwZT4KLSAgewotICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEljb241IChwYXJ0IG9mIHRoZSA1IEljb24gU2V0KQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjUgeyBnZXQ7IH0KLSAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgIC8vLyBJY29uNSAocGFydCBvZiB0aGUgNSBJY29uIFNldCkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIEljb241IHsgZ2V0OyB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0LmNzCmluZGV4IDQ5NmFkNjEuLjY3ZGEyYmEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0LmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw0MCArMTMsMzEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cwoteworLy8vIDxzdW1tYXJ5PgorLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldDxUPgorICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0PFQ+IHsKICAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQKKyAgLy8vIEljb240IChwYXJ0IG9mIHRoZSA0IG91IDUgSWNvbiBTZXQpCiAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldDxUPiA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlSWNvblNldDxUPgotICB7Ci0gICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gSWNvbjQgKHBhcnQgb2YgdGhlIDQgb3UgNSBJY29uIFNldCkKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIEljb240IHsgZ2V0OyB9ICAgICAgCi0gICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICB9CisgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSBJY29uNCB7IGdldDsgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4uY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbi5jcwppbmRleCA3ZDczOWZhLi45Mjg3ZjNmIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbi5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMzggKzEzLDI3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbgorLy8vIDxzdW1tYXJ5PgorLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbgogICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYQotICB7Ci0gICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhIHt9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwuY3MKaW5kZXggMWMzZTE5My4uYWEwODRjYyAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMzggKzEzLDI3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsCisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwKICAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEKLSAgewotICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYSB7fQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvblNldEdyb3VwLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvblNldEdyb3VwLmNzCmluZGV4IDc4ZThkN2MuLjcwMGZmZDYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25TZXRHcm91cC5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0R3JvdXAuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDUxICsxMyw0MCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCi17Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0R3JvdXAKLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvblNldEdyb3VwPFQ+Ci0JCTogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZQotCXsKLQkJI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUmV2ZXJzZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgYm9vbCBSZXZlcnNlIHsgZ2V0OyBzZXQ7IH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0R3JvdXAKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25TZXRHcm91cDxUPiA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZXZlcnNlCisgIC8vLyA8L3N1bW1hcnk+CisgIGJvb2wgUmV2ZXJzZSB7IGdldDsgc2V0OyB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFNob3dWYWx1ZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgYm9vbCBTaG93VmFsdWUgeyBnZXQ7IHNldDsgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTaG93VmFsdWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgYm9vbCBTaG93VmFsdWUgeyBnZXQ7IHNldDsgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBJY29uU2V0ICgzLCA0IG91IDUgSWNvblNldCkKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIFQgSWNvblNldCB7IGdldDsgc2V0OyB9Ci0gICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEljb25TZXQgKDMsIDQgb3UgNSBJY29uU2V0KQorICAvLy8gPC9zdW1tYXJ5PgorICBUIEljb25TZXQgeyBnZXQ7IHNldDsgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4uY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbi5jcwppbmRleCA1OWUyNWE1Li4xNjJhMTZjIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbi5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMzggKzEzLDI3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbgorLy8vIDxzdW1tYXJ5PgorLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbgogICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYQotICB7Ci0gICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhIHt9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwuY3MKaW5kZXggYzlhOGEyYS4uZmNlNjA2NCAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW5PckVxdWFsLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMzggKzEzLDI3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW5PckVxdWFsCisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwKICAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEKLSAgewotICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYSB7fQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2Vlbi5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4uY3MKaW5kZXggNDk4MzVkZC4uYTAxN2I4MSAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2Vlbi5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywzOCArMTMsMjcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2VlbgorLy8vIDxzdW1tYXJ5PgorLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4KICAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEyCi0gIHsKLSAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEyIHt9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcy5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzLmNzCmluZGV4IDAxNTI5MTYuLjQ3NDNiM2IgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzLmNzCkBAIC0xMywzNyArMTMsMjUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcwotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzCi0gICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlCi0gIHsKLSAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLy8vIDxzdW1tYXJ5PgorLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcyA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUge30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMuY3MKaW5kZXggYmQ3Y2ZlZS4uYWE0MmExYyAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMuY3MKQEAgLTEzLDM3ICsxMywyNSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMKLSAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUKLSAgewotICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSB7fQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNUZXh0LmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNUZXh0LmNzCmluZGV4IDljYmNiNGEuLjVhNDI3ZjQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dC5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDM4ICsxMywyNyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dAotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dAorLy8vIDxzdW1tYXJ5PgorLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNUZXh0CiAgICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhUZXh0Ci0gIHsKLSAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFRleHQge30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwuY3MKaW5kZXggMTdmN2MzYi4uZjIwZjMzYSAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDM4ICsxMywyNyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwKKy8vLyA8c3VtbWFyeT4KKy8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwKICAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEKLSAgewotICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYSB7fQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUuY3MKaW5kZXggY2RiODk5YS4uZTg4YjVhZiAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZS5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLmNzCkBAIC0xMyw3NSArMTMsNzAgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyAgICAgICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OworCiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5EeGY7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIEludGVyZmFjZSBmb3IgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlCi0JLy8vIDwvc3VtbWFyeT4KLQlwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUKLQl7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGUgJ2NmUnVsZScgWE1MIG5vZGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIFhtbE5vZGUgTm9kZSB7IGdldDsgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVHlwZSBvZiBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUuIFNUX0NmVHlwZSDCpzE4LjE4LjEyLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgVHlwZSB7IGdldDsgfQorLy8vIDxzdW1tYXJ5PgorLy8vIEludGVyZmFjZSBmb3IgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlICdjZlJ1bGUnIFhNTCBub2RlCisgIC8vLyA8L3N1bW1hcnk+CisgIFhtbE5vZGUgTm9kZSB7IGdldDsgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyA8cGFyYT5SYW5nZSBvdmVyIHdoaWNoIHRoZXNlIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZXMgYXBwbHkuPC9wYXJhPgotICAgIC8vLyA8cGFyYT5UaGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZSBhcmUgZGVmaW5lZCBieSB0aGUKLSAgICAvLy8gU1RfU3FyZWYgc2ltcGxlIHR5cGUgKMKnMTguMTguNzYpLjwvcGFyYT4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIEV4Y2VsQWRkcmVzcyBBZGRyZXNzIHsgZ2V0OyBzZXQ7IH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHlwZSBvZiBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUuIFNUX0NmVHlwZSDCpzE4LjE4LjEyLgorICAvLy8gPC9zdW1tYXJ5PgorICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBUeXBlIHsgZ2V0OyB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVGhlIHByaW9yaXR5IG9mIHRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlLiBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gZGV0ZXJtaW5lCi0JCS8vLyB3aGljaCBmb3JtYXQgc2hvdWxkIGJlIGV2YWx1YXRlZCBhbmQgcmVuZGVyZWQuIExvd2VyIG51bWVyaWMgdmFsdWVzIGFyZSBoaWdoZXIKLQkJLy8vIHByaW9yaXR5IHRoYW4gaGlnaGVyIG51bWVyaWMgdmFsdWVzLCB3aGVyZSAxIGlzIHRoZSBoaWdoZXN0IHByaW9yaXR5LgotCQkvLy8gPC9zdW1tYXJ5PgotICAgIGludCBQcmlvcml0eSB7IGdldDsgc2V0OyB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIDxwYXJhPlJhbmdlIG92ZXIgd2hpY2ggdGhlc2UgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlcyBhcHBseS48L3BhcmE+CisgIC8vLyA8cGFyYT5UaGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZSBhcmUgZGVmaW5lZCBieSB0aGUKKyAgLy8vIFNUX1NxcmVmIHNpbXBsZSB0eXBlICjCpzE4LjE4Ljc2KS48L3BhcmE+CisgIC8vLyA8L3N1bW1hcnk+CisgIEV4Y2VsQWRkcmVzcyBBZGRyZXNzIHsgZ2V0OyBzZXQ7IH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gSWYgdGhpcyBmbGFnIGlzIDEsIG5vIHJ1bGVzIHdpdGggbG93ZXIgcHJpb3JpdHkgc2hhbGwgYmUgYXBwbGllZCBvdmVyIHRoaXMgcnVsZSwKLSAgICAvLy8gd2hlbiB0aGlzIHJ1bGUgZXZhbHVhdGVzIHRvIHRydWUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBib29sIFN0b3BJZlRydWUgeyBnZXQ7IHNldDsgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgcHJpb3JpdHkgb2YgdGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUuIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBkZXRlcm1pbmUKKyAgLy8vIHdoaWNoIGZvcm1hdCBzaG91bGQgYmUgZXZhbHVhdGVkIGFuZCByZW5kZXJlZC4gTG93ZXIgbnVtZXJpYyB2YWx1ZXMgYXJlIGhpZ2hlcgorICAvLy8gcHJpb3JpdHkgdGhhbiBoaWdoZXIgbnVtZXJpYyB2YWx1ZXMsIHdoZXJlIDEgaXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCisgIC8vLyA8L3N1bW1hcnk+CisgIGludCBQcmlvcml0eSB7IGdldDsgc2V0OyB9CiAKLSAgICAvLy8vLyA8c3VtbWFyeT4KLSAgICAvLy8vLyA8cGFyYT5UaGlzIGlzIGFuIGluZGV4IHRvIGEgZHhmIGVsZW1lbnQgaW4gdGhlIFN0eWxlcyBQYXJ0IGluZGljYXRpbmcgd2hpY2ggY2VsbAotICAgIC8vLy8vIGZvcm1hdHRpbmcgdG8gYXBwbHkgd2hlbiB0aGUgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGNyaXRlcmlhIGlzIG1ldC48L3BhcmE+Ci0gICAgLy8vLy8gPHBhcmE+VGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBhdHRyaWJ1dGUgYXJlIGRlZmluZWQgYnkgdGhlIFNUX0R4ZklkIHNpbXBsZSB0eXBlCi0gICAgLy8vLy8gKMKnMTguMTguMjUpLjwvcGFyYT4KLSAgICAvLy8vLyA8L3N1bW1hcnk+Ci0vLyAgICBpbnQgRHhmSWQgeyBnZXQ7IHNldDsgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gR2l2ZXMgYWNjZXNzIHRvIHRoZSBkaWZmZXJlbmNpYWwgc3R5bGluZyAoRFhGKSBmb3IgdGhlIHJ1bGUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nIFN0eWxleyBnZXQ7IH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhpcyBmbGFnIGlzIDEsIG5vIHJ1bGVzIHdpdGggbG93ZXIgcHJpb3JpdHkgc2hhbGwgYmUgYXBwbGllZCBvdmVyIHRoaXMgcnVsZSwKKyAgLy8vIHdoZW4gdGhpcyBydWxlIGV2YWx1YXRlcyB0byB0cnVlLgorICAvLy8gPC9zdW1tYXJ5PgorICBib29sIFN0b3BJZlRydWUgeyBnZXQ7IHNldDsgfQorCisgIC8vLy8vIDxzdW1tYXJ5PgorICAvLy8vLyA8cGFyYT5UaGlzIGlzIGFuIGluZGV4IHRvIGEgZHhmIGVsZW1lbnQgaW4gdGhlIFN0eWxlcyBQYXJ0IGluZGljYXRpbmcgd2hpY2ggY2VsbAorICAvLy8vLyBmb3JtYXR0aW5nIHRvIGFwcGx5IHdoZW4gdGhlIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBjcml0ZXJpYSBpcyBtZXQuPC9wYXJhPgorICAvLy8vLyA8cGFyYT5UaGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGlzIGF0dHJpYnV0ZSBhcmUgZGVmaW5lZCBieSB0aGUgU1RfRHhmSWQgc2ltcGxlIHR5cGUKKyAgLy8vLy8gKMKnMTguMTguMjUpLjwvcGFyYT4KKyAgLy8vLy8gPC9zdW1tYXJ5PgorICAvLyAgICBpbnQgRHhmSWQgeyBnZXQ7IHNldDsgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHaXZlcyBhY2Nlc3MgdG8gdGhlIGRpZmZlcmVuY2lhbCBzdHlsaW5nIChEWEYpIGZvciB0aGUgcnVsZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgRXhjZWxEeGZTdHlsZUNvbmRpdGlvbmFsRm9ybWF0dGluZyBTdHlsZSB7IGdldDsgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXAuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cC5jcwppbmRleCA2YmQ3NjhmLi4xYWNhOTgyIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cC5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMzggKzEzLDI3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLQkvLy8gPHN1bW1hcnk+Ci0gIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cAotCS8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXAKKy8vLyA8c3VtbWFyeT4KKy8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXAKICAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFN0ZERldgotICB7Ci0JCSNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLQkJI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU3RkRGV2IHt9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUuY3MKaW5kZXggZWQyZjExZi4uZWNhNjZkMSAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsNDEgKzEzLDMxIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZQotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUKLSAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUKLQl7Ci0JCSNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVGhyZWUgQ29sb3IgU2NhbGUgTWlkZGxlIFZhbHVlCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIE1pZGRsZVZhbHVlIHsgZ2V0OyBzZXQ7IH0KLQkJI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUKKyAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaHJlZSBDb2xvciBTY2FsZSBNaWRkbGUgVmFsdWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUgTWlkZGxlVmFsdWUgeyBnZXQ7IHNldDsgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0LmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0LmNzCmluZGV4IDM5MjFlYjIuLjBmZGMzOTcgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlSWNvblNldC5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDUxICsxMyw0MSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCi17Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQKLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0PFQ+Ci0gICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0R3JvdXA8VD4KLQl7Ci0JCSNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEljb24xIChwYXJ0IG9mIHRoZSAzLCA0IG91IDUgSWNvbiBTZXQpCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIEljb24xIHsgZ2V0OyB9CisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQ8VD4KKyAgICA6IElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25TZXRHcm91cDxUPiB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEljb24xIChwYXJ0IG9mIHRoZSAzLCA0IG91IDUgSWNvbiBTZXQpCisgIC8vLyA8L3N1bW1hcnk+CisgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSBJY29uMSB7IGdldDsgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBJY29uMiAocGFydCBvZiB0aGUgMywgNCBvdSA1IEljb24gU2V0KQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIEljb24yIHsgZ2V0OyAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJY29uMiAocGFydCBvZiB0aGUgMywgNCBvdSA1IEljb24gU2V0KQorICAvLy8gPC9zdW1tYXJ5PgorICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjIgeyBnZXQ7IH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gSWNvbjMgKHBhcnQgb2YgdGhlIDMsIDQgb3UgNSBJY29uIFNldCkKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSBJY29uMyB7IGdldDsgfQotICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJY29uMyAocGFydCBvZiB0aGUgMywgNCBvdSA1IEljb24gU2V0KQorICAvLy8gPC9zdW1tYXJ5PgorICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjMgeyBnZXQ7IH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cC5jcwppbmRleCBkZGRlNTVlLi4yNjZjMWI4IDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwLmNzCkBAIC0xMywzNyArMTMsMjUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cwotewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZAotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAKLQkJOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlCi0JewotCQkjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0JCSNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLQl9Ci19CisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSB7fQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cC5jcwppbmRleCAyNGY4MjgzLi4yMzRkOTI1IDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cC5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMzggKzEzLDI3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cAorLy8vIDxzdW1tYXJ5PgorLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cAogICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoUmFuawotICB7Ci0gICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSYW5rIHt9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZS5jcwppbmRleCA5MzZlZDBkLi4yNjYyYjlhIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDQ2ICsxMywzNiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCi17Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlCi0JLy8vIDwvc3VtbWFyeT4KLQlwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUKLQkJOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlR3JvdXAKLQl7Ci0JCSNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFR3byBDb2xvciBTY2FsZSBMb3cgVmFsdWUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIExvd1ZhbHVlIHsgZ2V0OyBzZXQ7IH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlCisgICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlR3JvdXAgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUd28gQ29sb3IgU2NhbGUgTG93IFZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIExvd1ZhbHVlIHsgZ2V0OyBzZXQ7IH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVHdvIENvbG9yIFNjYWxlIEhpZ2ggVmFsdWUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIEhpZ2hWYWx1ZSB7IGdldDsgc2V0OyB9Ci0gICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFR3byBDb2xvciBTY2FsZSBIaWdoIFZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIEhpZ2hWYWx1ZSB7IGdldDsgc2V0OyB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMuY3MKaW5kZXggZTVhYTAyMS4uZWU1NTU1MyAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcy5jcwpAQCAtMTMsMzcgKzEzLDI1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzCi0gICAgOiBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlCi0gIHsKLSAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorLy8vIDxzdW1tYXJ5PgorLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSB7fQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYS5jcwppbmRleCBkNWQwZmExLi5kNjEyMDA4IDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYS5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsNDAgKzEzLDMwIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKKy8vLyA8c3VtbWFyeT4KKy8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYQorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEgewogICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYQorICAvLy8gRm9ybXVsYSBBdHRyaWJ1dGUKICAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYQotICB7Ci0gICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRm9ybXVsYSBBdHRyaWJ1dGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHN0cmluZyBGb3JtdWxhIHsgZ2V0OyBzZXQ7IH0KLSAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgIHN0cmluZyBGb3JtdWxhIHsgZ2V0OyBzZXQ7IH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhMi5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhMi5jcwppbmRleCA3YjRlNzBlLi5iN2E5NDBhIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYTIuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEyLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw0MSArMTMsMzAgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cwoteworLy8vIDxzdW1tYXJ5PgorLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhMgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEyIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEgewogICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoRm9ybXVsYTIKKyAgLy8vIEZvcm11bGEyIEF0dHJpYnV0ZQogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhGb3JtdWxhMgotICAgIDogSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aEZvcm11bGEKLSAgewotICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEZvcm11bGEyIEF0dHJpYnV0ZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgc3RyaW5nIEZvcm11bGEyIHsgZ2V0OyBzZXQ7IH0KLSAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgIHN0cmluZyBGb3JtdWxhMiB7IGdldDsgc2V0OyB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoUmFuay5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSYW5rLmNzCmluZGV4IGY1YjBmOTIuLmRlMjIwZWQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSYW5rLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSYW5rLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw0MCArMTMsMzIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCi17CisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFJhbmsKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSYW5rIHsKICAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFJhbmsKKyAgLy8vIFJhbmsgQXR0cmlidXRlCiAgIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFJhbmsKLSAgewotICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFJhbmsgQXR0cmlidXRlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBVSW50MTYgUmFuayB7IGdldDsgc2V0OyB9Ci0gICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICBVSW50MTYgUmFuayB7IGdldDsgc2V0OyB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoUmV2ZXJzZS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSZXZlcnNlLmNzCmluZGV4IGE3MTAzNTQuLjQwNWE4YTUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSZXZlcnNlLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSZXZlcnNlLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw0MCArMTMsMzAgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cwoteworLy8vIDxzdW1tYXJ5PgorLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSZXZlcnNlCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoUmV2ZXJzZSB7CiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSZXZlcnNlCisgIC8vLyBSZXZlcnNlIEF0dHJpYnV0ZQogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhSZXZlcnNlCi0gIHsKLSAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBSZXZlcnNlIEF0dHJpYnV0ZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgYm9vbCBSZXZlcnNlIHsgZ2V0OyBzZXQ7IH0KLSAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgIGJvb2wgUmV2ZXJzZSB7IGdldDsgc2V0OyB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU2hvd1ZhbHVlLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFNob3dWYWx1ZS5jcwppbmRleCBjMTJkYmViLi40Nzk2MjdiIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU2hvd1ZhbHVlLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhTaG93VmFsdWUuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDQwICsxMywzMCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzCi17CisvLy8gPHN1bW1hcnk+CisvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFNob3dWYWx1ZQorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFNob3dWYWx1ZSB7CiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhTaG93VmFsdWUKKyAgLy8vIFNob3dWYWx1ZSBBdHRyaWJ1dGUKICAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU2hvd1ZhbHVlCi0gIHsKLSAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBTaG93VmFsdWUgQXR0cmlidXRlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBib29sIFNob3dWYWx1ZSB7IGdldDsgc2V0OyB9Ci0gICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICBib29sIFNob3dWYWx1ZSB7IGdldDsgc2V0OyB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU3RkRGV2LmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFN0ZERldi5jcwppbmRleCA5NmFlMWM2Li5kM2NmMzMwIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU3RkRGV2LmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhTdGREZXYuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDQwICsxMywzMiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHMKLXsKKy8vLyA8c3VtbWFyeT4KKy8vLyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU3RkRGV2CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoU3RkRGV2IHsKICAgLy8vIDxzdW1tYXJ5PgotICAvLy8gSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nV2l0aFN0ZERldgorICAvLy8gU3RkRGV2IEF0dHJpYnV0ZQogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhTdGREZXYKLSAgewotICAgICNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFN0ZERldiBBdHRyaWJ1dGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIFVJbnQxNiBTdGREZXYgeyBnZXQ7IHNldDsgfQotICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgVUludDE2IFN0ZERldiB7IGdldDsgc2V0OyB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoVGV4dC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhUZXh0LmNzCmluZGV4IDQ2MDJhYzQuLmJmZTkxYTQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhUZXh0LmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhUZXh0LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw0MCArMTMsMzAgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0cwoteworLy8vIDxzdW1tYXJ5PgorLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhUZXh0CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdXaXRoVGV4dCB7CiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhUZXh0CisgIC8vLyBUZXh0IEF0dHJpYnV0ZQogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1dpdGhUZXh0Ci0gIHsKLSAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUZXh0IEF0dHJpYnV0ZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgc3RyaW5nIFRleHQgeyBnZXQ7IHNldDsgfQotICAgICNlbmRyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgc3RyaW5nIFRleHQgeyBnZXQ7IHNldDsgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSVJhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9Db250cmFjdHMvSVJhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nLmNzCmluZGV4IDZiNGY4NWEuLmIyZDk5YmYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvQ29udHJhY3RzL0lSYW5nZUNvbmRpdGlvbmFsRm9ybWF0dGluZy5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0NvbnRyYWN0cy9JUmFuZ2VDb25kaXRpb25hbEZvcm1hdHRpbmcuY3MKQEAgLTEzLDMwMSArMTMsMzA2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICAgICBDaGFuZ2UgICAgICAgICAgICAgICAgICAgIERhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsCQkgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKKwogdXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gUHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgYWRkaW5nIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgdG8gYSByYW5nZSAoPHNlZSBjcmVmPSJFeGNlbFJhbmdlQmFzZSIvPikuCi0JLy8vIEVhY2ggbWV0aG9kIHdpbGwgcmV0dXJuIGEgY29uZmlndXJhYmxlIGNvbmR0aW9uYWwgZm9ybWF0dGluZyB0eXBlLgotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGludGVyZmFjZSBJUmFuZ2VDb25kaXRpb25hbEZvcm1hdHRpbmcKLQl7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGRzIGEgQWJvdmUgQXZlcmFnZSBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAgQWRkQWJvdmVBdmVyYWdlKCk7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBBYm92ZSBPciBFcXVhbCBBdmVyYWdlIHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCBBZGRBYm92ZU9yRXF1YWxBdmVyYWdlKCk7CisvLy8gPHN1bW1hcnk+CisvLy8gUHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgYWRkaW5nIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgdG8gYSByYW5nZSAoPHNlZSBjcmVmPSJFeGNlbFJhbmdlQmFzZSIvPikuCisvLy8gRWFjaCBtZXRob2Qgd2lsbCByZXR1cm4gYSBjb25maWd1cmFibGUgY29uZHRpb25hbCBmb3JtYXR0aW5nIHR5cGUuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJUmFuZ2VDb25kaXRpb25hbEZvcm1hdHRpbmcgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgQWJvdmUgQXZlcmFnZSBydWxlIHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAgQWRkQWJvdmVBdmVyYWdlKCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBCZWxvdyBBdmVyYWdlIHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCBBZGRCZWxvd0F2ZXJhZ2UoKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIEFib3ZlIE9yIEVxdWFsIEF2ZXJhZ2UgcnVsZSB0byB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEFib3ZlT3JFcXVhbEF2ZXJhZ2UoKTsKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIEJlbG93IE9yIEVxdWFsIEF2ZXJhZ2UgcnVsZSB0byB0aGUgcmFuZ2UKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEJlbG93T3JFcXVhbEF2ZXJhZ2UoKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIEJlbG93IEF2ZXJhZ2UgcnVsZSB0byB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEJlbG93QXZlcmFnZSgpOwogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGRzIGEgQWJvdmUgU3RkRGV2IHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwIEFkZEFib3ZlU3RkRGV2KCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBCZWxvdyBPciBFcXVhbCBBdmVyYWdlIHJ1bGUgdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCBBZGRCZWxvd09yRXF1YWxBdmVyYWdlKCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBCZWxvdyBTdGREZXYgcnVsZSB0byB0aGUgcmFuZ2UKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXAgQWRkQmVsb3dTdGREZXYoKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIEFib3ZlIFN0ZERldiBydWxlIHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cCBBZGRBYm92ZVN0ZERldigpOwogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGRzIGEgQm90dG9tIHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwIEFkZEJvdHRvbSgpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgQmVsb3cgU3RkRGV2IHJ1bGUgdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwIEFkZEJlbG93U3RkRGV2KCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBCb3R0b20gUGVyY2VudCBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cCBBZGRCb3R0b21QZXJjZW50KCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBCb3R0b20gcnVsZSB0byB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkQm90dG9tKCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBUb3AgcnVsZSB0byB0aGUgcmFuZ2UKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkVG9wKCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBCb3R0b20gUGVyY2VudCBydWxlIHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cCBBZGRCb3R0b21QZXJjZW50KCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBUb3AgUGVyY2VudCBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cCBBZGRUb3BQZXJjZW50KCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBUb3AgcnVsZSB0byB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkVG9wKCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBMYXN0IDcgRGF5cyBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTGFzdDdEYXlzKCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBUb3AgUGVyY2VudCBydWxlIHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cCBBZGRUb3BQZXJjZW50KCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBMYXN0IE1vbnRoIHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRMYXN0TW9udGgoKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIExhc3QgNyBEYXlzIHJ1bGUgdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRMYXN0N0RheXMoKTsKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIExhc3QgV2VlayBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTGFzdFdlZWsoKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIExhc3QgTW9udGggcnVsZSB0byB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZExhc3RNb250aCgpOwogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGRzIGEgTmV4dCBNb250aCBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTmV4dE1vbnRoKCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBMYXN0IFdlZWsgcnVsZSB0byB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZExhc3RXZWVrKCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBOZXh0IFdlZWsgcnVsZSB0byB0aGUgcmFuZ2UKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZE5leHRXZWVrKCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBOZXh0IE1vbnRoIHJ1bGUgdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGROZXh0TW9udGgoKTsKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIFRoaXMgTW9udGggcnVsZSB0byB0aGUgcmFuZ2UKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFRoaXNNb250aCgpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgTmV4dCBXZWVrIHJ1bGUgdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGROZXh0V2VlaygpOwogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGRzIGEgVGhpcyBXZWVrIHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRUaGlzV2VlaygpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgVGhpcyBNb250aCBydWxlIHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkVGhpc01vbnRoKCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBUb2RheSBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkVG9kYXkoKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIFRoaXMgV2VlayBydWxlIHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkVGhpc1dlZWsoKTsKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIFRvbW9ycm93IHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRUb21vcnJvdygpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgVG9kYXkgcnVsZSB0byB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFRvZGF5KCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBZZXN0ZXJkYXkgcnVsZSB0byB0aGUgcmFuZ2UKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFllc3RlcmRheSgpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgVG9tb3Jyb3cgcnVsZSB0byB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFRvbW9ycm93KCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBCZWdpbnMgV2l0aCBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoIEFkZEJlZ2luc1dpdGgoKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIFllc3RlcmRheSBydWxlIHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkWWVzdGVyZGF5KCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBCZXR3ZWVuIHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4gQWRkQmV0d2VlbigpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgQmVnaW5zIFdpdGggcnVsZSB0byB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aCBBZGRCZWdpbnNXaXRoKCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBDb250YWluc0JsYW5rcyBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcyBBZGRDb250YWluc0JsYW5rcygpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgQmV0d2VlbiBydWxlIHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuIEFkZEJldHdlZW4oKTsKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIENvbnRhaW5zRXJyb3JzIHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzIEFkZENvbnRhaW5zRXJyb3JzKCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBDb250YWluc0JsYW5rcyBydWxlIHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcyBBZGRDb250YWluc0JsYW5rcygpOwogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGRzIGEgQ29udGFpbnNUZXh0IHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dCBBZGRDb250YWluc1RleHQoKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIENvbnRhaW5zRXJyb3JzIHJ1bGUgdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzIEFkZENvbnRhaW5zRXJyb3JzKCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBEdXBsaWNhdGVWYWx1ZXMgcnVsZSB0byB0aGUgcmFuZ2UKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzIEFkZER1cGxpY2F0ZVZhbHVlcygpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgQ29udGFpbnNUZXh0IHJ1bGUgdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dCBBZGRDb250YWluc1RleHQoKTsKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIEVuZHNXaXRoIHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoIEFkZEVuZHNXaXRoKCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBEdXBsaWNhdGVWYWx1ZXMgcnVsZSB0byB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzIEFkZER1cGxpY2F0ZVZhbHVlcygpOwogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGRzIGEgRXF1YWwgcnVsZSB0byB0aGUgcmFuZ2UKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwgQWRkRXF1YWwoKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIEVuZHNXaXRoIHJ1bGUgdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoIEFkZEVuZHNXaXRoKCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBFeHByZXNzaW9uIHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24gQWRkRXhwcmVzc2lvbigpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgRXF1YWwgcnVsZSB0byB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwgQWRkRXF1YWwoKTsKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIEdyZWF0ZXJUaGFuIHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuIEFkZEdyZWF0ZXJUaGFuKCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBFeHByZXNzaW9uIHJ1bGUgdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24gQWRkRXhwcmVzc2lvbigpOwogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGRzIGEgR3JlYXRlclRoYW5PckVxdWFsIHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbCBBZGRHcmVhdGVyVGhhbk9yRXF1YWwoKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIEdyZWF0ZXJUaGFuIHJ1bGUgdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuIEFkZEdyZWF0ZXJUaGFuKCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBMZXNzVGhhbiBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbiBBZGRMZXNzVGhhbigpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgR3JlYXRlclRoYW5PckVxdWFsIHJ1bGUgdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbCBBZGRHcmVhdGVyVGhhbk9yRXF1YWwoKTsKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIExlc3NUaGFuT3JFcXVhbCBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwgQWRkTGVzc1RoYW5PckVxdWFsKCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBMZXNzVGhhbiBydWxlIHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbiBBZGRMZXNzVGhhbigpOwogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGRzIGEgTm90QmV0d2VlbiBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuIEFkZE5vdEJldHdlZW4oKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIExlc3NUaGFuT3JFcXVhbCBydWxlIHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwgQWRkTGVzc1RoYW5PckVxdWFsKCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBOb3RDb250YWluc0JsYW5rcyBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcyBBZGROb3RDb250YWluc0JsYW5rcygpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgTm90QmV0d2VlbiBydWxlIHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuIEFkZE5vdEJldHdlZW4oKTsKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIE5vdENvbnRhaW5zRXJyb3JzIHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzIEFkZE5vdENvbnRhaW5zRXJyb3JzKCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBOb3RDb250YWluc0JsYW5rcyBydWxlIHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcyBBZGROb3RDb250YWluc0JsYW5rcygpOwogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGRzIGEgTm90Q29udGFpbnNUZXh0IHJ1bGUgdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dCBBZGROb3RDb250YWluc1RleHQoKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIE5vdENvbnRhaW5zRXJyb3JzIHJ1bGUgdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzIEFkZE5vdENvbnRhaW5zRXJyb3JzKCk7CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBOb3RFcXVhbCBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbCBBZGROb3RFcXVhbCgpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgTm90Q29udGFpbnNUZXh0IHJ1bGUgdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dCBBZGROb3RDb250YWluc1RleHQoKTsKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIFVuaXF1ZVZhbHVlcyBydWxlIHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMgQWRkVW5pcXVlVmFsdWVzKCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBOb3RFcXVhbCBydWxlIHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbCBBZGROb3RFcXVhbCgpOwogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSIvPiB0byB0aGUgcmFuZ2UKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlIEFkZFRocmVlQ29sb3JTY2FsZSgpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgVW5pcXVlVmFsdWVzIHJ1bGUgdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcyBBZGRVbmlxdWVWYWx1ZXMoKTsKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlIi8+IHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlIEFkZFR3b0NvbG9yU2NhbGUoKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUiLz4gdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSBBZGRUaHJlZUNvbG9yU2NhbGUoKTsKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0Jmx0O2VFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzNJY29uc1NldFR5cGUmZ3Q7Ii8+IHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJJY29uU2V0Ij48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0PGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzNJY29uc1NldFR5cGU+IEFkZFRocmVlSWNvblNldChlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmczSWNvbnNTZXRUeXBlIEljb25TZXQpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQmbHQ7ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZSZndDsiLz4gdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Ikljb25TZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldDxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlPiBBZGRGb3VySWNvblNldChlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlIEljb25TZXQpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQiLz4gdG8gdGhlIHJhbmdlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Ikljb25TZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldCBBZGRGaXZlSWNvblNldChlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc1SWNvbnNTZXRUeXBlIEljb25TZXQpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhckdyb3VwIi8+IHRvIHRoZSByYW5nZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJjb2xvciI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXJHcm91cCBBZGREYXRhYmFyKENvbG9yIGNvbG9yKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUiLz4gdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUgQWRkVHdvQ29sb3JTY2FsZSgpOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSA8c2VlIGNyZWY9IklFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlSWNvblNldCZsdDtlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmczSWNvbnNTZXRUeXBlJmd0OyIvPiB0byB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpY29uU2V0Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nM0ljb25zU2V0VHlwZT4gQWRkVGhyZWVJY29uU2V0KAorICAgICAgZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nM0ljb25zU2V0VHlwZSBpY29uU2V0KTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldCZsdDtlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlJmd0OyIvPiB0byB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpY29uU2V0Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldDxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlPiBBZGRGb3VySWNvblNldCgKKyAgICAgIGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzRJY29uc1NldFR5cGUgaWNvblNldCk7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQiLz4gdG8gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iaWNvblNldCI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQgQWRkRml2ZUljb25TZXQoCisgICAgICBlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc1SWNvbnNTZXRUeXBlIGljb25TZXQpOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSA8c2VlIGNyZWY9IklFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXJHcm91cCIvPiB0byB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2xvciI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhckdyb3VwIEFkZERhdGFiYXIoQ29sb3IgY29sb3IpOworfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbGxlY3Rpb24uY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sbGVjdGlvbi5jcwppbmRleCA5NjliY2QxLi40ZmU0MmY0IDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sbGVjdGlvbi5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sbGVjdGlvbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsOTg3ICsxMyw4NTcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQlDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwJCUNvbmRpdGlvbmFsIEZvcm1hdHRpbmcgICAgICAgICAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7CiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwotdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gQ29sbGVjdGlvbiBvZiA8c2VlIGNyZWY9IkV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSIvPi4KLSAgLy8vIFRoaXMgY2xhc3MgaXMgcHJvdmlkaW5nIHRoZSBBUEkgZm9yIEVQUGx1cyBjb25kaXRpb25hbCBmb3JtYXR0aW5nLgotICAvLy8gPC9zdW1tYXJ5PgotICAvLy8gPHJlbWFya3M+Ci0gIC8vLyA8cGFyYT4KLSAgLy8vIFRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIChBZGRbLi4uXUNvbmRpdGlvbmFsRm9ybWF0dGluZykgd2lsbCBjcmVhdGUgYSBDb25kaXRpb25hbEZvcm1hdHRpbmcvQ2ZSdWxlIGVudHJ5IGluIHRoZSB3b3Jrc2hlZXQuIFdoZW4gdGhpcwotICAvLy8gQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBoYXMgYmVlbiBjcmVhdGVkIGNoYW5nZXMgdG8gdGhlIHByb3BlcnRpZXMgd2lsbCBhZmZlY3QgdGhlIHdvcmtib29rIGltbWVkaWF0ZWx5LgotICAvLy8gPC9wYXJhPgotICAvLy8gPHBhcmE+Ci0gIC8vLyBFYWNoIHR5cGUgb2YgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBSdWxlIGhhcyBkaWZlcmVudGUgc2V0IG9mIHByb3BlcnRpZXMuCi0gIC8vLyA8L3BhcmE+Ci0gIC8vLyA8Y29kZT4KLSAgLy8vIC8vIEFkZCBhIFRocmVlIENvbG9yIFNjYWxlIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcKLSAgLy8vIHZhciBjZiA9IHdvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkVGhyZWVDb2xvclNjYWxlKG5ldyBFeGNlbEFkZHJlc3MoIkExOkMxMCIpKTsKLSAgLy8vIC8vIFNldCB0aGUgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBwcm9wZXJ0aWVzCi0gIC8vLyBjZi5Mb3dWYWx1ZS5UeXBlID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWluOwotICAvLy8gY2YuTG93VmFsdWUuQ29sb3IgPSBDb2xvci5XaGl0ZTsKLSAgLy8vIGNmLk1pZGRsZVZhbHVlLlR5cGUgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50OwotICAvLy8gY2YuTWlkZGxlVmFsdWUuVmFsdWUgPSA1MDsKLSAgLy8vIGNmLk1pZGRsZVZhbHVlLkNvbG9yID0gQ29sb3IuQmx1ZTsKLSAgLy8vIGNmLkhpZ2hWYWx1ZS5UeXBlID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWF4OwotICAvLy8gY2YuSGlnaFZhbHVlLkNvbG9yID0gQ29sb3IuQmxhY2s7Ci0gIC8vLyA8L2NvZGU+Ci0gIC8vLyA8L3JlbWFya3M+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbGxlY3Rpb24KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworLy8vIDxzdW1tYXJ5PgorLy8vIENvbGxlY3Rpb24gb2YgPHNlZSBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUiLz4uCisvLy8gVGhpcyBjbGFzcyBpcyBwcm92aWRpbmcgdGhlIEFQSSBmb3IgRVBQbHVzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcuCisvLy8gPC9zdW1tYXJ5PgorLy8vIDxyZW1hcmtzPgorLy8vIDxwYXJhPgorLy8vIFRoZSBwdWJsaWMgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIChBZGRbLi4uXUNvbmRpdGlvbmFsRm9ybWF0dGluZykgd2lsbCBjcmVhdGUgYSBDb25kaXRpb25hbEZvcm1hdHRpbmcvQ2ZSdWxlIGVudHJ5IGluIHRoZSB3b3Jrc2hlZXQuIFdoZW4gdGhpcworLy8vIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgaGFzIGJlZW4gY3JlYXRlZCBjaGFuZ2VzIHRvIHRoZSBwcm9wZXJ0aWVzIHdpbGwgYWZmZWN0IHRoZSB3b3JrYm9vayBpbW1lZGlhdGVseS4KKy8vLyA8L3BhcmE+CisvLy8gPHBhcmE+CisvLy8gRWFjaCB0eXBlIG9mIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZSBoYXMgZGlmZXJlbnRlIHNldCBvZiBwcm9wZXJ0aWVzLgorLy8vIDwvcGFyYT4KKy8vLyA8Y29kZT4KKy8vLyAvLyBBZGQgYSBUaHJlZSBDb2xvciBTY2FsZSBjb25kaXRpb25hbCBmb3JtYXR0aW5nCisvLy8gdmFyIGNmID0gd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUaHJlZUNvbG9yU2NhbGUobmV3IEV4Y2VsQWRkcmVzcygiQTE6QzEwIikpOworLy8vIC8vIFNldCB0aGUgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBwcm9wZXJ0aWVzCisvLy8gY2YuTG93VmFsdWUuVHlwZSA9IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1pbjsKKy8vLyBjZi5Mb3dWYWx1ZS5Db2xvciA9IENvbG9yLldoaXRlOworLy8vIGNmLk1pZGRsZVZhbHVlLlR5cGUgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50OworLy8vIGNmLk1pZGRsZVZhbHVlLlZhbHVlID0gNTA7CisvLy8gY2YuTWlkZGxlVmFsdWUuQ29sb3IgPSBDb2xvci5CbHVlOworLy8vIGNmLkhpZ2hWYWx1ZS5UeXBlID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWF4OworLy8vIGNmLkhpZ2hWYWx1ZS5Db2xvciA9IENvbG9yLkJsYWNrOworLy8vIDwvY29kZT4KKy8vLyA8L3JlbWFya3M+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xsZWN0aW9uCiAgICAgOiBYbWxIZWxwZXIsCi0gICAgSUVudW1lcmFibGU8SUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZT4KLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgSUVudW1lcmFibGU8SUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZT4geworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgICNyZWdpb24gUHJpdmF0ZSBQcm9wZXJ0aWVzCi0gICAgcHJpdmF0ZSBMaXN0PElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGU+IF9ydWxlcyA9IG5ldyBMaXN0PElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGU+KCk7Ci0gICAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0ID0gbnVsbDsKLSAgICAjZW5kcmVnaW9uIFByaXZhdGUgUHJvcGVydGllcwogCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIHByaXZhdGUgTGlzdDxJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlPiBfcnVsZXMgPSBuZXcoKTsKKyAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OwogCi0gICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEluaXRpYWxpemUgdGhlIDxzZWUgY3JlZj0iRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xsZWN0aW9uIi8+Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbGxlY3Rpb24oCi0gICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCi0gICAgICA6IGJhc2UoCi0gICAgICAgIHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyLAotICAgICAgICB3b3Jrc2hlZXQuV29ya3NoZWV0WG1sLkRvY3VtZW50RWxlbWVudCkKLSAgICB7Ci0gICAgICBSZXF1aXJlLkFyZ3VtZW50KHdvcmtzaGVldCkuSXNOb3ROdWxsKCJ3b3Jrc2hlZXQiKTsKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICAgIF93b3Jrc2hlZXQgPSB3b3Jrc2hlZXQ7Ci0gICAgICBTY2hlbWFOb2RlT3JkZXIgPSBfd29ya3NoZWV0LlNjaGVtYU5vZGVPcmRlcjsKIAotICAgICAgLy8gTG9vayBmb3IgYWxsIHRoZSA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPgotICAgICAgdmFyIGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGVzID0gVG9wTm9kZS5TZWxlY3ROb2RlcygKLSAgICAgICAgIi8vIiArIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNvbmRpdGlvbmFsRm9ybWF0dGluZywKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW5pdGlhbGl6ZSB0aGUgPHNlZSBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbGxlY3Rpb24iLz4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sbGVjdGlvbihFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCisgICAgICA6IGJhc2Uod29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIsIHdvcmtzaGVldC5Xb3Jrc2hlZXRYbWwuRG9jdW1lbnRFbGVtZW50KSB7CisgICAgUmVxdWlyZS5Bcmd1bWVudCh3b3Jrc2hlZXQpLklzTm90TnVsbCgid29ya3NoZWV0Iik7CisKKyAgICBfd29ya3NoZWV0ID0gd29ya3NoZWV0OworICAgIFNjaGVtYU5vZGVPcmRlciA9IF93b3Jrc2hlZXQuU2NoZW1hTm9kZU9yZGVyOworCisgICAgLy8gTG9vayBmb3IgYWxsIHRoZSA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPgorICAgIHZhciBjb25kaXRpb25hbEZvcm1hdHRpbmdOb2RlcyA9IFRvcE5vZGUuU2VsZWN0Tm9kZXMoCisgICAgICAgICIvLyIgKyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fY29uZGl0aW9uYWxGb3JtYXR0aW5nLAogICAgICAgICBfd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpOwogCi0gICAgICAvLyBDaGVjayBpZiB3ZSBmb3VuZCBhdCBsZWFzdCAxIG5vZGUKLSAgICAgIGlmICgoY29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZXMgIT0gbnVsbCkKLSAgICAgICAgJiYgKGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGVzLkNvdW50ID4gMCkpCi0gICAgICB7Ci0gICAgICAgIC8vIEZvcmVhY2ggPGNvbmRpdGlvbmFsRm9ybWF0dGluZz4KLSAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBjb25kaXRpb25hbEZvcm1hdHRpbmdOb2RlIGluIGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGVzKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQ2hlY2sgaWYgQHNxcmVmIGF0dHJpYnV0ZSBleGlzdHMKLSAgICAgICAgICBpZiAoY29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZS5BdHRyaWJ1dGVzW0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuU3FyZWZdID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk1pc3NpbmdTcXJlZkF0dHJpYnV0ZSk7Ci0gICAgICAgICAgfQorICAgIC8vIENoZWNrIGlmIHdlIGZvdW5kIGF0IGxlYXN0IDEgbm9kZQorICAgIGlmICgoY29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZXMgIT0gbnVsbCkgJiYgKGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGVzLkNvdW50ID4gMCkpIHsKKyAgICAgIC8vIEZvcmVhY2ggPGNvbmRpdGlvbmFsRm9ybWF0dGluZz4KKyAgICAgIGZvcmVhY2ggKFhtbE5vZGUgY29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZSBpbiBjb25kaXRpb25hbEZvcm1hdHRpbmdOb2RlcykgeworICAgICAgICAvLyBDaGVjayBpZiBAc3FyZWYgYXR0cmlidXRlIGV4aXN0cworICAgICAgICBpZiAoY29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZS5BdHRyaWJ1dGVzW0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzCisgICAgICAgICAgICAgICAgICAuQXR0cmlidXRlcworICAgICAgICAgICAgICAgICAgLl9zcXJlZl0gPT0gbnVsbCkgeworICAgICAgICAgIHRocm93IG5ldyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuX21pc3NpbmdTcXJlZkF0dHJpYnV0ZSk7CisgICAgICAgIH0KIAotICAgICAgICAgIC8vIEdldCB0aGUgQHNxcmVmIGF0dHJpYnV0ZQotICAgICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzcygKLSAgICAgICAgICAgIGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGUuQXR0cmlidXRlc1tFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5BdHRyaWJ1dGVzLlNxcmVmXS5WYWx1ZSk7CisgICAgICAgIC8vIEdldCB0aGUgQHNxcmVmIGF0dHJpYnV0ZQorICAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcyA9IG5ldyBFeGNlbEFkZHJlc3MoCisgICAgICAgICAgICBjb25kaXRpb25hbEZvcm1hdHRpbmdOb2RlLkF0dHJpYnV0ZXNbRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMKKyAgICAgICAgICAgICAgICAgIC5BdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAuX3NxcmVmXS5WYWx1ZSk7CiAKLSAgICAgICAgICAvLyBDaGVjayBmb3IgYWxsIHRoZSA8Y2ZSdWxlcz4gbm9kZXMgYW5kIGxvYWQgdGhlbQotICAgICAgICAgIHZhciBjZlJ1bGVOb2RlcyA9IGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGUuU2VsZWN0Tm9kZXMoCi0gICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5DZlJ1bGUsCisgICAgICAgIC8vIENoZWNrIGZvciBhbGwgdGhlIDxjZlJ1bGVzPiBub2RlcyBhbmQgbG9hZCB0aGVtCisgICAgICAgIHZhciBjZlJ1bGVOb2RlcyA9IGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGUuU2VsZWN0Tm9kZXMoCisgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fY2ZSdWxlLAogICAgICAgICAgICAgX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKTsKIAotICAgICAgICAgIC8vIEZvcmVhY2ggPGNmUnVsZT4gaW5zaWRlIHRoZSBjdXJyZW50IDxjb25kaXRpb25hbEZvcm1hdHRpbmc+Ci0gICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBjZlJ1bGVOb2RlIGluIGNmUnVsZU5vZGVzKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIENoZWNrIGlmIEB0eXBlIGF0dHJpYnV0ZSBleGlzdHMKLSAgICAgICAgICAgIGlmIChjZlJ1bGVOb2RlLkF0dHJpYnV0ZXNbRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQXR0cmlidXRlcy5UeXBlXSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5NaXNzaW5nVHlwZUF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIC8vIEZvcmVhY2ggPGNmUnVsZT4gaW5zaWRlIHRoZSBjdXJyZW50IDxjb25kaXRpb25hbEZvcm1hdHRpbmc+CisgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgY2ZSdWxlTm9kZSBpbiBjZlJ1bGVOb2RlcykgeworICAgICAgICAgIC8vIENoZWNrIGlmIEB0eXBlIGF0dHJpYnV0ZSBleGlzdHMKKyAgICAgICAgICBpZiAoY2ZSdWxlTm9kZS5BdHRyaWJ1dGVzW0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuX3R5cGVdID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuX21pc3NpbmdUeXBlQXR0cmlidXRlKTsKKyAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIENoZWNrIGlmIEBwcmlvcml0eSBhdHRyaWJ1dGUgZXhpc3RzCi0gICAgICAgICAgICBpZiAoY2ZSdWxlTm9kZS5BdHRyaWJ1dGVzW0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuUHJpb3JpdHldID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk1pc3NpbmdQcmlvcml0eUF0dHJpYnV0ZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgLy8gQ2hlY2sgaWYgQHByaW9yaXR5IGF0dHJpYnV0ZSBleGlzdHMKKyAgICAgICAgICBpZiAoY2ZSdWxlTm9kZS5BdHRyaWJ1dGVzW0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuX3ByaW9yaXR5XQorICAgICAgICAgICAgICA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLl9taXNzaW5nUHJpb3JpdHlBdHRyaWJ1dGUpOworICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gR2V0IHRoZSA8Y2ZSdWxlPiBtYWluIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgIHN0cmluZyB0eXBlQXR0cmlidXRlID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdIZWxwZXIuR2V0QXR0cmlidXRlU3RyaW5nKAorICAgICAgICAgIC8vIEdldCB0aGUgPGNmUnVsZT4gbWFpbiBhdHRyaWJ1dGVzCisgICAgICAgICAgc3RyaW5nIHR5cGVBdHRyaWJ1dGUgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5HZXRBdHRyaWJ1dGVTdHJpbmcoCiAgICAgICAgICAgICAgIGNmUnVsZU5vZGUsCi0gICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuVHlwZSk7CisgICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuX3R5cGUpOwogCi0gICAgICAgICAgICBpbnQgcHJpb3JpdHkgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5HZXRBdHRyaWJ1dGVJbnQoCisgICAgICAgICAgaW50IHByaW9yaXR5ID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdIZWxwZXIuR2V0QXR0cmlidXRlSW50KAogICAgICAgICAgICAgICBjZlJ1bGVOb2RlLAotICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5BdHRyaWJ1dGVzLlByaW9yaXR5KTsKKyAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQXR0cmlidXRlcy5fcHJpb3JpdHkpOwogCi0gICAgICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIEB0eXBlIGF0dHJpYnV0ZSB0byBFUFBsdXMgUnVsZSBUeXBlIChzbGlnaHR5IGRpZmVyZW50ZSkKLSAgICAgICAgICAgIHZhciB0eXBlID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5HZXRUeXBlQnlBdHRyYml1dGUoCisgICAgICAgICAgLy8gVHJhbnNmb3JtIHRoZSBAdHlwZSBhdHRyaWJ1dGUgdG8gRVBQbHVzIFJ1bGUgVHlwZSAoc2xpZ2h0eSBkaWZlcmVudGUpCisgICAgICAgICAgdmFyIHR5cGUgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdldFR5cGVCeUF0dHJiaXV0ZSgKICAgICAgICAgICAgICAgdHlwZUF0dHJpYnV0ZSwKICAgICAgICAgICAgICAgY2ZSdWxlTm9kZSwKICAgICAgICAgICAgICAgX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKTsKIAotICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBSdWxlIGFjY29yZGluZyB0byB0aGUgY29ycmVjdCB0eXBlLCBhZGRyZXNzIGFuZCBwcmlvcml0eQotICAgICAgICAgICAgdmFyIGNmUnVsZSA9IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZUZhY3RvcnkuQ3JlYXRlKAorICAgICAgICAgIC8vIENyZWF0ZSB0aGUgUnVsZSBhY2NvcmRpbmcgdG8gdGhlIGNvcnJlY3QgdHlwZSwgYWRkcmVzcyBhbmQgcHJpb3JpdHkKKyAgICAgICAgICB2YXIgY2ZSdWxlID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlRmFjdG9yeS5DcmVhdGUoCiAgICAgICAgICAgICAgIHR5cGUsCiAgICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgICBfd29ya3NoZWV0LAogICAgICAgICAgICAgICBjZlJ1bGVOb2RlKTsKIAotICAgICAgICAgICAgLy8gQWRkIHRoZSBuZXcgcnVsZSB0byB0aGUgbGlzdAotICAgICAgICAgICAgaWYoY2ZSdWxlIT1udWxsKQotICAgICAgICAgICAgICBfcnVsZXMuQWRkKGNmUnVsZSk7CisgICAgICAgICAgLy8gQWRkIHRoZSBuZXcgcnVsZSB0byB0aGUgbGlzdAorICAgICAgICAgIGlmIChjZlJ1bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgX3J1bGVzLkFkZChjZlJ1bGUpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgIH0KLSAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworICB9CiAKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICAjcmVnaW9uIE1ldGhvZHMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHJpdmF0ZSB2b2lkIEVuc3VyZVJvb3RFbGVtZW50RXhpc3RzKCkKLSAgICB7Ci0gICAgICAvLyBGaW5kIHRoZSA8d29ya3NoZWV0PiBub2RlCi0gICAgICBpZiAoX3dvcmtzaGVldC5Xb3Jrc2hlZXRYbWwuRG9jdW1lbnRFbGVtZW50ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk1pc3NpbmdXb3Jrc2hlZXROb2RlKTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICBwcml2YXRlIHZvaWQgRW5zdXJlUm9vdEVsZW1lbnRFeGlzdHMoKSB7CisgICAgLy8gRmluZCB0aGUgPHdvcmtzaGVldD4gbm9kZQorICAgIGlmIChfd29ya3NoZWV0LldvcmtzaGVldFhtbC5Eb2N1bWVudEVsZW1lbnQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5fbWlzc2luZ1dvcmtzaGVldE5vZGUpOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldFJvb3ROb2RlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHByaXZhdGUgWG1sTm9kZSBHZXRSb290Tm9kZSgpIHsKKyAgICBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpOworICAgIHJldHVybiBfd29ya3NoZWV0LldvcmtzaGVldFhtbC5Eb2N1bWVudEVsZW1lbnQ7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBWYWxpZGF0ZXMgYWRkcmVzcyAtIG5vdCBlbXB0eSAoY29sbGlzaW9ucyBhcmUgYWxsb3dkZWQpCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHJpdmF0ZSBFeGNlbEFkZHJlc3MgVmFsaWRhdGVBZGRyZXNzKEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgUmVxdWlyZS5Bcmd1bWVudChhZGRyZXNzKS5Jc05vdE51bGwoImFkZHJlc3MiKTsKKworICAgIC8vVE9ETzogQXJlIHRoZXJlIGFueSBvdGhlciB2YWxpZGF0aW9uIHdlIG5lZWQgdG8gZG8/CisgICAgcmV0dXJuIGFkZHJlc3M7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXQgdGhlIG5leHQgcHJpb3JpdHkgc2VxdWVuY2lhbCBudW1iZXIKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHJpdmF0ZSBpbnQgR2V0TmV4dFByaW9yaXR5KCkgeworICAgIC8vIENvbnNpZGVyIHplcm8gYXMgdGhlIGxhc3QgcHJpb3JpdHkgd2hlbiB3ZSBoYXZlIG5vIENGIHJ1bGVzCisgICAgaW50IGxhc3RQcmlvcml0eSA9IDA7CisKKyAgICAvLyBTZWFyY2ggZm9yIHRoZSBsYXN0IHByaW9yaXR5CisgICAgZm9yZWFjaCAodmFyIGNmUnVsZSBpbiBfcnVsZXMpIHsKKyAgICAgIGlmIChjZlJ1bGUuUHJpb3JpdHkgPiBsYXN0UHJpb3JpdHkpIHsKKyAgICAgICAgbGFzdFByaW9yaXR5ID0gY2ZSdWxlLlByaW9yaXR5OwogICAgICAgfQogICAgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gR2V0Um9vdE5vZGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHJpdmF0ZSBYbWxOb2RlIEdldFJvb3ROb2RlKCkKLSAgICB7Ci0gICAgICBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpOwotICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuV29ya3NoZWV0WG1sLkRvY3VtZW50RWxlbWVudDsKLSAgICB9CisgICAgLy8gT3VyIG5leHQgcHJpb3JpdHkgaXMgdGhlIGxhc3QgcGx1cyBvbmUKKyAgICByZXR1cm4gbGFzdFByaW9yaXR5ICsgMTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBWYWxpZGF0ZXMgYWRkcmVzcyAtIG5vdCBlbXB0eSAoY29sbGlzaW9ucyBhcmUgYWxsb3dkZWQpCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwcml2YXRlIEV4Y2VsQWRkcmVzcyBWYWxpZGF0ZUFkZHJlc3MoCi0gICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKLSAgICB7Ci0gICAgICBSZXF1aXJlLkFyZ3VtZW50KGFkZHJlc3MpLklzTm90TnVsbCgiYWRkcmVzcyIpOworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgICAgLy9UT0RPOiBBcmUgdGhlcmUgYW55IG90aGVyIHZhbGlkYXRpb24gd2UgbmVlZCB0byBkbz8KLSAgICAgIHJldHVybiBhZGRyZXNzOwotICAgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gR2V0IHRoZSBuZXh0IHByaW9yaXR5IHNlcXVlbmNpYWwgbnVtYmVyCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHByaXZhdGUgaW50IEdldE5leHRQcmlvcml0eSgpCi0gICAgewotICAgICAgLy8gQ29uc2lkZXIgemVybyBhcyB0aGUgbGFzdCBwcmlvcml0eSB3aGVuIHdlIGhhdmUgbm8gQ0YgcnVsZXMKLSAgICAgIGludCBsYXN0UHJpb3JpdHkgPSAwOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOdW1iZXIgb2YgdmFsaWRhdGlvbnMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBDb3VudCA9PiBfcnVsZXMuQ291bnQ7CiAKLSAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGxhc3QgcHJpb3JpdHkKLSAgICAgIGZvcmVhY2ggKHZhciBjZlJ1bGUgaW4gX3J1bGVzKQotICAgICAgewotICAgICAgICBpZiAoY2ZSdWxlLlByaW9yaXR5ID4gbGFzdFByaW9yaXR5KQotICAgICAgICB7Ci0gICAgICAgICAgbGFzdFByaW9yaXR5ID0gY2ZSdWxlLlByaW9yaXR5OwotICAgICAgICB9Ci0gICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluZGV4IG9wZXJhdG9yLCByZXR1cm5zIGJ5IDAtYmFzZWQgaW5kZXgKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpbmRleCI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUgdGhpc1tpbnQgaW5kZXhdIHsKKyAgICBnZXQgPT4gX3J1bGVzW2luZGV4XTsKKyAgICBzZXQgPT4gX3J1bGVzW2luZGV4XSA9IHZhbHVlOworICB9CiAKLSAgICAgIC8vIE91ciBuZXh0IHByaW9yaXR5IGlzIHRoZSBsYXN0IHBsdXMgb25lCi0gICAgICByZXR1cm4gbGFzdFByaW9yaXR5ICsgMTsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBNZXRob2RzCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldCB0aGUgJ2NmUnVsZScgZW51bWVyYXRvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBJRW51bWVyYXRvcjxJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlPiBJRW51bWVyYWJsZTxJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlPi5HZXRFbnVtZXJhdG9yKCkgeworICAgIHJldHVybiBfcnVsZXMuR2V0RW51bWVyYXRvcigpOworICB9CiAKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0IHRoZSAnY2ZSdWxlJyBlbnVtZXJhdG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKSB7CisgICAgcmV0dXJuIF9ydWxlcy5HZXRFbnVtZXJhdG9yKCk7CisgIH0KIAotICAgICNyZWdpb24gSUVudW1lcmFibGU8SUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nPgotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTnVtYmVyIG9mIHZhbGlkYXRpb25zCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgaW50IENvdW50Ci0gICAgewotICAgICAgZ2V0IHsgcmV0dXJuIF9ydWxlcy5Db3VudDsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gSW5kZXggb3BlcmF0b3IsIHJldHVybnMgYnkgMC1iYXNlZCBpbmRleAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpbmRleCI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlIHRoaXNbaW50IGluZGV4XQotICAgIHsKLSAgICAgIGdldCB7IHJldHVybiBfcnVsZXNbaW5kZXhdOyB9Ci0gICAgICBzZXQgeyBfcnVsZXNbaW5kZXhdID0gdmFsdWU7IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEdldCB0aGUgJ2NmUnVsZScgZW51bWVyYXRvcgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRW51bWVyYXRvcjxJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlPiBJRW51bWVyYWJsZTxJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlPi5HZXRFbnVtZXJhdG9yKCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3J1bGVzLkdldEVudW1lcmF0b3IoKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEdldCB0aGUgJ2NmUnVsZScgZW51bWVyYXRvcgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBJRW51bWVyYXRvciBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCi0gICAgewotICAgICAgcmV0dXJuIF9ydWxlcy5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBSZW1vdmVzIGFsbCAnY2ZSdWxlJyBmcm9tIHRoZSBjb2xsZWN0aW9uIGFuZCBmcm9tIHRoZSBYTUwuCi0gICAgLy8vIDxyZW1hcmtzPgotICAgIC8vLyBUaGlzIGlzIHRoZSBzYW1lIGFzIHJlbW92aW5nIGFsbCB0aGUgJ2NvbmRpdGlvbmFsRm9ybWF0dGluZycgbm9kZXMuCi0gICAgLy8vIDwvcmVtYXJrcz4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyB2b2lkIFJlbW92ZUFsbCgpCi0gICAgewotICAgICAgLy8gTG9vayBmb3IgYWxsIHRoZSA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPiBub2RlcwotICAgICAgdmFyIGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGVzID0gVG9wTm9kZS5TZWxlY3ROb2RlcygKLSAgICAgICAgIi8vIiArIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNvbmRpdGlvbmFsRm9ybWF0dGluZywKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmVtb3ZlcyBhbGwgJ2NmUnVsZScgZnJvbSB0aGUgY29sbGVjdGlvbiBhbmQgZnJvbSB0aGUgWE1MLgorICAvLy8gPHJlbWFya3M+CisgIC8vLyBUaGlzIGlzIHRoZSBzYW1lIGFzIHJlbW92aW5nIGFsbCB0aGUgJ2NvbmRpdGlvbmFsRm9ybWF0dGluZycgbm9kZXMuCisgIC8vLyA8L3JlbWFya3M+CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyB2b2lkIFJlbW92ZUFsbCgpIHsKKyAgICAvLyBMb29rIGZvciBhbGwgdGhlIDxjb25kaXRpb25hbEZvcm1hdHRpbmc+IG5vZGVzCisgICAgdmFyIGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGVzID0gVG9wTm9kZS5TZWxlY3ROb2RlcygKKyAgICAgICAgIi8vIiArIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9jb25kaXRpb25hbEZvcm1hdHRpbmcsCiAgICAgICAgIF93b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlcik7CiAKLSAgICAgIC8vIFJlbW92ZSBhbGwgdGhlIDxjb25kaXRpb25hbEZvcm1hdHRpbmc+IG5vZGVzIG9uZSBieSBvbmUKLSAgICAgIGZvcmVhY2ggKFhtbE5vZGUgY29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZSBpbiBjb25kaXRpb25hbEZvcm1hdHRpbmdOb2RlcykKLSAgICAgIHsKLSAgICAgICAgY29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGUpOwotICAgICAgfQotCi0gICAgICAvLyBDbGVhciB0aGUgPGNmUnVsZT4gaXRlbSBsaXN0Ci0gICAgICBfcnVsZXMuQ2xlYXIoKTsKKyAgICAvLyBSZW1vdmUgYWxsIHRoZSA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPiBub2RlcyBvbmUgYnkgb25lCisgICAgZm9yZWFjaCAoWG1sTm9kZSBjb25kaXRpb25hbEZvcm1hdHRpbmdOb2RlIGluIGNvbmRpdGlvbmFsRm9ybWF0dGluZ05vZGVzKSB7CisgICAgICBjb25kaXRpb25hbEZvcm1hdHRpbmdOb2RlLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQoY29uZGl0aW9uYWxGb3JtYXR0aW5nTm9kZSk7CiAgICAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBSZW1vdmUgYSBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGUgYnkgaXRzIG9iamVjdAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtIj48L3BhcmFtPgotICAgIHB1YmxpYyB2b2lkIFJlbW92ZSgKLSAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUgaXRlbSkKLSAgICB7Ci0gICAgICBSZXF1aXJlLkFyZ3VtZW50KGl0ZW0pLklzTm90TnVsbCgiaXRlbSIpOworICAgIC8vIENsZWFyIHRoZSA8Y2ZSdWxlPiBpdGVtIGxpc3QKKyAgICBfcnVsZXMuQ2xlYXIoKTsKKyAgfQogCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgLy8gUG9pbnQgdG8gdGhlIHBhcmVudCBub2RlCi0gICAgICAgIHZhciBvbGRQYXJlbnROb2RlID0gaXRlbS5Ob2RlLlBhcmVudE5vZGU7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJlbW92ZSBhIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZSBieSBpdHMgb2JqZWN0CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbSI+PC9wYXJhbT4KKyAgcHVibGljIHZvaWQgUmVtb3ZlKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUgaXRlbSkgeworICAgIFJlcXVpcmUuQXJndW1lbnQoaXRlbSkuSXNOb3ROdWxsKCJpdGVtIik7CiAKLSAgICAgICAgLy8gUmVtb3ZlIHRoZSA8Y2ZSdWxlPiBmcm9tIHRoZSBvbGQgPGNvbmRpdGlvbmFsRm9ybWF0dGluZz4gcGFyZW50IG5vZGUKLSAgICAgICAgb2xkUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChpdGVtLk5vZGUpOworICAgIHRyeSB7CisgICAgICAvLyBQb2ludCB0byB0aGUgcGFyZW50IG5vZGUKKyAgICAgIHZhciBvbGRQYXJlbnROb2RlID0gaXRlbS5Ob2RlLlBhcmVudE5vZGU7CiAKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG9sZCA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPiBwYXJlbnQgbm9kZSBoYXMgPGNmUnVsZT4gbm9kZSBpbnNpZGUgaXQKLSAgICAgICAgaWYgKCFvbGRQYXJlbnROb2RlLkhhc0NoaWxkTm9kZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBSZW1vdmUgdGhlIG9sZCBwYXJlbnQgbm9kZQotICAgICAgICAgIG9sZFBhcmVudE5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChvbGRQYXJlbnROb2RlKTsKLSAgICAgICAgfQorICAgICAgLy8gUmVtb3ZlIHRoZSA8Y2ZSdWxlPiBmcm9tIHRoZSBvbGQgPGNvbmRpdGlvbmFsRm9ybWF0dGluZz4gcGFyZW50IG5vZGUKKyAgICAgIG9sZFBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQoaXRlbS5Ob2RlKTsKIAotICAgICAgICBfcnVsZXMuUmVtb3ZlKGl0ZW0pOworICAgICAgLy8gQ2hlY2sgaWYgdGhlIG9sZCA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPiBwYXJlbnQgbm9kZSBoYXMgPGNmUnVsZT4gbm9kZSBpbnNpZGUgaXQKKyAgICAgIGlmICghb2xkUGFyZW50Tm9kZS5IYXNDaGlsZE5vZGVzKSB7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgb2xkIHBhcmVudCBub2RlCisgICAgICAgIG9sZFBhcmVudE5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChvbGRQYXJlbnROb2RlKTsKICAgICAgIH0KLSAgICAgIGNhdGNoCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLkludmFsaWRSZW1vdmVSdWxlT3BlcmF0aW9uKTsKLSAgICAgIH0KKworICAgICAgX3J1bGVzLlJlbW92ZShpdGVtKTsKKyAgICB9IGNhdGNoIHsKKyAgICAgIHRocm93IG5ldyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuX2ludmFsaWRSZW1vdmVSdWxlT3BlcmF0aW9uKTsKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUmVtb3ZlIGEgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBSdWxlIGJ5IGl0cyAwLWJhc2VkIGluZGV4Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgotICAgIHB1YmxpYyB2b2lkIFJlbW92ZUF0KAotICAgICAgaW50IGluZGV4KQotICAgIHsKLSAgICAgIFJlcXVpcmUuQXJndW1lbnQoaW5kZXgpLklzSW5SYW5nZSgwLCB0aGlzLkNvdW50IC0gMSwgImluZGV4Iik7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJlbW92ZSBhIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZSBieSBpdHMgMC1iYXNlZCBpbmRleAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgorICBwdWJsaWMgdm9pZCBSZW1vdmVBdChpbnQgaW5kZXgpIHsKKyAgICBSZXF1aXJlLkFyZ3VtZW50KGluZGV4KS5Jc0luUmFuZ2UoMCwgQ291bnQgLSAxLCAiaW5kZXgiKTsKIAotICAgICAgUmVtb3ZlKHRoaXNbaW5kZXhdKTsKLSAgICB9CisgICAgUmVtb3ZlKHRoaXNbaW5kZXhdKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBSZW1vdmUgYSBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGUgYnkgaXRzIHByaW9yaXR5Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIHB1YmxpYyB2b2lkIFJlbW92ZUJ5UHJpb3JpdHkoCi0gICAgICBpbnQgcHJpb3JpdHkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIFJlbW92ZShSdWxlc0J5UHJpb3JpdHkocHJpb3JpdHkpKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZW1vdmUgYSBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGUgYnkgaXRzIHByaW9yaXR5CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIFJlbW92ZUJ5UHJpb3JpdHkoaW50IHByaW9yaXR5KSB7CisgICAgdHJ5IHsKKyAgICAgIFJlbW92ZShSdWxlc0J5UHJpb3JpdHkocHJpb3JpdHkpKTsKKyAgICB9IGNhdGNoIHt9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gR2V0IGEgcnVsZSBieSBpdHMgcHJpb3JpdHkKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSBSdWxlc0J5UHJpb3JpdHkoCi0gICAgICBpbnQgcHJpb3JpdHkpCi0gICAgewotICAgICAgcmV0dXJuIF9ydWxlcy5GaW5kKHggPT4geC5Qcmlvcml0eSA9PSBwcmlvcml0eSk7Ci0gICAgfQotICAgICNlbmRyZWdpb24gSUVudW1lcmFibGU8SUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nPgorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXQgYSBydWxlIGJ5IGl0cyBwcmlvcml0eQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSBSdWxlc0J5UHJpb3JpdHkoaW50IHByaW9yaXR5KSB7CisgICAgcmV0dXJuIF9ydWxlcy5GaW5kKHggPT4geC5Qcmlvcml0eSA9PSBwcmlvcml0eSk7CisgIH0KIAotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotICAgICNyZWdpb24gQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBSdWxlcwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIHJ1bGUgKGludGVybmFsKQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPkYKLSAgICBpbnRlcm5hbCBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlIEFkZFJ1bGUoCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIHJ1bGUgKGludGVybmFsKQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz5GCisgIGludGVybmFsIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUgQWRkUnVsZSgKICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCi0gICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKLSAgICB7Ci0gICAgICBSZXF1aXJlLkFyZ3VtZW50KGFkZHJlc3MpLklzTm90TnVsbCgiYWRkcmVzcyIpOworICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICBSZXF1aXJlLkFyZ3VtZW50KGFkZHJlc3MpLklzTm90TnVsbCgiYWRkcmVzcyIpOwogCi0gICAgICBhZGRyZXNzID0gVmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MpOwotICAgICAgRW5zdXJlUm9vdEVsZW1lbnRFeGlzdHMoKTsKKyAgICBhZGRyZXNzID0gVmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MpOworICAgIEVuc3VyZVJvb3RFbGVtZW50RXhpc3RzKCk7CiAKLSAgICAgIC8vIENyZWF0ZSB0aGUgUnVsZSBhY2NvcmRpbmcgdG8gdGhlIGNvcnJlY3QgdHlwZSwgYWRkcmVzcyBhbmQgcHJpb3JpdHkKLSAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUgY2ZSdWxlID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlRmFjdG9yeS5DcmVhdGUoCisgICAgLy8gQ3JlYXRlIHRoZSBSdWxlIGFjY29yZGluZyB0byB0aGUgY29ycmVjdCB0eXBlLCBhZGRyZXNzIGFuZCBwcmlvcml0eQorICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUgY2ZSdWxlID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlRmFjdG9yeS5DcmVhdGUoCiAgICAgICAgIHR5cGUsCiAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgIEdldE5leHRQcmlvcml0eSgpLAogICAgICAgICBfd29ya3NoZWV0LAogICAgICAgICBudWxsKTsKIAotICAgICAgLy8gQWRkIHRoZSBuZXdseSBjcmVhdGVkIHJ1bGUgdG8gdGhlIGxpc3QKLSAgICAgIF9ydWxlcy5BZGQoY2ZSdWxlKTsKKyAgICAvLyBBZGQgdGhlIG5ld2x5IGNyZWF0ZWQgcnVsZSB0byB0aGUgbGlzdAorICAgIF9ydWxlcy5BZGQoY2ZSdWxlKTsKIAotICAgICAgLy8gUmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHJ1bGUKLSAgICAgIHJldHVybiBjZlJ1bGU7Ci0gICAgfQorICAgIC8vIFJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBydWxlCisgICAgcmV0dXJuIGNmUnVsZTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgQWJvdmVBdmVyYWdlIFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAgQWRkQWJvdmVBdmVyYWdlKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXApQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIEFib3ZlQXZlcmFnZSBSdWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCBBZGRBYm92ZUF2ZXJhZ2UoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cClBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5BYm92ZUF2ZXJhZ2UsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgQWJvdmVPckVxdWFsQXZlcmFnZSBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEFib3ZlT3JFcXVhbEF2ZXJhZ2UoCi0gICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKLSAgICB7Ci0gICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cClBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgQWJvdmVPckVxdWFsQXZlcmFnZSBSdWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCBBZGRBYm92ZU9yRXF1YWxBdmVyYWdlKEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXApQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVPckVxdWFsQXZlcmFnZSwKICAgICAgICAgYWRkcmVzcyk7Ci0gICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBCZWxvd0F2ZXJhZ2UgUnVsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCBBZGRCZWxvd0F2ZXJhZ2UoCi0gICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKLSAgICB7Ci0gICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cClBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgQmVsb3dBdmVyYWdlIFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEJlbG93QXZlcmFnZShFeGNlbEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwKUFkZFJ1bGUoCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93QXZlcmFnZSwKICAgICAgICAgYWRkcmVzcyk7Ci0gICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBCZWxvd09yRXF1YWxBdmVyYWdlIFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAgQWRkQmVsb3dPckVxdWFsQXZlcmFnZSgKLSAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQotICAgIHsKLSAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwKUFkZFJ1bGUoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBCZWxvd09yRXF1YWxBdmVyYWdlIFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEJlbG93T3JFcXVhbEF2ZXJhZ2UoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cClBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd09yRXF1YWxBdmVyYWdlLAogICAgICAgICBhZGRyZXNzKTsKLSAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIEFib3ZlU3RkRGV2IFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cCBBZGRBYm92ZVN0ZERldigKLSAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQotICAgIHsKLSAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXApQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIEFib3ZlU3RkRGV2IFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXAgQWRkQWJvdmVTdGREZXYoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwKUFkZFJ1bGUoCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlU3RkRGV2LAogICAgICAgICBhZGRyZXNzKTsKLSAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIEJlbG93U3RkRGV2IFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cCBBZGRCZWxvd1N0ZERldigKLSAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQotICAgIHsKLSAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXApQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIEJlbG93U3RkRGV2IFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXAgQWRkQmVsb3dTdGREZXYoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwKUFkZFJ1bGUoCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93U3RkRGV2LAogICAgICAgICBhZGRyZXNzKTsKLSAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIEJvdHRvbSBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkQm90dG9tKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cClBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgQm90dG9tIFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkQm90dG9tKEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cClBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Cb3R0b20sCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgQm90dG9tUGVyY2VudCBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkQm90dG9tUGVyY2VudCgKLSAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQotICAgIHsKLSAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXApQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIEJvdHRvbVBlcmNlbnQgUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cCBBZGRCb3R0b21QZXJjZW50KEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cClBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Cb3R0b21QZXJjZW50LAogICAgICAgICBhZGRyZXNzKTsKLSAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIFRvcCBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkVG9wKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cClBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgVG9wIFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkVG9wKEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cClBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub3AsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgVG9wUGVyY2VudCBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkVG9wUGVyY2VudCgKLSAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQotICAgIHsKLSAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXApQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIFRvcFBlcmNlbnQgUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cCBBZGRUb3BQZXJjZW50KEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cClBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub3BQZXJjZW50LAogICAgICAgICBhZGRyZXNzKTsKLSAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIExhc3Q3RGF5cyBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZExhc3Q3RGF5cygKLSAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQotICAgIHsKLSAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwKUFkZFJ1bGUoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBMYXN0N0RheXMgUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTGFzdDdEYXlzKEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXApQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdDdEYXlzLAogICAgICAgICBhZGRyZXNzKTsKLSAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIExhc3RNb250aCBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZExhc3RNb250aCgKLSAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQotICAgIHsKLSAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwKUFkZFJ1bGUoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBMYXN0TW9udGggUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTGFzdE1vbnRoKEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXApQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdE1vbnRoLAogICAgICAgICBhZGRyZXNzKTsKLSAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIExhc3RXZWVrIFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTGFzdFdlZWsoCi0gICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKLSAgICB7Ci0gICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cClBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgTGFzdFdlZWsgUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTGFzdFdlZWsoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cClBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MYXN0V2VlaywKICAgICAgICAgYWRkcmVzcyk7Ci0gICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBOZXh0TW9udGggUnVsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGROZXh0TW9udGgoCi0gICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKLSAgICB7Ci0gICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cClBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgTmV4dE1vbnRoIFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZE5leHRNb250aChFeGNlbEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwKUFkZFJ1bGUoCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5leHRNb250aCwKICAgICAgICAgYWRkcmVzcyk7Ci0gICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBOZXh0V2VlayBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZE5leHRXZWVrKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXApQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIE5leHRXZWVrIFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZE5leHRXZWVrKEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXApQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTmV4dFdlZWssCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgVGhpc01vbnRoIFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkVGhpc01vbnRoKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXApQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIFRoaXNNb250aCBSdWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRUaGlzTW9udGgoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cClBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaGlzTW9udGgsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgVGhpc1dlZWsgUnVsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRUaGlzV2VlaygKLSAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQotICAgIHsKLSAgICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwKUFkZFJ1bGUoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBUaGlzV2VlayBSdWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRUaGlzV2VlayhFeGNlbEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwKUFkZFJ1bGUoCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRoaXNXZWVrLAogICAgICAgICBhZGRyZXNzKTsKLSAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIFRvZGF5IFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkVG9kYXkoCi0gICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcykKLSAgICB7Ci0gICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cClBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgVG9kYXkgUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkVG9kYXkoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cClBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub2RheSwKICAgICAgICAgYWRkcmVzcyk7Ci0gICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBUb21vcnJvdyBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFRvbW9ycm93KAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXApQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIFRvbW9ycm93IFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFRvbW9ycm93KEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXApQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVG9tb3Jyb3csCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgWWVzdGVyZGF5IFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkWWVzdGVyZGF5KAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXApQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIFllc3RlcmRheSBSdWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRZZXN0ZXJkYXkoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cClBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5ZZXN0ZXJkYXksCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgQmVnaW5zV2l0aCBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aCBBZGRCZWdpbnNXaXRoKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoKUFkZFJ1bGUoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBCZWdpbnNXaXRoIFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aCBBZGRCZWdpbnNXaXRoKEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoKUFkZFJ1bGUoCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlZ2luc1dpdGgsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgQmV0d2VlbiBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2VlbiBBZGRCZXR3ZWVuKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuKUFkZFJ1bGUoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBCZXR3ZWVuIFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2VlbiBBZGRCZXR3ZWVuKEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuKUFkZFJ1bGUoCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJldHdlZW4sCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgQ29udGFpbnNCbGFua3MgUnVsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzIEFkZENvbnRhaW5zQmxhbmtzKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcylBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgQ29udGFpbnNCbGFua3MgUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcyBBZGRDb250YWluc0JsYW5rcyhFeGNlbEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MpQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNCbGFua3MsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgQ29udGFpbnNFcnJvcnMgUnVsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzIEFkZENvbnRhaW5zRXJyb3JzKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycylBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgQ29udGFpbnNFcnJvcnMgUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycyBBZGRDb250YWluc0Vycm9ycyhFeGNlbEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMpQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNFcnJvcnMsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgQ29udGFpbnNUZXh0IFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQgQWRkQ29udGFpbnNUZXh0KAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQpQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIENvbnRhaW5zVGV4dCBSdWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dCBBZGRDb250YWluc1RleHQoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dClBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Db250YWluc1RleHQsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgRHVwbGljYXRlVmFsdWVzIFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMgQWRkRHVwbGljYXRlVmFsdWVzKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMpQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIER1cGxpY2F0ZVZhbHVlcyBSdWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcyBBZGREdXBsaWNhdGVWYWx1ZXMoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcylBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5EdXBsaWNhdGVWYWx1ZXMsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgRW5kc1dpdGggUnVsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoIEFkZEVuZHNXaXRoKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aClBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgRW5kc1dpdGggUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aCBBZGRFbmRzV2l0aChFeGNlbEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGgpQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRW5kc1dpdGgsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgRXF1YWwgUnVsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsIEFkZEVxdWFsKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbClBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgRXF1YWwgUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbCBBZGRFcXVhbChFeGNlbEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwpQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRXF1YWwsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgRXhwcmVzc2lvbiBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbiBBZGRFeHByZXNzaW9uKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uKUFkZFJ1bGUoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBFeHByZXNzaW9uIFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbiBBZGRFeHByZXNzaW9uKEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uKUFkZFJ1bGUoCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkV4cHJlc3Npb24sCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgR3JlYXRlclRoYW4gUnVsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuIEFkZEdyZWF0ZXJUaGFuKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbilBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgR3JlYXRlclRoYW4gUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbiBBZGRHcmVhdGVyVGhhbihFeGNlbEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4pQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuR3JlYXRlclRoYW4sCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgR3JlYXRlclRoYW5PckVxdWFsIFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwgQWRkR3JlYXRlclRoYW5PckVxdWFsKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwpQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIEdyZWF0ZXJUaGFuT3JFcXVhbCBSdWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbCBBZGRHcmVhdGVyVGhhbk9yRXF1YWwoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbClBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5HcmVhdGVyVGhhbk9yRXF1YWwsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgTGVzc1RoYW4gUnVsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuIEFkZExlc3NUaGFuKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbilBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgTGVzc1RoYW4gUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbiBBZGRMZXNzVGhhbihFeGNlbEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4pQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGVzc1RoYW4sCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgTGVzc1RoYW5PckVxdWFsIFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwgQWRkTGVzc1RoYW5PckVxdWFsKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwpQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIExlc3NUaGFuT3JFcXVhbCBSdWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbCBBZGRMZXNzVGhhbk9yRXF1YWwoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbClBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MZXNzVGhhbk9yRXF1YWwsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgTm90QmV0d2VlbiBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2VlbiBBZGROb3RCZXR3ZWVuKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuKUFkZFJ1bGUoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBOb3RCZXR3ZWVuIFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2VlbiBBZGROb3RCZXR3ZWVuKEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuKUFkZFJ1bGUoCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdEJldHdlZW4sCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgTm90Q29udGFpbnNCbGFua3MgUnVsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzIEFkZE5vdENvbnRhaW5zQmxhbmtzKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcylBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgTm90Q29udGFpbnNCbGFua3MgUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcyBBZGROb3RDb250YWluc0JsYW5rcyhFeGNlbEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MpQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90Q29udGFpbnNCbGFua3MsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgTm90Q29udGFpbnNFcnJvcnMgUnVsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzIEFkZE5vdENvbnRhaW5zRXJyb3JzKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0Vycm9ycylBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgTm90Q29udGFpbnNFcnJvcnMgUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0Vycm9ycyBBZGROb3RDb250YWluc0Vycm9ycyhFeGNlbEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMpQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90Q29udGFpbnNFcnJvcnMsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgTm90Q29udGFpbnNUZXh0IFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQgQWRkTm90Q29udGFpbnNUZXh0KAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQpQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIE5vdENvbnRhaW5zVGV4dCBSdWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dCBBZGROb3RDb250YWluc1RleHQoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dClBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc1RleHQsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgTm90RXF1YWwgUnVsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsIEFkZE5vdEVxdWFsKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbClBZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgTm90RXF1YWwgUnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbCBBZGROb3RFcXVhbChFeGNlbEFkZHJlc3MgYWRkcmVzcykgeworICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwpQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90RXF1YWwsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgVW5pcXVlIFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMgQWRkVW5pcXVlVmFsdWVzKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMpQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIFVuaXF1ZSBSdWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcyBBZGRVbmlxdWVWYWx1ZXMoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcylBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5VbmlxdWVWYWx1ZXMsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgVGhyZWVDb2xvclNjYWxlIFJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUgQWRkVGhyZWVDb2xvclNjYWxlKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUpQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIFRocmVlQ29sb3JTY2FsZSBSdWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSBBZGRUaHJlZUNvbG9yU2NhbGUoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSlBZGRSdWxlKAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUNvbG9yU2NhbGUsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgVHdvQ29sb3JTY2FsZSBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZSBBZGRUd29Db2xvclNjYWxlKAotICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlKUFkZFJ1bGUoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBUd29Db2xvclNjYWxlIFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZSBBZGRUd29Db2xvclNjYWxlKEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlKUFkZFJ1bGUoCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlR3b0NvbG9yU2NhbGUsCiAgICAgICAgIGFkZHJlc3MpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIFRocmVlSWNvblNldCBSdWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IkFkZHJlc3MiPlRoZSBhZGRyZXNzPC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Ikljb25TZXQiPlR5cGUgb2YgaWNvbnNldDwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0PGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzNJY29uc1NldFR5cGU+IEFkZFRocmVlSWNvblNldChFeGNlbEFkZHJlc3MgQWRkcmVzcywgZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nM0ljb25zU2V0VHlwZSBJY29uU2V0KQotICAgIHsKLSAgICAgICAgdmFyIGljb24gPSAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0PGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzNJY29uc1NldFR5cGU+KUFkZFJ1bGUoCi0gICAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQsCi0gICAgICAgICAgICBBZGRyZXNzKTsKLSAgICAgICAgaWNvbi5JY29uU2V0ID0gSWNvblNldDsKLSAgICAgICAgcmV0dXJuIGljb247Ci0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIEZvdXJJY29uU2V0IHJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iQWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Ikljb25TZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZT4gQWRkRm91ckljb25TZXQoRXhjZWxBZGRyZXNzIEFkZHJlc3MsIGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzRJY29uc1NldFR5cGUgSWNvblNldCkKLSAgICB7Ci0gICAgICAgIHZhciBpY29uID0gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0PGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzRJY29uc1NldFR5cGU+KUFkZFJ1bGUoCi0gICAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Gb3VySWNvblNldCwKLSAgICAgICAgICAgIEFkZHJlc3MpOwotICAgICAgICBpY29uLkljb25TZXQgPSBJY29uU2V0OwotICAgICAgICByZXR1cm4gaWNvbjsKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGRzIGEgRml2ZUljb25TZXQgcnVsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJBZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iSWNvblNldCI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldCBBZGRGaXZlSWNvblNldChFeGNlbEFkZHJlc3MgQWRkcmVzcywgZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNUljb25zU2V0VHlwZSBJY29uU2V0KQotICAgIHsKLSAgICAgICAgdmFyIGljb24gPSAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQpQWRkUnVsZSgKLSAgICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZpdmVJY29uU2V0LAotICAgICAgICAgICAgQWRkcmVzcyk7Ci0gICAgICAgIGljb24uSWNvblNldCA9IEljb25TZXQ7Ci0gICAgICAgIHJldHVybiBpY29uOwotICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBkYXRhYmFyIHJ1bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iQWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbG9yIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXJHcm91cCBBZGREYXRhYmFyKEV4Y2VsQWRkcmVzcyBBZGRyZXNzLCBDb2xvciBjb2xvcikKLSAgICB7Ci0gICAgICAgIHZhciBkYXRhQmFyID0gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXJHcm91cClBZGRSdWxlKAotICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRGF0YUJhciwKLSAgICAgICAgICAgIEFkZHJlc3MpOwotICAgICAgICBkYXRhQmFyLkNvbG9yPWNvbG9yOwotICAgICAgICByZXR1cm4gZGF0YUJhcjsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGVzCi0KICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgVGhyZWVJY29uU2V0IFJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5UaGUgYWRkcmVzczwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaWNvblNldCI+VHlwZSBvZiBpY29uc2V0PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlSWNvblNldDxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmczSWNvbnNTZXRUeXBlPiBBZGRUaHJlZUljb25TZXQoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzNJY29uc1NldFR5cGUgaWNvblNldCkgeworICAgIHZhciBpY29uID0KKyAgICAgICAgKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlSWNvblNldDxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmczSWNvbnNTZXRUeXBlPikKKyAgICAgICAgICBBZGRSdWxlKGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlSWNvblNldCwgYWRkcmVzcyk7CisgICAgaWNvbi5JY29uU2V0ID0gaWNvblNldDsKKyAgICByZXR1cm4gaWNvbjsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBGb3VySWNvblNldCBydWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpY29uU2V0Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZT4gQWRkRm91ckljb25TZXQoCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzRJY29uc1NldFR5cGUgaWNvblNldCkgeworICAgIHZhciBpY29uID0KKyAgICAgICAgKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0PGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzRJY29uc1NldFR5cGU+KQorICAgICAgICAgIEFkZFJ1bGUoZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQsIGFkZHJlc3MpOworICAgIGljb24uSWNvblNldCA9IGljb25TZXQ7CisgICAgcmV0dXJuIGljb247CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgRml2ZUljb25TZXQgcnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaWNvblNldCI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0IEFkZEZpdmVJY29uU2V0KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc1SWNvbnNTZXRUeXBlIGljb25TZXQpIHsKKyAgICB2YXIgaWNvbiA9IChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldClBZGRSdWxlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5GaXZlSWNvblNldCwKKyAgICAgICAgYWRkcmVzcyk7CisgICAgaWNvbi5JY29uU2V0ID0gaWNvblNldDsKKyAgICByZXR1cm4gaWNvbjsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBkYXRhYmFyIHJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbG9yIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhckdyb3VwIEFkZERhdGFiYXIoRXhjZWxBZGRyZXNzIGFkZHJlc3MsIENvbG9yIGNvbG9yKSB7CisgICAgdmFyIGRhdGFCYXIgPSAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhckdyb3VwKUFkZFJ1bGUoCisgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkRhdGFCYXIsCisgICAgICAgIGFkZHJlc3MpOworICAgIGRhdGFCYXIuQ29sb3IgPSBjb2xvcjsKKyAgICByZXR1cm4gZGF0YUJhcjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUuY3MKaW5kZXggYWMxY2RhZi4uMzMzMWIzZSAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZS5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw0OTkgKzEzLDQ0MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLkRyYXdpbmc7CiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKLXVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLlNlY3VyaXR5OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIDE4LjMuMS4xMSBjZnZvIChDb25kaXRpb25hbCBGb3JtYXQgVmFsdWUgT2JqZWN0KQotCS8vLyBEZXNjcmliZXMgdGhlIHZhbHVlcyBvZiB0aGUgaW50ZXJwb2xhdGlvbiBwb2ludHMgaW4gYSBncmFkaWVudCBzY2FsZS4KLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZQotCQk6IFhtbEhlbHBlcgotCXsKLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLQkJI3JlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKLQkJcHJpdmF0ZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFBvc2l0aW9uIF9wb3NpdGlvbjsKLQkJcHJpdmF0ZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBfcnVsZVR5cGU7Ci0JCXByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKLQkJI2VuZHJlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKKy8vLyA8c3VtbWFyeT4KKy8vLyAxOC4zLjEuMTEgY2Z2byAoQ29uZGl0aW9uYWwgRm9ybWF0IFZhbHVlIE9iamVjdCkKKy8vLyBEZXNjcmliZXMgdGhlIHZhbHVlcyBvZiB0aGUgaW50ZXJwb2xhdGlvbiBwb2ludHMgaW4gYSBncmFkaWVudCBzY2FsZS4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUgOiBYbWxIZWxwZXIgeworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCQkjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gSW5pdGlhbGl6ZSB0aGUgY2Z2byAowqcxOC4zLjEuMTEpIG5vZGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icG9zaXRpb24iPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sb3IiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImZvcm11bGEiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJydWxlVHlwZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+VGhlIGNmdm8gKMKnMTguMy4xLjExKSBub2RlIHBhcmVudC4gQ2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgotICAgIC8vLyBjb2xvclNjYWxlICjCpzE4LjMuMS4xNik7IGRhdGFCYXIgKMKnMTguMy4xLjI4KTsgaWNvblNldCAowqcxOC4zLjEuNDkpPC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0JCWludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlKAotCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RQb3NpdGlvbiBwb3NpdGlvbiwKLQkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZSB0eXBlLAotCQkJQ29sb3IgY29sb3IsCi0JCQlkb3VibGUgdmFsdWUsCi0JCQlzdHJpbmcgZm9ybXVsYSwKLQkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHJ1bGVUeXBlLAorICBwcml2YXRlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24gX3Bvc2l0aW9uOworICBwcml2YXRlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIF9ydWxlVHlwZTsKKyAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW5pdGlhbGl6ZSB0aGUgY2Z2byAowqcxOC4zLjEuMTEpIG5vZGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwb3NpdGlvbiI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbG9yIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImZvcm11bGEiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icnVsZVR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj5UaGUgY2Z2byAowqcxOC4zLjEuMTEpIG5vZGUgcGFyZW50LiBDYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6CisgIC8vLyBjb2xvclNjYWxlICjCpzE4LjMuMS4xNik7IGRhdGFCYXIgKMKnMTguMy4xLjI4KTsgaWNvblNldCAowqcxOC4zLjEuNDkpPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSgKKyAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24gcG9zaXRpb24sCisgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUgdHlwZSwKKyAgICAgIENvbG9yIGNvbG9yLAorICAgICAgZG91YmxlIHZhbHVlLAorICAgICAgc3RyaW5nIGZvcm11bGEsCisgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBydWxlVHlwZSwKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAotCQkJRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAotCQkJWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCi0JCQlYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCi0JCQk6IGJhc2UoCi0JCQkJbmFtZXNwYWNlTWFuYWdlciwKLQkJCQlpdGVtRWxlbWVudE5vZGUpCi0JCXsKLQkJCVJlcXVpcmUuQXJndW1lbnQocHJpb3JpdHkpLklzSW5SYW5nZSgxLCBpbnQuTWF4VmFsdWUsICJwcmlvcml0eSIpOwotCQkJUmVxdWlyZS5Bcmd1bWVudChhZGRyZXNzKS5Jc05vdE51bGwoImFkZHJlc3MiKTsKLQkJCVJlcXVpcmUuQXJndW1lbnQod29ya3NoZWV0KS5Jc05vdE51bGwoIndvcmtzaGVldCIpOworICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlciwgaXRlbUVsZW1lbnROb2RlKSB7CisgICAgUmVxdWlyZS5Bcmd1bWVudChwcmlvcml0eSkuSXNJblJhbmdlKDEsIGludC5NYXhWYWx1ZSwgInByaW9yaXR5Iik7CisgICAgUmVxdWlyZS5Bcmd1bWVudChhZGRyZXNzKS5Jc05vdE51bGwoImFkZHJlc3MiKTsKKyAgICBSZXF1aXJlLkFyZ3VtZW50KHdvcmtzaGVldCkuSXNOb3ROdWxsKCJ3b3Jrc2hlZXQiKTsKIAotCQkJLy8gU2F2ZSB0aGUgd29ya3NoZWV0IGZvciBwcml2YXRlIG1ldGhvZHMgdG8gdXNlCi0JCQlfd29ya3NoZWV0ID0gd29ya3NoZWV0OworICAgIC8vIFNhdmUgdGhlIHdvcmtzaGVldCBmb3IgcHJpdmF0ZSBtZXRob2RzIHRvIHVzZQorICAgIF93b3Jrc2hlZXQgPSB3b3Jrc2hlZXQ7CiAKLQkJCS8vIFNjaGVtYSBvcmRlciBsaXN0Ci0JCQlTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10KLQkJCXsKLSAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuTm9kZXMuQ2Z2bywKLSAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuTm9kZXMuQ29sb3IKLQkJCX07CisgICAgLy8gU2NoZW1hIG9yZGVyIGxpc3QKKyAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXdbXSB7CisgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5Ob2Rlcy5fY2Z2bywKKyAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk5vZGVzLl9jb2xvciwKKyAgICB9OwogCi0JCQkvLyBDaGVjayBpZiB0aGUgcGFyZW50IGRvZXMgbm90IGV4aXN0cwotCQkJaWYgKGl0ZW1FbGVtZW50Tm9kZSA9PSBudWxsKQotCQkJewotCQkJCS8vIEdldCB0aGUgcGFyZW50IG5vZGUgcGF0aCBieSB0aGUgcnVsZSB0eXBlCi0JCQkJc3RyaW5nIHBhcmVudE5vZGVQYXRoID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuR2V0UGFyZW50UGF0aEJ5UnVsZVR5cGUoCi0JCQkJCXJ1bGVUeXBlKTsKKyAgICAvLyBDaGVjayBpZiB0aGUgcGFyZW50IGRvZXMgbm90IGV4aXN0cworICAgIGlmIChpdGVtRWxlbWVudE5vZGUgPT0gbnVsbCkgeworICAgICAgLy8gR2V0IHRoZSBwYXJlbnQgbm9kZSBwYXRoIGJ5IHRoZSBydWxlIHR5cGUKKyAgICAgIHN0cmluZyBwYXJlbnROb2RlUGF0aCA9IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkdldFBhcmVudFBhdGhCeVJ1bGVUeXBlKAorICAgICAgICAgIHJ1bGVUeXBlKTsKIAotCQkJCS8vIENoZWNrIGZvciBlbiBlcnJvciAocnVsZSB0eXBlIGRvZXMgbm90IGhhdmUgPGNmdm8+KQotCQkJCWlmIChwYXJlbnROb2RlUGF0aCA9PSBzdHJpbmcuRW1wdHkpCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk1pc3NpbmdDZnZvUGFyZW50Tm9kZSk7Ci0JCQkJfQorICAgICAgLy8gQ2hlY2sgZm9yIGVuIGVycm9yIChydWxlIHR5cGUgZG9lcyBub3QgaGF2ZSA8Y2Z2bz4pCisgICAgICBpZiAocGFyZW50Tm9kZVBhdGggPT0gc3RyaW5nLkVtcHR5KSB7CisgICAgICAgIHRocm93IG5ldyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuX21pc3NpbmdDZnZvUGFyZW50Tm9kZSk7CisgICAgICB9CiAKLQkJCQkvLyBQb2ludCB0byB0aGUgPGNmdm8+IHBhcmVudCBub2RlCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSA9IF93b3Jrc2hlZXQuV29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoCi0JCQkJCXN0cmluZy5Gb3JtYXQoCi0JCQkJCQkiLy97MH1bezF9PSd7Mn0nXS97M31bezR9PSd7NX0nXS97Nn0iLAotCQkJCQkvLyB7MH0KLQkJCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNvbmRpdGlvbmFsRm9ybWF0dGluZywKLQkJCQkJLy8gezF9Ci0JCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5TcXJlZkF0dHJpYnV0ZSwKLQkJCQkJLy8gezJ9Ci0JCQkJCQlhZGRyZXNzLkFkZHJlc3MsCi0JCQkJCS8vIHszfQotCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ2ZSdWxlLAotCQkJCQkvLyB7NH0KLQkJCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlByaW9yaXR5QXR0cmlidXRlLAotCQkJCQkvLyB7NX0KLQkJCQkJCXByaW9yaXR5LAotCQkJCQkvLyB7Nn0KLQkJCQkJCXBhcmVudE5vZGVQYXRoKSwKLQkJCQkJX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgIC8vIFBvaW50IHRvIHRoZSA8Y2Z2bz4gcGFyZW50IG5vZGUKKyAgICAgIGl0ZW1FbGVtZW50Tm9kZSA9IF93b3Jrc2hlZXQuV29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoCisgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgIi8vezB9W3sxfT0nezJ9J10vezN9W3s0fT0nezV9J10vezZ9IiwKKyAgICAgICAgICAgICAgLy8gezB9CisgICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9jb25kaXRpb25hbEZvcm1hdHRpbmcsCisgICAgICAgICAgICAgIC8vIHsxfQorICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fc3FyZWZBdHRyaWJ1dGUsCisgICAgICAgICAgICAgIC8vIHsyfQorICAgICAgICAgICAgICBhZGRyZXNzLkFkZHJlc3MsCisgICAgICAgICAgICAgIC8vIHszfQorICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fY2ZSdWxlLAorICAgICAgICAgICAgICAvLyB7NH0KKyAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3ByaW9yaXR5QXR0cmlidXRlLAorICAgICAgICAgICAgICAvLyB7NX0KKyAgICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICAgIC8vIHs2fQorICAgICAgICAgICAgICBwYXJlbnROb2RlUGF0aCksCisgICAgICAgICAgX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKTsKIAotCQkJCS8vIENoZWNrIGZvciBlbiBlcnJvciAocnVsZSB0eXBlIGRvZXMgbm90IGhhdmUgPGNmdm8+KQotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlID09IG51bGwpCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk1pc3NpbmdDZnZvUGFyZW50Tm9kZSk7Ci0JCQkJfQotCQkJfQorICAgICAgLy8gQ2hlY2sgZm9yIGVuIGVycm9yIChydWxlIHR5cGUgZG9lcyBub3QgaGF2ZSA8Y2Z2bz4pCisgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5fbWlzc2luZ0Nmdm9QYXJlbnROb2RlKTsKKyAgICAgIH0KKyAgICB9CiAKLQkJCS8vIFBvaW50IHRvIHRoZSA8Y2Z2bz4gcGFyZW50IG5vZGUgKDxjb2xvclNjYWxlPiwgPGRhdGFCYXI+IG9yIDxpY29uU2V0PikKLSAgICAgIC8vIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gbm9ybWFsLCBhcyBUb3BOb2RlIGRvZXMgbm90IHBvaW50IHRvIHRoZSBub2RlIGl0c2VsZiBidXQgdG8KLSAgICAgIC8vIGl0cyBQQVJFTlQuIExhdGVyLCBpbiB0aGUgQ3JlYXRlTm9kZUJ5T3JkZW0gbWV0aG9kIHRoZSBUb3BOb2RlIHdpbGwgYmUgdXBkYXRlZC4KLSAgICAgIFRvcE5vZGUgPSBpdGVtRWxlbWVudE5vZGU7CisgICAgLy8gUG9pbnQgdG8gdGhlIDxjZnZvPiBwYXJlbnQgbm9kZSAoPGNvbG9yU2NhbGU+LCA8ZGF0YUJhcj4gb3IgPGljb25TZXQ+KQorICAgIC8vIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gbm9ybWFsLCBhcyBUb3BOb2RlIGRvZXMgbm90IHBvaW50IHRvIHRoZSBub2RlIGl0c2VsZiBidXQgdG8KKyAgICAvLyBpdHMgUEFSRU5ULiBMYXRlciwgaW4gdGhlIENyZWF0ZU5vZGVCeU9yZGVtIG1ldGhvZCB0aGUgVG9wTm9kZSB3aWxsIGJlIHVwZGF0ZWQuCisgICAgVG9wTm9kZSA9IGl0ZW1FbGVtZW50Tm9kZTsKIAotCQkJLy8gU2F2ZSB0aGUgYXR0cmlidXRlcwotCQkJUG9zaXRpb24gPSBwb3NpdGlvbjsKLQkJCVJ1bGVUeXBlID0gcnVsZVR5cGU7Ci0JCQlUeXBlID0gdHlwZTsKLQkJCUNvbG9yID0gY29sb3I7Ci0JCQlWYWx1ZSA9IHZhbHVlOwotCQkJRm9ybXVsYSA9IGZvcm11bGE7Ci0JCX0KKyAgICAvLyBTYXZlIHRoZSBhdHRyaWJ1dGVzCisgICAgUG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICBSdWxlVHlwZSA9IHJ1bGVUeXBlOworICAgIFR5cGUgPSB0eXBlOworICAgIENvbG9yID0gY29sb3I7CisgICAgVmFsdWUgPSB2YWx1ZTsKKyAgICBGb3JtdWxhID0gZm9ybXVsYTsKKyAgfQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIEluaXRpYWxpemUgdGhlIDxzZWUgY3JlZj0iRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUiLz4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJwb3NpdGlvbiI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9ImNvbG9yIj48L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9ImZvcm11bGEiPjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0icnVsZVR5cGUiPjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLQkJaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUoCi0JCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFBvc2l0aW9uIHBvc2l0aW9uLAotCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlIHR5cGUsCi0JCQlDb2xvciBjb2xvciwKLQkJCWRvdWJsZSB2YWx1ZSwKLQkJCXN0cmluZyBmb3JtdWxhLAotCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgcnVsZVR5cGUsCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluaXRpYWxpemUgdGhlIDxzZWUgY3JlZj0iRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUiLz4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwb3NpdGlvbiI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbG9yIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImZvcm11bGEiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icnVsZVR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUoCisgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFBvc2l0aW9uIHBvc2l0aW9uLAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlIHR5cGUsCisgICAgICBDb2xvciBjb2xvciwKKyAgICAgIGRvdWJsZSB2YWx1ZSwKKyAgICAgIHN0cmluZyBmb3JtdWxhLAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgcnVsZVR5cGUsCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKLQkJCUV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKLQkJCVhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKLQkJCTogdGhpcygKLQkJCQlwb3NpdGlvbiwKLQkJCQl0eXBlLAotCQkJCWNvbG9yLAotCQkJCXZhbHVlLAotCQkJCWZvcm11bGEsCi0JCQkJcnVsZVR5cGUsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotCQkJCXdvcmtzaGVldCwKLQkJCQludWxsLAotCQkJCW5hbWVzcGFjZU1hbmFnZXIpCi0JCXsKLQkJfQorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiB0aGlzKAorICAgICAgICAgIHBvc2l0aW9uLAorICAgICAgICAgIHR5cGUsCisgICAgICAgICAgY29sb3IsCisgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgZm9ybXVsYSwKKyAgICAgICAgICBydWxlVHlwZSwKKyAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICBudWxsLAorICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpIHt9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gSW5pdGlhbGl6ZSB0aGUgPHNlZSBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSIvPgotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InBvc2l0aW9uIj48L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iY29sb3IiPjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0icnVsZVR5cGUiPjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLQkJaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUoCi0JCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFBvc2l0aW9uIHBvc2l0aW9uLAotCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlIHR5cGUsCi0JCQlDb2xvciBjb2xvciwKLQkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHJ1bGVUeXBlLAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbml0aWFsaXplIHRoZSA8c2VlIGNyZWY9IkV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIi8+CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icG9zaXRpb24iPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2xvciI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJydWxlVHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSgKKyAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24gcG9zaXRpb24sCisgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUgdHlwZSwKKyAgICAgIENvbG9yIGNvbG9yLAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgcnVsZVR5cGUsCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKLQkJCUV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKLQkJCVhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKLQkJCTogdGhpcygKLQkJCQlwb3NpdGlvbiwKLQkJCQl0eXBlLAotCQkJCWNvbG9yLAotCQkJCTAsCi0JCQkJbnVsbCwKLQkJCQlydWxlVHlwZSwKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0JCQkJd29ya3NoZWV0LAotCQkJCW51bGwsCi0JCQkJbmFtZXNwYWNlTWFuYWdlcikKLQkJewotCQl9Ci0JCSNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IHRoaXMoCisgICAgICAgICAgcG9zaXRpb24sCisgICAgICAgICAgdHlwZSwKKyAgICAgICAgICBjb2xvciwKKyAgICAgICAgICAwLAorICAgICAgICAgIG51bGwsCisgICAgICAgICAgcnVsZVR5cGUsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgbnVsbCwKKyAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKSB7fQogCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCQkjcmVnaW9uIE1ldGhvZHMKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gR2V0IHRoZSBub2RlIG9yZGVyICgxLCAyIG91IDMpIGFjY29yZGluZyB0byB0aGUgUG9zaXRpb24gKExvdywgTWlkZGxlIGFuZCBIaWdoKQotCQkvLy8gYW5kIHRoZSBSdWxlIFR5cGUgKFR3b0NvbG9yU2NhbGUgb3UgVGhyZWVDb2xvclNjYWxlKS4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLQkJcHJpdmF0ZSBpbnQgR2V0Tm9kZU9yZGVyKCkKLQkJewotCQkJcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkdldE9yZGVyQnlQb3NpdGlvbigKLQkJCQlQb3NpdGlvbiwKLQkJCQlSdWxlVHlwZSk7Ci0JCX0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBDcmVhdGUgdGhlICdjZnZvJy8nY29sb3InIG5vZGVzIGluIHRoZSByaWdodCBvcmRlci4gVGhleSBzaG91bGQgYXBwZWFyIGxpa2UgdGhpczoKLQkJLy8vCQkiY2Z2byIgICAtLT4gTG93IFZhbHVlICh2YWx1ZSBvYmplY3QpCi0JCS8vLwkJImNmdm8iICAgLS0+IE1pZGRsZSBWYWx1ZSAodmFsdWUgb2JqZWN0KQotCQkvLy8JCSJjZnZvIiAgIC0tPiBIaWdoIFZhbHVlICh2YWx1ZSBvYmplY3QpCi0JCS8vLwkJImNvbG9yIiAgLS0+IExvdyBWYWx1ZSAoY29sb3IpCi0JCS8vLwkJImNvbG9yIiAgLS0+IE1pZGRsZSBWYWx1ZSAoY29sb3IpCi0JCS8vLwkJImNvbG9yIiAgLS0+IEhpZ2ggVmFsdWUgKGNvbG9yKQotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9Im5vZGVUeXBlIj48L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9ImF0dHJpYnV0ZVBhdGgiPjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iYXR0cmlidXRlVmFsdWUiPjwvcGFyYW0+Ci0JCXByaXZhdGUgdm9pZCBDcmVhdGVOb2RlQnlPcmRlbSgKLQkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0Tm9kZVR5cGUgbm9kZVR5cGUsCi0JCQlzdHJpbmcgYXR0cmlidXRlUGF0aCwKLQkJCXN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkKLQkJewotICAgICAgLy8gU2F2ZSB0aGUgY3VycmVudCBUb3BOb2RlCi0gICAgICBYbWxOb2RlIGN1cnJlbnRUb3BOb2RlID0gVG9wTm9kZTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0IHRoZSBub2RlIG9yZGVyICgxLCAyIG91IDMpIGFjY29yZGluZyB0byB0aGUgUG9zaXRpb24gKExvdywgTWlkZGxlIGFuZCBIaWdoKQorICAvLy8gYW5kIHRoZSBSdWxlIFR5cGUgKFR3b0NvbG9yU2NhbGUgb3UgVGhyZWVDb2xvclNjYWxlKS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHJpdmF0ZSBpbnQgR2V0Tm9kZU9yZGVyKCkgeworICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5HZXRPcmRlckJ5UG9zaXRpb24oUG9zaXRpb24sIFJ1bGVUeXBlKTsKKyAgfQogCi0gICAgICBzdHJpbmcgbm9kZVBhdGggPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5HZXROb2RlUGF0aEJ5Tm9kZVR5cGUobm9kZVR5cGUpOwotCQkJaW50IG5vZGVPcmRlciA9IEdldE5vZGVPcmRlcigpOwotCQkJZU5vZGVJbnNlcnRPcmRlciBub2RlSW5zZXJ0T3JkZXIgPSBlTm9kZUluc2VydE9yZGVyLlNjaGVtYU9yZGVyOwotCQkJWG1sTm9kZSByZWZlcmVuY2VOb2RlID0gbnVsbDsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ3JlYXRlIHRoZSAnY2Z2bycvJ2NvbG9yJyBub2RlcyBpbiB0aGUgcmlnaHQgb3JkZXIuIFRoZXkgc2hvdWxkIGFwcGVhciBsaWtlIHRoaXM6CisgIC8vLwkJImNmdm8iICAgLS0+IExvdyBWYWx1ZSAodmFsdWUgb2JqZWN0KQorICAvLy8JCSJjZnZvIiAgIC0tPiBNaWRkbGUgVmFsdWUgKHZhbHVlIG9iamVjdCkKKyAgLy8vCQkiY2Z2byIgICAtLT4gSGlnaCBWYWx1ZSAodmFsdWUgb2JqZWN0KQorICAvLy8JCSJjb2xvciIgIC0tPiBMb3cgVmFsdWUgKGNvbG9yKQorICAvLy8JCSJjb2xvciIgIC0tPiBNaWRkbGUgVmFsdWUgKGNvbG9yKQorICAvLy8JCSJjb2xvciIgIC0tPiBIaWdoIFZhbHVlIChjb2xvcikKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJub2RlVHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGVQYXRoIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImF0dHJpYnV0ZVZhbHVlIj48L3BhcmFtPgorICBwcml2YXRlIHZvaWQgQ3JlYXRlTm9kZUJ5T3JkZW0oCisgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdE5vZGVUeXBlIG5vZGVUeXBlLAorICAgICAgc3RyaW5nIGF0dHJpYnV0ZVBhdGgsCisgICAgICBzdHJpbmcgYXR0cmlidXRlVmFsdWUpIHsKKyAgICAvLyBTYXZlIHRoZSBjdXJyZW50IFRvcE5vZGUKKyAgICBYbWxOb2RlIGN1cnJlbnRUb3BOb2RlID0gVG9wTm9kZTsKIAotCQkJaWYgKG5vZGVPcmRlciA+IDEpCi0JCQl7Ci0JCQkJLy8gRmluZCB0aGUgbm9kZSBqdXN0IGJlZm9yZSB0aGUgb25lIHdlIG5lZWQgdG8gaW5jbHVkZQotCQkJCXJlZmVyZW5jZU5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoCi0JCQkJCXN0cmluZy5Gb3JtYXQoCi0JCQkJCQkiezB9W3Bvc2l0aW9uKCk9ezF9XSIsCi0JCQkJCS8vIHswfQotCQkJCQkJbm9kZVBhdGgsCi0JCQkJCS8vIHsxfQotCQkJCQkJbm9kZU9yZGVyIC0gMSksCi0JCQkJCV93b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlcik7CisgICAgc3RyaW5nIG5vZGVQYXRoID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuR2V0Tm9kZVBhdGhCeU5vZGVUeXBlKG5vZGVUeXBlKTsKKyAgICBpbnQgbm9kZU9yZGVyID0gR2V0Tm9kZU9yZGVyKCk7CisgICAgZU5vZGVJbnNlcnRPcmRlciBub2RlSW5zZXJ0T3JkZXIgPSBlTm9kZUluc2VydE9yZGVyLlNjaGVtYU9yZGVyOworICAgIFhtbE5vZGUgcmVmZXJlbmNlTm9kZSA9IG51bGw7CiAKLQkJCQkvLyBPbmx5IGlmIHRoZSBwcmVwZW5kIG5vZGUgZXhpc3RzIHRoYW4gaW5zZXJ0IGFmdGVyCi0JCQkJaWYgKHJlZmVyZW5jZU5vZGUgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCW5vZGVJbnNlcnRPcmRlciA9IGVOb2RlSW5zZXJ0T3JkZXIuQWZ0ZXI7Ci0JCQkJfQotCQkJfQorICAgIGlmIChub2RlT3JkZXIgPiAxKSB7CisgICAgICAvLyBGaW5kIHRoZSBub2RlIGp1c3QgYmVmb3JlIHRoZSBvbmUgd2UgbmVlZCB0byBpbmNsdWRlCisgICAgICByZWZlcmVuY2VOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKAorICAgICAgICAgIHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICJ7MH1bcG9zaXRpb24oKT17MX1dIiwKKyAgICAgICAgICAgICAgLy8gezB9CisgICAgICAgICAgICAgIG5vZGVQYXRoLAorICAgICAgICAgICAgICAvLyB7MX0KKyAgICAgICAgICAgICAgbm9kZU9yZGVyIC0gMSksCisgICAgICAgICAgX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKTsKIAotCQkJLy8gQ3JlYXRlIHRoZSBub2RlIGluIHRoZSByaWdodCBvcmRlcgotCQkJdmFyIG5vZGUgPSBDcmVhdGVDb21wbGV4Tm9kZSgKLQkJCQlUb3BOb2RlLAotCQkJCXN0cmluZy5Gb3JtYXQoCi0JCQkJCSJ7MH1bcG9zaXRpb24oKT17MX1dIiwKLQkJCQkvLyB7MH0KLQkJCQkJbm9kZVBhdGgsCi0JCQkJLy8gezF9Ci0JCQkJCW5vZGVPcmRlciksCi0JCQkJbm9kZUluc2VydE9yZGVyLAotCQkJCXJlZmVyZW5jZU5vZGUpOworICAgICAgLy8gT25seSBpZiB0aGUgcHJlcGVuZCBub2RlIGV4aXN0cyB0aGFuIGluc2VydCBhZnRlcgorICAgICAgaWYgKHJlZmVyZW5jZU5vZGUgIT0gbnVsbCkgeworICAgICAgICBub2RlSW5zZXJ0T3JkZXIgPSBlTm9kZUluc2VydE9yZGVyLkFmdGVyOworICAgICAgfQorICAgIH0KIAotICAgICAgLy8gUG9pbnQgdG8gdGhlIG5ldyBub2RlIGFzIHRoZSB0ZW1wb3JhcnkgVG9wTm9kZSAod2UgbmVlZCBpdCBmb3IgdGhlIFhtbEhlbHBlciBmdW5jdGlvbnMpCi0gICAgICBUb3BOb2RlID0gbm9kZTsKKyAgICAvLyBDcmVhdGUgdGhlIG5vZGUgaW4gdGhlIHJpZ2h0IG9yZGVyCisgICAgdmFyIG5vZGUgPSBDcmVhdGVDb21wbGV4Tm9kZSgKKyAgICAgICAgVG9wTm9kZSwKKyAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICJ7MH1bcG9zaXRpb24oKT17MX1dIiwKKyAgICAgICAgICAgIC8vIHswfQorICAgICAgICAgICAgbm9kZVBhdGgsCisgICAgICAgICAgICAvLyB7MX0KKyAgICAgICAgICAgIG5vZGVPcmRlciksCisgICAgICAgIG5vZGVJbnNlcnRPcmRlciwKKyAgICAgICAgcmVmZXJlbmNlTm9kZSk7CiAKLSAgICAgIC8vIEFkZC9SZW1vdmUgdGhlIGF0dHJpYnV0ZSAoaWYgdGhlIGF0dHJpYnV0ZVZhbHVlIGlzIGVtcHR5IHRoZW4gaXQgd2lsbCBiZSByZW1vdmVkKQotICAgICAgU2V0WG1sTm9kZVN0cmluZygKLSAgICAgICAgbm9kZSwKLSAgICAgICAgYXR0cmlidXRlUGF0aCwKLSAgICAgICAgYXR0cmlidXRlVmFsdWUsCi0gICAgICAgIHRydWUpOworICAgIC8vIFBvaW50IHRvIHRoZSBuZXcgbm9kZSBhcyB0aGUgdGVtcG9yYXJ5IFRvcE5vZGUgKHdlIG5lZWQgaXQgZm9yIHRoZSBYbWxIZWxwZXIgZnVuY3Rpb25zKQorICAgIFRvcE5vZGUgPSBub2RlOwogCi0gICAgICAvLyBQb2ludCBiYWNrIHRvIHRoZSA8Y2Z2bz4vPGNvbG9yPiBwYXJlbnQgbm9kZQotICAgICAgVG9wTm9kZSA9IGN1cnJlbnRUb3BOb2RlOwotCQl9Ci0JCSNlbmRyZWdpb24gTWV0aG9zCisgICAgLy8gQWRkL1JlbW92ZSB0aGUgYXR0cmlidXRlIChpZiB0aGUgYXR0cmlidXRlVmFsdWUgaXMgZW1wdHkgdGhlbiBpdCB3aWxsIGJlIHJlbW92ZWQpCisgICAgU2V0WG1sTm9kZVN0cmluZyhub2RlLCBhdHRyaWJ1dGVQYXRoLCBhdHRyaWJ1dGVWYWx1ZSwgdHJ1ZSk7CiAKLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLy8gUG9pbnQgYmFjayB0byB0aGUgPGNmdm8+Lzxjb2xvcj4gcGFyZW50IG5vZGUKKyAgICBUb3BOb2RlID0gY3VycmVudFRvcE5vZGU7CisgIH0KIAotCQkjcmVnaW9uIEV4cG9zZWQgUHJvcGVydGllcwotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyAKLQkJLy8vIDwvc3VtbWFyeT4KLQkJaW50ZXJuYWwgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RQb3NpdGlvbiBQb3NpdGlvbgotCQl7Ci0JCQlnZXQgeyByZXR1cm4gX3Bvc2l0aW9uOyB9Ci0JCQlzZXQgeyBfcG9zaXRpb24gPSB2YWx1ZTsgfQotCQl9CisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIAotCQkvLy8gPC9zdW1tYXJ5PgotCQlpbnRlcm5hbCBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBSdWxlVHlwZQotCQl7Ci0JCQlnZXQgeyByZXR1cm4gX3J1bGVUeXBlOyB9Ci0JCQlzZXQgeyBfcnVsZVR5cGUgPSB2YWx1ZTsgfQotCQl9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUgVHlwZQotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQl2YXIgdHlwZUF0dHJpYnV0ZSA9IEdldFhtbE5vZGVTdHJpbmcoCi0JCQkJCXN0cmluZy5Gb3JtYXQoCi0JCQkJCQkiezB9W3Bvc2l0aW9uKCk9ezF9XS97Mn0iLAotCQkJCQkvLyB7MH0KLQkJCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmdm8sCi0JCQkJCS8vIHsxfQotCQkJCQkJR2V0Tm9kZU9yZGVyKCksCi0JCQkJCS8vIHsyfQotCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVHlwZUF0dHJpYnV0ZSkpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFBvc2l0aW9uIFBvc2l0aW9uIHsKKyAgICBnZXQgPT4gX3Bvc2l0aW9uOworICAgIHNldCA9PiBfcG9zaXRpb24gPSB2YWx1ZTsKKyAgfQogCi0JCQkJcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkdldFR5cGVCeUF0dHJiaXV0ZSh0eXBlQXR0cmlidXRlKTsKLQkJCX0KLQkJCXNldAotCQkJewotCQkJCUNyZWF0ZU5vZGVCeU9yZGVtKAotCQkJCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdE5vZGVUeXBlLkNmdm8sCi0JCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlR5cGVBdHRyaWJ1dGUsCi0JCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkdldEF0dHJpYnV0ZUJ5VHlwZSh2YWx1ZSkpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBSdWxlVHlwZSB7CisgICAgZ2V0ID0+IF9ydWxlVHlwZTsKKyAgICBzZXQgPT4gX3J1bGVUeXBlID0gdmFsdWU7CisgIH0KIAotCQkJCWJvb2wgcmVtb3ZlVmFsQXR0cmlidXRlID0gZmFsc2U7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUgVHlwZSB7CisgICAgZ2V0IHsKKyAgICAgIHZhciB0eXBlQXR0cmlidXRlID0gR2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAiezB9W3Bvc2l0aW9uKCk9ezF9XS97Mn0iLAorICAgICAgICAgICAgICAvLyB7MH0KKyAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX2Nmdm8sCisgICAgICAgICAgICAgIC8vIHsxfQorICAgICAgICAgICAgICBHZXROb2RlT3JkZXIoKSwKKyAgICAgICAgICAgICAgLy8gezJ9CisgICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl90eXBlQXR0cmlidXRlKSk7CiAKLQkJCQkvLyBNYWtlIHN1cmUgdW5uZWNlc3NhcnkgYXR0cmlidXRlcyBhcmUgcmVtb3ZlZCAob2NjdXJlcyB3aGVuIHdlIGNoYW5nZQotCQkJCS8vIHRoZSB2YWx1ZSBvYmplY3QgdHlwZSkKLQkJCQlzd2l0Y2ggKFR5cGUpCi0JCQkJewotCQkJCQljYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5NaW46Ci0JCQkJCWNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1heDoKLQkJCQkJCXJlbW92ZVZhbEF0dHJpYnV0ZSA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQl9CisgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuR2V0VHlwZUJ5QXR0cmJpdXRlKHR5cGVBdHRyaWJ1dGUpOworICAgIH0KKyAgICBzZXQgeworICAgICAgQ3JlYXRlTm9kZUJ5T3JkZW0oCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3ROb2RlVHlwZS5DZnZvLAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl90eXBlQXR0cmlidXRlLAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkdldEF0dHJpYnV0ZUJ5VHlwZSh2YWx1ZSkpOwogCi0JCQkJLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byByZW1vdmUgdGhlIEB2YWwgYXR0cmlidXRlCi0JCQkJaWYgKHJlbW92ZVZhbEF0dHJpYnV0ZSkKLQkJCQl7Ci0JCQkJICBzdHJpbmcgbm9kZVBhdGggPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5HZXROb2RlUGF0aEJ5Tm9kZVR5cGUoCi0JCQkJCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdE5vZGVUeXBlLkNmdm8pOwotCQkJCSAgaW50IG5vZGVPcmRlciA9IEdldE5vZGVPcmRlcigpOworICAgICAgYm9vbCByZW1vdmVWYWxBdHRyaWJ1dGUgPSBmYWxzZTsKIAotCQkJCQkvLyBSZW1vdmUgdGhlIGF0dHJpYnV0ZSAocmVtb3ZlZCB3aGVuIHRoZSB2YWx1ZSA9ICcnKQotCQkJCSAgQ3JlYXRlQ29tcGxleE5vZGUoCi0JCQkJICAgIFRvcE5vZGUsCi0JCQkJICAgIHN0cmluZy5Gb3JtYXQoCi0JCQkJICAgICAgInswfVtwb3NpdGlvbigpPXsxfV0vezJ9PScnIiwKLQkJCQkgICAgLy8gezB9Ci0JCQkJICAgICAgbm9kZVBhdGgsCi0JCQkJICAgIC8vIHsxfQotCQkJCSAgICAgIG5vZGVPcmRlciwKLQkJCQkgICAgLy8gezJ9Ci0JCQkJICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVmFsQXR0cmlidXRlKSk7Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAvLyBNYWtlIHN1cmUgdW5uZWNlc3NhcnkgYXR0cmlidXRlcyBhcmUgcmVtb3ZlZCAob2NjdXJlcyB3aGVuIHdlIGNoYW5nZQorICAgICAgLy8gdGhlIHZhbHVlIG9iamVjdCB0eXBlKQorICAgICAgc3dpdGNoIChUeXBlKSB7CisgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1pbjoKKyAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWF4OgorICAgICAgICAgIHJlbW92ZVZhbEF0dHJpYnV0ZSA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBDb2xvciBDb2xvcgotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQkvLyBDb2xvciBDb2RlIGxpa2UgIkZGNUIzNEYyIgotCQkJCXZhciBjb2xvckNvZGUgPSBHZXRYbWxOb2RlU3RyaW5nKAotCQkJCQlzdHJpbmcuRm9ybWF0KAotCQkJCQkJInswfVtwb3NpdGlvbigpPXsxfV0vezJ9IiwKLQkJCQkJLy8gezB9Ci0JCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Db2xvciwKLQkJCQkJLy8gezF9Ci0JCQkJCQlHZXROb2RlT3JkZXIoKSwKLQkJCQkJLy8gezJ9Ci0JCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5SZ2JBdHRyaWJ1dGUpKTsKKyAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBAdmFsIGF0dHJpYnV0ZQorICAgICAgaWYgKHJlbW92ZVZhbEF0dHJpYnV0ZSkgeworICAgICAgICBzdHJpbmcgbm9kZVBhdGggPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5HZXROb2RlUGF0aEJ5Tm9kZVR5cGUoCisgICAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdE5vZGVUeXBlLkNmdm8pOworICAgICAgICBpbnQgbm9kZU9yZGVyID0gR2V0Tm9kZU9yZGVyKCk7CiAKLQkJCQlyZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdIZWxwZXIuQ29udmVydEZyb21Db2xvckNvZGUoY29sb3JDb2RlKTsKLQkJCX0KLQkJCXNldAotCQkJewotCQkJCS8vIFVzZSB0aGUgY29sb3IgY29kZSB0byBzdG9yZSAoRXguICJGRjVCMzVGMiIpCi0JCQkJQ3JlYXRlTm9kZUJ5T3JkZW0oCi0JCQkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0Tm9kZVR5cGUuQ29sb3IsCi0JCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlJnYkF0dHJpYnV0ZSwKLQkJCQkJdmFsdWUuVG9BcmdiKCkuVG9TdHJpbmcoIngiKSk7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgKHJlbW92ZWQgd2hlbiB0aGUgdmFsdWUgPSAnJykKKyAgICAgICAgQ3JlYXRlQ29tcGxleE5vZGUoCisgICAgICAgICAgICBUb3BOb2RlLAorICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgICAiezB9W3Bvc2l0aW9uKCk9ezF9XS97Mn09JyciLAorICAgICAgICAgICAgICAgIC8vIHswfQorICAgICAgICAgICAgICAgIG5vZGVQYXRoLAorICAgICAgICAgICAgICAgIC8vIHsxfQorICAgICAgICAgICAgICAgIG5vZGVPcmRlciwKKyAgICAgICAgICAgICAgICAvLyB7Mn0KKyAgICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fdmFsQXR0cmlidXRlKSk7CisgICAgICB9CisgICAgfQorICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gR2V0L1NldCB0aGUgJ2Nmdm8nIG5vZGUgQHZhbCBhdHRyaWJ1dGUKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIERvdWJsZSBWYWx1ZQotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlyZXR1cm4gR2V0WG1sTm9kZURvdWJsZSgKLQkJCQkJc3RyaW5nLkZvcm1hdCgKLQkJCQkJCSJ7MH1bcG9zaXRpb24oKT17MX1dL3syfSIsCi0JCQkJCS8vIHswfQotCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ2Z2bywKLQkJCQkJLy8gezF9Ci0JCQkJCQlHZXROb2RlT3JkZXIoKSwKLQkJCQkJLy8gezJ9Ci0JCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5WYWxBdHRyaWJ1dGUpKTsKLQkJCX0KLQkJCXNldAotCQkJewotCQkJCXN0cmluZyB2YWx1ZVRvU3RvcmUgPSBzdHJpbmcuRW1wdHk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBDb2xvciBDb2xvciB7CisgICAgZ2V0IHsKKyAgICAgIC8vIENvbG9yIENvZGUgbGlrZSAiRkY1QjM0RjIiCisgICAgICB2YXIgY29sb3JDb2RlID0gR2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAiezB9W3Bvc2l0aW9uKCk9ezF9XS97Mn0iLAorICAgICAgICAgICAgICAvLyB7MH0KKyAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX2NvbG9yLAorICAgICAgICAgICAgICAvLyB7MX0KKyAgICAgICAgICAgICAgR2V0Tm9kZU9yZGVyKCksCisgICAgICAgICAgICAgIC8vIHsyfQorICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fcmdiQXR0cmlidXRlKSk7CiAKLQkJCQkvLyBPbmx5IHNvbWUgdHlwZXMgdXNlIHRoZSBAdmFsIGF0dHJpYnV0ZQotCQkJCWlmICgoVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTnVtKQotCQkJCQl8fCAoVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudCkKLQkJCQkJfHwgKFR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnRpbGUpKQotCQkJCXsKLQkJCQkJdmFsdWVUb1N0b3JlID0gdmFsdWUuVG9TdHJpbmcoKTsKLQkJCQl9CisgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdIZWxwZXIuQ29udmVydEZyb21Db2xvckNvZGUoY29sb3JDb2RlKTsKKyAgICB9CisgICAgc2V0ID0+CisgICAgICAvLyBVc2UgdGhlIGNvbG9yIGNvZGUgdG8gc3RvcmUgKEV4LiAiRkY1QjM1RjIiKQorICAgICAgQ3JlYXRlTm9kZUJ5T3JkZW0oCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3ROb2RlVHlwZS5Db2xvciwKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fcmdiQXR0cmlidXRlLAorICAgICAgICAgIHZhbHVlLlRvQXJnYigpLlRvU3RyaW5nKCJ4IikpOworICB9CiAKLQkJCQlDcmVhdGVOb2RlQnlPcmRlbSgKLQkJCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3ROb2RlVHlwZS5DZnZvLAotCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5WYWxBdHRyaWJ1dGUsCi0JCQkJCXZhbHVlVG9TdG9yZSk7Ci0JCQl9Ci0JCX0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0L1NldCB0aGUgJ2Nmdm8nIG5vZGUgQHZhbCBhdHRyaWJ1dGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIERvdWJsZSBWYWx1ZSB7CisgICAgZ2V0ID0+CisgICAgICBHZXRYbWxOb2RlRG91YmxlKAorICAgICAgICAgIHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICJ7MH1bcG9zaXRpb24oKT17MX1dL3syfSIsCisgICAgICAgICAgICAgIC8vIHswfQorICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fY2Z2bywKKyAgICAgICAgICAgICAgLy8gezF9CisgICAgICAgICAgICAgIEdldE5vZGVPcmRlcigpLAorICAgICAgICAgICAgICAvLyB7Mn0KKyAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3ZhbEF0dHJpYnV0ZSkpOworICAgIHNldCB7CisgICAgICBzdHJpbmcgdmFsdWVUb1N0b3JlID0gc3RyaW5nLkVtcHR5OwogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIEdldC9TZXQgdGhlIEZvcm11bGEgb2YgdGhlIE9iamVjdCBWYWx1ZSAodXNlcyB0aGUgc2FtZSBhdHRyaWJ1dGUgYXMgdGhlIFZhbHVlKQotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgc3RyaW5nIEZvcm11bGEKLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJLy8gUmV0dXJuIGVtcHR5IGlmIHRoZSBPYmplY3QgVmFsdWUgdHlwZSBpcyBub3QgRm9ybXVsYQotCQkJCWlmIChUeXBlICE9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5Gb3JtdWxhKQotCQkJCXsKLQkJCQkJcmV0dXJuIHN0cmluZy5FbXB0eTsKLQkJCQl9CisgICAgICAvLyBPbmx5IHNvbWUgdHlwZXMgdXNlIHRoZSBAdmFsIGF0dHJpYnV0ZQorICAgICAgaWYgKChUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5OdW0pCisgICAgICAgICAgfHwgKFR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnQpCisgICAgICAgICAgfHwgKFR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnRpbGUpKSB7CisgICAgICAgIHZhbHVlVG9TdG9yZSA9IHZhbHVlLlRvU3RyaW5nKCk7CisgICAgICB9CiAKLQkJCQkvLyBFeGNlbCBzdG9yZXMgdGhlIGZvcm11bGEgaW4gdGhlIEB2YWwgYXR0cmlidXRlCi0JCQkJcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoCi0JCQkJCXN0cmluZy5Gb3JtYXQoCi0JCQkJCQkiezB9W3Bvc2l0aW9uKCk9ezF9XS97Mn0iLAotCQkJCQkvLyB7MH0KLQkJCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmdm8sCi0JCQkJCS8vIHsxfQotCQkJCQkJR2V0Tm9kZU9yZGVyKCksCi0JCQkJCS8vIHsyfQotCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVmFsQXR0cmlidXRlKSk7Ci0JCQl9Ci0JCQlzZXQKLQkJCXsKLQkJCQkvLyBPbmx5IHN0b3JlIHRoZSBmb3JtdWxhIGlmIHRoZSBPYmplY3QgVmFsdWUgdHlwZSBpcyBGb3JtdWxhCi0JCQkJaWYgKFR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkZvcm11bGEpCi0JCQkJewotCQkJCQlDcmVhdGVOb2RlQnlPcmRlbSgKLQkJCQkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0Tm9kZVR5cGUuQ2Z2bywKLQkJCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlZhbEF0dHJpYnV0ZSwKLQkJCQkJCSh2YWx1ZSA9PSBudWxsKSA/IHN0cmluZy5FbXB0eSA6IHZhbHVlLlRvU3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkjZW5kcmVnaW9uIEV4cG9zZWQgUHJvcGVydGllcworICAgICAgQ3JlYXRlTm9kZUJ5T3JkZW0oCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3ROb2RlVHlwZS5DZnZvLAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl92YWxBdHRyaWJ1dGUsCisgICAgICAgICAgdmFsdWVUb1N0b3JlKTsKKyAgICB9CisgIH0KIAotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXQvU2V0IHRoZSBGb3JtdWxhIG9mIHRoZSBPYmplY3QgVmFsdWUgKHVzZXMgdGhlIHNhbWUgYXR0cmlidXRlIGFzIHRoZSBWYWx1ZSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBGb3JtdWxhIHsKKyAgICBnZXQgeworICAgICAgLy8gUmV0dXJuIGVtcHR5IGlmIHRoZSBPYmplY3QgVmFsdWUgdHlwZSBpcyBub3QgRm9ybXVsYQorICAgICAgaWYgKFR5cGUgIT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkZvcm11bGEpIHsKKyAgICAgICAgcmV0dXJuIHN0cmluZy5FbXB0eTsKKyAgICAgIH0KKworICAgICAgLy8gRXhjZWwgc3RvcmVzIHRoZSBmb3JtdWxhIGluIHRoZSBAdmFsIGF0dHJpYnV0ZQorICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgInswfVtwb3NpdGlvbigpPXsxfV0vezJ9IiwKKyAgICAgICAgICAgICAgLy8gezB9CisgICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9jZnZvLAorICAgICAgICAgICAgICAvLyB7MX0KKyAgICAgICAgICAgICAgR2V0Tm9kZU9yZGVyKCksCisgICAgICAgICAgICAgIC8vIHsyfQorICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fdmFsQXR0cmlidXRlKSk7CisgICAgfQorICAgIHNldCB7CisgICAgICAvLyBPbmx5IHN0b3JlIHRoZSBmb3JtdWxhIGlmIHRoZSBPYmplY3QgVmFsdWUgdHlwZSBpcyBGb3JtdWxhCisgICAgICBpZiAoVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuRm9ybXVsYSkgeworICAgICAgICBDcmVhdGVOb2RlQnlPcmRlbSgKKyAgICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0Tm9kZVR5cGUuQ2Z2bywKKyAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl92YWxBdHRyaWJ1dGUsCisgICAgICAgICAgICAodmFsdWUgPT0gbnVsbCkgPyBzdHJpbmcuRW1wdHkgOiB2YWx1ZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5jcwppbmRleCA2Zjg5MThjLi45MzhjNmNkIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDI3MSArMTMsMjQ3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIFRoZSBjb25kaXRpb25hbCBmb3JtYXR0aW5nIGNvbnN0YW50cwotICAvLy8gPC9zdW1tYXJ5PgotICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMKLSAgewotICAgICNyZWdpb24gRXJyb3JzCi0gICAgaW50ZXJuYWwgY2xhc3MgRXJyb3JzCi0gICAgewotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENvbW1hU2VwYXJhdGVkQWRkcmVzc2VzID0gQCJNdWx0aXBsZSBhZGRyZXNzZXMgbWF5IG5vdCBiZSBjb21tYXNlcGFyYXRlZCwgdXNlIHNwYWNlIGluc3RlYWQiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEludmFsaWRDZnJ1bGVPYmplY3QgPSBAIlRoZSBzdXBwbGllZCBpdGVtIG11c3QgaW5oZXJpdCBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEludmFsaWRDb25kaXRpb25hbEZvcm1hdHRpbmdPYmplY3QgPSBAIlRoZSBzdXBwbGllZCBpdGVtIG11c3QgaW5oZXJpdCBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZyI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgSW52YWxpZFByaW9yaXR5ID0gQCJJbnZhbGlkIHByaW9yaXR5IG51bWJlci4gTXVzdCBiZSBiaWdnZXIgdGhhbiB6ZXJvIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBJbnZhbGlkUmVtb3ZlUnVsZU9wZXJhdGlvbiA9IEAiSW52YWxpZCByZW1vdmUgcnVsZSBvcGVyYXRpb24iOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE1pc3NpbmdDZnZvTm9kZSA9IEAiTWlzc2luZyAnY2Z2bycgbm9kZSBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBNaXNzaW5nQ2Z2b1BhcmVudE5vZGUgPSBAIk1pc3NpbmcgJ2Nmdm8nIHBhcmVudCBub2RlIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmciOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE1pc3NpbmdDb25kaXRpb25hbEZvcm1hdHRpbmdOb2RlID0gQCJNaXNzaW5nICdjb25kaXRpb25hbEZvcm1hdHRpbmcnIG5vZGUgaW4gQ29uZGl0aW9uYWwgRm9ybWF0dGluZyI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTWlzc2luZ0l0ZW1SdWxlTGlzdCA9IEAiTWlzc2luZyBpdGVtIHdpdGggYWRkcmVzcyAnezB9JyBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGUgTGlzdCI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTWlzc2luZ1ByaW9yaXR5QXR0cmlidXRlID0gQCJNaXNzaW5nICdwcmlvcml0eScgYXR0cmlidXRlIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZSI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTWlzc2luZ1J1bGVUeXBlID0gQCJNaXNzaW5nIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIFR5cGUgaW4gQ29uZGl0aW9uYWwgRm9ybWF0dGluZyI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTWlzc2luZ1NxcmVmQXR0cmlidXRlID0gQCJNaXNzaW5nICdzcXJlZicgYXR0cmlidXRlIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmciOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE1pc3NpbmdUeXBlQXR0cmlidXRlID0gQCJNaXNzaW5nICd0eXBlJyBhdHRyaWJ1dGUgaW4gQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBSdWxlIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBNaXNzaW5nV29ya3NoZWV0Tm9kZSA9IEAiTWlzc2luZyAnd29ya3NoZWV0JyBub2RlIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBOb25TdXBwb3J0ZWRSdWxlVHlwZSA9IEAiTm9uIHN1cHBvcnRlZCBjb25kaXRpb25hbEZvcm1hdHRpbmdUeXBlOiB7MH0iOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFVuZXhpc3RlbnRDZnZvVHlwZUF0dHJpYnV0ZSA9IEAiVW5leGlzdGVudCBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUgYXR0cmlidXRlIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmciOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFVuZXhpc3RlbnRPcGVyYXRvclR5cGVBdHRyaWJ1dGUgPSBAIlVuZXhpc3RlbnQgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlIGF0dHJpYnV0ZSBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBVbmV4aXN0ZW50VGltZVBlcmlvZFR5cGVBdHRyaWJ1dGUgPSBAIlVuZXhpc3RlbnQgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUgYXR0cmlidXRlIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmciOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFVuZXhwZWN0ZWRSdWxlVHlwZUF0dHJpYnV0ZSA9IEAiVW5leHBlY3RlZCBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBhdHRyaWJ1dGUgaW4gQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBSdWxlIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBVbmV4cGVjdGVkUnVsZVR5cGVOYW1lID0gQCJVbmV4cGVjdGVkIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIFR5cGVOYW1lIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZSI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgV3JvbmdOdW1iZXJDZnZvQ29sb3JOb2RlcyA9IEAiV3JvbmcgbnVtYmVyIG9mICdjZnZvJy8nY29sb3InIG5vZGVzIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZSI7Ci0gICAgfQotICAgICNlbmRyZWdpb24gRXJyb3JzCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLSAgICAjcmVnaW9uIE5vZGVzCi0gICAgaW50ZXJuYWwgY2xhc3MgTm9kZXMKLSAgICB7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgV29ya3NoZWV0ID0gIndvcmtzaGVldCI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ29uZGl0aW9uYWxGb3JtYXR0aW5nID0gImNvbmRpdGlvbmFsRm9ybWF0dGluZyI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ2ZSdWxlID0gImNmUnVsZSI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ29sb3JTY2FsZSA9ICJjb2xvclNjYWxlIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBDZnZvID0gImNmdm8iOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENvbG9yID0gImNvbG9yIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBEYXRhQmFyID0gImRhdGFCYXIiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEljb25TZXQgPSAiaWNvblNldCI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRm9ybXVsYSA9ICJmb3JtdWxhIjsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBOb2RlcwotCi0gICAgI3JlZ2lvbiBBdHRyaWJ1dGVzCi0gICAgaW50ZXJuYWwgY2xhc3MgQXR0cmlidXRlcwotICAgIHsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBBYm92ZUF2ZXJhZ2UgPSAiYWJvdmVBdmVyYWdlIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBCb3R0b20gPSAiYm90dG9tIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBEeGZJZCA9ICJkeGZJZCI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRXF1YWxBdmVyYWdlID0gImVxdWFsQXZlcmFnZSI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgSWNvblNldCA9ICJpY29uU2V0IjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBPcGVyYXRvciA9ICJvcGVyYXRvciI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgUGVyY2VudCA9ICJwZXJjZW50IjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBQcmlvcml0eSA9ICJwcmlvcml0eSI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgUmFuayA9ICJyYW5rIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBSZXZlcnNlID0gInJldmVyc2UiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFJnYiA9ICJyZ2IiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFNob3dWYWx1ZSA9ICJzaG93VmFsdWUiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFNxcmVmID0gInNxcmVmIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBTdGREZXYgPSAic3RkRGV2IjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBTdG9wSWZUcnVlID0gInN0b3BJZlRydWUiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFRleHQgPSAidGV4dCI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVGhlbWUgPSAidGhlbWUiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFRpbWVQZXJpb2QgPSAidGltZVBlcmlvZCI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVGludCA9ICJ0aW50IjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUeXBlID0gInR5cGUiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFZhbCA9ICJ2YWwiOwotICAgIH0KLSAgICAjZW5kcmVnaW9uIEF0dHJpYnV0ZXMKLQotICAgICNyZWdpb24gWE1MIFBhdGhzCi0gICAgaW50ZXJuYWwgY2xhc3MgUGF0aHMKLSAgICB7Ci0gICAgICAvLyBNYWluIG5vZGUgYW5kIGF0dHJpYnV0ZXMKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBXb3Jrc2hlZXQgPSAiZDoiICsgTm9kZXMuV29ya3NoZWV0OwotCi0gICAgICAvLyA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPiDCpzE4LjMuMS4xOCBub2RlCi0gICAgICAvLyBjYW4gYXBwZWFyIG1vcmUgdGhhbiBvbmNlIGluIGEgd29ya3NoZWV0Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ29uZGl0aW9uYWxGb3JtYXR0aW5nID0gImQ6IiArIE5vZGVzLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKLQotICAgICAgLy8gPGNmUnVsZT4gwqcxOC4zLjEuMTAgbm9kZQotICAgICAgLy8gY2FuIGFwcGVhciBtb3JlIHRoYW4gb25jZSBpbiBhIDxjb25kaXRpb25hbEZvcm1hdHRpbmc+Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ2ZSdWxlID0gImQ6IiArIE5vZGVzLkNmUnVsZTsKLQotICAgICAgLy8gPGNvbG9yU2NhbGU+IMKnMTguMy4xLjE2IG5vZGUKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBDb2xvclNjYWxlID0gImQ6IiArIE5vZGVzLkNvbG9yU2NhbGU7Ci0KLSAgICAgIC8vIDxjZnZvPiDCpzE4LjMuMS4xMSBub2RlCi0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ2Z2byA9ICJkOiIgKyBOb2Rlcy5DZnZvOwotCi0gICAgICAvLyA8Y29sb3I+IMKnMTguMy4xLjE1IG5vZGUKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBDb2xvciA9ICJkOiIgKyBOb2Rlcy5Db2xvcjsKLQotICAgICAgLy8gPGRhdGFCYXI+IMKnMTguMy4xLjI4IG5vZGUKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBEYXRhQmFyID0gImQ6IiArIE5vZGVzLkRhdGFCYXI7Ci0KLSAgICAgIC8vIDxpY29uU2V0PiDCpzE4LjMuMS40OSBub2RlCi0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgSWNvblNldCA9ICJkOiIgKyBOb2Rlcy5JY29uU2V0OwotCi0gICAgICAvLyA8Zm9ybXVsYT4gwqcxOC4zLjEuNDMgbm9kZQotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEZvcm11bGEgPSAiZDoiICsgTm9kZXMuRm9ybXVsYTsKLQotICAgICAgLy8gQXR0cmlidXRlcyAoZm9yIGFsbCB0aGUgbm9kZXMpCi0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQWJvdmVBdmVyYWdlQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5BYm92ZUF2ZXJhZ2U7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQm90dG9tQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5Cb3R0b207Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRHhmSWRBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLkR4ZklkOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVxdWFsQXZlcmFnZUF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuRXF1YWxBdmVyYWdlOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEljb25TZXRBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLkljb25TZXQ7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgT3BlcmF0b3JBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLk9wZXJhdG9yOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFBlcmNlbnRBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLlBlcmNlbnQ7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgUHJpb3JpdHlBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLlByaW9yaXR5OwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFJhbmtBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLlJhbms7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgUmV2ZXJzZUF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuUmV2ZXJzZTsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBSZ2JBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLlJnYjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBTaG93VmFsdWVBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLlNob3dWYWx1ZTsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBTcXJlZkF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuU3FyZWY7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgU3RkRGV2QXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5TdGREZXY7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgU3RvcElmVHJ1ZUF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuU3RvcElmVHJ1ZTsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUZXh0QXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5UZXh0OwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFRoZW1lQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5UaGVtZTsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUaW1lUGVyaW9kQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5UaW1lUGVyaW9kOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFRpbnRBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLlRpbnQ7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVHlwZUF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuVHlwZTsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBWYWxBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLlZhbDsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBYTUwgUGF0aHMKLQotICAgICNyZWdpb24gUnVsZSBUeXBlIFNUX0NmVHlwZSDCpzE4LjE4LjEyICh3aXRoIHNtYWxsIEVQUGx1cyBjaGFuZ2VzKQotICAgIGludGVybmFsIGNsYXNzIFJ1bGVUeXBlCi0gICAgewotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEFib3ZlQXZlcmFnZSA9ICJhYm92ZUF2ZXJhZ2UiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEJlZ2luc1dpdGggPSAiYmVnaW5zV2l0aCI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ2VsbElzID0gImNlbGxJcyI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ29sb3JTY2FsZSA9ICJjb2xvclNjYWxlIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBDb250YWluc0JsYW5rcyA9ICJjb250YWluc0JsYW5rcyI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ29udGFpbnNFcnJvcnMgPSAiY29udGFpbnNFcnJvcnMiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENvbnRhaW5zVGV4dCA9ICJjb250YWluc1RleHQiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIERhdGFCYXIgPSAiZGF0YUJhciI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRHVwbGljYXRlVmFsdWVzID0gImR1cGxpY2F0ZVZhbHVlcyI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRW5kc1dpdGggPSAiZW5kc1dpdGgiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEV4cHJlc3Npb24gPSAiZXhwcmVzc2lvbiI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgSWNvblNldCA9ICJpY29uU2V0IjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBOb3RDb250YWluc0JsYW5rcyA9ICJub3RDb250YWluc0JsYW5rcyI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTm90Q29udGFpbnNFcnJvcnMgPSAibm90Q29udGFpbnNFcnJvcnMiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE5vdENvbnRhaW5zVGV4dCA9ICJub3RDb250YWluc1RleHQiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFRpbWVQZXJpb2QgPSAidGltZVBlcmlvZCI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVG9wMTAgPSAidG9wMTAiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFVuaXF1ZVZhbHVlcyA9ICJ1bmlxdWVWYWx1ZXMiOwotCi0gICAgICAvLyBFUFBsdXMgRXh0ZW5kZWQgVHlwZXMKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBBYm92ZU9yRXF1YWxBdmVyYWdlID0gImFib3ZlT3JFcXVhbEF2ZXJhZ2UiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEFib3ZlU3RkRGV2ID0gImFib3ZlU3RkRGV2IjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBCZWxvd0F2ZXJhZ2UgPSAiYmVsb3dBdmVyYWdlIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBCZWxvd09yRXF1YWxBdmVyYWdlID0gImJlbG93T3JFcXVhbEF2ZXJhZ2UiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEJlbG93U3RkRGV2ID0gImJlbG93U3RkRGV2IjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBCZXR3ZWVuID0gImJldHdlZW4iOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEJvdHRvbSA9ICJib3R0b20iOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEJvdHRvbVBlcmNlbnQgPSAiYm90dG9tUGVyY2VudCI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRXF1YWwgPSAiZXF1YWwiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEdyZWF0ZXJUaGFuID0gImdyZWF0ZXJUaGFuIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBHcmVhdGVyVGhhbk9yRXF1YWwgPSAiZ3JlYXRlclRoYW5PckVxdWFsIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBJY29uU2V0MyA9ICJpY29uU2V0MyI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgSWNvblNldDQgPSAiaWNvblNldDQiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEljb25TZXQ1ID0gImljb25TZXQ1IjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBMYXN0N0RheXMgPSAibGFzdDdEYXlzIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBMYXN0TW9udGggPSAibGFzdE1vbnRoIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBMYXN0V2VlayA9ICJsYXN0V2VlayI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTGVzc1RoYW4gPSAibGVzc1RoYW4iOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIExlc3NUaGFuT3JFcXVhbCA9ICJsZXNzVGhhbk9yRXF1YWwiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE5leHRNb250aCA9ICJuZXh0TW9udGgiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE5leHRXZWVrID0gIm5leHRXZWVrIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBOb3RCZXR3ZWVuID0gIm5vdEJldHdlZW4iOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE5vdEVxdWFsID0gIm5vdEVxdWFsIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUaGlzTW9udGggPSAidGhpc01vbnRoIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUaGlzV2VlayA9ICJ0aGlzV2VlayI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVGhyZWVDb2xvclNjYWxlID0gInRocmVlQ29sb3JTY2FsZSI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVG9kYXkgPSAidG9kYXkiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFRvbW9ycm93ID0gInRvbW9ycm93IjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUb3AgPSAidG9wIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUb3BQZXJjZW50ID0gInRvcFBlcmNlbnQiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFR3b0NvbG9yU2NhbGUgPSAidHdvQ29sb3JTY2FsZSI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgWWVzdGVyZGF5ID0gInllc3RlcmRheSI7Ci0gICAgfQotICAgICNlbmRyZWdpb24gUnVsZSBUeXBlIFNUX0NmVHlwZSDCpzE4LjE4LjEyICh3aXRoIHNtYWxsIEVQUGx1cyBjaGFuZ2VzKQotCi0gICAgI3JlZ2lvbiBDRlZPIFR5cGUgU1RfQ2Z2b1R5cGUgwqcxOC4xOC4xMwotICAgIGludGVybmFsIGNsYXNzIENmdm9UeXBlCi0gICAgewotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE1pbiA9ICJtaW4iOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE1heCA9ICJtYXgiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE51bSA9ICJudW0iOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEZvcm11bGEgPSAiZm9ybXVsYSI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgUGVyY2VudCA9ICJwZXJjZW50IjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBQZXJjZW50aWxlID0gInBlcmNlbnRpbGUiOwotICAgIH0KLSAgICAjZW5kcmVnaW9uIENGVk8gVHlwZSBTVF9DZnZvVHlwZSDCpzE4LjE4LjEzCi0KLSAgICAjcmVnaW9uIE9wZXJhdG9yIFR5cGUgU1RfQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3IgwqcxOC4xOC4xNQotICAgIGludGVybmFsIGNsYXNzIE9wZXJhdG9ycwotICAgIHsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBCZWdpbnNXaXRoID0gImJlZ2luc1dpdGgiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEJldHdlZW4gPSAiYmV0d2VlbiI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ29udGFpbnNUZXh0ID0gImNvbnRhaW5zVGV4dCI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgRW5kc1dpdGggPSAiZW5kc1dpdGgiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEVxdWFsID0gImVxdWFsIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBHcmVhdGVyVGhhbiA9ICJncmVhdGVyVGhhbiI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgR3JlYXRlclRoYW5PckVxdWFsID0gImdyZWF0ZXJUaGFuT3JFcXVhbCI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTGVzc1RoYW4gPSAibGVzc1RoYW4iOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIExlc3NUaGFuT3JFcXVhbCA9ICJsZXNzVGhhbk9yRXF1YWwiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE5vdEJldHdlZW4gPSAibm90QmV0d2VlbiI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTm90Q29udGFpbnMgPSAibm90Q29udGFpbnMiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIE5vdEVxdWFsID0gIm5vdEVxdWFsIjsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBPcGVyYXRvciBUeXBlIFNUX0NvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yIMKnMTguMTguMTUKLQotICAgICNyZWdpb24gVGltZSBQZXJpb2QgVHlwZSBTVF9UaW1lUGVyaW9kIMKnMTguMTguODIKLSAgICBpbnRlcm5hbCBjbGFzcyBUaW1lUGVyaW9kcwotICAgIHsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBMYXN0N0RheXMgPSAibGFzdDdEYXlzIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBMYXN0TW9udGggPSAibGFzdE1vbnRoIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBMYXN0V2VlayA9ICJsYXN0V2VlayI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTmV4dE1vbnRoID0gIm5leHRNb250aCI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgTmV4dFdlZWsgPSAibmV4dFdlZWsiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFRoaXNNb250aCA9ICJ0aGlzTW9udGgiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFRoaXNXZWVrID0gInRoaXNXZWVrIjsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBUb2RheSA9ICJ0b2RheSI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgVG9tb3Jyb3cgPSAidG9tb3Jyb3ciOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFllc3RlcmRheSA9ICJ5ZXN0ZXJkYXkiOwotICAgIH0KLSAgICAjZW5kcmVnaW9uIFRpbWUgUGVyaW9kIFR5cGUgU1RfVGltZVBlcmlvZCDCpzE4LjE4LjgyCi0KLSAgICAjcmVnaW9uIENvbG9ycwotICAgIGludGVybmFsIGNsYXNzIENvbG9ycwotICAgIHsKLSAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBDZnZvTG93VmFsdWUgPSBAIiNGRkY4Njk2QiI7Ci0gICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQ2Z2b01pZGRsZVZhbHVlID0gQCIjRkZGRkVCODQiOwotICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIENmdm9IaWdoVmFsdWUgPSBAIiNGRjYzQkU3QiI7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29sb3JzCisvLy8gPHN1bW1hcnk+CisvLy8gVGhlIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgY29uc3RhbnRzCisvLy8gPC9zdW1tYXJ5PgoraW50ZXJuYWwgc3RhdGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzIHsKKyAgaW50ZXJuYWwgY2xhc3MgRXJyb3JzIHsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2NvbW1hU2VwYXJhdGVkQWRkcmVzc2VzID0KKyAgICAgICAgIk11bHRpcGxlIGFkZHJlc3NlcyBtYXkgbm90IGJlIGNvbW1hc2VwYXJhdGVkLCB1c2Ugc3BhY2UgaW5zdGVhZCI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9pbnZhbGlkUHJpb3JpdHkgPSAiSW52YWxpZCBwcmlvcml0eSBudW1iZXIuIE11c3QgYmUgYmlnZ2VyIHRoYW4gemVybyI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9pbnZhbGlkUmVtb3ZlUnVsZU9wZXJhdGlvbiA9ICJJbnZhbGlkIHJlbW92ZSBydWxlIG9wZXJhdGlvbiI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9taXNzaW5nQ2Z2b05vZGUgPSAiTWlzc2luZyAnY2Z2bycgbm9kZSBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX21pc3NpbmdDZnZvUGFyZW50Tm9kZSA9CisgICAgICAgICJNaXNzaW5nICdjZnZvJyBwYXJlbnQgbm9kZSBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX21pc3NpbmdDb25kaXRpb25hbEZvcm1hdHRpbmdOb2RlID0KKyAgICAgICAgIk1pc3NpbmcgJ2NvbmRpdGlvbmFsRm9ybWF0dGluZycgbm9kZSBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX21pc3NpbmdJdGVtUnVsZUxpc3QgPQorICAgICAgICAiTWlzc2luZyBpdGVtIHdpdGggYWRkcmVzcyAnezB9JyBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGUgTGlzdCI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9taXNzaW5nUHJpb3JpdHlBdHRyaWJ1dGUgPQorICAgICAgICAiTWlzc2luZyAncHJpb3JpdHknIGF0dHJpYnV0ZSBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGUiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfbWlzc2luZ1J1bGVUeXBlID0KKyAgICAgICAgIk1pc3NpbmcgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgVHlwZSBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX21pc3NpbmdTcXJlZkF0dHJpYnV0ZSA9CisgICAgICAgICJNaXNzaW5nICdzcXJlZicgYXR0cmlidXRlIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmciOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfbWlzc2luZ1R5cGVBdHRyaWJ1dGUgPQorICAgICAgICAiTWlzc2luZyAndHlwZScgYXR0cmlidXRlIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZSI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9taXNzaW5nV29ya3NoZWV0Tm9kZSA9ICJNaXNzaW5nICd3b3Jrc2hlZXQnIG5vZGUiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfbm9uU3VwcG9ydGVkUnVsZVR5cGUgPSAiTm9uIHN1cHBvcnRlZCBjb25kaXRpb25hbEZvcm1hdHRpbmdUeXBlOiB7MH0iOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfdW5leGlzdGVudENmdm9UeXBlQXR0cmlidXRlID0KKyAgICAgICAgIlVuZXhpc3RlbnQgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlIGF0dHJpYnV0ZSBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3VuZXhpc3RlbnRPcGVyYXRvclR5cGVBdHRyaWJ1dGUgPQorICAgICAgICAiVW5leGlzdGVudCBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUgYXR0cmlidXRlIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmciOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfdW5leGlzdGVudFRpbWVQZXJpb2RUeXBlQXR0cmlidXRlID0KKyAgICAgICAgIlVuZXhpc3RlbnQgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUgYXR0cmlidXRlIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmciOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfdW5leHBlY3RlZFJ1bGVUeXBlQXR0cmlidXRlID0KKyAgICAgICAgIlVuZXhwZWN0ZWQgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgYXR0cmlidXRlIGluIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZSI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF93cm9uZ051bWJlckNmdm9Db2xvck5vZGVzID0KKyAgICAgICAgIldyb25nIG51bWJlciBvZiAnY2Z2bycvJ2NvbG9yJyBub2RlcyBpbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFJ1bGUiOwogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCisgIGludGVybmFsIGNsYXNzIE5vZGVzIHsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3dvcmtzaGVldCA9ICJ3b3Jrc2hlZXQiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfY29uZGl0aW9uYWxGb3JtYXR0aW5nID0gImNvbmRpdGlvbmFsRm9ybWF0dGluZyI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9jZlJ1bGUgPSAiY2ZSdWxlIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2NvbG9yU2NhbGUgPSAiY29sb3JTY2FsZSI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9jZnZvID0gImNmdm8iOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfY29sb3IgPSAiY29sb3IiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfZGF0YUJhciA9ICJkYXRhQmFyIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2ljb25TZXQgPSAiaWNvblNldCI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9mb3JtdWxhID0gImZvcm11bGEiOworICB9CisKKyAgaW50ZXJuYWwgY2xhc3MgQXR0cmlidXRlcyB7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9hYm92ZUF2ZXJhZ2UgPSAiYWJvdmVBdmVyYWdlIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2JvdHRvbSA9ICJib3R0b20iOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfZHhmSWQgPSAiZHhmSWQiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfZXF1YWxBdmVyYWdlID0gImVxdWFsQXZlcmFnZSI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9pY29uU2V0ID0gImljb25TZXQiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfb3BlcmF0b3IgPSAib3BlcmF0b3IiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfcGVyY2VudCA9ICJwZXJjZW50IjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3ByaW9yaXR5ID0gInByaW9yaXR5IjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3JhbmsgPSAicmFuayI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9yZXZlcnNlID0gInJldmVyc2UiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfcmdiID0gInJnYiI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9zaG93VmFsdWUgPSAic2hvd1ZhbHVlIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3NxcmVmID0gInNxcmVmIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3N0ZERldiA9ICJzdGREZXYiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfc3RvcElmVHJ1ZSA9ICJzdG9wSWZUcnVlIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3RleHQgPSAidGV4dCI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF90aGVtZSA9ICJ0aGVtZSI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF90aW1lUGVyaW9kID0gInRpbWVQZXJpb2QiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfdGludCA9ICJ0aW50IjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3R5cGUgPSAidHlwZSI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF92YWwgPSAidmFsIjsKKyAgfQorCisgIGludGVybmFsIGNsYXNzIFBhdGhzIHsKKyAgICAvLyBNYWluIG5vZGUgYW5kIGF0dHJpYnV0ZXMKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3dvcmtzaGVldCA9ICJkOiIgKyBOb2Rlcy5fd29ya3NoZWV0OworCisgICAgLy8gPGNvbmRpdGlvbmFsRm9ybWF0dGluZz4gwqcxOC4zLjEuMTggbm9kZQorICAgIC8vIGNhbiBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gYSB3b3Jrc2hlZXQKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2NvbmRpdGlvbmFsRm9ybWF0dGluZyA9ICJkOiIgKyBOb2Rlcy5fY29uZGl0aW9uYWxGb3JtYXR0aW5nOworCisgICAgLy8gPGNmUnVsZT4gwqcxOC4zLjEuMTAgbm9kZQorICAgIC8vIGNhbiBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gYSA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPgorICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfY2ZSdWxlID0gImQ6IiArIE5vZGVzLl9jZlJ1bGU7CisKKyAgICAvLyA8Y29sb3JTY2FsZT4gwqcxOC4zLjEuMTYgbm9kZQorICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfY29sb3JTY2FsZSA9ICJkOiIgKyBOb2Rlcy5fY29sb3JTY2FsZTsKKworICAgIC8vIDxjZnZvPiDCpzE4LjMuMS4xMSBub2RlCisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9jZnZvID0gImQ6IiArIE5vZGVzLl9jZnZvOworCisgICAgLy8gPGNvbG9yPiDCpzE4LjMuMS4xNSBub2RlCisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9jb2xvciA9ICJkOiIgKyBOb2Rlcy5fY29sb3I7CisKKyAgICAvLyA8ZGF0YUJhcj4gwqcxOC4zLjEuMjggbm9kZQorICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfZGF0YUJhciA9ICJkOiIgKyBOb2Rlcy5fZGF0YUJhcjsKKworICAgIC8vIDxpY29uU2V0PiDCpzE4LjMuMS40OSBub2RlCisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9pY29uU2V0ID0gImQ6IiArIE5vZGVzLl9pY29uU2V0OworCisgICAgLy8gPGZvcm11bGE+IMKnMTguMy4xLjQzIG5vZGUKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2Zvcm11bGEgPSAiZDoiICsgTm9kZXMuX2Zvcm11bGE7CisKKyAgICAvLyBBdHRyaWJ1dGVzIChmb3IgYWxsIHRoZSBub2RlcykKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2Fib3ZlQXZlcmFnZUF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuX2Fib3ZlQXZlcmFnZTsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2JvdHRvbUF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuX2JvdHRvbTsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2R4ZklkQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5fZHhmSWQ7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9lcXVhbEF2ZXJhZ2VBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLl9lcXVhbEF2ZXJhZ2U7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9pY29uU2V0QXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5faWNvblNldDsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX29wZXJhdG9yQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5fb3BlcmF0b3I7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9wZXJjZW50QXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5fcGVyY2VudDsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3ByaW9yaXR5QXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5fcHJpb3JpdHk7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9yYW5rQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5fcmFuazsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3JldmVyc2VBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLl9yZXZlcnNlOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfcmdiQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5fcmdiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfc2hvd1ZhbHVlQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5fc2hvd1ZhbHVlOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfc3FyZWZBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLl9zcXJlZjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3N0ZERldkF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuX3N0ZERldjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3N0b3BJZlRydWVBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLl9zdG9wSWZUcnVlOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfdGV4dEF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuX3RleHQ7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF90aGVtZUF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuX3RoZW1lOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfdGltZVBlcmlvZEF0dHJpYnV0ZSA9ICJAIiArIEF0dHJpYnV0ZXMuX3RpbWVQZXJpb2Q7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF90aW50QXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5fdGludDsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3R5cGVBdHRyaWJ1dGUgPSAiQCIgKyBBdHRyaWJ1dGVzLl90eXBlOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfdmFsQXR0cmlidXRlID0gIkAiICsgQXR0cmlidXRlcy5fdmFsOworICB9CisKKyAgaW50ZXJuYWwgY2xhc3MgUnVsZVR5cGUgeworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfYWJvdmVBdmVyYWdlID0gImFib3ZlQXZlcmFnZSI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9iZWdpbnNXaXRoID0gImJlZ2luc1dpdGgiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfY2VsbElzID0gImNlbGxJcyI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9jb2xvclNjYWxlID0gImNvbG9yU2NhbGUiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfY29udGFpbnNCbGFua3MgPSAiY29udGFpbnNCbGFua3MiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfY29udGFpbnNFcnJvcnMgPSAiY29udGFpbnNFcnJvcnMiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfY29udGFpbnNUZXh0ID0gImNvbnRhaW5zVGV4dCI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9kYXRhQmFyID0gImRhdGFCYXIiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfZHVwbGljYXRlVmFsdWVzID0gImR1cGxpY2F0ZVZhbHVlcyI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9lbmRzV2l0aCA9ICJlbmRzV2l0aCI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9leHByZXNzaW9uID0gImV4cHJlc3Npb24iOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfaWNvblNldCA9ICJpY29uU2V0IjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX25vdENvbnRhaW5zQmxhbmtzID0gIm5vdENvbnRhaW5zQmxhbmtzIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX25vdENvbnRhaW5zRXJyb3JzID0gIm5vdENvbnRhaW5zRXJyb3JzIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX25vdENvbnRhaW5zVGV4dCA9ICJub3RDb250YWluc1RleHQiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfdGltZVBlcmlvZCA9ICJ0aW1lUGVyaW9kIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3RvcDEwID0gInRvcDEwIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3VuaXF1ZVZhbHVlcyA9ICJ1bmlxdWVWYWx1ZXMiOworCisgICAgLy8gRVBQbHVzIEV4dGVuZGVkIFR5cGVzCisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9hYm92ZU9yRXF1YWxBdmVyYWdlID0gImFib3ZlT3JFcXVhbEF2ZXJhZ2UiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfYWJvdmVTdGREZXYgPSAiYWJvdmVTdGREZXYiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfYmVsb3dBdmVyYWdlID0gImJlbG93QXZlcmFnZSI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9iZWxvd09yRXF1YWxBdmVyYWdlID0gImJlbG93T3JFcXVhbEF2ZXJhZ2UiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfYmVsb3dTdGREZXYgPSAiYmVsb3dTdGREZXYiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfYmV0d2VlbiA9ICJiZXR3ZWVuIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2JvdHRvbSA9ICJib3R0b20iOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfYm90dG9tUGVyY2VudCA9ICJib3R0b21QZXJjZW50IjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2VxdWFsID0gImVxdWFsIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2dyZWF0ZXJUaGFuID0gImdyZWF0ZXJUaGFuIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2dyZWF0ZXJUaGFuT3JFcXVhbCA9ICJncmVhdGVyVGhhbk9yRXF1YWwiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfaWNvblNldDMgPSAiaWNvblNldDMiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfaWNvblNldDQgPSAiaWNvblNldDQiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfaWNvblNldDUgPSAiaWNvblNldDUiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfbGFzdDdEYXlzID0gImxhc3Q3RGF5cyI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9sYXN0TW9udGggPSAibGFzdE1vbnRoIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2xhc3RXZWVrID0gImxhc3RXZWVrIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2xlc3NUaGFuID0gImxlc3NUaGFuIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2xlc3NUaGFuT3JFcXVhbCA9ICJsZXNzVGhhbk9yRXF1YWwiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfbmV4dE1vbnRoID0gIm5leHRNb250aCI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9uZXh0V2VlayA9ICJuZXh0V2VlayI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9ub3RCZXR3ZWVuID0gIm5vdEJldHdlZW4iOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfbm90RXF1YWwgPSAibm90RXF1YWwiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfdGhpc01vbnRoID0gInRoaXNNb250aCI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF90aGlzV2VlayA9ICJ0aGlzV2VlayI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF90aHJlZUNvbG9yU2NhbGUgPSAidGhyZWVDb2xvclNjYWxlIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3RvZGF5ID0gInRvZGF5IjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3RvbW9ycm93ID0gInRvbW9ycm93IjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3RvcCA9ICJ0b3AiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfdG9wUGVyY2VudCA9ICJ0b3BQZXJjZW50IjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3R3b0NvbG9yU2NhbGUgPSAidHdvQ29sb3JTY2FsZSI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF95ZXN0ZXJkYXkgPSAieWVzdGVyZGF5IjsKKyAgfQorCisgIGludGVybmFsIGNsYXNzIENmdm9UeXBlIHsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX21pbiA9ICJtaW4iOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfbWF4ID0gIm1heCI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9udW0gPSAibnVtIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2Zvcm11bGEgPSAiZm9ybXVsYSI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9wZXJjZW50ID0gInBlcmNlbnQiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfcGVyY2VudGlsZSA9ICJwZXJjZW50aWxlIjsKKyAgfQorCisgIGludGVybmFsIGNsYXNzIE9wZXJhdG9ycyB7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9iZWdpbnNXaXRoID0gImJlZ2luc1dpdGgiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfYmV0d2VlbiA9ICJiZXR3ZWVuIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2NvbnRhaW5zVGV4dCA9ICJjb250YWluc1RleHQiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfZW5kc1dpdGggPSAiZW5kc1dpdGgiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfZXF1YWwgPSAiZXF1YWwiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfZ3JlYXRlclRoYW4gPSAiZ3JlYXRlclRoYW4iOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfZ3JlYXRlclRoYW5PckVxdWFsID0gImdyZWF0ZXJUaGFuT3JFcXVhbCI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9sZXNzVGhhbiA9ICJsZXNzVGhhbiI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9sZXNzVGhhbk9yRXF1YWwgPSAibGVzc1RoYW5PckVxdWFsIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX25vdEJldHdlZW4gPSAibm90QmV0d2VlbiI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9ub3RDb250YWlucyA9ICJub3RDb250YWlucyI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9ub3RFcXVhbCA9ICJub3RFcXVhbCI7CisgIH0KKworICBpbnRlcm5hbCBjbGFzcyBUaW1lUGVyaW9kcyB7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9sYXN0N0RheXMgPSAibGFzdDdEYXlzIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2xhc3RNb250aCA9ICJsYXN0TW9udGgiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfbGFzdFdlZWsgPSAibGFzdFdlZWsiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfbmV4dE1vbnRoID0gIm5leHRNb250aCI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9uZXh0V2VlayA9ICJuZXh0V2VlayI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF90aGlzTW9udGggPSAidGhpc01vbnRoIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3RoaXNXZWVrID0gInRoaXNXZWVrIjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3RvZGF5ID0gInRvZGF5IjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3RvbW9ycm93ID0gInRvbW9ycm93IjsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3llc3RlcmRheSA9ICJ5ZXN0ZXJkYXkiOworICB9CisKKyAgaW50ZXJuYWwgY2xhc3MgQ29sb3JzIHsKKyAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2Nmdm9Mb3dWYWx1ZSA9ICIjRkZGODY5NkIiOworICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBfY2Z2b01pZGRsZVZhbHVlID0gIiNGRkZGRUI4NCI7CisgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9jZnZvSGlnaFZhbHVlID0gIiNGRjYzQkU3QiI7CisgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbnVtcy5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbnVtcy5jcwppbmRleCBiZmY5NzI2Li44ODg1ZjVjIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW51bXMuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VudW1zLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw3NzIgKzEzLDc0MSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IgICAgICAgICAgQ2hhbmdlCQkJCQkJICAgICAgICAgICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBBZGFwdGlvbiAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwoteworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCisvLy8gPHN1bW1hcnk+CisvLy8gRW51bSBmb3IgQ29uZGl0aW9uYWwgRm9ybWF0IFR5cGUgU1RfQ2ZUeXBlIMKnMTguMTguMTIuIFdpdGggc29tZSBjaGFuZ2VzLgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHsKICAgLy8vIDxzdW1tYXJ5PgotICAvLy8gRW51bSBmb3IgQ29uZGl0aW9uYWwgRm9ybWF0IFR5cGUgU1RfQ2ZUeXBlIMKnMTguMTguMTIuIFdpdGggc29tZSBjaGFuZ2VzLgorICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB0aGF0IGFyZSBhYm92ZSB0aGUgYXZlcmFnZQorICAvLy8gZm9yIGFsbCB2YWx1ZXMgaW4gdGhlIHJhbmdlLgogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgZW51bSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZQotICB7Ci0gICAgI3JlZ2lvbiBBdmVyYWdlCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHRoYXQgYXJlIGFib3ZlIHRoZSBhdmVyYWdlCi0gICAgLy8vIGZvciBhbGwgdmFsdWVzIGluIHRoZSByYW5nZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz5BYm92ZUF2ZXJhZ2UgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIEFib3ZlQXZlcmFnZSwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB0aGF0IGFyZSBhYm92ZSBvciBlcXVhbAotICAgIC8vLyB0aGUgYXZlcmFnZSBmb3IgYWxsIHZhbHVlcyBpbiB0aGUgcmFuZ2UuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+QWJvdmVBdmVyYWdlIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KLSAgICBBYm92ZU9yRXF1YWxBdmVyYWdlLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHRoYXQgYXJlIGJlbG93IHRoZSBhdmVyYWdlCi0gICAgLy8vIGZvciBhbGwgdmFsdWVzIGluIHRoZSByYW5nZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz5BYm92ZUF2ZXJhZ2UgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIEJlbG93QXZlcmFnZSwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB0aGF0IGFyZSBiZWxvdyBvciBlcXVhbAotICAgIC8vLyB0aGUgYXZlcmFnZSBmb3IgYWxsIHZhbHVlcyBpbiB0aGUgcmFuZ2UuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+QWJvdmVBdmVyYWdlIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KLSAgICBCZWxvd09yRXF1YWxBdmVyYWdlLAotICAgICNlbmRyZWdpb24KLQotICAgICNyZWdpb24gU3RkRGV2Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHRoYXQgYXJlIGFib3ZlIHRoZSBzdGFuZGFyZAotICAgIC8vLyBkZXZpYXRpb25hIGZvciBhbGwgdmFsdWVzIGluIHRoZSByYW5nZS4KLSAgICAvLy8gPHJlbWFya3M+QWJvdmVBdmVyYWdlIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIEFib3ZlU3RkRGV2LAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHRoYXQgYXJlIGJlbG93IHRoZSBzdGFuZGFyZAotICAgIC8vLyBkZXZpYXRpb25hIGZvciBhbGwgdmFsdWVzIGluIHRoZSByYW5nZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz5BYm92ZUF2ZXJhZ2UgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIEJlbG93U3RkRGV2LAotICAgICNlbmRyZWdpb24KLQotICAgICNyZWdpb24gVG9wQm90dG9tCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHdob3NlIHZhbHVlcyBmYWxsIGluIHRoZQotICAgIC8vLyBib3R0b20gTiBicmFja2V0IGFzIHNwZWNpZmllZC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz5Ub3AxMCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgQm90dG9tLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHdob3NlIHZhbHVlcyBmYWxsIGluIHRoZQotICAgIC8vLyBib3R0b20gTiBwZXJjZW50IGFzIHNwZWNpZmllZC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz5Ub3AxMCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgQm90dG9tUGVyY2VudCwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB3aG9zZSB2YWx1ZXMgZmFsbCBpbiB0aGUKLSAgICAvLy8gdG9wIE4gYnJhY2tldCBhcyBzcGVjaWZpZWQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+VG9wMTAgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIFRvcCwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB3aG9zZSB2YWx1ZXMgZmFsbCBpbiB0aGUKLSAgICAvLy8gdG9wIE4gcGVyY2VudCBhcyBzcGVjaWZpZWQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+VG9wMTAgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIFRvcFBlcmNlbnQsCi0gICAgI2VuZHJlZ2lvbgotCi0gICAgI3JlZ2lvbiBUaW1lUGVyaW9kCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGNvbnRhaW5pbmcgZGF0ZXMgaW4gdGhlCi0gICAgLy8vIGxhc3QgNyBkYXlzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPlRpbWVQZXJpb2QgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIExhc3Q3RGF5cywKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBjb250YWluaW5nIGRhdGVzIGluIHRoZQotICAgIC8vLyBsYXN0IG1vbnRoLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPlRpbWVQZXJpb2QgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIExhc3RNb250aCwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBjb250YWluaW5nIGRhdGVzIGluIHRoZQotICAgIC8vLyBsYXN0IHdlZWsuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+VGltZVBlcmlvZCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgTGFzdFdlZWssCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgY29udGFpbmluZyBkYXRlcyBpbiB0aGUKLSAgICAvLy8gbmV4dCBtb250aC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz5UaW1lUGVyaW9kIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KLSAgICBOZXh0TW9udGgsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgY29udGFpbmluZyBkYXRlcyBpbiB0aGUKLSAgICAvLy8gbmV4dCB3ZWVrLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPlRpbWVQZXJpb2QgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIE5leHRXZWVrLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGNvbnRhaW5pbmcgZGF0ZXMgaW4gdGhpcwotICAgIC8vLyBtb250aC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz5UaW1lUGVyaW9kIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KLSAgICBUaGlzTW9udGgsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgY29udGFpbmluZyBkYXRlcyBpbiB0aGlzCi0gICAgLy8vIHdlZWsuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+VGltZVBlcmlvZCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgVGhpc1dlZWssCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgY29udGFpbmluZyB0b2RheSBkYXRlcy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz5UaW1lUGVyaW9kIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KLSAgICBUb2RheSwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBjb250YWluaW5nIHRvbW9ycm93IGRhdGVzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPlRpbWVQZXJpb2QgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIFRvbW9ycm93LAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGNvbnRhaW5pbmcgeWVzdGVyZGF5IGRhdGVzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPlRpbWVQZXJpb2QgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIFllc3RlcmRheSwKLSAgICAjZW5kcmVnaW9uCi0KLSAgICAjcmVnaW9uIENlbGxJcwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBpbiB0aGUgcmFuZ2UgdGhhdCBiZWdpbiB3aXRoCi0gICAgLy8vIHRoZSBnaXZlbiB0ZXh0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPgotICAgIC8vLyBFcXVpdmFsZW50IHRvIHVzaW5nIHRoZSBMRUZUKCkgc2hlZXQgZnVuY3Rpb24gYW5kIGNvbXBhcmluZyB2YWx1ZXMuCi0gICAgLy8vIDwvcmVtYXJrcz4KLSAgICAvLy8gPHJlbWFya3M+QmVnaW5zV2l0aCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgQmVnaW5zV2l0aCwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBpbiB0aGUgcmFuZ2UgYmV0d2VlbiB0aGUKLSAgICAvLy8gZ2l2ZW4gdHdvIGZvcm11bGFzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPkNlbGxJcyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgQmV0d2VlbiwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB0aGF0IGFyZSBjb21wbGV0ZWx5IGJsYW5rLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPgotICAgIC8vLyBFcXVpdmFsZW50IG9mIHVzaW5nIExFTihUUklNKCkpLiBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlIGNlbGwgY29udGFpbnMgb25seQotICAgIC8vLyBjaGFyYWN0ZXJzIHRoYXQgVFJJTSgpIHdvdWxkIHJlbW92ZSwgdGhlbiBpdCBpcyBjb25zaWRlcmVkIGJsYW5rLiBBbiBlbXB0eSBjZWxsCi0gICAgLy8vIGlzIGFsc28gY29uc2lkZXJlZCBibGFuay4KLSAgICAvLy8gPC9yZW1hcmtzPgotICAgIC8vLyA8cmVtYXJrcz5Db250YWluc0JsYW5rcyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgQ29udGFpbnNCbGFua3MsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgd2l0aCBmb3JtdWxhIGVycm9ycy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz4KLSAgICAvLy8gRXF1aXZhbGVudCB0byB1c2luZyBJU0VSUk9SKCkgc2hlZXQgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzCi0gICAgLy8vIGEgZm9ybXVsYSBlcnJvci4KLSAgICAvLy8gPC9yZW1hcmtzPgotICAgIC8vLyA8cmVtYXJrcz5Db250YWluc0Vycm9ycyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgQ29udGFpbnNFcnJvcnMsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgaW4gdGhlIHJhbmdlIHRoYXQgYmVnaW4gd2l0aAotICAgIC8vLyB0aGUgZ2l2ZW4gdGV4dC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz4KLSAgICAvLy8gRXF1aXZhbGVudCB0byB1c2luZyB0aGUgTEVGVCgpIHNoZWV0IGZ1bmN0aW9uIGFuZCBjb21wYXJpbmcgdmFsdWVzLgotICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgLy8vIDxyZW1hcmtzPkNvbnRhaW5zVGV4dCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgQ29udGFpbnNUZXh0LAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGR1cGxpY2F0ZWQgdmFsdWVzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPkR1cGxpY2F0ZVZhbHVlcyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgRHVwbGljYXRlVmFsdWVzLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGVuZGluZyB3aXRoIGdpdmVuIHRleHQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+Ci0gICAgLy8vIEVxdWl2YWxlbnQgdG8gdXNpbmcgdGhlIFJJR0hUKCkgc2hlZXQgZnVuY3Rpb24gYW5kIGNvbXBhcmluZyB2YWx1ZXMuCi0gICAgLy8vIDwvcmVtYXJrcz4KLSAgICAvLy8gPHJlbWFya3M+RW5kc1dpdGggRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIEVuZHNXaXRoLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGVxdWFscyB0byB3aXRoIGdpdmVuIGZvcm11bGEuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+Q2VsbElzIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KLSAgICBFcXVhbCwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgY29udGFpbnMgYSBmb3JtdWxhIHRvIGV2YWx1YXRlLiBXaGVuIHRoZSAKLSAgICAvLy8gZm9ybXVsYSByZXN1bHQgaXMgdHJ1ZSwgdGhlIGNlbGwgaXMgaGlnaGxpZ2h0ZWQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+RXhwcmVzc2lvbiBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgRXhwcmVzc2lvbiwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBncmVhdGVyIHRoYW4gdGhlIGdpdmVuIGZvcm11bGEuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+Q2VsbElzIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KLSAgICBHcmVhdGVyVGhhbiwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlCi0gICAgLy8vIGdpdmVuIGZvcm11bGEuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+Q2VsbElzIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KLSAgICBHcmVhdGVyVGhhbk9yRXF1YWwsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgbGVzcyB0aGFuIHRoZSBnaXZlbiBmb3JtdWxhLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPkNlbGxJcyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgTGVzc1RoYW4sCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgbGVzcyB0aGFuIG9yIGVxdWFsIHRoZQotICAgIC8vLyBnaXZlbiBmb3JtdWxhLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPkNlbGxJcyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgTGVzc1RoYW5PckVxdWFsLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIG91dHNpZGUgdGhlIHJhbmdlIGluCi0gICAgLy8vIGdpdmVuIHR3byBmb3JtdWxhcy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz5DZWxsSXMgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIE5vdEJldHdlZW4sCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgdGhhdCBkb2VzIG5vdCBjb250YWlucyB0aGUKLSAgICAvLy8gZ2l2ZW4gZm9ybXVsYS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz5DZWxsSXMgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIE5vdENvbnRhaW5zLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHRoYXQgYXJlIG5vdCBibGFuay4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz4KLSAgICAvLy8gRXF1aXZhbGVudCBvZiB1c2luZyBMRU4oVFJJTSgpKS4gVGhpcyBtZWFucyB0aGF0IGlmIHRoZSBjZWxsIGNvbnRhaW5zIG9ubHkKLSAgICAvLy8gY2hhcmFjdGVycyB0aGF0IFRSSU0oKSB3b3VsZCByZW1vdmUsIHRoZW4gaXQgaXMgY29uc2lkZXJlZCBibGFuay4gQW4gZW1wdHkgY2VsbAotICAgIC8vLyBpcyBhbHNvIGNvbnNpZGVyZWQgYmxhbmsuCi0gICAgLy8vIDwvcmVtYXJrcz4KLSAgICAvLy8gPHJlbWFya3M+Tm90Q29udGFpbnNCbGFua3MgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIE5vdENvbnRhaW5zQmxhbmtzLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHdpdGhvdXQgZm9ybXVsYSBlcnJvcnMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+Ci0gICAgLy8vIEVxdWl2YWxlbnQgdG8gdXNpbmcgSVNFUlJPUigpIHNoZWV0IGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhCi0gICAgLy8vIGZvcm11bGEgZXJyb3IuCi0gICAgLy8vIDwvcmVtYXJrcz4KLSAgICAvLy8gPHJlbWFya3M+Tm90Q29udGFpbnNFcnJvcnMgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgotICAgIE5vdENvbnRhaW5zRXJyb3JzLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHRoYXQgZG8gbm90IGNvbnRhaW4KLSAgICAvLy8gdGhlIGdpdmVuIHRleHQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+Ci0gICAgLy8vIEVxdWl2YWxlbnQgdG8gdXNpbmcgdGhlIFNFQVJDSCgpIHNoZWV0IGZ1bmN0aW9uLgotICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgLy8vIDxyZW1hcmtzPk5vdENvbnRhaW5zVGV4dCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgTm90Q29udGFpbnNUZXh0LAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIG5vdCBlcXVhbHMgdG8gd2l0aAotICAgIC8vLyBnaXZlbiBmb3JtdWxhLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPkNlbGxJcyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgTm90RXF1YWwsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgdW5pcXVlIHZhbHVlcyBpbiB0aGUgcmFuZ2UuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+VW5pcXVlVmFsdWVzIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KLSAgICBVbmlxdWVWYWx1ZXMsCi0gICAgI2VuZHJlZ2lvbgotCi0gICAgI3JlZ2lvbiBDb2xvclNjYWxlCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaHJlZSBDb2xvciBTY2FsZSAoTG93LCBNaWRkbGUgYW5kIEhpZ2ggQ29sb3IgU2NhbGUpCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+Q29sb3JTY2FsZSBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgVGhyZWVDb2xvclNjYWxlLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUd28gQ29sb3IgU2NhbGUgKExvdyBhbmQgSGlnaCBDb2xvciBTY2FsZSkKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz5Db2xvclNjYWxlIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KLSAgICBUd29Db2xvclNjYWxlLAotICAgICNlbmRyZWdpb24KLQotICAgICNyZWdpb24gSWNvblNldAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgYXBwbGllcyBhIDMgc2V0IGljb25zIHRvIGNlbGxzIGFjY29yZGluZwotICAgIC8vLyB0byB0aGVpciB2YWx1ZXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+SWNvblNldCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgVGhyZWVJY29uU2V0LAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBhcHBsaWVzIGEgNCBzZXQgaWNvbnMgdG8gY2VsbHMgYWNjb3JkaW5nCi0gICAgLy8vIHRvIHRoZWlyIHZhbHVlcy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz5JY29uU2V0IEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KLSAgICBGb3VySWNvblNldCwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgYXBwbGllcyBhIDUgc2V0IGljb25zIHRvIGNlbGxzIGFjY29yZGluZwotICAgIC8vLyB0byB0aGVpciB2YWx1ZXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+SWNvblNldCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+Ci0gICAgRml2ZUljb25TZXQsCi0gICAgI2VuZHJlZ2lvbgotCi0gICAgI3JlZ2lvbiBEYXRhQmFyCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBkaXNwbGF5cyBhIGdyYWRhdGVkIGRhdGEgYmFyIGluIHRoZSByYW5nZSBvZiBjZWxscy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz5EYXRhQmFyIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KLSAgICBEYXRhQmFyCi0gICAgI2VuZHJlZ2lvbgotICB9CisgIC8vLyA8cmVtYXJrcz5BYm92ZUF2ZXJhZ2UgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBBYm92ZUF2ZXJhZ2UsCiAKICAgLy8vIDxzdW1tYXJ5PgotICAvLy8gRW51bSBmb3IgQ29uZGl0aW9uYWwgRm9ybWF0IFZhbHVlIE9iamVjdCBUeXBlIFNUX0Nmdm9UeXBlIMKnMTguMTguMTMKKyAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgdGhhdCBhcmUgYWJvdmUgb3IgZXF1YWwKKyAgLy8vIHRoZSBhdmVyYWdlIGZvciBhbGwgdmFsdWVzIGluIHRoZSByYW5nZS4KICAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGVudW0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlCi0gIHsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEZvcm11bGEKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIEZvcm11bGEsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIE1heGltdW0gVmFsdWUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIE1heCwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTWluaW11bSBWYWx1ZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgTWluLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBOdW1iZXIgVmFsdWUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIE51bSwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUGVyY2VudAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgUGVyY2VudCwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUGVyY2VudGlsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgUGVyY2VudGlsZQotICB9CisgIC8vLyA8cmVtYXJrcz5BYm92ZUF2ZXJhZ2UgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBBYm92ZU9yRXF1YWxBdmVyYWdlLAogCiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEVudW0gZm9yIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgVmFsdWUgT2JqZWN0IFBvc2l0aW9uCisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHRoYXQgYXJlIGJlbG93IHRoZSBhdmVyYWdlCisgIC8vLyBmb3IgYWxsIHZhbHVlcyBpbiB0aGUgcmFuZ2UuCiAgIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBlbnVtIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24KLSAgewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhlIGxvd2VyIHBvc2l0aW9uIGZvciBib3RoIFR3b0NvbG9yU2NhbGUgYW5kIFRocmVlQ29sb3JTY2FsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgTG93LAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGUgbWlkZGxlIHBvc2l0aW9uIG9ubHkgZm9yIFRocmVlQ29sb3JTY2FsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgTWlkZGxlLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGUgaGlnaGVzdCBwb3NpdGlvbiBmb3IgYm90aCBUd29Db2xvclNjYWxlIGFuZCBUaHJlZUNvbG9yU2NhbGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIEhpZ2gKLSAgfQorICAvLy8gPHJlbWFya3M+QWJvdmVBdmVyYWdlIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgQmVsb3dBdmVyYWdlLAogCiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEVudW0gZm9yIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgVmFsdWUgT2JqZWN0IE5vZGUgVHlwZQorICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB0aGF0IGFyZSBiZWxvdyBvciBlcXVhbAorICAvLy8gdGhlIGF2ZXJhZ2UgZm9yIGFsbCB2YWx1ZXMgaW4gdGhlIHJhbmdlLgogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgZW51bSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdE5vZGVUeXBlCi0gIHsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICdjZnZvJyBub2RlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBDZnZvLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAnY29sb3InIG5vZGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIENvbG9yCi0gIH0KKyAgLy8vIDxyZW1hcmtzPkFib3ZlQXZlcmFnZSBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgIEJlbG93T3JFcXVhbEF2ZXJhZ2UsCiAKICAgLy8vIDxzdW1tYXJ5PgotICAvLy8gRW51bSBmb3IgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBPcGVyYXJ0b3IgVHlwZSBTVF9Db25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvciDCpzE4LjE4LjE1CisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHRoYXQgYXJlIGFib3ZlIHRoZSBzdGFuZGFyZAorICAvLy8gZGV2aWF0aW9uYSBmb3IgYWxsIHZhbHVlcyBpbiB0aGUgcmFuZ2UuCisgIC8vLyA8cmVtYXJrcz5BYm92ZUF2ZXJhZ2UgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgZW51bSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUKLSAgewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQmVnaW5zIFdpdGguICdCZWdpbnMgd2l0aCcgb3BlcmF0b3IKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIEJlZ2luc1dpdGgsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEJldHdlZW4uICdCZXR3ZWVuJyBvcGVyYXRvcgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgQmV0d2VlbiwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQ29udGFpbnMuICdDb250YWlucycgb3BlcmF0b3IKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIENvbnRhaW5zVGV4dCwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRW5kcyBXaXRoLiAnRW5kcyB3aXRoJyBvcGVyYXRvcgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgRW5kc1dpdGgsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEVxdWFsLiAnRXF1YWwgdG8nIG9wZXJhdG9yCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBFcXVhbCwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gR3JlYXRlciBUaGFuLiAnR3JlYXRlciB0aGFuJyBvcGVyYXRvcgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgR3JlYXRlclRoYW4sCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEdyZWF0ZXIgVGhhbiBPciBFcXVhbC4gJ0dyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bycgb3BlcmF0b3IKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIEdyZWF0ZXJUaGFuT3JFcXVhbCwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTGVzcyBUaGFuLiAnTGVzcyB0aGFuJyBvcGVyYXRvcgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgTGVzc1RoYW4sCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIExlc3MgVGhhbiBPciBFcXVhbC4gJ0xlc3MgdGhhbiBvciBlcXVhbCB0bycgb3BlcmF0b3IKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIExlc3NUaGFuT3JFcXVhbCwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTm90IEJldHdlZW4uICdOb3QgYmV0d2Vlbicgb3BlcmF0b3IKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIE5vdEJldHdlZW4sCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIERvZXMgTm90IENvbnRhaW4uICdEb2VzIG5vdCBjb250YWluJyBvcGVyYXRvcgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgTm90Q29udGFpbnMsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIE5vdCBFcXVhbC4gJ05vdCBlcXVhbCB0bycgb3BlcmF0b3IKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIE5vdEVxdWFsCi0gIH0KKyAgQWJvdmVTdGREZXYsCiAKICAgLy8vIDxzdW1tYXJ5PgotICAvLy8gRW51bSBmb3IgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBUaW1lIFBlcmlvZCBUeXBlIFNUX1RpbWVQZXJpb2QgwqcxOC4xOC44MgorICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB0aGF0IGFyZSBiZWxvdyB0aGUgc3RhbmRhcmQKKyAgLy8vIGRldmlhdGlvbmEgZm9yIGFsbCB2YWx1ZXMgaW4gdGhlIHJhbmdlLgogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgZW51bSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZQotICB7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBMYXN0IDcgRGF5cy4gQSBkYXRlIGluIHRoZSBsYXN0IHNldmVuIGRheXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBMYXN0N0RheXMsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIExhc3QgTW9udGguIEEgZGF0ZSBvY2N1cmluZyBpbiB0aGUgbGFzdCBjYWxlbmRhciBtb250aC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIExhc3RNb250aCwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTGFzdCBXZWVrLiBBIGRhdGUgb2NjdXJpbmcgbGFzdCB3ZWVrLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgTGFzdFdlZWssCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIE5leHQgTW9udGguIEEgZGF0ZSBvY2N1cmluZyBpbiB0aGUgbmV4dCBjYWxlbmRhciBtb250aC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIE5leHRNb250aCwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTmV4dCBXZWVrLiBBIGRhdGUgb2NjdXJpbmcgbmV4dCB3ZWVrLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgTmV4dFdlZWssCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgTW9udGguIEEgZGF0ZSBvY2N1cmluZyBpbiB0aGlzIGNhbGVuZGFyIG1vbnRoLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgVGhpc01vbnRoLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIFdlZWsuIEEgZGF0ZSBvY2N1cmluZyB0aGlzIHdlZWsuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBUaGlzV2VlaywKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVG9kYXkuIFRvZGF5J3MgZGF0ZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIFRvZGF5LAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUb21vcnJvdy4gVG9tb3Jyb3cncyBkYXRlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgVG9tb3Jyb3csCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFllc3RlcmRheS4gWWVzdGVyZGF5J3MgZGF0ZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIFllc3RlcmRheQotICB9CisgIC8vLyA8cmVtYXJrcz5BYm92ZUF2ZXJhZ2UgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBCZWxvd1N0ZERldiwKIAogICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAxOC4xOC40MiBTVF9JY29uU2V0VHlwZSAoSWNvbiBTZXQgVHlwZSkgLSBPbmx5IDMgaWNvbnMKKyAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgd2hvc2UgdmFsdWVzIGZhbGwgaW4gdGhlCisgIC8vLyBib3R0b20gTiBicmFja2V0IGFzIHNwZWNpZmllZC4KICAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGVudW0gZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nM0ljb25zU2V0VHlwZQotICB7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAoMyBBcnJvd3MpIDMgYXJyb3dzIGljb24gc2V0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgQXJyb3dzLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAoMyBBcnJvd3MgKEdyYXkpKSAzIGdyYXkgYXJyb3dzIGljb24gc2V0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgQXJyb3dzR3JheSwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gKDMgRmxhZ3MpIDMgZmxhZ3MgaWNvbiBzZXQuIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgRmxhZ3MsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICgzIFNpZ25zKSAzIHNpZ25zIGljb24gc2V0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgU2lnbnMsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICgzIFN5bWJvbHMgQ2lyY2xlZCkgMyBzeW1ib2xzIGljb24gc2V0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgU3ltYm9scywKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gKDMgU3ltYm9scykgMyBTeW1ib2xzIGljb24gc2V0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgU3ltYm9sczIsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICgzIFRyYWZmaWMgTGlnaHRzKSAzIHRyYWZmaWMgbGlnaHRzIGljb24gc2V0ICgjMSkuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBUcmFmZmljTGlnaHRzMSwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gKDMgVHJhZmZpYyBMaWdodHMgQmxhY2spIDMgdHJhZmZpYyBsaWdodHMgaWNvbiBzZXQgd2l0aCB0aGljayBibGFjayBib3JkZXIuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBUcmFmZmljTGlnaHRzMgotICB9CisgIC8vLyA8cmVtYXJrcz5Ub3AxMCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgIEJvdHRvbSwKIAogICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAxOC4xOC40MiBTVF9JY29uU2V0VHlwZSAoSWNvbiBTZXQgVHlwZSkgLSBPbmx5IDQgaWNvbnMKKyAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgd2hvc2UgdmFsdWVzIGZhbGwgaW4gdGhlCisgIC8vLyBib3R0b20gTiBwZXJjZW50IGFzIHNwZWNpZmllZC4KICAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGVudW0gZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZQotICB7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAoNCBBcnJvd3MpIDQgYXJyb3dzIGljb24gc2V0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgQXJyb3dzLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAoNCBBcnJvd3MgKEdyYXkpKSA0IGdyYXkgYXJyb3dzIGljb24gc2V0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgQXJyb3dzR3JheSwKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gKDQgUmF0aW5ncykgNCByYXRpbmdzIGljb24gc2V0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgUmF0aW5nLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAoNCBSZWQgVG8gQmxhY2spIDQgJ3JlZCB0byBibGFjaycgaWNvbiBzZXQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBSZWRUb0JsYWNrLAotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAoNCBUcmFmZmljIExpZ2h0cykgNCB0cmFmZmljIGxpZ2h0cyBpY29uIHNldC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIFRyYWZmaWNMaWdodHMKLSAgfQorICAvLy8gPHJlbWFya3M+VG9wMTAgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBCb3R0b21QZXJjZW50LAogCiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIDE4LjE4LjQyIFNUX0ljb25TZXRUeXBlIChJY29uIFNldCBUeXBlKSAtIE9ubHkgNSBpY29ucworICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB3aG9zZSB2YWx1ZXMgZmFsbCBpbiB0aGUKKyAgLy8vIHRvcCBOIGJyYWNrZXQgYXMgc3BlY2lmaWVkLgogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgZW51bSBlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc1SWNvbnNTZXRUeXBlCi0gIHsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICg1IEFycm93cykgNSBhcnJvd3MgaWNvbiBzZXQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBBcnJvd3MsCisgIC8vLyA8cmVtYXJrcz5Ub3AxMCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgIFRvcCwKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gKDUgQXJyb3dzIChHcmF5KSkgNSBncmF5IGFycm93cyBpY29uIHNldC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIEFycm93c0dyYXksCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICg1IFF1YXJ0ZXJzKSA1IHF1YXJ0ZXJzIGljb24gc2V0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgUXVhcnRlcnMsCi0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICg1IFJhdGluZ3MgSWNvbiBTZXQpIDUgcmF0aW5nIGljb24gc2V0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgUmF0aW5nCi0gIH0KICAgLy8vIDxzdW1tYXJ5PgotICAvLy8gMTguMTguNDIgU1RfSWNvblNldFR5cGUgKEljb24gU2V0IFR5cGUpCisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHdob3NlIHZhbHVlcyBmYWxsIGluIHRoZQorICAvLy8gdG9wIE4gcGVyY2VudCBhcyBzcGVjaWZpZWQuCiAgIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBlbnVtIGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25zU2V0VHlwZQotICB7Ci0gICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAvLy8gKDMgQXJyb3dzKSAzIGFycm93cyBpY29uIHNldC4KLSAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICBUaHJlZUFycm93cywKKyAgLy8vIDxyZW1hcmtzPlRvcDEwIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgVG9wUGVyY2VudCwKIAotICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgLy8vICgzIEFycm93cyAoR3JheSkpIDMgZ3JheSBhcnJvd3MgaWNvbiBzZXQuCi0gICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgVGhyZWVBcnJvd3NHcmF5LAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGNvbnRhaW5pbmcgZGF0ZXMgaW4gdGhlCisgIC8vLyBsYXN0IDcgZGF5cy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPlRpbWVQZXJpb2QgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBMYXN0N0RheXMsCiAKLSAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgIC8vLyAoMyBGbGFncykgMyBmbGFncyBpY29uIHNldC4gCi0gICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgVGhyZWVGbGFncywKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBjb250YWluaW5nIGRhdGVzIGluIHRoZQorICAvLy8gbGFzdCBtb250aC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPlRpbWVQZXJpb2QgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBMYXN0TW9udGgsCiAKLSAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgIC8vLyAoMyBTaWducykgMyBzaWducyBpY29uIHNldC4KLSAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICBUaHJlZVNpZ25zLAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGNvbnRhaW5pbmcgZGF0ZXMgaW4gdGhlCisgIC8vLyBsYXN0IHdlZWsuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5UaW1lUGVyaW9kIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgTGFzdFdlZWssCiAKLSAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgIC8vLyAoMyBTeW1ib2xzIENpcmNsZWQpIDMgc3ltYm9scyBpY29uIHNldC4KLSAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICBUaHJlZVN5bWJvbHMsCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgY29udGFpbmluZyBkYXRlcyBpbiB0aGUKKyAgLy8vIG5leHQgbW9udGguCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5UaW1lUGVyaW9kIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgTmV4dE1vbnRoLAogCi0gICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAvLy8gKDMgU3ltYm9scykgMyBTeW1ib2xzIGljb24gc2V0LgotICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgIFRocmVlU3ltYm9sczIsCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgY29udGFpbmluZyBkYXRlcyBpbiB0aGUKKyAgLy8vIG5leHQgd2Vlay4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPlRpbWVQZXJpb2QgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBOZXh0V2VlaywKIAotICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgLy8vICgzIFRyYWZmaWMgTGlnaHRzKSAzIHRyYWZmaWMgbGlnaHRzIGljb24gc2V0ICgjMSkuCi0gICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgVGhyZWVUcmFmZmljTGlnaHRzMSwKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBjb250YWluaW5nIGRhdGVzIGluIHRoaXMKKyAgLy8vIG1vbnRoLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJlbWFya3M+VGltZVBlcmlvZCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgIFRoaXNNb250aCwKIAotICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgLy8vICgzIFRyYWZmaWMgTGlnaHRzIEJsYWNrKSAzIHRyYWZmaWMgbGlnaHRzIGljb24gc2V0IHdpdGggdGhpY2sgYmxhY2sgYm9yZGVyLgotICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgIFRocmVlVHJhZmZpY0xpZ2h0czIsCi0gCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAoNCBBcnJvd3MpIDQgYXJyb3dzIGljb24gc2V0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgRm91ckFycm93cywKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBjb250YWluaW5nIGRhdGVzIGluIHRoaXMKKyAgLy8vIHdlZWsuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5UaW1lUGVyaW9kIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgVGhpc1dlZWssCiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICg0IEFycm93cyAoR3JheSkpIDQgZ3JheSBhcnJvd3MgaWNvbiBzZXQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBGb3VyQXJyb3dzR3JheSwKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBjb250YWluaW5nIHRvZGF5IGRhdGVzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJlbWFya3M+VGltZVBlcmlvZCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgIFRvZGF5LAogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAoNCBSYXRpbmdzKSA0IHJhdGluZ3MgaWNvbiBzZXQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBGb3VyUmF0aW5nLAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGNvbnRhaW5pbmcgdG9tb3Jyb3cgZGF0ZXMuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5UaW1lUGVyaW9kIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgVG9tb3Jyb3csCiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICg0IFJlZCBUbyBCbGFjaykgNCAncmVkIHRvIGJsYWNrJyBpY29uIHNldC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIEZvdXJSZWRUb0JsYWNrLAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGNvbnRhaW5pbmcgeWVzdGVyZGF5IGRhdGVzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJlbWFya3M+VGltZVBlcmlvZCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgIFllc3RlcmRheSwKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gKDQgVHJhZmZpYyBMaWdodHMpIDQgdHJhZmZpYyBsaWdodHMgaWNvbiBzZXQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBGb3VyVHJhZmZpY0xpZ2h0cywKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBpbiB0aGUgcmFuZ2UgdGhhdCBiZWdpbiB3aXRoCisgIC8vLyB0aGUgZ2l2ZW4gdGV4dC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gRXF1aXZhbGVudCB0byB1c2luZyB0aGUgTEVGVCgpIHNoZWV0IGZ1bmN0aW9uIGFuZCBjb21wYXJpbmcgdmFsdWVzLgorICAvLy8gPC9yZW1hcmtzPgorICAvLy8gPHJlbWFya3M+QmVnaW5zV2l0aCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgIEJlZ2luc1dpdGgsCiAKLSAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gKDUgQXJyb3dzKSA1IGFycm93cyBpY29uIHNldC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIEZpdmVBcnJvd3MsCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgaW4gdGhlIHJhbmdlIGJldHdlZW4gdGhlCisgIC8vLyBnaXZlbiB0d28gZm9ybXVsYXMuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5DZWxsSXMgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBCZXR3ZWVuLAogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAoNSBBcnJvd3MgKEdyYXkpKSA1IGdyYXkgYXJyb3dzIGljb24gc2V0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgRml2ZUFycm93c0dyYXksCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgdGhhdCBhcmUgY29tcGxldGVseSBibGFuay4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gRXF1aXZhbGVudCBvZiB1c2luZyBMRU4oVFJJTSgpKS4gVGhpcyBtZWFucyB0aGF0IGlmIHRoZSBjZWxsIGNvbnRhaW5zIG9ubHkKKyAgLy8vIGNoYXJhY3RlcnMgdGhhdCBUUklNKCkgd291bGQgcmVtb3ZlLCB0aGVuIGl0IGlzIGNvbnNpZGVyZWQgYmxhbmsuIEFuIGVtcHR5IGNlbGwKKyAgLy8vIGlzIGFsc28gY29uc2lkZXJlZCBibGFuay4KKyAgLy8vIDwvcmVtYXJrcz4KKyAgLy8vIDxyZW1hcmtzPkNvbnRhaW5zQmxhbmtzIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgQ29udGFpbnNCbGFua3MsCiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICg1IFF1YXJ0ZXJzKSA1IHF1YXJ0ZXJzIGljb24gc2V0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgRml2ZVF1YXJ0ZXJzLAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHdpdGggZm9ybXVsYSBlcnJvcnMuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz4KKyAgLy8vIEVxdWl2YWxlbnQgdG8gdXNpbmcgSVNFUlJPUigpIHNoZWV0IGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcworICAvLy8gYSBmb3JtdWxhIGVycm9yLgorICAvLy8gPC9yZW1hcmtzPgorICAvLy8gPHJlbWFya3M+Q29udGFpbnNFcnJvcnMgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBDb250YWluc0Vycm9ycywKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gKDUgUmF0aW5ncyBJY29uIFNldCkgNSByYXRpbmcgaWNvbiBzZXQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBGaXZlUmF0aW5nCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgaW4gdGhlIHJhbmdlIHRoYXQgYmVnaW4gd2l0aAorICAvLy8gdGhlIGdpdmVuIHRleHQuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz4KKyAgLy8vIEVxdWl2YWxlbnQgdG8gdXNpbmcgdGhlIExFRlQoKSBzaGVldCBmdW5jdGlvbiBhbmQgY29tcGFyaW5nIHZhbHVlcy4KKyAgLy8vIDwvcmVtYXJrcz4KKyAgLy8vIDxyZW1hcmtzPkNvbnRhaW5zVGV4dCBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgIENvbnRhaW5zVGV4dCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGR1cGxpY2F0ZWQgdmFsdWVzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJlbWFya3M+RHVwbGljYXRlVmFsdWVzIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgRHVwbGljYXRlVmFsdWVzLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgZW5kaW5nIHdpdGggZ2l2ZW4gdGV4dC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gRXF1aXZhbGVudCB0byB1c2luZyB0aGUgUklHSFQoKSBzaGVldCBmdW5jdGlvbiBhbmQgY29tcGFyaW5nIHZhbHVlcy4KKyAgLy8vIDwvcmVtYXJrcz4KKyAgLy8vIDxyZW1hcmtzPkVuZHNXaXRoIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgRW5kc1dpdGgsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBlcXVhbHMgdG8gd2l0aCBnaXZlbiBmb3JtdWxhLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJlbWFya3M+Q2VsbElzIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgRXF1YWwsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgY29udGFpbnMgYSBmb3JtdWxhIHRvIGV2YWx1YXRlLiBXaGVuIHRoZQorICAvLy8gZm9ybXVsYSByZXN1bHQgaXMgdHJ1ZSwgdGhlIGNlbGwgaXMgaGlnaGxpZ2h0ZWQuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5FeHByZXNzaW9uIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgRXhwcmVzc2lvbiwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gZm9ybXVsYS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPkNlbGxJcyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgIEdyZWF0ZXJUaGFuLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRoZQorICAvLy8gZ2l2ZW4gZm9ybXVsYS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPkNlbGxJcyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgIEdyZWF0ZXJUaGFuT3JFcXVhbCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIGxlc3MgdGhhbiB0aGUgZ2l2ZW4gZm9ybXVsYS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPkNlbGxJcyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgIExlc3NUaGFuLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgbGVzcyB0aGFuIG9yIGVxdWFsIHRoZQorICAvLy8gZ2l2ZW4gZm9ybXVsYS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPkNlbGxJcyBFeGNlbCBDRiBSdWxlIFR5cGU8L3JlbWFya3M+CisgIExlc3NUaGFuT3JFcXVhbCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIG91dHNpZGUgdGhlIHJhbmdlIGluCisgIC8vLyBnaXZlbiB0d28gZm9ybXVsYXMuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5DZWxsSXMgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBOb3RCZXR3ZWVuLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGhpZ2hsaWdodHMgY2VsbHMgdGhhdCBkb2VzIG5vdCBjb250YWlucyB0aGUKKyAgLy8vIGdpdmVuIGZvcm11bGEuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5DZWxsSXMgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBOb3RDb250YWlucywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIGNlbGxzIHRoYXQgYXJlIG5vdCBibGFuay4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gRXF1aXZhbGVudCBvZiB1c2luZyBMRU4oVFJJTSgpKS4gVGhpcyBtZWFucyB0aGF0IGlmIHRoZSBjZWxsIGNvbnRhaW5zIG9ubHkKKyAgLy8vIGNoYXJhY3RlcnMgdGhhdCBUUklNKCkgd291bGQgcmVtb3ZlLCB0aGVuIGl0IGlzIGNvbnNpZGVyZWQgYmxhbmsuIEFuIGVtcHR5IGNlbGwKKyAgLy8vIGlzIGFsc28gY29uc2lkZXJlZCBibGFuay4KKyAgLy8vIDwvcmVtYXJrcz4KKyAgLy8vIDxyZW1hcmtzPk5vdENvbnRhaW5zQmxhbmtzIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgTm90Q29udGFpbnNCbGFua3MsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB3aXRob3V0IGZvcm11bGEgZXJyb3JzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJlbWFya3M+CisgIC8vLyBFcXVpdmFsZW50IHRvIHVzaW5nIElTRVJST1IoKSBzaGVldCBmdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlcmUgaXMgYQorICAvLy8gZm9ybXVsYSBlcnJvci4KKyAgLy8vIDwvcmVtYXJrcz4KKyAgLy8vIDxyZW1hcmtzPk5vdENvbnRhaW5zRXJyb3JzIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgTm90Q29udGFpbnNFcnJvcnMsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyB0aGF0IGRvIG5vdCBjb250YWluCisgIC8vLyB0aGUgZ2l2ZW4gdGV4dC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gRXF1aXZhbGVudCB0byB1c2luZyB0aGUgU0VBUkNIKCkgc2hlZXQgZnVuY3Rpb24uCisgIC8vLyA8L3JlbWFya3M+CisgIC8vLyA8cmVtYXJrcz5Ob3RDb250YWluc1RleHQgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBOb3RDb250YWluc1RleHQsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgaGlnaGxpZ2h0cyBjZWxscyBub3QgZXF1YWxzIHRvIHdpdGgKKyAgLy8vIGdpdmVuIGZvcm11bGEuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5DZWxsSXMgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBOb3RFcXVhbCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBoaWdobGlnaHRzIHVuaXF1ZSB2YWx1ZXMgaW4gdGhlIHJhbmdlLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJlbWFya3M+VW5pcXVlVmFsdWVzIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgVW5pcXVlVmFsdWVzLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRocmVlIENvbG9yIFNjYWxlIChMb3csIE1pZGRsZSBhbmQgSGlnaCBDb2xvciBTY2FsZSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPkNvbG9yU2NhbGUgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBUaHJlZUNvbG9yU2NhbGUsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHdvIENvbG9yIFNjYWxlIChMb3cgYW5kIEhpZ2ggQ29sb3IgU2NhbGUpCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5Db2xvclNjYWxlIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgVHdvQ29sb3JTY2FsZSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBhcHBsaWVzIGEgMyBzZXQgaWNvbnMgdG8gY2VsbHMgYWNjb3JkaW5nCisgIC8vLyB0byB0aGVpciB2YWx1ZXMuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5JY29uU2V0IEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgVGhyZWVJY29uU2V0LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoaXMgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlIGFwcGxpZXMgYSA0IHNldCBpY29ucyB0byBjZWxscyBhY2NvcmRpbmcKKyAgLy8vIHRvIHRoZWlyIHZhbHVlcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPkljb25TZXQgRXhjZWwgQ0YgUnVsZSBUeXBlPC9yZW1hcmtzPgorICBGb3VySWNvblNldCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSBhcHBsaWVzIGEgNSBzZXQgaWNvbnMgdG8gY2VsbHMgYWNjb3JkaW5nCisgIC8vLyB0byB0aGVpciB2YWx1ZXMuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5JY29uU2V0IEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgRml2ZUljb25TZXQsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgZGlzcGxheXMgYSBncmFkYXRlZCBkYXRhIGJhciBpbiB0aGUgcmFuZ2Ugb2YgY2VsbHMuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5EYXRhQmFyIEV4Y2VsIENGIFJ1bGUgVHlwZTwvcmVtYXJrcz4KKyAgRGF0YUJhciwKIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisKKy8vLyA8c3VtbWFyeT4KKy8vLyBFbnVtIGZvciBDb25kaXRpb25hbCBGb3JtYXQgVmFsdWUgT2JqZWN0IFR5cGUgU1RfQ2Z2b1R5cGUgwqcxOC4xOC4xMworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEZvcm11bGEKKyAgLy8vIDwvc3VtbWFyeT4KKyAgRm9ybXVsYSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBNYXhpbXVtIFZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIE1heCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBNaW5pbXVtIFZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIE1pbiwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOdW1iZXIgVmFsdWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgTnVtLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFBlcmNlbnQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgUGVyY2VudCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQZXJjZW50aWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIFBlcmNlbnRpbGUsCit9CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBFbnVtIGZvciBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFZhbHVlIE9iamVjdCBQb3NpdGlvbgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24geworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgbG93ZXIgcG9zaXRpb24gZm9yIGJvdGggVHdvQ29sb3JTY2FsZSBhbmQgVGhyZWVDb2xvclNjYWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIExvdywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgbWlkZGxlIHBvc2l0aW9uIG9ubHkgZm9yIFRocmVlQ29sb3JTY2FsZQorICAvLy8gPC9zdW1tYXJ5PgorICBNaWRkbGUsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIGhpZ2hlc3QgcG9zaXRpb24gZm9yIGJvdGggVHdvQ29sb3JTY2FsZSBhbmQgVGhyZWVDb2xvclNjYWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIEhpZ2gsCit9CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBFbnVtIGZvciBDb25kaXRpb25hbCBGb3JtYXR0aW5nIFZhbHVlIE9iamVjdCBOb2RlIFR5cGUKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgZW51bSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdE5vZGVUeXBlIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gJ2Nmdm8nIG5vZGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgQ2Z2bywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAnY29sb3InIG5vZGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgQ29sb3IsCit9CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBFbnVtIGZvciBDb25kaXRpb25hbCBGb3JtYXR0aW5nIE9wZXJhcnRvciBUeXBlIFNUX0NvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yIMKnMTguMTguMTUKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgZW51bSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBCZWdpbnMgV2l0aC4gJ0JlZ2lucyB3aXRoJyBvcGVyYXRvcgorICAvLy8gPC9zdW1tYXJ5PgorICBCZWdpbnNXaXRoLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEJldHdlZW4uICdCZXR3ZWVuJyBvcGVyYXRvcgorICAvLy8gPC9zdW1tYXJ5PgorICBCZXR3ZWVuLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENvbnRhaW5zLiAnQ29udGFpbnMnIG9wZXJhdG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIENvbnRhaW5zVGV4dCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFbmRzIFdpdGguICdFbmRzIHdpdGgnIG9wZXJhdG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIEVuZHNXaXRoLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEVxdWFsLiAnRXF1YWwgdG8nIG9wZXJhdG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIEVxdWFsLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdyZWF0ZXIgVGhhbi4gJ0dyZWF0ZXIgdGhhbicgb3BlcmF0b3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgR3JlYXRlclRoYW4sCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR3JlYXRlciBUaGFuIE9yIEVxdWFsLiAnR3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvJyBvcGVyYXRvcgorICAvLy8gPC9zdW1tYXJ5PgorICBHcmVhdGVyVGhhbk9yRXF1YWwsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTGVzcyBUaGFuLiAnTGVzcyB0aGFuJyBvcGVyYXRvcgorICAvLy8gPC9zdW1tYXJ5PgorICBMZXNzVGhhbiwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMZXNzIFRoYW4gT3IgRXF1YWwuICdMZXNzIHRoYW4gb3IgZXF1YWwgdG8nIG9wZXJhdG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIExlc3NUaGFuT3JFcXVhbCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOb3QgQmV0d2Vlbi4gJ05vdCBiZXR3ZWVuJyBvcGVyYXRvcgorICAvLy8gPC9zdW1tYXJ5PgorICBOb3RCZXR3ZWVuLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIERvZXMgTm90IENvbnRhaW4uICdEb2VzIG5vdCBjb250YWluJyBvcGVyYXRvcgorICAvLy8gPC9zdW1tYXJ5PgorICBOb3RDb250YWlucywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOb3QgRXF1YWwuICdOb3QgZXF1YWwgdG8nIG9wZXJhdG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIE5vdEVxdWFsLAorfQorCisvLy8gPHN1bW1hcnk+CisvLy8gRW51bSBmb3IgQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBUaW1lIFBlcmlvZCBUeXBlIFNUX1RpbWVQZXJpb2QgwqcxOC4xOC44MgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTGFzdCA3IERheXMuIEEgZGF0ZSBpbiB0aGUgbGFzdCBzZXZlbiBkYXlzLgorICAvLy8gPC9zdW1tYXJ5PgorICBMYXN0N0RheXMsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTGFzdCBNb250aC4gQSBkYXRlIG9jY3VyaW5nIGluIHRoZSBsYXN0IGNhbGVuZGFyIG1vbnRoLgorICAvLy8gPC9zdW1tYXJ5PgorICBMYXN0TW9udGgsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTGFzdCBXZWVrLiBBIGRhdGUgb2NjdXJpbmcgbGFzdCB3ZWVrLgorICAvLy8gPC9zdW1tYXJ5PgorICBMYXN0V2VlaywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOZXh0IE1vbnRoLiBBIGRhdGUgb2NjdXJpbmcgaW4gdGhlIG5leHQgY2FsZW5kYXIgbW9udGguCisgIC8vLyA8L3N1bW1hcnk+CisgIE5leHRNb250aCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOZXh0IFdlZWsuIEEgZGF0ZSBvY2N1cmluZyBuZXh0IHdlZWsuCisgIC8vLyA8L3N1bW1hcnk+CisgIE5leHRXZWVrLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoaXMgTW9udGguIEEgZGF0ZSBvY2N1cmluZyBpbiB0aGlzIGNhbGVuZGFyIG1vbnRoLgorICAvLy8gPC9zdW1tYXJ5PgorICBUaGlzTW9udGgsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBXZWVrLiBBIGRhdGUgb2NjdXJpbmcgdGhpcyB3ZWVrLgorICAvLy8gPC9zdW1tYXJ5PgorICBUaGlzV2VlaywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUb2RheS4gVG9kYXkncyBkYXRlLgorICAvLy8gPC9zdW1tYXJ5PgorICBUb2RheSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUb21vcnJvdy4gVG9tb3Jyb3cncyBkYXRlLgorICAvLy8gPC9zdW1tYXJ5PgorICBUb21vcnJvdywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBZZXN0ZXJkYXkuIFllc3RlcmRheSdzIGRhdGUuCisgIC8vLyA8L3N1bW1hcnk+CisgIFllc3RlcmRheSwKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIDE4LjE4LjQyIFNUX0ljb25TZXRUeXBlIChJY29uIFNldCBUeXBlKSAtIE9ubHkgMyBpY29ucworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzNJY29uc1NldFR5cGUgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAoMyBBcnJvd3MpIDMgYXJyb3dzIGljb24gc2V0LgorICAvLy8gPC9zdW1tYXJ5PgorICBBcnJvd3MsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gKDMgQXJyb3dzIChHcmF5KSkgMyBncmF5IGFycm93cyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgQXJyb3dzR3JheSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAoMyBGbGFncykgMyBmbGFncyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgRmxhZ3MsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gKDMgU2lnbnMpIDMgc2lnbnMgaWNvbiBzZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIFNpZ25zLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICgzIFN5bWJvbHMgQ2lyY2xlZCkgMyBzeW1ib2xzIGljb24gc2V0LgorICAvLy8gPC9zdW1tYXJ5PgorICBTeW1ib2xzLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICgzIFN5bWJvbHMpIDMgU3ltYm9scyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgU3ltYm9sczIsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gKDMgVHJhZmZpYyBMaWdodHMpIDMgdHJhZmZpYyBsaWdodHMgaWNvbiBzZXQgKCMxKS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgVHJhZmZpY0xpZ2h0czEsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gKDMgVHJhZmZpYyBMaWdodHMgQmxhY2spIDMgdHJhZmZpYyBsaWdodHMgaWNvbiBzZXQgd2l0aCB0aGljayBibGFjayBib3JkZXIuCisgIC8vLyA8L3N1bW1hcnk+CisgIFRyYWZmaWNMaWdodHMyLAorfQorCisvLy8gPHN1bW1hcnk+CisvLy8gMTguMTguNDIgU1RfSWNvblNldFR5cGUgKEljb24gU2V0IFR5cGUpIC0gT25seSA0IGljb25zCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICg0IEFycm93cykgNCBhcnJvd3MgaWNvbiBzZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIEFycm93cywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAoNCBBcnJvd3MgKEdyYXkpKSA0IGdyYXkgYXJyb3dzIGljb24gc2V0LgorICAvLy8gPC9zdW1tYXJ5PgorICBBcnJvd3NHcmF5LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICg0IFJhdGluZ3MpIDQgcmF0aW5ncyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgUmF0aW5nLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICg0IFJlZCBUbyBCbGFjaykgNCAncmVkIHRvIGJsYWNrJyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgUmVkVG9CbGFjaywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAoNCBUcmFmZmljIExpZ2h0cykgNCB0cmFmZmljIGxpZ2h0cyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgVHJhZmZpY0xpZ2h0cywKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIDE4LjE4LjQyIFNUX0ljb25TZXRUeXBlIChJY29uIFNldCBUeXBlKSAtIE9ubHkgNSBpY29ucworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzVJY29uc1NldFR5cGUgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAoNSBBcnJvd3MpIDUgYXJyb3dzIGljb24gc2V0LgorICAvLy8gPC9zdW1tYXJ5PgorICBBcnJvd3MsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gKDUgQXJyb3dzIChHcmF5KSkgNSBncmF5IGFycm93cyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgQXJyb3dzR3JheSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAoNSBRdWFydGVycykgNSBxdWFydGVycyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgUXVhcnRlcnMsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gKDUgUmF0aW5ncyBJY29uIFNldCkgNSByYXRpbmcgaWNvbiBzZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIFJhdGluZywKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIDE4LjE4LjQyIFNUX0ljb25TZXRUeXBlIChJY29uIFNldCBUeXBlKQorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25zU2V0VHlwZSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICgzIEFycm93cykgMyBhcnJvd3MgaWNvbiBzZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIFRocmVlQXJyb3dzLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICgzIEFycm93cyAoR3JheSkpIDMgZ3JheSBhcnJvd3MgaWNvbiBzZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIFRocmVlQXJyb3dzR3JheSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAoMyBGbGFncykgMyBmbGFncyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgVGhyZWVGbGFncywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAoMyBTaWducykgMyBzaWducyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgVGhyZWVTaWducywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAoMyBTeW1ib2xzIENpcmNsZWQpIDMgc3ltYm9scyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgVGhyZWVTeW1ib2xzLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICgzIFN5bWJvbHMpIDMgU3ltYm9scyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgVGhyZWVTeW1ib2xzMiwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAoMyBUcmFmZmljIExpZ2h0cykgMyB0cmFmZmljIGxpZ2h0cyBpY29uIHNldCAoIzEpLgorICAvLy8gPC9zdW1tYXJ5PgorICBUaHJlZVRyYWZmaWNMaWdodHMxLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICgzIFRyYWZmaWMgTGlnaHRzIEJsYWNrKSAzIHRyYWZmaWMgbGlnaHRzIGljb24gc2V0IHdpdGggdGhpY2sgYmxhY2sgYm9yZGVyLgorICAvLy8gPC9zdW1tYXJ5PgorICBUaHJlZVRyYWZmaWNMaWdodHMyLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICg0IEFycm93cykgNCBhcnJvd3MgaWNvbiBzZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIEZvdXJBcnJvd3MsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gKDQgQXJyb3dzIChHcmF5KSkgNCBncmF5IGFycm93cyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgRm91ckFycm93c0dyYXksCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gKDQgUmF0aW5ncykgNCByYXRpbmdzIGljb24gc2V0LgorICAvLy8gPC9zdW1tYXJ5PgorICBGb3VyUmF0aW5nLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICg0IFJlZCBUbyBCbGFjaykgNCAncmVkIHRvIGJsYWNrJyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgRm91clJlZFRvQmxhY2ssCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gKDQgVHJhZmZpYyBMaWdodHMpIDQgdHJhZmZpYyBsaWdodHMgaWNvbiBzZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIEZvdXJUcmFmZmljTGlnaHRzLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICg1IEFycm93cykgNSBhcnJvd3MgaWNvbiBzZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIEZpdmVBcnJvd3MsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gKDUgQXJyb3dzIChHcmF5KSkgNSBncmF5IGFycm93cyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgRml2ZUFycm93c0dyYXksCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gKDUgUXVhcnRlcnMpIDUgcXVhcnRlcnMgaWNvbiBzZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIEZpdmVRdWFydGVycywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAoNSBSYXRpbmdzIEljb24gU2V0KSA1IHJhdGluZyBpY29uIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgRml2ZVJhdGluZywKK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdIZWxwZXIuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSGVscGVyLmNzCmluZGV4IDRlODZhNjUuLjQxZmJlMzAgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdIZWxwZXIuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMjYyICsxMywyMDcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiB1c2luZyBTeXN0ZW0uRHJhd2luZzsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwogdXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwoteworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCisvLy8gPHN1bW1hcnk+CisvLy8gQ29uZGl0aW9uYWwgZm9ybWF0dGluZyBoZWxwZXIKKy8vLyA8L3N1bW1hcnk+CitpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdIZWxwZXIgewogICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBDb25kaXRpb25hbCBmb3JtYXR0aW5nIGhlbHBlcgorICAvLy8gQ2hlY2sgYW5kIGZpeCBhbiBhZGRyZXNzIChzdHJpbmcgYWRkcmVzcykKICAgLy8vIDwvc3VtbWFyeT4KLSAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSGVscGVyCi0gIHsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENoZWNrIGFuZCBmaXggYW4gYWRkcmVzcyAoc3RyaW5nIGFkZHJlc3MpCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBDaGVja0FuZEZpeFJhbmdlQWRkcmVzcygKLSAgICAgIHN0cmluZyBhZGRyZXNzKQotICAgIHsKLSAgICAgIGlmIChhZGRyZXNzLkNvbnRhaW5zKCcsJykpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLkNvbW1hU2VwYXJhdGVkQWRkcmVzc2VzKTsKLSAgICAgIH0KLQotICAgICAgYWRkcmVzcyA9IGFkZHJlc3MuVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLQotICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goYWRkcmVzcywgQCJbQS1aXSs6W0EtWl0rIikpCi0gICAgICB7Ci0gICAgICAgIGFkZHJlc3MgPSBBZGRyZXNzVXRpbGl0eS5QYXJzZUVudGlyZUNvbHVtblNlbGVjdGlvbnMoYWRkcmVzcyk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBhZGRyZXNzOworICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIENoZWNrQW5kRml4UmFuZ2VBZGRyZXNzKHN0cmluZyBhZGRyZXNzKSB7CisgICAgaWYgKGFkZHJlc3MuQ29udGFpbnMoJywnKSkgeworICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuX2NvbW1hU2VwYXJhdGVkQWRkcmVzc2VzKTsKICAgICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENvbnZlcnQgYSBjb2xvciBjb2RlIHRvIENvbG9yIE9iamVjdAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJjb2xvckNvZGUiPkNvbG9yIENvZGUgKEV4LiAiI0ZGQjQzQzUzIiBvciAiRkZCNDNDNTMiKTwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgc3RhdGljIENvbG9yIENvbnZlcnRGcm9tQ29sb3JDb2RlKAotICAgICAgc3RyaW5nIGNvbG9yQ29kZSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKEludDMyLlBhcnNlKGNvbG9yQ29kZS5SZXBsYWNlKCIjIiwgIiIpLCBOdW1iZXJTdHlsZXMuSGV4TnVtYmVyKSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaAotICAgICAgewotICAgICAgICAvLyBBc3N1bWUgd2hpdGUgaXMgdGhlIGRlZmF1bHQgY29sb3IgKGluc3RlYWQgb2YgZ2l2aW5nIGFuIGVycm9yKQotICAgICAgICByZXR1cm4gQ29sb3IuV2hpdGU7Ci0gICAgICB9CisgICAgYWRkcmVzcyA9IGFkZHJlc3MuVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKworICAgIGlmIChSZWdleC5Jc01hdGNoKGFkZHJlc3MsICJbQS1aXSs6W0EtWl0rIikpIHsKKyAgICAgIGFkZHJlc3MgPSBBZGRyZXNzVXRpbGl0eS5QYXJzZUVudGlyZUNvbHVtblNlbGVjdGlvbnMoYWRkcmVzcyk7CiAgICAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImF0dHJpYnV0ZSI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEF0dHJpYnV0ZVN0cmluZygKLSAgICAgIFhtbE5vZGUgbm9kZSwKLSAgICAgIHN0cmluZyBhdHRyaWJ1dGUpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuQXR0cmlidXRlc1thdHRyaWJ1dGVdLlZhbHVlOwotICAgICAgICByZXR1cm4gKHZhbHVlID09IG51bGwpID8gc3RyaW5nLkVtcHR5IDogdmFsdWU7Ci0gICAgICB9Ci0gICAgICBjYXRjaAotICAgICAgewotICAgICAgICByZXR1cm4gc3RyaW5nLkVtcHR5OwotICAgICAgfQotICAgIH0KKyAgICByZXR1cm4gYWRkcmVzczsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImF0dHJpYnV0ZSI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBzdGF0aWMgaW50IEdldEF0dHJpYnV0ZUludCgKLSAgICAgIFhtbE5vZGUgbm9kZSwKLSAgICAgIHN0cmluZyBhdHRyaWJ1dGUpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuQXR0cmlidXRlc1thdHRyaWJ1dGVdLlZhbHVlOwotICAgICAgICByZXR1cm4gaW50LlBhcnNlKHZhbHVlLCBOdW1iZXJTdHlsZXMuSW50ZWdlciwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaAotICAgICAgewotICAgICAgICByZXR1cm4gaW50Lk1pblZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgc3RhdGljIGludD8gR2V0QXR0cmlidXRlSW50TnVsbGFibGUoCi0gICAgICBYbWxOb2RlIG5vZGUsCi0gICAgICBzdHJpbmcgYXR0cmlidXRlKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAgIGlmIChub2RlLkF0dHJpYnV0ZXNbYXR0cmlidXRlXSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuQXR0cmlidXRlc1thdHRyaWJ1dGVdLlZhbHVlOwotICAgICAgICAgICAgICByZXR1cm4gaW50LlBhcnNlKHZhbHVlLCBOdW1iZXJTdHlsZXMuSW50ZWdlciwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2gKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImF0dHJpYnV0ZSI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBHZXRBdHRyaWJ1dGVCb29sKAotICAgICAgWG1sTm9kZSBub2RlLAotICAgICAgc3RyaW5nIGF0dHJpYnV0ZSkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgdmFyIHZhbHVlID0gbm9kZS5BdHRyaWJ1dGVzW2F0dHJpYnV0ZV0uVmFsdWU7Ci0gICAgICAgIHJldHVybiAodmFsdWUgPT0gIjEiIHx8IHZhbHVlID09ICItMSIgfHwgdmFsdWUuRXF1YWxzKCJUUlVFIiwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpOwotICAgICAgfQotICAgICAgY2F0Y2gKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgc3RhdGljIGJvb2w/IEdldEF0dHJpYnV0ZUJvb2xOdWxsYWJsZSgKLSAgICAgIFhtbE5vZGUgbm9kZSwKLSAgICAgIHN0cmluZyBhdHRyaWJ1dGUpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgICAgaWYgKG5vZGUuQXR0cmlidXRlc1thdHRyaWJ1dGVdID09IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgdmFyIHZhbHVlID0gbm9kZS5BdHRyaWJ1dGVzW2F0dHJpYnV0ZV0uVmFsdWU7Ci0gICAgICAgICAgICAgIHJldHVybiAodmFsdWUgPT0gIjEiIHx8IHZhbHVlID09ICItMSIgfHwgdmFsdWUuRXF1YWxzKCJUUlVFIixTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0Y2gKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImF0dHJpYnV0ZSI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEdldEF0dHJpYnV0ZURvdWJsZSgKLSAgICAgIFhtbE5vZGUgbm9kZSwKLSAgICAgIHN0cmluZyBhdHRyaWJ1dGUpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuQXR0cmlidXRlc1thdHRyaWJ1dGVdLlZhbHVlOwotICAgICAgICByZXR1cm4gZG91YmxlLlBhcnNlKHZhbHVlLCBOdW1iZXJTdHlsZXMuTnVtYmVyLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBkb3VibGUuTmFOOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgc3RhdGljIGRlY2ltYWwgR2V0QXR0cmlidXRlRGVjaW1hbCgKLSAgICAgIFhtbE5vZGUgbm9kZSwKLSAgICAgIHN0cmluZyBhdHRyaWJ1dGUpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHZhciB2YWx1ZSA9IG5vZGUuQXR0cmlidXRlc1thdHRyaWJ1dGVdLlZhbHVlOwotICAgICAgICByZXR1cm4gZGVjaW1hbC5QYXJzZSh2YWx1ZSwgTnVtYmVyU3R5bGVzLkFueSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaAotICAgICAgewotICAgICAgICByZXR1cm4gZGVjaW1hbC5NaW5WYWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEVuY29kZSB0byBYTUwgKHNwZWNpYWwgY2hhcmFjdGVyZXM6ICZhcG9zOyAmcXVvdDsgJmd0OyAmbHQ7ICZhbXA7KQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJzIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIHN0YXRpYyBzdHJpbmcgRW5jb2RlWE1MKAotICAgICAgdGhpcyBzdHJpbmcgcykKLSAgICB7Ci0gICAgICByZXR1cm4gcy5SZXBsYWNlKCImIiwgIiZhbXA7IikuUmVwbGFjZSgiPCIsICImbHQ7IikuUmVwbGFjZSgiPiIsICImZ3Q7IikuUmVwbGFjZSgiXCIiLCAiJnF1b3Q7IikuUmVwbGFjZSgiJyIsICImYXBvczsiKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIERlY29kZSBmcm9tIFhNTCAoc3BlY2lhbCBjaGFyYWN0ZXJlczogJmFwb3M7ICZxdW90OyAmZ3Q7ICZsdDsgJmFtcDspCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InMiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBEZWNvZGVYTUwoCi0gICAgICB0aGlzIHN0cmluZyBzKQotICAgIHsKLSAgICAgIHJldHVybiBzLlJlcGxhY2UoIiciLCAiJmFwb3M7IikuUmVwbGFjZSgiXCIiLCAiJnF1b3Q7IikuUmVwbGFjZSgiPiIsICImZ3Q7IikuUmVwbGFjZSgiPCIsICImbHQ7IikuUmVwbGFjZSgiJiIsICImYW1wOyIpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb252ZXJ0IGEgY29sb3IgY29kZSB0byBDb2xvciBPYmplY3QKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2xvckNvZGUiPkNvbG9yIENvZGUgKEV4LiAiI0ZGQjQzQzUzIiBvciAiRkZCNDNDNTMiKTwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgQ29sb3IgQ29udmVydEZyb21Db2xvckNvZGUoc3RyaW5nIGNvbG9yQ29kZSkgeworICAgIHRyeSB7CisgICAgICByZXR1cm4gQ29sb3IuRnJvbUFyZ2IoSW50MzIuUGFyc2UoY29sb3JDb2RlLlJlcGxhY2UoIiMiLCAiIiksIE51bWJlclN0eWxlcy5IZXhOdW1iZXIpKTsKKyAgICB9IGNhdGNoIHsKKyAgICAgIC8vIEFzc3VtZSB3aGl0ZSBpcyB0aGUgZGVmYXVsdCBjb2xvciAoaW5zdGVhZCBvZiBnaXZpbmcgYW4gZXJyb3IpCisgICAgICByZXR1cm4gQ29sb3IuV2hpdGU7CiAgICAgfQogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEF0dHJpYnV0ZVN0cmluZyhYbWxOb2RlIG5vZGUsIHN0cmluZyBhdHRyaWJ1dGUpIHsKKyAgICB0cnkgeworICAgICAgdmFyIHZhbHVlID0gbm9kZS5BdHRyaWJ1dGVzW2F0dHJpYnV0ZV0uVmFsdWU7CisgICAgICByZXR1cm4gKHZhbHVlID09IG51bGwpID8gc3RyaW5nLkVtcHR5IDogdmFsdWU7CisgICAgfSBjYXRjaCB7CisgICAgICByZXR1cm4gc3RyaW5nLkVtcHR5OworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgaW50IEdldEF0dHJpYnV0ZUludChYbWxOb2RlIG5vZGUsIHN0cmluZyBhdHRyaWJ1dGUpIHsKKyAgICB0cnkgeworICAgICAgdmFyIHZhbHVlID0gbm9kZS5BdHRyaWJ1dGVzW2F0dHJpYnV0ZV0uVmFsdWU7CisgICAgICByZXR1cm4gaW50LlBhcnNlKHZhbHVlLCBOdW1iZXJTdHlsZXMuSW50ZWdlciwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgfSBjYXRjaCB7CisgICAgICByZXR1cm4gaW50Lk1pblZhbHVlOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgaW50PyBHZXRBdHRyaWJ1dGVJbnROdWxsYWJsZShYbWxOb2RlIG5vZGUsIHN0cmluZyBhdHRyaWJ1dGUpIHsKKyAgICB0cnkgeworICAgICAgaWYgKG5vZGUuQXR0cmlidXRlc1thdHRyaWJ1dGVdID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICB2YXIgdmFsdWUgPSBub2RlLkF0dHJpYnV0ZXNbYXR0cmlidXRlXS5WYWx1ZTsKKyAgICAgIHJldHVybiBpbnQuUGFyc2UodmFsdWUsIE51bWJlclN0eWxlcy5JbnRlZ2VyLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICB9IGNhdGNoIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgYm9vbCBHZXRBdHRyaWJ1dGVCb29sKFhtbE5vZGUgbm9kZSwgc3RyaW5nIGF0dHJpYnV0ZSkgeworICAgIHRyeSB7CisgICAgICB2YXIgdmFsdWUgPSBub2RlLkF0dHJpYnV0ZXNbYXR0cmlidXRlXS5WYWx1ZTsKKyAgICAgIHJldHVybiAodmFsdWUgPT0gIjEiCisgICAgICAgICAgICAgIHx8IHZhbHVlID09ICItMSIKKyAgICAgICAgICAgICAgfHwgdmFsdWUuRXF1YWxzKCJUUlVFIiwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpOworICAgIH0gY2F0Y2ggeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgYm9vbD8gR2V0QXR0cmlidXRlQm9vbE51bGxhYmxlKFhtbE5vZGUgbm9kZSwgc3RyaW5nIGF0dHJpYnV0ZSkgeworICAgIHRyeSB7CisgICAgICBpZiAobm9kZS5BdHRyaWJ1dGVzW2F0dHJpYnV0ZV0gPT0gbnVsbCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIHZhciB2YWx1ZSA9IG5vZGUuQXR0cmlidXRlc1thdHRyaWJ1dGVdLlZhbHVlOworICAgICAgcmV0dXJuICh2YWx1ZSA9PSAiMSIKKyAgICAgICAgICAgICAgfHwgdmFsdWUgPT0gIi0xIgorICAgICAgICAgICAgICB8fCB2YWx1ZS5FcXVhbHMoIlRSVUUiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSk7CisgICAgfSBjYXRjaCB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYXR0cmlidXRlIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgc3RhdGljIGRvdWJsZSBHZXRBdHRyaWJ1dGVEb3VibGUoWG1sTm9kZSBub2RlLCBzdHJpbmcgYXR0cmlidXRlKSB7CisgICAgdHJ5IHsKKyAgICAgIHZhciB2YWx1ZSA9IG5vZGUuQXR0cmlidXRlc1thdHRyaWJ1dGVdLlZhbHVlOworICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZSh2YWx1ZSwgTnVtYmVyU3R5bGVzLk51bWJlciwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgfSBjYXRjaCB7CisgICAgICByZXR1cm4gZG91YmxlLk5hTjsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYXR0cmlidXRlIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgc3RhdGljIGRlY2ltYWwgR2V0QXR0cmlidXRlRGVjaW1hbChYbWxOb2RlIG5vZGUsIHN0cmluZyBhdHRyaWJ1dGUpIHsKKyAgICB0cnkgeworICAgICAgdmFyIHZhbHVlID0gbm9kZS5BdHRyaWJ1dGVzW2F0dHJpYnV0ZV0uVmFsdWU7CisgICAgICByZXR1cm4gZGVjaW1hbC5QYXJzZSh2YWx1ZSwgTnVtYmVyU3R5bGVzLkFueSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgfSBjYXRjaCB7CisgICAgICByZXR1cm4gZGVjaW1hbC5NaW5WYWx1ZTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFbmNvZGUgdG8gWE1MIChzcGVjaWFsIGNoYXJhY3RlcmVzOiAmYXBvczsgJnF1b3Q7ICZndDsgJmx0OyAmYW1wOykKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJzIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgc3RhdGljIHN0cmluZyBFbmNvZGVYbWwodGhpcyBzdHJpbmcgcykgeworICAgIHJldHVybiBzLlJlcGxhY2UoIiYiLCAiJmFtcDsiKQorICAgICAgICAuUmVwbGFjZSgiPCIsICImbHQ7IikKKyAgICAgICAgLlJlcGxhY2UoIj4iLCAiJmd0OyIpCisgICAgICAgIC5SZXBsYWNlKCJcIiIsICImcXVvdDsiKQorICAgICAgICAuUmVwbGFjZSgiJyIsICImYXBvczsiKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIERlY29kZSBmcm9tIFhNTCAoc3BlY2lhbCBjaGFyYWN0ZXJlczogJmFwb3M7ICZxdW90OyAmZ3Q7ICZsdDsgJmFtcDspCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIHN0YXRpYyBzdHJpbmcgRGVjb2RlWG1sKHRoaXMgc3RyaW5nIHMpIHsKKyAgICByZXR1cm4gcy5SZXBsYWNlKCInIiwgIiZhcG9zOyIpCisgICAgICAgIC5SZXBsYWNlKCJcIiIsICImcXVvdDsiKQorICAgICAgICAuUmVwbGFjZSgiPiIsICImZ3Q7IikKKyAgICAgICAgLlJlcGxhY2UoIjwiLCAiJmx0OyIpCisgICAgICAgIC5SZXBsYWNlKCImIiwgIiZhbXA7Iik7CisgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YWJhclZhbHVlLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhYmFyVmFsdWUuY3MKaW5kZXggZTE5MGNmNS4uM2M3YTk4YiAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhYmFyVmFsdWUuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhYmFyVmFsdWUuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDM0NiArMTMsMjg5IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Ci11c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5TZWN1cml0eTsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17Ci0JLy8vIDxzdW1tYXJ5PgotCS8vLyAxOC4zLjEuMTEgY2Z2byAoQ29uZGl0aW9uYWwgRm9ybWF0IFZhbHVlIE9iamVjdCkKLQkvLy8gRGVzY3JpYmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGludGVycG9sYXRpb24gcG9pbnRzIGluIGEgZ3JhZGllbnQgc2NhbGUuCi0JLy8vIDwvc3VtbWFyeT4KLQlwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlCi0JCTogWG1sSGVscGVyCi0JewotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKIAotCQkjcmVnaW9uIFByaXZhdGUgUHJvcGVydGllcwotCQlwcml2YXRlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIF9ydWxlVHlwZTsKLQkJcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OwotCQkjZW5kcmVnaW9uIFByaXZhdGUgUHJvcGVydGllcworLy8vIDxzdW1tYXJ5PgorLy8vIDE4LjMuMS4xMSBjZnZvIChDb25kaXRpb25hbCBGb3JtYXQgVmFsdWUgT2JqZWN0KQorLy8vIERlc2NyaWJlcyB0aGUgdmFsdWVzIG9mIHRoZSBpbnRlcnBvbGF0aW9uIHBvaW50cyBpbiBhIGdyYWRpZW50IHNjYWxlLgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgOiBYbWxIZWxwZXIgeworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCQkjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gSW5pdGlhbGl6ZSB0aGUgY2Z2byAowqcxOC4zLjEuMTEpIG5vZGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iZm9ybXVsYSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InJ1bGVUeXBlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj5UaGUgY2Z2byAowqcxOC4zLjEuMTEpIG5vZGUgcGFyZW50LiBDYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgLy8vIGNvbG9yU2NhbGUgKMKnMTguMy4xLjE2KTsgZGF0YUJhciAowqcxOC4zLjEuMjgpOyBpY29uU2V0ICjCpzE4LjMuMS40OSk8L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLQkJaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlKAotCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlIHR5cGUsCi0JCQlkb3VibGUgdmFsdWUsCi0JCQlzdHJpbmcgZm9ybXVsYSwKLQkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHJ1bGVUeXBlLAotICAgICAgICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCi0gICAgICAgICAgICBpbnQgcHJpb3JpdHksCi0JCQlFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCi0JCQlYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKLQkJCVhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKLQkJCTogdGhpcygKLSAgICAgICAgICAgIHJ1bGVUeXBlLAotICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLQkJCW5hbWVzcGFjZU1hbmFnZXIpCi0JCXsKLQkJCVJlcXVpcmUuQXJndW1lbnQocHJpb3JpdHkpLklzSW5SYW5nZSgxLCBpbnQuTWF4VmFsdWUsICJwcmlvcml0eSIpOworICBwcml2YXRlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIF9ydWxlVHlwZTsKKyAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OwogCi0gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGFyZW50IGRvZXMgbm90IGV4aXN0cwotCQkJaWYgKGl0ZW1FbGVtZW50Tm9kZSA9PSBudWxsKQotCQkJewotCQkJCS8vIEdldCB0aGUgcGFyZW50IG5vZGUgcGF0aCBieSB0aGUgcnVsZSB0eXBlCi0JCQkJc3RyaW5nIHBhcmVudE5vZGVQYXRoID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuR2V0UGFyZW50UGF0aEJ5UnVsZVR5cGUoCi0JCQkJCXJ1bGVUeXBlKTsKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQkJCQkvLyBDaGVjayBmb3IgZW4gZXJyb3IgKHJ1bGUgdHlwZSBkb2VzIG5vdCBoYXZlIDxjZnZvPikKLQkJCQlpZiAocGFyZW50Tm9kZVBhdGggPT0gc3RyaW5nLkVtcHR5KQotCQkJCXsKLQkJCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigKLQkJCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5NaXNzaW5nQ2Z2b1BhcmVudE5vZGUpOwotCQkJCX0KIAotCQkJCS8vIFBvaW50IHRvIHRoZSA8Y2Z2bz4gcGFyZW50IG5vZGUKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlID0gX3dvcmtzaGVldC5Xb3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgKLQkJCQkJc3RyaW5nLkZvcm1hdCgKLQkJCQkJCSIvL3swfVt7MX09J3syfSddL3szfVt7NH09J3s1fSddL3s2fSIsCi0JCQkJCS8vIHswfQotCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLAotCQkJCQkvLyB7MX0KLQkJCQkJCUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlNxcmVmQXR0cmlidXRlLAotCQkJCQkvLyB7Mn0KLQkJCQkJCWFkZHJlc3MuQWRkcmVzcywKLQkJCQkJLy8gezN9Ci0JCQkJCQlFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5DZlJ1bGUsCi0JCQkJCS8vIHs0fQotCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuUHJpb3JpdHlBdHRyaWJ1dGUsCi0JCQkJCS8vIHs1fQotCQkJCQkJcHJpb3JpdHksCi0JCQkJCS8vIHs2fQotCQkJCQkJcGFyZW50Tm9kZVBhdGgpLAotCQkJCQlfd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbml0aWFsaXplIHRoZSBjZnZvICjCpzE4LjMuMS4xMSkgbm9kZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZm9ybXVsYSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJydWxlVHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPlRoZSBjZnZvICjCpzE4LjMuMS4xMSkgbm9kZSBwYXJlbnQuIENhbiBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZzoKKyAgLy8vIGNvbG9yU2NhbGUgKMKnMTguMy4xLjE2KTsgZGF0YUJhciAowqcxOC4zLjEuMjgpOyBpY29uU2V0ICjCpzE4LjMuMS40OSk8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSgKKyAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZSB0eXBlLAorICAgICAgZG91YmxlIHZhbHVlLAorICAgICAgc3RyaW5nIGZvcm11bGEsCisgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBydWxlVHlwZSwKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IHRoaXMocnVsZVR5cGUsIGFkZHJlc3MsIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgUmVxdWlyZS5Bcmd1bWVudChwcmlvcml0eSkuSXNJblJhbmdlKDEsIGludC5NYXhWYWx1ZSwgInByaW9yaXR5Iik7CiAKLQkJCQkvLyBDaGVjayBmb3IgZW4gZXJyb3IgKHJ1bGUgdHlwZSBkb2VzIG5vdCBoYXZlIDxjZnZvPikKLSAgICAgICAgICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlID09IG51bGwpCi0JCQkJewotCQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotCQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk1pc3NpbmdDZnZvUGFyZW50Tm9kZSk7Ci0JCQkJfQotCQkJfQorICAgIC8vIENoZWNrIGlmIHRoZSBwYXJlbnQgZG9lcyBub3QgZXhpc3RzCisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZSA9PSBudWxsKSB7CisgICAgICAvLyBHZXQgdGhlIHBhcmVudCBub2RlIHBhdGggYnkgdGhlIHJ1bGUgdHlwZQorICAgICAgc3RyaW5nIHBhcmVudE5vZGVQYXRoID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuR2V0UGFyZW50UGF0aEJ5UnVsZVR5cGUoCisgICAgICAgICAgcnVsZVR5cGUpOwogCi0gICAgICAgICAgICBUb3BOb2RlID0gaXRlbUVsZW1lbnROb2RlOworICAgICAgLy8gQ2hlY2sgZm9yIGVuIGVycm9yIChydWxlIHR5cGUgZG9lcyBub3QgaGF2ZSA8Y2Z2bz4pCisgICAgICBpZiAocGFyZW50Tm9kZVBhdGggPT0gc3RyaW5nLkVtcHR5KSB7CisgICAgICAgIHRocm93IG5ldyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuX21pc3NpbmdDZnZvUGFyZW50Tm9kZSk7CisgICAgICB9CiAKLQkJCS8vIFNhdmUgdGhlIGF0dHJpYnV0ZXMKLQkJCVJ1bGVUeXBlID0gcnVsZVR5cGU7Ci0JCQlUeXBlID0gdHlwZTsKLQkJCVZhbHVlID0gdmFsdWU7Ci0JCQlGb3JtdWxhID0gZm9ybXVsYTsKLQkJfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gSW5pdGlhbGl6ZSB0aGUgY2Z2byAowqcxOC4zLjEuMTEpIG5vZGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icnVsZVR5cGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj5UaGUgY2Z2byAowqcxOC4zLjEuMTEpIG5vZGUgcGFyZW50LiBDYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgLy8vIGNvbG9yU2NhbGUgKMKnMTguMy4xLjE2KTsgZGF0YUJhciAowqcxOC4zLjEuMjgpOyBpY29uU2V0ICjCpzE4LjMuMS40OSk8L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlKAotICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgcnVsZVR5cGUsCi0gICAgICAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKLSAgICAgICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQotICAgICAgICAgICAgOiBiYXNlKAotICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIsCi0gICAgICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1aXJlLkFyZ3VtZW50KGFkZHJlc3MpLklzTm90TnVsbCgiYWRkcmVzcyIpOwotICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudCh3b3Jrc2hlZXQpLklzTm90TnVsbCgid29ya3NoZWV0Iik7CisgICAgICAvLyBQb2ludCB0byB0aGUgPGNmdm8+IHBhcmVudCBub2RlCisgICAgICBpdGVtRWxlbWVudE5vZGUgPSBfd29ya3NoZWV0LldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKAorICAgICAgICAgIHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICIvL3swfVt7MX09J3syfSddL3szfVt7NH09J3s1fSddL3s2fSIsCisgICAgICAgICAgICAgIC8vIHswfQorICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fY29uZGl0aW9uYWxGb3JtYXR0aW5nLAorICAgICAgICAgICAgICAvLyB7MX0KKyAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3NxcmVmQXR0cmlidXRlLAorICAgICAgICAgICAgICAvLyB7Mn0KKyAgICAgICAgICAgICAgYWRkcmVzcy5BZGRyZXNzLAorICAgICAgICAgICAgICAvLyB7M30KKyAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX2NmUnVsZSwKKyAgICAgICAgICAgICAgLy8gezR9CisgICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9wcmlvcml0eUF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgLy8gezV9CisgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICAvLyB7Nn0KKyAgICAgICAgICAgICAgcGFyZW50Tm9kZVBhdGgpLAorICAgICAgICAgIF93b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlcik7CiAKLSAgICAgICAgICAgIC8vIFNhdmUgdGhlIHdvcmtzaGVldCBmb3IgcHJpdmF0ZSBtZXRob2RzIHRvIHVzZQotICAgICAgICAgICAgX3dvcmtzaGVldCA9IHdvcmtzaGVldDsKKyAgICAgIC8vIENoZWNrIGZvciBlbiBlcnJvciAocnVsZSB0eXBlIGRvZXMgbm90IGhhdmUgPGNmdm8+KQorICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZSA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuX21pc3NpbmdDZnZvUGFyZW50Tm9kZSk7CisgICAgICB9CisgICAgfQogCi0gICAgICAgICAgICAvLyBTY2hlbWEgb3JkZXIgbGlzdAotICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdCi0JCQl7Ci0gICAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuTm9kZXMuQ2Z2bywKLQkJCX07CisgICAgVG9wTm9kZSA9IGl0ZW1FbGVtZW50Tm9kZTsKIAotICAgICAgICAgICAgLy9DaGVjayBpZiB0aGUgcGFyZW50IGRvZXMgbm90IGV4aXN0cwotICAgICAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgcGFyZW50IG5vZGUgcGF0aCBieSB0aGUgcnVsZSB0eXBlCi0gICAgICAgICAgICAgICAgc3RyaW5nIHBhcmVudE5vZGVQYXRoID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuR2V0UGFyZW50UGF0aEJ5UnVsZVR5cGUoCi0gICAgICAgICAgICAgICAgICAgIHJ1bGVUeXBlKTsKKyAgICAvLyBTYXZlIHRoZSBhdHRyaWJ1dGVzCisgICAgUnVsZVR5cGUgPSBydWxlVHlwZTsKKyAgICBUeXBlID0gdHlwZTsKKyAgICBWYWx1ZSA9IHZhbHVlOworICAgIEZvcm11bGEgPSBmb3JtdWxhOworICB9CiAKLSAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZW4gZXJyb3IgKHJ1bGUgdHlwZSBkb2VzIG5vdCBoYXZlIDxjZnZvPikKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZVBhdGggPT0gc3RyaW5nLkVtcHR5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5NaXNzaW5nQ2Z2b1BhcmVudE5vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFJ1bGVUeXBlID0gcnVsZVR5cGU7ICAgICAgICAgICAgCi0gICAgICAgIH0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gSW5pdGlhbGl6ZSB0aGUgPHNlZSBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSIvPgotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iZm9ybXVsYSI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJydWxlVHlwZSI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgotCQlpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUoCi0JCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUgdHlwZSwKLQkJCWRvdWJsZSB2YWx1ZSwKLQkJCXN0cmluZyBmb3JtdWxhLAotCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgcnVsZVR5cGUsCi0gICAgICAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKLSAgICAgICAgICAgIGludCBwcmlvcml0eSwKLQkJCUV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKLQkJCVhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKLQkJCTogdGhpcygKLQkJCQl0eXBlLAotCQkJCXZhbHVlLAotCQkJCWZvcm11bGEsCi0JCQkJcnVsZVR5cGUsCi0gICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICBwcmlvcml0eSwKLQkJCQl3b3Jrc2hlZXQsCi0JCQkJbnVsbCwKLQkJCQluYW1lc3BhY2VNYW5hZ2VyKQotCQl7Ci0gICAgICAgICAgICAKLQkJfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBJbml0aWFsaXplIHRoZSA8c2VlIGNyZWY9IkV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIi8+Ci0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJjb2xvciI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJydWxlVHlwZSI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgotCQlpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUoCi0JCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUgdHlwZSwKLQkJCUNvbG9yIGNvbG9yLAotCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgcnVsZVR5cGUsCi0gICAgICAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKLSAgICAgICAgICAgIGludCBwcmlvcml0eSwKLQkJCUV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKLQkJCVhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKLQkJCTogdGhpcygKLQkJCQl0eXBlLAotCQkJCTAsCi0JCQkJbnVsbCwKLQkJCQlydWxlVHlwZSwKLSAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgIHByaW9yaXR5LAotCQkJCXdvcmtzaGVldCwKLQkJCQludWxsLAotCQkJCW5hbWVzcGFjZU1hbmFnZXIpCi0JCXsKLQkJfQotCQkjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbml0aWFsaXplIHRoZSBjZnZvICjCpzE4LjMuMS4xMSkgbm9kZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InJ1bGVUeXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+VGhlIGNmdm8gKMKnMTguMy4xLjExKSBub2RlIHBhcmVudC4gQ2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgorICAvLy8gY29sb3JTY2FsZSAowqcxOC4zLjEuMTYpOyBkYXRhQmFyICjCpzE4LjMuMS4yOCk7IGljb25TZXQgKMKnMTguMy4xLjQ5KTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlKAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgcnVsZVR5cGUsCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKG5hbWVzcGFjZU1hbmFnZXIsIGl0ZW1FbGVtZW50Tm9kZSkgeworICAgIFJlcXVpcmUuQXJndW1lbnQoYWRkcmVzcykuSXNOb3ROdWxsKCJhZGRyZXNzIik7CisgICAgUmVxdWlyZS5Bcmd1bWVudCh3b3Jrc2hlZXQpLklzTm90TnVsbCgid29ya3NoZWV0Iik7CiAKLQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLy8gU2F2ZSB0aGUgd29ya3NoZWV0IGZvciBwcml2YXRlIG1ldGhvZHMgdG8gdXNlCisgICAgX3dvcmtzaGVldCA9IHdvcmtzaGVldDsKIAotCQkjcmVnaW9uIE1ldGhvZHMKLSAgICAgICAgI2VuZHJlZ2lvbgorICAgIC8vIFNjaGVtYSBvcmRlciBsaXN0CisgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3W10geyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5Ob2Rlcy5fY2Z2byB9OwogCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8vQ2hlY2sgaWYgdGhlIHBhcmVudCBkb2VzIG5vdCBleGlzdHMKKyAgICBpZiAoaXRlbUVsZW1lbnROb2RlID09IG51bGwpIHsKKyAgICAgIC8vIEdldCB0aGUgcGFyZW50IG5vZGUgcGF0aCBieSB0aGUgcnVsZSB0eXBlCisgICAgICBzdHJpbmcgcGFyZW50Tm9kZVBhdGggPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5HZXRQYXJlbnRQYXRoQnlSdWxlVHlwZSgKKyAgICAgICAgICBydWxlVHlwZSk7CiAKLQkJI3JlZ2lvbiBFeHBvc2VkIFByb3BlcnRpZXMKKyAgICAgIC8vIENoZWNrIGZvciBlbiBlcnJvciAocnVsZSB0eXBlIGRvZXMgbm90IGhhdmUgPGNmdm8+KQorICAgICAgaWYgKHBhcmVudE5vZGVQYXRoID09IHN0cmluZy5FbXB0eSkgeworICAgICAgICB0aHJvdyBuZXcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLl9taXNzaW5nQ2Z2b1BhcmVudE5vZGUpOworICAgICAgfQorICAgIH0KKyAgICBSdWxlVHlwZSA9IHJ1bGVUeXBlOworICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCWludGVybmFsIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIFJ1bGVUeXBlCi0JCXsKLQkJCWdldCB7IHJldHVybiBfcnVsZVR5cGU7IH0KLQkJCXNldCB7IF9ydWxlVHlwZSA9IHZhbHVlOyB9Ci0JCX0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW5pdGlhbGl6ZSB0aGUgPHNlZSBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSIvPgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZm9ybXVsYSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJydWxlVHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUoCisgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUgdHlwZSwKKyAgICAgIGRvdWJsZSB2YWx1ZSwKKyAgICAgIHN0cmluZyBmb3JtdWxhLAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgcnVsZVR5cGUsCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogdGhpcygKKyAgICAgICAgICB0eXBlLAorICAgICAgICAgIHZhbHVlLAorICAgICAgICAgIGZvcm11bGEsCisgICAgICAgICAgcnVsZVR5cGUsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgbnVsbCwKKyAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKSB7fQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIAotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlIFR5cGUKLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJdmFyIHR5cGVBdHRyaWJ1dGUgPSBHZXRYbWxOb2RlU3RyaW5nKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlR5cGVBdHRyaWJ1dGUpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbml0aWFsaXplIHRoZSA8c2VlIGNyZWY9IkV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIi8+CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2xvciI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJydWxlVHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUoCisgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUgdHlwZSwKKyAgICAgIENvbG9yIGNvbG9yLAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgcnVsZVR5cGUsCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogdGhpcyh0eXBlLCAwLCBudWxsLCBydWxlVHlwZSwgYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgbnVsbCwgbmFtZXNwYWNlTWFuYWdlcikge30KIAotCQkJCXJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5HZXRUeXBlQnlBdHRyYml1dGUodHlwZUF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCQlzZXQKLQkJCXsKLSAgICAgICAgICAgICAgICBpZiAoKF9ydWxlVHlwZT09ZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0IHx8IF9ydWxlVHlwZT09ZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQgfHwgX3J1bGVUeXBlPT1lRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5GaXZlSWNvblNldCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHZhbHVlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5NaW4gfHwgdmFsdWUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1heCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRFeGNlcHRpb24oIlZhbHVlIHR5cGUgY2FuJ3QgYmUgTWluIG9yIE1heCBmb3IgaWNvbiBzZXRzIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlR5cGVBdHRyaWJ1dGUsIHZhbHVlLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7ICAgICAgICAgICAgICAgIAotCQkJfQotCQl9CisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIEdldC9TZXQgdGhlICdjZnZvJyBub2RlIEB2YWwgYXR0cmlidXRlCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBEb3VibGUgVmFsdWUKLQkJewotCQkJZ2V0Ci0JCQl7Ci0gICAgICAgICAgICAgICAgaWYgKChUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5OdW0pCi0gICAgICAgICAgICAgICAgICAgIHx8IChUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50KQotICAgICAgICAgICAgICAgICAgICB8fCAoVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudGlsZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURvdWJsZShFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5WYWxBdHRyaWJ1dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JCQlzZXQKLQkJCXsKLQkJCQlzdHJpbmcgdmFsdWVUb1N0b3JlID0gc3RyaW5nLkVtcHR5OworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCQkJCS8vIE9ubHkgc29tZSB0eXBlcyB1c2UgdGhlIEB2YWwgYXR0cmlidXRlCi0JCQkJaWYgKChUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5OdW0pCi0JCQkJCXx8IChUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50KQotCQkJCQl8fCAoVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudGlsZSkpCi0JCQkJewotCQkJCQl2YWx1ZVRvU3RvcmUgPSB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLQkJCQl9CiAKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlZhbEF0dHJpYnV0ZSwgdmFsdWVUb1N0b3JlKTsKLQkJCX0KLQkJfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBSdWxlVHlwZSB7CisgICAgZ2V0ID0+IF9ydWxlVHlwZTsKKyAgICBzZXQgPT4gX3J1bGVUeXBlID0gdmFsdWU7CisgIH0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBHZXQvU2V0IHRoZSBGb3JtdWxhIG9mIHRoZSBPYmplY3QgVmFsdWUgKHVzZXMgdGhlIHNhbWUgYXR0cmlidXRlIGFzIHRoZSBWYWx1ZSkKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIHN0cmluZyBGb3JtdWxhCi0JCXsKLQkJCWdldAotCQkJewotCQkJCS8vIFJldHVybiBlbXB0eSBpZiB0aGUgT2JqZWN0IFZhbHVlIHR5cGUgaXMgbm90IEZvcm11bGEKLQkJCQlpZiAoVHlwZSAhPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuRm9ybXVsYSkKLQkJCQl7Ci0JCQkJCXJldHVybiBzdHJpbmcuRW1wdHk7Ci0JCQkJfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlIFR5cGUgeworICAgIGdldCB7CisgICAgICB2YXIgdHlwZUF0dHJpYnV0ZSA9IEdldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3R5cGVBdHRyaWJ1dGUpOwogCi0JCQkJLy8gRXhjZWwgc3RvcmVzIHRoZSBmb3JtdWxhIGluIHRoZSBAdmFsIGF0dHJpYnV0ZQotCQkJCXJldHVybiBHZXRYbWxOb2RlU3RyaW5nKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlZhbEF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCQlzZXQKLQkJCXsKLQkJCQkvLyBPbmx5IHN0b3JlIHRoZSBmb3JtdWxhIGlmIHRoZSBPYmplY3QgVmFsdWUgdHlwZSBpcyBGb3JtdWxhCi0JCQkJaWYgKFR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkZvcm11bGEpCi0JCQkJewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlZhbEF0dHJpYnV0ZSwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkjZW5kcmVnaW9uIEV4cG9zZWQgUHJvcGVydGllcworICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkdldFR5cGVCeUF0dHJiaXV0ZSh0eXBlQXR0cmlidXRlKTsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIGlmICgoX3J1bGVUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlSWNvblNldAorICAgICAgICAgICAgICAgICAgfHwgX3J1bGVUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZvdXJJY29uU2V0CisgICAgICAgICAgICAgICAgICB8fCBfcnVsZVR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRml2ZUljb25TZXQpCisgICAgICAgICAgJiYgKHZhbHVlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5NaW4KKyAgICAgICAgICAgICAgICAgIHx8IHZhbHVlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5NYXgpKSB7CisgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIlZhbHVlIHR5cGUgY2FuJ3QgYmUgTWluIG9yIE1heCBmb3IgaWNvbiBzZXRzIikpOworICAgICAgfQorICAgICAgU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fdHlwZUF0dHJpYnV0ZSwKKyAgICAgICAgICB2YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgIH0KKyAgfQogCi0JCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldC9TZXQgdGhlICdjZnZvJyBub2RlIEB2YWwgYXR0cmlidXRlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBEb3VibGUgVmFsdWUgeworICAgIGdldCB7CisgICAgICBpZiAoKFR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk51bSkKKyAgICAgICAgICB8fCAoVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudCkKKyAgICAgICAgICB8fCAoVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudGlsZSkpIHsKKyAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEb3VibGUoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3ZhbEF0dHJpYnV0ZSk7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0cmluZyB2YWx1ZVRvU3RvcmUgPSBzdHJpbmcuRW1wdHk7CisKKyAgICAgIC8vIE9ubHkgc29tZSB0eXBlcyB1c2UgdGhlIEB2YWwgYXR0cmlidXRlCisgICAgICBpZiAoKFR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk51bSkKKyAgICAgICAgICB8fCAoVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudCkKKyAgICAgICAgICB8fCAoVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudGlsZSkpIHsKKyAgICAgICAgdmFsdWVUb1N0b3JlID0gdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICB9CisKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3ZhbEF0dHJpYnV0ZSwgdmFsdWVUb1N0b3JlKTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXQvU2V0IHRoZSBGb3JtdWxhIG9mIHRoZSBPYmplY3QgVmFsdWUgKHVzZXMgdGhlIHNhbWUgYXR0cmlidXRlIGFzIHRoZSBWYWx1ZSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBGb3JtdWxhIHsKKyAgICBnZXQgeworICAgICAgLy8gUmV0dXJuIGVtcHR5IGlmIHRoZSBPYmplY3QgVmFsdWUgdHlwZSBpcyBub3QgRm9ybXVsYQorICAgICAgaWYgKFR5cGUgIT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkZvcm11bGEpIHsKKyAgICAgICAgcmV0dXJuIHN0cmluZy5FbXB0eTsKKyAgICAgIH0KKworICAgICAgLy8gRXhjZWwgc3RvcmVzIHRoZSBmb3JtdWxhIGluIHRoZSBAdmFsIGF0dHJpYnV0ZQorICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3ZhbEF0dHJpYnV0ZSk7CisgICAgfQorICAgIHNldCB7CisgICAgICAvLyBPbmx5IHN0b3JlIHRoZSBmb3JtdWxhIGlmIHRoZSBPYmplY3QgVmFsdWUgdHlwZSBpcyBGb3JtdWxhCisgICAgICBpZiAoVHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuRm9ybXVsYSkgeworICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl92YWxBdHRyaWJ1dGUsIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLmNzCmluZGV4IDA2ZTIzNzQuLmNmMGZhZTggMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTMzICsxMywxMjEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yICAgICAgICAgIENoYW5nZQkJCQkJCSAgICAgICAgICAgICAgICAgIERhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgQWRhcHRpb24gICAgMjAxMi0wNC0xNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotCS8vLyA8c3VtbWFyeT4KLSAgLy8vIEZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZSA8c2VlIGNyZWY9IkV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlIi8+Ci0JLy8vIDwvc3VtbWFyeT4KLSAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlCi0JewotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyAKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgotCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotCQlpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldEF0dHJpYnV0ZUJ5VHlwZSgKLQkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZSB0eXBlKQotCQl7Ci0JCQlzd2l0Y2ggKHR5cGUpCi0JCQl7Ci0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkJlZ2luc1dpdGg6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5CZWdpbnNXaXRoOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkJldHdlZW46Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5CZXR3ZWVuOworLy8vIDxzdW1tYXJ5PgorLy8vIEZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZSA8c2VlIGNyZWY9IkV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlIi8+CisvLy8gPC9zdW1tYXJ5PgoraW50ZXJuYWwgc3RhdGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldEF0dHJpYnV0ZUJ5VHlwZShlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuQmVnaW5zV2l0aDoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5fYmVnaW5zV2l0aDsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Db250YWluc1RleHQ6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5Db250YWluc1RleHQ7CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5CZXR3ZWVuOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLl9iZXR3ZWVuOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkVuZHNXaXRoOgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuRW5kc1dpdGg7CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Db250YWluc1RleHQ6CisgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2NvbnRhaW5zVGV4dDsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5FcXVhbDoKLSAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkVxdWFsOworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuRW5kc1dpdGg6CisgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2VuZHNXaXRoOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkdyZWF0ZXJUaGFuOgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuR3JlYXRlclRoYW47CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5FcXVhbDoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5fZXF1YWw7CiAKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuR3JlYXRlclRoYW5PckVxdWFsOgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuR3JlYXRlclRoYW5PckVxdWFsOworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuR3JlYXRlclRoYW46CisgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2dyZWF0ZXJUaGFuOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkxlc3NUaGFuOgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuTGVzc1RoYW47CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5HcmVhdGVyVGhhbk9yRXF1YWw6CisgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2dyZWF0ZXJUaGFuT3JFcXVhbDsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5MZXNzVGhhbk9yRXF1YWw6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5MZXNzVGhhbk9yRXF1YWw7CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5MZXNzVGhhbjoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5fbGVzc1RoYW47CiAKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTm90QmV0d2VlbjoKLSAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLk5vdEJldHdlZW47CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5MZXNzVGhhbk9yRXF1YWw6CisgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2xlc3NUaGFuT3JFcXVhbDsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Ob3RDb250YWluczoKLSAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLk5vdENvbnRhaW5zOworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTm90QmV0d2VlbjoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5fbm90QmV0d2VlbjsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Ob3RFcXVhbDoKLSAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLk5vdEVxdWFsOwotCQkJfQorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTm90Q29udGFpbnM6CisgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX25vdENvbnRhaW5zOwogCi0JCQlyZXR1cm4gc3RyaW5nLkVtcHR5OwotCQl9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIHBhcmFtIG5hbWU9ImF0dHJpYnV0ZSIKLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIGludGVybmFsIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUgR2V0VHlwZUJ5QXR0cmlidXRlKAotICAgICAgc3RyaW5nIGF0dHJpYnV0ZSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuQmVnaW5zV2l0aDoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkJlZ2luc1dpdGg7Ci0KLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuQmV0d2VlbjoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkJldHdlZW47Ci0KLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuQ29udGFpbnNUZXh0OgotICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuQ29udGFpbnNUZXh0OwotCi0gICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkVuZHNXaXRoOgotICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuRW5kc1dpdGg7Ci0KLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuRXF1YWw6Ci0gICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5FcXVhbDsKLQotICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5HcmVhdGVyVGhhbjoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkdyZWF0ZXJUaGFuOwotCi0gICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkdyZWF0ZXJUaGFuT3JFcXVhbDoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkdyZWF0ZXJUaGFuT3JFcXVhbDsKLQotICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5MZXNzVGhhbjoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkxlc3NUaGFuOwotCi0gICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkxlc3NUaGFuT3JFcXVhbDoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkxlc3NUaGFuT3JFcXVhbDsKLQotICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5Ob3RCZXR3ZWVuOgotICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTm90QmV0d2VlbjsKLQotICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5Ob3RDb250YWluczoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLk5vdENvbnRhaW5zOwotCi0gICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLk5vdEVxdWFsOgotICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTm90RXF1YWw7Ci0gICAgICB9Ci0KLSAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCi0gICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5VbmV4aXN0ZW50T3BlcmF0b3JUeXBlQXR0cmlidXRlKTsKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLk5vdEVxdWFsOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLl9ub3RFcXVhbDsKICAgICB9CisKKyAgICByZXR1cm4gc3RyaW5nLkVtcHR5OwogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyBwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiCisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIGludGVybmFsIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUgR2V0VHlwZUJ5QXR0cmlidXRlKHN0cmluZyBhdHRyaWJ1dGUpIHsKKyAgICBzd2l0Y2ggKGF0dHJpYnV0ZSkgeworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2JlZ2luc1dpdGg6CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuQmVnaW5zV2l0aDsKKworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2JldHdlZW46CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuQmV0d2VlbjsKKworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2NvbnRhaW5zVGV4dDoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Db250YWluc1RleHQ7CisKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLl9lbmRzV2l0aDoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5FbmRzV2l0aDsKKworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2VxdWFsOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkVxdWFsOworCisgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5fZ3JlYXRlclRoYW46CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuR3JlYXRlclRoYW47CisKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLl9ncmVhdGVyVGhhbk9yRXF1YWw6CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuR3JlYXRlclRoYW5PckVxdWFsOworCisgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5fbGVzc1RoYW46CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTGVzc1RoYW47CisKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLl9sZXNzVGhhbk9yRXF1YWw6CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTGVzc1RoYW5PckVxdWFsOworCisgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5fbm90QmV0d2VlbjoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Ob3RCZXR3ZWVuOworCisgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5fbm90Q29udGFpbnM6CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTm90Q29udGFpbnM7CisKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLl9ub3RFcXVhbDoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Ob3RFcXVhbDsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLl91bmV4aXN0ZW50T3BlcmF0b3JUeXBlQXR0cmlidXRlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVGYWN0b3J5LmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVGYWN0b3J5LmNzCmluZGV4IDA4ODc5OGQuLjZiYzc1NjMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlRmFjdG9yeS5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZUZhY3RvcnkuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDM2MSArMTMsMzM0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQkgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbAkJICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgICAgICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gRmFjdG9yeSBjbGFzcyBmb3IgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmcuCi0JLy8vIDwvc3VtbWFyeT4KLQlpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlRmFjdG9yeQotCXsKLQkJcHVibGljIHN0YXRpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUgQ3JlYXRlKAotCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSwKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEZhY3RvcnkgY2xhc3MgZm9yIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nLgorLy8vIDwvc3VtbWFyeT4KK2ludGVybmFsIHN0YXRpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVGYWN0b3J5IHsKKyAgcHVibGljIHN0YXRpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUgQ3JlYXRlKAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSwKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAotCQkJRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAotCQkJWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0JCXsKLQkJCVJlcXVpcmUuQXJndW1lbnQodHlwZSk7Ci0gICAgICBSZXF1aXJlLkFyZ3VtZW50KGFkZHJlc3MpLklzTm90TnVsbCgiYWRkcmVzcyIpOwotICAgICAgUmVxdWlyZS5Bcmd1bWVudChwcmlvcml0eSkuSXNJblJhbmdlKDEsIGludC5NYXhWYWx1ZSwgInByaW9yaXR5Iik7Ci0JCQlSZXF1aXJlLkFyZ3VtZW50KHdvcmtzaGVldCkuSXNOb3ROdWxsKCJ3b3Jrc2hlZXQiKTsKLQkJCQotCQkJLy8gQWNjb3JkaW5nIHRoZSBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUgdHlwZQotCQkJc3dpdGNoICh0eXBlKQotCQkJewotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlQXZlcmFnZToKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVBdmVyYWdlKAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpIHsKKyAgICBSZXF1aXJlLkFyZ3VtZW50KHR5cGUpOworICAgIFJlcXVpcmUuQXJndW1lbnQoYWRkcmVzcykuSXNOb3ROdWxsKCJhZGRyZXNzIik7CisgICAgUmVxdWlyZS5Bcmd1bWVudChwcmlvcml0eSkuSXNJblJhbmdlKDEsIGludC5NYXhWYWx1ZSwgInByaW9yaXR5Iik7CisgICAgUmVxdWlyZS5Bcmd1bWVudCh3b3Jrc2hlZXQpLklzTm90TnVsbCgid29ya3NoZWV0Iik7CisKKyAgICAvLyBBY2NvcmRpbmcgdGhlIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZSB0eXBlCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlQXZlcmFnZToKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlQXZlcmFnZSgKICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICBwcmlvcml0eSwKICAgICAgICAgICAgIHdvcmtzaGVldCwKICAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CiAKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5BYm92ZU9yRXF1YWxBdmVyYWdlOgotICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZU9yRXF1YWxBdmVyYWdlKAorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5BYm92ZU9yRXF1YWxBdmVyYWdlOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVPckVxdWFsQXZlcmFnZSgKICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICBwcmlvcml0eSwKICAgICAgICAgICAgIHdvcmtzaGVldCwKICAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CiAKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd0F2ZXJhZ2U6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93QXZlcmFnZSgKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dBdmVyYWdlOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dBdmVyYWdlKAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93T3JFcXVhbEF2ZXJhZ2U6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93T3JFcXVhbEF2ZXJhZ2UoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93T3JFcXVhbEF2ZXJhZ2U6CisgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd09yRXF1YWxBdmVyYWdlKAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlU3RkRGV2OgotICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZVN0ZERldigKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVTdGREZXY6CisgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZVN0ZERldigKICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICBwcmlvcml0eSwKICAgICAgICAgICAgIHdvcmtzaGVldCwKICAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CiAKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd1N0ZERldjoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dTdGREZXYoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93U3RkRGV2OgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dTdGREZXYoCiAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQm90dG9tOgotICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b20oCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJvdHRvbToKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbShhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBpdGVtRWxlbWVudE5vZGUpOworCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJvdHRvbVBlcmNlbnQ6CisgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b21QZXJjZW50KAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJvdHRvbVBlcmNlbnQ6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbVBlcmNlbnQoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvcDoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcChhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBpdGVtRWxlbWVudE5vZGUpOworCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvcFBlcmNlbnQ6CisgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BQZXJjZW50KAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvcDoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wKAorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MYXN0N0RheXM6CisgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0N0RheXMoCiAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVG9wUGVyY2VudDoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wUGVyY2VudCgKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdE1vbnRoOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdE1vbnRoKAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxhc3Q3RGF5czoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdDdEYXlzKAorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MYXN0V2VlazoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3RXZWVrKAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKIAotCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdE1vbnRoOgotICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGgoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5leHRNb250aDoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRNb250aCgKICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICBwcmlvcml0eSwKICAgICAgICAgICAgIHdvcmtzaGVldCwKICAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CiAKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MYXN0V2VlazoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdFdlZWsoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5leHRXZWVrOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTmV4dFdlZWsoCiAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTmV4dE1vbnRoOgotICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0TW9udGgoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRoaXNNb250aDoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNNb250aCgKICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICBwcmlvcml0eSwKICAgICAgICAgICAgIHdvcmtzaGVldCwKICAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CiAKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5OZXh0V2VlazoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTmV4dFdlZWsoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRoaXNXZWVrOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc1dlZWsoCiAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhpc01vbnRoOgotICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzTW9udGgoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvZGF5OgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9kYXkoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlKTsKKworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub21vcnJvdzoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvbW9ycm93KAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRoaXNXZWVrOgotICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzV2VlaygKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuWWVzdGVyZGF5OgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nWWVzdGVyZGF5KAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvZGF5OgotICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb2RheSgKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVnaW5zV2l0aDoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGgoCiAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVG9tb3Jyb3c6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvbW9ycm93KAorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZXR3ZWVuOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2VlbihhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBpdGVtRWxlbWVudE5vZGUpOworCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkNvbnRhaW5zQmxhbmtzOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MoCiAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuWWVzdGVyZGF5OgotICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdZZXN0ZXJkYXkoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkNvbnRhaW5zRXJyb3JzOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMoCiAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVnaW5zV2l0aDoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aCgKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNUZXh0OgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0KAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJldHdlZW46Ci0gICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4oCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkR1cGxpY2F0ZVZhbHVlczoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcygKICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICBwcmlvcml0eSwKICAgICAgICAgICAgIHdvcmtzaGVldCwKICAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CiAKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Db250YWluc0JsYW5rczoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVuZHNXaXRoOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGgoCiAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNFcnJvcnM6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzKAorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5FcXVhbDoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSk7CisKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRXhwcmVzc2lvbjoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24oCiAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNUZXh0OgotICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4oCiAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRHVwbGljYXRlVmFsdWVzOgotICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuT3JFcXVhbDoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbCgKICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICBwcmlvcml0eSwKICAgICAgICAgICAgIHdvcmtzaGVldCwKICAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CiAKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5FbmRzV2l0aDoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGgoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4oCiAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRXF1YWw6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsKAorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MZXNzVGhhbk9yRXF1YWw6CisgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwoCiAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRXhwcmVzc2lvbjoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbigKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90QmV0d2VlbjoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4oCiAgICAgICAgICAgICBhZGRyZXNzLAogICAgICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUpOwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuR3JlYXRlclRoYW46Ci0gICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuKAorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc0JsYW5rczoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzKAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuT3JFcXVhbDoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsKAorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc0Vycm9yczoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzKAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuOgotICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbigKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90Q29udGFpbnNUZXh0OgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNUZXh0KAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuT3JFcXVhbDoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW5PckVxdWFsKAorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RFcXVhbDoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsKAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdEJldHdlZW46Ci0gICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4oCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlVuaXF1ZVZhbHVlczoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcygKICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICBwcmlvcml0eSwKICAgICAgICAgICAgIHdvcmtzaGVldCwKICAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CiAKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc0JsYW5rczoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlQ29sb3JTY2FsZToKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSgKICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICBwcmlvcml0eSwKICAgICAgICAgICAgIHdvcmtzaGVldCwKICAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7CiAKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc0Vycm9yczoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMoCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlR3b0NvbG9yU2NhbGU6CisgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlKAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKLQotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zVGV4dDoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNUZXh0KAotICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgIHByaW9yaXR5LAotICAgICAgICAgICAgd29ya3NoZWV0LAotICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlKTsKLQotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdEVxdWFsOgotICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbCgKLSAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7Ci0KLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5VbmlxdWVWYWx1ZXM6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcygKLSAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7Ci0KLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUNvbG9yU2NhbGU6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSgKLSAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSk7Ci0KLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ud29Db2xvclNjYWxlOgotICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlKAotICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgIHByaW9yaXR5LAotCQkJCQkJd29ya3NoZWV0LAotCQkJCQkJaXRlbUVsZW1lbnROb2RlKTsKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQ6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlSWNvblNldCgKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0OgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0KAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAogICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQ6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0KAorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Gb3VySWNvblNldDoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0KAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAogICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRml2ZUljb25TZXQ6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0KAorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5GaXZlSWNvblNldDoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0KAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LAogICAgICAgICAgICAgd29ya3NoZWV0LAogICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAogICAgICAgICAgICAgbnVsbCk7Ci0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRGF0YUJhcjoKLSAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhcigKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRGF0YUJhcjoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXIoCiAgICAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5EYXRhQmFyLAogICAgICAgICAgICAgYWRkcmVzcywKICAgICAgICAgICAgIHByaW9yaXR5LApAQCAtMzc1LDE0ICszNDgsMTIgQEAKICAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgICAgICAgIG51bGwpOwogCisgICAgICAvL1RPRE86IEFkZCBEYXRhQmFyCisgICAgfQogCi0gICAgICAgIC8vVE9ETzogQWRkIERhdGFCYXIKLQkJCX0KLQotCQkJdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oCiAgICAgICAgIHN0cmluZy5Gb3JtYXQoCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk5vblN1cHBvcnRlZFJ1bGVUeXBlLAotICAgICAgICAgIHR5cGUuVG9TdHJpbmcoKSkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5fbm9uU3VwcG9ydGVkUnVsZVR5cGUsCisgICAgICAgICAgICB0eXBlLlRvU3RyaW5nKCkpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLmNzCmluZGV4IDQ4OGRhZmEuLmIxYzZiMzIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDUyNyArMTMsNDgzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uWG1sOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUKKy8vLyA8L3N1bW1hcnk+CitpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSB7CiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUKKyAgLy8vCiAgIC8vLyA8L3N1bW1hcnk+Ci0gIGludGVybmFsIHN0YXRpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlCi0gIHsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ0b3BOb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZVNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIGludGVybmFsIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBHZXRUeXBlQnlBdHRyYml1dGUoCisgIC8vLyA8cGFyYW0gbmFtZT0iYXR0cmlidXRlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InRvcE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZVNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgaW50ZXJuYWwgc3RhdGljIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIEdldFR5cGVCeUF0dHJiaXV0ZSgKICAgICAgIHN0cmluZyBhdHRyaWJ1dGUsCiAgICAgICBYbWxOb2RlIHRvcE5vZGUsCi0gICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIpCi0gICAgewotICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuQWJvdmVBdmVyYWdlOgotICAgICAgICAgIHJldHVybiBHZXRBYm92ZUF2ZXJhZ2VUeXBlKAotICAgICAgICAgICAgdG9wTm9kZSwKLSAgICAgICAgICAgIG5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKSB7CisgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHsKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuX2Fib3ZlQXZlcmFnZToKKyAgICAgICAgcmV0dXJuIEdldEFib3ZlQXZlcmFnZVR5cGUodG9wTm9kZSwgbmFtZVNwYWNlTWFuYWdlcik7CiAKLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5Ub3AxMDoKLSAgICAgICAgICByZXR1cm4gR2V0VG9wMTBUeXBlKAotICAgICAgICAgICAgdG9wTm9kZSwKLSAgICAgICAgICAgIG5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5fdG9wMTA6CisgICAgICAgIHJldHVybiBHZXRUb3AxMFR5cGUodG9wTm9kZSwgbmFtZVNwYWNlTWFuYWdlcik7CiAKLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5UaW1lUGVyaW9kOgotICAgICAgICAgIHJldHVybiBHZXRUaW1lUGVyaW9kVHlwZSgKLSAgICAgICAgICAgIHRvcE5vZGUsCi0gICAgICAgICAgICBuYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5DZWxsSXM6Ci0gICAgICAgICAgcmV0dXJuIEdldENlbGxJcygoWG1sRWxlbWVudCl0b3BOb2RlKTsKLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5CZWdpbnNXaXRoOgotICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWdpbnNXaXRoOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5fdGltZVBlcmlvZDoKKyAgICAgICAgcmV0dXJuIEdldFRpbWVQZXJpb2RUeXBlKHRvcE5vZGUsIG5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5fY2VsbElzOgorICAgICAgICByZXR1cm4gR2V0Q2VsbElzKChYbWxFbGVtZW50KXRvcE5vZGUpOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5fYmVnaW5zV2l0aDoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlZ2luc1dpdGg7CiAKLSAgICAgICAgLy9jYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkJldHdlZW46Ci0gICAgICAgIC8vICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmV0d2VlbjsKKyAgICAgIC8vY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5CZXR3ZWVuOgorICAgICAgLy8gIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZXR3ZWVuOwogCi0gICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuQ29udGFpbnNCbGFua3M6Ci0gICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkNvbnRhaW5zQmxhbmtzOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5fY29udGFpbnNCbGFua3M6CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Db250YWluc0JsYW5rczsKIAotICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkNvbnRhaW5zRXJyb3JzOgotICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Db250YWluc0Vycm9yczsKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuX2NvbnRhaW5zRXJyb3JzOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNFcnJvcnM7CiAKLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5Db250YWluc1RleHQ6Ci0gICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkNvbnRhaW5zVGV4dDsKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuX2NvbnRhaW5zVGV4dDoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkNvbnRhaW5zVGV4dDsKIAotICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkR1cGxpY2F0ZVZhbHVlczoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRHVwbGljYXRlVmFsdWVzOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5fZHVwbGljYXRlVmFsdWVzOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRHVwbGljYXRlVmFsdWVzOwogCi0gICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuRW5kc1dpdGg6Ci0gICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVuZHNXaXRoOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5fZW5kc1dpdGg6CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5FbmRzV2l0aDsKIAotICAgICAgICAvL2Nhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuRXF1YWw6Ci0gICAgICAgIC8vICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRXF1YWw7CisgICAgICAvL2Nhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuRXF1YWw6CisgICAgICAvLyAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVxdWFsOwogCi0gICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuRXhwcmVzc2lvbjoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRXhwcmVzc2lvbjsKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuX2V4cHJlc3Npb246CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5FeHByZXNzaW9uOwogCi0gICAgICAgIC8vY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5HcmVhdGVyVGhhbjoKLSAgICAgICAgLy8gIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5HcmVhdGVyVGhhbjsKKyAgICAgIC8vY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5HcmVhdGVyVGhhbjoKKyAgICAgIC8vICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuR3JlYXRlclRoYW47CiAKLSAgICAgICAgLy9jYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkdyZWF0ZXJUaGFuT3JFcXVhbDoKLSAgICAgICAgLy8gIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5HcmVhdGVyVGhhbk9yRXF1YWw7CisgICAgICAvL2Nhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuR3JlYXRlclRoYW5PckVxdWFsOgorICAgICAgLy8gIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5HcmVhdGVyVGhhbk9yRXF1YWw7CiAKLSAgICAgICAgLy9jYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkxlc3NUaGFuOgotICAgICAgICAvLyAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuOworICAgICAgLy9jYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkxlc3NUaGFuOgorICAgICAgLy8gIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MZXNzVGhhbjsKIAotICAgICAgICAvL2Nhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuTGVzc1RoYW5PckVxdWFsOgotICAgICAgICAvLyAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuT3JFcXVhbDsKKyAgICAgIC8vY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5MZXNzVGhhbk9yRXF1YWw6CisgICAgICAvLyAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuT3JFcXVhbDsKIAotICAgICAgICAvL2Nhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuTm90QmV0d2VlbjoKLSAgICAgICAgLy8gIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RCZXR3ZWVuOworICAgICAgLy9jYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLk5vdEJldHdlZW46CisgICAgICAvLyAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdEJldHdlZW47CiAKLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5Ob3RDb250YWluc0JsYW5rczoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90Q29udGFpbnNCbGFua3M7CisgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLl9ub3RDb250YWluc0JsYW5rczoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zQmxhbmtzOwogCi0gICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuTm90Q29udGFpbnNFcnJvcnM6Ci0gICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zRXJyb3JzOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5fbm90Q29udGFpbnNFcnJvcnM6CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc0Vycm9yczsKIAotICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLk5vdENvbnRhaW5zVGV4dDoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90Q29udGFpbnNUZXh0OworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5fbm90Q29udGFpbnNUZXh0OgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90Q29udGFpbnNUZXh0OwogCi0gICAgICAgIC8vY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5Ob3RFcXVhbDoKLSAgICAgICAgLy8gIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RFcXVhbDsKKyAgICAgIC8vY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5Ob3RFcXVhbDoKKyAgICAgIC8vICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90RXF1YWw7CiAKLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5VbmlxdWVWYWx1ZXM6Ci0gICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlVuaXF1ZVZhbHVlczsKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuX3VuaXF1ZVZhbHVlczoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlVuaXF1ZVZhbHVlczsKIAotICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkNvbG9yU2NhbGU6Ci0gICAgICAgICAgcmV0dXJuIEdldENvbG9yU2NhbGVUeXBlKAotICAgICAgICAgICAgdG9wTm9kZSwKLSAgICAgICAgICAgIG5hbWVTcGFjZU1hbmFnZXIpOyAgICAgICAgCi0gICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuSWNvblNldDoKLSAgICAgICAgICAgIHJldHVybiBHZXRJY29uU2V0VHlwZSh0b3BOb2RlLCBuYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5EYXRhQmFyOgotICAgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkRhdGFCYXI7Ci0gICAgIH0KLQotICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLlVuZXhwZWN0ZWRSdWxlVHlwZUF0dHJpYnV0ZSk7CisgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLl9jb2xvclNjYWxlOgorICAgICAgICByZXR1cm4gR2V0Q29sb3JTY2FsZVR5cGUodG9wTm9kZSwgbmFtZVNwYWNlTWFuYWdlcik7CisgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLl9pY29uU2V0OgorICAgICAgICByZXR1cm4gR2V0SWNvblNldFR5cGUodG9wTm9kZSwgbmFtZVNwYWNlTWFuYWdlcik7CisgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLl9kYXRhQmFyOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRGF0YUJhcjsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBHZXRDZWxsSXMoWG1sRWxlbWVudCBub2RlKQotICAgIHsKLSAgICAgICAgc3dpdGNoKG5vZGUuR2V0QXR0cmlidXRlKCJvcGVyYXRvciIpKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5CZWdpbnNXaXRoOgotICAgICAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVnaW5zV2l0aDsKLSAgICAgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkJldHdlZW46Ci0gICAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZXR3ZWVuOworICAgIHRocm93IG5ldyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuX3VuZXhwZWN0ZWRSdWxlVHlwZUF0dHJpYnV0ZSk7CisgIH0KIAotICAgICAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuQ29udGFpbnNUZXh0OgotICAgICAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNUZXh0OworICBwcml2YXRlIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBHZXRDZWxsSXMoWG1sRWxlbWVudCBub2RlKSB7CisgICAgc3dpdGNoIChub2RlLkdldEF0dHJpYnV0ZSgib3BlcmF0b3IiKSkgeworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2JlZ2luc1dpdGg6CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWdpbnNXaXRoOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2JldHdlZW46CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZXR3ZWVuOwogCi0gICAgICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5FbmRzV2l0aDoKLSAgICAgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVuZHNXaXRoOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2NvbnRhaW5zVGV4dDoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkNvbnRhaW5zVGV4dDsKIAotICAgICAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuRXF1YWw6Ci0gICAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5FcXVhbDsKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLl9lbmRzV2l0aDoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVuZHNXaXRoOwogCi0gICAgICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5HcmVhdGVyVGhhbjoKLSAgICAgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2VxdWFsOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRXF1YWw7CiAKLSAgICAgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLkdyZWF0ZXJUaGFuT3JFcXVhbDoKLSAgICAgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuT3JFcXVhbDsKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLl9ncmVhdGVyVGhhbjoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuOwogCi0gICAgICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLk9wZXJhdG9ycy5MZXNzVGhhbjoKLSAgICAgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2dyZWF0ZXJUaGFuT3JFcXVhbDoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuT3JFcXVhbDsKIAotICAgICAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuTGVzc1RoYW5PckVxdWFsOgotICAgICAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGVzc1RoYW5PckVxdWFsOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2xlc3NUaGFuOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGVzc1RoYW47CiAKLSAgICAgICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLk5vdEJldHdlZW46Ci0gICAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RCZXR3ZWVuOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX2xlc3NUaGFuT3JFcXVhbDoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuT3JFcXVhbDsKIAotICAgICAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuTm90Q29udGFpbnM6Ci0gICAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluczsKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLl9ub3RCZXR3ZWVuOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90QmV0d2VlbjsKIAotICAgICAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuTm90RXF1YWw6Ci0gICAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RFcXVhbDsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLlVuZXhpc3RlbnRPcGVyYXRvclR5cGVBdHRyaWJ1dGUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIEdldEljb25TZXRUeXBlKFhtbE5vZGUgdG9wTm9kZSwgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQotICAgIHsKLSAgICAgICAgdmFyIG5vZGUgPSB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6aWNvblNldC9AaWNvblNldCIsIG5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICBpZiAobm9kZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHYgPSBub2RlLlZhbHVlOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5PcGVyYXRvcnMuX25vdENvbnRhaW5zOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90Q29udGFpbnM7CiAKLSAgICAgICAgICAgIGlmICh2WzBdID09ICczJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodlswXSA9PSAnNCcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZvdXJJY29uU2V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5GaXZlSWNvblNldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gR2V0IHRoZSAiY29sb3JTY2FsZSIgcnVsZSB0eXBlIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mICJjZnZvIiBhbmQgImNvbG9yIiBub2Rlcy4KLSAgICAvLy8gSWYgd2UgaGF2ZSBleGNhdGx5IDIgImNmdm8iIGFuZCAiY29sb3IiIGNoaWxkcywgdGhlbiB3ZSByZXR1cm4gInR3b0NvbG9yU2NhbGUiCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+VHdvQ29sb3JTY2FsZSBvciBUaHJlZUNvbG9yU2NhbGU8L3JldHVybnM+Ci0gICAgaW50ZXJuYWwgc3RhdGljIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIEdldENvbG9yU2NhbGVUeXBlKAotICAgICAgWG1sTm9kZSB0b3BOb2RlLAotICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQotICAgIHsKLSAgICAgIC8vIEdldCB0aGUgPGNmdm8+IG5vZGVzCi0gICAgICB2YXIgY2Z2b05vZGVzID0gdG9wTm9kZS5TZWxlY3ROb2RlcygKLSAgICAgICAgc3RyaW5nLkZvcm1hdCgKLSAgICAgICAgICAiezB9L3sxfSIsCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ29sb3JTY2FsZSwKLSAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5DZnZvKSwKLSAgICAgICAgbmFtZVNwYWNlTWFuYWdlcik7Ci0KLSAgICAgIC8vIEdldCB0aGUgPGNvbG9yPiBub2RlcwotICAgICAgdmFyIGNvbG9yTm9kZXMgPSB0b3BOb2RlLlNlbGVjdE5vZGVzKAotICAgICAgICBzdHJpbmcuRm9ybWF0KAotICAgICAgICAgICJ7MH0vezF9IiwKLSAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Db2xvclNjYWxlLAotICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNvbG9yKSwKLSAgICAgICAgbmFtZVNwYWNlTWFuYWdlcik7Ci0KLSAgICAgIC8vIFdlIGRldGVybWluZSBpZiBpdCBpcyAiVHdvQ29sb3JTY2FsZSIgb3IgIlRocmVlQ29sb3JTY2FsZSIgYnkgdGhlCi0gICAgICAvLyBudW1iZXIgb2YgPGNmdm8+IGFuZCA8Y29sb3I+IGluc2lkZSB0aGUgPGNvbG9yU2NhbGU+IG5vZGUKLSAgICAgIGlmICgoY2Z2b05vZGVzID09IG51bGwpIHx8IChjZnZvTm9kZXMuQ291bnQgPCAyKSB8fCAoY2Z2b05vZGVzLkNvdW50ID4gMykKLSAgICAgICAgfHwgKGNvbG9yTm9kZXMgPT0gbnVsbCkgfHwgKGNvbG9yTm9kZXMuQ291bnQgPCAyKSB8fCAoY29sb3JOb2Rlcy5Db3VudCA+IDMpCi0gICAgICAgIHx8IChjZnZvTm9kZXMuQ291bnQgIT0gY29sb3JOb2Rlcy5Db3VudCkpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLldyb25nTnVtYmVyQ2Z2b0NvbG9yTm9kZXMpOwotICAgICAgfQotCi0gICAgICAvLyBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcnVsZSB0eXBlIChUd29Db2xvclNjYWxlIG9yIFRocmVlQ29sb3JTY2FsZSkKLSAgICAgIHJldHVybiAoY2Z2b05vZGVzLkNvdW50ID09IDIpCi0gICAgICAgID8gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVHdvQ29sb3JTY2FsZQotICAgICAgICA6IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlQ29sb3JTY2FsZTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEdldCB0aGUgImFib3ZlQXZlcmFnZSIgcnVsZSB0eXBlIGFjY29yZGluZyB0byB0aGUgZm9sbHdvaW5nIGF0dHJpYnV0ZXM6Ci0gICAgLy8vICJBYm92ZUF2ZXJhZ2UiLCAiRXF1YWxBdmVyYWdlIiBhbmQgIlN0ZERldiIuCi0gICAgLy8vIAotICAgIC8vLyBAU3RkRGV2IGdyZWF0ZXIgdGhhbiAiMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBBYm92ZVN0ZERldgotICAgIC8vLyBAU3RkRGV2IGxlc3MgdGhhbiAiMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBCZWxvd1N0ZERldgotICAgIC8vLyBAQWJvdmVBdmVyYWdlID0gIjEiL251bGwgYW5kIEBFcXVhbEF2ZXJhZ2UgPSAiMCIvbnVsbCA9PSBBYm92ZUF2ZXJhZ2UKLSAgICAvLy8gQEFib3ZlQXZlcmFnZSA9ICIxIi9udWxsIGFuZCBARXF1YWxBdmVyYWdlID0gIjEiICAgICAgPT0gQWJvdmVPckVxdWFsQXZlcmFnZQotICAgIC8vLyBAQWJvdmVBdmVyYWdlID0gIjAiIGFuZCBARXF1YWxBdmVyYWdlID0gIjAiL251bGwgICAgICA9PSBCZWxvd0F2ZXJhZ2UKLSAgICAvLy8gQEFib3ZlQXZlcmFnZSA9ICIwIiBhbmQgQEVxdWFsQXZlcmFnZSA9ICIxIiAgICAgICAgICAgPT0gQmVsb3dPckVxdWFsQXZlcmFnZQotICAgIC8vLyAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmV0dXJucz5BYm92ZUF2ZXJhZ2UsIEFib3ZlT3JFcXVhbEF2ZXJhZ2UsIEJlbG93QXZlcmFnZSBvciBCZWxvd09yRXF1YWxBdmVyYWdlPC9yZXR1cm5zPgotICAgIGludGVybmFsIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBHZXRBYm92ZUF2ZXJhZ2VUeXBlKAotICAgICAgWG1sTm9kZSB0b3BOb2RlLAotICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQotICAgIHsKLSAgICAgIC8vIEdldCBAU3RkRGV2IGF0dHJpYnV0ZQotICAgICAgaW50PyBzdGREZXYgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5HZXRBdHRyaWJ1dGVJbnROdWxsYWJsZSgKLSAgICAgICAgdG9wTm9kZSwKLSAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQXR0cmlidXRlcy5TdGREZXYpOwotCi0gICAgICBpZiAoc3RkRGV2ID4gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gQFN0ZERldiA+ICIwIiAtLT4gQWJvdmVTdGREZXYKLSAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlU3RkRGV2OwotICAgICAgfQotCi0gICAgICBpZiAoc3RkRGV2IDwgMCkKLSAgICAgIHsKLSAgICAgICAgLy8gQFN0ZERldiA8ICIwIiAtLT4gQmVsb3dTdGREZXYKLSAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93U3RkRGV2OwotICAgICAgfQotCi0gICAgICAvLyBHZXQgQEFib3ZlQXZlcmFnZSBhdHRyaWJ1dGUKLSAgICAgIGJvb2w/IGlzQWJvdmVBdmVyYWdlID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdIZWxwZXIuR2V0QXR0cmlidXRlQm9vbE51bGxhYmxlKAotICAgICAgICB0b3BOb2RlLAotICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5BdHRyaWJ1dGVzLkFib3ZlQXZlcmFnZSk7Ci0KLSAgICAgIC8vIEdldCBARXF1YWxBdmVyYWdlIGF0dHJpYnV0ZQotICAgICAgYm9vbD8gaXNFcXVhbEF2ZXJhZ2UgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5HZXRBdHRyaWJ1dGVCb29sTnVsbGFibGUoCi0gICAgICAgIHRvcE5vZGUsCi0gICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuRXF1YWxBdmVyYWdlKTsKLQotICAgICAgaWYgKChpc0Fib3ZlQXZlcmFnZSA9PSBudWxsKSB8fCAoaXNBYm92ZUF2ZXJhZ2UgPT0gdHJ1ZSkpCi0gICAgICB7Ci0gICAgICAgIGlmIChpc0VxdWFsQXZlcmFnZSA9PSB0cnVlKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gQEFib3ZlQXZlcmFnZSA9ICIxIi9udWxsIGFuZCBARXF1YWxBdmVyYWdlID0gIjEiID09IEFib3ZlT3JFcXVhbEF2ZXJhZ2UKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVPckVxdWFsQXZlcmFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEBBYm92ZUF2ZXJhZ2UgPSAiMSIvbnVsbCBhbmQgQEVxdWFsQXZlcmFnZSA9ICIwIi9udWxsID09IEFib3ZlQXZlcmFnZQotICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVBdmVyYWdlOwotICAgICAgfQotCi0gICAgICBpZiAoaXNFcXVhbEF2ZXJhZ2UgPT0gdHJ1ZSkKLSAgICAgIHsKLSAgICAgICAgLy8gQEFib3ZlQXZlcmFnZSA9ICIwIiBhbmQgQEVxdWFsQXZlcmFnZSA9ICIxIiA9PSBCZWxvd09yRXF1YWxBdmVyYWdlCi0gICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd09yRXF1YWxBdmVyYWdlOwotICAgICAgfQotCi0gICAgICAvLyBAQWJvdmVBdmVyYWdlID0gIjAiIGFuZCBARXF1YWxBdmVyYWdlID0gIjAiL251bGwgPT0gQmVsb3dBdmVyYWdlCi0gICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dBdmVyYWdlOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gR2V0IHRoZSAidG9wMTAiIHJ1bGUgdHlwZSBhY2NvcmRpbmcgdG8gdGhlIGZvbGx3b2luZyBhdHRyaWJ1dGVzOgotICAgIC8vLyAiQm90dG9tIiBhbmQgIlBlcmNlbnQiCi0gICAgLy8vIAotICAgIC8vLyBAQm90dG9tID0gIjEiIGFuZCBAUGVyY2VudCA9ICIwIi9udWxsICAgICAgID09IEJvdHRvbQotICAgIC8vLyBAQm90dG9tID0gIjEiIGFuZCBAUGVyY2VudCA9ICIxIiAgICAgICAgICAgID09IEJvdHRvbVBlcmNlbnQKLSAgICAvLy8gQEJvdHRvbSA9ICIwIi9udWxsIGFuZCBAUGVyY2VudCA9ICIwIi9udWxsICA9PSBUb3AKLSAgICAvLy8gQEJvdHRvbSA9ICIwIi9udWxsIGFuZCBAUGVyY2VudCA9ICIxIiAgICAgICA9PSBUb3BQZXJjZW50Ci0gICAgLy8vIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZXR1cm5zPlRvcCwgVG9wUGVyY2VudCwgQm90dG9tIG9yIEJvdHRvbVBlcmNlbnQ8L3JldHVybnM+Ci0gICAgcHVibGljIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBHZXRUb3AxMFR5cGUoCi0gICAgICBYbWxOb2RlIHRvcE5vZGUsCi0gICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIpCi0gICAgewotICAgICAgLy8gR2V0IEBCb3R0b20gYXR0cmlidXRlCi0gICAgICBib29sPyBpc0JvdHRvbSA9IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSGVscGVyLkdldEF0dHJpYnV0ZUJvb2xOdWxsYWJsZSgKLSAgICAgICAgdG9wTm9kZSwKLSAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQXR0cmlidXRlcy5Cb3R0b20pOwotCi0gICAgICAvLyBHZXQgQFBlcmNlbnQgYXR0cmlidXRlCi0gICAgICBib29sPyBpc1BlcmNlbnQgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5HZXRBdHRyaWJ1dGVCb29sTnVsbGFibGUoCi0gICAgICAgIHRvcE5vZGUsCi0gICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuUGVyY2VudCk7Ci0KLSAgICAgIGlmIChpc0JvdHRvbSA9PSB0cnVlKQotICAgICAgewotICAgICAgICBpZiAoaXNQZXJjZW50ID09IHRydWUpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBAQm90dG9tID0gIjEiIGFuZCBAUGVyY2VudCA9ICIxIiA9PSBCb3R0b21QZXJjZW50Ci0gICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJvdHRvbVBlcmNlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBAQm90dG9tID0gIjEiIGFuZCBAUGVyY2VudCA9ICIwIi9udWxsID09IEJvdHRvbQotICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQm90dG9tOwotICAgICAgfQotCi0gICAgICBpZiAoaXNQZXJjZW50ID09IHRydWUpCi0gICAgICB7Ci0gICAgICAgIC8vIEBCb3R0b20gPSAiMCIvbnVsbCBhbmQgQFBlcmNlbnQgPSAiMSIgPT0gVG9wUGVyY2VudAotICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVG9wUGVyY2VudDsKLSAgICAgIH0KLQotICAgICAgLy8gQEJvdHRvbSA9ICIwIi9udWxsIGFuZCBAUGVyY2VudCA9ICIwIi9udWxsID09IFRvcAotICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvcDsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEdldCB0aGUgInRpbWVQZXJpb2QiIHJ1bGUgdHlwZSBhY2NvcmRpbmcgdG8gIlRpbWVQZXJpb2QiIGF0dHJpYnV0ZS4KLSAgICAvLy8gLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJldHVybnM+TGFzdDdEYXlzLCBMYXN0TW9udGggZXRjLjwvcmV0dXJucz4KLSAgICBwdWJsaWMgc3RhdGljIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIEdldFRpbWVQZXJpb2RUeXBlKAotICAgICAgWG1sTm9kZSB0b3BOb2RlLAotICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQotICAgIHsKLSAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlIHRpbWVQZXJpb2QgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkdldFR5cGVCeUF0dHJpYnV0ZSgKLSAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdIZWxwZXIuR2V0QXR0cmlidXRlU3RyaW5nKAotICAgICAgICAgIHRvcE5vZGUsCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQXR0cmlidXRlcy5UaW1lUGVyaW9kKSk7Ci0KLSAgICAgIHN3aXRjaCAodGltZVBlcmlvZCkKLSAgICAgIHsKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5MYXN0N0RheXM6Ci0gICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxhc3Q3RGF5czsKLQotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkxhc3RNb250aDoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdE1vbnRoOwotCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTGFzdFdlZWs6Ci0gICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxhc3RXZWVrOwotCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTmV4dE1vbnRoOgotICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5OZXh0TW9udGg7Ci0KLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5OZXh0V2VlazoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTmV4dFdlZWs7Ci0KLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5UaGlzTW9udGg6Ci0gICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRoaXNNb250aDsKLQotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRoaXNXZWVrOgotICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaGlzV2VlazsKLQotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRvZGF5OgotICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub2RheTsKLQotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRvbW9ycm93OgotICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub21vcnJvdzsKLQotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlllc3RlcmRheToKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuWWVzdGVyZGF5OwotICAgICAgfQotCi0gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAotICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuVW5leGlzdGVudFRpbWVQZXJpb2RUeXBlQXR0cmlidXRlKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0QXR0cmlidXRlQnlUeXBlKAotICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVBdmVyYWdlOgotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlT3JFcXVhbEF2ZXJhZ2U6Ci0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dBdmVyYWdlOgotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93T3JFcXVhbEF2ZXJhZ2U6Ci0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVTdGREZXY6Ci0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dTdGREZXY6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkFib3ZlQXZlcmFnZTsKLQotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJvdHRvbToKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Cb3R0b21QZXJjZW50OgotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvcDoKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub3BQZXJjZW50OgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5Ub3AxMDsKLQotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxhc3Q3RGF5czoKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MYXN0TW9udGg6Ci0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdFdlZWs6Ci0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTmV4dE1vbnRoOgotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5leHRXZWVrOgotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRoaXNNb250aDoKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaGlzV2VlazoKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub2RheToKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub21vcnJvdzoKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5ZZXN0ZXJkYXk6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLlRpbWVQZXJpb2Q7Ci0KLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZXR3ZWVuOgotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVxdWFsOgotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuOgotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuT3JFcXVhbDoKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MZXNzVGhhbjoKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MZXNzVGhhbk9yRXF1YWw6Ci0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90QmV0d2VlbjoKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RFcXVhbDoKLSAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuQ2VsbElzOwotCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0OgotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZvdXJJY29uU2V0OgotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZpdmVJY29uU2V0OgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5JY29uU2V0OwotCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVDb2xvclNjYWxlOgotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlR3b0NvbG9yU2NhbGU6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkNvbG9yU2NhbGU7Ci0KLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWdpbnNXaXRoOgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5CZWdpbnNXaXRoOwotCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNCbGFua3M6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkNvbnRhaW5zQmxhbmtzOwotCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNFcnJvcnM6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkNvbnRhaW5zRXJyb3JzOwotCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNUZXh0OgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5Db250YWluc1RleHQ7Ci0KLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5EdXBsaWNhdGVWYWx1ZXM6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkR1cGxpY2F0ZVZhbHVlczsKLQotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVuZHNXaXRoOgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5FbmRzV2l0aDsKLQotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkV4cHJlc3Npb246Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkV4cHJlc3Npb247Ci0KLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc0JsYW5rczoKLSAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuTm90Q29udGFpbnNCbGFua3M7Ci0KLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc0Vycm9yczoKLSAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuTm90Q29udGFpbnNFcnJvcnM7Ci0KLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc1RleHQ6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLk5vdENvbnRhaW5zVGV4dDsKLQotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlVuaXF1ZVZhbHVlczoKLSAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuVW5pcXVlVmFsdWVzOwotCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRGF0YUJhcjoKLSAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuRGF0YUJhcjsKLSAgICAgIH0KLQotICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLk1pc3NpbmdSdWxlVHlwZSk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBSZXR1cm4gY2Z2byDCpzE4LjMuMS4xMSBwYXJlbnQgYWNjb3JkaW5nIHRvIHRoZSBydWxlIHR5cGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldENmdm9QYXJlbnRQYXRoQnlUeXBlKAotICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKHR5cGUpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVHdvQ29sb3JTY2FsZToKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUNvbG9yU2NhbGU6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNvbG9yU2NhbGU7Ci0KLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQ6Ci0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQ6Ci0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRml2ZUljb25TZXQ6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLkljb25TZXQ7Ci0KLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5EYXRhQmFyOgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5EYXRhQmFyOwotICAgICAgfQotCi0gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKAotICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuTWlzc2luZ1J1bGVUeXBlKTsKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuT3BlcmF0b3JzLl9ub3RFcXVhbDoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdEVxdWFsOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5fdW5leGlzdGVudE9wZXJhdG9yVHlwZUF0dHJpYnV0ZSk7CiAgICAgfQogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCisgIHByaXZhdGUgc3RhdGljIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIEdldEljb25TZXRUeXBlKAorICAgICAgWG1sTm9kZSB0b3BOb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKSB7CisgICAgdmFyIG5vZGUgPSB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6aWNvblNldC9AaWNvblNldCIsIG5hbWVTcGFjZU1hbmFnZXIpOworICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQ7CisgICAgfQorICAgIHZhciB2ID0gbm9kZS5WYWx1ZTsKKworICAgIGlmICh2WzBdID09ICczJykgeworICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlSWNvblNldDsKKyAgICB9CisgICAgaWYgKHZbMF0gPT0gJzQnKSB7CisgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQ7CisgICAgfQorICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5GaXZlSWNvblNldDsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldCB0aGUgImNvbG9yU2NhbGUiIHJ1bGUgdHlwZSBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZiAiY2Z2byIgYW5kICJjb2xvciIgbm9kZXMuCisgIC8vLyBJZiB3ZSBoYXZlIGV4Y2F0bHkgMiAiY2Z2byIgYW5kICJjb2xvciIgY2hpbGRzLCB0aGVuIHdlIHJldHVybiAidHdvQ29sb3JTY2FsZSIKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPlR3b0NvbG9yU2NhbGUgb3IgVGhyZWVDb2xvclNjYWxlPC9yZXR1cm5zPgorICBpbnRlcm5hbCBzdGF0aWMgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgR2V0Q29sb3JTY2FsZVR5cGUoCisgICAgICBYbWxOb2RlIHRvcE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIpIHsKKyAgICAvLyBHZXQgdGhlIDxjZnZvPiBub2RlcworICAgIHZhciBjZnZvTm9kZXMgPSB0b3BOb2RlLlNlbGVjdE5vZGVzKAorICAgICAgICBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgInswfS97MX0iLAorICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX2NvbG9yU2NhbGUsCisgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fY2Z2byksCisgICAgICAgIG5hbWVTcGFjZU1hbmFnZXIpOworCisgICAgLy8gR2V0IHRoZSA8Y29sb3I+IG5vZGVzCisgICAgdmFyIGNvbG9yTm9kZXMgPSB0b3BOb2RlLlNlbGVjdE5vZGVzKAorICAgICAgICBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgInswfS97MX0iLAorICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX2NvbG9yU2NhbGUsCisgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fY29sb3IpLAorICAgICAgICBuYW1lU3BhY2VNYW5hZ2VyKTsKKworICAgIC8vIFdlIGRldGVybWluZSBpZiBpdCBpcyAiVHdvQ29sb3JTY2FsZSIgb3IgIlRocmVlQ29sb3JTY2FsZSIgYnkgdGhlCisgICAgLy8gbnVtYmVyIG9mIDxjZnZvPiBhbmQgPGNvbG9yPiBpbnNpZGUgdGhlIDxjb2xvclNjYWxlPiBub2RlCisgICAgaWYgKChjZnZvTm9kZXMgPT0gbnVsbCkKKyAgICAgICAgfHwgKGNmdm9Ob2Rlcy5Db3VudCA8IDIpCisgICAgICAgIHx8IChjZnZvTm9kZXMuQ291bnQgPiAzKQorICAgICAgICB8fCAoY29sb3JOb2RlcyA9PSBudWxsKQorICAgICAgICB8fCAoY29sb3JOb2Rlcy5Db3VudCA8IDIpCisgICAgICAgIHx8IChjb2xvck5vZGVzLkNvdW50ID4gMykKKyAgICAgICAgfHwgKGNmdm9Ob2Rlcy5Db3VudCAhPSBjb2xvck5vZGVzLkNvdW50KSkgeworICAgICAgdGhyb3cgbmV3KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5fd3JvbmdOdW1iZXJDZnZvQ29sb3JOb2Rlcyk7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHJ1bGUgdHlwZSAoVHdvQ29sb3JTY2FsZSBvciBUaHJlZUNvbG9yU2NhbGUpCisgICAgcmV0dXJuIChjZnZvTm9kZXMuQ291bnQgPT0gMikKKyAgICAgICAgPyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ud29Db2xvclNjYWxlCisgICAgICAgIDogZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVDb2xvclNjYWxlOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0IHRoZSAiYWJvdmVBdmVyYWdlIiBydWxlIHR5cGUgYWNjb3JkaW5nIHRvIHRoZSBmb2xsd29pbmcgYXR0cmlidXRlczoKKyAgLy8vICJBYm92ZUF2ZXJhZ2UiLCAiRXF1YWxBdmVyYWdlIiBhbmQgIlN0ZERldiIuCisgIC8vLworICAvLy8gQFN0ZERldiBncmVhdGVyIHRoYW4gIjAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gQWJvdmVTdGREZXYKKyAgLy8vIEBTdGREZXYgbGVzcyB0aGFuICIwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEJlbG93U3RkRGV2CisgIC8vLyBAQWJvdmVBdmVyYWdlID0gIjEiL251bGwgYW5kIEBFcXVhbEF2ZXJhZ2UgPSAiMCIvbnVsbCA9PSBBYm92ZUF2ZXJhZ2UKKyAgLy8vIEBBYm92ZUF2ZXJhZ2UgPSAiMSIvbnVsbCBhbmQgQEVxdWFsQXZlcmFnZSA9ICIxIiAgICAgID09IEFib3ZlT3JFcXVhbEF2ZXJhZ2UKKyAgLy8vIEBBYm92ZUF2ZXJhZ2UgPSAiMCIgYW5kIEBFcXVhbEF2ZXJhZ2UgPSAiMCIvbnVsbCAgICAgID09IEJlbG93QXZlcmFnZQorICAvLy8gQEFib3ZlQXZlcmFnZSA9ICIwIiBhbmQgQEVxdWFsQXZlcmFnZSA9ICIxIiAgICAgICAgICAgPT0gQmVsb3dPckVxdWFsQXZlcmFnZQorICAvLy8gLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPkFib3ZlQXZlcmFnZSwgQWJvdmVPckVxdWFsQXZlcmFnZSwgQmVsb3dBdmVyYWdlIG9yIEJlbG93T3JFcXVhbEF2ZXJhZ2U8L3JldHVybnM+CisgIGludGVybmFsIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBHZXRBYm92ZUF2ZXJhZ2VUeXBlKAorICAgICAgWG1sTm9kZSB0b3BOb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKSB7CisgICAgLy8gR2V0IEBTdGREZXYgYXR0cmlidXRlCisgICAgaW50PyBzdGREZXYgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5HZXRBdHRyaWJ1dGVJbnROdWxsYWJsZSgKKyAgICAgICAgdG9wTm9kZSwKKyAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQXR0cmlidXRlcy5fc3RkRGV2KTsKKworICAgIGlmIChzdGREZXYgPiAwKSB7CisgICAgICAvLyBAU3RkRGV2ID4gIjAiIC0tPiBBYm92ZVN0ZERldgorICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlU3RkRGV2OworICAgIH0KKworICAgIGlmIChzdGREZXYgPCAwKSB7CisgICAgICAvLyBAU3RkRGV2IDwgIjAiIC0tPiBCZWxvd1N0ZERldgorICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93U3RkRGV2OworICAgIH0KKworICAgIC8vIEdldCBAQWJvdmVBdmVyYWdlIGF0dHJpYnV0ZQorICAgIGJvb2w/IGlzQWJvdmVBdmVyYWdlID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdIZWxwZXIuR2V0QXR0cmlidXRlQm9vbE51bGxhYmxlKAorICAgICAgICB0b3BOb2RlLAorICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5BdHRyaWJ1dGVzLl9hYm92ZUF2ZXJhZ2UpOworCisgICAgLy8gR2V0IEBFcXVhbEF2ZXJhZ2UgYXR0cmlidXRlCisgICAgYm9vbD8gaXNFcXVhbEF2ZXJhZ2UgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5HZXRBdHRyaWJ1dGVCb29sTnVsbGFibGUoCisgICAgICAgIHRvcE5vZGUsCisgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuX2VxdWFsQXZlcmFnZSk7CisKKyAgICBpZiAoKGlzQWJvdmVBdmVyYWdlID09IG51bGwpIHx8IChpc0Fib3ZlQXZlcmFnZSA9PSB0cnVlKSkgeworICAgICAgaWYgKGlzRXF1YWxBdmVyYWdlID09IHRydWUpIHsKKyAgICAgICAgLy8gQEFib3ZlQXZlcmFnZSA9ICIxIi9udWxsIGFuZCBARXF1YWxBdmVyYWdlID0gIjEiID09IEFib3ZlT3JFcXVhbEF2ZXJhZ2UKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlT3JFcXVhbEF2ZXJhZ2U7CisgICAgICB9CisKKyAgICAgIC8vIEBBYm92ZUF2ZXJhZ2UgPSAiMSIvbnVsbCBhbmQgQEVxdWFsQXZlcmFnZSA9ICIwIi9udWxsID09IEFib3ZlQXZlcmFnZQorICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlQXZlcmFnZTsKKyAgICB9CisKKyAgICBpZiAoaXNFcXVhbEF2ZXJhZ2UgPT0gdHJ1ZSkgeworICAgICAgLy8gQEFib3ZlQXZlcmFnZSA9ICIwIiBhbmQgQEVxdWFsQXZlcmFnZSA9ICIxIiA9PSBCZWxvd09yRXF1YWxBdmVyYWdlCisgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dPckVxdWFsQXZlcmFnZTsKKyAgICB9CisKKyAgICAvLyBAQWJvdmVBdmVyYWdlID0gIjAiIGFuZCBARXF1YWxBdmVyYWdlID0gIjAiL251bGwgPT0gQmVsb3dBdmVyYWdlCisgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93QXZlcmFnZTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldCB0aGUgInRvcDEwIiBydWxlIHR5cGUgYWNjb3JkaW5nIHRvIHRoZSBmb2xsd29pbmcgYXR0cmlidXRlczoKKyAgLy8vICJCb3R0b20iIGFuZCAiUGVyY2VudCIKKyAgLy8vCisgIC8vLyBAQm90dG9tID0gIjEiIGFuZCBAUGVyY2VudCA9ICIwIi9udWxsICAgICAgID09IEJvdHRvbQorICAvLy8gQEJvdHRvbSA9ICIxIiBhbmQgQFBlcmNlbnQgPSAiMSIgICAgICAgICAgICA9PSBCb3R0b21QZXJjZW50CisgIC8vLyBAQm90dG9tID0gIjAiL251bGwgYW5kIEBQZXJjZW50ID0gIjAiL251bGwgID09IFRvcAorICAvLy8gQEJvdHRvbSA9ICIwIi9udWxsIGFuZCBAUGVyY2VudCA9ICIxIiAgICAgICA9PSBUb3BQZXJjZW50CisgIC8vLyAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+VG9wLCBUb3BQZXJjZW50LCBCb3R0b20gb3IgQm90dG9tUGVyY2VudDwvcmV0dXJucz4KKyAgcHVibGljIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBHZXRUb3AxMFR5cGUoCisgICAgICBYbWxOb2RlIHRvcE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIpIHsKKyAgICAvLyBHZXQgQEJvdHRvbSBhdHRyaWJ1dGUKKyAgICBib29sPyBpc0JvdHRvbSA9IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSGVscGVyLkdldEF0dHJpYnV0ZUJvb2xOdWxsYWJsZSgKKyAgICAgICAgdG9wTm9kZSwKKyAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQXR0cmlidXRlcy5fYm90dG9tKTsKKworICAgIC8vIEdldCBAUGVyY2VudCBhdHRyaWJ1dGUKKyAgICBib29sPyBpc1BlcmNlbnQgPSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0hlbHBlci5HZXRBdHRyaWJ1dGVCb29sTnVsbGFibGUoCisgICAgICAgIHRvcE5vZGUsCisgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuX3BlcmNlbnQpOworCisgICAgaWYgKGlzQm90dG9tID09IHRydWUpIHsKKyAgICAgIGlmIChpc1BlcmNlbnQgPT0gdHJ1ZSkgeworICAgICAgICAvLyBAQm90dG9tID0gIjEiIGFuZCBAUGVyY2VudCA9ICIxIiA9PSBCb3R0b21QZXJjZW50CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Cb3R0b21QZXJjZW50OworICAgICAgfQorCisgICAgICAvLyBAQm90dG9tID0gIjEiIGFuZCBAUGVyY2VudCA9ICIwIi9udWxsID09IEJvdHRvbQorICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJvdHRvbTsKKyAgICB9CisKKyAgICBpZiAoaXNQZXJjZW50ID09IHRydWUpIHsKKyAgICAgIC8vIEBCb3R0b20gPSAiMCIvbnVsbCBhbmQgQFBlcmNlbnQgPSAiMSIgPT0gVG9wUGVyY2VudAorICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvcFBlcmNlbnQ7CisgICAgfQorCisgICAgLy8gQEJvdHRvbSA9ICIwIi9udWxsIGFuZCBAUGVyY2VudCA9ICIwIi9udWxsID09IFRvcAorICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub3A7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXQgdGhlICJ0aW1lUGVyaW9kIiBydWxlIHR5cGUgYWNjb3JkaW5nIHRvICJUaW1lUGVyaW9kIiBhdHRyaWJ1dGUuCisgIC8vLyAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+TGFzdDdEYXlzLCBMYXN0TW9udGggZXRjLjwvcmV0dXJucz4KKyAgcHVibGljIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBHZXRUaW1lUGVyaW9kVHlwZSgKKyAgICAgIFhtbE5vZGUgdG9wTm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlcikgeworICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlIHRpbWVQZXJpb2QgPQorICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkdldFR5cGVCeUF0dHJpYnV0ZSgKKyAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSGVscGVyLkdldEF0dHJpYnV0ZVN0cmluZygKKyAgICAgICAgICAgICAgICB0b3BOb2RlLAorICAgICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkF0dHJpYnV0ZXMuX3RpbWVQZXJpb2QpKTsKKworICAgIHN3aXRjaCAodGltZVBlcmlvZCkgeworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5MYXN0N0RheXM6CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MYXN0N0RheXM7CisKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTGFzdE1vbnRoOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdE1vbnRoOworCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkxhc3RXZWVrOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdFdlZWs7CisKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTmV4dE1vbnRoOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTmV4dE1vbnRoOworCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLk5leHRXZWVrOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTmV4dFdlZWs7CisKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVGhpc01vbnRoOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhpc01vbnRoOworCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRoaXNXZWVrOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhpc1dlZWs7CisKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVG9kYXk6CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub2RheTsKKworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5Ub21vcnJvdzoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvbW9ycm93OworCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlllc3RlcmRheToKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlllc3RlcmRheTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLl91bmV4aXN0ZW50VGltZVBlcmlvZFR5cGVBdHRyaWJ1dGUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRBdHRyaWJ1dGVCeVR5cGUoZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5BYm92ZUF2ZXJhZ2U6CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlT3JFcXVhbEF2ZXJhZ2U6CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93QXZlcmFnZToKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dPckVxdWFsQXZlcmFnZToKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVTdGREZXY6CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93U3RkRGV2OgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuX2Fib3ZlQXZlcmFnZTsKKworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Cb3R0b206CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJvdHRvbVBlcmNlbnQ6CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvcDoKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVG9wUGVyY2VudDoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLl90b3AxMDsKKworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MYXN0N0RheXM6CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxhc3RNb250aDoKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdFdlZWs6CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5leHRNb250aDoKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTmV4dFdlZWs6CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRoaXNNb250aDoKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhpc1dlZWs6CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvZGF5OgorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub21vcnJvdzoKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuWWVzdGVyZGF5OgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuX3RpbWVQZXJpb2Q7CisKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmV0d2VlbjoKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRXF1YWw6CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuOgorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5HcmVhdGVyVGhhbk9yRXF1YWw6CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuOgorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MZXNzVGhhbk9yRXF1YWw6CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdEJldHdlZW46CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdEVxdWFsOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuX2NlbGxJczsKKworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQ6CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZvdXJJY29uU2V0OgorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5GaXZlSWNvblNldDoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLl9pY29uU2V0OworCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlQ29sb3JTY2FsZToKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVHdvQ29sb3JTY2FsZToKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLl9jb2xvclNjYWxlOworCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlZ2luc1dpdGg6CisgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5fYmVnaW5zV2l0aDsKKworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Db250YWluc0JsYW5rczoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLl9jb250YWluc0JsYW5rczsKKworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Db250YWluc0Vycm9yczoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLl9jb250YWluc0Vycm9yczsKKworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Db250YWluc1RleHQ6CisgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5fY29udGFpbnNUZXh0OworCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkR1cGxpY2F0ZVZhbHVlczoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLl9kdXBsaWNhdGVWYWx1ZXM7CisKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRW5kc1dpdGg6CisgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5fZW5kc1dpdGg7CisKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRXhwcmVzc2lvbjoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLl9leHByZXNzaW9uOworCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zQmxhbmtzOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuX25vdENvbnRhaW5zQmxhbmtzOworCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zRXJyb3JzOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuX25vdENvbnRhaW5zRXJyb3JzOworCisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zVGV4dDoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlJ1bGVUeXBlLl9ub3RDb250YWluc1RleHQ7CisKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVW5pcXVlVmFsdWVzOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuX3VuaXF1ZVZhbHVlczsKKworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5EYXRhQmFyOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuX2RhdGFCYXI7CisgICAgfQorCisgICAgdGhyb3cgbmV3KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5fbWlzc2luZ1J1bGVUeXBlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybiBjZnZvIMKnMTguMy4xLjExIHBhcmVudCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGUgdHlwZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldENmdm9QYXJlbnRQYXRoQnlUeXBlKGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVHdvQ29sb3JTY2FsZToKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVDb2xvclNjYWxlOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX2NvbG9yU2NhbGU7CisKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0OgorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Gb3VySWNvblNldDoKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRml2ZUljb25TZXQ6CisgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5SdWxlVHlwZS5faWNvblNldDsKKworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5EYXRhQmFyOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUnVsZVR5cGUuX2RhdGFCYXI7CisgICAgfQorCisgICAgdGhyb3cgbmV3KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5fbWlzc2luZ1J1bGVUeXBlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLmNzCmluZGV4IDc1ZDhhYjIuLjIwNTFlN2IgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDEyMSArMTMsMTA5IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMTcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKLQkvLy8gPHN1bW1hcnk+Ci0gIC8vLyBGdW5jdGlvbnMgcmVsYXRlZCB0byB0aGUgPHNlZSBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlIi8+Ci0JLy8vIDwvc3VtbWFyeT4KLSAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUKLQl7Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIAotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+Ci0JCS8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0JCXB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEF0dHJpYnV0ZUJ5VHlwZSgKLQkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlIHR5cGUpCi0JCXsKLQkJCXN3aXRjaCAodHlwZSkKLQkJCXsKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5MYXN0N0RheXM6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlRpbWVQZXJpb2RzLkxhc3Q3RGF5czsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkxhc3RNb250aDoKLSAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuTGFzdE1vbnRoOworLy8vIDxzdW1tYXJ5PgorLy8vIEZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZSA8c2VlIGNyZWY9IkV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUiLz4KKy8vLyA8L3N1bW1hcnk+CitpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0QXR0cmlidXRlQnlUeXBlKGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlIHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTGFzdDdEYXlzOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuX2xhc3Q3RGF5czsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkxhc3RXZWVrOgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5MYXN0V2VlazsKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTGFzdE1vbnRoOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuX2xhc3RNb250aDsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLk5leHRNb250aDoKLSAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuTmV4dE1vbnRoOworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5MYXN0V2VlazoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlRpbWVQZXJpb2RzLl9sYXN0V2VlazsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLk5leHRXZWVrOgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5OZXh0V2VlazsKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTmV4dE1vbnRoOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuX25leHRNb250aDsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRoaXNNb250aDoKLSAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuVGhpc01vbnRoOworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5OZXh0V2VlazoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlRpbWVQZXJpb2RzLl9uZXh0V2VlazsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRoaXNXZWVrOgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5UaGlzV2VlazsKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVGhpc01vbnRoOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuX3RoaXNNb250aDsKIAotICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRvZGF5OgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5Ub2RheTsKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVGhpc1dlZWs6CisgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5fdGhpc1dlZWs7CiAKLSAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5Ub21vcnJvdzoKLSAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuVG9tb3Jyb3c7CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRvZGF5OgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuX3RvZGF5OwogCi0gICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuWWVzdGVyZGF5OgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5ZZXN0ZXJkYXk7Ci0JCQl9CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRvbW9ycm93OgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuX3RvbW9ycm93OwogCi0JCQlyZXR1cm4gc3RyaW5nLkVtcHR5OwotCQl9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgc3RhdGljIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlIEdldFR5cGVCeUF0dHJpYnV0ZSgKLSAgICAgIHN0cmluZyBhdHRyaWJ1dGUpCi0gICAgewotICAgICAgc3dpdGNoIChhdHRyaWJ1dGUpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuTGFzdDdEYXlzOgotICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5MYXN0N0RheXM7Ci0KLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5MYXN0TW9udGg6Ci0gICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkxhc3RNb250aDsKLQotICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlRpbWVQZXJpb2RzLkxhc3RXZWVrOgotICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5MYXN0V2VlazsKLQotICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlRpbWVQZXJpb2RzLk5leHRNb250aDoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTmV4dE1vbnRoOwotCi0gICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuTmV4dFdlZWs6Ci0gICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLk5leHRXZWVrOwotCi0gICAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuVGhpc01vbnRoOgotICAgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5UaGlzTW9udGg7Ci0KLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5UaGlzV2VlazoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVGhpc1dlZWs7Ci0KLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5Ub2RheToKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVG9kYXk7Ci0KLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5Ub21vcnJvdzoKLSAgICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVG9tb3Jyb3c7Ci0KLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5ZZXN0ZXJkYXk6Ci0gICAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlllc3RlcmRheTsKLSAgICAgIH0KLQotICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigKLSAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLlVuZXhpc3RlbnRUaW1lUGVyaW9kVHlwZUF0dHJpYnV0ZSk7CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlllc3RlcmRheToKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlRpbWVQZXJpb2RzLl95ZXN0ZXJkYXk7CiAgICAgfQorCisgICAgcmV0dXJuIHN0cmluZy5FbXB0eTsKICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImF0dHJpYnV0ZSI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIHN0YXRpYyBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZSBHZXRUeXBlQnlBdHRyaWJ1dGUoc3RyaW5nIGF0dHJpYnV0ZSkgeworICAgIHN3aXRjaCAoYXR0cmlidXRlKSB7CisgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlRpbWVQZXJpb2RzLl9sYXN0N0RheXM6CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5MYXN0N0RheXM7CisKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuX2xhc3RNb250aDoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkxhc3RNb250aDsKKworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5fbGFzdFdlZWs6CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5MYXN0V2VlazsKKworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5UaW1lUGVyaW9kcy5fbmV4dE1vbnRoOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTmV4dE1vbnRoOworCisgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlRpbWVQZXJpb2RzLl9uZXh0V2VlazoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLk5leHRXZWVrOworCisgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlRpbWVQZXJpb2RzLl90aGlzTW9udGg6CisgICAgICAgIHJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5UaGlzTW9udGg7CisKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuX3RoaXNXZWVrOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVGhpc1dlZWs7CisKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuX3RvZGF5OgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVG9kYXk7CisKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuX3RvbW9ycm93OgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVG9tb3Jyb3c7CisKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuVGltZVBlcmlvZHMuX3llc3RlcmRheToKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlllc3RlcmRheTsKKyAgICB9CisKKyAgICB0aHJvdyBuZXcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLl91bmV4aXN0ZW50VGltZVBlcmlvZFR5cGVBdHRyaWJ1dGUpOworICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5jcwppbmRleCAyNjI4NDg3Li45ZDI4NjQ1IDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuY3MKQEAgLTEzLDIxMCArMTMsMTg4IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICBDaGFuZ2UJCQkJCQkgICAgICAgICAgICAgICAgICBEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nIEFkYXB0aW9uICAgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uWG1sOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIEZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZSA8c2VlIGNyZWY9IkV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIi8+Ci0JLy8vIDwvc3VtbWFyeT4KLQlpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUKLQl7Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIEdldCB0aGUgc2VxdWVuY2lhbCBvcmRlciBvZiBhIGNmdm8vY29sb3IgYnkgaXRzIHBvc2l0aW9uLgotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InBvc2l0aW9uIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJ1bGVUeXBlIj48L3BhcmFtPgotCQkvLy8gPHJldHVybnM+MSwgMiBvciAzPC9yZXR1cm5zPgotCQlpbnRlcm5hbCBzdGF0aWMgaW50IEdldE9yZGVyQnlQb3NpdGlvbigKLQkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24gcG9zaXRpb24sCi0JCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBydWxlVHlwZSkKLQkJewotCQkJc3dpdGNoIChwb3NpdGlvbikKLQkJCXsKLQkJCQljYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24uTG93OgotCQkJCQlyZXR1cm4gMTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKIAotCQkJCWNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RQb3NpdGlvbi5NaWRkbGU6Ci0JCQkJCXJldHVybiAyOworLy8vIDxzdW1tYXJ5PgorLy8vIEZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZSA8c2VlIGNyZWY9IkV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIi8+CisvLy8gPC9zdW1tYXJ5PgoraW50ZXJuYWwgc3RhdGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0IHRoZSBzZXF1ZW5jaWFsIG9yZGVyIG9mIGEgY2Z2by9jb2xvciBieSBpdHMgcG9zaXRpb24uCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icG9zaXRpb24iPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icnVsZVR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz4xLCAyIG9yIDM8L3JldHVybnM+CisgIGludGVybmFsIHN0YXRpYyBpbnQgR2V0T3JkZXJCeVBvc2l0aW9uKAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RQb3NpdGlvbiBwb3NpdGlvbiwKKyAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHJ1bGVUeXBlKSB7CisgICAgc3dpdGNoIChwb3NpdGlvbikgeworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFBvc2l0aW9uLkxvdzoKKyAgICAgICAgcmV0dXJuIDE7CiAKLQkJCQljYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24uSGlnaDoKLQkJCQkJLy8gQ2hlY2sgaWYgdGhlIHJ1bGUgdHlwZSBpcyBUd29Db2xvclNjYWxlLgotCQkJCQlpZiAocnVsZVR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVHdvQ29sb3JTY2FsZSkKLQkJCQkJewotCQkJCQkJLy8gVGhlcmUgYXJlIG9ubHkgIkxvdyIgYW5kICJIaWdoIi4gU28gIkhpZ2giIGlzIHRoZSBzZWNvbmQKLQkJCQkJCXJldHVybiAyOwotCQkJCQl9CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24uTWlkZGxlOgorICAgICAgICByZXR1cm4gMjsKIAotCQkJCQkvLyBUaGVyZSBhcmUgIkxvdyIsICJNaWRkbGUiIGFuZCAiSGlnaCIuIFNvICJIaWdoIiBpcyB0aGUgdGhpcmQKLQkJCQkJcmV0dXJuIDM7Ci0JCQl9CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24uSGlnaDoKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJ1bGUgdHlwZSBpcyBUd29Db2xvclNjYWxlLgorICAgICAgICBpZiAocnVsZVR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVHdvQ29sb3JTY2FsZSkgeworICAgICAgICAgIC8vIFRoZXJlIGFyZSBvbmx5ICJMb3ciIGFuZCAiSGlnaCIuIFNvICJIaWdoIiBpcyB0aGUgc2Vjb25kCisgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KIAotCQkJcmV0dXJuIDA7Ci0JCX0KKyAgICAgICAgLy8gVGhlcmUgYXJlICJMb3ciLCAiTWlkZGxlIiBhbmQgIkhpZ2giLiBTbyAiSGlnaCIgaXMgdGhlIHRoaXJkCisgICAgICAgIHJldHVybiAzOworICAgIH0KIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBHZXQgdGhlIENGVk8gdHlwZSBieSBpdHMgQHR5cGUgYXR0cmlidXRlCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iYXR0cmlidXRlIj48L3BhcmFtPgotCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotCQlwdWJsaWMgc3RhdGljIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZSBHZXRUeXBlQnlBdHRyYml1dGUoCi0JCQlzdHJpbmcgYXR0cmlidXRlKQotCQl7Ci0JCQlzd2l0Y2ggKGF0dHJpYnV0ZSkKLQkJCXsKLQkJCQljYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLk1pbjoKLQkJCQkJcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5NaW47CisgICAgcmV0dXJuIDA7CisgIH0KIAotICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLk1heDoKLQkJCQkJcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5NYXg7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldCB0aGUgQ0ZWTyB0eXBlIGJ5IGl0cyBAdHlwZSBhdHRyaWJ1dGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhdHRyaWJ1dGUiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlIEdldFR5cGVCeUF0dHJiaXV0ZShzdHJpbmcgYXR0cmlidXRlKSB7CisgICAgc3dpdGNoIChhdHRyaWJ1dGUpIHsKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQ2Z2b1R5cGUuX21pbjoKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5NaW47CiAKLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5DZnZvVHlwZS5OdW06Ci0JCQkJCXJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTnVtOworICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5DZnZvVHlwZS5fbWF4OgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1heDsKIAotICAgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLkZvcm11bGE6Ci0JCQkJCXJldHVybiBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuRm9ybXVsYTsKKyAgICAgIGNhc2UgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQ2Z2b1R5cGUuX251bToKKyAgICAgICAgcmV0dXJuIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5OdW07CiAKLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5DZnZvVHlwZS5QZXJjZW50OgotCQkJCQlyZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnQ7CisgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLl9mb3JtdWxhOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLkZvcm11bGE7CiAKLSAgICAgICAgY2FzZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5DZnZvVHlwZS5QZXJjZW50aWxlOgotCQkJCQlyZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnRpbGU7Ci0JCQl9CisgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLl9wZXJjZW50OgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnQ7CiAKLQkJCXRocm93IG5ldyBFeGNlcHRpb24oCi0gICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5VbmV4aXN0ZW50Q2Z2b1R5cGVBdHRyaWJ1dGUpOwotCQl9CisgICAgICBjYXNlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLl9wZXJjZW50aWxlOgorICAgICAgICByZXR1cm4gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnRpbGU7CisgICAgfQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIAotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InBvc2l0aW9uIj48L3BhcmFtPgotCQkvLy88cGFyYW0gbmFtZT0icnVsZVR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idG9wTm9kZSI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJuYW1lU3BhY2VNYW5hZ2VyIj48L3BhcmFtPgotCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotCQlwdWJsaWMgc3RhdGljIFhtbE5vZGUgR2V0Q2Z2b05vZGVCeVBvc2l0aW9uKAotCQkJZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RQb3NpdGlvbiBwb3NpdGlvbiwKLQkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHJ1bGVUeXBlLAotCQkJWG1sTm9kZSB0b3BOb2RlLAotCQkJWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQotCQl7Ci0JCQkvLyBHZXQgdGhlIGNvcnJlc3BvbmRpbmcgPGNmdm8+IG5vZGUgKGJ5IHRoZSBwb3NpdGlvbikKLQkJCXZhciBub2RlID0gdG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKAotCQkJCXN0cmluZy5Gb3JtYXQoCi0JCQkJCSJ7MH1bcG9zaXRpb24oKT17MX1dIiwKLQkJCQkvLyB7MH0KLQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ2Z2bywKLQkJCQkvLyB7MX0KLQkJCQkJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuR2V0T3JkZXJCeVBvc2l0aW9uKHBvc2l0aW9uLCBydWxlVHlwZSkpLAotCQkJCW5hbWVTcGFjZU1hbmFnZXIpOworICAgIHRocm93IG5ldyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuX3VuZXhpc3RlbnRDZnZvVHlwZUF0dHJpYnV0ZSk7CisgIH0KIAotCQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKAotICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkVycm9ycy5NaXNzaW5nQ2Z2b05vZGUpOwotCQkJfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InBvc2l0aW9uIj48L3BhcmFtPgorICAvLy88cGFyYW0gbmFtZT0icnVsZVR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idG9wTm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lU3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgc3RhdGljIFhtbE5vZGUgR2V0Q2Z2b05vZGVCeVBvc2l0aW9uKAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RQb3NpdGlvbiBwb3NpdGlvbiwKKyAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHJ1bGVUeXBlLAorICAgICAgWG1sTm9kZSB0b3BOb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKSB7CisgICAgLy8gR2V0IHRoZSBjb3JyZXNwb25kaW5nIDxjZnZvPiBub2RlIChieSB0aGUgcG9zaXRpb24pCisgICAgdmFyIG5vZGUgPSB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoCisgICAgICAgIHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAiezB9W3Bvc2l0aW9uKCk9ezF9XSIsCisgICAgICAgICAgICAvLyB7MH0KKyAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9jZnZvLAorICAgICAgICAgICAgLy8gezF9CisgICAgICAgICAgICBHZXRPcmRlckJ5UG9zaXRpb24ocG9zaXRpb24sIHJ1bGVUeXBlKSksCisgICAgICAgIG5hbWVTcGFjZU1hbmFnZXIpOwogCi0JCQlyZXR1cm4gbm9kZTsKLQkJfQorICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5FcnJvcnMuX21pc3NpbmdDZnZvTm9kZSk7CisgICAgfQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIAotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+Ci0JCS8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0JCXB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEF0dHJpYnV0ZUJ5VHlwZSgKLQkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZSB0eXBlKQotCQl7Ci0JCQlzd2l0Y2ggKHR5cGUpCi0JCQl7Ci0JCQkJY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWluOgotCQkJCQlyZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQ2Z2b1R5cGUuTWluOworICAgIHJldHVybiBub2RlOworICB9CiAKLQkJCQljYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5NYXg6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLk1heDsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRBdHRyaWJ1dGVCeVR5cGUoZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlIHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1pbjoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLl9taW47CiAKLQkJCQljYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5OdW06Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLk51bTsKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1heDoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLl9tYXg7CiAKLQkJCQljYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5Gb3JtdWxhOgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5DZnZvVHlwZS5Gb3JtdWxhOworICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTnVtOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQ2Z2b1R5cGUuX251bTsKIAotCQkJCWNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnQ6Ci0gICAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLlBlcmNlbnQ7CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5Gb3JtdWxhOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQ2Z2b1R5cGUuX2Zvcm11bGE7CiAKLQkJCQljYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50aWxlOgotICAgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5DZnZvVHlwZS5QZXJjZW50aWxlOwotCQkJfQorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudDoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNmdm9UeXBlLl9wZXJjZW50OwogCi0JCQlyZXR1cm4gc3RyaW5nLkVtcHR5OwotCQl9CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50aWxlOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQ2Z2b1R5cGUuX3BlcmNlbnRpbGU7CisgICAgfQogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIEdldCB0aGUgY2Z2byAowqcxOC4zLjEuMTEpIG5vZGUgcGFyZW50IGJ5IHRoZSBydWxlIHR5cGUuIENhbiBiZSBhbnkgb2YgdGhlIGZvbGxvd2luZzoKLQkJLy8vICJjb2xvclNjYWxlIiAowqcxOC4zLjEuMTYpOyAiZGF0YUJhciIgKMKnMTguMy4xLjI4KTsgImljb25TZXQiICjCpzE4LjMuMS40OSkKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJydWxlVHlwZSI+PC9wYXJhbT4KLQkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLQkJcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0UGFyZW50UGF0aEJ5UnVsZVR5cGUoCi0JCQllRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBydWxlVHlwZSkKLQkJewotCQkJc3dpdGNoIChydWxlVHlwZSkKLQkJCXsKLQkJCQljYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlR3b0NvbG9yU2NhbGU6Ci0JCQkJY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUNvbG9yU2NhbGU6Ci0JCQkJCXJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Db2xvclNjYWxlOworICAgIHJldHVybiBzdHJpbmcuRW1wdHk7CisgIH0KIAotCQkJCWNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0OgotICAgICAgICAgICAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5GaXZlSWNvblNldDoKLQkJCQkJICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuSWNvblNldDsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0IHRoZSBjZnZvICjCpzE4LjMuMS4xMSkgbm9kZSBwYXJlbnQgYnkgdGhlIHJ1bGUgdHlwZS4gQ2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgorICAvLy8gImNvbG9yU2NhbGUiICjCpzE4LjMuMS4xNik7ICJkYXRhQmFyIiAowqcxOC4zLjEuMjgpOyAiaWNvblNldCIgKMKnMTguMy4xLjQ5KQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InJ1bGVUeXBlIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRQYXJlbnRQYXRoQnlSdWxlVHlwZShlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSBydWxlVHlwZSkgeworICAgIHN3aXRjaCAocnVsZVR5cGUpIHsKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVHdvQ29sb3JTY2FsZToKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVDb2xvclNjYWxlOgorICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX2NvbG9yU2NhbGU7CiAKLSAgICAgICAgICAgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkRhdGFCYXI6Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuRGF0YUJhcjsKLSAgICAgICAgICAgICAgfQorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQ6CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZvdXJJY29uU2V0OgorICAgICAgY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5GaXZlSWNvblNldDoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9pY29uU2V0OwogCi0JCQlyZXR1cm4gc3RyaW5nLkVtcHR5OwotCQl9CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkRhdGFCYXI6CisgICAgICAgIHJldHVybiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fZGF0YUJhcjsKKyAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0ibm9kZVR5cGUiPjwvcGFyYW0+Ci0JCS8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0JCXB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldE5vZGVQYXRoQnlOb2RlVHlwZSgKLQkJCWVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0Tm9kZVR5cGUgbm9kZVR5cGUpCi0JCXsKLQkJCXN3aXRjaChub2RlVHlwZSkKLQkJCXsKLQkJCQljYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0Tm9kZVR5cGUuQ2Z2bzoKLQkJCQkJcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmdm87CisgICAgcmV0dXJuIHN0cmluZy5FbXB0eTsKKyAgfQogCi0JCQkJY2FzZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdE5vZGVUeXBlLkNvbG9yOgotCQkJCQlyZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ29sb3I7Ci0JCQl9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZVR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldE5vZGVQYXRoQnlOb2RlVHlwZSgKKyAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0Tm9kZVR5cGUgbm9kZVR5cGUpIHsKKyAgICBzd2l0Y2ggKG5vZGVUeXBlKSB7CisgICAgICBjYXNlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0Tm9kZVR5cGUuQ2Z2bzoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9jZnZvOwogCi0JCQlyZXR1cm4gc3RyaW5nLkVtcHR5OwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIGNhc2UgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3ROb2RlVHlwZS5Db2xvcjoKKyAgICAgICAgcmV0dXJuIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9jb2xvcjsKKyAgICB9CisKKyAgICByZXR1cm4gc3RyaW5nLkVtcHR5OworICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1JhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SYW5nZUNvbmRpdGlvbmFsRm9ybWF0dGluZy5jcwppbmRleCA4NDE0NjFkLi5kZWJmMDYxIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1JhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUmFuZ2VDb25kaXRpb25hbEZvcm1hdHRpbmcuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDUxOSArMTMsNDI2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvciAgICAgICAgICAgICBDaGFuZ2UgICAgICAgICAgICAgICAgICAgIERhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgICAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOworCit1c2luZyBTeXN0ZW0uRHJhd2luZzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICBpbnRlcm5hbCBjbGFzcyBSYW5nZUNvbmRpdGlvbmFsRm9ybWF0dGluZwotICAgIDogSVJhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi0gIHsKLSAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgcHVibGljIEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQ7Ci0gICAgcHVibGljIEV4Y2VsQWRkcmVzcyBfYWRkcmVzczsKLSAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIHB1YmxpYyBSYW5nZUNvbmRpdGlvbmFsRm9ybWF0dGluZygKLSAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKLSAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKQotICAgIHsKLSAgICAgIFJlcXVpcmUuQXJndW1lbnQod29ya3NoZWV0KS5Jc05vdE51bGwoIndvcmtzaGVldCIpOwotICAgICAgUmVxdWlyZS5Bcmd1bWVudChhZGRyZXNzKS5Jc05vdE51bGwoImFkZHJlc3MiKTsKK2ludGVybmFsIGNsYXNzIFJhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nIDogSVJhbmdlQ29uZGl0aW9uYWxGb3JtYXR0aW5nIHsKKyAgcHVibGljIEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQ7CisgIHB1YmxpYyBFeGNlbEFkZHJlc3MgX2FkZHJlc3M7CiAKLSAgICAgIF93b3Jrc2hlZXQgPSB3b3Jrc2hlZXQ7Ci0gICAgICBfYWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisgIHB1YmxpYyBSYW5nZUNvbmRpdGlvbmFsRm9ybWF0dGluZyhFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIEV4Y2VsQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgUmVxdWlyZS5Bcmd1bWVudCh3b3Jrc2hlZXQpLklzTm90TnVsbCgid29ya3NoZWV0Iik7CisgICAgUmVxdWlyZS5Bcmd1bWVudChhZGRyZXNzKS5Jc05vdE51bGwoImFkZHJlc3MiKTsKIAotICAgICNyZWdpb24gQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBSdWxlIFR5cGVzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgQWJvdmVPckVxdWFsQXZlcmFnZSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEFib3ZlQXZlcmFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEFib3ZlQXZlcmFnZSgKLSAgICAgICAgX2FkZHJlc3MpOwotICAgIH0KKyAgICBfd29ya3NoZWV0ID0gd29ya3NoZWV0OworICAgIF9hZGRyZXNzID0gYWRkcmVzczsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgQWJvdmVPckVxdWFsQXZlcmFnZSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEFib3ZlT3JFcXVhbEF2ZXJhZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRBYm92ZU9yRXF1YWxBdmVyYWdlKAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgQWJvdmVPckVxdWFsQXZlcmFnZSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEFib3ZlQXZlcmFnZSgpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQWJvdmVBdmVyYWdlKF9hZGRyZXNzKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgQmVsb3dPckVxdWFsQXZlcmFnZSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEJlbG93QXZlcmFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEJlbG93QXZlcmFnZSgKLSAgICAgICAgX2FkZHJlc3MpOwotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIEFib3ZlT3JFcXVhbEF2ZXJhZ2UgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCBBZGRBYm92ZU9yRXF1YWxBdmVyYWdlKCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRBYm92ZU9yRXF1YWxBdmVyYWdlKF9hZGRyZXNzKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgQmVsb3dPckVxdWFsQXZlcmFnZSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEJlbG93T3JFcXVhbEF2ZXJhZ2UoKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRCZWxvd09yRXF1YWxBdmVyYWdlKAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgQmVsb3dPckVxdWFsQXZlcmFnZSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIEFkZEJlbG93QXZlcmFnZSgpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQmVsb3dBdmVyYWdlKF9hZGRyZXNzKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgQWJvdmVTdGREZXYgQ29uZGl0aW9uYWwgRm9ybWF0dGluZwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwIEFkZEFib3ZlU3RkRGV2KCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQWJvdmVTdGREZXYoCi0gICAgICAgIF9hZGRyZXNzKTsKLSAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBCZWxvd09yRXF1YWxBdmVyYWdlIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAgQWRkQmVsb3dPckVxdWFsQXZlcmFnZSgpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQmVsb3dPckVxdWFsQXZlcmFnZShfYWRkcmVzcyk7CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIEJlbG93U3RkRGV2IENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdTdGREZXZHcm91cCBBZGRCZWxvd1N0ZERldigpCi0gICAgewotICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEJlbG93U3RkRGV2KAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgQWJvdmVTdGREZXYgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwIEFkZEFib3ZlU3RkRGV2KCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRBYm92ZVN0ZERldihfYWRkcmVzcyk7CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIEJvdHRvbSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkQm90dG9tKCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQm90dG9tKAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgQmVsb3dTdGREZXYgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwIEFkZEJlbG93U3RkRGV2KCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRCZWxvd1N0ZERldihfYWRkcmVzcyk7CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIEJvdHRvbVBlcmNlbnQgQ29uZGl0aW9uYWwgRm9ybWF0dGluZwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwIEFkZEJvdHRvbVBlcmNlbnQoKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRCb3R0b21QZXJjZW50KAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgQm90dG9tIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cCBBZGRCb3R0b20oKSB7CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEJvdHRvbShfYWRkcmVzcyk7CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIFRvcCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkVG9wKCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkVG9wKAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgQm90dG9tUGVyY2VudCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgQWRkQm90dG9tUGVyY2VudCgpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQm90dG9tUGVyY2VudChfYWRkcmVzcyk7CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIFRvcFBlcmNlbnQgQ29uZGl0aW9uYWwgRm9ybWF0dGluZwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwIEFkZFRvcFBlcmNlbnQoKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUb3BQZXJjZW50KAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgVG9wIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cCBBZGRUb3AoKSB7CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRvcChfYWRkcmVzcyk7CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIExhc3Q3RGF5cyBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZExhc3Q3RGF5cygpCi0gICAgewotICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZExhc3Q3RGF5cygKLSAgICAgICAgX2FkZHJlc3MpOwotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIFRvcFBlcmNlbnQgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwIEFkZFRvcFBlcmNlbnQoKSB7CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRvcFBlcmNlbnQoX2FkZHJlc3MpOworICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBMYXN0TW9udGggQ29uZGl0aW9uYWwgRm9ybWF0dGluZwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRMYXN0TW9udGgoKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRMYXN0TW9udGgoCi0gICAgICAgIF9hZGRyZXNzKTsKLSAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBMYXN0N0RheXMgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRMYXN0N0RheXMoKSB7CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZExhc3Q3RGF5cyhfYWRkcmVzcyk7CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIExhc3RXZWVrIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTGFzdFdlZWsoKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRMYXN0V2VlaygKLSAgICAgICAgX2FkZHJlc3MpOwotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIExhc3RNb250aCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZExhc3RNb250aCgpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTGFzdE1vbnRoKF9hZGRyZXNzKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgTmV4dE1vbnRoIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTmV4dE1vbnRoKCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTmV4dE1vbnRoKAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgTGFzdFdlZWsgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRMYXN0V2VlaygpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTGFzdFdlZWsoX2FkZHJlc3MpOworICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBOZXh0V2VlayBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZE5leHRXZWVrKCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTmV4dFdlZWsoCi0gICAgICAgIF9hZGRyZXNzKTsKLSAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBOZXh0TW9udGggQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGROZXh0TW9udGgoKSB7CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5leHRNb250aChfYWRkcmVzcyk7CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIFRoaXNNb250aCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFRoaXNNb250aCgpCi0gICAgewotICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRoaXNNb250aCgKLSAgICAgICAgX2FkZHJlc3MpOwotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIE5leHRXZWVrIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkTmV4dFdlZWsoKSB7CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5leHRXZWVrKF9hZGRyZXNzKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgVGhpc1dlZWsgQ29uZGl0aW9uYWwgRm9ybWF0dGluZwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRUaGlzV2VlaygpCi0gICAgewotICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRoaXNXZWVrKAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgVGhpc01vbnRoIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkVGhpc01vbnRoKCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUaGlzTW9udGgoX2FkZHJlc3MpOworICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBUb2RheSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFRvZGF5KCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkVG9kYXkoCi0gICAgICAgIF9hZGRyZXNzKTsKLSAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBUaGlzV2VlayBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIEFkZFRoaXNXZWVrKCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUaGlzV2VlayhfYWRkcmVzcyk7CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIFRvbW9ycm93IENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkVG9tb3Jyb3coKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRUb21vcnJvdygKLSAgICAgICAgX2FkZHJlc3MpOwotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIFRvZGF5IENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkVG9kYXkoKSB7CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFRvZGF5KF9hZGRyZXNzKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgWWVzdGVyZGF5IENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkWWVzdGVyZGF5KCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkWWVzdGVyZGF5KAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgVG9tb3Jyb3cgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCBBZGRUb21vcnJvdygpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkVG9tb3Jyb3coX2FkZHJlc3MpOworICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBCZWdpbnNXaXRoIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoIEFkZEJlZ2luc1dpdGgoKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRCZWdpbnNXaXRoKAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgWWVzdGVyZGF5IENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgQWRkWWVzdGVyZGF5KCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRZZXN0ZXJkYXkoX2FkZHJlc3MpOworICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBCZXR3ZWVuIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuIEFkZEJldHdlZW4oKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRCZXR3ZWVuKAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgQmVnaW5zV2l0aCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aCBBZGRCZWdpbnNXaXRoKCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRCZWdpbnNXaXRoKF9hZGRyZXNzKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgQ29udGFpbnNCbGFua3MgQ29uZGl0aW9uYWwgRm9ybWF0dGluZwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzIEFkZENvbnRhaW5zQmxhbmtzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQ29udGFpbnNCbGFua3MoCi0gICAgICAgIF9hZGRyZXNzKTsKLSAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBCZXR3ZWVuIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuIEFkZEJldHdlZW4oKSB7CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEJldHdlZW4oX2FkZHJlc3MpOworICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBDb250YWluc0Vycm9ycyBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMgQWRkQ29udGFpbnNFcnJvcnMoKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRDb250YWluc0Vycm9ycygKLSAgICAgICAgX2FkZHJlc3MpOwotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIENvbnRhaW5zQmxhbmtzIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcyBBZGRDb250YWluc0JsYW5rcygpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkQ29udGFpbnNCbGFua3MoX2FkZHJlc3MpOworICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBDb250YWluc1RleHQgQ29uZGl0aW9uYWwgRm9ybWF0dGluZwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dCBBZGRDb250YWluc1RleHQoKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRDb250YWluc1RleHQoCi0gICAgICAgIF9hZGRyZXNzKTsKLSAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBDb250YWluc0Vycm9ycyBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMgQWRkQ29udGFpbnNFcnJvcnMoKSB7CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZENvbnRhaW5zRXJyb3JzKF9hZGRyZXNzKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgRHVwbGljYXRlVmFsdWVzIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMgQWRkRHVwbGljYXRlVmFsdWVzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRHVwbGljYXRlVmFsdWVzKAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgQ29udGFpbnNUZXh0IENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQgQWRkQ29udGFpbnNUZXh0KCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRDb250YWluc1RleHQoX2FkZHJlc3MpOworICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBFbmRzV2l0aCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGggQWRkRW5kc1dpdGgoKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRFbmRzV2l0aCgKLSAgICAgICAgX2FkZHJlc3MpOwotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIER1cGxpY2F0ZVZhbHVlcyBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzIEFkZER1cGxpY2F0ZVZhbHVlcygpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRHVwbGljYXRlVmFsdWVzKF9hZGRyZXNzKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgRXF1YWwgQ29uZGl0aW9uYWwgRm9ybWF0dGluZwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsIEFkZEVxdWFsKCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRXF1YWwoCi0gICAgICAgIF9hZGRyZXNzKTsKLSAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBFbmRzV2l0aCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGggQWRkRW5kc1dpdGgoKSB7CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEVuZHNXaXRoKF9hZGRyZXNzKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgRXhwcmVzc2lvbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbiBBZGRFeHByZXNzaW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRXhwcmVzc2lvbigKLSAgICAgICAgX2FkZHJlc3MpOwotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIEVxdWFsIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbCBBZGRFcXVhbCgpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRXF1YWwoX2FkZHJlc3MpOworICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBHcmVhdGVyVGhhbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4gQWRkR3JlYXRlclRoYW4oKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRHcmVhdGVyVGhhbigKLSAgICAgICAgX2FkZHJlc3MpOwotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIEV4cHJlc3Npb24gQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24gQWRkRXhwcmVzc2lvbigpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkRXhwcmVzc2lvbihfYWRkcmVzcyk7CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIEdyZWF0ZXJUaGFuT3JFcXVhbCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsIEFkZEdyZWF0ZXJUaGFuT3JFcXVhbCgpCi0gICAgewotICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZEdyZWF0ZXJUaGFuT3JFcXVhbCgKLSAgICAgICAgX2FkZHJlc3MpOwotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIEdyZWF0ZXJUaGFuIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbiBBZGRHcmVhdGVyVGhhbigpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkR3JlYXRlclRoYW4oX2FkZHJlc3MpOworICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBMZXNzVGhhbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4gQWRkTGVzc1RoYW4oKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRMZXNzVGhhbigKLSAgICAgICAgX2FkZHJlc3MpOwotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIEdyZWF0ZXJUaGFuT3JFcXVhbCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsIEFkZEdyZWF0ZXJUaGFuT3JFcXVhbCgpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkR3JlYXRlclRoYW5PckVxdWFsKF9hZGRyZXNzKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgTGVzc1RoYW5PckVxdWFsIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwgQWRkTGVzc1RoYW5PckVxdWFsKCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTGVzc1RoYW5PckVxdWFsKAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgTGVzc1RoYW4gQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuIEFkZExlc3NUaGFuKCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRMZXNzVGhhbihfYWRkcmVzcyk7CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIE5vdEJldHdlZW4gQ29uZGl0aW9uYWwgRm9ybWF0dGluZwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4gQWRkTm90QmV0d2VlbigpCi0gICAgewotICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5vdEJldHdlZW4oCi0gICAgICAgIF9hZGRyZXNzKTsKLSAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBMZXNzVGhhbk9yRXF1YWwgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbCBBZGRMZXNzVGhhbk9yRXF1YWwoKSB7CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZExlc3NUaGFuT3JFcXVhbChfYWRkcmVzcyk7CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIE5vdENvbnRhaW5zQmxhbmtzIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcyBBZGROb3RDb250YWluc0JsYW5rcygpCi0gICAgewotICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5vdENvbnRhaW5zQmxhbmtzKAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgTm90QmV0d2VlbiBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2VlbiBBZGROb3RCZXR3ZWVuKCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGROb3RCZXR3ZWVuKF9hZGRyZXNzKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgTm90Q29udGFpbnNFcnJvcnMgQ29uZGl0aW9uYWwgRm9ybWF0dGluZwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzIEFkZE5vdENvbnRhaW5zRXJyb3JzKCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTm90Q29udGFpbnNFcnJvcnMoCi0gICAgICAgIF9hZGRyZXNzKTsKLSAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBOb3RDb250YWluc0JsYW5rcyBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MgQWRkTm90Q29udGFpbnNCbGFua3MoKSB7CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5vdENvbnRhaW5zQmxhbmtzKF9hZGRyZXNzKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgTm90Q29udGFpbnNUZXh0IENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQgQWRkTm90Q29udGFpbnNUZXh0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkTm90Q29udGFpbnNUZXh0KAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgTm90Q29udGFpbnNFcnJvcnMgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzIEFkZE5vdENvbnRhaW5zRXJyb3JzKCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGROb3RDb250YWluc0Vycm9ycyhfYWRkcmVzcyk7CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIE5vdEVxdWFsIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbCBBZGROb3RFcXVhbCgpCi0gICAgewotICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5vdEVxdWFsKAotICAgICAgICBfYWRkcmVzcyk7Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgTm90Q29udGFpbnNUZXh0IENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vICA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQgQWRkTm90Q29udGFpbnNUZXh0KCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGROb3RDb250YWluc1RleHQoX2FkZHJlc3MpOworICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZCBVbmlxdWVWYWx1ZXMgQ29uZGl0aW9uYWwgRm9ybWF0dGluZwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcyBBZGRVbmlxdWVWYWx1ZXMoKQotICAgIHsKLSAgICAgIHJldHVybiBfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRVbmlxdWVWYWx1ZXMoCi0gICAgICAgIF9hZGRyZXNzKTsKLSAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBOb3RFcXVhbCBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwgQWRkTm90RXF1YWwoKSB7CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZE5vdEVxdWFsKF9hZGRyZXNzKTsKKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGQgVGhyZWVDb2xvclNjYWxlIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUgQWRkVGhyZWVDb2xvclNjYWxlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSkoX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkUnVsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIFVuaXF1ZVZhbHVlcyBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzIEFkZFVuaXF1ZVZhbHVlcygpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkVW5pcXVlVmFsdWVzKF9hZGRyZXNzKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBUaHJlZUNvbG9yU2NhbGUgQ29uZGl0aW9uYWwgRm9ybWF0dGluZworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSBBZGRUaHJlZUNvbG9yU2NhbGUoKSB7CisgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUpKF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFJ1bGUoCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlQ29sb3JTY2FsZSwKICAgICAgICAgX2FkZHJlc3MpKTsKLSAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkIFR3b0NvbG9yU2NhbGUgQ29uZGl0aW9uYWwgRm9ybWF0dGluZwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vICA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUgQWRkVHdvQ29sb3JTY2FsZSgpCi0gICAgewotICAgICAgcmV0dXJuIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlKShfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgVHdvQ29sb3JTY2FsZSBDb25kaXRpb25hbCBGb3JtYXR0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyAgPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZSBBZGRUd29Db2xvclNjYWxlKCkgeworICAgIHJldHVybiAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZSkoX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkUnVsZSgKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVHdvQ29sb3JTY2FsZSwKICAgICAgICAgX2FkZHJlc3MpKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBUaHJlZUljb25TZXQgcnVsZSAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iSWNvblNldCI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nM0ljb25zU2V0VHlwZT4gQWRkVGhyZWVJY29uU2V0KGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzNJY29uc1NldFR5cGUgSWNvblNldCkKLSAgICB7Ci0gICAgICAgIHZhciBydWxlID0gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlSWNvblNldDxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmczSWNvbnNTZXRUeXBlPikoX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkUnVsZSgKLSAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQsCi0gICAgICAgICAgX2FkZHJlc3MpKTsKLSAgICAgICAgcnVsZS5JY29uU2V0ID0gSWNvblNldDsKLSAgICAgICAgcmV0dXJuIHJ1bGU7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBZGRzIGEgRm91ckljb25TZXQgcnVsZSAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iSWNvblNldCI+PC9wYXJhbT4KLSAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldDxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlPiBBZGRGb3VySWNvblNldChlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlIEljb25TZXQpCi0gICAgewotICAgICAgICB2YXIgcnVsZSA9IChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldDxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlPikoX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkUnVsZSgKLSAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Gb3VySWNvblNldCwKLSAgICAgICAgICBfYWRkcmVzcykpOwotICAgICAgICBydWxlLkljb25TZXQgPSBJY29uU2V0OwotICAgICAgICByZXR1cm4gcnVsZTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFkZHMgYSBGaXZlSWNvblNldCBydWxlIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJJY29uU2V0Ij48L3BhcmFtPgotICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0IEFkZEZpdmVJY29uU2V0KGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzVJY29uc1NldFR5cGUgSWNvblNldCkKLSAgICB7Ci0gICAgICAgIHZhciBydWxlID0gKElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0KShfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRSdWxlKAotICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZpdmVJY29uU2V0LAotICAgICAgICAgIF9hZGRyZXNzKSk7Ci0gICAgICAgIHJ1bGUuSWNvblNldCA9IEljb25TZXQ7Ci0gICAgICAgIHJldHVybiBydWxlOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcyBhIERhdGFiYXIgcnVsZSAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iQ29sb3IiPlRoZSBjb2xvciBvZiB0aGUgZGF0YWJhcjwvcGFyYW0+Ci0gICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhckdyb3VwIEFkZERhdGFiYXIoU3lzdGVtLkRyYXdpbmcuQ29sb3IgQ29sb3IpCi0gICAgewotICAgICAgICB2YXIgcnVsZSA9IChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyR3JvdXApKF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkFkZFJ1bGUoCi0gICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRGF0YUJhciwKLSAgICAgICAgICBfYWRkcmVzcykpOwotICAgICAgICBydWxlLkNvbG9yID0gQ29sb3I7Ci0gICAgICAgIHJldHVybiBydWxlOwotICAgIH0KLSAgICAjZW5kcmVnaW9uIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgUnVsZSBUeXBlcwogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBUaHJlZUljb25TZXQgcnVsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Imljb25TZXQiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nM0ljb25zU2V0VHlwZT4gQWRkVGhyZWVJY29uU2V0KAorICAgICAgZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nM0ljb25zU2V0VHlwZSBpY29uU2V0KSB7CisgICAgdmFyIHJ1bGUgPQorICAgICAgICAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0PGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzNJY29uc1NldFR5cGU+KShfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRSdWxlKAorICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0LAorICAgICAgICAgICAgX2FkZHJlc3MpKTsKKyAgICBydWxlLkljb25TZXQgPSBpY29uU2V0OworICAgIHJldHVybiBydWxlOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIEZvdXJJY29uU2V0IHJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpY29uU2V0Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZT4gQWRkRm91ckljb25TZXQoCisgICAgICBlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlIGljb25TZXQpIHsKKyAgICB2YXIgcnVsZSA9CisgICAgICAgIChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldDxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlPikoX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkUnVsZSgKKyAgICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZvdXJJY29uU2V0LAorICAgICAgICAgICAgX2FkZHJlc3MpKTsKKyAgICBydWxlLkljb25TZXQgPSBpY29uU2V0OworICAgIHJldHVybiBydWxlOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIEZpdmVJY29uU2V0IHJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpY29uU2V0Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQgQWRkRml2ZUljb25TZXQoCisgICAgICBlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc1SWNvbnNTZXRUeXBlIGljb25TZXQpIHsKKyAgICB2YXIgcnVsZSA9IChJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldCkoX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQWRkUnVsZSgKKyAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRml2ZUljb25TZXQsCisgICAgICAgIF9hZGRyZXNzKSk7CisgICAgcnVsZS5JY29uU2V0ID0gaWNvblNldDsKKyAgICByZXR1cm4gcnVsZTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBEYXRhYmFyIHJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2xvciI+VGhlIGNvbG9yIG9mIHRoZSBkYXRhYmFyPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXJHcm91cCBBZGREYXRhYmFyKENvbG9yIGNvbG9yKSB7CisgICAgdmFyIHJ1bGUgPSAoSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhckdyb3VwKShfd29ya3NoZWV0LkNvbmRpdGlvbmFsRm9ybWF0dGluZy5BZGRSdWxlKAorICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5EYXRhQmFyLAorICAgICAgICBfYWRkcmVzcykpOworICAgIHJ1bGUuQ29sb3IgPSBjb2xvcjsKKyAgICByZXR1cm4gcnVsZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlQXZlcmFnZS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZUF2ZXJhZ2UuY3MKaW5kZXggZjM1ZmU0Ny4uNmU4MmMyZiAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlQXZlcmFnZS5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVBdmVyYWdlLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTAgKzEzLDgyIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwoteworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZUF2ZXJhZ2UKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZUF2ZXJhZ2UgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCB7CiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVBdmVyYWdlCisgIC8vLwogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZUF2ZXJhZ2UKLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlQXZlcmFnZSgKKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZUF2ZXJhZ2UoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5BYm92ZUF2ZXJhZ2UsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVBdmVyYWdlLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIGlmIChpdGVtRWxlbWVudE5vZGUKKyAgICAgICAgPT0gbnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAogICAgIHsKLSAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAotICAgICAgICB7Ci0gICAgICAgICAgICBBYm92ZUF2ZXJhZ2UgPSB0cnVlOwotICAgICAgICAgICAgRXF1YWxBdmVyYWdlID0gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgIEFib3ZlQXZlcmFnZSA9IHRydWU7CisgICAgICBFcXVhbEF2ZXJhZ2UgPSBmYWxzZTsKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlQXZlcmFnZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVBdmVyYWdlKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVBdmVyYWdlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlQXZlcmFnZSgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVPckVxdWFsQXZlcmFnZS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZU9yRXF1YWxBdmVyYWdlLmNzCmluZGV4IGY4N2UyYTguLjYwYTg5ZDAgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZU9yRXF1YWxBdmVyYWdlLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZU9yRXF1YWxBdmVyYWdlLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTAgKzEzLDgzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwoteworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZU9yRXF1YWxBdmVyYWdlCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVPckVxdWFsQXZlcmFnZQorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAgewogICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlT3JFcXVhbEF2ZXJhZ2UKKyAgLy8vCiAgIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlT3JFcXVhbEF2ZXJhZ2UKLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlT3JFcXVhbEF2ZXJhZ2UoCisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVPckVxdWFsQXZlcmFnZSgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlT3JFcXVhbEF2ZXJhZ2UsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVPckVxdWFsQXZlcmFnZSwKKyAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBpZiAoaXRlbUVsZW1lbnROb2RlCisgICAgICAgID09IG51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKICAgICB7Ci0gICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKLSAgICAgICAgewotICAgICAgICAgICAgQWJvdmVBdmVyYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgIEVxdWFsQXZlcmFnZSA9IHRydWU7Ci0gICAgICAgIH0KKyAgICAgIEFib3ZlQXZlcmFnZSA9IHRydWU7CisgICAgICBFcXVhbEF2ZXJhZ2UgPSB0cnVlOwogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVPckVxdWFsQXZlcmFnZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVPckVxdWFsQXZlcmFnZSgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlT3JFcXVhbEF2ZXJhZ2UoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVPckVxdWFsQXZlcmFnZSgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVTdGREZXYuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVTdGREZXYuY3MKaW5kZXggNWIwZmIzMy4uMDg4MzQ2MiAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlU3RkRGV2LmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZVN0ZERldi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTExICsxMyw4NSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOworCiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZVN0ZERldgotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZVN0ZERldgotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKIAotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlU3RkRGV2KAorLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQWJvdmVTdGREZXYKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZVN0ZERldgorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXAgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlU3RkRGV2KAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVTdGREZXYsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQWJvdmVTdGREZXYsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFib3ZlQXZlcmFnZSA9IHRydWU7Ci0gICAgICAgICAgICBTdGREZXYgPSAxOwotICAgICAgICB9CisgICAgICBBYm92ZUF2ZXJhZ2UgPSB0cnVlOworICAgICAgU3RkRGV2ID0gMTsKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlU3RkRGV2KAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBYm92ZVN0ZERldigKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlU3RkRGV2KAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0Fib3ZlU3RkRGV2KAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIG51bGwsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KLSAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgbnVsbCwgbnVsbCkge30KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwLmNzCmluZGV4IGRkMTFlYjguLmNlYmRiNTEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsNTEgKzEzLDQzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cAotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAKLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAKLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOwogCi0gICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCgKKy8vLyA8c3VtbWFyeT4KKy8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cAorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCgKICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKQEAgLTY1LDYyICs1Nyw0MCBAQAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIHR5cGUsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCi0gICAgewotICAgIH0KKyAgICAgICAgICB0eXBlLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy88cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCgKICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQotICAgICAgOiB0aGlzKAotICAgICAgICB0eXBlLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KKyAgICAgIDogdGhpcyh0eXBlLCBhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBpdGVtRWxlbWVudE5vZGUsIG51bGwpIHt9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLzxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cCgKICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgdHlwZSwKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyh0eXBlLCBhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGguY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aC5jcwppbmRleCBhNTEzMmM1Li45ZGM5MThlIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aC5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTM4ICsxMywxMDAgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aAotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoCi0gICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aAotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoKAorLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVnaW5zV2l0aAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGgKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGggeworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGgoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWdpbnNXaXRoLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlZ2luc1dpdGgsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9wZXJhdG9yID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkJlZ2luc1dpdGg7Ci0gICAgICAgICAgICBUZXh0ID0gc3RyaW5nLkVtcHR5OwotICAgICAgICB9CisgICAgICBPcGVyYXRvciA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5CZWdpbnNXaXRoOworICAgICAgVGV4dCA9IHN0cmluZy5FbXB0eTsKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGgoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGgoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBpdGVtRWxlbWVudE5vZGUsIG51bGwpIHt9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWdpbnNXaXRoKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlZ2luc1dpdGgoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgbnVsbCwgbnVsbCkge30KIAotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgdGV4dCB0byBzZWFyY2ggaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgY2VsbAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIFRleHQgeworICAgIGdldCA9PiBHZXRYbWxOb2RlU3RyaW5nKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl90ZXh0QXR0cmlidXRlKTsKKyAgICBzZXQgeworICAgICAgU2V0WG1sTm9kZVN0cmluZyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fdGV4dEF0dHJpYnV0ZSwgdmFsdWUpOwogCi0gICAgI3JlZ2lvbiBFeHBvc2VkIFByb3BlcnRpZXMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoZSB0ZXh0IHRvIHNlYXJjaCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjZWxsCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIFRleHQKLSAgICB7Ci0gICAgICBnZXQKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVGV4dEF0dHJpYnV0ZSk7Ci0gICAgICB9Ci0gICAgICBzZXQKLSAgICAgIHsKLSAgICAgICAgU2V0WG1sTm9kZVN0cmluZygKLSAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5UZXh0QXR0cmlidXRlLAotICAgICAgICAgIHZhbHVlKTsKLQotICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKKyAgICAgIEZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KAogICAgICAgICAgICJMRUZUKHswfSxMRU4oXCJ7MX1cIikpPVwiezF9XCIiLAogICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcywKICAgICAgICAgICB2YWx1ZS5SZXBsYWNlKCJcIiIsICJcIlwiIikpOwotICAgICAgfQogICAgIH0KLSAgICAjZW5kcmVnaW9uIEV4cG9zZWQgUHJvcGVydGllcwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dBdmVyYWdlLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93QXZlcmFnZS5jcwppbmRleCBmNzYzYjQ3Li5iZTEzZmEzIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dBdmVyYWdlLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd0F2ZXJhZ2UuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDExMCArMTMsODIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93QXZlcmFnZQorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93QXZlcmFnZSA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIHsKICAgLy8vIDxzdW1tYXJ5PgotICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd0F2ZXJhZ2UKKyAgLy8vCiAgIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93QXZlcmFnZQotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdBdmVyYWdlR3JvdXAKLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dBdmVyYWdlKAorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93QXZlcmFnZSgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93QXZlcmFnZSwKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd0F2ZXJhZ2UsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFib3ZlQXZlcmFnZSA9IGZhbHNlOwotICAgICAgICAgICAgRXF1YWxBdmVyYWdlID0gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgIEFib3ZlQXZlcmFnZSA9IGZhbHNlOworICAgICAgRXF1YWxBdmVyYWdlID0gZmFsc2U7CiAgICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd0F2ZXJhZ2UoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93QXZlcmFnZSgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93QXZlcmFnZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd0F2ZXJhZ2UoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93T3JFcXVhbEF2ZXJhZ2UuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dPckVxdWFsQXZlcmFnZS5jcwppbmRleCA0MmQ4OGE1Li4zOWViMzI3IDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dPckVxdWFsQXZlcmFnZS5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dPckVxdWFsQXZlcmFnZS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTEwICsxMyw4MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOworCiB1c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dPckVxdWFsQXZlcmFnZQorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93T3JFcXVhbEF2ZXJhZ2UKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQXZlcmFnZUdyb3VwIHsKICAgLy8vIDxzdW1tYXJ5PgotICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd09yRXF1YWxBdmVyYWdlCisgIC8vLwogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd09yRXF1YWxBdmVyYWdlCi0gICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0F2ZXJhZ2VHcm91cAotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd09yRXF1YWxBdmVyYWdlKAorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93T3JFcXVhbEF2ZXJhZ2UoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd09yRXF1YWxBdmVyYWdlLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93T3JFcXVhbEF2ZXJhZ2UsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFib3ZlQXZlcmFnZSA9IGZhbHNlOwotICAgICAgICAgICAgRXF1YWxBdmVyYWdlID0gdHJ1ZTsKLSAgICAgICAgfQorICAgICAgQWJvdmVBdmVyYWdlID0gZmFsc2U7CisgICAgICBFcXVhbEF2ZXJhZ2UgPSB0cnVlOwogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dPckVxdWFsQXZlcmFnZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dPckVxdWFsQXZlcmFnZSgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93T3JFcXVhbEF2ZXJhZ2UoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dPckVxdWFsQXZlcmFnZSgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dTdGREZXYuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dTdGREZXYuY3MKaW5kZXggOTViZTA2ZC4uYjI0MTlmNiAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93U3RkRGV2LmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd1N0ZERldi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTExICsxMyw4NSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOworCiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd1N0ZERldgotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd1N0ZERldgotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1N0ZERldkdyb3VwCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKIAotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93U3RkRGV2KAorLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dTdGREZXYKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZWxvd1N0ZERldgorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nU3RkRGV2R3JvdXAgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93U3RkRGV2KAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dTdGREZXYsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dTdGREZXYsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFib3ZlQXZlcmFnZSA9IGZhbHNlOwotICAgICAgICAgICAgU3RkRGV2ID0gMTsKLSAgICAgICAgfQorICAgICAgQWJvdmVBdmVyYWdlID0gZmFsc2U7CisgICAgICBTdGREZXYgPSAxOwogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dTdGREZXYoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JlbG93U3RkRGV2KAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dTdGREZXYoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmVsb3dTdGREZXYoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4uY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2Vlbi5jcwppbmRleCAyN2MxNDQ2Li5iMjdhMzA4IDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2Vlbi5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2Vlbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTEyICsxMyw4NiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOworCiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4KLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKIAotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4oCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2VlbgorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2VlbiB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQmV0d2VlbigKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJldHdlZW4sCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmV0d2VlbiwKKyAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBpZiAoaXRlbUVsZW1lbnROb2RlCisgICAgICAgID09IG51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKICAgICB7Ci0gICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKLSAgICAgICAgewotICAgICAgICAgICAgT3BlcmF0b3IgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuQmV0d2VlbjsKLSAgICAgICAgICAgIEZvcm11bGEgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICBGb3JtdWxhMiA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgfQorICAgICAgT3BlcmF0b3IgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuQmV0d2VlbjsKKyAgICAgIEZvcm11bGEgPSBzdHJpbmcuRW1wdHk7CisgICAgICBGb3JtdWxhMiA9IHN0cmluZy5FbXB0eTsKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4oCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4oCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBpdGVtRWxlbWVudE5vZGUsIG51bGwpIHt9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCZXR3ZWVuKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JldHdlZW4oCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b20uY3MKaW5kZXggYmVhNWZkNy4uNGIyM2Y0OSAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbS5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTIgKzEzLDg2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbQotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b20KLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BCb3R0b21Hcm91cAotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b20oCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b20KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b20KKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b20oCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Cb3R0b20sCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQm90dG9tLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIGlmIChpdGVtRWxlbWVudE5vZGUKKyAgICAgICAgPT0gbnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAogICAgIHsKLSAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAotICAgICAgICB7Ci0gICAgICAgICAgICBCb3R0b20gPSB0cnVlOwotICAgICAgICAgICAgUGVyY2VudCA9IGZhbHNlOwotICAgICAgICAgICAgUmFuayA9IDEwOyAgLy8gTGFzdCAxMCB2YWx1ZXMKLSAgICAgICAgfQorICAgICAgQm90dG9tID0gdHJ1ZTsKKyAgICAgIFBlcmNlbnQgPSBmYWxzZTsKKyAgICAgIFJhbmsgPSAxMDsgLy8gTGFzdCAxMCB2YWx1ZXMKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbSgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tUGVyY2VudC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b21QZXJjZW50LmNzCmluZGV4IGE5NWFkMDkuLjQ5NDA3OGQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b21QZXJjZW50LmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b21QZXJjZW50LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTIgKzEzLDg2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbVBlcmNlbnQKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tUGVyY2VudAotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKIAotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbVBlcmNlbnQoCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdCb3R0b21QZXJjZW50CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tUGVyY2VudAorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbVBlcmNlbnQoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Cb3R0b21QZXJjZW50LAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJvdHRvbVBlcmNlbnQsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJvdHRvbSA9IHRydWU7Ci0gICAgICAgICAgICBQZXJjZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgIFJhbmsgPSAxMDsgIC8vIExhc3QgMTAgcGVyY2VudAotICAgICAgICB9CisgICAgICBCb3R0b20gPSB0cnVlOworICAgICAgUGVyY2VudCA9IHRydWU7CisgICAgICBSYW5rID0gMTA7IC8vIExhc3QgMTAgcGVyY2VudAogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tUGVyY2VudCgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tUGVyY2VudCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0JvdHRvbVBlcmNlbnQoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQm90dG9tUGVyY2VudCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MuY3MKaW5kZXggMDBiMWIxZi4uMTZlYTZjMiAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcy5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTEyICsxMyw4NCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOworCiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcwotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcwotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKIAotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzKAorLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcworICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNCbGFua3MgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNCbGFua3MsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNCbGFua3MsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KAotICAgICAgICAgICAgICAiTEVOKFRSSU0oezB9KSk9MCIsCi0gICAgICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcyk7Ci0gICAgICAgIH0KKyAgICAgIEZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KCJMRU4oVFJJTSh7MH0pKT0wIiwgQWRkcmVzcy5TdGFydC5BZGRyZXNzKTsKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0JsYW5rcygKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zQmxhbmtzKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIG51bGwsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KLSAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgbnVsbCwgbnVsbCkge30KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycy5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycy5jcwppbmRleCA3YzA2ZjY0Li41Yzc0M2RjIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTIgKzEzLDg0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzCi0gICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMKLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOwogCi0gICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMoCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycyB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNFcnJvcnMoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Db250YWluc0Vycm9ycywKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Db250YWluc0Vycm9ycywKKyAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBpZiAoaXRlbUVsZW1lbnROb2RlCisgICAgICAgID09IG51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKICAgICB7Ci0gICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKLSAgICAgICAgewotICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCi0gICAgICAgICAgICAgICJJU0VSUk9SKHswfSkiLAotICAgICAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOwotICAgICAgICB9CisgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgiSVNFUlJPUih7MH0pIiwgQWRkcmVzcy5TdGFydC5BZGRyZXNzKTsKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc0Vycm9ycygKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zRXJyb3JzKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIG51bGwsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KLSAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgbnVsbCwgbnVsbCkge30KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0LmNzCmluZGV4IDU5MDk2Y2YuLjg4YTRkNDMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTM4ICsxMywxMDAgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0Ci0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dAotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dAotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQoCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb250YWluc1RleHQKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dCB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0KAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQ29udGFpbnNUZXh0LAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkNvbnRhaW5zVGV4dCwKKyAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBpZiAoaXRlbUVsZW1lbnROb2RlCisgICAgICAgID09IG51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKICAgICB7Ci0gICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKLSAgICAgICAgewotICAgICAgICAgICAgT3BlcmF0b3IgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuQ29udGFpbnNUZXh0OwotICAgICAgICAgICAgVGV4dCA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgfQorICAgICAgT3BlcmF0b3IgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuQ29udGFpbnNUZXh0OworICAgICAgVGV4dCA9IHN0cmluZy5FbXB0eTsKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dCgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0KAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29udGFpbnNUZXh0KAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnRhaW5zVGV4dCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQogCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSB0ZXh0IHRvIHNlYXJjaCBpbnNpZGUgdGhlIGNlbGwKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBUZXh0IHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fdGV4dEF0dHJpYnV0ZSk7CisgICAgc2V0IHsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3RleHRBdHRyaWJ1dGUsIHZhbHVlKTsKIAotICAgICNyZWdpb24gRXhwb3NlZCBQcm9wZXJ0aWVzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGUgdGV4dCB0byBzZWFyY2ggaW5zaWRlIHRoZSBjZWxsCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIFRleHQKLSAgICB7Ci0gICAgICBnZXQKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVGV4dEF0dHJpYnV0ZSk7Ci0gICAgICB9Ci0gICAgICBzZXQKLSAgICAgIHsKLSAgICAgICAgU2V0WG1sTm9kZVN0cmluZygKLSAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5UZXh0QXR0cmlidXRlLAotICAgICAgICAgIHZhbHVlKTsKLQotICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKKyAgICAgIEZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KAogICAgICAgICAgICJOT1QoSVNFUlJPUihTRUFSQ0goXCJ7MX1cIix7MH0pKSkiLAogICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcywKICAgICAgICAgICB2YWx1ZS5SZXBsYWNlKCJcIiIsICJcIlwiIikpOwotICAgICAgfQogICAgIH0KLSAgICAjZW5kcmVnaW9uIEV4cG9zZWQgUHJvcGVydGllcwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhci5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyLmNzCmluZGV4IDJkYjliMDIuLmVkMzJhY2UgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywyMjEgKzEzLDE1NyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKKwogdXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRGF0YWJhcgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhcgotICAgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXJHcm91cAotICAgIHsKLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSAgICAgICAgI3JlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKIAotICAgICAgICAjZW5kcmVnaW9uIFByaXZhdGUgUHJvcGVydGllcwotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhcigKLSAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSB0eXBlLAotICAgICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAotICAgICAgICAgIGludCBwcmlvcml0eSwKLSAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCi0gICAgICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQotICAgICAgICAgICAgOiBiYXNlKAotICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgICAgICAgd29ya3NoZWV0LAotICAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAiY2Z2byIsICJjb2xvciIgfTsKLSAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSA8ZGF0YUJhcj4gbm9kZSBpbnNpZGUgdGhlIDxjZlJ1bGU+IG5vZGUKLSAgICAgICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGUhPW51bGwgJiYgaXRlbUVsZW1lbnROb2RlLkhhc0NoaWxkTm9kZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYm9vbCBoaWdoPWZhbHNlOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbm9kZSBpbiBpdGVtRWxlbWVudE5vZGUuU2VsZWN0Tm9kZXMoImQ6ZGF0YUJhci9kOmNmdm8iLCBOYW1lU3BhY2VNYW5hZ2VyKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoaWdoID09IGZhbHNlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb3dWYWx1ZSA9IG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoaWdoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEhpZ2hWYWx1ZSA9IG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGljb25TZXROb2RlID0gQ3JlYXRlQ29tcGxleE5vZGUoCi0gICAgICAgICAgICAgICAgICBOb2RlLAotICAgICAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuRGF0YUJhcik7Ci0KLSAgICAgICAgICAgICAgICB2YXIgbG93Tm9kZSA9IGljb25TZXROb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5DZnZvLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICAgICAgaWNvblNldE5vZGUuQXBwZW5kQ2hpbGQobG93Tm9kZSk7Ci0gICAgICAgICAgICAgICAgTG93VmFsdWUgPSBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlKGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5NaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5EYXRhQmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LAotICAgICAgICAgICAgICAgICAgICAgICAgbG93Tm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOwotCi0gICAgICAgICAgICAgICAgdmFyIGhpZ2hOb2RlID0gaWNvblNldE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmdm8sIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgICAgICBpY29uU2V0Tm9kZS5BcHBlbmRDaGlsZChoaWdoTm9kZSk7Ci0gICAgICAgICAgICAgICAgSGlnaFZhbHVlID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZShlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRGF0YUJhciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUeXBlID0gdHlwZTsKKy8vLyA8c3VtbWFyeT4KKy8vLyBEYXRhYmFyCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhcgorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRGF0YUJhckdyb3VwIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0RhdGFCYXIoCisgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSB0eXBlLAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgICB0eXBlLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ld1tdIHsgImNmdm8iLCAiY29sb3IiIH07CisgICAgLy9DcmVhdGUgdGhlIDxkYXRhQmFyPiBub2RlIGluc2lkZSB0aGUgPGNmUnVsZT4gbm9kZQorICAgIGlmIChpdGVtRWxlbWVudE5vZGUgIT0gbnVsbCAmJiBpdGVtRWxlbWVudE5vZGUuSGFzQ2hpbGROb2RlcykgeworICAgICAgYm9vbCBoaWdoID0gZmFsc2U7CisgICAgICBmb3JlYWNoIChYbWxOb2RlIG5vZGUgaW4gaXRlbUVsZW1lbnROb2RlLlNlbGVjdE5vZGVzKCJkOmRhdGFCYXIvZDpjZnZvIiwgTmFtZVNwYWNlTWFuYWdlcikpIHsKKyAgICAgICAgaWYgKGhpZ2ggPT0gZmFsc2UpIHsKKyAgICAgICAgICBMb3dWYWx1ZSA9IG5ldyh0eXBlLCBhZGRyZXNzLCB3b3Jrc2hlZXQsIG5vZGUsIG5hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICAgIGhpZ2ggPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEhpZ2hWYWx1ZSA9IG5ldyh0eXBlLCBhZGRyZXNzLCB3b3Jrc2hlZXQsIG5vZGUsIG5hbWVzcGFjZU1hbmFnZXIpOwogICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBpY29uU2V0Tm9kZSA9IENyZWF0ZUNvbXBsZXhOb2RlKE5vZGUsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9kYXRhQmFyKTsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyKAotICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCi0gICAgICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCi0gICAgICAgICAgaW50IHByaW9yaXR5LAotICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKLSAgICAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgICAgICAgIDogdGhpcygKLSAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgcHJpb3JpdHksCi0gICAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAgICAgICBudWxsKQotICAgICAgICB7Ci0gICAgICAgIH0KKyAgICAgIHZhciBsb3dOb2RlID0gaWNvblNldE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9jZnZvLAorICAgICAgICAgIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgICBpY29uU2V0Tm9kZS5BcHBlbmRDaGlsZChsb3dOb2RlKTsKKyAgICAgIExvd1ZhbHVlID0gbmV3KAorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5NaW4sCisgICAgICAgICAgMCwKKyAgICAgICAgICAiIiwKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5EYXRhQmFyLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGxvd05vZGUsCisgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyKAotICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCi0gICAgICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCi0gICAgICAgICAgaW50IHByaW9yaXR5LAotICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgICAgICAgIDogdGhpcygKLSAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgcHJpb3JpdHksCi0gICAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgbnVsbCkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9zaG93VmFsdWVQYXRoPSJkOmRhdGFCYXIvQHNob3dWYWx1ZSI7Ci0gICAgICAgIHB1YmxpYyBib29sIFNob3dWYWx1ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woX3Nob3dWYWx1ZVBhdGgsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX3Nob3dWYWx1ZVBhdGgsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSBMb3dWYWx1ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIEhpZ2hWYWx1ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQ7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9jb2xvclBhdGggPSAiZDpkYXRhQmFyL2Q6Y29sb3IvQHJnYiI7Ci0gICAgICAgIHB1YmxpYyBDb2xvciBDb2xvcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgcmdiPUdldFhtbE5vZGVTdHJpbmcoX2NvbG9yUGF0aCk7Ci0gICAgICAgICAgICAgICAgaWYoIXN0cmluZy5Jc051bGxPckVtcHR5KHJnYikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sb3IuRnJvbUFyZ2IoaW50LlBhcnNlKHJnYiwgTnVtYmVyU3R5bGVzLkhleE51bWJlcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gQ29sb3IuV2hpdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9jb2xvclBhdGgsIHZhbHVlLlRvQXJnYigpLlRvU3RyaW5nKCJYIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICB2YXIgaGlnaE5vZGUgPSBpY29uU2V0Tm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX2Nmdm8sCisgICAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKTsKKyAgICAgIGljb25TZXROb2RlLkFwcGVuZENoaWxkKGhpZ2hOb2RlKTsKKyAgICAgIEhpZ2hWYWx1ZSA9IG5ldygKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuTWF4LAorICAgICAgICAgIDAsCisgICAgICAgICAgIiIsCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRGF0YUJhciwKKyAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICBoaWdoTm9kZSwKKyAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKTsKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIFR5cGUgPSB0eXBlOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyKAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSwKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXModHlwZSwgYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEYXRhQmFyKAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSwKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgOiB0aGlzKHR5cGUsIGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3Nob3dWYWx1ZVBhdGggPSAiZDpkYXRhQmFyL0BzaG93VmFsdWUiOworCisgIHB1YmxpYyBib29sIFNob3dWYWx1ZSB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKF9zaG93VmFsdWVQYXRoLCB0cnVlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX3Nob3dWYWx1ZVBhdGgsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgTG93VmFsdWUgeyBnZXQ7IGludGVybmFsIHNldDsgfQorCisgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSGlnaFZhbHVlIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfY29sb3JQYXRoID0gImQ6ZGF0YUJhci9kOmNvbG9yL0ByZ2IiOworCisgIHB1YmxpYyBDb2xvciBDb2xvciB7CisgICAgZ2V0IHsKKyAgICAgIHZhciByZ2IgPSBHZXRYbWxOb2RlU3RyaW5nKF9jb2xvclBhdGgpOworICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShyZ2IpKSB7CisgICAgICAgIHJldHVybiBDb2xvci5Gcm9tQXJnYihpbnQuUGFyc2UocmdiLCBOdW1iZXJTdHlsZXMuSGV4TnVtYmVyKSk7CisgICAgICB9CisgICAgICByZXR1cm4gQ29sb3IuV2hpdGU7CisgICAgfQorICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKF9jb2xvclBhdGgsIHZhbHVlLlRvQXJnYigpLlRvU3RyaW5nKCJYIikpOworICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcy5jcwppbmRleCBkN2VmY2E4Li4xMjMxZmM5IDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDEwNiArMTMsNzggQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcwotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcwotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMoCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdEdXBsaWNhdGVWYWx1ZXMKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcyB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRHVwbGljYXRlVmFsdWVzLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQotICAgIHsKLSAgICB9CisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRHVwbGljYXRlVmFsdWVzLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcygKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRHVwbGljYXRlVmFsdWVzKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0R1cGxpY2F0ZVZhbHVlcygKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGguY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGguY3MKaW5kZXggZDliNThjMy4uZDAyZWQ1MCAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTM4ICsxMywxMDAgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGgKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGgKLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aAotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aCgKKy8vLyA8c3VtbWFyeT4KKy8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRW5kc1dpdGgKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVuZHNXaXRoLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkVuZHNXaXRoLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIGlmIChpdGVtRWxlbWVudE5vZGUKKyAgICAgICAgPT0gbnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAogICAgIHsKLSAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAotICAgICAgICB7Ci0gICAgICAgICAgICBPcGVyYXRvciA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5FbmRzV2l0aDsKLSAgICAgICAgICAgIFRleHQgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgIH0KKyAgICAgIE9wZXJhdG9yID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkVuZHNXaXRoOworICAgICAgVGV4dCA9IHN0cmluZy5FbXB0eTsKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFbmRzV2l0aCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VuZHNXaXRoKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIG51bGwsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KLSAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9CiAKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIHRleHQgdG8gc2VhcmNoIGluIHRoZSBlbmQgb2YgdGhlIGNlbGwKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBUZXh0IHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fdGV4dEF0dHJpYnV0ZSk7CisgICAgc2V0IHsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3RleHRBdHRyaWJ1dGUsIHZhbHVlKTsKIAotICAgICNyZWdpb24gRXhwb3NlZCBQcm9wZXJ0aWVzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGUgdGV4dCB0byBzZWFyY2ggaW4gdGhlIGVuZCBvZiB0aGUgY2VsbAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBUZXh0Ci0gICAgewotICAgICAgZ2V0Ci0gICAgICB7Ci0gICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKAotICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlRleHRBdHRyaWJ1dGUpOwotICAgICAgfQotICAgICAgc2V0Ci0gICAgICB7Ci0gICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVGV4dEF0dHJpYnV0ZSwKLSAgICAgICAgICB2YWx1ZSk7Ci0KLSAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCisgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKICAgICAgICAgICAiUklHSFQoezB9LExFTihcInsxfVwiKSk9XCJ7MX1cIiIsCiAgICAgICAgICAgQWRkcmVzcy5TdGFydC5BZGRyZXNzLAogICAgICAgICAgIHZhbHVlLlJlcGxhY2UoIlwiIiwgIlwiXCIiKSk7Ci0gICAgICB9CiAgICAgfQotICAgICNlbmRyZWdpb24gRXhwb3NlZCBQcm9wZXJ0aWVzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbC5jcwppbmRleCBhOTNhNjdkLi44YTZlZDQyIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTEgKzEzLDg1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsCi0gICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwKLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOwogCi0gICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwoCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0VxdWFsCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbCB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5FcXVhbCwKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5FcXVhbCwKKyAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBpZiAoaXRlbUVsZW1lbnROb2RlCisgICAgICAgID09IG51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKICAgICB7Ci0gICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKLSAgICAgICAgewotICAgICAgICAgICAgT3BlcmF0b3IgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuRXF1YWw7Ci0gICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkVtcHR5OwotICAgICAgICB9CisgICAgICBPcGVyYXRvciA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5FcXVhbDsKKyAgICAgIEZvcm11bGEgPSBzdHJpbmcuRW1wdHk7CiAgICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbCgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXF1YWwoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBpdGVtRWxlbWVudE5vZGUsIG51bGwpIHt9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbCgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFcXVhbCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbi5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uLmNzCmluZGV4IGM2NTM1OTAuLjhiYTk4MjMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTAgKzEzLDg0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24KLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbgotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24KLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOwogCi0gICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbigKKy8vLyA8c3VtbWFyeT4KKy8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdFeHByZXNzaW9uKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRXhwcmVzc2lvbiwKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5FeHByZXNzaW9uLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIGlmIChpdGVtRWxlbWVudE5vZGUKKyAgICAgICAgPT0gbnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAogICAgIHsKLSAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAotICAgICAgICB7Ci0gICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkVtcHR5OwotICAgICAgICB9CisgICAgICBGb3JtdWxhID0gc3RyaW5nLkVtcHR5OwogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbigKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbigKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0V4cHJlc3Npb24oCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRXhwcmVzc2lvbigKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQuY3MKaW5kZXggNjI3MTI4Zi4uOGM1NTdkNyAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0LmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTY4ICsxMywxMzcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlSWNvblNldAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0CisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25TZXRCYXNlPGVFeGNlbGNvbmRpdGlvbmFsRm9ybWF0dGluZzVJY29uc1NldFR5cGU+LAorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQgewogICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlSWNvblNldAorICAvLy8KICAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQKLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvblNldEJhc2U8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNUljb25zU2V0VHlwZT4sIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0Ci0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICNyZWdpb24gUHJpdmF0ZSBQcm9wZXJ0aWVzCi0KLSAgICAjZW5kcmVnaW9uIFByaXZhdGUgUHJvcGVydGllcwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldCgKKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGaXZlSWNvblNldCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZpdmVJY29uU2V0LAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQotICAgIHsKLSAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZSAhPSBudWxsICYmIGl0ZW1FbGVtZW50Tm9kZS5IYXNDaGlsZE5vZGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxOb2RlIGljb25Ob2RlNCA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDppY29uU2V0L2Q6Y2Z2b1twb3NpdGlvbigpPTRdIiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICBJY29uNCA9IG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZpdmVJY29uU2V0LAotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgICAgICAgICAgICAgIGljb25Ob2RlNCwKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFhtbE5vZGUgaWNvbk5vZGU1ID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOmljb25TZXQvZDpjZnZvW3Bvc2l0aW9uKCk9NV0iLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIEljb241ID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRml2ZUljb25TZXQsCi0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgICAgICAgICAgaWNvbk5vZGU1LAotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE5vZGUgaWNvblNldE5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6aWNvblNldCIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgdmFyIGljb25Ob2RlNCA9IGljb25TZXROb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5DZnZvLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICBpY29uU2V0Tm9kZS5BcHBlbmRDaGlsZChpY29uTm9kZTQpOworICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZpdmVJY29uU2V0LAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIGlmIChpdGVtRWxlbWVudE5vZGUgIT0gbnVsbCAmJiBpdGVtRWxlbWVudE5vZGUuSGFzQ2hpbGROb2RlcykgeworICAgICAgWG1sTm9kZSBpY29uTm9kZTQgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoCisgICAgICAgICAgImQ6aWNvblNldC9kOmNmdm9bcG9zaXRpb24oKT00XSIsCisgICAgICAgICAgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICBJY29uNCA9IG5ldygKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5GaXZlSWNvblNldCwKKyAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICBpY29uTm9kZTQsCisgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7CiAKLSAgICAgICAgICAgIEljb240ID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZShlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudCwKLSAgICAgICAgICAgICAgICAgICAgNjAsCi0gICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQsCi0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgICAgICAgICAgICAgIGljb25Ob2RlNCwKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7CisgICAgICBYbWxOb2RlIGljb25Ob2RlNSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgKKyAgICAgICAgICAiZDppY29uU2V0L2Q6Y2Z2b1twb3NpdGlvbigpPTVdIiwKKyAgICAgICAgICBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgIEljb241ID0gbmV3KAorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZpdmVJY29uU2V0LAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGljb25Ob2RlNSwKKyAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKTsKKyAgICB9IGVsc2UgeworICAgICAgWG1sTm9kZSBpY29uU2V0Tm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDppY29uU2V0IiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICB2YXIgaWNvbk5vZGU0ID0gaWNvblNldE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9jZnZvLAorICAgICAgICAgIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgICBpY29uU2V0Tm9kZS5BcHBlbmRDaGlsZChpY29uTm9kZTQpOwogCi0gICAgICAgICAgICB2YXIgaWNvbk5vZGU1ID0gaWNvblNldE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmdm8sIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgIGljb25TZXROb2RlLkFwcGVuZENoaWxkKGljb25Ob2RlNSk7CisgICAgICBJY29uNCA9IG5ldygKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudCwKKyAgICAgICAgICA2MCwKKyAgICAgICAgICAiIiwKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaWNvbk5vZGU0LAorICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOwogCi0gICAgICAgICAgICBJY29uNSA9IG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUoZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnQsCi0gICAgICAgICAgICAgICAgICAgIDgwLAotICAgICAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0LAotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LAotICAgICAgICAgICAgICAgICAgICBpY29uTm9kZTUsCi0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOwotICAgICAgICB9CisgICAgICB2YXIgaWNvbk5vZGU1ID0gaWNvblNldE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9jZnZvLAorICAgICAgICAgIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgICBpY29uU2V0Tm9kZS5BcHBlbmRDaGlsZChpY29uTm9kZTUpOworCisgICAgICBJY29uNSA9IG5ldygKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudCwKKyAgICAgICAgICA4MCwKKyAgICAgICAgICAiIiwKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaWNvbk5vZGU1LAorICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOwogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZpdmVJY29uU2V0KAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRml2ZUljb25TZXQoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgbnVsbCwgbnVsbCkge30KIAotICAgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjUKLSAgICB7Ci0gICAgICAgIGdldDsKLSAgICAgICAgaW50ZXJuYWwgc2V0OwotICAgIH0KKyAgcHVibGljIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSBJY29uNSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CiAKLSAgICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIEljb240Ci0gICAgewotICAgICAgICBnZXQ7Ci0gICAgICAgIGludGVybmFsIHNldDsKLSAgICB9Ci0gIH0KLSAgfQorICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIEljb240IHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldC5jcwppbmRleCA0NzY0NDFmLi4xNDQzMGI5IDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxNDIgKzEzLDEwOSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOworCiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvblNldEJhc2U8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZT4sCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldDxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlPiB7CiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0CisgIC8vLwogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdGb3VySWNvblNldAotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0QmFzZTxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmc0SWNvbnNTZXRUeXBlPiwgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQ8ZUV4Y2VsY29uZGl0aW9uYWxGb3JtYXR0aW5nNEljb25zU2V0VHlwZT4KLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgI3JlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKLQotICAgICNlbmRyZWdpb24gUHJpdmF0ZSBQcm9wZXJ0aWVzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0KAorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0KAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCi0gICAgewotICAgICAgICBpZihpdGVtRWxlbWVudE5vZGUhPW51bGwgJiYgaXRlbUVsZW1lbnROb2RlLkhhc0NoaWxkTm9kZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE5vZGUgaWNvbk5vZGU0ID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOmljb25TZXQvZDpjZnZvW3Bvc2l0aW9uKCk9NF0iLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIEljb240ID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQsCi0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgICAgICAgICAgaWNvbk5vZGU0LAotICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE5vZGUgaWNvblNldE5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6aWNvblNldCIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgdmFyIGljb25Ob2RlNCA9IGljb25TZXROb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5DZnZvLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICBpY29uU2V0Tm9kZS5BcHBlbmRDaGlsZChpY29uTm9kZTQpOworICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZvdXJJY29uU2V0LAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIGlmIChpdGVtRWxlbWVudE5vZGUgIT0gbnVsbCAmJiBpdGVtRWxlbWVudE5vZGUuSGFzQ2hpbGROb2RlcykgeworICAgICAgWG1sTm9kZSBpY29uTm9kZTQgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoCisgICAgICAgICAgImQ6aWNvblNldC9kOmNmdm9bcG9zaXRpb24oKT00XSIsCisgICAgICAgICAgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICBJY29uNCA9IG5ldygKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Gb3VySWNvblNldCwKKyAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICBpY29uTm9kZTQsCisgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIFhtbE5vZGUgaWNvblNldE5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6aWNvblNldCIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgdmFyIGljb25Ob2RlNCA9IGljb25TZXROb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fY2Z2bywKKyAgICAgICAgICBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgaWNvblNldE5vZGUuQXBwZW5kQ2hpbGQoaWNvbk5vZGU0KTsKIAotCi0gICAgICAgICAgICBJY29uNCA9IG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUoZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnQsCi0gICAgICAgICAgICAgICAgICAgIDc1LAotICAgICAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0LAotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LAotICAgICAgICAgICAgICAgICAgICBpY29uTm9kZTQsCi0gICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOwotICAgICAgICB9CisgICAgICBJY29uNCA9IG5ldygKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudCwKKyAgICAgICAgICA3NSwKKyAgICAgICAgICAiIiwKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaWNvbk5vZGU0LAorICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOwogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ZvdXJJY29uU2V0KAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nRm91ckljb25TZXQoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgbnVsbCwgbnVsbCkge30KIAotICAgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjQKLSAgICB7Ci0gICAgICAgIGdldDsKLSAgICAgICAgaW50ZXJuYWwgc2V0OwotICAgIH0KLSAgICB9Ci0gIH0KKyAgcHVibGljIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSBJY29uNCB7IGdldDsgaW50ZXJuYWwgc2V0OyB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4uY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4uY3MKaW5kZXggZWE1ZWNhYy4uMmUzZDllZSAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTExICsxMyw4NSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOworCiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbgotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbgotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKIAotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuKAorLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbgorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4geworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuR3JlYXRlclRoYW4sCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuR3JlYXRlclRoYW4sCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9wZXJhdG9yID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkdyZWF0ZXJUaGFuOwotICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgfQorICAgICAgT3BlcmF0b3IgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuR3JlYXRlclRoYW47CisgICAgICBGb3JtdWxhID0gc3RyaW5nLkVtcHR5OwogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4oCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4oCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW4oCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwuY3MKaW5kZXggZjBkNjUyYi4uNmExOTQ2NCAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbC5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTEgKzEzLDg1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbAotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwKLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwKLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOwogCi0gICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsKAorLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nR3JlYXRlclRoYW5PckVxdWFsCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkdyZWF0ZXJUaGFuT3JFcXVhbCwKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5HcmVhdGVyVGhhbk9yRXF1YWwsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9wZXJhdG9yID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkdyZWF0ZXJUaGFuT3JFcXVhbDsKLSAgICAgICAgICAgIEZvcm11bGEgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgIH0KKyAgICAgIE9wZXJhdG9yID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkdyZWF0ZXJUaGFuT3JFcXVhbDsKKyAgICAgIEZvcm11bGEgPSBzdHJpbmcuRW1wdHk7CiAgICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0dyZWF0ZXJUaGFuT3JFcXVhbCgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdHcmVhdGVyVGhhbk9yRXF1YWwoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3Q3RGF5cy5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0N0RheXMuY3MKaW5kZXggZWY3MGE5My4uZTI1OTNkMyAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3Q3RGF5cy5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdDdEYXlzLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTIgKzEzLDg0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwoteworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0N0RheXMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0N0RheXMgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCB7CiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdDdEYXlzCisgIC8vLwogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0N0RheXMKLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3Q3RGF5cygKKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0N0RheXMoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MYXN0N0RheXMsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdDdEYXlzLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIGlmIChpdGVtRWxlbWVudE5vZGUKKyAgICAgICAgPT0gbnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAogICAgIHsKLSAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAotICAgICAgICB7Ci0gICAgICAgICAgICBUaW1lUGVyaW9kID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTGFzdDdEYXlzOwotICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCi0gICAgICAgICAgICAgICJBTkQoVE9EQVkoKS1GTE9PUih7MH0sMSk8PTYsRkxPT1IoezB9LDEpPD1UT0RBWSgpKSIsCi0gICAgICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcyk7Ci0gICAgICAgIH0KKyAgICAgIFRpbWVQZXJpb2QgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5MYXN0N0RheXM7CisgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAiQU5EKFRPREFZKCktRkxPT1IoezB9LDEpPD02LEZMT09SKHswfSwxKTw9VE9EQVkoKSkiLAorICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcyk7CiAgICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0N0RheXMoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3Q3RGF5cygKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3Q3RGF5cygKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0N0RheXMoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3RNb250aC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGguY3MKaW5kZXggOTA2ODlkNC4uMWQzMWE0NCAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3RNb250aC5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdE1vbnRoLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTIgKzEzLDg0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwoteworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGgKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGggOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCB7CiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdE1vbnRoCisgIC8vLwogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGgKLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3RNb250aCgKKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGgoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MYXN0TW9udGgsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGFzdE1vbnRoLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIGlmIChpdGVtRWxlbWVudE5vZGUKKyAgICAgICAgPT0gbnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAogICAgIHsKLSAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAotICAgICAgICB7Ci0gICAgICAgICAgICBUaW1lUGVyaW9kID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTGFzdE1vbnRoOwotICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCi0gICAgICAgICAgICAgICJBTkQoTU9OVEgoezB9KT1NT05USChFREFURShUT0RBWSgpLDAtMSkpLFlFQVIoezB9KT1ZRUFSKEVEQVRFKFRPREFZKCksMC0xKSkpIiwKLSAgICAgICAgICAgICAgQWRkcmVzcy5TdGFydC5BZGRyZXNzKTsKLSAgICAgICAgfQorICAgICAgVGltZVBlcmlvZCA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkxhc3RNb250aDsKKyAgICAgIEZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICJBTkQoTU9OVEgoezB9KT1NT05USChFREFURShUT0RBWSgpLDAtMSkpLFlFQVIoezB9KT1ZRUFSKEVEQVRFKFRPREFZKCksMC0xKSkpIiwKKyAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOwogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdE1vbnRoKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGgoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBpdGVtRWxlbWVudE5vZGUsIG51bGwpIHt9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0TW9udGgoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdE1vbnRoKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIG51bGwsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KLSAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgbnVsbCwgbnVsbCkge30KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0V2Vlay5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0V2Vlay5jcwppbmRleCBiMzU2NDk2Li4wNWM2NTEzIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdFdlZWsuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3RXZWVrLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTIgKzEzLDg0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwoteworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0V2VlaworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3RXZWVrIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgewogICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3RXZWVrCisgIC8vLwogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0V2VlawotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAKLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0V2VlaygKKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMYXN0V2VlaygKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxhc3RXZWVrLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxhc3RXZWVrLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIGlmIChpdGVtRWxlbWVudE5vZGUKKyAgICAgICAgPT0gbnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAogICAgIHsKLSAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAotICAgICAgICB7Ci0gICAgICAgICAgICBUaW1lUGVyaW9kID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTGFzdFdlZWs7Ci0gICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKLSAgICAgICAgICAgICAgIkFORChUT0RBWSgpLVJPVU5ERE9XTih7MH0sMCk+PShXRUVLREFZKFRPREFZKCkpKSxUT0RBWSgpLVJPVU5ERE9XTih7MH0sMCk8KFdFRUtEQVkoVE9EQVkoKSkrNykpIiwKLSAgICAgICAgICAgICAgQWRkcmVzcy5TdGFydC5BZGRyZXNzKTsKLSAgICAgICAgfQorICAgICAgVGltZVBlcmlvZCA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLkxhc3RXZWVrOworICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgIkFORChUT0RBWSgpLVJPVU5ERE9XTih7MH0sMCk+PShXRUVLREFZKFRPREFZKCkpKSxUT0RBWSgpLVJPVU5ERE9XTih7MH0sMCk8KFdFRUtEQVkoVE9EQVkoKSkrNykpIiwKKyAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOwogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdFdlZWsoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xhc3RXZWVrKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdFdlZWsoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGFzdFdlZWsoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuLmNzCmluZGV4IDkxY2IyYWMuLmRlMTc4ZWMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbi5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4uY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDExMSArMTMsODUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4KLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbgotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuKAorLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbgorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4geworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGVzc1RoYW4sCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTGVzc1RoYW4sCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9wZXJhdG9yID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkxlc3NUaGFuOwotICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgfQorICAgICAgT3BlcmF0b3IgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTGVzc1RoYW47CisgICAgICBGb3JtdWxhID0gc3RyaW5nLkVtcHR5OwogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4oCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4oCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW4oCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwuY3MKaW5kZXggZTc3NGNmNi4uN2M0M2EyZSAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbC5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW5PckVxdWFsLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTEgKzEzLDg1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbAotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwKLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwKLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOwogCi0gICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW5PckVxdWFsKAorLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW5PckVxdWFsCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTGVzc1RoYW5PckVxdWFsCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkxlc3NUaGFuT3JFcXVhbCwKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5MZXNzVGhhbk9yRXF1YWwsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9wZXJhdG9yID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkxlc3NUaGFuT3JFcXVhbDsKLSAgICAgICAgICAgIEZvcm11bGEgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgIH0KKyAgICAgIE9wZXJhdG9yID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkxlc3NUaGFuT3JFcXVhbDsKKyAgICAgIEZvcm11bGEgPSBzdHJpbmcuRW1wdHk7CiAgICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0xlc3NUaGFuT3JFcXVhbCgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdMZXNzVGhhbk9yRXF1YWwoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRNb250aC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0TW9udGguY3MKaW5kZXggOTg5MzNhNi4uM2Q3NTZmNCAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRNb250aC5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTmV4dE1vbnRoLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTIgKzEzLDg0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwoteworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOworCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0TW9udGgKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0TW9udGggOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCB7CiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTmV4dE1vbnRoCisgIC8vLwogICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0TW9udGgKLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRNb250aCgKKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0TW9udGgoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5OZXh0TW9udGgsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTmV4dE1vbnRoLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIGlmIChpdGVtRWxlbWVudE5vZGUKKyAgICAgICAgPT0gbnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAogICAgIHsKLSAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAotICAgICAgICB7Ci0gICAgICAgICAgICBUaW1lUGVyaW9kID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTmV4dE1vbnRoOwotICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCi0gICAgICAgICAgICAgICJBTkQoTU9OVEgoezB9KT1NT05USChFREFURShUT0RBWSgpLDArMSkpLCBZRUFSKHswfSk9WUVBUihFREFURShUT0RBWSgpLDArMSkpKSIsCi0gICAgICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcyk7Ci0gICAgICAgIH0KKyAgICAgIFRpbWVQZXJpb2QgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5OZXh0TW9udGg7CisgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAiQU5EKE1PTlRIKHswfSk9TU9OVEgoRURBVEUoVE9EQVkoKSwwKzEpKSwgWUVBUih7MH0pPVlFQVIoRURBVEUoVE9EQVkoKSwwKzEpKSkiLAorICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcyk7CiAgICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0TW9udGgoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRNb250aCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRNb250aCgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0TW9udGgoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRXZWVrLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRXZWVrLmNzCmluZGV4IGVkNjEwYmQuLjk1NzI2YTEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0V2Vlay5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTmV4dFdlZWsuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDExMiArMTMsODQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRXZWVrCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTmV4dFdlZWsgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCB7CiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTmV4dFdlZWsKKyAgLy8vCiAgIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRXZWVrCi0gICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cAotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0V2VlaygKKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0V2VlaygKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5leHRXZWVrLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5leHRXZWVrLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIGlmIChpdGVtRWxlbWVudE5vZGUKKyAgICAgICAgPT0gbnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAogICAgIHsKLSAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAotICAgICAgICB7Ci0gICAgICAgICAgICBUaW1lUGVyaW9kID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTmV4dFdlZWs7Ci0gICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKLSAgICAgICAgICAgICAgIkFORChST1VORERPV04oezB9LDApLVRPREFZKCk+KDctV0VFS0RBWShUT0RBWSgpKSksUk9VTkRET1dOKHswfSwwKS1UT0RBWSgpPCgxNS1XRUVLREFZKFRPREFZKCkpKSkiLAotICAgICAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOwotICAgICAgICB9CisgICAgICBUaW1lUGVyaW9kID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuTmV4dFdlZWs7CisgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAiQU5EKFJPVU5ERE9XTih7MH0sMCktVE9EQVkoKT4oNy1XRUVLREFZKFRPREFZKCkpKSxST1VORERPV04oezB9LDApLVRPREFZKCk8KDE1LVdFRUtEQVkoVE9EQVkoKSkpKSIsCisgICAgICAgICAgQWRkcmVzcy5TdGFydC5BZGRyZXNzKTsKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRXZWVrKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOZXh0V2VlaygKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRXZWVrKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05leHRXZWVrKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIG51bGwsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KLSAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgbnVsbCwgbnVsbCkge30KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4uY3MKaW5kZXggMTE2ZGQ2ZC4uNzFjNTY1YyAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4uY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4uY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDExMiArMTMsODYgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2VlbgotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuCi0gICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2VlbgotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuKAorLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2VlbgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4KKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4geworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEJldHdlZW4oCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RCZXR3ZWVuLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdEJldHdlZW4sCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9wZXJhdG9yID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLk5vdEJldHdlZW47Ci0gICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgRm9ybXVsYTIgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgIH0KKyAgICAgIE9wZXJhdG9yID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLk5vdEJldHdlZW47CisgICAgICBGb3JtdWxhID0gc3RyaW5nLkVtcHR5OworICAgICAgRm9ybXVsYTIgPSBzdHJpbmcuRW1wdHk7CiAgICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90QmV0d2VlbigKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RCZXR3ZWVuKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIG51bGwsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KLSAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgbnVsbCwgbnVsbCkge30KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcy5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcy5jcwppbmRleCA4NjA3ZGI0Li5iMGUwNmIyIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTIgKzEzLDg0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzCi0gICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MKLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOwogCi0gICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MoCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0JsYW5rcyB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc0JsYW5rcywKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RDb250YWluc0JsYW5rcywKKyAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBpZiAoaXRlbUVsZW1lbnROb2RlCisgICAgICAgID09IG51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKICAgICB7Ci0gICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKLSAgICAgICAgewotICAgICAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCi0gICAgICAgICAgICAgICJMRU4oVFJJTSh7MH0pKT4wIiwKLSAgICAgICAgICAgICAgQWRkcmVzcy5TdGFydC5BZGRyZXNzKTsKLSAgICAgICAgfQorICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoIkxFTihUUklNKHswfSkpPjAiLCBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOwogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zQmxhbmtzKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNCbGFua3MoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzLmNzCmluZGV4IDliMzA4OTUuLjdkNDJiZDMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0Vycm9ycy5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDExMiArMTMsODQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMKLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0Vycm9ycwotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0Vycm9ycygKKy8vLyA8c3VtbWFyeT4KKy8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNFcnJvcnMKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0Vycm9ycygKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zRXJyb3JzLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zRXJyb3JzLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIGlmIChpdGVtRWxlbWVudE5vZGUKKyAgICAgICAgPT0gbnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAogICAgIHsKLSAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAotICAgICAgICB7Ci0gICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKLSAgICAgICAgICAgICAgIk5PVChJU0VSUk9SKHswfSkpIiwKLSAgICAgICAgICAgICAgQWRkcmVzcy5TdGFydC5BZGRyZXNzKTsKLSAgICAgICAgfQorICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoIk5PVChJU0VSUk9SKHswfSkpIiwgQWRkcmVzcy5TdGFydC5BZGRyZXNzKTsKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc0Vycm9ycygKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zRXJyb3JzKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIG51bGwsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KLSAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgbnVsbCwgbnVsbCkge30KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNUZXh0LmNzCmluZGV4IDdiOGFjNDYuLjI3OWQ2YjQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTM4ICsxMywxMDAgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNUZXh0Ci0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dAotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dAotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQoCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dCB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90Q29udGFpbnNUZXh0KAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuTm90Q29udGFpbnNUZXh0LAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLk5vdENvbnRhaW5zVGV4dCwKKyAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBpZiAoaXRlbUVsZW1lbnROb2RlCisgICAgICAgID09IG51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKICAgICB7Ci0gICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKLSAgICAgICAgewotICAgICAgICAgICAgT3BlcmF0b3IgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTm90Q29udGFpbnM7Ci0gICAgICAgICAgICBUZXh0ID0gc3RyaW5nLkVtcHR5OwotICAgICAgICB9CisgICAgICBPcGVyYXRvciA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Ob3RDb250YWluczsKKyAgICAgIFRleHQgPSBzdHJpbmcuRW1wdHk7CiAgICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdENvbnRhaW5zVGV4dCgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RDb250YWluc1RleHQoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgbnVsbCwgbnVsbCkge30KIAotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgdGV4dCB0byBzZWFyY2ggaW5zaWRlIHRoZSBjZWxsCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgVGV4dCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVTdHJpbmcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3RleHRBdHRyaWJ1dGUpOworICAgIHNldCB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl90ZXh0QXR0cmlidXRlLCB2YWx1ZSk7CiAKLSAgICAjcmVnaW9uIEV4cG9zZWQgUHJvcGVydGllcwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhlIHRleHQgdG8gc2VhcmNoIGluc2lkZSB0aGUgY2VsbAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBUZXh0Ci0gICAgewotICAgICAgZ2V0Ci0gICAgICB7Ci0gICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKAotICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlRleHRBdHRyaWJ1dGUpOwotICAgICAgfQotICAgICAgc2V0Ci0gICAgICB7Ci0gICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVGV4dEF0dHJpYnV0ZSwKLSAgICAgICAgICB2YWx1ZSk7Ci0KLSAgICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoCisgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKICAgICAgICAgICAiSVNFUlJPUihTRUFSQ0goXCJ7MX1cIix7MH0pKSIsCiAgICAgICAgICAgQWRkcmVzcy5TdGFydC5BZGRyZXNzLAogICAgICAgICAgIHZhbHVlLlJlcGxhY2UoIlwiIiwgIlwiXCIiKSk7Ci0gICAgICB9CiAgICAgfQotICAgICNlbmRyZWdpb24gRXhwb3NlZCBQcm9wZXJ0aWVzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbC5jcwppbmRleCAwNmQ4ZDA1Li5lODgyNjgyIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTEgKzEzLDg1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsCi0gICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwKLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOwogCi0gICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwoCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ05vdEVxdWFsCisgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbCB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RFcXVhbCwKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ob3RFcXVhbCwKKyAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBpZiAoaXRlbUVsZW1lbnROb2RlCisgICAgICAgID09IG51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKICAgICB7Ci0gICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKLSAgICAgICAgewotICAgICAgICAgICAgT3BlcmF0b3IgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuTm90RXF1YWw7Ci0gICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkVtcHR5OwotICAgICAgICB9CisgICAgICBPcGVyYXRvciA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZS5Ob3RFcXVhbDsKKyAgICAgIEZvcm11bGEgPSBzdHJpbmcuRW1wdHk7CiAgICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbCgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nTm90RXF1YWwoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBpdGVtRWxlbWVudE5vZGUsIG51bGwpIHt9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbCgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdOb3RFcXVhbCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLmNzCmluZGV4IGFlMjg1YjEuLmE5YTEyYWUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw2MTYgKzEzLDQ3NyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CiB1c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKLXVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIHVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGUuRHhmOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKKy8vLyA8c3VtbWFyeT4KKy8vLworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUgOiBYbWxIZWxwZXIsIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUgeworICBwcml2YXRlIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlPyBfdHlwZTsKKyAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OworCiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIAorICAvLy8gU2luYWxpemUgdGhhdCB3ZSBhcmUgaW4gYSBDbmFnaW5nIFByaW9yaXRpZXMgb3BlYXJ0aW9uIHNvIHRoYXQgd2Ugd29uJ3QgZW50ZXIKKyAgLy8vIGEgcmVjdXJzaXZlIGxvb3AuCiAgIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUKLSAgICA6IFhtbEhlbHBlciwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBfY2hhbmdpbmdQcmlvcml0eTsKIAotICAgICNyZWdpb24gUHJpdmF0ZSBQcm9wZXJ0aWVzCi0gICAgcHJpdmF0ZSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZT8gX3R5cGU7Ci0gICAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OwotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBTaW5hbGl6ZSB0aGF0IHdlIGFyZSBpbiBhIENuYWdpbmcgUHJpb3JpdGllcyBvcGVhcnRpb24gc28gdGhhdCB3ZSB3b24ndCBlbnRlcgotICAgIC8vLyBhIHJlY3Vyc2l2ZSBsb29wLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBfY2hhbmdpbmdQcmlvcml0eSA9IGZhbHNlOwotICAgICNlbmRyZWdpb24gUHJpdmF0ZSBQcm9wZXJ0aWVzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBJbml0aWFsaXplIHRoZSA8c2VlIGNyZWY9IkV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSIvPgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij5Vc2VkIGFsc28gYXMgdGhlIGNmUnVsZSB1bmlxdWUga2V5PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbml0aWFsaXplIHRoZSA8c2VlIGNyZWY9IkV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSIvPgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+VXNlZCBhbHNvIGFzIHRoZSBjZlJ1bGUgdW5pcXVlIGtleTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUoCiAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSB0eXBlLAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKLSAgICAgIDogYmFzZSgKLSAgICAgICAgbmFtZXNwYWNlTWFuYWdlciwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlKQotICAgIHsKLSAgICAgIFJlcXVpcmUuQXJndW1lbnQoYWRkcmVzcykuSXNOb3ROdWxsKCJhZGRyZXNzIik7Ci0gICAgICBSZXF1aXJlLkFyZ3VtZW50KHByaW9yaXR5KS5Jc0luUmFuZ2UoMSwgaW50Lk1heFZhbHVlLCAicHJpb3JpdHkiKTsKLSAgICAgIFJlcXVpcmUuQXJndW1lbnQod29ya3NoZWV0KS5Jc05vdE51bGwoIndvcmtzaGVldCIpOworICAgICAgOiBiYXNlKG5hbWVzcGFjZU1hbmFnZXIsIGl0ZW1FbGVtZW50Tm9kZSkgeworICAgIFJlcXVpcmUuQXJndW1lbnQoYWRkcmVzcykuSXNOb3ROdWxsKCJhZGRyZXNzIik7CisgICAgUmVxdWlyZS5Bcmd1bWVudChwcmlvcml0eSkuSXNJblJhbmdlKDEsIGludC5NYXhWYWx1ZSwgInByaW9yaXR5Iik7CisgICAgUmVxdWlyZS5Bcmd1bWVudCh3b3Jrc2hlZXQpLklzTm90TnVsbCgid29ya3NoZWV0Iik7CiAKLSAgICAgIF90eXBlID0gdHlwZTsKLSAgICAgIF93b3Jrc2hlZXQgPSB3b3Jrc2hlZXQ7Ci0gICAgICBTY2hlbWFOb2RlT3JkZXIgPSBfd29ya3NoZWV0LlNjaGVtYU5vZGVPcmRlcjsKKyAgICBfdHlwZSA9IHR5cGU7CisgICAgX3dvcmtzaGVldCA9IHdvcmtzaGVldDsKKyAgICBTY2hlbWFOb2RlT3JkZXIgPSBfd29ya3NoZWV0LlNjaGVtYU5vZGVPcmRlcjsKIAotICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZSA9PSBudWxsKQotICAgICAgewotICAgICAgICAvLyBDcmVhdGUvR2V0IHRoZSA8Y2ZSdWxlPiBpbnNpZGUgPGNvbmRpdGlvbmFsRm9ybWF0dGluZz4KLSAgICAgICAgaXRlbUVsZW1lbnROb2RlID0gQ3JlYXRlQ29tcGxleE5vZGUoCisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZSA9PSBudWxsKSB7CisgICAgICAvLyBDcmVhdGUvR2V0IHRoZSA8Y2ZSdWxlPiBpbnNpZGUgPGNvbmRpdGlvbmFsRm9ybWF0dGluZz4KKyAgICAgIGl0ZW1FbGVtZW50Tm9kZSA9IENyZWF0ZUNvbXBsZXhOb2RlKAogICAgICAgICAgIF93b3Jrc2hlZXQuV29ya3NoZWV0WG1sLkRvY3VtZW50RWxlbWVudCwKICAgICAgICAgICBzdHJpbmcuRm9ybWF0KAotICAgICAgICAgICAgInswfVt7MX09J3syfSddL3sxfT0nezJ9Jy97M31bezR9PSd7NX0nXS97NH09J3s1fSciLAotICAgICAgICAgIC8vezB9Ci0gICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Db25kaXRpb25hbEZvcm1hdHRpbmcsCi0gICAgICAgICAgLy8gezF9Ci0gICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5TcXJlZkF0dHJpYnV0ZSwKLSAgICAgICAgICAvLyB7Mn0KLSAgICAgICAgICAgIGFkZHJlc3MuQWRkcmVzc1NwYWNlU2VwYXJhdGVkLCAgICAgICAgICAvL0NGIG5vZGUgZG9uJ3Qgd2hhdCB0byBoYXZlIGNvbW1hIGJldHdlZW4gbXVsdGkgYWRkcmVzc2VzLCB1c2Ugc3BhY2UgaW5zdGVhZC4KLSAgICAgICAgICAvLyB7M30KLSAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmUnVsZSwKLSAgICAgICAgICAvL3s0fQotICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuUHJpb3JpdHlBdHRyaWJ1dGUsCi0gICAgICAgICAgLy97NX0KLSAgICAgICAgICAgIHByaW9yaXR5KSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFBvaW50IHRvIDxjZlJ1bGU+Ci0gICAgICBUb3BOb2RlID0gaXRlbUVsZW1lbnROb2RlOwotCi0gICAgICBBZGRyZXNzID0gYWRkcmVzczsKLSAgICAgIFByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgICBUeXBlID0gdHlwZTsKLSAgICAgIGlmIChEeGZJZCA+PSAwKQotICAgICAgewotICAgICAgICAgIHdvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXMuRHhmc1tEeGZJZF0uQWxsb3dDaGFuZ2UgPSB0cnVlOyAgLy9UaGlzIElkIGlzIHJlZmVyZW5jZWQgYnkgQ0YsIHNvIHdlIGNhbiB1c2UgaXQgd2hlbiB3ZSBzYXZlLgotICAgICAgICAgIF9zdHlsZSA9IHdvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXMuRHhmc1tEeGZJZF0uQ2xvbmUoKTsgICAgLy9DbG9uZSwgc28gaXQgY2FuIGJlIGFsdGVyZWQgd2l0aG91dCBlZmZlY3Rpbmcgb3RoZXIgZHhmIHN0eWxlcwotICAgICAgfQorICAgICAgICAgICAgICAiezB9W3sxfT0nezJ9J10vezF9PSd7Mn0nL3szfVt7NH09J3s1fSddL3s0fT0nezV9JyIsCisgICAgICAgICAgICAgIC8vezB9CisgICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9jb25kaXRpb25hbEZvcm1hdHRpbmcsCisgICAgICAgICAgICAgIC8vIHsxfQorICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fc3FyZWZBdHRyaWJ1dGUsCisgICAgICAgICAgICAgIC8vIHsyfQorICAgICAgICAgICAgICBhZGRyZXNzLkFkZHJlc3NTcGFjZVNlcGFyYXRlZCwgLy9DRiBub2RlIGRvbid0IHdoYXQgdG8gaGF2ZSBjb21tYSBiZXR3ZWVuIG11bHRpIGFkZHJlc3NlcywgdXNlIHNwYWNlIGluc3RlYWQuCisgICAgICAgICAgICAgIC8vIHszfQorICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fY2ZSdWxlLAorICAgICAgICAgICAgICAvL3s0fQorICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fcHJpb3JpdHlBdHRyaWJ1dGUsCisgICAgICAgICAgICAgIC8vezV9CisgICAgICAgICAgICAgIHByaW9yaXR5KSk7CiAgICAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBJbml0aWFsaXplIHRoZSA8c2VlIGNyZWY9IkV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSIvPgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUoCisgICAgLy8gUG9pbnQgdG8gPGNmUnVsZT4KKyAgICBUb3BOb2RlID0gaXRlbUVsZW1lbnROb2RlOworCisgICAgQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgUHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICBUeXBlID0gdHlwZTsKKyAgICBpZiAoRHhmSWQgPj0gMCkgeworICAgICAgd29ya3NoZWV0Lldvcmtib29rLlN0eWxlcy5EeGZzW0R4ZklkXS5BbGxvd0NoYW5nZSA9IHRydWU7IC8vVGhpcyBJZCBpcyByZWZlcmVuY2VkIGJ5IENGLCBzbyB3ZSBjYW4gdXNlIGl0IHdoZW4gd2Ugc2F2ZS4KKyAgICAgIF9zdHlsZSA9IHdvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXMuRHhmc1tEeGZJZF0uQ2xvbmUoKTsgLy9DbG9uZSwgc28gaXQgY2FuIGJlIGFsdGVyZWQgd2l0aG91dCBlZmZlY3Rpbmcgb3RoZXIgZHhmIHN0eWxlcworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluaXRpYWxpemUgdGhlIDxzZWUgY3JlZj0iRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlIi8+CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUoCiAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSB0eXBlLAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIHR5cGUsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIG51bGwsCi0gICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpCi0gICAgewotICAgIH0KLSAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworICAgICAgOiB0aGlzKHR5cGUsIGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG5hbWVzcGFjZU1hbmFnZXIpIHt9CiAKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0IHRoZSAmbHQ7Y2ZSdWxlJmd0OyBub2RlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBYbWxOb2RlIE5vZGUgPT4gVG9wTm9kZTsKIAotICAgICNyZWdpb24gTWV0aG9kcwotICAgICNlbmRyZWdpb24gTWV0aG9kcworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRyZXNzIG9mIHRoZSBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPgorICAvLy8gVGhlIGFkZHJlc3MgaXMgc3RvcmVzIGluIGEgcGFyZW50IG5vZGUgY2FsbGVkICZsdDtjb25kaXRpb25hbEZvcm1hdHRpbmcmZ3Q7IGluIHRoZQorICAvLy8gQHNxcmVmIGF0dHJpYnV0ZS4gRXhjZWwgZ3JvdXBzIHJ1bGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBhZGRyZXNzIGluc2lkZSBvbmUgbm9kZS4KKyAgLy8vIDwvcmVtYXJrcz4KKyAgcHVibGljIEV4Y2VsQWRkcmVzcyBBZGRyZXNzIHsKKyAgICBnZXQgPT4KKyAgICAgIG5ldyhOb2RlLlBhcmVudE5vZGUuQXR0cmlidXRlc1tFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5BdHRyaWJ1dGVzLl9zcXJlZl0uVmFsdWUpOworICAgIHNldCB7CisgICAgICAvLyBDaGVjayBpZiB0aGUgYWRkcmVzcyBpcyB0byBiZSBjaGFuZ2VkCisgICAgICBpZiAoQWRkcmVzcy5BZGRyZXNzICE9IHZhbHVlLkFkZHJlc3MpIHsKKyAgICAgICAgLy8gU2F2ZSB0aGUgb2xkIHBhcmVudGUgbm9kZQorICAgICAgICBYbWxOb2RlIG9sZE5vZGUgPSBOb2RlOworICAgICAgICBYbWxOb2RlIG9sZFBhcmVudE5vZGUgPSBOb2RlLlBhcmVudE5vZGU7CiAKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICNyZWdpb24gRXhwb3NlZCBQcm9wZXJ0aWVzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBHZXQgdGhlICZsdDtjZlJ1bGUmZ3Q7IG5vZGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBYbWxOb2RlIE5vZGUKLSAgICB7Ci0gICAgICBnZXQgeyByZXR1cm4gVG9wTm9kZTsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWRkcmVzcyBvZiB0aGUgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+Ci0gICAgLy8vIFRoZSBhZGRyZXNzIGlzIHN0b3JlcyBpbiBhIHBhcmVudCBub2RlIGNhbGxlZCAmbHQ7Y29uZGl0aW9uYWxGb3JtYXR0aW5nJmd0OyBpbiB0aGUKLSAgICAvLy8gQHNxcmVmIGF0dHJpYnV0ZS4gRXhjZWwgZ3JvdXBzIHJ1bGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBhZGRyZXNzIGluc2lkZSBvbmUgbm9kZS4KLSAgICAvLy8gPC9yZW1hcmtzPgotICAgIHB1YmxpYyBFeGNlbEFkZHJlc3MgQWRkcmVzcwotICAgIHsKLSAgICAgIGdldAotICAgICAgewotICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQWRkcmVzcygKLSAgICAgICAgICBOb2RlLlBhcmVudE5vZGUuQXR0cmlidXRlc1tFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5BdHRyaWJ1dGVzLlNxcmVmXS5WYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBzZXQKLSAgICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGFkZHJlc3MgaXMgdG8gYmUgY2hhbmdlZAotICAgICAgICBpZiAoQWRkcmVzcy5BZGRyZXNzICE9IHZhbHVlLkFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBTYXZlIHRoZSBvbGQgcGFyZW50ZSBub2RlCi0gICAgICAgICAgWG1sTm9kZSBvbGROb2RlID0gTm9kZTsKLSAgICAgICAgICBYbWxOb2RlIG9sZFBhcmVudE5vZGUgPSBOb2RlLlBhcmVudE5vZGU7Ci0KLSAgICAgICAgICAvLyBDcmVhdGUvR2V0IHRoZSBuZXcgPGNvbmRpdGlvbmFsRm9ybWF0dGluZz4gcGFyZW50IG5vZGUKLSAgICAgICAgICBYbWxOb2RlIG5ld1BhcmVudE5vZGUgPSBDcmVhdGVDb21wbGV4Tm9kZSgKKyAgICAgICAgLy8gQ3JlYXRlL0dldCB0aGUgbmV3IDxjb25kaXRpb25hbEZvcm1hdHRpbmc+IHBhcmVudCBub2RlCisgICAgICAgIFhtbE5vZGUgbmV3UGFyZW50Tm9kZSA9IENyZWF0ZUNvbXBsZXhOb2RlKAogICAgICAgICAgICAgX3dvcmtzaGVldC5Xb3Jrc2hlZXRYbWwuRG9jdW1lbnRFbGVtZW50LAogICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKLSAgICAgICAgICAgICAgInswfVt7MX09J3syfSddL3sxfT0nezJ9JyIsCi0gICAgICAgICAgICAvL3swfQotICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Db25kaXRpb25hbEZvcm1hdHRpbmcsCi0gICAgICAgICAgICAvLyB7MX0KLSAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuU3FyZWZBdHRyaWJ1dGUsCi0gICAgICAgICAgICAvLyB7Mn0KLSAgICAgICAgICAgICAgdmFsdWUuQWRkcmVzc1NwYWNlU2VwYXJhdGVkKSk7IAorICAgICAgICAgICAgICAgICJ7MH1bezF9PSd7Mn0nXS97MX09J3syfSciLAorICAgICAgICAgICAgICAgIC8vezB9CisgICAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX2NvbmRpdGlvbmFsRm9ybWF0dGluZywKKyAgICAgICAgICAgICAgICAvLyB7MX0KKyAgICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fc3FyZWZBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgLy8gezJ9CisgICAgICAgICAgICAgICAgdmFsdWUuQWRkcmVzc1NwYWNlU2VwYXJhdGVkKSk7CiAKLSAgICAgICAgICAvLyBNb3ZlIHRoZSA8Y2ZSdWxlPiBub2RlIHRvIHRoZSBuZXcgPGNvbmRpdGlvbmFsRm9ybWF0dGluZz4gcGFyZW50IG5vZGUKLSAgICAgICAgICBUb3BOb2RlID0gbmV3UGFyZW50Tm9kZS5BcHBlbmRDaGlsZChOb2RlKTsKKyAgICAgICAgLy8gTW92ZSB0aGUgPGNmUnVsZT4gbm9kZSB0byB0aGUgbmV3IDxjb25kaXRpb25hbEZvcm1hdHRpbmc+IHBhcmVudCBub2RlCisgICAgICAgIFRvcE5vZGUgPSBuZXdQYXJlbnROb2RlLkFwcGVuZENoaWxkKE5vZGUpOwogCi0gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG9sZCA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPiBwYXJlbnQgbm9kZSBoYXMgPGNmUnVsZT4gbm9kZSBpbnNpZGUgaXQKLSAgICAgICAgICBpZiAoIW9sZFBhcmVudE5vZGUuSGFzQ2hpbGROb2RlcykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIG9sZCBwYXJlbnQgbm9kZQotICAgICAgICAgICAgb2xkUGFyZW50Tm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKG9sZFBhcmVudE5vZGUpOwotICAgICAgICAgIH0KKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG9sZCA8Y29uZGl0aW9uYWxGb3JtYXR0aW5nPiBwYXJlbnQgbm9kZSBoYXMgPGNmUnVsZT4gbm9kZSBpbnNpZGUgaXQKKyAgICAgICAgaWYgKCFvbGRQYXJlbnROb2RlLkhhc0NoaWxkTm9kZXMpIHsKKyAgICAgICAgICAvLyBSZW1vdmUgdGhlIG9sZCBwYXJlbnQgbm9kZQorICAgICAgICAgIG9sZFBhcmVudE5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChvbGRQYXJlbnROb2RlKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUeXBlIG9mIGNvbmRpdGlvbmFsIGZvcm1hdHRpbmcgcnVsZS4gU1RfQ2ZUeXBlIMKnMTguMTguMTIuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgVHlwZQotICAgIHsKLSAgICAgIGdldAotICAgICAgewotICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIEB0eXBlIGF0dHJpYnV0ZSB0byBFUFBsdXMgUnVsZSBUeXBlIChzbGlnaHR5IGRpZmVyZW50ZSkKLSAgICAgICAgaWYoX3R5cGU9PW51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBfdHlwZSA9IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuR2V0VHlwZUJ5QXR0cmJpdXRlKAotICAgICAgICAgIEdldFhtbE5vZGVTdHJpbmcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuVHlwZUF0dHJpYnV0ZSksCi0gICAgICAgICAgVG9wTm9kZSwKLSAgICAgICAgICBfd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUpX3R5cGU7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFR5cGUgb2YgY29uZGl0aW9uYWwgZm9ybWF0dGluZyBydWxlLiBTVF9DZlR5cGUgwqcxOC4xOC4xMi4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIFR5cGUgeworICAgIGdldCB7CisgICAgICAvLyBUcmFuc2Zvcm0gdGhlIEB0eXBlIGF0dHJpYnV0ZSB0byBFUFBsdXMgUnVsZSBUeXBlIChzbGlnaHR5IGRpZmVyZW50ZSkKKyAgICAgIGlmIChfdHlwZSA9PSBudWxsKSB7CisgICAgICAgIF90eXBlID0gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5HZXRUeXBlQnlBdHRyYml1dGUoCisgICAgICAgICAgICBHZXRYbWxOb2RlU3RyaW5nKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl90eXBlQXR0cmlidXRlKSwKKyAgICAgICAgICAgIFRvcE5vZGUsCisgICAgICAgICAgICBfd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpOwogICAgICAgfQotICAgICAgaW50ZXJuYWwgc2V0Ci0gICAgICB7Ci0gICAgICAgICAgX3R5cGUgPSB2YWx1ZTsKLSAgICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIEVQUGx1cyBSdWxlIFR5cGUgdG8gQHR5cGUgYXR0cmlidXRlIChzbGlnaHR5IGRpZmVyZW50ZSkKLSAgICAgICAgU2V0WG1sTm9kZVN0cmluZygKLSAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5UeXBlQXR0cmlidXRlLAorICAgICAgcmV0dXJuIChlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSlfdHlwZTsKKyAgICB9CisgICAgaW50ZXJuYWwgc2V0IHsKKyAgICAgIF90eXBlID0gdmFsdWU7CisgICAgICAvLyBUcmFuc2Zvcm0gdGhlIEVQUGx1cyBSdWxlIFR5cGUgdG8gQHR5cGUgYXR0cmlidXRlIChzbGlnaHR5IGRpZmVyZW50ZSkKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3R5cGVBdHRyaWJ1dGUsCiAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5HZXRBdHRyaWJ1dGVCeVR5cGUodmFsdWUpLAogICAgICAgICAgIHRydWUpOwotICAgICAgfQogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGUgcHJpb3JpdHkgb2YgdGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUuIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBkZXRlcm1pbmUKLSAgICAvLy8gd2hpY2ggZm9ybWF0IHNob3VsZCBiZSBldmFsdWF0ZWQgYW5kIHJlbmRlcmVkLiBMb3dlciBudW1lcmljIHZhbHVlcyBhcmUgaGlnaGVyCi0gICAgLy8vIHByaW9yaXR5IHRoYW4gaGlnaGVyIG51bWVyaWMgdmFsdWVzLCB3aGVyZSAxIGlzIHRoZSBoaWdoZXN0IHByaW9yaXR5LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGludCBQcmlvcml0eQotICAgIHsKLSAgICAgIGdldAotICAgICAgewotICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludCgKLSAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Qcmlvcml0eUF0dHJpYnV0ZSk7Ci0gICAgICB9Ci0gICAgICBzZXQKLSAgICAgIHsKLSAgICAgICAgLy8gU2F2ZSB0aGUgY3VycmVudCBDRiBydWxlIHByaW9yaXR5Ci0gICAgICAgIGludCBwcmlvcml0eSA9IFByaW9yaXR5OworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgcHJpb3JpdHkgb2YgdGhpcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nIHJ1bGUuIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBkZXRlcm1pbmUKKyAgLy8vIHdoaWNoIGZvcm1hdCBzaG91bGQgYmUgZXZhbHVhdGVkIGFuZCByZW5kZXJlZC4gTG93ZXIgbnVtZXJpYyB2YWx1ZXMgYXJlIGhpZ2hlcgorICAvLy8gcHJpb3JpdHkgdGhhbiBoaWdoZXIgbnVtZXJpYyB2YWx1ZXMsIHdoZXJlIDEgaXMgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgUHJpb3JpdHkgeworICAgIGdldCA9PiBHZXRYbWxOb2RlSW50KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9wcmlvcml0eUF0dHJpYnV0ZSk7CisgICAgc2V0IHsKKyAgICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgQ0YgcnVsZSBwcmlvcml0eQorICAgICAgaW50IHByaW9yaXR5ID0gUHJpb3JpdHk7CiAKLSAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIEBwcmlvcml0eSBpcyB0byBiZSBjaGFuZ2VkCi0gICAgICAgIGlmIChwcmlvcml0eSAhPSB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBub3QgYWxyZWFkeSBpbnNpZGUgYSAiQ2hhbmdlIFByaW9yaXR5IiBvcGVyYXRpb24KLSAgICAgICAgICBpZiAoIV9jaGFuZ2luZ1ByaW9yaXR5KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA8IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLkludmFsaWRQcmlvcml0eSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFNpbmFsaXplIHRoYXQgd2UgYXJlIGFscmVhZHkgY2hhbmdpbmcgY2ZSdWxlcyBwcmlvcml0aWVzCi0gICAgICAgICAgICBfY2hhbmdpbmdQcmlvcml0eSA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGxvd2VyZWQgdGhlIHByaW9yaXR5Ci0gICAgICAgICAgICBpZiAocHJpb3JpdHkgPiB2YWx1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHByaW9yaXR5IC0gMTsgaSA+PSB2YWx1ZTsgaS0tKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGNmUnVsZSA9IF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLlJ1bGVzQnlQcmlvcml0eShpKTsKLQotICAgICAgICAgICAgICAgIGlmIChjZlJ1bGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjZlJ1bGUuUHJpb3JpdHkrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHByaW9yaXR5ICsgMTsgaSA8PSB2YWx1ZTsgaSsrKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGNmUnVsZSA9IF93b3Jrc2hlZXQuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLlJ1bGVzQnlQcmlvcml0eShpKTsKLQotICAgICAgICAgICAgICAgIGlmIChjZlJ1bGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBjZlJ1bGUuUHJpb3JpdHktLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2luYWxpemUgdGhhdCB3ZSBhcmUgbm8gbG9uZ2VyIGNoYW5naW5nIGNmUnVsZXMgcHJpb3JpdGllcwotICAgICAgICAgICAgX2NoYW5naW5nUHJpb3JpdHkgPSBmYWxzZTsKKyAgICAgIC8vIENoZWNrIGlmIHRoZSBAcHJpb3JpdHkgaXMgdG8gYmUgY2hhbmdlZAorICAgICAgaWYgKHByaW9yaXR5ICE9IHZhbHVlKSB7CisgICAgICAgIC8vIENoZWNrIGlmIHdlIGFyZSBub3QgYWxyZWFkeSBpbnNpZGUgYSAiQ2hhbmdlIFByaW9yaXR5IiBvcGVyYXRpb24KKyAgICAgICAgaWYgKCFfY2hhbmdpbmdQcmlvcml0eSkgeworICAgICAgICAgIGlmICh2YWx1ZSA8IDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuRXJyb3JzLl9pbnZhbGlkUHJpb3JpdHkpOwogICAgICAgICAgIH0KIAotICAgICAgICAgIC8vIENoYW5nZSB0aGUgcHJpb3JpdHkgaW4gdGhlIFhNTAotICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCi0gICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Qcmlvcml0eUF0dHJpYnV0ZSwKKyAgICAgICAgICAvLyBTaW5hbGl6ZSB0aGF0IHdlIGFyZSBhbHJlYWR5IGNoYW5naW5nIGNmUnVsZXMgcHJpb3JpdGllcworICAgICAgICAgIF9jaGFuZ2luZ1ByaW9yaXR5ID0gdHJ1ZTsKKworICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGxvd2VyZWQgdGhlIHByaW9yaXR5CisgICAgICAgICAgaWYgKHByaW9yaXR5ID4gdmFsdWUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBwcmlvcml0eSAtIDE7IGkgPj0gdmFsdWU7IGktLSkgeworICAgICAgICAgICAgICB2YXIgY2ZSdWxlID0gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuUnVsZXNCeVByaW9yaXR5KGkpOworCisgICAgICAgICAgICAgIGlmIChjZlJ1bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNmUnVsZS5Qcmlvcml0eSsrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBwcmlvcml0eSArIDE7IGkgPD0gdmFsdWU7IGkrKykgeworICAgICAgICAgICAgICB2YXIgY2ZSdWxlID0gX3dvcmtzaGVldC5Db25kaXRpb25hbEZvcm1hdHRpbmcuUnVsZXNCeVByaW9yaXR5KGkpOworCisgICAgICAgICAgICAgIGlmIChjZlJ1bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNmUnVsZS5Qcmlvcml0eS0tOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorCisgICAgICAgICAgLy8gU2luYWxpemUgdGhhdCB3ZSBhcmUgbm8gbG9uZ2VyIGNoYW5naW5nIGNmUnVsZXMgcHJpb3JpdGllcworICAgICAgICAgIF9jaGFuZ2luZ1ByaW9yaXR5ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGFuZ2UgdGhlIHByaW9yaXR5IGluIHRoZSBYTUwKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9wcmlvcml0eUF0dHJpYnV0ZSwKICAgICAgICAgICAgIHZhbHVlLlRvU3RyaW5nKCksCiAgICAgICAgICAgICB0cnVlKTsKLSAgICAgICAgfQogICAgICAgfQogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBJZiB0aGlzIGZsYWcgaXMgdHJ1ZSwgbm8gcnVsZXMgd2l0aCBsb3dlciBwcmlvcml0eSBzaGFsbCBiZSBhcHBsaWVkIG92ZXIgdGhpcyBydWxlLAotICAgIC8vLyB3aGVuIHRoaXMgcnVsZSBldmFsdWF0ZXMgdG8gdHJ1ZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBib29sIFN0b3BJZlRydWUKLSAgICB7Ci0gICAgICBnZXQKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKAotICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlN0b3BJZlRydWVBdHRyaWJ1dGUpOwotICAgICAgfQotICAgICAgc2V0Ci0gICAgICB7Ci0gICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuU3RvcElmVHJ1ZUF0dHJpYnV0ZSwKLSAgICAgICAgICAodmFsdWUgPT0gdHJ1ZSkgPyAiMSIgOiBzdHJpbmcuRW1wdHksCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElmIHRoaXMgZmxhZyBpcyB0cnVlLCBubyBydWxlcyB3aXRoIGxvd2VyIHByaW9yaXR5IHNoYWxsIGJlIGFwcGxpZWQgb3ZlciB0aGlzIHJ1bGUsCisgIC8vLyB3aGVuIHRoaXMgcnVsZSBldmFsdWF0ZXMgdG8gdHJ1ZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgU3RvcElmVHJ1ZSB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9zdG9wSWZUcnVlQXR0cmlidXRlKTsKKyAgICBzZXQgPT4KKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3N0b3BJZlRydWVBdHRyaWJ1dGUsCisgICAgICAgICAgdmFsdWUgPyAiMSIgOiBzdHJpbmcuRW1wdHksCiAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIER4ZklkIFN0eWxlIEF0dHJpYnV0ZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgaW50IER4ZklkCi0gICAgewotICAgICAgZ2V0Ci0gICAgICB7Ci0gICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KAotICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkR4ZklkQXR0cmlidXRlKTsKLSAgICAgIH0KLSAgICAgIHNldAotICAgICAgewotICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKAotICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkR4ZklkQXR0cmlidXRlLAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBEeGZJZCBTdHlsZSBBdHRyaWJ1dGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgaW50IER4ZklkIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUludChFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fZHhmSWRBdHRyaWJ1dGUpOworICAgIHNldCA9PgorICAgICAgU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fZHhmSWRBdHRyaWJ1dGUsCiAgICAgICAgICAgKHZhbHVlID09IGludC5NaW5WYWx1ZSkgPyBzdHJpbmcuRW1wdHkgOiB2YWx1ZS5Ub1N0cmluZygpLAogICAgICAgICAgIHRydWUpOworICB9CisKKyAgaW50ZXJuYWwgRXhjZWxEeGZTdHlsZUNvbmRpdGlvbmFsRm9ybWF0dGluZyBfc3R5bGU7CisKKyAgcHVibGljIEV4Y2VsRHhmU3R5bGVDb25kaXRpb25hbEZvcm1hdHRpbmcgU3R5bGUgeworICAgIGdldCB7CisgICAgICBpZiAoX3N0eWxlID09IG51bGwpIHsKKyAgICAgICAgX3N0eWxlID0gbmV3KE5hbWVTcGFjZU1hbmFnZXIsIG51bGwsIF93b3Jrc2hlZXQuV29ya2Jvb2suU3R5bGVzKTsKICAgICAgIH0KKyAgICAgIHJldHVybiBfc3R5bGU7CiAgICAgfQotICAgIGludGVybmFsIEV4Y2VsRHhmU3R5bGVDb25kaXRpb25hbEZvcm1hdHRpbmcgX3N0eWxlID0gbnVsbDsKLSAgICBwdWJsaWMgRXhjZWxEeGZTdHlsZUNvbmRpdGlvbmFsRm9ybWF0dGluZyBTdHlsZQotICAgIHsKLSAgICAgICAgZ2V0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfc3R5bGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfc3R5bGUgPSBuZXcgRXhjZWxEeGZTdHlsZUNvbmRpdGlvbmFsRm9ybWF0dGluZyhOYW1lU3BhY2VNYW5hZ2VyLCBudWxsLCBfd29ya3NoZWV0Lldvcmtib29rLlN0eWxlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX3N0eWxlOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gU3RkRGV2ICh6ZXJvIGlzIG5vdCBhbGxvd2VkIGFuZCB3aWxsIGJlIGNvbnZlcnRlZCB0byAxKQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIFVJbnQxNiBTdGREZXYKLSAgICB7Ci0gICAgICBnZXQKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnQuVG9VSW50MTYoR2V0WG1sTm9kZUludCgKLSAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5TdGREZXZBdHRyaWJ1dGUpKTsKLSAgICAgIH0KLSAgICAgIHNldAotICAgICAgewotICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKAotICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLlN0ZERldkF0dHJpYnV0ZSwKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFN0ZERldiAoemVybyBpcyBub3QgYWxsb3dlZCBhbmQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gMSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIFVJbnQxNiBTdGREZXYgeworICAgIGdldCA9PgorICAgICAgQ29udmVydC5Ub1VJbnQxNihHZXRYbWxOb2RlSW50KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9zdGREZXZBdHRyaWJ1dGUpKTsKKyAgICBzZXQgPT4KKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3N0ZERldkF0dHJpYnV0ZSwKICAgICAgICAgICAodmFsdWUgPT0gMCkgPyAiMSIgOiB2YWx1ZS5Ub1N0cmluZygpLAogICAgICAgICAgIHRydWUpOwotICAgICAgfQotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBSYW5rICh6ZXJvIGlzIG5vdCBhbGxvd2VkIGFuZCB3aWxsIGJlIGNvbnZlcnRlZCB0byAxKQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIFVJbnQxNiBSYW5rCi0gICAgewotICAgICAgZ2V0Ci0gICAgICB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0LlRvVUludDE2KEdldFhtbE5vZGVJbnQoCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuUmFua0F0dHJpYnV0ZSkpOwotICAgICAgfQotICAgICAgc2V0Ci0gICAgICB7Ci0gICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuUmFua0F0dHJpYnV0ZSwKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmFuayAoemVybyBpcyBub3QgYWxsb3dlZCBhbmQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gMSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIFVJbnQxNiBSYW5rIHsKKyAgICBnZXQgPT4KKyAgICAgIENvbnZlcnQuVG9VSW50MTYoR2V0WG1sTm9kZUludChFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fcmFua0F0dHJpYnV0ZSkpOworICAgIHNldCA9PgorICAgICAgU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fcmFua0F0dHJpYnV0ZSwKICAgICAgICAgICAodmFsdWUgPT0gMCkgPyAiMSIgOiB2YWx1ZS5Ub1N0cmluZygpLAogICAgICAgICAgIHRydWUpOwotICAgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWJvdmVBdmVyYWdlCisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIHByb3RlY3RlZCBib29sPyBBYm92ZUF2ZXJhZ2UgeworICAgIGdldCB7CisgICAgICBib29sPyBhYm92ZUF2ZXJhZ2UgPSBHZXRYbWxOb2RlQm9vbE51bGxhYmxlKAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9hYm92ZUF2ZXJhZ2VBdHRyaWJ1dGUpOworCisgICAgICAvLyBBYm92ZSBBdmFyZWdlIGlmIFRSVUUgb3IgaWYgYXR0cmlidXRlIGRvZXMgbm90IGV4aXN0cworICAgICAgcmV0dXJuIChhYm92ZUF2ZXJhZ2UgPT0gdHJ1ZSkgfHwgKGFib3ZlQXZlcmFnZSA9PSBudWxsKTsKICAgICB9Ci0gICAgI2VuZHJlZ2lvbiBFeHBvc2VkIFByb3BlcnRpZXMKKyAgICBzZXQgeworICAgICAgc3RyaW5nIGFib3ZlQXZlcmFnZVZhbHVlID0gc3RyaW5nLkVtcHR5OwogCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAjcmVnaW9uIEludGVybmFsIFByb3BlcnRpZXMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFib3ZlQXZlcmFnZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgcHJvdGVjdGVkIGJvb2w/IEFib3ZlQXZlcmFnZQotICAgIHsKLSAgICAgIGdldAotICAgICAgewotICAgICAgICBib29sPyBhYm92ZUF2ZXJhZ2UgPSBHZXRYbWxOb2RlQm9vbE51bGxhYmxlKAotICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkFib3ZlQXZlcmFnZUF0dHJpYnV0ZSk7Ci0KLSAgICAgICAgLy8gQWJvdmUgQXZhcmVnZSBpZiBUUlVFIG9yIGlmIGF0dHJpYnV0ZSBkb2VzIG5vdCBleGlzdHMKLSAgICAgICAgcmV0dXJuIChhYm92ZUF2ZXJhZ2UgPT0gdHJ1ZSkgfHwgKGFib3ZlQXZlcmFnZSA9PSBudWxsKTsKLSAgICAgIH0KLSAgICAgIHNldAotICAgICAgewotICAgICAgICBzdHJpbmcgYWJvdmVBdmVyYWdlVmFsdWUgPSBzdHJpbmcuRW1wdHk7Ci0KLSAgICAgICAgLy8gT25seSB0aGUgdHlwZXMgdGhhdCBuZWVkcyB0aGUgQEFib3ZlQXZlcmFnZQotICAgICAgICBpZiAoKF90eXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93QXZlcmFnZSkKKyAgICAgIC8vIE9ubHkgdGhlIHR5cGVzIHRoYXQgbmVlZHMgdGhlIEBBYm92ZUF2ZXJhZ2UKKyAgICAgIGlmICgoX3R5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQmVsb3dBdmVyYWdlKQogICAgICAgICAgIHx8IChfdHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd09yRXF1YWxBdmVyYWdlKQotICAgICAgICAgIHx8IChfdHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd1N0ZERldikpCi0gICAgICAgIHsKLSAgICAgICAgICBhYm92ZUF2ZXJhZ2VWYWx1ZSA9ICIwIjsKLSAgICAgICAgfQorICAgICAgICAgIHx8IChfdHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd1N0ZERldikpIHsKKyAgICAgICAgYWJvdmVBdmVyYWdlVmFsdWUgPSAiMCI7CisgICAgICB9CiAKLSAgICAgICAgU2V0WG1sTm9kZVN0cmluZygKLSAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5BYm92ZUF2ZXJhZ2VBdHRyaWJ1dGUsCisgICAgICBTZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9hYm92ZUF2ZXJhZ2VBdHRyaWJ1dGUsCiAgICAgICAgICAgYWJvdmVBdmVyYWdlVmFsdWUsCiAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICB9CiAgICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEVxdWFsQXZlcmFnZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgcHJvdGVjdGVkIGJvb2w/IEVxdWFsQXZlcmFnZQotICAgIHsKLSAgICAgIGdldAotICAgICAgewotICAgICAgICBib29sPyBlcXVhbEF2ZXJhZ2UgPSBHZXRYbWxOb2RlQm9vbE51bGxhYmxlKAotICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkVxdWFsQXZlcmFnZUF0dHJpYnV0ZSk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEVxdWFsQXZlcmFnZQorICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCBwcm90ZWN0ZWQgYm9vbD8gRXF1YWxBdmVyYWdlIHsKKyAgICBnZXQgeworICAgICAgYm9vbD8gZXF1YWxBdmVyYWdlID0gR2V0WG1sTm9kZUJvb2xOdWxsYWJsZSgKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fZXF1YWxBdmVyYWdlQXR0cmlidXRlKTsKIAotICAgICAgICAvLyBFcXVhbCBBdmFyZWdlIG9ubHkgaWYgVFJVRQotICAgICAgICByZXR1cm4gKGVxdWFsQXZlcmFnZSA9PSB0cnVlKTsKKyAgICAgIC8vIEVxdWFsIEF2YXJlZ2Ugb25seSBpZiBUUlVFCisgICAgICByZXR1cm4gKGVxdWFsQXZlcmFnZSA9PSB0cnVlKTsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0cmluZyBlcXVhbEF2ZXJhZ2VWYWx1ZSA9IHN0cmluZy5FbXB0eTsKKworICAgICAgLy8gT25seSB0aGUgdHlwZXMgdGhhdCBuZWVkcyB0aGUgQEVxdWFsQXZlcmFnZQorICAgICAgaWYgKChfdHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5BYm92ZU9yRXF1YWxBdmVyYWdlKQorICAgICAgICAgIHx8IChfdHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5CZWxvd09yRXF1YWxBdmVyYWdlKSkgeworICAgICAgICBlcXVhbEF2ZXJhZ2VWYWx1ZSA9ICIxIjsKICAgICAgIH0KLSAgICAgIHNldAotICAgICAgewotICAgICAgICBzdHJpbmcgZXF1YWxBdmVyYWdlVmFsdWUgPSBzdHJpbmcuRW1wdHk7CiAKLSAgICAgICAgLy8gT25seSB0aGUgdHlwZXMgdGhhdCBuZWVkcyB0aGUgQEVxdWFsQXZlcmFnZQotICAgICAgICBpZiAoKF90eXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkFib3ZlT3JFcXVhbEF2ZXJhZ2UpCi0gICAgICAgICAgfHwgKF90eXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJlbG93T3JFcXVhbEF2ZXJhZ2UpKQotICAgICAgICB7Ci0gICAgICAgICAgZXF1YWxBdmVyYWdlVmFsdWUgPSAiMSI7Ci0gICAgICAgIH0KLQotICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKAotICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkVxdWFsQXZlcmFnZUF0dHJpYnV0ZSwKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX2VxdWFsQXZlcmFnZUF0dHJpYnV0ZSwKICAgICAgICAgICBlcXVhbEF2ZXJhZ2VWYWx1ZSwKICAgICAgICAgICB0cnVlKTsKLSAgICAgIH0KICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQm90dG9tIGF0dHJpYnV0ZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgcHJvdGVjdGVkIGJvb2w/IEJvdHRvbQotICAgIHsKLSAgICAgIGdldAotICAgICAgewotICAgICAgICBib29sPyBib3R0b20gPSBHZXRYbWxOb2RlQm9vbE51bGxhYmxlKAotICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkJvdHRvbUF0dHJpYnV0ZSk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEJvdHRvbSBhdHRyaWJ1dGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgcHJvdGVjdGVkIGJvb2w/IEJvdHRvbSB7CisgICAgZ2V0IHsKKyAgICAgIGJvb2w/IGJvdHRvbSA9IEdldFhtbE5vZGVCb29sTnVsbGFibGUoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX2JvdHRvbUF0dHJpYnV0ZSk7CiAKLSAgICAgICAgLy8gQm90dG9tIGlmIFRSVUUKLSAgICAgICAgcmV0dXJuIChib3R0b20gPT0gdHJ1ZSk7CisgICAgICAvLyBCb3R0b20gaWYgVFJVRQorICAgICAgcmV0dXJuIChib3R0b20gPT0gdHJ1ZSk7CisgICAgfQorICAgIHNldCB7CisgICAgICBzdHJpbmcgYm90dG9tVmFsdWUgPSBzdHJpbmcuRW1wdHk7CisKKyAgICAgIC8vIE9ubHkgdGhlIHR5cGVzIHRoYXQgbmVlZHMgdGhlIEBCb3R0b20KKyAgICAgIGlmICgoX3R5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQm90dG9tKQorICAgICAgICAgIHx8IChfdHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Cb3R0b21QZXJjZW50KSkgeworICAgICAgICBib3R0b21WYWx1ZSA9ICIxIjsKICAgICAgIH0KLSAgICAgIHNldAotICAgICAgewotICAgICAgICBzdHJpbmcgYm90dG9tVmFsdWUgPSBzdHJpbmcuRW1wdHk7CiAKLSAgICAgICAgLy8gT25seSB0aGUgdHlwZXMgdGhhdCBuZWVkcyB0aGUgQEJvdHRvbQotICAgICAgICBpZiAoKF90eXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJvdHRvbSkKLSAgICAgICAgICB8fCAoX3R5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuQm90dG9tUGVyY2VudCkpCi0gICAgICAgIHsKLSAgICAgICAgICBib3R0b21WYWx1ZSA9ICIxIjsKLSAgICAgICAgfQotCi0gICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQm90dG9tQXR0cmlidXRlLAorICAgICAgU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fYm90dG9tQXR0cmlidXRlLAogICAgICAgICAgIGJvdHRvbVZhbHVlLAogICAgICAgICAgIHRydWUpOwotICAgICAgfQogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBQZXJjZW50IGF0dHJpYnV0ZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgcHJvdGVjdGVkIGJvb2w/IFBlcmNlbnQKLSAgICB7Ci0gICAgICBnZXQKLSAgICAgIHsKLSAgICAgICAgYm9vbD8gcGVyY2VudCA9IEdldFhtbE5vZGVCb29sTnVsbGFibGUoCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuUGVyY2VudEF0dHJpYnV0ZSk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFBlcmNlbnQgYXR0cmlidXRlCisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIHByb3RlY3RlZCBib29sPyBQZXJjZW50IHsKKyAgICBnZXQgeworICAgICAgYm9vbD8gcGVyY2VudCA9IEdldFhtbE5vZGVCb29sTnVsbGFibGUoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3BlcmNlbnRBdHRyaWJ1dGUpOwogCi0gICAgICAgIC8vIEJvdHRvbSBpZiBUUlVFCi0gICAgICAgIHJldHVybiAocGVyY2VudCA9PSB0cnVlKTsKKyAgICAgIC8vIEJvdHRvbSBpZiBUUlVFCisgICAgICByZXR1cm4gKHBlcmNlbnQgPT0gdHJ1ZSk7CisgICAgfQorICAgIHNldCB7CisgICAgICBzdHJpbmcgcGVyY2VudFZhbHVlID0gc3RyaW5nLkVtcHR5OworCisgICAgICAvLyBPbmx5IHRoZSB0eXBlcyB0aGF0IG5lZWRzIHRoZSBAQm90dG9tCisgICAgICBpZiAoKF90eXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkJvdHRvbVBlcmNlbnQpCisgICAgICAgICAgfHwgKF90eXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvcFBlcmNlbnQpKSB7CisgICAgICAgIHBlcmNlbnRWYWx1ZSA9ICIxIjsKICAgICAgIH0KLSAgICAgIHNldAotICAgICAgewotICAgICAgICBzdHJpbmcgcGVyY2VudFZhbHVlID0gc3RyaW5nLkVtcHR5OwogCi0gICAgICAgIC8vIE9ubHkgdGhlIHR5cGVzIHRoYXQgbmVlZHMgdGhlIEBCb3R0b20KLSAgICAgICAgaWYgKChfdHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Cb3R0b21QZXJjZW50KQotICAgICAgICAgIHx8IChfdHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub3BQZXJjZW50KSkKLSAgICAgICAgewotICAgICAgICAgIHBlcmNlbnRWYWx1ZSA9ICIxIjsKLSAgICAgICAgfQotCi0gICAgICAgIFNldFhtbE5vZGVTdHJpbmcoCi0gICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuUGVyY2VudEF0dHJpYnV0ZSwKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3BlcmNlbnRBdHRyaWJ1dGUsCiAgICAgICAgICAgcGVyY2VudFZhbHVlLAogICAgICAgICAgIHRydWUpOwotICAgICAgfQogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaW1lUGVyaW9kCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBpbnRlcm5hbCBwcm90ZWN0ZWQgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUgVGltZVBlcmlvZAotICAgIHsKLSAgICAgIGdldAotICAgICAgewotICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5HZXRUeXBlQnlBdHRyaWJ1dGUoCi0gICAgICAgICAgR2V0WG1sTm9kZVN0cmluZyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5UaW1lUGVyaW9kQXR0cmlidXRlKSk7Ci0gICAgICB9Ci0gICAgICBzZXQKLSAgICAgIHsKLSAgICAgICAgU2V0WG1sTm9kZVN0cmluZygKLSAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5UaW1lUGVyaW9kQXR0cmlidXRlLAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaW1lUGVyaW9kCisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIHByb3RlY3RlZCBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZSBUaW1lUGVyaW9kIHsKKyAgICBnZXQgPT4KKyAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuR2V0VHlwZUJ5QXR0cmlidXRlKAorICAgICAgICAgIEdldFhtbE5vZGVTdHJpbmcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3RpbWVQZXJpb2RBdHRyaWJ1dGUpKTsKKyAgICBzZXQgPT4KKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX3RpbWVQZXJpb2RBdHRyaWJ1dGUsCiAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5HZXRBdHRyaWJ1dGVCeVR5cGUodmFsdWUpLAogICAgICAgICAgIHRydWUpOwotICAgICAgfQotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBPcGVyYXRvcgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgcHJvdGVjdGVkIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ09wZXJhdG9yVHlwZSBPcGVyYXRvcgotICAgIHsKLSAgICAgIGdldAotICAgICAgewotICAgICAgICByZXR1cm4gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuR2V0VHlwZUJ5QXR0cmlidXRlKAotICAgICAgICAgIEdldFhtbE5vZGVTdHJpbmcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuT3BlcmF0b3JBdHRyaWJ1dGUpKTsKLSAgICAgIH0KLSAgICAgIHNldAotICAgICAgewotICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKAotICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLk9wZXJhdG9yQXR0cmlidXRlLAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBPcGVyYXRvcgorICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCBwcm90ZWN0ZWQgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlIE9wZXJhdG9yIHsKKyAgICBnZXQgPT4KKyAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nT3BlcmF0b3JUeXBlLkdldFR5cGVCeUF0dHJpYnV0ZSgKKyAgICAgICAgICBHZXRYbWxOb2RlU3RyaW5nKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9vcGVyYXRvckF0dHJpYnV0ZSkpOworICAgIHNldCA9PgorICAgICAgU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fb3BlcmF0b3JBdHRyaWJ1dGUsCiAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdPcGVyYXRvclR5cGUuR2V0QXR0cmlidXRlQnlUeXBlKHZhbHVlKSwKICAgICAgICAgICB0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEZvcm11bGEKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgRm9ybXVsYQotICAgIHsKLSAgICAgIGdldAotICAgICAgewotICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygKLSAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Gb3JtdWxhKTsKLSAgICAgIH0KLSAgICAgIHNldAotICAgICAgewotICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKAotICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkZvcm11bGEsCi0gICAgICAgICAgdmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRm9ybXVsYTIKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgRm9ybXVsYTIKLSAgICB7Ci0gICAgICBnZXQKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoCi0gICAgICAgICAgc3RyaW5nLkZvcm1hdCgKLSAgICAgICAgICAgICJ7MH1bcG9zaXRpb24oKT0yXSIsCi0gICAgICAgICAgLy8gezB9Ci0gICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Gb3JtdWxhKSk7Ci0gICAgICB9Ci0gICAgICBzZXQKLSAgICAgIHsKLSAgICAgICAgLy8gQ3JlYXRlL0dldCB0aGUgZmlyc3QgPGZvcm11bGE+IG5vZGUgKGVuc3VyZSB0aGF0IGl0IGV4aXN0cykKLSAgICAgICAgdmFyIGZpcnN0Tm9kZSA9IENyZWF0ZUNvbXBsZXhOb2RlKAotICAgICAgICAgIFRvcE5vZGUsCi0gICAgICAgICAgc3RyaW5nLkZvcm1hdCgKLSAgICAgICAgICAgICJ7MH1bcG9zaXRpb24oKT0xXSIsCi0gICAgICAgICAgLy8gezB9Ci0gICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Gb3JtdWxhKSk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlL0dldCB0aGUgc2Vjb25kZSA8Zm9ybXVsYT4gbm9kZSAoZW5zdXJlIHRoYXQgaXQgZXhpc3RzKQotICAgICAgICB2YXIgc2Vjb25kTm9kZSA9IENyZWF0ZUNvbXBsZXhOb2RlKAotICAgICAgICAgIFRvcE5vZGUsCi0gICAgICAgICAgc3RyaW5nLkZvcm1hdCgKLSAgICAgICAgICAgICJ7MH1bcG9zaXRpb24oKT0yXSIsCi0gICAgICAgICAgLy8gezB9Ci0gICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5Gb3JtdWxhKSk7Ci0KLSAgICAgICAgLy8gU2F2ZSB0aGUgZm9ybXVsYSBpbiB0aGUgc2Vjb25kIDxmb3JtdWxhPiBub2RlCi0gICAgICAgIHNlY29uZE5vZGUuSW5uZXJUZXh0ID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotICAgICNlbmRyZWdpb24gSW50ZXJuYWwgUHJvcGVydGllcwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEZvcm11bGEKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBGb3JtdWxhIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZyhFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fZm9ybXVsYSk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX2Zvcm11bGEsIHZhbHVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEZvcm11bGEyCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgRm9ybXVsYTIgeworICAgIGdldCA9PgorICAgICAgR2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAiezB9W3Bvc2l0aW9uKCk9Ml0iLAorICAgICAgICAgICAgICAvLyB7MH0KKyAgICAgICAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX2Zvcm11bGEpKTsKKyAgICBzZXQgeworICAgICAgLy8gQ3JlYXRlL0dldCB0aGUgZmlyc3QgPGZvcm11bGE+IG5vZGUgKGVuc3VyZSB0aGF0IGl0IGV4aXN0cykKKyAgICAgIHZhciBmaXJzdE5vZGUgPSBDcmVhdGVDb21wbGV4Tm9kZSgKKyAgICAgICAgICBUb3BOb2RlLAorICAgICAgICAgIHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICJ7MH1bcG9zaXRpb24oKT0xXSIsCisgICAgICAgICAgICAgIC8vIHswfQorICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fZm9ybXVsYSkpOworCisgICAgICAvLyBDcmVhdGUvR2V0IHRoZSBzZWNvbmRlIDxmb3JtdWxhPiBub2RlIChlbnN1cmUgdGhhdCBpdCBleGlzdHMpCisgICAgICB2YXIgc2Vjb25kTm9kZSA9IENyZWF0ZUNvbXBsZXhOb2RlKAorICAgICAgICAgIFRvcE5vZGUsCisgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgInswfVtwb3NpdGlvbigpPTJdIiwKKyAgICAgICAgICAgICAgLy8gezB9CisgICAgICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9mb3JtdWxhKSk7CisKKyAgICAgIC8vIFNhdmUgdGhlIGZvcm11bGEgaW4gdGhlIHNlY29uZCA8Zm9ybXVsYT4gbm9kZQorICAgICAgc2Vjb25kTm9kZS5Jbm5lclRleHQgPSB2YWx1ZTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzTW9udGguY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc01vbnRoLmNzCmluZGV4IGM0MDRjYTcuLjYxMDQ5NTkgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzTW9udGguY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNNb250aC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTEyICsxMyw4NCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOworCiB1c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc01vbnRoCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc01vbnRoIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAgewogICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNNb250aAorICAvLy8KICAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc01vbnRoCi0gICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cAotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzTW9udGgoCisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc01vbnRoKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhpc01vbnRoLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRoaXNNb250aCwKKyAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBpZiAoaXRlbUVsZW1lbnROb2RlCisgICAgICAgID09IG51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKICAgICB7Ci0gICAgICAgIGlmIChpdGVtRWxlbWVudE5vZGU9PW51bGwpIC8vU2V0IGRlZmF1bHQgdmFsdWVzIGFuZCBjcmVhdGUgYXR0cmlidXRlcyBpZiBuZWVkZWQKLSAgICAgICAgewotICAgICAgICAgICAgVGltZVBlcmlvZCA9IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RUeXBlLlRoaXNNb250aDsKLSAgICAgICAgICAgIEZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KAotICAgICAgICAgICAgICAiQU5EKE1PTlRIKHswfSk9TU9OVEgoVE9EQVkoKSksIFlFQVIoezB9KT1ZRUFSKFRPREFZKCkpKSIsCi0gICAgICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcyk7Ci0gICAgICAgIH0KKyAgICAgIFRpbWVQZXJpb2QgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5UaGlzTW9udGg7CisgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAiQU5EKE1PTlRIKHswfSk9TU9OVEgoVE9EQVkoKSksIFlFQVIoezB9KT1ZRUFSKFRPREFZKCkpKSIsCisgICAgICAgICAgQWRkcmVzcy5TdGFydC5BZGRyZXNzKTsKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNNb250aCgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc01vbnRoKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc01vbnRoKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNNb250aCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc1dlZWsuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc1dlZWsuY3MKaW5kZXggOWJhYThhZC4uYTQyMDA3ZCAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNXZWVrLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzV2Vlay5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTEyICsxMyw4NCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOworCiB1c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc1dlZWsKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzV2VlayA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIHsKICAgLy8vIDxzdW1tYXJ5PgotICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaGlzV2VlaworICAvLy8KICAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc1dlZWsKLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNXZWVrKAorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNXZWVrKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhpc1dlZWssCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhpc1dlZWssCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRpbWVQZXJpb2QgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5UaGlzV2VlazsKLSAgICAgICAgICAgIEZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KAotICAgICAgICAgICAgICAiQU5EKFRPREFZKCktUk9VTkRET1dOKHswfSwwKTw9V0VFS0RBWShUT0RBWSgpKS0xLFJPVU5ERE9XTih7MH0sMCktVE9EQVkoKTw9Ny1XRUVLREFZKFRPREFZKCkpKSIsCi0gICAgICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQWRkcmVzcyk7Ci0gICAgICAgIH0KKyAgICAgIFRpbWVQZXJpb2QgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5UaGlzV2VlazsKKyAgICAgIEZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICJBTkQoVE9EQVkoKS1ST1VORERPV04oezB9LDApPD1XRUVLREFZKFRPREFZKCkpLTEsUk9VTkRET1dOKHswfSwwKS1UT0RBWSgpPD03LVdFRUtEQVkoVE9EQVkoKSkpIiwKKyAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOwogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc1dlZWsoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RoaXNXZWVrKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc1dlZWsoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhpc1dlZWsoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZS5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUuY3MKaW5kZXggY2I2ZDQ2Yy4uYTYzYmYwNCAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZS5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMDMgKzEzLDc2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OworCiB1c2luZyBTeXN0ZW0uRHJhd2luZzsKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZQotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlCiAgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICNyZWdpb24gUHJpdmF0ZSBQcm9wZXJ0aWVzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBQcml2YXRlIExvdyBWYWx1ZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHJpdmF0ZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSBfbG93VmFsdWU7Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFByaXZhdGUgTWlkZGxlIFZhbHVlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwcml2YXRlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIF9taWRkbGVWYWx1ZTsKLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUHJpdmF0ZSBIaWdoIFZhbHVlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwcml2YXRlIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIF9oaWdoVmFsdWU7Ci0gICAgI2VuZHJlZ2lvbiBQcml2YXRlIFByb3BlcnRpZXMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSgKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVDb2xvclNjYWxlKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVDb2xvclNjYWxlLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQotICAgIHsKLSAgICAgIC8vIENyZWF0ZSB0aGUgPGNvbG9yU2NhbGU+IG5vZGUgaW5zaWRlIHRoZSA8Y2ZSdWxlPiBub2RlCi0gICAgICB2YXIgY29sb3JTY2FsZU5vZGUgPSBDcmVhdGVDb21wbGV4Tm9kZSgKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUNvbG9yU2NhbGUsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgLy8gQ3JlYXRlIHRoZSA8Y29sb3JTY2FsZT4gbm9kZSBpbnNpZGUgdGhlIDxjZlJ1bGU+IG5vZGUKKyAgICB2YXIgY29sb3JTY2FsZU5vZGUgPSBDcmVhdGVDb21wbGV4Tm9kZSgKICAgICAgICAgTm9kZSwKLSAgICAgICAgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuQ29sb3JTY2FsZSk7CisgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9jb2xvclNjYWxlKTsKIAotICAgICAgLy8gTG93VmFsdWUgZGVmYXVsdAotICAgICAgTG93VmFsdWUgPSBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUoCisgICAgLy8gTG93VmFsdWUgZGVmYXVsdAorICAgIExvd1ZhbHVlID0gbmV3KAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFBvc2l0aW9uLkxvdywKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1pbiwKLSAgICAgICAgQ29sb3JUcmFuc2xhdG9yLkZyb21IdG1sKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNvbG9ycy5DZnZvTG93VmFsdWUpLAorICAgICAgICBDb2xvclRyYW5zbGF0b3IuRnJvbUh0bWwoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQ29sb3JzLl9jZnZvTG93VmFsdWUpLAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUNvbG9yU2NhbGUsCiAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgIHByaW9yaXR5LAogICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgIE5hbWVTcGFjZU1hbmFnZXIpOwogCi0gICAgICAvLyBNaWRkbGVWYWx1ZSBkZWZhdWx0Ci0gICAgICBNaWRkbGVWYWx1ZSA9IG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSgKKyAgICAvLyBNaWRkbGVWYWx1ZSBkZWZhdWx0CisgICAgTWlkZGxlVmFsdWUgPSBuZXcoCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24uTWlkZGxlLAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudCwKLSAgICAgICAgQ29sb3JUcmFuc2xhdG9yLkZyb21IdG1sKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNvbG9ycy5DZnZvTWlkZGxlVmFsdWUpLAorICAgICAgICBDb2xvclRyYW5zbGF0b3IuRnJvbUh0bWwoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuQ29sb3JzLl9jZnZvTWlkZGxlVmFsdWUpLAogICAgICAgICA1MCwKICAgICAgICAgc3RyaW5nLkVtcHR5LAogICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUNvbG9yU2NhbGUsCkBAIC0xMTgsOTAgKzkxLDU2IEBACiAgICAgICAgIHdvcmtzaGVldCwKICAgICAgICAgTmFtZVNwYWNlTWFuYWdlcik7CiAKLSAgICAgIC8vIEhpZ2hWYWx1ZSBkZWZhdWx0Ci0gICAgICBIaWdoVmFsdWUgPSBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUoCisgICAgLy8gSGlnaFZhbHVlIGRlZmF1bHQKKyAgICBIaWdoVmFsdWUgPSBuZXcoCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24uSGlnaCwKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1heCwKLSAgICAgICAgQ29sb3JUcmFuc2xhdG9yLkZyb21IdG1sKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNvbG9ycy5DZnZvSGlnaFZhbHVlKSwKKyAgICAgICAgQ29sb3JUcmFuc2xhdG9yLkZyb21IdG1sKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNvbG9ycy5fY2Z2b0hpZ2hWYWx1ZSksCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlQ29sb3JTY2FsZSwKICAgICAgICAgYWRkcmVzcywKICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgIHdvcmtzaGVldCwKICAgICAgICAgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlQ29sb3JTY2FsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUNvbG9yU2NhbGUoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgbnVsbCwgbnVsbCkge30KIAotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMb3cgVmFsdWUgZm9yIFRocmVlIENvbG9yIFNjYWxlIE9iamVjdCBWYWx1ZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUgTG93VmFsdWUgeyBnZXQ7IHNldDsgfQogCi0gICAgI3JlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTG93IFZhbHVlIGZvciBUaHJlZSBDb2xvciBTY2FsZSBPYmplY3QgVmFsdWUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSBMb3dWYWx1ZQotICAgIHsKLSAgICAgIGdldCB7IHJldHVybiBfbG93VmFsdWU7IH0KLSAgICAgIHNldCB7IF9sb3dWYWx1ZSA9IHZhbHVlOyB9Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBNaWRkbGUgVmFsdWUgZm9yIFRocmVlIENvbG9yIFNjYWxlIE9iamVjdCBWYWx1ZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUgTWlkZGxlVmFsdWUgeyBnZXQ7IHNldDsgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBNaWRkbGUgVmFsdWUgZm9yIFRocmVlIENvbG9yIFNjYWxlIE9iamVjdCBWYWx1ZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIE1pZGRsZVZhbHVlCi0gICAgewotICAgICAgZ2V0IHsgcmV0dXJuIF9taWRkbGVWYWx1ZTsgfQotICAgICAgc2V0IHsgX21pZGRsZVZhbHVlID0gdmFsdWU7IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEhpZ2ggVmFsdWUgZm9yIFRocmVlIENvbG9yIFNjYWxlIE9iamVjdCBWYWx1ZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlIEhpZ2hWYWx1ZQotICAgIHsKLSAgICAgIGdldCB7IHJldHVybiBfaGlnaFZhbHVlOyB9Ci0gICAgICBzZXQgeyBfaGlnaFZhbHVlID0gdmFsdWU7IH0KLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBQdWJsaWMgUHJvcGVydGllcwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEhpZ2ggVmFsdWUgZm9yIFRocmVlIENvbG9yIFNjYWxlIE9iamVjdCBWYWx1ZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUgSGlnaFZhbHVlIHsgZ2V0OyBzZXQ7IH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0LmNzCmluZGV4IDRlYzE5ZTEuLmNjMGEyYWQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlSWNvblNldC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMzY4ICsxMywyNzggQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0IDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0QmFzZTxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmczSWNvbnNTZXRUeXBlPgotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQoCi0gICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAotICAgICAgICBpbnQgcHJpb3JpdHksCi0gICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKLSAgICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKLSAgICAgICAgICAgIDogYmFzZSgKLSAgICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0LAotICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgICAgICAgd29ya3NoZWV0LAotICAgICAgICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQotICAgICAgICB7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RocmVlSWNvblNldAorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0QmFzZTxlRXhjZWxjb25kaXRpb25hbEZvcm1hdHRpbmczSWNvbnNTZXRUeXBlPiB7CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0KAorICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCisgICAgICBpbnQgcHJpb3JpdHksCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSgKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7fQorfQorCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0QmFzZTxUPgorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0PFQ+IHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25TZXRCYXNlKAorICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSwKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgaW50IHByaW9yaXR5LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UoCisgICAgICAgICAgdHlwZSwKKyAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgIHdvcmtzaGVldCwKKyAgICAgICAgICBpdGVtRWxlbWVudE5vZGUsCisgICAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBpZiAoaXRlbUVsZW1lbnROb2RlICE9IG51bGwgJiYgaXRlbUVsZW1lbnROb2RlLkhhc0NoaWxkTm9kZXMpIHsKKyAgICAgIGludCBwb3MgPSAxOworICAgICAgZm9yZWFjaCAoWG1sTm9kZSBub2RlIGluIGl0ZW1FbGVtZW50Tm9kZS5TZWxlY3ROb2RlcygiZDppY29uU2V0L2Q6Y2Z2byIsIE5hbWVTcGFjZU1hbmFnZXIpKSB7CisgICAgICAgIGlmIChwb3MgPT0gMSkgeworICAgICAgICAgIEljb24xID0gbmV3KHR5cGUsIGFkZHJlc3MsIHdvcmtzaGVldCwgbm9kZSwgbmFtZXNwYWNlTWFuYWdlcik7CisgICAgICAgIH0gZWxzZSBpZiAocG9zID09IDIpIHsKKyAgICAgICAgICBJY29uMiA9IG5ldyh0eXBlLCBhZGRyZXNzLCB3b3Jrc2hlZXQsIG5vZGUsIG5hbWVzcGFjZU1hbmFnZXIpOworICAgICAgICB9IGVsc2UgaWYgKHBvcyA9PSAzKSB7CisgICAgICAgICAgSWNvbjMgPSBuZXcodHlwZSwgYWRkcmVzcywgd29ya3NoZWV0LCBub2RlLCBuYW1lc3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBwb3MrKzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdmFyIGljb25TZXROb2RlID0gQ3JlYXRlQ29tcGxleE5vZGUoTm9kZSwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb25zdGFudHMuUGF0aHMuX2ljb25TZXQpOworCisgICAgICAvL0NyZWF0ZSB0aGUgPGljb25TZXQ+IG5vZGUgaW5zaWRlIHRoZSA8Y2ZSdWxlPiBub2RlCisgICAgICBkb3VibGUgc3Bhbm47CisgICAgICBpZiAodHlwZSA9PSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQpIHsKKyAgICAgICAgc3Bhbm4gPSAzOworICAgICAgfSBlbHNlIGlmICh0eXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZvdXJJY29uU2V0KSB7CisgICAgICAgIHNwYW5uID0gNDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNwYW5uID0gNTsKKyAgICAgIH0KKworICAgICAgdmFyIGljb25Ob2RlMSA9IGljb25TZXROb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fY2Z2bywKKyAgICAgICAgICBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgaWNvblNldE5vZGUuQXBwZW5kQ2hpbGQoaWNvbk5vZGUxKTsKKyAgICAgIEljb24xID0gbmV3KAorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50LAorICAgICAgICAgIDAsCisgICAgICAgICAgIiIsCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0LAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGljb25Ob2RlMSwKKyAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKTsKKworICAgICAgdmFyIGljb25Ob2RlMiA9IGljb25TZXROb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgKKyAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fY2Z2bywKKyAgICAgICAgICBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgaWNvblNldE5vZGUuQXBwZW5kQ2hpbGQoaWNvbk5vZGUyKTsKKyAgICAgIEljb24yID0gbmV3KAorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5QZXJjZW50LAorICAgICAgICAgIE1hdGguUm91bmQoMTAwRCAvIHNwYW5uLCAwKSwKKyAgICAgICAgICAiIiwKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaWNvbk5vZGUyLAorICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOworCisgICAgICB2YXIgaWNvbk5vZGUzID0gaWNvblNldE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KAorICAgICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLl9jZnZvLAorICAgICAgICAgIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgICBpY29uU2V0Tm9kZS5BcHBlbmRDaGlsZChpY29uTm9kZTMpOworICAgICAgSWNvbjMgPSBuZXcoCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnQsCisgICAgICAgICAgTWF0aC5Sb3VuZCgxMDBEICogKDJEIC8gc3Bhbm4pLCAwKSwKKyAgICAgICAgICAiIiwKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaWNvbk5vZGUzLAorICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOworICAgICAgVHlwZSA9IHR5cGU7CiAgICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaHJlZUljb25TZXQKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25TZXRCYXNlPFQ+Ci0gICAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGhyZWVJY29uU2V0PFQ+Ci0gICAgewotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgfQogCi0gICAgICAgICNyZWdpb24gUHJpdmF0ZSBQcm9wZXJ0aWVzCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLzxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0QmFzZSgKKyAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiB0aGlzKHR5cGUsIGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgICAgICAjZW5kcmVnaW9uIFByaXZhdGUgUHJvcGVydGllcworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy88cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0QmFzZSgKKyAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCisgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKKyAgICAgIGludCBwcmlvcml0eSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKKyAgICAgIDogdGhpcyh0eXBlLCBhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQogCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTZXR0aW5ncyBmb3IgaWNvbiAxIGluIHRoZSBpY29uc2V0CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjEgeyBnZXQ7IGludGVybmFsIHNldDsgfQogCi0gICAgICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvblNldEJhc2UoCi0gICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSwKLSAgICAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKLSAgICAgICAgICBpbnQgcHJpb3JpdHksCi0gICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAotICAgICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKLSAgICAgICAgICAgIDogYmFzZSgKLSAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgcHJpb3JpdHksCi0gICAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZSAhPSBudWxsICYmIGl0ZW1FbGVtZW50Tm9kZS5IYXNDaGlsZE5vZGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBwb3MgPSAxOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbm9kZSBpbiBpdGVtRWxlbWVudE5vZGUuU2VsZWN0Tm9kZXMoImQ6aWNvblNldC9kOmNmdm8iLCBOYW1lU3BhY2VNYW5hZ2VyKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBvcz09MSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgSWNvbjEgPSBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBvcyA9PSAyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJY29uMiA9IG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocG9zID09IDMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEljb24zID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgaWNvblNldE5vZGUgPSBDcmVhdGVDb21wbGV4Tm9kZSgKLSAgICAgICAgICAgICAgICAgIE5vZGUsCi0gICAgICAgICAgICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5JY29uU2V0KTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2V0dGluZ3MgZm9yIGljb24gMiBpbiB0aGUgaWNvbnNldAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIEljb24yIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KIAotICAgICAgICAgICAgICAgIC8vQ3JlYXRlIHRoZSA8aWNvblNldD4gbm9kZSBpbnNpZGUgdGhlIDxjZlJ1bGU+IG5vZGUKLSAgICAgICAgICAgICAgICBkb3VibGUgc3Bhbm47Ci0gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3Bhbm4gPSAzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZvdXJJY29uU2V0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3Bhbm4gPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzcGFubiA9IDU7Ci0gICAgICAgICAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTZXR0aW5ncyBmb3IgaWNvbiAyIGluIHRoZSBpY29uc2V0CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjMgeyBnZXQ7IGludGVybmFsIHNldDsgfQogCi0gICAgICAgICAgICAgICAgdmFyIGljb25Ob2RlMSA9IGljb25TZXROb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5DZnZvLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICAgICAgaWNvblNldE5vZGUuQXBwZW5kQ2hpbGQoaWNvbk5vZGUxKTsKLSAgICAgICAgICAgICAgICBJY29uMSA9IG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUoZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLlBlcmNlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5UaHJlZUljb25TZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpY29uTm9kZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VNYW5hZ2VyKTsKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3JldmVyc2VQYXRoID0gImQ6aWNvblNldC9AcmV2ZXJzZSI7CiAKLSAgICAgICAgICAgICAgICB2YXIgaWNvbk5vZGUyID0gaWNvblNldE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmdm8sIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgICAgICBpY29uU2V0Tm9kZS5BcHBlbmRDaGlsZChpY29uTm9kZTIpOwotICAgICAgICAgICAgICAgIEljb24yID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZShlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguUm91bmQoMTAwRCAvIHNwYW5uLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVGhyZWVJY29uU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgd29ya3NoZWV0LAotICAgICAgICAgICAgICAgICAgICAgICAgaWNvbk5vZGUyLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlTWFuYWdlcik7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBpY29ucworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBSZXZlcnNlIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2woX3JldmVyc2VQYXRoLCBmYWxzZSk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKF9yZXZlcnNlUGF0aCwgdmFsdWUpOworICB9CiAKLSAgICAgICAgICAgICAgICB2YXIgaWNvbk5vZGUzID0gaWNvblNldE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNmdm8sIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgICAgICBpY29uU2V0Tm9kZS5BcHBlbmRDaGlsZChpY29uTm9kZTMpOwotICAgICAgICAgICAgICAgIEljb24zID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nSWNvbkRhdGFCYXJWYWx1ZShlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdWYWx1ZU9iamVjdFR5cGUuUGVyY2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguUm91bmQoMTAwRCAqICgyRCAvIHNwYW5uKSwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRocmVlSWNvblNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGljb25Ob2RlMywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIFR5cGUgPSB0eXBlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9zaG93VmFsdWVQYXRoID0gImQ6aWNvblNldC9Ac2hvd1ZhbHVlIjsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25TZXRCYXNlKAotICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCi0gICAgICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCi0gICAgICAgICAgaW50IHByaW9yaXR5LAotICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKLSAgICAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgICAgICAgIDogdGhpcygKLSAgICAgICAgICAgICAgdHlwZSwKLSAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgcHJpb3JpdHksCi0gICAgICAgICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAgICAgICBudWxsKQotICAgICAgICB7Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhlIGNlbGwgdmFsdWVzIGFyZSB2aXNpYmxlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIFNob3dWYWx1ZSB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKF9zaG93VmFsdWVQYXRoLCB0cnVlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX3Nob3dWYWx1ZVBhdGgsIHZhbHVlKTsKKyAgfQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy88cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uU2V0QmFzZSgKLSAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZSB0eXBlLAotICAgICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAotICAgICAgICAgIGludCBwcmlvcml0eSwKLSAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCi0gICAgICAgICAgICA6IHRoaXMoCi0gICAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgIHByaW9yaXR5LAotICAgICAgICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgIG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfaWNvblNldFBhdGggPSAiZDppY29uU2V0L0BpY29uU2V0IjsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXR0aW5ncyBmb3IgaWNvbiAxIGluIHRoZSBpY29uc2V0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjEKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgaW50ZXJuYWwgc2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2V0dGluZ3MgZm9yIGljb24gMiBpbiB0aGUgaWNvbnNldAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdJY29uRGF0YUJhclZhbHVlIEljb24yCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIGludGVybmFsIHNldDsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXR0aW5ncyBmb3IgaWNvbiAyIGluIHRoZSBpY29uc2V0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0ljb25EYXRhQmFyVmFsdWUgSWNvbjMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgaW50ZXJuYWwgc2V0OwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9yZXZlcnNlUGF0aCA9ICJkOmljb25TZXQvQHJldmVyc2UiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgaWNvbnMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgUmV2ZXJzZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woX3JldmVyc2VQYXRoLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfcmV2ZXJzZVBhdGgsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9zaG93VmFsdWVQYXRoID0gImQ6aWNvblNldC9Ac2hvd1ZhbHVlIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSWYgdGhlIGNlbGwgdmFsdWVzIGFyZSB2aXNpYmxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFNob3dWYWx1ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woX3Nob3dWYWx1ZVBhdGgsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX3Nob3dWYWx1ZVBhdGgsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfaWNvblNldFBhdGggPSAiZDppY29uU2V0L0BpY29uU2V0IjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVHlwZSBvZiBpY29uc2V0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBUIEljb25TZXQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHYgPSBHZXRYbWxOb2RlU3RyaW5nKF9pY29uU2V0UGF0aCk7Ci0gICAgICAgICAgICAgICAgdiA9IHYuU3Vic3RyaW5nKDEpOyAvL1NraXAgZmlyc3QgaWNvbi4KLSAgICAgICAgICAgICAgICByZXR1cm4gKFQpRW51bS5QYXJzZSh0eXBlb2YoVCksIHYsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfaWNvblNldFBhdGgsIEdldEljb25TZXRTdHJpbmcodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHN0cmluZyBHZXRJY29uU2V0U3RyaW5nKFQgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZvdXJJY29uU2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUuVG9TdHJpbmcoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgIkFycm93cyI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjRBcnJvd3MiOwotICAgICAgICAgICAgICAgICAgICBjYXNlICJBcnJvd3NHcmF5IjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiNEFycm93c0dyYXkiOwotICAgICAgICAgICAgICAgICAgICBjYXNlICJSYXRpbmciOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICI0UmF0aW5nIjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiUmVkVG9CbGFjayI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjRSZWRUb0JsYWNrIjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiVHJhZmZpY0xpZ2h0cyI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjRUcmFmZmljTGlnaHRzIjsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdHlwZSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZpdmVJY29uU2V0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUuVG9TdHJpbmcoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgIkFycm93cyI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjVBcnJvd3MiOwotICAgICAgICAgICAgICAgICAgICBjYXNlICJBcnJvd3NHcmF5IjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiNUFycm93c0dyYXkiOwotICAgICAgICAgICAgICAgICAgICBjYXNlICJRdWFydGVycyI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjVRdWFydGVycyI7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgIlJhdGluZyI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjVSYXRpbmciOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB0eXBlIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLlRvU3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlICJBcnJvd3MiOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIzQXJyb3dzIjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiQXJyb3dzR3JheSI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjNBcnJvd3NHcmF5IjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiRmxhZ3MiOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIzRmxhZ3MiOwotICAgICAgICAgICAgICAgICAgICBjYXNlICJTaWducyI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjNTaWducyI7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgIlN5bWJvbHMiOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIzU3ltYm9scyI7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgIlN5bWJvbHMyIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiM1N5bWJvbHMyIjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiVHJhZmZpY0xpZ2h0czEiOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIzVHJhZmZpY0xpZ2h0czEiOwotICAgICAgICAgICAgICAgICAgICBjYXNlICJUcmFmZmljTGlnaHRzMiI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjNUcmFmZmljTGlnaHRzMiI7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHR5cGUiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFR5cGUgb2YgaWNvbnNldAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgVCBJY29uU2V0IHsKKyAgICBnZXQgeworICAgICAgdmFyIHYgPSBHZXRYbWxOb2RlU3RyaW5nKF9pY29uU2V0UGF0aCk7CisgICAgICB2ID0gdi5TdWJzdHJpbmcoMSk7IC8vU2tpcCBmaXJzdCBpY29uLgorICAgICAgcmV0dXJuIChUKUVudW0uUGFyc2UodHlwZW9mKFQpLCB2LCB0cnVlKTsKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKF9pY29uU2V0UGF0aCwgR2V0SWNvblNldFN0cmluZyh2YWx1ZSkpOworICB9CisKKyAgcHJpdmF0ZSBzdHJpbmcgR2V0SWNvblNldFN0cmluZyhUIHZhbHVlKSB7CisgICAgaWYgKFR5cGUgPT0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuRm91ckljb25TZXQpIHsKKyAgICAgIHN3aXRjaCAodmFsdWUuVG9TdHJpbmcoKSkgeworICAgICAgICBjYXNlICJBcnJvd3MiOgorICAgICAgICAgIHJldHVybiAiNEFycm93cyI7CisgICAgICAgIGNhc2UgIkFycm93c0dyYXkiOgorICAgICAgICAgIHJldHVybiAiNEFycm93c0dyYXkiOworICAgICAgICBjYXNlICJSYXRpbmciOgorICAgICAgICAgIHJldHVybiAiNFJhdGluZyI7CisgICAgICAgIGNhc2UgIlJlZFRvQmxhY2siOgorICAgICAgICAgIHJldHVybiAiNFJlZFRvQmxhY2siOworICAgICAgICBjYXNlICJUcmFmZmljTGlnaHRzIjoKKyAgICAgICAgICByZXR1cm4gIjRUcmFmZmljTGlnaHRzIjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHR5cGUiKSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChUeXBlID09IGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLkZpdmVJY29uU2V0KSB7CisgICAgICBzd2l0Y2ggKHZhbHVlLlRvU3RyaW5nKCkpIHsKKyAgICAgICAgY2FzZSAiQXJyb3dzIjoKKyAgICAgICAgICByZXR1cm4gIjVBcnJvd3MiOworICAgICAgICBjYXNlICJBcnJvd3NHcmF5IjoKKyAgICAgICAgICByZXR1cm4gIjVBcnJvd3NHcmF5IjsKKyAgICAgICAgY2FzZSAiUXVhcnRlcnMiOgorICAgICAgICAgIHJldHVybiAiNVF1YXJ0ZXJzIjsKKyAgICAgICAgY2FzZSAiUmF0aW5nIjoKKyAgICAgICAgICByZXR1cm4gIjVSYXRpbmciOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdHlwZSIpKTsKKyAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoICh2YWx1ZS5Ub1N0cmluZygpKSB7CisgICAgICBjYXNlICJBcnJvd3MiOgorICAgICAgICByZXR1cm4gIjNBcnJvd3MiOworICAgICAgY2FzZSAiQXJyb3dzR3JheSI6CisgICAgICAgIHJldHVybiAiM0Fycm93c0dyYXkiOworICAgICAgY2FzZSAiRmxhZ3MiOgorICAgICAgICByZXR1cm4gIjNGbGFncyI7CisgICAgICBjYXNlICJTaWducyI6CisgICAgICAgIHJldHVybiAiM1NpZ25zIjsKKyAgICAgIGNhc2UgIlN5bWJvbHMiOgorICAgICAgICByZXR1cm4gIjNTeW1ib2xzIjsKKyAgICAgIGNhc2UgIlN5bWJvbHMyIjoKKyAgICAgICAgcmV0dXJuICIzU3ltYm9sczIiOworICAgICAgY2FzZSAiVHJhZmZpY0xpZ2h0czEiOgorICAgICAgICByZXR1cm4gIjNUcmFmZmljTGlnaHRzMSI7CisgICAgICBjYXNlICJUcmFmZmljTGlnaHRzMiI6CisgICAgICAgIHJldHVybiAiM1RyYWZmaWNMaWdodHMyIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdHlwZSIpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwLmNzCmluZGV4IGVjN2Q4MzYuLmY4ZWJhZGUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAuY3MKKysrIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsNTEgKzEzLDQzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cAotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAKLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKLSAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAKLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOwogCi0gICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCgKKy8vLyA8c3VtbWFyeT4KKy8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cAorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCgKICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKQEAgLTY1LDYyICs1Nyw0MCBAQAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIHR5cGUsCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCi0gICAgewotICAgIH0KKyAgICAgICAgICB0eXBlLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KLSAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCgKICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlIHR5cGUsCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQotICAgICAgOiB0aGlzKAotICAgICAgICB0eXBlLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KKyAgICAgIDogdGhpcyh0eXBlLCBhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBpdGVtRWxlbWVudE5vZGUsIG51bGwpIHt9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwKAogICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUgdHlwZSwKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICB0eXBlLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgOiB0aGlzKHR5cGUsIGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9kYXkuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9kYXkuY3MKaW5kZXggYzIxNzY2NS4uNmI5OTI2MiAxMDA2NDQKLS0tIGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvZGF5LmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb2RheS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTEyICsxMyw4MiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBFeWFsIFNlYWd1bGwgICAgICAgIEFkZGVkICAgICAgIAkJICAyMDEyLTA0LTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOworCiB1c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmcKLXsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9kYXkKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb2RheSA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIHsKICAgLy8vIDxzdW1tYXJ5PgotICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb2RheQorICAvLy8KICAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9kYXkKLSAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvZGF5KAorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvZGF5KAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVG9kYXksCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgKG5hbWVzcGFjZU1hbmFnZXIgPT0gbnVsbCkgPyB3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciA6IG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVG9kYXksCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRpbWVQZXJpb2QgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5Ub2RheTsKLSAgICAgICAgICAgIEZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KAotICAgICAgICAgICAgICAiRkxPT1IoezB9LDEpPVRPREFZKCkiLAotICAgICAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOwotICAgICAgICB9CisgICAgICBUaW1lUGVyaW9kID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVG9kYXk7CisgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgiRkxPT1IoezB9LDEpPVRPREFZKCkiLCBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOwogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9kYXkoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvZGF5KAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9kYXkoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9kYXkoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvbW9ycm93LmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvbW9ycm93LmNzCmluZGV4IGNlYzgyYjAuLjZiNWFhOTIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb21vcnJvdy5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9tb3Jyb3cuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDExMiArMTMsODIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvbW9ycm93CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9tb3Jyb3cgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cCB7CiAgIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9tb3Jyb3cKKyAgLy8vCiAgIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvbW9ycm93Ci0gICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RpbWVQZXJpb2RHcm91cAotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb21vcnJvdygKKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb21vcnJvdygKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvbW9ycm93LAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvbW9ycm93LAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIGlmIChpdGVtRWxlbWVudE5vZGUKKyAgICAgICAgPT0gbnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAogICAgIHsKLSAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZT09bnVsbCkgLy9TZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGNyZWF0ZSBhdHRyaWJ1dGVzIGlmIG5lZWRlZAotICAgICAgICB7Ci0gICAgICAgICAgICBUaW1lUGVyaW9kID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVG9tb3Jyb3c7Ci0gICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKLSAgICAgICAgICAgICAgIkZMT09SKHswfSwxKT1UT0RBWSgpKzEiLAotICAgICAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOwotICAgICAgICB9CisgICAgICBUaW1lUGVyaW9kID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuVG9tb3Jyb3c7CisgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgiRkxPT1IoezB9LDEpPVRPREFZKCkrMSIsIEFkZHJlc3MuU3RhcnQuQWRkcmVzcyk7CiAgICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb21vcnJvdygKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9tb3Jyb3coCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBpdGVtRWxlbWVudE5vZGUsIG51bGwpIHt9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb21vcnJvdygKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb21vcnJvdygKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcC5jcwppbmRleCA3ODdmMWM5Li45NTY5N2QwIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3AuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDExMiArMTMsODYgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcAotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKIAotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcCgKKy8vLyA8c3VtbWFyeT4KKy8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcAorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvcCwKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub3AsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJvdHRvbSA9IGZhbHNlOwotICAgICAgICAgICAgUGVyY2VudCA9IGZhbHNlOwotICAgICAgICAgICAgUmFuayA9IDEwOyAgLy8gRmlyc3QgMTAgdmFsdWVzCi0gICAgICAgIH0KKyAgICAgIEJvdHRvbSA9IGZhbHNlOworICAgICAgUGVyY2VudCA9IGZhbHNlOworICAgICAgUmFuayA9IDEwOyAvLyBGaXJzdCAxMCB2YWx1ZXMKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcCgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcCgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wUGVyY2VudC5jcyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BQZXJjZW50LmNzCmluZGV4IDVjMjk5Y2MuLjkyOTM2OWQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BQZXJjZW50LmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BQZXJjZW50LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMTIgKzEzLDg2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEV5YWwgU2VhZ3VsbCAgICAgICAgQWRkZWQgICAgICAgCQkgIDIwMTItMDQtMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZwotewotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcFBlcmNlbnQKLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wUGVyY2VudAotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcEJvdHRvbUdyb3VwCi0gIHsKLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKIAotICAgICNyZWdpb24gQ29uc3RydWN0b3JzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcFBlcmNlbnQoCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BQZXJjZW50CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wUGVyY2VudAorICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAorICAgICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVG9wQm90dG9tR3JvdXAgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcFBlcmNlbnQoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ub3BQZXJjZW50LAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlRvcFBlcmNlbnQsCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJvdHRvbSA9IGZhbHNlOwotICAgICAgICAgICAgUGVyY2VudCA9IHRydWU7Ci0gICAgICAgICAgICBSYW5rID0gMTA7ICAvLyBGaXJzdCAxMCBwZXJjZW50Ci0gICAgICAgIH0KKyAgICAgIEJvdHRvbSA9IGZhbHNlOworICAgICAgUGVyY2VudCA9IHRydWU7CisgICAgICBSYW5rID0gMTA7IC8vIEZpcnN0IDEwIHBlcmNlbnQKICAgICB9CisgIH0KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcFBlcmNlbnQoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcFBlcmNlbnQoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBpdGVtRWxlbWVudE5vZGUsIG51bGwpIHt9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUb3BQZXJjZW50KAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1RvcFBlcmNlbnQoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgbnVsbCwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQotICAgICNlbmRyZWdpb24gQ29uc3RydWN0b3JzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUuY3MgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZS5jcwppbmRleCBlZjMyMmYwLi4yOWE1YTllIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZS5jcworKysgYi9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTY4ICsxMywxMzIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CisKIHVzaW5nIFN5c3RlbS5EcmF3aW5nOwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZQotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlCiAgICAgOiBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGUsCi0gICAgSUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZQotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICBJRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUHJpdmF0ZSBMb3cgVmFsdWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHJpdmF0ZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSBfbG93VmFsdWU7CiAKLSAgICAjcmVnaW9uIFByaXZhdGUgUHJvcGVydGllcwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUHJpdmF0ZSBMb3cgVmFsdWUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHByaXZhdGUgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUgX2xvd1ZhbHVlOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQcml2YXRlIEhpZ2ggVmFsdWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHJpdmF0ZSBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSBfaGlnaFZhbHVlOwogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBQcml2YXRlIEhpZ2ggVmFsdWUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHByaXZhdGUgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUgX2hpZ2hWYWx1ZTsKLSAgICAjZW5kcmVnaW9uIFByaXZhdGUgUHJvcGVydGllcwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUd29Db2xvclNjYWxlKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAogICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQogICAgICAgOiBiYXNlKAotICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ud29Db2xvclNjYWxlLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQotICAgIHsKLSAgICAgIC8vIENyZWF0ZSB0aGUgPGNvbG9yU2NhbGU+IG5vZGUgaW5zaWRlIHRoZSA8Y2ZSdWxlPiBub2RlCi0gICAgICB2YXIgY29sb3JTY2FsZU5vZGUgPSBDcmVhdGVDb21wbGV4Tm9kZSgKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5Ud29Db2xvclNjYWxlLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikgeworICAgIC8vIENyZWF0ZSB0aGUgPGNvbG9yU2NhbGU+IG5vZGUgaW5zaWRlIHRoZSA8Y2ZSdWxlPiBub2RlCisgICAgdmFyIGNvbG9yU2NhbGVOb2RlID0gQ3JlYXRlQ29tcGxleE5vZGUoCiAgICAgICAgIE5vZGUsCi0gICAgICAgIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLlBhdGhzLkNvbG9yU2NhbGUpOworICAgICAgICBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5QYXRocy5fY29sb3JTY2FsZSk7CiAKLSAgICAgIC8vIExvd1ZhbHVlIGRlZmF1bHQKLSAgICAgIExvd1ZhbHVlID0gbmV3IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sb3JTY2FsZVZhbHVlKAorICAgIC8vIExvd1ZhbHVlIGRlZmF1bHQKKyAgICBMb3dWYWx1ZSA9IG5ldygKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RQb3NpdGlvbi5Mb3csCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0VHlwZS5NaW4sCi0gICAgICAgIENvbG9yVHJhbnNsYXRvci5Gcm9tSHRtbChFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbnN0YW50cy5Db2xvcnMuQ2Z2b0xvd1ZhbHVlKSwKKyAgICAgICAgQ29sb3JUcmFuc2xhdG9yLkZyb21IdG1sKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNvbG9ycy5fY2Z2b0xvd1ZhbHVlKSwKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVHdvQ29sb3JTY2FsZSwKICAgICAgICAgYWRkcmVzcywKICAgICAgICAgcHJpb3JpdHksCiAgICAgICAgIHdvcmtzaGVldCwKICAgICAgICAgTmFtZVNwYWNlTWFuYWdlcik7CiAKLSAgICAgIC8vIEhpZ2hWYWx1ZSBkZWZhdWx0Ci0gICAgICBIaWdoVmFsdWUgPSBuZXcgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUoCisgICAgLy8gSGlnaFZhbHVlIGRlZmF1bHQKKyAgICBIaWdoVmFsdWUgPSBuZXcoCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1ZhbHVlT2JqZWN0UG9zaXRpb24uSGlnaCwKICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVmFsdWVPYmplY3RUeXBlLk1heCwKLSAgICAgICAgQ29sb3JUcmFuc2xhdG9yLkZyb21IdG1sKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNvbG9ycy5DZnZvSGlnaFZhbHVlKSwKKyAgICAgICAgQ29sb3JUcmFuc2xhdG9yLkZyb21IdG1sKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29uc3RhbnRzLkNvbG9ycy5fY2Z2b0hpZ2hWYWx1ZSksCiAgICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlR3b0NvbG9yU2NhbGUsCiAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgIHByaW9yaXR5LAogICAgICAgICB3b3Jrc2hlZXQsCiAgICAgICAgIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZSgKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZSgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKLSAgICAgICAgbnVsbCkKLSAgICB7Ci0gICAgfQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIGl0ZW1FbGVtZW50Tm9kZSwgbnVsbCkge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1R3b0NvbG9yU2NhbGUoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVHdvQ29sb3JTY2FsZSgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBudWxsLCBudWxsKSB7fQogCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBMb3cgVmFsdWUgZm9yIFR3byBDb2xvciBTY2FsZSBPYmplY3QgVmFsdWUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSBMb3dWYWx1ZQotICAgIHsKLSAgICAgIGdldCB7IHJldHVybiBfbG93VmFsdWU7IH0KLSAgICAgIHNldCB7IF9sb3dWYWx1ZSA9IHZhbHVlOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBIaWdoIFZhbHVlIGZvciBUd28gQ29sb3IgU2NhbGUgT2JqZWN0IFZhbHVlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUgSGlnaFZhbHVlCi0gICAgewotICAgICAgZ2V0IHsgcmV0dXJuIF9oaWdoVmFsdWU7IH0KLSAgICAgIHNldCB7IF9oaWdoVmFsdWUgPSB2YWx1ZTsgfQotICAgIH0KLSAgICAjZW5kcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTG93IFZhbHVlIGZvciBUd28gQ29sb3IgU2NhbGUgT2JqZWN0IFZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbG9yU2NhbGVWYWx1ZSBMb3dWYWx1ZSB7CisgICAgZ2V0ID0+IF9sb3dWYWx1ZTsKKyAgICBzZXQgPT4gX2xvd1ZhbHVlID0gdmFsdWU7CiAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSGlnaCBWYWx1ZSBmb3IgVHdvIENvbG9yIFNjYWxlIE9iamVjdCBWYWx1ZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xvclNjYWxlVmFsdWUgSGlnaFZhbHVlIHsKKyAgICBnZXQgPT4gX2hpZ2hWYWx1ZTsKKyAgICBzZXQgPT4gX2hpZ2hWYWx1ZSA9IHZhbHVlOworICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzLmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcy5jcwppbmRleCBmZDMyMjEwLi5lZjRkNzJlIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzLmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDEwNiArMTMsNzggQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17Ci0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcwotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlLAotICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcwotICB7Ci0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLSAgICAjcmVnaW9uIENvbnN0cnVjdG9ycwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMoCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdVbmlxdWVWYWx1ZXMKKyAgICA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSwKKyAgICAgIElFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcyB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKICAgICAgIDogYmFzZSgKLSAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVW5pcXVlVmFsdWVzLAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKQotICAgIHsKLSAgICB9CisgICAgICAgICAgZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZVR5cGUuVW5pcXVlVmFsdWVzLAorICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgd29ya3NoZWV0LAorICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikge30KIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcygKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzKAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCiAgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgIDogdGhpcygKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9CisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVW5pcXVlVmFsdWVzKAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1VuaXF1ZVZhbHVlcygKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBudWxsLAotICAgICAgICBudWxsKQotICAgIHsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvcnMKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgICAgOiB0aGlzKGFkZHJlc3MsIHByaW9yaXR5LCB3b3Jrc2hlZXQsIG51bGwsIG51bGwpIHt9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nWWVzdGVyZGF5LmNzIGIvRVBQbHVzL0NvbmRpdGlvbmFsRm9ybWF0dGluZy9SdWxlcy9FeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1llc3RlcmRheS5jcwppbmRleCA4N2ZlODZmLi4xNTg5NDhjIDEwMDY0NAotLS0gYS9FUFBsdXMvQ29uZGl0aW9uYWxGb3JtYXR0aW5nL1J1bGVzL0V4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nWWVzdGVyZGF5LmNzCisrKyBiL0VQUGx1cy9Db25kaXRpb25hbEZvcm1hdHRpbmcvUnVsZXMvRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdZZXN0ZXJkYXkuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDExMiArMTMsODIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogRXlhbCBTZWFndWxsICAgICAgICBBZGRlZCAgICAgICAJCSAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKKwogdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi17CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1llc3RlcmRheQorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1llc3RlcmRheSA6IEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZEdyb3VwIHsKICAgLy8vIDxzdW1tYXJ5PgotICAvLy8gRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdZZXN0ZXJkYXkKKyAgLy8vCiAgIC8vLyA8L3N1bW1hcnk+Ci0gIHB1YmxpYyBjbGFzcyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1llc3RlcmRheQotICAgIDogRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kR3JvdXAKLSAgewotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nWWVzdGVyZGF5KAorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1llc3RlcmRheSgKICAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAogICAgICAgaW50IHByaW9yaXR5LAogICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAogICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCiAgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCiAgICAgICA6IGJhc2UoCi0gICAgICAgIGVFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ1J1bGVUeXBlLlllc3RlcmRheSwKLSAgICAgICAgYWRkcmVzcywKLSAgICAgICAgcHJpb3JpdHksCi0gICAgICAgIHdvcmtzaGVldCwKLSAgICAgICAgaXRlbUVsZW1lbnROb2RlLAotICAgICAgICAobmFtZXNwYWNlTWFuYWdlciA9PSBudWxsKSA/IHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyIDogbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgICAgICBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlVHlwZS5ZZXN0ZXJkYXksCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICB3b3Jrc2hlZXQsCisgICAgICAgICAgaXRlbUVsZW1lbnROb2RlLAorICAgICAgICAgIChuYW1lc3BhY2VNYW5hZ2VyID09IG51bGwpID8gd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIgOiBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZQorICAgICAgICA9PSBudWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCiAgICAgewotICAgICAgICBpZiAoaXRlbUVsZW1lbnROb2RlPT1udWxsKSAvL1NldCBkZWZhdWx0IHZhbHVlcyBhbmQgY3JlYXRlIGF0dHJpYnV0ZXMgaWYgbmVlZGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRpbWVQZXJpb2QgPSBlRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdUaW1lUGVyaW9kVHlwZS5ZZXN0ZXJkYXk7Ci0gICAgICAgICAgICBGb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgKLSAgICAgICAgICAgICAgIkZMT09SKHswfSwxKT1UT0RBWSgpLTEiLAotICAgICAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOwotICAgICAgICB9CisgICAgICBUaW1lUGVyaW9kID0gZUV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nVGltZVBlcmlvZFR5cGUuWWVzdGVyZGF5OworICAgICAgRm9ybXVsYSA9IHN0cmluZy5Gb3JtYXQoIkZMT09SKHswfSwxKT1UT0RBWSgpLTEiLCBBZGRyZXNzLlN0YXJ0LkFkZHJlc3MpOwogICAgIH0KKyAgfQogCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nWWVzdGVyZGF5KAorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InByaW9yaXR5Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdZZXN0ZXJkYXkoCiAgICAgICBFeGNlbEFkZHJlc3MgYWRkcmVzcywKICAgICAgIGludCBwcmlvcml0eSwKICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKICAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQotICAgICAgOiB0aGlzKAotICAgICAgICBhZGRyZXNzLAotICAgICAgICBwcmlvcml0eSwKLSAgICAgICAgd29ya3NoZWV0LAotICAgICAgICBpdGVtRWxlbWVudE5vZGUsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KKyAgICAgIDogdGhpcyhhZGRyZXNzLCBwcmlvcml0eSwgd29ya3NoZWV0LCBpdGVtRWxlbWVudE5vZGUsIG51bGwpIHt9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJwcmlvcml0eSI+PC9wYXJhbT4KLSAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgaW50ZXJuYWwgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdZZXN0ZXJkYXkoCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpb3JpdHkiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nWWVzdGVyZGF5KAogICAgICAgRXhjZWxBZGRyZXNzIGFkZHJlc3MsCiAgICAgICBpbnQgcHJpb3JpdHksCiAgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQpCi0gICAgICA6IHRoaXMoCi0gICAgICAgIGFkZHJlc3MsCi0gICAgICAgIHByaW9yaXR5LAotICAgICAgICB3b3Jrc2hlZXQsCi0gICAgICAgIG51bGwsCi0gICAgICAgIG51bGwpCi0gICAgewotICAgIH0KLSAgICAjZW5kcmVnaW9uIENvbnN0cnVjdG9ycwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICA6IHRoaXMoYWRkcmVzcywgcHJpb3JpdHksIHdvcmtzaGVldCwgbnVsbCwgbnVsbCkge30KK30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb24uY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uLmNzCmluZGV4IGVjYzIyMDguLjQ0YjVkM2UgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb24uY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbi5jcwpAQCAtMTMsODMgKzEzLDg2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBJbnRlcmZhY2UgZm9yIGRhdGEgdmFsaWRhdGlvbgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvbgotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcmVzcyBvZiBkYXRhIHZhbGlkYXRpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgRXhjZWxBZGRyZXNzIEFkZHJlc3MgeyBnZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVmFsaWRhdGlvbiB0eXBlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIFZhbGlkYXRpb25UeXBlIHsgZ2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnRyb2xzIGhvdyBFeGNlbCB3aWxsIGhhbmRsZSBpbnZhbGlkIHZhbHVlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvbldhcm5pbmdTdHlsZSBFcnJvclN0eWxleyBnZXQ7IHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUcnVlIGlmIGlucHV0IG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGJvb2w/IEFsbG93QmxhbmsgeyBnZXQ7IHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUcnVlIGlmIGlucHV0IG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGJvb2w/IFNob3dJbnB1dE1lc3NhZ2UgeyBnZXQ7IHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUcnVlIGlmIGVycm9yIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBib29sPyBTaG93RXJyb3JNZXNzYWdlIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGl0bGUgb2YgZXJyb3IgbWVzc2FnZSBib3ggKHNlZSBwcm9wZXJ0eSBTaG93RXJyb3JNZXNzYWdlKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBzdHJpbmcgRXJyb3JUaXRsZSB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEVycm9yIG1lc3NhZ2UgYm94IHRleHQgKHNlZSBwcm9wZXJ0eSBTaG93RXJyb3JNZXNzYWdlKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBzdHJpbmcgRXJyb3IgeyBnZXQ7IHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaXRsZSBvZiBpbmZvIGJveCBpZiBpbnB1dCBtZXNzYWdlIHNob3VsZCBiZSBzaG93biAoc2VlIHByb3BlcnR5IFNob3dJbnB1dE1lc3NhZ2UpCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHN0cmluZyBQcm9tcHRUaXRsZSB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluZm8gbWVzc2FnZSB0ZXh0IChzZWUgcHJvcGVydHkgU2hvd0Vycm9yTWVzc2FnZSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgc3RyaW5nIFByb21wdCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRydWUgaWYgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbiB0eXBlIGFsbG93cyBvcGVyYXRvci4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgYm9vbCBBbGxvd3NPcGVyYXRvciB7IGdldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBWYWxpZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSB2YWxpZGF0aW9uLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICB2b2lkIFZhbGlkYXRlKCk7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHM7CiAKKy8vLyA8c3VtbWFyeT4KKy8vLyBJbnRlcmZhY2UgZm9yIGRhdGEgdmFsaWRhdGlvbgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb24geworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRyZXNzIG9mIGRhdGEgdmFsaWRhdGlvbgorICAvLy8gPC9zdW1tYXJ5PgorICBFeGNlbEFkZHJlc3MgQWRkcmVzcyB7IGdldDsgfQogCi0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBWYWxpZGF0aW9uIHR5cGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgVmFsaWRhdGlvblR5cGUgeyBnZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb250cm9scyBob3cgRXhjZWwgd2lsbCBoYW5kbGUgaW52YWxpZCB2YWx1ZXMuCisgIC8vLyA8L3N1bW1hcnk+CisgIEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUgRXJyb3JTdHlsZSB7IGdldDsgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHJ1ZSBpZiBpbnB1dCBtZXNzYWdlIHNob3VsZCBiZSBzaG93bgorICAvLy8gPC9zdW1tYXJ5PgorICBib29sPyBBbGxvd0JsYW5rIHsgZ2V0OyBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUcnVlIGlmIGlucHV0IG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duCisgIC8vLyA8L3N1bW1hcnk+CisgIGJvb2w/IFNob3dJbnB1dE1lc3NhZ2UgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRydWUgaWYgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24uCisgIC8vLyA8L3N1bW1hcnk+CisgIGJvb2w/IFNob3dFcnJvck1lc3NhZ2UgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRpdGxlIG9mIGVycm9yIG1lc3NhZ2UgYm94IChzZWUgcHJvcGVydHkgU2hvd0Vycm9yTWVzc2FnZSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgc3RyaW5nIEVycm9yVGl0bGUgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEVycm9yIG1lc3NhZ2UgYm94IHRleHQgKHNlZSBwcm9wZXJ0eSBTaG93RXJyb3JNZXNzYWdlKQorICAvLy8gPC9zdW1tYXJ5PgorICBzdHJpbmcgRXJyb3IgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRpdGxlIG9mIGluZm8gYm94IGlmIGlucHV0IG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duIChzZWUgcHJvcGVydHkgU2hvd0lucHV0TWVzc2FnZSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgc3RyaW5nIFByb21wdFRpdGxlIHsgZ2V0OyBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbmZvIG1lc3NhZ2UgdGV4dCAoc2VlIHByb3BlcnR5IFNob3dFcnJvck1lc3NhZ2UpCisgIC8vLyA8L3N1bW1hcnk+CisgIHN0cmluZyBQcm9tcHQgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRydWUgaWYgdGhlIGN1cnJlbnQgdmFsaWRhdGlvbiB0eXBlIGFsbG93cyBvcGVyYXRvci4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgYm9vbCBBbGxvd3NPcGVyYXRvciB7IGdldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFZhbGlkYXRlcyB0aGUgc3RhdGUgb2YgdGhlIHZhbGlkYXRpb24uCisgIC8vLyA8L3N1bW1hcnk+CisgIHZvaWQgVmFsaWRhdGUoKTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25BbnkuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uQW55LmNzCmluZGV4IDM1MGRkYWYuLmMzYjZiZmQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25BbnkuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkFueS5jcwpAQCAtMTMsMzMgKzEzLDI1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFJhemlxIFlvcmsgICAJCSAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDE0LTA4LTA4CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIERhdGEgdmFsaWRhdGlvbiBpbnRlcmZhY2UgZm9yIEFueSB2YWx1ZSB2YWxpZGF0aW9uLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvbkFueSA6IElFeGNlbERhdGFWYWxpZGF0aW9uCi0gICAgewotICAgIH0KLX0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0czsKKworLy8vIDxzdW1tYXJ5PgorLy8vIERhdGEgdmFsaWRhdGlvbiBpbnRlcmZhY2UgZm9yIEFueSB2YWx1ZSB2YWxpZGF0aW9uLgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25BbnkgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbiB7fQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkN1c3RvbS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20uY3MKaW5kZXggMWNmZGJhOS4uZjU2N2NlNCAxMDA2NDQKLS0tIGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkN1c3RvbS5jcworKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywzNCArMTMsMzAgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAogICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OworCiB1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBEYXRhIHZhbGlkYXRpb24gaW50ZXJmYWNlIGZvciBjdXN0b20gdmFsaWRhdGlvbi4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20gOiBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhPElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYT4sIElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aE9wZXJhdG9yCi0gICAgewotICAgIH0KLX0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0czsKKworLy8vIDxzdW1tYXJ5PgorLy8vIERhdGEgdmFsaWRhdGlvbiBpbnRlcmZhY2UgZm9yIGN1c3RvbSB2YWxpZGF0aW9uLgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20KKyAgICA6IElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGE8SUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhPiwKKyAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aE9wZXJhdG9yIHt9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUuY3MKaW5kZXggM2U5NmIwMy4uNmFiNDBkMCAxMDA2NDQKLS0tIGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lLmNzCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMzQgKzEzLDMwIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKKwogdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0cwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVmFsaWRhdGlvbiBpbnRlcmZhY2UgZm9yIGRhdGV0aW1lIHZhbGlkYXRpb25zCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZT4sIElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aE9wZXJhdG9yCi0gICAgewotICAgIH0KLX0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0czsKKworLy8vIDxzdW1tYXJ5PgorLy8vIFZhbGlkYXRpb24gaW50ZXJmYWNlIGZvciBkYXRldGltZSB2YWxpZGF0aW9ucworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZQorICAgIDogSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTI8SUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWU+LAorICAgICAgSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoT3BlcmF0b3Ige30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwuY3MKaW5kZXggOGI0ZjM1Ni4uNDg5ODNlZCAxMDA2NDQKLS0tIGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDM0ICsxMywzMCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CiAgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CisKIHVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIERhdGEgdmFsaWRhdGlvbiBpbnRlcmZhY2UgZm9yIGRlY2ltYWwgdmFsdWVzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbCA6IElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEyPElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURlY2ltYWw+LCBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhPcGVyYXRvcgotICAgIHsKLSAgICB9Ci19CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHM7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBEYXRhIHZhbGlkYXRpb24gaW50ZXJmYWNlIGZvciBkZWNpbWFsIHZhbHVlcworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsCisgICAgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsPiwKKyAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aE9wZXJhdG9yIHt9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uSW50LmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkludC5jcwppbmRleCBhNTQ4NjNkLi45ZDk4NGUyIDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uSW50LmNzCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDMxICsxMywyNyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CiAgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CisKIHVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHMKLXsKLSAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uSW50IDogSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTI8SUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50PiwgSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoT3BlcmF0b3IKLSAgICB7Ci0gICAgfQotfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOworCitwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uSW50CisgICAgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFJbnQ+LAorICAgICAgSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoT3BlcmF0b3Ige30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0LmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QuY3MKaW5kZXggZDBhZTRmMi4uMTNiYjVhOSAxMDA2NDQKLS0tIGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QuY3MKQEAgLTEzLDMxICsxMywyNiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CiAgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CisKIHVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHMKLXsKLSAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uTGlzdCA6IElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGE8SUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhTGlzdD4KLSAgICB7Ci0gICAgfQotfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOworCitwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uTGlzdAorICAgIDogSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFMaXN0PiB7fQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uVGltZS5jcwppbmRleCBlYTI2ZGQ1Li40YzU3NTg3IDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uVGltZS5jcworKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uVGltZS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMzQgKzEzLDMwIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKKwogdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0cwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRGF0YSB2YWxpZGF0aW9uIGludGVyZmFjZSBmb3IgdGltZSB2YWxpZGF0aW9uLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lPiwgSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoT3BlcmF0b3IKLSAgICB7Ci0gICAgfQotfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOworCisvLy8gPHN1bW1hcnk+CisvLy8gRGF0YSB2YWxpZGF0aW9uIGludGVyZmFjZSBmb3IgdGltZSB2YWxpZGF0aW9uLgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lCisgICAgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lPiwKKyAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aE9wZXJhdG9yIHt9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEuY3MKaW5kZXggMjUxZjA3OS4uYjkzZGQzMCAxMDA2NDQKLS0tIGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhLmNzCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYS5jcwpAQCAtMTMsMzMgKzEzLDI4IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKKwogdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0cwotewotICAgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTxUPiA6IElFeGNlbERhdGFWYWxpZGF0aW9uCi0gICAgICAgIHdoZXJlIFQgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEKLSAgICB7Ci0gICAgICAgIFQgRm9ybXVsYSB7IGdldDsgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0czsKKworcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhPFQ+IDogSUV4Y2VsRGF0YVZhbGlkYXRpb24KKyAgICB3aGVyZSBUIDogSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhIHsKKyAgVCBGb3JtdWxhIHsgZ2V0OyB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEyLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMi5jcwppbmRleCA0MWRhMWVmLi4yZjY2OTJiIDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEyLmNzCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTIuY3MKQEAgLTEzLDQwICsxMywzNSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTA4CiAgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CisKIHVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEludGVyZmFjZSBmb3IgYSBkYXRhIHZhbGlkYXRpb24gd2l0aCB0d28gZm9ybXVsYXMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPjwvdHlwZXBhcmFtPgotICAgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTI8VD4gOiBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhPFQ+Ci0gICAgICAgIHdoZXJlIFQgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvcm11bGEgMgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBUIEZvcm11bGEyIHsgZ2V0OyB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOworCisvLy8gPHN1bW1hcnk+CisvLy8gSW50ZXJmYWNlIGZvciBhIGRhdGEgdmFsaWRhdGlvbiB3aXRoIHR3byBmb3JtdWxhcworLy8vIDwvc3VtbWFyeT4KKy8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPjwvdHlwZXBhcmFtPgorcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxUPiA6IElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGE8VD4KKyAgICB3aGVyZSBUIDogSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRm9ybXVsYSAyCisgIC8vLyA8L3N1bW1hcnk+CisgIFQgRm9ybXVsYTIgeyBnZXQ7IH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoT3BlcmF0b3IuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uV2l0aE9wZXJhdG9yLmNzCmluZGV4IGEyNGJkNGYuLjQ4YjA2Y2IgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoT3BlcmF0b3IuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhPcGVyYXRvci5jcwpAQCAtMTMsMzcgKzEzLDMxIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBSZXByZXNlbnRzIGEgdmFsaWRhdGlvbiB3aXRoIGFuIG9wZXJhdG9yCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uV2l0aE9wZXJhdG9yCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBPcGVyYXRvciB0eXBlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvciBPcGVyYXRvciB7IGdldDsgc2V0OyB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOworCisvLy8gPHN1bW1hcnk+CisvLy8gUmVwcmVzZW50cyBhIHZhbGlkYXRpb24gd2l0aCBhbiBvcGVyYXRvcgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoT3BlcmF0b3IgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBPcGVyYXRvciB0eXBlCisgIC8vLyA8L3N1bW1hcnk+CisgIEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvciBPcGVyYXRvciB7IGdldDsgc2V0OyB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbi5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uLmNzCmluZGV4IGNkMmZkZGEuLjBmNzRlZDkgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uLmNzCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywzODcgKzEzLDI5MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTAxCiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKLXVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKK3VzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0czsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBFeGNlbCBkYXRhdmFsaWRhdGlvbgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb24gOiBYbWxIZWxwZXIsIElFeGNlbERhdGFWYWxpZGF0aW9uCi0gICAgewotICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfaXRlbUVsZW1lbnROb2RlTmFtZSA9ICJkOmRhdGFWYWxpZGF0aW9uIjsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwogCisvLy8gPHN1bW1hcnk+CisvLy8gRXhjZWwgZGF0YXZhbGlkYXRpb24KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbiA6IFhtbEhlbHBlciwgSUV4Y2VsRGF0YVZhbGlkYXRpb24geworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfaXRlbUVsZW1lbnROb2RlTmFtZSA9ICJkOmRhdGFWYWxpZGF0aW9uIjsKIAotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfZXJyb3JTdHlsZVBhdGggPSAiQGVycm9yU3R5bGUiOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfZXJyb3JUaXRsZVBhdGggPSAiQGVycm9yVGl0bGUiOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfZXJyb3JQYXRoID0gIkBlcnJvciI7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9wcm9tcHRUaXRsZVBhdGggPSAiQHByb21wdFRpdGxlIjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3Byb21wdFBhdGggPSAiQHByb21wdCI7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9vcGVyYXRvclBhdGggPSAiQG9wZXJhdG9yIjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3Nob3dFcnJvck1lc3NhZ2VQYXRoID0gIkBzaG93RXJyb3JNZXNzYWdlIjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3Nob3dJbnB1dE1lc3NhZ2VQYXRoID0gIkBzaG93SW5wdXRNZXNzYWdlIjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3R5cGVNZXNzYWdlUGF0aCA9ICJAdHlwZSI7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9zcXJlZlBhdGggPSAiQHNxcmVmIjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX2FsbG93QmxhbmtQYXRoID0gIkBhbGxvd0JsYW5rIjsKLSAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0cmluZyBfZm9ybXVsYTFQYXRoID0gImQ6Zm9ybXVsYTEiOwotICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RyaW5nIF9mb3JtdWxhMlBhdGggPSAiZDpmb3JtdWxhMiI7CisgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9lcnJvclN0eWxlUGF0aCA9ICJAZXJyb3JTdHlsZSI7CisgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9lcnJvclRpdGxlUGF0aCA9ICJAZXJyb3JUaXRsZSI7CisgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9lcnJvclBhdGggPSAiQGVycm9yIjsKKyAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3Byb21wdFRpdGxlUGF0aCA9ICJAcHJvbXB0VGl0bGUiOworICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfcHJvbXB0UGF0aCA9ICJAcHJvbXB0IjsKKyAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX29wZXJhdG9yUGF0aCA9ICJAb3BlcmF0b3IiOworICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfc2hvd0Vycm9yTWVzc2FnZVBhdGggPSAiQHNob3dFcnJvck1lc3NhZ2UiOworICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfc2hvd0lucHV0TWVzc2FnZVBhdGggPSAiQHNob3dJbnB1dE1lc3NhZ2UiOworICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfdHlwZU1lc3NhZ2VQYXRoID0gIkB0eXBlIjsKKyAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3NxcmVmUGF0aCA9ICJAc3FyZWYiOworICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfYWxsb3dCbGFua1BhdGggPSAiQGFsbG93QmxhbmsiOworICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RyaW5nIF9mb3JtdWxhMVBhdGggPSAiZDpmb3JtdWxhMSI7CisgIHByb3RlY3RlZCByZWFkb25seSBzdHJpbmcgX2Zvcm11bGEyUGF0aCA9ICJkOmZvcm11bGEyIjsKIAotICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlKQotICAgICAgICAgICAgOiB0aGlzKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIG51bGwpCi0gICAgICAgIHsgfQorICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uKAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgc3RyaW5nIGFkZHJlc3MsCisgICAgICBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSkKKyAgICAgIDogdGhpcyh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBudWxsKSB7fQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnN0cnVjdG9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij53b3Jrc2hlZXQgdGhhdCBvd25zIHRoZSB2YWxpZGF0aW9uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPlhtbCB0b3Agbm9kZSAoZGF0YVZhbGlkYXRpb25zKTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPkRhdGEgdmFsaWRhdGlvbiB0eXBlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5hZGRyZXNzIGZvciBkYXRhIHZhbGlkYXRpb248L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgICAgICAgIDogdGhpcyh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUsIG51bGwpCi0gICAgICAgIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29uc3RydWN0b3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPndvcmtzaGVldCB0aGF0IG93bnMgdGhlIHZhbGlkYXRpb248L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+WG1sIHRvcCBub2RlIChkYXRhVmFsaWRhdGlvbnMpPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+RGF0YSB2YWxpZGF0aW9uIHR5cGU8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPmFkZHJlc3MgZm9yIGRhdGEgdmFsaWRhdGlvbjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb24oCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBzdHJpbmcgYWRkcmVzcywKKyAgICAgIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IHRoaXMod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlLCBudWxsKSB7fQogCi0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+d29ya3NoZWV0IHRoYXQgb3ducyB0aGUgdmFsaWRhdGlvbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj5YbWwgdG9wIG5vZGUgKGRhdGFWYWxpZGF0aW9ucykgd2hlbiBpbXBvcnRpbmcgeG1sPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+RGF0YSB2YWxpZGF0aW9uIHR5cGU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPmFkZHJlc3MgZm9yIGRhdGEgdmFsaWRhdGlvbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+WG1sIE5hbWVzcGFjZSBtYW5hZ2VyPC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbihFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKLSAgICAgICAgICAgIDogYmFzZShuYW1lc3BhY2VNYW5hZ2VyICE9IG51bGwgPyBuYW1lc3BhY2VNYW5hZ2VyIDogd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlcXVpcmUuQXJndW1lbnQoYWRkcmVzcykuSXNOb3ROdWxsT3JFbXB0eSgiYWRkcmVzcyIpOwotICAgICAgICAgICAgYWRkcmVzcyA9IENoZWNrQW5kRml4UmFuZ2VBZGRyZXNzKGFkZHJlc3MpOwotICAgICAgICAgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vdmFyIHhtbERvYyA9IHdvcmtzaGVldC5Xb3Jrc2hlZXRYbWw7Ci0gICAgICAgICAgICAgICAgVG9wTm9kZSA9IHdvcmtzaGVldC5Xb3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOmRhdGFWYWxpZGF0aW9ucyIsIHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAvLyBkaWQgbm90IHN1Y2NlZWQgdXNpbmcgdGhlIFhtbEhlbHBlciBtZXRob2RzIGhlcmUuLi4gc28gSSdtIGNyZWF0aW5nIHRoZSBuZXcgbm9kZSB1c2luZyBYbWxEb2N1bWVudC4uLgotICAgICAgICAgICAgICAgIHZhciBuc1VyaSA9IE5hbWVTcGFjZU1hbmFnZXIuTG9va3VwTmFtZXNwYWNlKCJkIik7Ci0gICAgICAgICAgICAgICAgLy9pdGVtRWxlbWVudE5vZGUgPSBUb3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChfaXRlbUVsZW1lbnROb2RlTmFtZSwgbnNVcmkpOwotICAgICAgICAgICAgICAgIGl0ZW1FbGVtZW50Tm9kZSA9IFRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KF9pdGVtRWxlbWVudE5vZGVOYW1lLlNwbGl0KCc6JylbMV0sIG5zVXJpKTsKLSAgICAgICAgICAgICAgICBUb3BOb2RlLkFwcGVuZENoaWxkKGl0ZW1FbGVtZW50Tm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUb3BOb2RlID0gaXRlbUVsZW1lbnROb2RlOwotICAgICAgICAgICAgVmFsaWRhdGlvblR5cGUgPSB2YWxpZGF0aW9uVHlwZTsKLSAgICAgICAgICAgIEFkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzKGFkZHJlc3MpOwotICAgICAgICAgICAgSW5pdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBzZXQgc2NoZW1hIG5vZGUgb3JkZXIKLSAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ldyBzdHJpbmdbXXsgCi0gICAgICAgICAgICAgICAgInR5cGUiLCAKLSAgICAgICAgICAgICAgICAiZXJyb3JTdHlsZSIsIAotICAgICAgICAgICAgICAgICJvcGVyYXRvciIsIAotICAgICAgICAgICAgICAgICJhbGxvd0JsYW5rIiwKLSAgICAgICAgICAgICAgICAic2hvd0lucHV0TWVzc2FnZSIsIAotICAgICAgICAgICAgICAgICJzaG93RXJyb3JNZXNzYWdlIiwgCi0gICAgICAgICAgICAgICAgImVycm9yVGl0bGUiLCAKLSAgICAgICAgICAgICAgICAiZXJyb3IiLCAKLSAgICAgICAgICAgICAgICAicHJvbXB0VGl0bGUiLCAKLSAgICAgICAgICAgICAgICAicHJvbXB0IiwgCi0gICAgICAgICAgICAgICAgInNxcmVmIiwKLSAgICAgICAgICAgICAgICAiZm9ybXVsYTEiLAotICAgICAgICAgICAgICAgICJmb3JtdWxhMiIKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0cmluZyBDaGVja0FuZEZpeFJhbmdlQWRkcmVzcyhzdHJpbmcgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFkZHJlc3MuQ29udGFpbnMoJywnKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJNdWx0aXBsZSBhZGRyZXNzZXMgbWF5IG5vdCBiZSBjb21tYXNlcGFyYXRlZCwgdXNlIHNwYWNlIGluc3RlYWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZHJlc3MgPSBhZGRyZXNzLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICBpZiAoUmVnZXguSXNNYXRjaChhZGRyZXNzLCBAIltBLVpdKzpbQS1aXSsiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRyZXNzID0gQWRkcmVzc1V0aWxpdHkuUGFyc2VFbnRpcmVDb2x1bW5TZWxlY3Rpb25zKGFkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgU2V0TnVsbGFibGVCb29sVmFsdWUoc3RyaW5nIHBhdGgsIGJvb2w/IHZhbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbC5IYXNWYWx1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChwYXRoLCB2YWwuVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUocGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGlzIG1ldGhvZCB3aWxsIHZhbGlkYXRlIHRoZSBzdGF0ZSBvZiB0aGUgdmFsaWRhdGlvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIj5JZiB0aGUgc3RhdGUgYnJlYWtzIHRoZSBydWxlcyBvZiB0aGUgdmFsaWRhdGlvbjwvZXhjZXB0aW9uPgotICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIFZhbGlkYXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBBZGRyZXNzLkFkZHJlc3M7Ci0gICAgICAgICAgICAvLyB2YWxpZGF0ZSBGb3JtdWxhMQotICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KEZvcm11bGExSW50ZXJuYWwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJWYWxpZGF0aW9uIG9mICIgKyBhZGRyZXNzICsgIiBmYWlsZWQ6IEZvcm11bGExIGNhbm5vdCBiZSBlbXB0eSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgI3JlZ2lvbiBQdWJsaWMgcHJvcGVydGllcwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRydWUgaWYgdGhlIHZhbGlkYXRpb24gdHlwZSBhbGxvd3Mgb3BlcmF0b3IgdG8gYmUgc2V0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBBbGxvd3NPcGVyYXRvcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVmFsaWRhdGlvblR5cGUuQWxsb3dPcGVyYXRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHJlc3Mgb2YgZGF0YSB2YWxpZGF0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEFkZHJlc3MgQWRkcmVzcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQWRkcmVzcyhHZXRYbWxOb2RlU3RyaW5nKF9zcXJlZlBhdGgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaXZhdGUgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBBZGRyZXNzVXRpbGl0eS5QYXJzZUVudGlyZUNvbHVtblNlbGVjdGlvbnModmFsdWUuQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc3FyZWZQYXRoLCBhZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBWYWxpZGF0aW9uIHR5cGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIFZhbGlkYXRpb25UeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB0eXBlU3RyaW5nID0gR2V0WG1sTm9kZVN0cmluZyhfdHlwZU1lc3NhZ2VQYXRoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuR2V0QnlTY2hlbWFOYW1lKHR5cGVTdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpdmF0ZSBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF90eXBlTWVzc2FnZVBhdGgsIHZhbHVlLlNjaGVtYU5hbWUsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gT3BlcmF0b3IgZm9yIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgZW50ZXJlZCB2YWx1ZSBhbmQgRm9ybXVsYS9Gb3JtdWxhcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvciBPcGVyYXRvcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgb3BlcmF0b3JTdHJpbmcgPSBHZXRYbWxOb2RlU3RyaW5nKF9vcGVyYXRvclBhdGgpOwotICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkob3BlcmF0b3JTdHJpbmcpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IpRW51bS5QYXJzZSh0eXBlb2YoRXhjZWxEYXRhVmFsaWRhdGlvbk9wZXJhdG9yKSwgb3BlcmF0b3JTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFWYWxpZGF0aW9uVHlwZS5BbGxvd09wZXJhdG9yKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSBjdXJyZW50IHZhbGlkYXRpb24gdHlwZSBkb2VzIG5vdCBhbGxvdyBvcGVyYXRvciB0byBiZSBzZXQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfb3BlcmF0b3JQYXRoLCB2YWx1ZS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdhcm5pbmcgc3R5bGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUgRXJyb3JTdHlsZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZXJyb3JTdHlsZVN0cmluZyA9IEdldFhtbE5vZGVTdHJpbmcoX2Vycm9yU3R5bGVQYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGVycm9yU3R5bGVTdHJpbmcpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChFeGNlbERhdGFWYWxpZGF0aW9uV2FybmluZ1N0eWxlKUVudW0uUGFyc2UodHlwZW9mKEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUpLCBlcnJvclN0eWxlU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUudW5kZWZpbmVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUudW5kZWZpbmVkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShfZXJyb3JTdHlsZVBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9lcnJvclN0eWxlUGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUcnVlIGlmIGJsYW5rcyBzaG91bGQgYmUgYWxsb3dlZAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbD8gQWxsb3dCbGFuawotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2xOdWxsYWJsZShfYWxsb3dCbGFua1BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0TnVsbGFibGVCb29sVmFsdWUoX2FsbG93QmxhbmtQYXRoLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUcnVlIGlmIGlucHV0IG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sPyBTaG93SW5wdXRNZXNzYWdlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbE51bGxhYmxlKF9zaG93SW5wdXRNZXNzYWdlUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXROdWxsYWJsZUJvb2xWYWx1ZShfc2hvd0lucHV0TWVzc2FnZVBhdGgsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRydWUgaWYgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2w/IFNob3dFcnJvck1lc3NhZ2UKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sTnVsbGFibGUoX3Nob3dFcnJvck1lc3NhZ2VQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldE51bGxhYmxlQm9vbFZhbHVlKF9zaG93RXJyb3JNZXNzYWdlUGF0aCwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGl0bGUgb2YgZXJyb3IgbWVzc2FnZSBib3gKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBFcnJvclRpdGxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKF9lcnJvclRpdGxlUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9lcnJvclRpdGxlUGF0aCwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRXJyb3IgbWVzc2FnZSBib3ggdGV4dAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIEVycm9yCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKF9lcnJvclBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfZXJyb3JQYXRoLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RyaW5nIFByb21wdFRpdGxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKF9wcm9tcHRUaXRsZVBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfcHJvbXB0VGl0bGVQYXRoLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RyaW5nIFByb21wdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhfcHJvbXB0UGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9wcm9tcHRQYXRoLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGb3JtdWxhIDEKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBGb3JtdWxhMUludGVybmFsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKF9mb3JtdWxhMVBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRm9ybXVsYSAyCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByb3RlY3RlZCBzdHJpbmcgRm9ybXVsYTJJbnRlcm5hbAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhfZm9ybXVsYTJQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBTZXRWYWx1ZTxUPihOdWxsYWJsZTxUPiB2YWwsIHN0cmluZyBwYXRoKQotICAgICAgICAgICAgd2hlcmUgVCA6IHN0cnVjdAotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXZhbC5IYXNWYWx1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEZWxldGVOb2RlKHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHN0cmluZ1ZhbHVlID0gdmFsLlZhbHVlLlRvU3RyaW5nKCkuUmVwbGFjZSgnLCcsICcuJyk7Ci0gICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHBhdGgsIHN0cmluZ1ZhbHVlKTsKLSAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+d29ya3NoZWV0IHRoYXQgb3ducyB0aGUgdmFsaWRhdGlvbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj5YbWwgdG9wIG5vZGUgKGRhdGFWYWxpZGF0aW9ucykgd2hlbiBpbXBvcnRpbmcgeG1sPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+RGF0YSB2YWxpZGF0aW9uIHR5cGU8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPmFkZHJlc3MgZm9yIGRhdGEgdmFsaWRhdGlvbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+WG1sIE5hbWVzcGFjZSBtYW5hZ2VyPC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbigKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZShuYW1lc3BhY2VNYW5hZ2VyICE9IG51bGwgPyBuYW1lc3BhY2VNYW5hZ2VyIDogd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpIHsKKyAgICBSZXF1aXJlLkFyZ3VtZW50KGFkZHJlc3MpLklzTm90TnVsbE9yRW1wdHkoImFkZHJlc3MiKTsKKyAgICBhZGRyZXNzID0gQ2hlY2tBbmRGaXhSYW5nZUFkZHJlc3MoYWRkcmVzcyk7CisgICAgaWYgKGl0ZW1FbGVtZW50Tm9kZSA9PSBudWxsKSB7CisgICAgICAvL3ZhciB4bWxEb2MgPSB3b3Jrc2hlZXQuV29ya3NoZWV0WG1sOworICAgICAgVG9wTm9kZSA9IHdvcmtzaGVldC5Xb3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgKKyAgICAgICAgICAiLy9kOmRhdGFWYWxpZGF0aW9ucyIsCisgICAgICAgICAgd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgLy8gZGlkIG5vdCBzdWNjZWVkIHVzaW5nIHRoZSBYbWxIZWxwZXIgbWV0aG9kcyBoZXJlLi4uIHNvIEknbSBjcmVhdGluZyB0aGUgbmV3IG5vZGUgdXNpbmcgWG1sRG9jdW1lbnQuLi4KKyAgICAgIHZhciBuc1VyaSA9IE5hbWVTcGFjZU1hbmFnZXIuTG9va3VwTmFtZXNwYWNlKCJkIik7CisgICAgICAvL2l0ZW1FbGVtZW50Tm9kZSA9IFRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KF9pdGVtRWxlbWVudE5vZGVOYW1lLCBuc1VyaSk7CisgICAgICBpdGVtRWxlbWVudE5vZGUgPSBUb3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgKKyAgICAgICAgICBfaXRlbUVsZW1lbnROb2RlTmFtZS5TcGxpdCgnOicpWzFdLAorICAgICAgICAgIG5zVXJpKTsKKyAgICAgIFRvcE5vZGUuQXBwZW5kQ2hpbGQoaXRlbUVsZW1lbnROb2RlKTsKICAgICB9CisgICAgVG9wTm9kZSA9IGl0ZW1FbGVtZW50Tm9kZTsKKyAgICBWYWxpZGF0aW9uVHlwZSA9IHZhbGlkYXRpb25UeXBlOworICAgIEFkZHJlc3MgPSBuZXcoYWRkcmVzcyk7CisgICAgSW5pdCgpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIEluaXQoKSB7CisgICAgLy8gc2V0IHNjaGVtYSBub2RlIG9yZGVyCisgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3W10geworICAgICAgInR5cGUiLAorICAgICAgImVycm9yU3R5bGUiLAorICAgICAgIm9wZXJhdG9yIiwKKyAgICAgICJhbGxvd0JsYW5rIiwKKyAgICAgICJzaG93SW5wdXRNZXNzYWdlIiwKKyAgICAgICJzaG93RXJyb3JNZXNzYWdlIiwKKyAgICAgICJlcnJvclRpdGxlIiwKKyAgICAgICJlcnJvciIsCisgICAgICAicHJvbXB0VGl0bGUiLAorICAgICAgInByb21wdCIsCisgICAgICAic3FyZWYiLAorICAgICAgImZvcm11bGExIiwKKyAgICAgICJmb3JtdWxhMiIsCisgICAgfTsKKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIENoZWNrQW5kRml4UmFuZ2VBZGRyZXNzKHN0cmluZyBhZGRyZXNzKSB7CisgICAgaWYgKGFkZHJlc3MuQ29udGFpbnMoJywnKSkgeworICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiTXVsdGlwbGUgYWRkcmVzc2VzIG1heSBub3QgYmUgY29tbWFzZXBhcmF0ZWQsIHVzZSBzcGFjZSBpbnN0ZWFkIik7CisgICAgfQorICAgIGFkZHJlc3MgPSBhZGRyZXNzLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgaWYgKFJlZ2V4LklzTWF0Y2goYWRkcmVzcywgIltBLVpdKzpbQS1aXSsiKSkgeworICAgICAgYWRkcmVzcyA9IEFkZHJlc3NVdGlsaXR5LlBhcnNlRW50aXJlQ29sdW1uU2VsZWN0aW9ucyhhZGRyZXNzKTsKKyAgICB9CisgICAgcmV0dXJuIGFkZHJlc3M7CisgIH0KKworICBwcml2YXRlIHZvaWQgU2V0TnVsbGFibGVCb29sVmFsdWUoc3RyaW5nIHBhdGgsIGJvb2w/IHZhbCkgeworICAgIGlmICh2YWwuSGFzVmFsdWUpIHsKKyAgICAgIFNldFhtbE5vZGVCb29sKHBhdGgsIHZhbC5WYWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIERlbGV0ZU5vZGUocGF0aCk7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBtZXRob2Qgd2lsbCB2YWxpZGF0ZSB0aGUgc3RhdGUgb2YgdGhlIHZhbGlkYXRpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxleGNlcHRpb24gY3JlZj0iSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiI+SWYgdGhlIHN0YXRlIGJyZWFrcyB0aGUgcnVsZXMgb2YgdGhlIHZhbGlkYXRpb248L2V4Y2VwdGlvbj4KKyAgcHVibGljIHZpcnR1YWwgdm9pZCBWYWxpZGF0ZSgpIHsKKyAgICB2YXIgYWRkcmVzcyA9IEFkZHJlc3MuQWRkcmVzczsKKyAgICAvLyB2YWxpZGF0ZSBGb3JtdWxhMQorICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShGb3JtdWxhMUludGVybmFsKSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgIlZhbGlkYXRpb24gb2YgIiArIGFkZHJlc3MgKyAiIGZhaWxlZDogRm9ybXVsYTEgY2Fubm90IGJlIGVtcHR5Iik7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHJ1ZSBpZiB0aGUgdmFsaWRhdGlvbiB0eXBlIGFsbG93cyBvcGVyYXRvciB0byBiZSBzZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIEFsbG93c09wZXJhdG9yID0+IFZhbGlkYXRpb25UeXBlLkFsbG93T3BlcmF0b3I7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcmVzcyBvZiBkYXRhIHZhbGlkYXRpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsQWRkcmVzcyBBZGRyZXNzIHsKKyAgICBnZXQgPT4gbmV3KEdldFhtbE5vZGVTdHJpbmcoX3NxcmVmUGF0aCkpOworICAgIHByaXZhdGUgc2V0IHsKKyAgICAgIHZhciBhZGRyZXNzID0gQWRkcmVzc1V0aWxpdHkuUGFyc2VFbnRpcmVDb2x1bW5TZWxlY3Rpb25zKHZhbHVlLkFkZHJlc3MpOworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc3FyZWZQYXRoLCBhZGRyZXNzKTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBWYWxpZGF0aW9uIHR5cGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIFZhbGlkYXRpb25UeXBlIHsKKyAgICBnZXQgeworICAgICAgdmFyIHR5cGVTdHJpbmcgPSBHZXRYbWxOb2RlU3RyaW5nKF90eXBlTWVzc2FnZVBhdGgpOworICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkdldEJ5U2NoZW1hTmFtZSh0eXBlU3RyaW5nKTsKKyAgICB9CisgICAgcHJpdmF0ZSBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZyhfdHlwZU1lc3NhZ2VQYXRoLCB2YWx1ZS5TY2hlbWFOYW1lLCB0cnVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE9wZXJhdG9yIGZvciBjb21wYXJpc29uIGJldHdlZW4gdGhlIGVudGVyZWQgdmFsdWUgYW5kIEZvcm11bGEvRm9ybXVsYXMuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IgT3BlcmF0b3IgeworICAgIGdldCB7CisgICAgICB2YXIgb3BlcmF0b3JTdHJpbmcgPSBHZXRYbWxOb2RlU3RyaW5nKF9vcGVyYXRvclBhdGgpOworICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShvcGVyYXRvclN0cmluZykpIHsKKyAgICAgICAgcmV0dXJuIChFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IpCisgICAgICAgICAgRW51bS5QYXJzZSh0eXBlb2YoRXhjZWxEYXRhVmFsaWRhdGlvbk9wZXJhdG9yKSwgb3BlcmF0b3JTdHJpbmcpOworICAgICAgfQorICAgICAgcmV0dXJuIGRlZmF1bHQoRXhjZWxEYXRhVmFsaWRhdGlvbk9wZXJhdG9yKTsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIGlmICghVmFsaWRhdGlvblR5cGUuQWxsb3dPcGVyYXRvcikgeworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICJUaGUgY3VycmVudCB2YWxpZGF0aW9uIHR5cGUgZG9lcyBub3QgYWxsb3cgb3BlcmF0b3IgdG8gYmUgc2V0Iik7CisgICAgICB9CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9vcGVyYXRvclBhdGgsIHZhbHVlLlRvU3RyaW5nKCkpOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFdhcm5pbmcgc3R5bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUgRXJyb3JTdHlsZSB7CisgICAgZ2V0IHsKKyAgICAgIHZhciBlcnJvclN0eWxlU3RyaW5nID0gR2V0WG1sTm9kZVN0cmluZyhfZXJyb3JTdHlsZVBhdGgpOworICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShlcnJvclN0eWxlU3RyaW5nKSkgeworICAgICAgICByZXR1cm4gKEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUpCisgICAgICAgICAgRW51bS5QYXJzZSh0eXBlb2YoRXhjZWxEYXRhVmFsaWRhdGlvbldhcm5pbmdTdHlsZSksIGVycm9yU3R5bGVTdHJpbmcpOworICAgICAgfQorICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUuVW5kZWZpbmVkOworICAgIH0KKyAgICBzZXQgeworICAgICAgaWYgKHZhbHVlID09IEV4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUuVW5kZWZpbmVkKSB7CisgICAgICAgIERlbGV0ZU5vZGUoX2Vycm9yU3R5bGVQYXRoKTsKKyAgICAgIH0KKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2Vycm9yU3R5bGVQYXRoLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUcnVlIGlmIGJsYW5rcyBzaG91bGQgYmUgYWxsb3dlZAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbD8gQWxsb3dCbGFuayB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sTnVsbGFibGUoX2FsbG93QmxhbmtQYXRoKTsKKyAgICBzZXQgPT4gU2V0TnVsbGFibGVCb29sVmFsdWUoX2FsbG93QmxhbmtQYXRoLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUcnVlIGlmIGlucHV0IG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sPyBTaG93SW5wdXRNZXNzYWdlIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2xOdWxsYWJsZShfc2hvd0lucHV0TWVzc2FnZVBhdGgpOworICAgIHNldCA9PiBTZXROdWxsYWJsZUJvb2xWYWx1ZShfc2hvd0lucHV0TWVzc2FnZVBhdGgsIHZhbHVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRydWUgaWYgZXJyb3IgbWVzc2FnZSBzaG91bGQgYmUgc2hvd24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2w/IFNob3dFcnJvck1lc3NhZ2UgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbE51bGxhYmxlKF9zaG93RXJyb3JNZXNzYWdlUGF0aCk7CisgICAgc2V0ID0+IFNldE51bGxhYmxlQm9vbFZhbHVlKF9zaG93RXJyb3JNZXNzYWdlUGF0aCwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGl0bGUgb2YgZXJyb3IgbWVzc2FnZSBib3gKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBFcnJvclRpdGxlIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZyhfZXJyb3JUaXRsZVBhdGgpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKF9lcnJvclRpdGxlUGF0aCwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXJyb3IgbWVzc2FnZSBib3ggdGV4dAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIEVycm9yIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZyhfZXJyb3JQYXRoKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZyhfZXJyb3JQYXRoLCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgc3RyaW5nIFByb21wdFRpdGxlIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZyhfcHJvbXB0VGl0bGVQYXRoKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZyhfcHJvbXB0VGl0bGVQYXRoLCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgc3RyaW5nIFByb21wdCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVTdHJpbmcoX3Byb21wdFBhdGgpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKF9wcm9tcHRQYXRoLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBGb3JtdWxhIDEKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHJvdGVjdGVkIHN0cmluZyBGb3JtdWxhMUludGVybmFsID0+IEdldFhtbE5vZGVTdHJpbmcoX2Zvcm11bGExUGF0aCk7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRm9ybXVsYSAyCisgIC8vLyA8L3N1bW1hcnk+CisgIHByb3RlY3RlZCBzdHJpbmcgRm9ybXVsYTJJbnRlcm5hbCA9PiBHZXRYbWxOb2RlU3RyaW5nKF9mb3JtdWxhMlBhdGgpOworCisgIHByb3RlY3RlZCB2b2lkIFNldFZhbHVlPFQ+KFQ/IHZhbCwgc3RyaW5nIHBhdGgpCisgICAgICB3aGVyZSBUIDogc3RydWN0IHsKKyAgICBpZiAoIXZhbC5IYXNWYWx1ZSkgeworICAgICAgRGVsZXRlTm9kZShwYXRoKTsKKyAgICB9CisgICAgdmFyIHN0cmluZ1ZhbHVlID0gdmFsLlZhbHVlLlRvU3RyaW5nKCkuUmVwbGFjZSgnLCcsICcuJyk7CisgICAgU2V0WG1sTm9kZVN0cmluZyhwYXRoLCBzdHJpbmdWYWx1ZSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uQW55LmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25BbnkuY3MKaW5kZXggZThmYWUxZS4uOGQwMDI2OCAxMDA2NDQKLS0tIGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25BbnkuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25BbnkuY3MKQEAgLTEzLDc4ICsxMyw3NSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSYXppcSBZb3JrICAgCQkgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxNC0wOC0wOAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXM7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24KLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFueSB2YWx1ZSB2YWxpZGF0aW9uLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25BbnkgOiBFeGNlbERhdGFWYWxpZGF0aW9uLCBJRXhjZWxEYXRhVmFsaWRhdGlvbkFueQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkFueShFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSkKLSAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlKQotICAgICAgICB7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnN0cnVjdG9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uQW55KEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIEFueSB2YWx1ZSB2YWxpZGF0aW9uLgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uQW55IDogRXhjZWxEYXRhVmFsaWRhdGlvbiwgSUV4Y2VsRGF0YVZhbGlkYXRpb25BbnkgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uQW55KAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgc3RyaW5nIGFkZHJlc3MsCisgICAgICBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSkKKyAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlKSB7fQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnN0cnVjdG9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25BbnkoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCi0gICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlLCBuYW1lc3BhY2VNYW5hZ2VyKQotICAgICAgICB7Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29uc3RydWN0b3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25BbnkoCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBzdHJpbmcgYWRkcmVzcywKKyAgICAgIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlKSB7fQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoaXMgbWV0aG9kIHdpbGwgdmFsaWRhdGUgdGhlIHN0YXRlIG9mIHRoZSB2YWxpZGF0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFZhbGlkYXRlKCkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uQW55KAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgc3RyaW5nIGFkZHJlc3MsCisgICAgICBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIGl0ZW1FbGVtZW50Tm9kZSwgbmFtZXNwYWNlTWFuYWdlcikge30KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIG1ldGhvZCB3aWxsIHZhbGlkYXRlIHRoZSBzdGF0ZSBvZiB0aGUgdmFsaWRhdGlvbgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBWYWxpZGF0ZSgpIHt9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24uY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24uY3MKaW5kZXggZDEzNzkxYi4uNjY5MmY5ZCAxMDA2NDQKLS0tIGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uLmNzCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uQ29sbGVjdGlvbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTcgKzEzLDE3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDEKQEAgLTMyLDM3NyArMzIsMzU4IEBACiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNwogICogUmF6aXEgWW9yawkJICAgICAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIEFueSB0eXBlICAyMDE0LTA4LTA4CiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gPHBhcmE+Ci0gICAgLy8vIENvbGxlY3Rpb24gb2YgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uIi8+LiBUaGlzIGNsYXNzIGlzIHByb3ZpZGluZyB0aGUgQVBJIGZvciBFUFBsdXMgZGF0YSB2YWxpZGF0aW9uLgotICAgIC8vLyA8L3BhcmE+Ci0gICAgLy8vIDxwYXJhPgotICAgIC8vLyBUaGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyAoQWRkWy4uLl1WYWxpZGF0aW9uKSB3aWxsIGNyZWF0ZSBhIGRhdGF2YWxpZGF0aW9uIGVudHJ5IGluIHRoZSB3b3Jrc2hlZXQuIFdoZW4gdGhpcwotICAgIC8vLyB2YWxpZGF0aW9uIGhhcyBiZWVuIGNyZWF0ZWQgY2hhbmdlcyB0byB0aGUgcHJvcGVydGllcyB3aWxsIGFmZmVjdCB0aGUgd29ya2Jvb2sgaW1tZWRpYXRlbHkuCi0gICAgLy8vIDwvcGFyYT4KLSAgICAvLy8gPHBhcmE+Ci0gICAgLy8vIEVhY2ggdHlwZSBvZiB2YWxpZGF0aW9uIGhhcyBlaXRoZXIgYSBmb3JtdWxhIG9yIGEgdHlwZWQgdmFsdWUvdmFsdWVzLCBleGNlcHQgZm9yIGN1c3RvbSB2YWxpZGF0aW9uIHdoaWNoIGhhcyBhIGZvcm11bGEgb25seS4KLSAgICAvLy8gPC9wYXJhPgotICAgIC8vLyA8Y29kZT4KLSAgICAvLy8gLy8gQWRkIGEgZGF0ZSB0aW1lIHZhbGlkYXRpb24KLSAgICAvLy8gdmFyIHZhbGlkYXRpb24gPSB3b3Jrc2hlZXQuRGF0YVZhbGlkYXRpb24uQWRkRGF0ZVRpbWVWYWxpZGF0aW9uKCJBMSIpOwotICAgIC8vLyAvLyBzZXQgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzCi0gICAgLy8vIHZhbGlkYXRpb24uU2hvd0Vycm9yTWVzc2FnZSA9IHRydWU7Ci0gICAgLy8vIHZhbGlkYXRpb24uRXJyb3JUaXRsZSA9ICJBbiBpbnZhbGlkIGRhdGUgd2FzIGVudGVyZWQiOwotICAgIC8vLyB2YWxpZGF0aW9uLkVycm9yID0gIlRoZSBkYXRlIG11c3QgYmUgYmV0d2VlbiAyMDExLTAxLTMxIGFuZCAyMDExLTEyLTMxIjsKLSAgICAvLy8gdmFsaWRhdGlvbi5Qcm9tcHQgPSAiRW50ZXIgZGF0ZSBoZXJlIjsKLSAgICAvLy8gdmFsaWRhdGlvbi5Gb3JtdWxhLlZhbHVlID0gRGF0ZVRpbWUuUGFyc2UoIjIwMTEtMDEtMDEiKTsKLSAgICAvLy8gdmFsaWRhdGlvbi5Gb3JtdWxhMi5WYWx1ZSA9IERhdGVUaW1lLlBhcnNlKCIyMDExLTEyLTMxIik7Ci0gICAgLy8vIHZhbGlkYXRpb24uT3BlcmF0b3IgPSBFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IuYmV0d2VlbjsKLSAgICAvLy8gPC9jb2RlPgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uIDogWG1sSGVscGVyLCBJRW51bWVyYWJsZTxJRXhjZWxEYXRhVmFsaWRhdGlvbj4KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxJRXhjZWxEYXRhVmFsaWRhdGlvbj4gX3ZhbGlkYXRpb25zID0gbmV3IExpc3Q8SUV4Y2VsRGF0YVZhbGlkYXRpb24+KCk7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldCA9IG51bGw7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKIAotICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBEYXRhVmFsaWRhdGlvblBhdGggPSAiLy9kOmRhdGFWYWxpZGF0aW9ucyI7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIERhdGFWYWxpZGF0aW9uSXRlbXNQYXRoID0gc3RyaW5nLkZvcm1hdCgiezB9L2Q6ZGF0YVZhbGlkYXRpb24iLCBEYXRhVmFsaWRhdGlvblBhdGgpOworLy8vIDxzdW1tYXJ5PgorLy8vIDxwYXJhPgorLy8vIENvbGxlY3Rpb24gb2YgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uIi8+LiBUaGlzIGNsYXNzIGlzIHByb3ZpZGluZyB0aGUgQVBJIGZvciBFUFBsdXMgZGF0YSB2YWxpZGF0aW9uLgorLy8vIDwvcGFyYT4KKy8vLyA8cGFyYT4KKy8vLyBUaGUgcHVibGljIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyAoQWRkWy4uLl1WYWxpZGF0aW9uKSB3aWxsIGNyZWF0ZSBhIGRhdGF2YWxpZGF0aW9uIGVudHJ5IGluIHRoZSB3b3Jrc2hlZXQuIFdoZW4gdGhpcworLy8vIHZhbGlkYXRpb24gaGFzIGJlZW4gY3JlYXRlZCBjaGFuZ2VzIHRvIHRoZSBwcm9wZXJ0aWVzIHdpbGwgYWZmZWN0IHRoZSB3b3JrYm9vayBpbW1lZGlhdGVseS4KKy8vLyA8L3BhcmE+CisvLy8gPHBhcmE+CisvLy8gRWFjaCB0eXBlIG9mIHZhbGlkYXRpb24gaGFzIGVpdGhlciBhIGZvcm11bGEgb3IgYSB0eXBlZCB2YWx1ZS92YWx1ZXMsIGV4Y2VwdCBmb3IgY3VzdG9tIHZhbGlkYXRpb24gd2hpY2ggaGFzIGEgZm9ybXVsYSBvbmx5LgorLy8vIDwvcGFyYT4KKy8vLyA8Y29kZT4KKy8vLyAvLyBBZGQgYSBkYXRlIHRpbWUgdmFsaWRhdGlvbgorLy8vIHZhciB2YWxpZGF0aW9uID0gd29ya3NoZWV0LkRhdGFWYWxpZGF0aW9uLkFkZERhdGVUaW1lVmFsaWRhdGlvbigiQTEiKTsKKy8vLyAvLyBzZXQgdmFsaWRhdGlvbiBwcm9wZXJ0aWVzCisvLy8gdmFsaWRhdGlvbi5TaG93RXJyb3JNZXNzYWdlID0gdHJ1ZTsKKy8vLyB2YWxpZGF0aW9uLkVycm9yVGl0bGUgPSAiQW4gaW52YWxpZCBkYXRlIHdhcyBlbnRlcmVkIjsKKy8vLyB2YWxpZGF0aW9uLkVycm9yID0gIlRoZSBkYXRlIG11c3QgYmUgYmV0d2VlbiAyMDExLTAxLTMxIGFuZCAyMDExLTEyLTMxIjsKKy8vLyB2YWxpZGF0aW9uLlByb21wdCA9ICJFbnRlciBkYXRlIGhlcmUiOworLy8vIHZhbGlkYXRpb24uRm9ybXVsYS5WYWx1ZSA9IERhdGVUaW1lLlBhcnNlKCIyMDExLTAxLTAxIik7CisvLy8gdmFsaWRhdGlvbi5Gb3JtdWxhMi5WYWx1ZSA9IERhdGVUaW1lLlBhcnNlKCIyMDExLTEyLTMxIik7CisvLy8gdmFsaWRhdGlvbi5PcGVyYXRvciA9IEV4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5iZXR3ZWVuOworLy8vIDwvY29kZT4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24gOiBYbWxIZWxwZXIsIElFbnVtZXJhYmxlPElFeGNlbERhdGFWYWxpZGF0aW9uPiB7CisgIHByaXZhdGUgTGlzdDxJRXhjZWxEYXRhVmFsaWRhdGlvbj4gX3ZhbGlkYXRpb25zID0gbmV3KCk7CisgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24oRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyLCB3b3Jrc2hlZXQuV29ya3NoZWV0WG1sLkRvY3VtZW50RWxlbWVudCkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudCh3b3Jrc2hlZXQpLklzTm90TnVsbCgid29ya3NoZWV0Iik7Ci0gICAgICAgICAgICBfd29ya3NoZWV0ID0gd29ya3NoZWV0OwotICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gd29ya3NoZWV0LlNjaGVtYU5vZGVPcmRlcjsKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2RhdGFWYWxpZGF0aW9uUGF0aCA9ICIvL2Q6ZGF0YVZhbGlkYXRpb25zIjsKKyAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgRGF0YVZhbGlkYXRpb25JdGVtc1BhdGggPSBzdHJpbmcuRm9ybWF0KAorICAgICAgInswfS9kOmRhdGFWYWxpZGF0aW9uIiwKKyAgICAgIF9kYXRhVmFsaWRhdGlvblBhdGgpOwogCi0gICAgICAgICAgICAvLyBjaGVjayBleGlzdGluZyBub2RlcyBhbmQgbG9hZCB0aGVtCi0gICAgICAgICAgICB2YXIgZGF0YVZhbGlkYXRpb25Ob2RlcyA9IHdvcmtzaGVldC5Xb3Jrc2hlZXRYbWwuU2VsZWN0Tm9kZXMoRGF0YVZhbGlkYXRpb25JdGVtc1BhdGgsIHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGlmIChkYXRhVmFsaWRhdGlvbk5vZGVzICE9IG51bGwgJiYgZGF0YVZhbGlkYXRpb25Ob2Rlcy5Db3VudCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBub2RlIGluIGRhdGFWYWxpZGF0aW9uTm9kZXMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5BdHRyaWJ1dGVzWyJzcXJlZiJdID09IG51bGwpIGNvbnRpbnVlOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24oRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQorICAgICAgOiBiYXNlKHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyLCB3b3Jrc2hlZXQuV29ya3NoZWV0WG1sLkRvY3VtZW50RWxlbWVudCkgeworICAgIFJlcXVpcmUuQXJndW1lbnQod29ya3NoZWV0KS5Jc05vdE51bGwoIndvcmtzaGVldCIpOworICAgIF93b3Jrc2hlZXQgPSB3b3Jrc2hlZXQ7CisgICAgU2NoZW1hTm9kZU9yZGVyID0gd29ya3NoZWV0LlNjaGVtYU5vZGVPcmRlcjsKIAotICAgICAgICAgICAgICAgICAgICB2YXIgYWRkciA9IG5vZGUuQXR0cmlidXRlc1sic3FyZWYiXS5WYWx1ZTsKLQotICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZVNjaGVtYSA9IG5vZGUuQXR0cmlidXRlc1sidHlwZSJdICE9IG51bGwgPyBub2RlLkF0dHJpYnV0ZXNbInR5cGUiXS5WYWx1ZSA6ICIiOwotCi0gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuR2V0QnlTY2hlbWFOYW1lKHR5cGVTY2hlbWEpOwotICAgICAgICAgICAgICAgICAgICBfdmFsaWRhdGlvbnMuQWRkKEV4Y2VsRGF0YVZhbGlkYXRpb25GYWN0b3J5LkNyZWF0ZSh0eXBlLCB3b3Jrc2hlZXQsIGFkZHIsIG5vZGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoX3ZhbGlkYXRpb25zLkNvdW50ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKLSAgICAgICAgICAgIH0KKyAgICAvLyBjaGVjayBleGlzdGluZyBub2RlcyBhbmQgbG9hZCB0aGVtCisgICAgdmFyIGRhdGFWYWxpZGF0aW9uTm9kZXMgPSB3b3Jrc2hlZXQuV29ya3NoZWV0WG1sLlNlbGVjdE5vZGVzKAorICAgICAgICBEYXRhVmFsaWRhdGlvbkl0ZW1zUGF0aCwKKyAgICAgICAgd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpOworICAgIGlmIChkYXRhVmFsaWRhdGlvbk5vZGVzICE9IG51bGwgJiYgZGF0YVZhbGlkYXRpb25Ob2Rlcy5Db3VudCA+IDApIHsKKyAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbm9kZSBpbiBkYXRhVmFsaWRhdGlvbk5vZGVzKSB7CisgICAgICAgIGlmIChub2RlLkF0dHJpYnV0ZXNbInNxcmVmIl0gPT0gbnVsbCkgeworICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIEVuc3VyZVJvb3RFbGVtZW50RXhpc3RzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG5vZGUgPSBfd29ya3NoZWV0LldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKERhdGFWYWxpZGF0aW9uUGF0aCwgX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShEYXRhVmFsaWRhdGlvblBhdGguVHJpbVN0YXJ0KCcvJykpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIHZhciBhZGRyID0gbm9kZS5BdHRyaWJ1dGVzWyJzcXJlZiJdLlZhbHVlOwogCi0gICAgICAgIHByaXZhdGUgdm9pZCBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2lmIChUb3BOb2RlICE9IG51bGwpCi0gICAgICAgICAgICAvL3sKLSAgICAgICAgICAgIC8vICAgIFNldFhtbE5vZGVTdHJpbmcoIkBjb3VudCIsIF92YWxpZGF0aW9ucy5Db3VudC5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIC8vfQotICAgICAgICB9CisgICAgICAgIHZhciB0eXBlU2NoZW1hID0gbm9kZS5BdHRyaWJ1dGVzWyJ0eXBlIl0gIT0gbnVsbCA/IG5vZGUuQXR0cmlidXRlc1sidHlwZSJdLlZhbHVlIDogIiI7CiAKLSAgICAgICAgcHJpdmF0ZSBYbWxOb2RlIEdldFJvb3ROb2RlKCkKLSAgICAgICAgewotICAgICAgICAgICAgRW5zdXJlUm9vdEVsZW1lbnRFeGlzdHMoKTsKLSAgICAgICAgICAgIFRvcE5vZGUgPSBfd29ya3NoZWV0LldvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKERhdGFWYWxpZGF0aW9uUGF0aCwgX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIHJldHVybiBUb3BOb2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVmFsaWRhdGVzIGFkZHJlc3MgLSBub3QgZW1wdHksIGNvbGxpc2lvbnMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpbmdWYWxpZGF0aW9uIj48L3BhcmFtPgotICAgICAgICBwcml2YXRlIHZvaWQgVmFsaWRhdGVBZGRyZXNzKHN0cmluZyBhZGRyZXNzLCBJRXhjZWxEYXRhVmFsaWRhdGlvbiB2YWxpZGF0aW5nVmFsaWRhdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudChhZGRyZXNzKS5Jc05vdE51bGxPckVtcHR5KCJhZGRyZXNzIik7Ci0KLSAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBuZXcgYWRkcmVzcyBkb2VzIG5vdCBjb2xsaWRlIHdpdGggYW4gZXhpc3RpbmcgdmFsaWRhdGlvbi4KLSAgICAgICAgICAgIHZhciBuZXdBZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzcyhhZGRyZXNzKTsKLSAgICAgICAgICAgIGlmIChfdmFsaWRhdGlvbnMuQ291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWxpZGF0aW9uIGluIF92YWxpZGF0aW9ucykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0aW5nVmFsaWRhdGlvbiAhPSBudWxsICYmIHZhbGlkYXRpbmdWYWxpZGF0aW9uID09IHZhbGlkYXRpb24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWxpZGF0aW9uLkFkZHJlc3MuQ29sbGlkZShuZXdBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBFeGNlbEFkZHJlc3NCYXNlLmVBZGRyZXNzQ29sbGl0aW9uLk5vKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJUaGUgYWRkcmVzcyAoezB9KSBjb2xsaWRlcyB3aXRoIGFuIGV4aXN0aW5nIHZhbGlkYXRpb24gKHsxfSkiLCBhZGRyZXNzLCB2YWxpZGF0aW9uLkFkZHJlc3MuQWRkcmVzcykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFZhbGlkYXRlQWRkcmVzcyhzdHJpbmcgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVmFsaWRhdGVzIGFsbCBkYXRhIHZhbGlkYXRpb25zLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCB2b2lkIFZhbGlkYXRlQWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yZWFjaCAodmFyIHZhbGlkYXRpb24gaW4gX3ZhbGlkYXRpb25zKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbGlkYXRpb24uVmFsaWRhdGUoKTsKLQotICAgICAgICAgICAgICAgIFZhbGlkYXRlQWRkcmVzcyh2YWxpZGF0aW9uLkFkZHJlc3MuQWRkcmVzcywgdmFsaWRhdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uQW55Ii8+IHRvIHRoZSB3b3Jrc2hlZXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIHJhbmdlL2FkZHJlc3MgdG8gdmFsaWRhdGU8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25BbnkgQWRkQW55VmFsaWRhdGlvbihzdHJpbmcgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MpOwotICAgICAgICAgICAgRW5zdXJlUm9vdEVsZW1lbnRFeGlzdHMoKTsKLSAgICAgICAgICAgIHZhciBpdGVtID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25BbnkoX3dvcmtzaGVldCwgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuQW55KTsKLSAgICAgICAgICAgIF92YWxpZGF0aW9ucy5BZGQoaXRlbSk7Ci0gICAgICAgICAgICBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKLSAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBhbiA8c2VlIGNyZWY9IklFeGNlbERhdGFWYWxpZGF0aW9uSW50Ii8+IHRvIHRoZSB3b3Jrc2hlZXQuIFdob2xlIG1lYW5zIHRoYXQgdGhlIG9ubHkgYWNjZXB0ZWQgdmFsdWVzCi0gICAgICAgIC8vLyBhcmUgaW50ZWdlciB2YWx1ZXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+dGhlIHJhbmdlL2FkZHJlc3MgdG8gdmFsaWRhdGU8L3BhcmFtPgotICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQgQWRkSW50ZWdlclZhbGlkYXRpb24oc3RyaW5nIGFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzKTsKLSAgICAgICAgICAgIEVuc3VyZVJvb3RFbGVtZW50RXhpc3RzKCk7Ci0gICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uSW50KF93b3Jrc2hlZXQsIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLldob2xlKTsKLSAgICAgICAgICAgIF92YWxpZGF0aW9ucy5BZGQoaXRlbSk7Ci0gICAgICAgICAgICBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKLSAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkZXMgYW4gPHNlZSBjcmVmPSJJRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwiLz4gdG8gdGhlIHdvcmtzaGVldC4gVGhlIG9ubHkgYWNjZXB0ZWQgdmFsdWVzIGFyZQotICAgICAgICAvLy8gZGVjaW1hbCB2YWx1ZXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIHJhbmdlL2FkZHJlc3MgdG8gdmFsaWRhdGU8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsIEFkZERlY2ltYWxWYWxpZGF0aW9uKHN0cmluZyBhZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgICAgICAgICBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpOwotICAgICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwoX3dvcmtzaGVldCwgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuRGVjaW1hbCk7Ci0gICAgICAgICAgICBfdmFsaWRhdGlvbnMuQWRkKGl0ZW0pOwotICAgICAgICAgICAgT25WYWxpZGF0aW9uQ291bnRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICByZXR1cm4gaXRlbTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHMgYW4gPHNlZSBjcmVmPSJJRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QiLz4gdG8gdGhlIHdvcmtzaGVldC4gVGhlIGFjY2VwdGVkIHZhbHVlcyBhcmUgZGVmaW5lZAotICAgICAgICAvLy8gaW4gYSBsaXN0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSByYW5nZS9hZGRyZXNzIHRvIHZhbGlkYXRlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uTGlzdCBBZGRMaXN0VmFsaWRhdGlvbihzdHJpbmcgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MpOwotICAgICAgICAgICAgRW5zdXJlUm9vdEVsZW1lbnRFeGlzdHMoKTsKLSAgICAgICAgICAgIHZhciBpdGVtID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0KF93b3Jrc2hlZXQsIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkxpc3QpOwotICAgICAgICAgICAgX3ZhbGlkYXRpb25zLkFkZChpdGVtKTsKLSAgICAgICAgICAgIE9uVmFsaWRhdGlvbkNvdW50Q2hhbmdlZCgpOwotICAgICAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIGFuIDxzZWUgY3JlZj0iSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQiLz4gcmVnYXJkaW5nIHRleHQgbGVuZ3RoIHRvIHRoZSB3b3Jrc2hlZXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIHJhbmdlL2FkZHJlc3MgdG8gdmFsaWRhdGU8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQgQWRkVGV4dExlbmd0aFZhbGlkYXRpb24oc3RyaW5nIGFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzKTsKLSAgICAgICAgICAgIEVuc3VyZVJvb3RFbGVtZW50RXhpc3RzKCk7Ci0gICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uSW50KF93b3Jrc2hlZXQsIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLlRleHRMZW5ndGgpOwotICAgICAgICAgICAgX3ZhbGlkYXRpb25zLkFkZChpdGVtKTsKLSAgICAgICAgICAgIE9uVmFsaWRhdGlvbkNvdW50Q2hhbmdlZCgpOwotICAgICAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIGFuIDxzZWUgY3JlZj0iSUV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZSIvPiB0byB0aGUgd29ya3NoZWV0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSByYW5nZS9hZGRyZXNzIHRvIHZhbGlkYXRlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUgQWRkRGF0ZVRpbWVWYWxpZGF0aW9uKHN0cmluZyBhZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgICAgICAgICBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpOwotICAgICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lKF93b3Jrc2hlZXQsIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkRhdGVUaW1lKTsKLSAgICAgICAgICAgIF92YWxpZGF0aW9ucy5BZGQoaXRlbSk7Ci0gICAgICAgICAgICBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKLSAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lIEFkZFRpbWVWYWxpZGF0aW9uKHN0cmluZyBhZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgICAgICAgICBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpOwotICAgICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUoX3dvcmtzaGVldCwgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuVGltZSk7Ci0gICAgICAgICAgICBfdmFsaWRhdGlvbnMuQWRkKGl0ZW0pOwotICAgICAgICAgICAgT25WYWxpZGF0aW9uQ291bnRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICByZXR1cm4gaXRlbTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tIi8+IHRvIHRoZSB3b3Jrc2hlZXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIHJhbmdlL2FkZHJlc3MgdG8gdmFsaWRhdGU8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20gQWRkQ3VzdG9tVmFsaWRhdGlvbihzdHJpbmcgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MpOwotICAgICAgICAgICAgRW5zdXJlUm9vdEVsZW1lbnRFeGlzdHMoKTsKLSAgICAgICAgICAgIHZhciBpdGVtID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20oX3dvcmtzaGVldCwgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuQ3VzdG9tKTsKLSAgICAgICAgICAgIF92YWxpZGF0aW9ucy5BZGQoaXRlbSk7Ci0gICAgICAgICAgICBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKLSAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVtb3ZlcyBhbiA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb24iLz4gZnJvbSB0aGUgY29sbGVjdGlvbi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgaXRlbSB0byByZW1vdmU8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VHJ1ZSBpZiByZW1vdmUgc3VjY2VlZHMsIG90aGVyd2lzZSBmYWxzZTwvcmV0dXJucz4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIj5pZiA8cGFyYW1yZWYgbmFtZT0iaXRlbSIvPiBpcyBudWxsPC9leGNlcHRpb24+Ci0gICAgICAgIHB1YmxpYyBib29sIFJlbW92ZShJRXhjZWxEYXRhVmFsaWRhdGlvbiBpdGVtKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIShpdGVtIGlzIEV4Y2VsRGF0YVZhbGlkYXRpb24pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2FzdEV4Y2VwdGlvbigiVGhlIHN1cHBsaWVkIGl0ZW0gbXVzdCBpbmhlcml0IE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRXhjZWxEYXRhVmFsaWRhdGlvbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudChpdGVtKS5Jc05vdE51bGwoIml0ZW0iKTsKLSAgICAgICAgICAgIFRvcE5vZGUuUmVtb3ZlQ2hpbGQoKChFeGNlbERhdGFWYWxpZGF0aW9uKWl0ZW0pLlRvcE5vZGUpOwotICAgICAgICAgICAgdmFyIHJldFZhbCA9IF92YWxpZGF0aW9ucy5SZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICBpZiAocmV0VmFsKSBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKLSAgICAgICAgICAgIHJldHVybiByZXRWYWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBOdW1iZXIgb2YgdmFsaWRhdGlvbnMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBDb3VudAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX3ZhbGlkYXRpb25zLkNvdW50OyB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbmRleCBvcGVyYXRvciwgcmV0dXJucyBieSAwLWJhc2VkIGluZGV4Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5kZXgiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbiB0aGlzW2ludCBpbmRleF0KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF92YWxpZGF0aW9uc1tpbmRleF07IH0KLSAgICAgICAgICAgIHNldCB7IF92YWxpZGF0aW9uc1tpbmRleF0gPSB2YWx1ZTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5kZXggb3BlcmF0b3IsIHJldHVybnMgYSBkYXRhIHZhbGlkYXRpb24gd2hpY2ggYWRkcmVzcyBwYXJ0bHkgb3IgZXhhY3RseSBtYXRjaGVzIHRoZSBzZWFyY2hlZCBhZGRyZXNzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPkEgY2VsbCBhZGRyZXNzIG9yIHJhbmdlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uIi8+IG9yIG51bGwgaWYgbm8gbWF0Y2g8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbiB0aGlzW3N0cmluZyBhZGRyZXNzXQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2VhcmNoZWRBZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzcyhhZGRyZXNzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbGlkYXRpb25zLkZpbmQoeCA9PiB4LkFkZHJlc3MuQ29sbGlkZShzZWFyY2hlZEFkZHJlc3MpICE9IEV4Y2VsQWRkcmVzc0Jhc2UuZUFkZHJlc3NDb2xsaXRpb24uTm8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyBhbGwgdmFsaWRhdGlvbnMgdGhhdCBtYXRjaGVzIHRoZSBzdXBwbGllZCBwcmVkaWNhdGUgPHBhcmFtcmVmIG5hbWU9Im1hdGNoIi8+LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1hdGNoIj5wcmVkaWNhdGUgdG8gZmlsdGVyIG91dCBtYXRjaGluZyB2YWxpZGF0aW9uczwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBJRW51bWVyYWJsZTxJRXhjZWxEYXRhVmFsaWRhdGlvbj4gRmluZEFsbChQcmVkaWNhdGU8SUV4Y2VsRGF0YVZhbGlkYXRpb24+IG1hdGNoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3ZhbGlkYXRpb25zLkZpbmRBbGwobWF0Y2gpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgZmlyc3QgbWF0Y2hpbmcgdmFsaWRhdGlvbi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtYXRjaCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uIEZpbmQoUHJlZGljYXRlPElFeGNlbERhdGFWYWxpZGF0aW9uPiBtYXRjaCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF92YWxpZGF0aW9ucy5GaW5kKG1hdGNoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlbW92ZXMgYWxsIHZhbGlkYXRpb25zIGZyb20gdGhlIGNvbGxlY3Rpb24uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKLSAgICAgICAgewotICAgICAgICAgICAgRGVsZXRlQWxsTm9kZShEYXRhVmFsaWRhdGlvbkl0ZW1zUGF0aC5UcmltU3RhcnQoJy8nKSk7Ci0gICAgICAgICAgICBfdmFsaWRhdGlvbnMuQ2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlbW92ZXMgdGhlIHZhbGlkYXRpb25zIHRoYXQgbWF0Y2hlcyB0aGUgcHJlZGljYXRlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWF0Y2giPjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZUFsbChQcmVkaWNhdGU8SUV4Y2VsRGF0YVZhbGlkYXRpb24+IG1hdGNoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IF92YWxpZGF0aW9ucy5GaW5kQWxsKG1hdGNoKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBtIGluIG1hdGNoZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCEobSBpcyBFeGNlbERhdGFWYWxpZGF0aW9uKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2FzdEV4Y2VwdGlvbigiVGhlIHN1cHBsaWVkIGl0ZW0gbXVzdCBpbmhlcml0IE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRXhjZWxEYXRhVmFsaWRhdGlvbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoRGF0YVZhbGlkYXRpb25QYXRoLlRyaW1TdGFydCgnLycpLCBOYW1lU3BhY2VNYW5hZ2VyKS5SZW1vdmVDaGlsZCgoKEV4Y2VsRGF0YVZhbGlkYXRpb24pbSkuVG9wTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfdmFsaWRhdGlvbnMuUmVtb3ZlQWxsKG1hdGNoKTsKLSAgICAgICAgICAgIE9uVmFsaWRhdGlvbkNvdW50Q2hhbmdlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgSUVudW1lcmF0b3I8SUV4Y2VsRGF0YVZhbGlkYXRpb24+IElFbnVtZXJhYmxlPElFeGNlbERhdGFWYWxpZGF0aW9uPi5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF92YWxpZGF0aW9ucy5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJRW51bWVyYXRvciBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfdmFsaWRhdGlvbnMuR2V0RW51bWVyYXRvcigpOwotICAgICAgICB9CisgICAgICAgIHZhciB0eXBlID0gRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuR2V0QnlTY2hlbWFOYW1lKHR5cGVTY2hlbWEpOworICAgICAgICBfdmFsaWRhdGlvbnMuQWRkKEV4Y2VsRGF0YVZhbGlkYXRpb25GYWN0b3J5LkNyZWF0ZSh0eXBlLCB3b3Jrc2hlZXQsIGFkZHIsIG5vZGUpKTsKKyAgICAgIH0KICAgICB9CisgICAgaWYgKF92YWxpZGF0aW9ucy5Db3VudCA+IDApIHsKKyAgICAgIE9uVmFsaWRhdGlvbkNvdW50Q2hhbmdlZCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpIHsKKyAgICB2YXIgbm9kZSA9IF93b3Jrc2hlZXQuV29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoCisgICAgICAgIF9kYXRhVmFsaWRhdGlvblBhdGgsCisgICAgICAgIF93b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlcik7CisgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgQ3JlYXRlTm9kZShfZGF0YVZhbGlkYXRpb25QYXRoLlRyaW1TdGFydCgnLycpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgT25WYWxpZGF0aW9uQ291bnRDaGFuZ2VkKCkgeworICAgIC8vaWYgKFRvcE5vZGUgIT0gbnVsbCkKKyAgICAvL3sKKyAgICAvLyAgICBTZXRYbWxOb2RlU3RyaW5nKCJAY291bnQiLCBfdmFsaWRhdGlvbnMuQ291bnQuVG9TdHJpbmcoKSk7CisgICAgLy99CisgIH0KKworICBwcml2YXRlIFhtbE5vZGUgR2V0Um9vdE5vZGUoKSB7CisgICAgRW5zdXJlUm9vdEVsZW1lbnRFeGlzdHMoKTsKKyAgICBUb3BOb2RlID0gX3dvcmtzaGVldC5Xb3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgKKyAgICAgICAgX2RhdGFWYWxpZGF0aW9uUGF0aCwKKyAgICAgICAgX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICByZXR1cm4gVG9wTm9kZTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFZhbGlkYXRlcyBhZGRyZXNzIC0gbm90IGVtcHR5LCBjb2xsaXNpb25zCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW5nVmFsaWRhdGlvbiI+PC9wYXJhbT4KKyAgcHJpdmF0ZSB2b2lkIFZhbGlkYXRlQWRkcmVzcyhzdHJpbmcgYWRkcmVzcywgSUV4Y2VsRGF0YVZhbGlkYXRpb24gdmFsaWRhdGluZ1ZhbGlkYXRpb24pIHsKKyAgICBSZXF1aXJlLkFyZ3VtZW50KGFkZHJlc3MpLklzTm90TnVsbE9yRW1wdHkoImFkZHJlc3MiKTsKKworICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBuZXcgYWRkcmVzcyBkb2VzIG5vdCBjb2xsaWRlIHdpdGggYW4gZXhpc3RpbmcgdmFsaWRhdGlvbi4KKyAgICB2YXIgbmV3QWRkcmVzcyA9IG5ldyBFeGNlbEFkZHJlc3MoYWRkcmVzcyk7CisgICAgaWYgKF92YWxpZGF0aW9ucy5Db3VudCA+IDApIHsKKyAgICAgIGZvcmVhY2ggKHZhciB2YWxpZGF0aW9uIGluIF92YWxpZGF0aW9ucykgeworICAgICAgICBpZiAodmFsaWRhdGluZ1ZhbGlkYXRpb24gIT0gbnVsbCAmJiB2YWxpZGF0aW5nVmFsaWRhdGlvbiA9PSB2YWxpZGF0aW9uKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdmFyIHJlc3VsdCA9IHZhbGlkYXRpb24uQWRkcmVzcy5Db2xsaWRlKG5ld0FkZHJlc3MpOworICAgICAgICBpZiAocmVzdWx0ICE9IEV4Y2VsQWRkcmVzc0Jhc2UuZUFkZHJlc3NDb2xsaXRpb24uTm8pIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICJUaGUgYWRkcmVzcyAoezB9KSBjb2xsaWRlcyB3aXRoIGFuIGV4aXN0aW5nIHZhbGlkYXRpb24gKHsxfSkiLAorICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb24uQWRkcmVzcy5BZGRyZXNzKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgVmFsaWRhdGVBZGRyZXNzKHN0cmluZyBhZGRyZXNzKSB7CisgICAgVmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MsIG51bGwpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVmFsaWRhdGVzIGFsbCBkYXRhIHZhbGlkYXRpb25zLgorICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCB2b2lkIFZhbGlkYXRlQWxsKCkgeworICAgIGZvcmVhY2ggKHZhciB2YWxpZGF0aW9uIGluIF92YWxpZGF0aW9ucykgeworICAgICAgdmFsaWRhdGlvbi5WYWxpZGF0ZSgpOworCisgICAgICBWYWxpZGF0ZUFkZHJlc3ModmFsaWRhdGlvbi5BZGRyZXNzLkFkZHJlc3MsIHZhbGlkYXRpb24pOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb25BbnkiLz4gdG8gdGhlIHdvcmtzaGVldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5UaGUgcmFuZ2UvYWRkcmVzcyB0byB2YWxpZGF0ZTwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbkFueSBBZGRBbnlWYWxpZGF0aW9uKHN0cmluZyBhZGRyZXNzKSB7CisgICAgVmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MpOworICAgIEVuc3VyZVJvb3RFbGVtZW50RXhpc3RzKCk7CisgICAgdmFyIGl0ZW0gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkFueShfd29ya3NoZWV0LCBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5BbnkpOworICAgIF92YWxpZGF0aW9ucy5BZGQoaXRlbSk7CisgICAgT25WYWxpZGF0aW9uQ291bnRDaGFuZ2VkKCk7CisgICAgcmV0dXJuIGl0ZW07CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGFuIDxzZWUgY3JlZj0iSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQiLz4gdG8gdGhlIHdvcmtzaGVldC4gV2hvbGUgbWVhbnMgdGhhdCB0aGUgb25seSBhY2NlcHRlZCB2YWx1ZXMKKyAgLy8vIGFyZSBpbnRlZ2VyIHZhbHVlcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj50aGUgcmFuZ2UvYWRkcmVzcyB0byB2YWxpZGF0ZTwvcGFyYW0+CisgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbkludCBBZGRJbnRlZ2VyVmFsaWRhdGlvbihzdHJpbmcgYWRkcmVzcykgeworICAgIFZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzKTsKKyAgICBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpOworICAgIHZhciBpdGVtID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQoX3dvcmtzaGVldCwgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuV2hvbGUpOworICAgIF92YWxpZGF0aW9ucy5BZGQoaXRlbSk7CisgICAgT25WYWxpZGF0aW9uQ291bnRDaGFuZ2VkKCk7CisgICAgcmV0dXJuIGl0ZW07CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRlcyBhbiA8c2VlIGNyZWY9IklFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbCIvPiB0byB0aGUgd29ya3NoZWV0LiBUaGUgb25seSBhY2NlcHRlZCB2YWx1ZXMgYXJlCisgIC8vLyBkZWNpbWFsIHZhbHVlcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5UaGUgcmFuZ2UvYWRkcmVzcyB0byB2YWxpZGF0ZTwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwgQWRkRGVjaW1hbFZhbGlkYXRpb24oc3RyaW5nIGFkZHJlc3MpIHsKKyAgICBWYWxpZGF0ZUFkZHJlc3MoYWRkcmVzcyk7CisgICAgRW5zdXJlUm9vdEVsZW1lbnRFeGlzdHMoKTsKKyAgICB2YXIgaXRlbSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbChfd29ya3NoZWV0LCBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5EZWNpbWFsKTsKKyAgICBfdmFsaWRhdGlvbnMuQWRkKGl0ZW0pOworICAgIE9uVmFsaWRhdGlvbkNvdW50Q2hhbmdlZCgpOworICAgIHJldHVybiBpdGVtOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhbiA8c2VlIGNyZWY9IklFeGNlbERhdGFWYWxpZGF0aW9uTGlzdCIvPiB0byB0aGUgd29ya3NoZWV0LiBUaGUgYWNjZXB0ZWQgdmFsdWVzIGFyZSBkZWZpbmVkCisgIC8vLyBpbiBhIGxpc3QuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIHJhbmdlL2FkZHJlc3MgdG8gdmFsaWRhdGU8L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0IEFkZExpc3RWYWxpZGF0aW9uKHN0cmluZyBhZGRyZXNzKSB7CisgICAgVmFsaWRhdGVBZGRyZXNzKGFkZHJlc3MpOworICAgIEVuc3VyZVJvb3RFbGVtZW50RXhpc3RzKCk7CisgICAgdmFyIGl0ZW0gPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QoX3dvcmtzaGVldCwgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuTGlzdCk7CisgICAgX3ZhbGlkYXRpb25zLkFkZChpdGVtKTsKKyAgICBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKKyAgICByZXR1cm4gaXRlbTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYW4gPHNlZSBjcmVmPSJJRXhjZWxEYXRhVmFsaWRhdGlvbkludCIvPiByZWdhcmRpbmcgdGV4dCBsZW5ndGggdG8gdGhlIHdvcmtzaGVldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5UaGUgcmFuZ2UvYWRkcmVzcyB0byB2YWxpZGF0ZTwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbkludCBBZGRUZXh0TGVuZ3RoVmFsaWRhdGlvbihzdHJpbmcgYWRkcmVzcykgeworICAgIFZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzKTsKKyAgICBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpOworICAgIHZhciBpdGVtID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQoX3dvcmtzaGVldCwgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuVGV4dExlbmd0aCk7CisgICAgX3ZhbGlkYXRpb25zLkFkZChpdGVtKTsKKyAgICBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKKyAgICByZXR1cm4gaXRlbTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYW4gPHNlZSBjcmVmPSJJRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lIi8+IHRvIHRoZSB3b3Jrc2hlZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIHJhbmdlL2FkZHJlc3MgdG8gdmFsaWRhdGU8L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZSBBZGREYXRlVGltZVZhbGlkYXRpb24oc3RyaW5nIGFkZHJlc3MpIHsKKyAgICBWYWxpZGF0ZUFkZHJlc3MoYWRkcmVzcyk7CisgICAgRW5zdXJlUm9vdEVsZW1lbnRFeGlzdHMoKTsKKyAgICB2YXIgaXRlbSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUoCisgICAgICAgIF93b3Jrc2hlZXQsCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkRhdGVUaW1lKTsKKyAgICBfdmFsaWRhdGlvbnMuQWRkKGl0ZW0pOworICAgIE9uVmFsaWRhdGlvbkNvdW50Q2hhbmdlZCgpOworICAgIHJldHVybiBpdGVtOworICB9CisKKyAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uVGltZSBBZGRUaW1lVmFsaWRhdGlvbihzdHJpbmcgYWRkcmVzcykgeworICAgIFZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzKTsKKyAgICBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpOworICAgIHZhciBpdGVtID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lKF93b3Jrc2hlZXQsIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLlRpbWUpOworICAgIF92YWxpZGF0aW9ucy5BZGQoaXRlbSk7CisgICAgT25WYWxpZGF0aW9uQ291bnRDaGFuZ2VkKCk7CisgICAgcmV0dXJuIGl0ZW07CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tIi8+IHRvIHRoZSB3b3Jrc2hlZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIHJhbmdlL2FkZHJlc3MgdG8gdmFsaWRhdGU8L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20gQWRkQ3VzdG9tVmFsaWRhdGlvbihzdHJpbmcgYWRkcmVzcykgeworICAgIFZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzKTsKKyAgICBFbnN1cmVSb290RWxlbWVudEV4aXN0cygpOworICAgIHZhciBpdGVtID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20oX3dvcmtzaGVldCwgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuQ3VzdG9tKTsKKyAgICBfdmFsaWRhdGlvbnMuQWRkKGl0ZW0pOworICAgIE9uVmFsaWRhdGlvbkNvdW50Q2hhbmdlZCgpOworICAgIHJldHVybiBpdGVtOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmVtb3ZlcyBhbiA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb24iLz4gZnJvbSB0aGUgY29sbGVjdGlvbi4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgaXRlbSB0byByZW1vdmU8L3BhcmFtPgorICAvLy8gPHJldHVybnM+VHJ1ZSBpZiByZW1vdmUgc3VjY2VlZHMsIG90aGVyd2lzZSBmYWxzZTwvcmV0dXJucz4KKyAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIj5pZiA8cGFyYW1yZWYgbmFtZT0iaXRlbSIvPiBpcyBudWxsPC9leGNlcHRpb24+CisgIHB1YmxpYyBib29sIFJlbW92ZShJRXhjZWxEYXRhVmFsaWRhdGlvbiBpdGVtKSB7CisgICAgaWYgKCEoaXRlbSBpcyBFeGNlbERhdGFWYWxpZGF0aW9uKSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRDYXN0RXhjZXB0aW9uKAorICAgICAgICAgICJUaGUgc3VwcGxpZWQgaXRlbSBtdXN0IGluaGVyaXQgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5FeGNlbERhdGFWYWxpZGF0aW9uIik7CisgICAgfQorICAgIFJlcXVpcmUuQXJndW1lbnQoaXRlbSkuSXNOb3ROdWxsKCJpdGVtIik7CisgICAgVG9wTm9kZS5SZW1vdmVDaGlsZCgoKEV4Y2VsRGF0YVZhbGlkYXRpb24paXRlbSkuVG9wTm9kZSk7CisgICAgdmFyIHJldFZhbCA9IF92YWxpZGF0aW9ucy5SZW1vdmUoaXRlbSk7CisgICAgaWYgKHJldFZhbCkgeworICAgICAgT25WYWxpZGF0aW9uQ291bnRDaGFuZ2VkKCk7CisgICAgfQorICAgIHJldHVybiByZXRWYWw7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOdW1iZXIgb2YgdmFsaWRhdGlvbnMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBDb3VudCA9PiBfdmFsaWRhdGlvbnMuQ291bnQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW5kZXggb3BlcmF0b3IsIHJldHVybnMgYnkgMC1iYXNlZCBpbmRleAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb24gdGhpc1tpbnQgaW5kZXhdIHsKKyAgICBnZXQgeyByZXR1cm4gX3ZhbGlkYXRpb25zW2luZGV4XTsgfQorICAgIHNldCB7IF92YWxpZGF0aW9uc1tpbmRleF0gPSB2YWx1ZTsgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW5kZXggb3BlcmF0b3IsIHJldHVybnMgYSBkYXRhIHZhbGlkYXRpb24gd2hpY2ggYWRkcmVzcyBwYXJ0bHkgb3IgZXhhY3RseSBtYXRjaGVzIHRoZSBzZWFyY2hlZCBhZGRyZXNzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPkEgY2VsbCBhZGRyZXNzIG9yIHJhbmdlPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uIi8+IG9yIG51bGwgaWYgbm8gbWF0Y2g8L3JldHVybnM+CisgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbiB0aGlzW3N0cmluZyBhZGRyZXNzXSB7CisgICAgZ2V0IHsKKyAgICAgIHZhciBzZWFyY2hlZEFkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzKGFkZHJlc3MpOworICAgICAgcmV0dXJuIF92YWxpZGF0aW9ucy5GaW5kKHggPT4KKyAgICAgICAgICB4LkFkZHJlc3MuQ29sbGlkZShzZWFyY2hlZEFkZHJlc3MpICE9IEV4Y2VsQWRkcmVzc0Jhc2UuZUFkZHJlc3NDb2xsaXRpb24uTm8pOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgYWxsIHZhbGlkYXRpb25zIHRoYXQgbWF0Y2hlcyB0aGUgc3VwcGxpZWQgcHJlZGljYXRlIDxwYXJhbXJlZiBuYW1lPSJtYXRjaCIvPi4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJtYXRjaCI+cHJlZGljYXRlIHRvIGZpbHRlciBvdXQgbWF0Y2hpbmcgdmFsaWRhdGlvbnM8L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUVudW1lcmFibGU8SUV4Y2VsRGF0YVZhbGlkYXRpb24+IEZpbmRBbGwoUHJlZGljYXRlPElFeGNlbERhdGFWYWxpZGF0aW9uPiBtYXRjaCkgeworICAgIHJldHVybiBfdmFsaWRhdGlvbnMuRmluZEFsbChtYXRjaCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZXR1cm5zIHRoZSBmaXJzdCBtYXRjaGluZyB2YWxpZGF0aW9uLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Im1hdGNoIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb24gRmluZChQcmVkaWNhdGU8SUV4Y2VsRGF0YVZhbGlkYXRpb24+IG1hdGNoKSB7CisgICAgcmV0dXJuIF92YWxpZGF0aW9ucy5GaW5kKG1hdGNoKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJlbW92ZXMgYWxsIHZhbGlkYXRpb25zIGZyb20gdGhlIGNvbGxlY3Rpb24uCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyB2b2lkIENsZWFyKCkgeworICAgIERlbGV0ZUFsbE5vZGUoRGF0YVZhbGlkYXRpb25JdGVtc1BhdGguVHJpbVN0YXJ0KCcvJykpOworICAgIF92YWxpZGF0aW9ucy5DbGVhcigpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmVtb3ZlcyB0aGUgdmFsaWRhdGlvbnMgdGhhdCBtYXRjaGVzIHRoZSBwcmVkaWNhdGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJtYXRjaCI+PC9wYXJhbT4KKyAgcHVibGljIHZvaWQgUmVtb3ZlQWxsKFByZWRpY2F0ZTxJRXhjZWxEYXRhVmFsaWRhdGlvbj4gbWF0Y2gpIHsKKyAgICB2YXIgbWF0Y2hlcyA9IF92YWxpZGF0aW9ucy5GaW5kQWxsKG1hdGNoKTsKKyAgICBmb3JlYWNoICh2YXIgbSBpbiBtYXRjaGVzKSB7CisgICAgICBpZiAoIShtIGlzIEV4Y2VsRGF0YVZhbGlkYXRpb24pKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ2FzdEV4Y2VwdGlvbigKKyAgICAgICAgICAgICJUaGUgc3VwcGxpZWQgaXRlbSBtdXN0IGluaGVyaXQgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5FeGNlbERhdGFWYWxpZGF0aW9uIik7CisgICAgICB9CisgICAgICBUb3BOb2RlCisgICAgICAgICAgLlNlbGVjdFNpbmdsZU5vZGUoX2RhdGFWYWxpZGF0aW9uUGF0aC5UcmltU3RhcnQoJy8nKSwgTmFtZVNwYWNlTWFuYWdlcikKKyAgICAgICAgICAuUmVtb3ZlQ2hpbGQoKChFeGNlbERhdGFWYWxpZGF0aW9uKW0pLlRvcE5vZGUpOworICAgIH0KKyAgICBfdmFsaWRhdGlvbnMuUmVtb3ZlQWxsKG1hdGNoKTsKKyAgICBPblZhbGlkYXRpb25Db3VudENoYW5nZWQoKTsKKyAgfQorCisgIElFbnVtZXJhdG9yPElFeGNlbERhdGFWYWxpZGF0aW9uPiBJRW51bWVyYWJsZTxJRXhjZWxEYXRhVmFsaWRhdGlvbj4uR2V0RW51bWVyYXRvcigpIHsKKyAgICByZXR1cm4gX3ZhbGlkYXRpb25zLkdldEVudW1lcmF0b3IoKTsKKyAgfQorCisgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKSB7CisgICAgcmV0dXJuIF92YWxpZGF0aW9ucy5HZXRFbnVtZXJhdG9yKCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20uY3MKaW5kZXggMTA3MThmMy4uZjk4YjJmNiAxMDA2NDQKLS0tIGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20uY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20uY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDc1ICsxMyw4MSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTAxCiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXM7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0czsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24KLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEN1c3RvbSB2YWxpZGF0aW9uLCBpLmUuIGEgZm9ybXVsYS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tIDogRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhPElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYT4sIElFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlKQotICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFDdXN0b20oTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnN0cnVjdG9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFDdXN0b20oTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBDdXN0b20gdmFsaWRhdGlvbiwgaS5lLiBhIGZvcm11bGEuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20KKyAgICA6IEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGE+LAorICAgICAgSUV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20geworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tKAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgc3RyaW5nIGFkZHJlc3MsCisgICAgICBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSkKKyAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlKSB7CisgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUN1c3RvbShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKKyAgfQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnN0cnVjdG9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20oRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCi0gICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlLCBuYW1lc3BhY2VNYW5hZ2VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhQ3VzdG9tKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMVBhdGgpOwotICAgICAgICB9Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkN1c3RvbSgKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUpIHsKKyAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhQ3VzdG9tKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMVBhdGgpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29uc3RydWN0b3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkN1c3RvbSgKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUsIG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhQ3VzdG9tKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMVBhdGgpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZS5jcwppbmRleCAyYTk5Y2EwLi5jNzJhODNkIDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lLmNzCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDc4ICsxMyw4NSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTAxCiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhczsKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0czsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24KLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFZhbGlkYXRpb24gZm9yIDxzZWUgY3JlZj0iRGF0ZVRpbWUiLz4uCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lIDogRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZT4sIElFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnN0cnVjdG9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZShFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSkKLSAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWUoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7Ci0gICAgICAgICAgICBGb3JtdWxhMiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMlBhdGgpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKLSAgICAgICAgICAgIEZvcm11bGEyID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWUoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGEyUGF0aCk7Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBWYWxpZGF0aW9uIGZvciA8c2VlIGNyZWY9IkRhdGVUaW1lIi8+LgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUKKyAgICA6IEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTI8SUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWU+LAorICAgICAgSUV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENvbnN0cnVjdG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZSgKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUpCisgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSkgeworICAgIEZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKKyAgICBGb3JtdWxhMiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMlBhdGgpOworICB9CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQotICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIGl0ZW1FbGVtZW50Tm9kZSwgbmFtZXNwYWNlTWFuYWdlcikKLSAgICAgICAgewotICAgICAgICAgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMVBhdGgpOwotICAgICAgICAgICAgRm9ybXVsYTIgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTJQYXRoKTsKLSAgICAgICAgfQotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29uc3RydWN0b3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZSgKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUpIHsKKyAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWUoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7CisgICAgRm9ybXVsYTIgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTJQYXRoKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENvbnN0cnVjdG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZSgKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUsIG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWUoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7CisgICAgRm9ybXVsYTIgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTJQYXRoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsLmNzCmluZGV4IDA0YzlhMWUuLjFlOGU4YWYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbC5jcworKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDc5ICsxMyw4NCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTAxCiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKKwogdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRGF0YSB2YWxpZGF0aW9uIGZvciBkZWNpbWFsIHZhbHVlcwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsIDogRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsPiwgSUV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbChFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSkKLSAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKLSAgICAgICAgICAgIEZvcm11bGEyID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTJQYXRoKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMVBhdGgpOwotICAgICAgICAgICAgRm9ybXVsYTIgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMlBhdGgpOwotICAgICAgICB9CisvLy8gPHN1bW1hcnk+CisvLy8gRGF0YSB2YWxpZGF0aW9uIGZvciBkZWNpbWFsIHZhbHVlcworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbAorICAgIDogRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsPiwKKyAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbCB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENvbnN0cnVjdG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsKAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgc3RyaW5nIGFkZHJlc3MsCisgICAgICBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSkKKyAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlKSB7CisgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURlY2ltYWwoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7CisgICAgRm9ybXVsYTIgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMlBhdGgpOworICB9CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+Rm9yIHRlc3QgcHVycG9zZXM8L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbChFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKLSAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUsIG5hbWVzcGFjZU1hbmFnZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMVBhdGgpOwotICAgICAgICAgICAgRm9ybXVsYTIgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMlBhdGgpOwotICAgICAgICB9Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwoCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBzdHJpbmcgYWRkcmVzcywKKyAgICAgIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlKSB7CisgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURlY2ltYWwoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7CisgICAgRm9ybXVsYTIgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMlBhdGgpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29uc3RydWN0b3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+Rm9yIHRlc3QgcHVycG9zZXM8L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbCgKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUsIG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKKyAgICBGb3JtdWxhMiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURlY2ltYWwoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGEyUGF0aCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uRmFjdG9yeS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uRmFjdG9yeS5jcwppbmRleCAwMjNjZmQ0Li44NmRjYmE2IDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkZhY3RvcnkuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25GYWN0b3J5LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw2OCArMTMsNjYgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wMQogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqIFJhemlxIFlvcmsgCQkgICAgICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgQW55IHR5cGUgIDIwMTQtMDgtMDgKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24KLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEZhY3RvcnkgY2xhc3MgZm9yIEV4Y2VsRGF0YVZhbGlkYXRpb24uCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkZhY3RvcnkKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uIi8+IG91dCBvZiB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uIENyZWF0ZShFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB0eXBlLCBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudCh0eXBlKS5Jc05vdE51bGwoInZhbGlkYXRpb25UeXBlIik7Ci0gICAgICAgICAgICBzd2l0Y2ggKHR5cGUuVHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuQW55OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Bbnkod29ya3NoZWV0LCBhZGRyZXNzLCB0eXBlLCBpdGVtRWxlbWVudE5vZGUpOwotICAgICAgICAgICAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5UZXh0TGVuZ3RoOgotICAgICAgICAgICAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5XaG9sZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uSW50KHdvcmtzaGVldCwgYWRkcmVzcywgdHlwZSwgaXRlbUVsZW1lbnROb2RlKTsKLSAgICAgICAgICAgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuRGVjaW1hbDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbCh3b3Jrc2hlZXQsIGFkZHJlc3MsIHR5cGUsIGl0ZW1FbGVtZW50Tm9kZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLkxpc3Q6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3Qod29ya3NoZWV0LCBhZGRyZXNzLCB0eXBlLCBpdGVtRWxlbWVudE5vZGUpOwotICAgICAgICAgICAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5EYXRlVGltZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUod29ya3NoZWV0LCBhZGRyZXNzLCB0eXBlLCBpdGVtRWxlbWVudE5vZGUpOwotICAgICAgICAgICAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5UaW1lOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lKHdvcmtzaGVldCwgYWRkcmVzcywgdHlwZSwgaXRlbUVsZW1lbnROb2RlKTsKLSAgICAgICAgICAgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuQ3VzdG9tOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20od29ya3NoZWV0LCBhZGRyZXNzLCB0eXBlLCBpdGVtRWxlbWVudE5vZGUpOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb24gc3VwcG9ydGVkIHZhbGlkYXRpb250eXBlOiAiICsgdHlwZS5UeXBlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEZhY3RvcnkgY2xhc3MgZm9yIEV4Y2VsRGF0YVZhbGlkYXRpb24uCisvLy8gPC9zdW1tYXJ5PgoraW50ZXJuYWwgc3RhdGljIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25GYWN0b3J5IHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb24iLz4gb3V0IG9mIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb24gQ3JlYXRlKAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdHlwZSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpIHsKKyAgICBSZXF1aXJlLkFyZ3VtZW50KHR5cGUpLklzTm90TnVsbCgidmFsaWRhdGlvblR5cGUiKTsKKyAgICBzd2l0Y2ggKHR5cGUuVHlwZSkgeworICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLkFueToKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uQW55KHdvcmtzaGVldCwgYWRkcmVzcywgdHlwZSwgaXRlbUVsZW1lbnROb2RlKTsKKyAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5UZXh0TGVuZ3RoOgorICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLldob2xlOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQod29ya3NoZWV0LCBhZGRyZXNzLCB0eXBlLCBpdGVtRWxlbWVudE5vZGUpOworICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLkRlY2ltYWw6CisgICAgICAgIHJldHVybiBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwod29ya3NoZWV0LCBhZGRyZXNzLCB0eXBlLCBpdGVtRWxlbWVudE5vZGUpOworICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLkxpc3Q6CisgICAgICAgIHJldHVybiBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3Qod29ya3NoZWV0LCBhZGRyZXNzLCB0eXBlLCBpdGVtRWxlbWVudE5vZGUpOworICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLkRhdGVUaW1lOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHR5cGUsIGl0ZW1FbGVtZW50Tm9kZSk7CisgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuVGltZToKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uVGltZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHR5cGUsIGl0ZW1FbGVtZW50Tm9kZSk7CisgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuQ3VzdG9tOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20od29ya3NoZWV0LCBhZGRyZXNzLCB0eXBlLCBpdGVtRWxlbWVudE5vZGUpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIk5vbiBzdXBwb3J0ZWQgdmFsaWRhdGlvbnR5cGU6ICIgKyB0eXBlLlR5cGUpOwogICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25JbnQuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkludC5jcwppbmRleCBjN2FhYzg4Li4xMmNkYjk0IDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkludC5jcworKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkludC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsNzggKzEzLDkwIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKICAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKKwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRGF0YSB2YWxpZGF0aW9uIGZvciBpbnRlZ2VyIHZhbHVlcy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uSW50IDogRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFJbnQ+LCBJRXhjZWxEYXRhVmFsaWRhdGlvbkludAotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkludChFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSkKLSAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50KHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKLSAgICAgICAgICAgIEZvcm11bGEyID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50KHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTJQYXRoKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQotICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIGl0ZW1FbGVtZW50Tm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludCh3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7Ci0gICAgICAgICAgICBGb3JtdWxhMiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludCh3b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGEyUGF0aCk7Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBEYXRhIHZhbGlkYXRpb24gZm9yIGludGVnZXIgdmFsdWVzLgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uSW50CisgICAgOiBFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEyPElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludD4sCisgICAgICBJRXhjZWxEYXRhVmFsaWRhdGlvbkludCB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENvbnN0cnVjdG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25JbnQoCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBzdHJpbmcgYWRkcmVzcywKKyAgICAgIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlKQorICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUpIHsKKyAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50KHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKKyAgICBGb3JtdWxhMiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludCgKKyAgICAgICAgd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIsCisgICAgICAgIFRvcE5vZGUsCisgICAgICAgIF9mb3JtdWxhMlBhdGgpOworICB9CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+Rm9yIHRlc3QgcHVycG9zZXM8L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uSW50KEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQotICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIGl0ZW1FbGVtZW50Tm9kZSwgbmFtZXNwYWNlTWFuYWdlcikKLSAgICAgICAgewotICAgICAgICAgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKLSAgICAgICAgICAgIEZvcm11bGEyID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50KE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMlBhdGgpOwotICAgICAgICB9Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkludCgKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUpIHsKKyAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50KHdvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKKyAgICBGb3JtdWxhMiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludCgKKyAgICAgICAgd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIsCisgICAgICAgIFRvcE5vZGUsCisgICAgICAgIF9mb3JtdWxhMlBhdGgpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29uc3RydWN0b3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtRWxlbWVudE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+Rm9yIHRlc3QgcHVycG9zZXM8L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uSW50KAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgc3RyaW5nIGFkZHJlc3MsCisgICAgICBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIGl0ZW1FbGVtZW50Tm9kZSwgbmFtZXNwYWNlTWFuYWdlcikgeworICAgIEZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFJbnQoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7CisgICAgRm9ybXVsYTIgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFJbnQoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGEyUGF0aCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uTGlzdC5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uTGlzdC5jcwppbmRleCA2MzY4OTM4Li5lOWRiZGYxIDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25MaXN0LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw3NiArMTMsODEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzOworCiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gTGlzdCBkYXRhIHZhbGlkYXRpb24uCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QgOiBFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGE8SUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhTGlzdD4sIElFeGNlbERhdGFWYWxpZGF0aW9uTGlzdAotICAgIHsKLSAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUpCi0gICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnN0cnVjdG9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uTGlzdChFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhTGlzdChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKLSAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBMaXN0IGRhdGEgdmFsaWRhdGlvbi4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QKKyAgICA6IEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFMaXN0PiwKKyAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uTGlzdCB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENvbnN0cnVjdG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0KAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgc3RyaW5nIGFkZHJlc3MsCisgICAgICBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSkKKyAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlKSB7CisgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7CisgIH0KIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj5OYW1lc3BhY2UgbWFuYWdlciwgZm9yIHRlc3QgcHVycG9zZXM8L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uTGlzdChFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKLSAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUsIG5hbWVzcGFjZU1hbmFnZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFMaXN0KE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMVBhdGgpOwotICAgICAgICB9Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QoCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBzdHJpbmcgYWRkcmVzcywKKyAgICAgIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCisgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlKSB7CisgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj5OYW1lc3BhY2UgbWFuYWdlciwgZm9yIHRlc3QgcHVycG9zZXM8L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uTGlzdCgKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUsIG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhTGlzdChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IuY3MKaW5kZXggNTVkYjlkZC4uYTZmM2ZlMiAxMDA2NDQKLS0tIGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25PcGVyYXRvci5jcworKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbk9wZXJhdG9yLmNzCkBAIC0xMyw0MiArMTMsMzYgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wMQogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gT3BlcmF0b3IgZm9yIGNvbXBhcmlzb24gYmV0d2VlbiBGb3JtdWxhIGFuZCBGb3JtdWxhMiBpbiBhIHZhbGlkYXRpb24uCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IKLSAgICB7Ci0gICAgICAgIGFueSwKLSAgICAgICAgZXF1YWwsCi0gICAgICAgIG5vdEVxdWFsLAotICAgICAgICBsZXNzVGhhbiwKLSAgICAgICAgbGVzc1RoYW5PckVxdWFsLAotICAgICAgICBncmVhdGVyVGhhbiwKLSAgICAgICAgZ3JlYXRlclRoYW5PckVxdWFsLAotICAgICAgICBiZXR3ZWVuLAotICAgICAgICBub3RCZXR3ZWVuCi0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBPcGVyYXRvciBmb3IgY29tcGFyaXNvbiBiZXR3ZWVuIEZvcm11bGEgYW5kIEZvcm11bGEyIGluIGEgdmFsaWRhdGlvbi4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgZW51bSBFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IgeworICBBbnksCisgIEVxdWFsLAorICBOb3RFcXVhbCwKKyAgTGVzc1RoYW4sCisgIExlc3NUaGFuT3JFcXVhbCwKKyAgR3JlYXRlclRoYW4sCisgIEdyZWF0ZXJUaGFuT3JFcXVhbCwKKyAgQmV0d2VlbiwKKyAgTm90QmV0d2VlbiwKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uVGltZS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uVGltZS5jcwppbmRleCAzYTFmNzBiLi4zYzM3ZDEzIDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25UaW1lLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw3OSArMTMsODQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzOworCiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHM7Ci11c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVmFsaWRhdGlvbiBmb3IgdGltZXMgKDxzZWUgY3JlZj0iT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5FeGNlbFRpbWUiLz4pLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lIDogRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lPiwgSUV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lCi0gICAgewotICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUpCi0gICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVRpbWUoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7Ci0gICAgICAgICAgICBGb3JtdWxhMiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVRpbWUoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGEyUGF0aCk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnN0cnVjdG9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uVGltZShFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKLSAgICAgICAgICAgIEZvcm11bGEyID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTJQYXRoKTsKLSAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIFZhbGlkYXRpb24gZm9yIHRpbWVzICg8c2VlIGNyZWY9Ik9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRXhjZWxUaW1lIi8+KS4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUKKyAgICA6IEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTI8SUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZT4sCisgICAgICBJRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uVGltZSgKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUpCisgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSkgeworICAgIEZvcm11bGEgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIF9mb3JtdWxhMVBhdGgpOworICAgIEZvcm11bGEyID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTJQYXRoKTsKKyAgfQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnN0cnVjdG9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPjwvcGFyYW0+Ci0gICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQotICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIGl0ZW1FbGVtZW50Tm9kZSwgbmFtZXNwYWNlTWFuYWdlcikKLSAgICAgICAgewotICAgICAgICAgICAgRm9ybXVsYSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVRpbWUoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGExUGF0aCk7Ci0gICAgICAgICAgICBGb3JtdWxhMiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVRpbWUoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGEyUGF0aCk7Ci0gICAgICAgIH0KLSAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENvbnN0cnVjdG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uVGltZSgKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUpIHsKKyAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKKyAgICBGb3JtdWxhMiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVRpbWUoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGEyUGF0aCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uVGltZSgKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUsIG5hbWVzcGFjZU1hbmFnZXIpIHsKKyAgICBGb3JtdWxhID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZShOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCBfZm9ybXVsYTFQYXRoKTsKKyAgICBGb3JtdWxhMiA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVRpbWUoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgX2Zvcm11bGEyUGF0aCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5jcwppbmRleCA2Y2ExNzg2Li41MGI4NTcxIDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywzMDcgKzEzLDI3NyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTAxCiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNwogICogUmF6aXEgWW9yayAJCSAgICAgICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBBbnkgdHlwZSAgMjAxNC0wOC0wOAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24KLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEVudW0gZm9yIGF2YWlsYWJsZSBkYXRhIHZhbGlkYXRpb24gdHlwZXMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIGVEYXRhVmFsaWRhdGlvblR5cGUKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFueSB2YWx1ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBBbnksCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEludGVnZXIgdmFsdWUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgV2hvbGUsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERlY2ltYWwgdmFsdWVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIERlY2ltYWwsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIExpc3Qgb2YgdmFsdWVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIExpc3QsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRleHQgbGVuZ3RoIHZhbGlkYXRpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgVGV4dExlbmd0aCwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGF0ZVRpbWUgdmFsaWRhdGlvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBEYXRlVGltZSwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGltZSB2YWxpZGF0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFRpbWUsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEN1c3RvbSB2YWxpZGF0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEN1c3RvbQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBFbnVtIGZvciBhdmFpbGFibGUgZGF0YSB2YWxpZGF0aW9uIHR5cGVzCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gZURhdGFWYWxpZGF0aW9uVHlwZSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFueSB2YWx1ZQorICAvLy8gPC9zdW1tYXJ5PgorICBBbnksCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW50ZWdlciB2YWx1ZQorICAvLy8gPC9zdW1tYXJ5PgorICBXaG9sZSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBEZWNpbWFsIHZhbHVlcworICAvLy8gPC9zdW1tYXJ5PgorICBEZWNpbWFsLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIExpc3Qgb2YgdmFsdWVzCisgIC8vLyA8L3N1bW1hcnk+CisgIExpc3QsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGV4dCBsZW5ndGggdmFsaWRhdGlvbgorICAvLy8gPC9zdW1tYXJ5PgorICBUZXh0TGVuZ3RoLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIERhdGVUaW1lIHZhbGlkYXRpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgRGF0ZVRpbWUsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGltZSB2YWxpZGF0aW9uCisgIC8vLyA8L3N1bW1hcnk+CisgIFRpbWUsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ3VzdG9tIHZhbGlkYXRpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgQ3VzdG9tLAorfQorCitpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRGF0YVZhbGlkYXRpb25TY2hlbWFOYW1lcyB7CisgIHB1YmxpYyBjb25zdCBzdHJpbmcgQW55ID0gIiI7CisgIHB1YmxpYyBjb25zdCBzdHJpbmcgV2hvbGUgPSAid2hvbGUiOworICBwdWJsaWMgY29uc3Qgc3RyaW5nIERlY2ltYWwgPSAiZGVjaW1hbCI7CisgIHB1YmxpYyBjb25zdCBzdHJpbmcgTGlzdCA9ICJsaXN0IjsKKyAgcHVibGljIGNvbnN0IHN0cmluZyBUZXh0TGVuZ3RoID0gInRleHRMZW5ndGgiOworICBwdWJsaWMgY29uc3Qgc3RyaW5nIERhdGUgPSAiZGF0ZSI7CisgIHB1YmxpYyBjb25zdCBzdHJpbmcgVGltZSA9ICJ0aW1lIjsKKyAgcHVibGljIGNvbnN0IHN0cmluZyBDdXN0b20gPSAiY3VzdG9tIjsKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIFR5cGVzIG9mIGRhdGF2YWxpZGF0aW9uCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHsKKyAgcHJpdmF0ZSBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSgKKyAgICAgIGVEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsCisgICAgICBib29sIGFsbG93T3BlcmF0b3IsCisgICAgICBzdHJpbmcgc2NoZW1hTmFtZSkgeworICAgIFR5cGUgPSB2YWxpZGF0aW9uVHlwZTsKKyAgICBBbGxvd09wZXJhdG9yID0gYWxsb3dPcGVyYXRvcjsKKyAgICBTY2hlbWFOYW1lID0gc2NoZW1hTmFtZTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFZhbGlkYXRpb24gdHlwZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZURhdGFWYWxpZGF0aW9uVHlwZSBUeXBlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgIGludGVybmFsIHN0cmluZyBTY2hlbWFOYW1lIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoaXMgdHlwZSBhbGxvd3Mgb3BlcmF0b3IgdG8gYmUgc2V0CisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIGJvb2wgQWxsb3dPcGVyYXRvciB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZXR1cm5zIGEgdmFsaWRhdGlvbiB0eXBlIGJ5IDxzZWUgY3JlZj0iZURhdGFWYWxpZGF0aW9uVHlwZSIvPgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InR5cGUiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIGludGVybmFsIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBHZXRCeVZhbGlkYXRpb25UeXBlKGVEYXRhVmFsaWRhdGlvblR5cGUgdHlwZSkgeworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLkFueToKKyAgICAgICAgcmV0dXJuIEFueTsKKyAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5XaG9sZToKKyAgICAgICAgcmV0dXJuIFdob2xlOworICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLkxpc3Q6CisgICAgICAgIHJldHVybiBMaXN0OworICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLkRlY2ltYWw6CisgICAgICAgIHJldHVybiBEZWNpbWFsOworICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLlRleHRMZW5ndGg6CisgICAgICAgIHJldHVybiBUZXh0TGVuZ3RoOworICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLkRhdGVUaW1lOgorICAgICAgICByZXR1cm4gRGF0ZVRpbWU7CisgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuVGltZToKKyAgICAgICAgcmV0dXJuIFRpbWU7CisgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuQ3VzdG9tOgorICAgICAgICByZXR1cm4gQ3VzdG9tOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIk5vbiBzdXBwb3J0ZWQgVmFsaWRhdGlvbnR5cGUgOiAiICsgdHlwZSk7CiAgICAgfQorICB9CiAKLSAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRGF0YVZhbGlkYXRpb25TY2hlbWFOYW1lcwotICAgIHsKLSAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBBbnkgPSAiIjsKLSAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBXaG9sZSA9ICJ3aG9sZSI7Ci0gICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgRGVjaW1hbCA9ICJkZWNpbWFsIjsKLSAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBMaXN0ID0gImxpc3QiOwotICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIFRleHRMZW5ndGggPSAidGV4dExlbmd0aCI7Ci0gICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgRGF0ZSA9ICJkYXRlIjsKLSAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBUaW1lID0gInRpbWUiOwotICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIEN1c3RvbSA9ICJjdXN0b20iOworICBpbnRlcm5hbCBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgR2V0QnlTY2hlbWFOYW1lKHN0cmluZyBzY2hlbWFOYW1lKSB7CisgICAgc3dpdGNoIChzY2hlbWFOYW1lKSB7CisgICAgICBjYXNlIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuQW55OgorICAgICAgICByZXR1cm4gQW55OworICAgICAgY2FzZSBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLldob2xlOgorICAgICAgICByZXR1cm4gV2hvbGU7CisgICAgICBjYXNlIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuRGVjaW1hbDoKKyAgICAgICAgcmV0dXJuIERlY2ltYWw7CisgICAgICBjYXNlIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuTGlzdDoKKyAgICAgICAgcmV0dXJuIExpc3Q7CisgICAgICBjYXNlIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuVGV4dExlbmd0aDoKKyAgICAgICAgcmV0dXJuIFRleHRMZW5ndGg7CisgICAgICBjYXNlIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuRGF0ZToKKyAgICAgICAgcmV0dXJuIERhdGVUaW1lOworICAgICAgY2FzZSBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLlRpbWU6CisgICAgICAgIHJldHVybiBUaW1lOworICAgICAgY2FzZSBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLkN1c3RvbToKKyAgICAgICAgcmV0dXJuIEN1c3RvbTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBzY2hlbWFuYW1lOiAiICsgc2NoZW1hTmFtZSk7CiAgICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFR5cGVzIG9mIGRhdGF2YWxpZGF0aW9uCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUoZURhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwgYm9vbCBhbGxvd09wZXJhdG9yLCBzdHJpbmcgc2NoZW1hTmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgVHlwZSA9IHZhbGlkYXRpb25UeXBlOwotICAgICAgICAgICAgQWxsb3dPcGVyYXRvciA9IGFsbG93T3BlcmF0b3I7Ci0gICAgICAgICAgICBTY2hlbWFOYW1lID0gc2NoZW1hTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFZhbGlkYXRpb24gdHlwZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZURhdGFWYWxpZGF0aW9uVHlwZSBUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHByaXZhdGUgc2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFNjaGVtYU5hbWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGlzIHR5cGUgYWxsb3dzIG9wZXJhdG9yIHRvIGJlIHNldAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBib29sIEFsbG93T3BlcmF0b3IKLSAgICAgICAgewotCi0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBwcml2YXRlIHNldDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgYSB2YWxpZGF0aW9uIHR5cGUgYnkgPHNlZSBjcmVmPSJlRGF0YVZhbGlkYXRpb25UeXBlIi8+Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIEdldEJ5VmFsaWRhdGlvblR5cGUoZURhdGFWYWxpZGF0aW9uVHlwZSB0eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLkFueToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkFueTsKLSAgICAgICAgICAgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuV2hvbGU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5XaG9sZTsKLSAgICAgICAgICAgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuTGlzdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkxpc3Q7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLkRlY2ltYWw6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5EZWNpbWFsOwotICAgICAgICAgICAgICAgIGNhc2UgZURhdGFWYWxpZGF0aW9uVHlwZS5UZXh0TGVuZ3RoOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuVGV4dExlbmd0aDsKLSAgICAgICAgICAgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuRGF0ZVRpbWU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5EYXRlVGltZTsKLSAgICAgICAgICAgICAgICBjYXNlIGVEYXRhVmFsaWRhdGlvblR5cGUuVGltZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLlRpbWU7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRGF0YVZhbGlkYXRpb25UeXBlLkN1c3RvbToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkN1c3RvbTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm9uIHN1cHBvcnRlZCBWYWxpZGF0aW9udHlwZSA6ICIgKyB0eXBlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIEdldEJ5U2NoZW1hTmFtZShzdHJpbmcgc2NoZW1hTmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChzY2hlbWFOYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgRGF0YVZhbGlkYXRpb25TY2hlbWFOYW1lcy5Bbnk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5Bbnk7Ci0gICAgICAgICAgICAgICAgY2FzZSBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLldob2xlOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuV2hvbGU7Ci0gICAgICAgICAgICAgICAgY2FzZSBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLkRlY2ltYWw6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5EZWNpbWFsOwotICAgICAgICAgICAgICAgIGNhc2UgRGF0YVZhbGlkYXRpb25TY2hlbWFOYW1lcy5MaXN0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUuTGlzdDsKLSAgICAgICAgICAgICAgICBjYXNlIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuVGV4dExlbmd0aDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLlRleHRMZW5ndGg7Ci0gICAgICAgICAgICAgICAgY2FzZSBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLkRhdGU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZS5EYXRlVGltZTsKLSAgICAgICAgICAgICAgICBjYXNlIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuVGltZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLlRpbWU7Ci0gICAgICAgICAgICAgICAgY2FzZSBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLkN1c3RvbToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlLkN1c3RvbTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc2NoZW1hbmFtZTogIiArIHNjaGVtYU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gT3ZlcnJpZGRlbiBFcXVhbHMsIGNvbXBhcmVzIG9uIGludGVybmFsIHZhbGlkYXRpb24gdHlwZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9iaiI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpcyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICgoRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUpb2JqKS5UeXBlID09IFR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBPdmVycmlkZXMgR2V0SGFzaENvZGUoKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJhc2UuR2V0SGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEludGVnZXIgdmFsdWVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIF9hbnk7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgQW55Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfYW55ID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfYW55ID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlKGVEYXRhVmFsaWRhdGlvblR5cGUuQW55LCBmYWxzZSwgRGF0YVZhbGlkYXRpb25TY2hlbWFOYW1lcy5BbnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2FueTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEludGVnZXIgdmFsdWVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIF93aG9sZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBXaG9sZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3dob2xlID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfd2hvbGUgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUoZURhdGFWYWxpZGF0aW9uVHlwZS5XaG9sZSwgdHJ1ZSwgRGF0YVZhbGlkYXRpb25TY2hlbWFOYW1lcy5XaG9sZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfd2hvbGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMaXN0IG9mIGFsbG93ZWQgdmFsdWVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIF9saXN0OwotICAgICAgICBwdWJsaWMgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIExpc3QKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9saXN0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbGlzdCA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZShlRGF0YVZhbGlkYXRpb25UeXBlLkxpc3QsIGZhbHNlLCBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLkxpc3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2xpc3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBfZGVjaW1hbDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBEZWNpbWFsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZGVjaW1hbCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2RlY2ltYWwgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUoZURhdGFWYWxpZGF0aW9uVHlwZS5EZWNpbWFsLCB0cnVlLCBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLkRlY2ltYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2RlY2ltYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBfdGV4dExlbmd0aDsKLSAgICAgICAgcHVibGljIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBUZXh0TGVuZ3RoCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfdGV4dExlbmd0aCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3RleHRMZW5ndGggPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUoZURhdGFWYWxpZGF0aW9uVHlwZS5UZXh0TGVuZ3RoLCB0cnVlLCBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLlRleHRMZW5ndGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX3RleHRMZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBfZGF0ZVRpbWU7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgRGF0ZVRpbWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9kYXRlVGltZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2RhdGVUaW1lID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlKGVEYXRhVmFsaWRhdGlvblR5cGUuRGF0ZVRpbWUsIHRydWUsIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuRGF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfZGF0ZVRpbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBfdGltZTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBUaW1lCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfdGltZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3RpbWUgPSBuZXcgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUoZURhdGFWYWxpZGF0aW9uVHlwZS5UaW1lLCB0cnVlLCBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLlRpbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX3RpbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBfY3VzdG9tOwotICAgICAgICBwdWJsaWMgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIEN1c3RvbQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2N1c3RvbSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2N1c3RvbSA9IG5ldyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZShlRGF0YVZhbGlkYXRpb25UeXBlLkN1c3RvbSwgdHJ1ZSwgRGF0YVZhbGlkYXRpb25TY2hlbWFOYW1lcy5DdXN0b20pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2N1c3RvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBPdmVycmlkZGVuIEVxdWFscywgY29tcGFyZXMgb24gaW50ZXJuYWwgdmFsaWRhdGlvbiB0eXBlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ib2JqIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikgeworICAgIGlmICghKG9iaiBpcyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgICAgcmV0dXJuICgoRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUpb2JqKS5UeXBlID09IFR5cGU7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBPdmVycmlkZXMgR2V0SGFzaENvZGUoKQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgeworICAgIHJldHVybiBiYXNlLkdldEhhc2hDb2RlKCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbnRlZ2VyIHZhbHVlcworICAvLy8gPC9zdW1tYXJ5PgorICBwcml2YXRlIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBfYW55OworCisgIHB1YmxpYyBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgQW55IHsKKyAgICBnZXQgeworICAgICAgaWYgKF9hbnkgPT0gbnVsbCkgeworICAgICAgICBfYW55ID0gbmV3KGVEYXRhVmFsaWRhdGlvblR5cGUuQW55LCBmYWxzZSwgRGF0YVZhbGlkYXRpb25TY2hlbWFOYW1lcy5BbnkpOworICAgICAgfQorICAgICAgcmV0dXJuIF9hbnk7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW50ZWdlciB2YWx1ZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHJpdmF0ZSBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgX3dob2xlOworCisgIHB1YmxpYyBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgV2hvbGUgeworICAgIGdldCB7CisgICAgICBpZiAoX3dob2xlID09IG51bGwpIHsKKyAgICAgICAgX3dob2xlID0gbmV3KGVEYXRhVmFsaWRhdGlvblR5cGUuV2hvbGUsIHRydWUsIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuV2hvbGUpOworICAgICAgfQorICAgICAgcmV0dXJuIF93aG9sZTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMaXN0IG9mIGFsbG93ZWQgdmFsdWVzCisgIC8vLyA8L3N1bW1hcnk+CisgIHByaXZhdGUgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIF9saXN0OworCisgIHB1YmxpYyBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgTGlzdCB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfbGlzdCA9PSBudWxsKSB7CisgICAgICAgIF9saXN0ID0gbmV3KGVEYXRhVmFsaWRhdGlvblR5cGUuTGlzdCwgZmFsc2UsIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuTGlzdCk7CisgICAgICB9CisgICAgICByZXR1cm4gX2xpc3Q7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgX2RlY2ltYWw7CisKKyAgcHVibGljIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBEZWNpbWFsIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9kZWNpbWFsID09IG51bGwpIHsKKyAgICAgICAgX2RlY2ltYWwgPSBuZXcoZURhdGFWYWxpZGF0aW9uVHlwZS5EZWNpbWFsLCB0cnVlLCBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLkRlY2ltYWwpOworICAgICAgfQorICAgICAgcmV0dXJuIF9kZWNpbWFsOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIF90ZXh0TGVuZ3RoOworCisgIHB1YmxpYyBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgVGV4dExlbmd0aCB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfdGV4dExlbmd0aCA9PSBudWxsKSB7CisgICAgICAgIF90ZXh0TGVuZ3RoID0gbmV3KAorICAgICAgICAgICAgZURhdGFWYWxpZGF0aW9uVHlwZS5UZXh0TGVuZ3RoLAorICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuVGV4dExlbmd0aCk7CisgICAgICB9CisgICAgICByZXR1cm4gX3RleHRMZW5ndGg7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgX2RhdGVUaW1lOworCisgIHB1YmxpYyBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgRGF0ZVRpbWUgeworICAgIGdldCB7CisgICAgICBpZiAoX2RhdGVUaW1lID09IG51bGwpIHsKKyAgICAgICAgX2RhdGVUaW1lID0gbmV3KGVEYXRhVmFsaWRhdGlvblR5cGUuRGF0ZVRpbWUsIHRydWUsIERhdGFWYWxpZGF0aW9uU2NoZW1hTmFtZXMuRGF0ZSk7CisgICAgICB9CisgICAgICByZXR1cm4gX2RhdGVUaW1lOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIF90aW1lOworCisgIHB1YmxpYyBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgVGltZSB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfdGltZSA9PSBudWxsKSB7CisgICAgICAgIF90aW1lID0gbmV3KGVEYXRhVmFsaWRhdGlvblR5cGUuVGltZSwgdHJ1ZSwgRGF0YVZhbGlkYXRpb25TY2hlbWFOYW1lcy5UaW1lKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfdGltZTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSBfY3VzdG9tOworCisgIHB1YmxpYyBzdGF0aWMgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgQ3VzdG9tIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9jdXN0b20gPT0gbnVsbCkgeworICAgICAgICBfY3VzdG9tID0gbmV3KGVEYXRhVmFsaWRhdGlvblR5cGUuQ3VzdG9tLCB0cnVlLCBEYXRhVmFsaWRhdGlvblNjaGVtYU5hbWVzLkN1c3RvbSk7CisgICAgICB9CisgICAgICByZXR1cm4gX2N1c3RvbTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uV2FybmluZ1N0eWxlLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUuY3MKaW5kZXggZjZhMDU3OC4uYWU4MDhiYiAxMDA2NDQKLS0tIGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25XYXJuaW5nU3R5bGUuY3MKQEAgLTEzLDQ5ICsxMyw0NiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTAxCiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyB3YXJuaW5nIHN0eWxlLCBjb250cm9scyBob3cgRXhjZWwgd2lsbCBoYW5kbGUgaW52YWxpZCBjaGFuZ2VzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gRXhjZWxEYXRhVmFsaWRhdGlvbldhcm5pbmdTdHlsZQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gd2FybmluZyBzdHlsZSB3aWxsIGJlIGV4Y2x1ZGVkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHVuZGVmaW5lZCwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gc3RvcCB3YXJuaW5nIHN0eWxlLCBpbnZhbGlkIGNoYW5nZXMgd2lsbCBub3QgYmUgYWNjZXB0ZWQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgc3RvcCwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gd2FybmluZyB3aWxsIGJlIHByZXNlbnRlZCB3aGVuIGFuIGF0dGVtcHQgdG8gYW4gaW52YWxpZCBjaGFuZ2UgaXMgZG9uZSwgYnV0IHRoZSBjaGFuZ2Ugd2lsbCBiZSBhY2NlcHRlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgd2FybmluZywKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gaW5mb3JtYXRpb24gd2FybmluZyBzdHlsZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW5mb3JtYXRpb24KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKKworLy8vIDxzdW1tYXJ5PgorLy8vIHdhcm5pbmcgc3R5bGUsIGNvbnRyb2xzIGhvdyBFeGNlbCB3aWxsIGhhbmRsZSBpbnZhbGlkIGNoYW5nZXMuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gRXhjZWxEYXRhVmFsaWRhdGlvbldhcm5pbmdTdHlsZSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIHdhcm5pbmcgc3R5bGUgd2lsbCBiZSBleGNsdWRlZAorICAvLy8gPC9zdW1tYXJ5PgorICBVbmRlZmluZWQsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gc3RvcCB3YXJuaW5nIHN0eWxlLCBpbnZhbGlkIGNoYW5nZXMgd2lsbCBub3QgYmUgYWNjZXB0ZWQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgU3RvcCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyB3YXJuaW5nIHdpbGwgYmUgcHJlc2VudGVkIHdoZW4gYW4gYXR0ZW1wdCB0byBhbiBpbnZhbGlkIGNoYW5nZSBpcyBkb25lLCBidXQgdGhlIGNoYW5nZSB3aWxsIGJlIGFjY2VwdGVkLgorICAvLy8gPC9zdW1tYXJ5PgorICBXYXJuaW5nLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIGluZm9ybWF0aW9uIHdhcm5pbmcgc3R5bGUuCisgIC8vLyA8L3N1bW1hcnk+CisgIEluZm9ybWF0aW9uLAogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEuY3MKaW5kZXggMzBiNjZkMy4uN2MyMDgyNSAxMDA2NDQKLS0tIGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYS5jcworKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw5NyArMTMsOTIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wMQogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKIHVzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24KLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEEgdmFsaWRhdGlvbiBjb250YWluaW5nIGEgZm9ybXVsYQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+PC90eXBlcGFyYW0+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTxUPiA6IEV4Y2VsRGF0YVZhbGlkYXRpb24KLSAgICAgICAgd2hlcmUgVCA6IElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlKQotICAgICAgICAgICAgOiB0aGlzKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIG51bGwpCi0gICAgICAgIHsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwogCi0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBBIHZhbGlkYXRpb24gY29udGFpbmluZyBhIGZvcm11bGEKKy8vLyA8L3N1bW1hcnk+CisvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj48L3R5cGVwYXJhbT4KK3B1YmxpYyBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGE8VD4gOiBFeGNlbERhdGFWYWxpZGF0aW9uCisgICAgd2hlcmUgVCA6IElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENvbnN0cnVjdG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idmFsaWRhdGlvblR5cGUiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYSgKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUpCisgICAgICA6IHRoaXMod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgbnVsbCkge30KIAotICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPldvcmtzaGVldCB0aGF0IG93bnMgdGhlIHZhbGlkYXRpb248L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+WG1sIHRvcCBub2RlIChkYXRhVmFsaWRhdGlvbnMpPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+RGF0YSB2YWxpZGF0aW9uIHR5cGU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPmFkZHJlc3MgZm9yIGRhdGEgdmFsaWRhdGlvbjwvcGFyYW0+Ci0gICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYShFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+V29ya3NoZWV0IHRoYXQgb3ducyB0aGUgdmFsaWRhdGlvbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj5YbWwgdG9wIG5vZGUgKGRhdGFWYWxpZGF0aW9ucyk8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj5EYXRhIHZhbGlkYXRpb24gdHlwZTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+YWRkcmVzcyBmb3IgZGF0YSB2YWxpZGF0aW9uPC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhKAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgc3RyaW5nIGFkZHJlc3MsCisgICAgICBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwKKyAgICAgIFhtbE5vZGUgaXRlbUVsZW1lbnROb2RlKQorICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIGl0ZW1FbGVtZW50Tm9kZSkge30KIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+V29ya3NoZWV0IHRoYXQgb3ducyB0aGUgdmFsaWRhdGlvbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj5YbWwgdG9wIG5vZGUgKGRhdGFWYWxpZGF0aW9ucyk8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj5EYXRhIHZhbGlkYXRpb24gdHlwZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+YWRkcmVzcyBmb3IgZGF0YSB2YWxpZGF0aW9uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj5mb3IgdGVzdCBwdXJwb3NlczwvcGFyYW0+Ci0gICAgICAgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYShFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKLSAgICAgICAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUsIG5hbWVzcGFjZU1hbmFnZXIpCi0gICAgICAgIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29uc3RydWN0b3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPldvcmtzaGVldCB0aGF0IG93bnMgdGhlIHZhbGlkYXRpb248L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+WG1sIHRvcCBub2RlIChkYXRhVmFsaWRhdGlvbnMpPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+RGF0YSB2YWxpZGF0aW9uIHR5cGU8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPmFkZHJlc3MgZm9yIGRhdGEgdmFsaWRhdGlvbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+Zm9yIHRlc3QgcHVycG9zZXM8L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEoCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBzdHJpbmcgYWRkcmVzcywKKyAgICAgIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlLCBuYW1lc3BhY2VNYW5hZ2VyKSB7fQogCi0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRm9ybXVsYSAtIEVpdGhlciBhIHtUfSB2YWx1ZSAoZXhjZXB0IGZvciBjdXN0b20gdmFsaWRhdGlvbikgb3IgYSBzcHJlYWRzaGVldCBmb3JtdWxhCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBUIEZvcm11bGEgeyBnZXQ7IHByb3RlY3RlZCBzZXQ7IH0KIAotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvcm11bGEgLSBFaXRoZXIgYSB7VH0gdmFsdWUgKGV4Y2VwdCBmb3IgY3VzdG9tIHZhbGlkYXRpb24pIG9yIGEgc3ByZWFkc2hlZXQgZm9ybXVsYQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgVCBGb3JtdWxhCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHByb3RlY3RlZCBzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBWYWxpZGF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJhc2UuVmFsaWRhdGUoKTsKLSAgICAgICAgICAgIGlmIChPcGVyYXRvciA9PSBFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IuYmV0d2VlbiB8fCBPcGVyYXRvciA9PSBFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3Iubm90QmV0d2VlbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoRm9ybXVsYTJJbnRlcm5hbCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVmFsaWRhdGlvbiBvZiAiICsgQWRkcmVzcy5BZGRyZXNzICsgIiBmYWlsZWQ6IEZvcm11bGEyIG11c3QgYmUgc2V0IGlmIG9wZXJhdG9yIGlzICdiZXR3ZWVuJyBvciAnbm90QmV0d2VlbiciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIHZvaWQgVmFsaWRhdGUoKSB7CisgICAgYmFzZS5WYWxpZGF0ZSgpOworICAgIGlmIChPcGVyYXRvciA9PSBFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IuQmV0d2VlbgorICAgICAgICB8fCBPcGVyYXRvciA9PSBFeGNlbERhdGFWYWxpZGF0aW9uT3BlcmF0b3IuTm90QmV0d2VlbikgeworICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KEZvcm11bGEySW50ZXJuYWwpKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgIlZhbGlkYXRpb24gb2YgIgorICAgICAgICAgICAgICAgICsgQWRkcmVzcy5BZGRyZXNzCisgICAgICAgICAgICAgICAgKyAiIGZhaWxlZDogRm9ybXVsYTIgbXVzdCBiZSBzZXQgaWYgb3BlcmF0b3IgaXMgJ2JldHdlZW4nIG9yICdub3RCZXR3ZWVuJyIpOworICAgICAgfQogICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTIuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMi5jcwppbmRleCBhOGZlY2QzLi4zYjliN2MwIDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMi5jcworKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMi5jcwpAQCAtMTMsNzkgKzEzLDc0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDEKICAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOworCiB1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uCi17Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTI8VD4gOiBFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGE8VD4KLSAgICAgICAgd2hlcmUgVCA6IElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMihFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSkKLSAgICAgICAgICAgIDogdGhpcyh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBudWxsKQotICAgICAgICB7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKIAotICAgICAgICB9CitwdWJsaWMgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMjxUPiA6IEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTxUPgorICAgIHdoZXJlIFQgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj48L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEyKAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LAorICAgICAgc3RyaW5nIGFkZHJlc3MsCisgICAgICBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSkKKyAgICAgIDogdGhpcyh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBudWxsKSB7fQogCi0gICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+V29ya3NoZWV0IHRoYXQgb3ducyB0aGUgdmFsaWRhdGlvbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj5YbWwgdG9wIG5vZGUgKGRhdGFWYWxpZGF0aW9ucyk8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj5EYXRhIHZhbGlkYXRpb24gdHlwZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+YWRkcmVzcyBmb3IgZGF0YSB2YWxpZGF0aW9uPC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMihFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBFeGNlbERhdGFWYWxpZGF0aW9uVHlwZSB2YWxpZGF0aW9uVHlwZSwgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUpCi0gICAgICAgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+V29ya3NoZWV0IHRoYXQgb3ducyB0aGUgdmFsaWRhdGlvbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj5YbWwgdG9wIG5vZGUgKGRhdGFWYWxpZGF0aW9ucyk8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj5EYXRhIHZhbGlkYXRpb24gdHlwZTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+YWRkcmVzcyBmb3IgZGF0YSB2YWxpZGF0aW9uPC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxEYXRhVmFsaWRhdGlvbldpdGhGb3JtdWxhMigKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgRXhjZWxEYXRhVmFsaWRhdGlvblR5cGUgdmFsaWRhdGlvblR5cGUsCisgICAgICBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSkKKyAgICAgIDogYmFzZSh3b3Jrc2hlZXQsIGFkZHJlc3MsIHZhbGlkYXRpb25UeXBlLCBpdGVtRWxlbWVudE5vZGUpIHt9CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPldvcmtzaGVldCB0aGF0IG93bnMgdGhlIHZhbGlkYXRpb248L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW1FbGVtZW50Tm9kZSI+WG1sIHRvcCBub2RlIChkYXRhVmFsaWRhdGlvbnMpPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWxpZGF0aW9uVHlwZSI+RGF0YSB2YWxpZGF0aW9uIHR5cGU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPmFkZHJlc3MgZm9yIGRhdGEgdmFsaWRhdGlvbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+Zm9yIHRlc3QgcHVycG9zZXM8L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbERhdGFWYWxpZGF0aW9uV2l0aEZvcm11bGEyKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MsIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLCBYbWxOb2RlIGl0ZW1FbGVtZW50Tm9kZSwgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQotICAgICAgICAgICAgOiBiYXNlKHdvcmtzaGVldCwgYWRkcmVzcywgdmFsaWRhdGlvblR5cGUsIGl0ZW1FbGVtZW50Tm9kZSwgbmFtZXNwYWNlTWFuYWdlcikKLSAgICAgICAgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+V29ya3NoZWV0IHRoYXQgb3ducyB0aGUgdmFsaWRhdGlvbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbUVsZW1lbnROb2RlIj5YbWwgdG9wIG5vZGUgKGRhdGFWYWxpZGF0aW9ucyk8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbGlkYXRpb25UeXBlIj5EYXRhIHZhbGlkYXRpb24gdHlwZTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+YWRkcmVzcyBmb3IgZGF0YSB2YWxpZGF0aW9uPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lc3BhY2VNYW5hZ2VyIj5mb3IgdGVzdCBwdXJwb3NlczwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsRGF0YVZhbGlkYXRpb25XaXRoRm9ybXVsYTIoCisgICAgICBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBzdHJpbmcgYWRkcmVzcywKKyAgICAgIEV4Y2VsRGF0YVZhbGlkYXRpb25UeXBlIHZhbGlkYXRpb25UeXBlLAorICAgICAgWG1sTm9kZSBpdGVtRWxlbWVudE5vZGUsCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2Uod29ya3NoZWV0LCBhZGRyZXNzLCB2YWxpZGF0aW9uVHlwZSwgaXRlbUVsZW1lbnROb2RlLCBuYW1lc3BhY2VNYW5hZ2VyKSB7fQogCi0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRm9ybXVsYSAtIEVpdGhlciBhIHtUfSB2YWx1ZSBvciBhIHNwcmVhZHNoZWV0IGZvcm11bGEKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIFQgRm9ybXVsYTIKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgcHJvdGVjdGVkIHNldDsKLSAgICAgICAgfQotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRm9ybXVsYSAtIEVpdGhlciBhIHtUfSB2YWx1ZSBvciBhIHNwcmVhZHNoZWV0IGZvcm11bGEKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIFQgRm9ybXVsYTIgeyBnZXQ7IHByb3RlY3RlZCBzZXQ7IH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbFRpbWUuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRXhjZWxUaW1lLmNzCmluZGV4IGM2MGE1YzAuLjc4M2ViMTcgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9FeGNlbFRpbWUuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0V4Y2VsVGltZS5jcwpAQCAtMTMsMjU3ICsxMywyMTIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wMQogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24KLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFJlcHJlc2VudHMgYSB0aW1lIGJldHdlZW4gMDA6MDA6MDAgYW5kIDIzOjU5OjU5Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxUaW1lCi0gICAgewotICAgICAgICBwcml2YXRlIGV2ZW50IEV2ZW50SGFuZGxlciBfdGltZUNoYW5nZWQ7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgZGVjaW1hbCBTZWNvbmRzUGVyRGF5ID0gMzYwMCAqIDI0OwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRlY2ltYWwgU2Vjb25kc1BlckhvdXIgPSAzNjAwOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRlY2ltYWwgU2Vjb25kc1Blck1pbnV0ZSA9IDYwOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBNYXggbnVtYmVyIG9mIGRlY2ltYWxzIHdoZW4gcm91bmRpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTnVtYmVyT2ZEZWNpbWFscyA9IDE1OworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxUaW1lKCkKLSAgICAgICAgeworLy8vIDxzdW1tYXJ5PgorLy8vIFJlcHJlc2VudHMgYSB0aW1lIGJldHdlZW4gMDA6MDA6MDAgYW5kIDIzOjU5OjU5CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsVGltZSB7CisgIHByaXZhdGUgZXZlbnQgRXZlbnRIYW5kbGVyIFRpbWVDaGFuZ2VkRXZlbnQ7CiAKLSAgICAgICAgfQorICBwcml2YXRlIHJlYWRvbmx5IGRlY2ltYWwgU2Vjb25kc1BlckRheSA9IDM2MDAgKiAyNDsKKyAgcHJpdmF0ZSByZWFkb25seSBkZWNpbWFsIFNlY29uZHNQZXJIb3VyID0gMzYwMDsKKyAgcHJpdmF0ZSByZWFkb25seSBkZWNpbWFsIFNlY29uZHNQZXJNaW51dGUgPSA2MDsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5BbiBleGlzdGluZyB0aW1lIGZvciBpbml0aWFsaXphdGlvbjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFRpbWUoZGVjaW1hbCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlIDwgME0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIDAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID49IDFNKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVmFsdWUgY2Fubm90IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSW5pdCh2YWx1ZSk7Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTWF4IG51bWJlciBvZiBkZWNpbWFscyB3aGVuIHJvdW5kaW5nLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY29uc3QgaW50IE51bWJlck9mRGVjaW1hbHMgPSAxNTsKIAotICAgICAgICBwcml2YXRlIHZvaWQgSW5pdChkZWNpbWFsIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBoYW5kbGUgaG91cgotICAgICAgICAgICAgZGVjaW1hbCB0b3RhbFNlY29uZHMgPSB2YWx1ZSAqIFNlY29uZHNQZXJEYXk7Ci0gICAgICAgICAgICBkZWNpbWFsIGhvdXIgPSBNYXRoLkZsb29yKHRvdGFsU2Vjb25kcyAvIFNlY29uZHNQZXJIb3VyKTsKLSAgICAgICAgICAgIEhvdXIgPSAoaW50KWhvdXI7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsVGltZSgpIHt9CiAKLSAgICAgICAgICAgIC8vIGhhbmRsZSBtaW51dGUKLSAgICAgICAgICAgIGRlY2ltYWwgcmVtYWluaW5nU2Vjb25kcyA9IHRvdGFsU2Vjb25kcyAtIChob3VyICogU2Vjb25kc1BlckhvdXIpOwotICAgICAgICAgICAgZGVjaW1hbCBtaW51dGUgPSBNYXRoLkZsb29yKHJlbWFpbmluZ1NlY29uZHMgLyBTZWNvbmRzUGVyTWludXRlKTsKLSAgICAgICAgICAgIE1pbnV0ZSA9IChpbnQpbWludXRlOwotCi0gICAgICAgICAgICAvLyBoYW5kbGUgc2Vjb25kCi0gICAgICAgICAgICByZW1haW5pbmdTZWNvbmRzID0gdG90YWxTZWNvbmRzIC0gKGhvdXIgKiBTZWNvbmRzUGVySG91cikgLSAobWludXRlICogU2Vjb25kc1Blck1pbnV0ZSk7Ci0gICAgICAgICAgICBkZWNpbWFsIHNlY29uZCA9IE1hdGguUm91bmQocmVtYWluaW5nU2Vjb25kcywgTWlkcG9pbnRSb3VuZGluZy5Bd2F5RnJvbVplcm8pOwotICAgICAgICAgICAgLy8gU2Vjb25kIG1pZ2h0IGJlIHJvdW5kZWQgdG8gNjAuLi4gdGhlIFNldFNlY29uZCBtZXRob2QgaGFuZGxlcyB0aGF0LgotICAgICAgICAgICAgU2V0U2Vjb25kKChpbnQpc2Vjb25kKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHdlIGFyZSB1bmx1Y2t5IHNlY29uZCBtaWdodCBiZSByb3VuZGVkIHVwIHRvIDYwLiBUaGlzIHdpbGwgaGF2ZSB0aGUgbWludXRlIHRvIGJlIHJhaXNlZCBhbmQgbWlnaHQgYWZmZWN0IHRoZSBob3VyLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgotICAgICAgICBwcml2YXRlIHZvaWQgU2V0U2Vjb25kKGludCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlID09IDYwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNlY29uZCA9IDA7Ci0gICAgICAgICAgICAgICAgdmFyIG1pbnV0ZSA9IE1pbnV0ZSArIDE7Ci0gICAgICAgICAgICAgICAgU2V0TWludXRlKG1pbnV0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2Vjb25kID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgU2V0TWludXRlKGludCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlID09IDYwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1pbnV0ZSA9IDA7Ci0gICAgICAgICAgICAgICAgdmFyIGhvdXIgPSBIb3VyICsgMTsKLSAgICAgICAgICAgICAgICBTZXRIb3VyKGhvdXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1pbnV0ZSA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEhvdXIoaW50IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gMjQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSG91ciA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBldmVudCBFdmVudEhhbmRsZXIgVGltZUNoYW5nZWQKLSAgICAgICAgewotICAgICAgICAgICAgYWRkIHsgX3RpbWVDaGFuZ2VkICs9IHZhbHVlOyB9Ci0gICAgICAgICAgICByZW1vdmUgeyBfdGltZUNoYW5nZWQgLT0gdmFsdWU7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBPblRpbWVDaGFuZ2VkKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF90aW1lQ2hhbmdlZCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF90aW1lQ2hhbmdlZCh0aGlzLCBFdmVudEFyZ3MuRW1wdHkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgX2hvdXI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEhvdXIgYmV0d2VlbiAwIGFuZCAyMwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IEhvdXIgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfaG91cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVmFsdWUgZm9yIGhvdXIgY2Fubm90IGJlIG5lZ2F0aXZlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IDIzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlZhbHVlIGZvciBob3VyIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gMjMiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgX2hvdXIgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBPblRpbWVDaGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBfbWludXRlOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBNaW51dGUgYmV0d2VlbiAwIGFuZCA1OQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IE1pbnV0ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX21pbnV0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVmFsdWUgZm9yIG1pbnV0ZSBjYW5ub3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gNTkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVmFsdWUgZm9yIG1pbnV0ZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDU5Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9taW51dGUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBPblRpbWVDaGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludD8gX3NlY29uZDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2Vjb25kIGJldHdlZW4gMCBhbmQgNTkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludD8gU2Vjb25kCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc2Vjb25kOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJWYWx1ZSBmb3Igc2Vjb25kIGNhbm5vdCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiA1OSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJWYWx1ZSBmb3Igc2Vjb25kIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gNTkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgX3NlY29uZCA9IHZhbHVlOwotICAgICAgICAgICAgICAgIE9uVGltZUNoYW5nZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZGVjaW1hbCBSb3VuZChkZWNpbWFsIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTWF0aC5Sb3VuZCh2YWx1ZSwgTnVtYmVyT2ZEZWNpbWFscyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGRlY2ltYWwgVG9TZWNvbmRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IEhvdXIgKiBTZWNvbmRzUGVySG91cjsKLSAgICAgICAgICAgIHJlc3VsdCArPSBNaW51dGUgKiBTZWNvbmRzUGVyTWludXRlOwotICAgICAgICAgICAgcmVzdWx0ICs9IFNlY29uZCA/PyAwOwotICAgICAgICAgICAgcmV0dXJuIChkZWNpbWFsKXJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIGV4Y2VsIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgYSB0aW1lLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgZGVjaW1hbCBUb0V4Y2VsVGltZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzZWNvbmRzID0gVG9TZWNvbmRzKCk7Ci0gICAgICAgICAgICByZXR1cm4gUm91bmQoc2Vjb25kcyAvIChkZWNpbWFsKVNlY29uZHNQZXJEYXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgZXhjZWwgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiBhIHRpbWUgYXMgYSBzdHJpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVG9FeGNlbFN0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUb0V4Y2VsVGltZSgpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzZWNvbmQgPSBTZWNvbmQgPz8gMDsKLSAgICAgICAgICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KCJ7MH06ezF9OnsyfSIsCi0gICAgICAgICAgICAgICAgSG91ciA8IDEwID8gIjAiICsgSG91ci5Ub1N0cmluZygpIDogSG91ci5Ub1N0cmluZygpLAotICAgICAgICAgICAgICAgIE1pbnV0ZSA8IDEwID8gIjAiICsgTWludXRlLlRvU3RyaW5nKCkgOiBNaW51dGUuVG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBzZWNvbmQgPCAxMCA/ICIwIiArIHNlY29uZC5Ub1N0cmluZygpIDogc2Vjb25kLlRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29uc3RydWN0b3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+QW4gZXhpc3RpbmcgdGltZSBmb3IgaW5pdGlhbGl6YXRpb248L3BhcmFtPgorICBwdWJsaWMgRXhjZWxUaW1lKGRlY2ltYWwgdmFsdWUpIHsKKyAgICBpZiAodmFsdWUgPCAwTSkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSBjYW5ub3QgYmUgbGVzcyB0aGFuIDAiKTsKICAgICB9CisgICAgaWYgKHZhbHVlID49IDFNKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlZhbHVlIGNhbm5vdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRvIDEiKTsKKyAgICB9CisgICAgSW5pdCh2YWx1ZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgSW5pdChkZWNpbWFsIHZhbHVlKSB7CisgICAgLy8gaGFuZGxlIGhvdXIKKyAgICBkZWNpbWFsIHRvdGFsU2Vjb25kcyA9IHZhbHVlICogU2Vjb25kc1BlckRheTsKKyAgICBkZWNpbWFsIGhvdXIgPSBNYXRoLkZsb29yKHRvdGFsU2Vjb25kcyAvIFNlY29uZHNQZXJIb3VyKTsKKyAgICBIb3VyID0gKGludClob3VyOworCisgICAgLy8gaGFuZGxlIG1pbnV0ZQorICAgIGRlY2ltYWwgcmVtYWluaW5nU2Vjb25kcyA9IHRvdGFsU2Vjb25kcyAtIChob3VyICogU2Vjb25kc1BlckhvdXIpOworICAgIGRlY2ltYWwgbWludXRlID0gTWF0aC5GbG9vcihyZW1haW5pbmdTZWNvbmRzIC8gU2Vjb25kc1Blck1pbnV0ZSk7CisgICAgTWludXRlID0gKGludCltaW51dGU7CisKKyAgICAvLyBoYW5kbGUgc2Vjb25kCisgICAgcmVtYWluaW5nU2Vjb25kcyA9IHRvdGFsU2Vjb25kcyAtIChob3VyICogU2Vjb25kc1BlckhvdXIpIC0gKG1pbnV0ZSAqIFNlY29uZHNQZXJNaW51dGUpOworICAgIGRlY2ltYWwgc2Vjb25kID0gTWF0aC5Sb3VuZChyZW1haW5pbmdTZWNvbmRzLCBNaWRwb2ludFJvdW5kaW5nLkF3YXlGcm9tWmVybyk7CisgICAgLy8gU2Vjb25kIG1pZ2h0IGJlIHJvdW5kZWQgdG8gNjAuLi4gdGhlIFNldFNlY29uZCBtZXRob2QgaGFuZGxlcyB0aGF0LgorICAgIFNldFNlY29uZCgoaW50KXNlY29uZCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB3ZSBhcmUgdW5sdWNreSBzZWNvbmQgbWlnaHQgYmUgcm91bmRlZCB1cCB0byA2MC4gVGhpcyB3aWxsIGhhdmUgdGhlIG1pbnV0ZSB0byBiZSByYWlzZWQgYW5kIG1pZ2h0IGFmZmVjdCB0aGUgaG91ci4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgcHJpdmF0ZSB2b2lkIFNldFNlY29uZChpbnQgdmFsdWUpIHsKKyAgICBpZiAodmFsdWUgPT0gNjApIHsKKyAgICAgIFNlY29uZCA9IDA7CisgICAgICB2YXIgbWludXRlID0gTWludXRlICsgMTsKKyAgICAgIFNldE1pbnV0ZShtaW51dGUpOworICAgIH0gZWxzZSB7CisgICAgICBTZWNvbmQgPSB2YWx1ZTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgU2V0TWludXRlKGludCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA9PSA2MCkgeworICAgICAgTWludXRlID0gMDsKKyAgICAgIHZhciBob3VyID0gSG91ciArIDE7CisgICAgICBTZXRIb3VyKGhvdXIpOworICAgIH0gZWxzZSB7CisgICAgICBNaW51dGUgPSB2YWx1ZTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgU2V0SG91cihpbnQgdmFsdWUpIHsKKyAgICBpZiAodmFsdWUgPT0gMjQpIHsKKyAgICAgIEhvdXIgPSAwOworICAgIH0KKyAgfQorCisgIGludGVybmFsIGV2ZW50IEV2ZW50SGFuZGxlciBUaW1lQ2hhbmdlZCB7CisgICAgYWRkID0+IFRpbWVDaGFuZ2VkRXZlbnQgKz0gdmFsdWU7CisgICAgcmVtb3ZlID0+IFRpbWVDaGFuZ2VkRXZlbnQgLT0gdmFsdWU7CisgIH0KKworICBwcml2YXRlIHZvaWQgT25UaW1lQ2hhbmdlZCgpIHsKKyAgICBpZiAoVGltZUNoYW5nZWRFdmVudCAhPSBudWxsKSB7CisgICAgICBUaW1lQ2hhbmdlZEV2ZW50KHRoaXMsIEV2ZW50QXJncy5FbXB0eSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBpbnQgX2hvdXI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSG91ciBiZXR3ZWVuIDAgYW5kIDIzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgSG91ciB7CisgICAgZ2V0ID0+IF9ob3VyOworICAgIHNldCB7CisgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJWYWx1ZSBmb3IgaG91ciBjYW5ub3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgIH0KKyAgICAgIGlmICh2YWx1ZSA+IDIzKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJWYWx1ZSBmb3IgaG91ciBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDIzIik7CisgICAgICB9CisgICAgICBfaG91ciA9IHZhbHVlOworICAgICAgT25UaW1lQ2hhbmdlZCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgaW50IF9taW51dGU7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTWludXRlIGJldHdlZW4gMCBhbmQgNTkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBNaW51dGUgeworICAgIGdldCA9PiBfbWludXRlOworICAgIHNldCB7CisgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJWYWx1ZSBmb3IgbWludXRlIGNhbm5vdCBiZSBuZWdhdGl2ZSIpOworICAgICAgfQorICAgICAgaWYgKHZhbHVlID4gNTkpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlZhbHVlIGZvciBtaW51dGUgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiA1OSIpOworICAgICAgfQorICAgICAgX21pbnV0ZSA9IHZhbHVlOworICAgICAgT25UaW1lQ2hhbmdlZCgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgaW50PyBfc2Vjb25kOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNlY29uZCBiZXR3ZWVuIDAgYW5kIDU5CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQ/IFNlY29uZCB7CisgICAgZ2V0ID0+IF9zZWNvbmQ7CisgICAgc2V0IHsKKyAgICAgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlZhbHVlIGZvciBzZWNvbmQgY2Fubm90IGJlIG5lZ2F0aXZlIik7CisgICAgICB9CisgICAgICBpZiAodmFsdWUgPiA1OSkgeworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVmFsdWUgZm9yIHNlY29uZCBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDU5Iik7CisgICAgICB9CisgICAgICBfc2Vjb25kID0gdmFsdWU7CisgICAgICBPblRpbWVDaGFuZ2VkKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBkZWNpbWFsIFJvdW5kKGRlY2ltYWwgdmFsdWUpIHsKKyAgICByZXR1cm4gTWF0aC5Sb3VuZCh2YWx1ZSwgTnVtYmVyT2ZEZWNpbWFscyk7CisgIH0KKworICBwcml2YXRlIGRlY2ltYWwgVG9TZWNvbmRzKCkgeworICAgIHZhciByZXN1bHQgPSBIb3VyICogU2Vjb25kc1BlckhvdXI7CisgICAgcmVzdWx0ICs9IE1pbnV0ZSAqIFNlY29uZHNQZXJNaW51dGU7CisgICAgcmVzdWx0ICs9IFNlY29uZCA/PyAwOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZXR1cm5zIHRoZSBleGNlbCBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgdGltZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIGRlY2ltYWwgVG9FeGNlbFRpbWUoKSB7CisgICAgdmFyIHNlY29uZHMgPSBUb1NlY29uZHMoKTsKKyAgICByZXR1cm4gUm91bmQoc2Vjb25kcyAvIFNlY29uZHNQZXJEYXkpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyB0aGUgZXhjZWwgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiBhIHRpbWUgYXMgYSBzdHJpbmcuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBzdHJpbmcgVG9FeGNlbFN0cmluZygpIHsKKyAgICByZXR1cm4gVG9FeGNlbFRpbWUoKS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CisgICAgdmFyIHNlY29uZCA9IFNlY29uZCA/PyAwOworICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KAorICAgICAgICAiezB9OnsxfTp7Mn0iLAorICAgICAgICBIb3VyIDwgMTAgPyAiMCIgKyBIb3VyIDogSG91ci5Ub1N0cmluZygpLAorICAgICAgICBNaW51dGUgPCAxMCA/ICIwIiArIE1pbnV0ZSA6IE1pbnV0ZS5Ub1N0cmluZygpLAorICAgICAgICBzZWNvbmQgPCAxMCA/ICIwIiArIHNlY29uZCA6IHNlY29uZC5Ub1N0cmluZygpKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYS5jcwppbmRleCBiMjVjMWFkLi5mZWU3ODVjIDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYS5jcworKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYS5jcwpAQCAtMTMsMzcgKzEzLDMxIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBJbnRlcmZhY2UgZm9yIGEgZGF0YSB2YWxpZGF0aW9uIGZvcm11bGEKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBbiBleGNlbCBmb3JtdWxhCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHN0cmluZyBFeGNlbEZvcm11bGEgeyBnZXQ7IHNldDsgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEludGVyZmFjZSBmb3IgYSBkYXRhIHZhbGlkYXRpb24gZm9ybXVsYQorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQW4gZXhjZWwgZm9ybXVsYQorICAvLy8gPC9zdW1tYXJ5PgorICBzdHJpbmcgRXhjZWxGb3JtdWxhIHsgZ2V0OyBzZXQ7IH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWUuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lLmNzCmluZGV4IDEzODBjNDguLjJjYzZkZjIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWUuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZS5jcwpAQCAtMTMsMzMgKzEzLDI5IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBWYWxpZGF0aW9uIGZvcm11bGEgaW50ZXJmYWNlIGZvciA8c2VlIGNyZWY9IkRhdGVUaW1lIi8+Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lIDogSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhV2l0aFZhbHVlPERhdGVUaW1lPz4KLSAgICB7Ci0gICAgfQotfQordXNpbmcgU3lzdGVtOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBWYWxpZGF0aW9uIGZvcm11bGEgaW50ZXJmYWNlIGZvciA8c2VlIGNyZWY9IkRhdGVUaW1lIi8+CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZQorICAgIDogSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhV2l0aFZhbHVlPERhdGVUaW1lPz4ge30KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbC5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbC5jcwppbmRleCBhNzc3NjFlLi4wYTg3YTc1IDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURlY2ltYWwuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsLmNzCkBAIC0xMywzMyArMTMsMjcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAogICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEludGVyZmFjZSBmb3IgYSBkYXRhIHZhbGlkYXRpb24gZm9ybXVsYSBvZiA8c2VlIGNyZWY9IlN5c3RlbS5TaW5nbGUiPmZsb2F0PC9zZWU+IHZhbHVlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURlY2ltYWwgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFXaXRoVmFsdWU8ZG91YmxlPz4KLSAgICB7Ci0gICAgfQotfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOworCisvLy8gPHN1bW1hcnk+CisvLy8gSW50ZXJmYWNlIGZvciBhIGRhdGEgdmFsaWRhdGlvbiBmb3JtdWxhIG9mIDxzZWUgY3JlZj0iU3lzdGVtLlNpbmdsZSI+ZmxvYXQ8L3NlZT4gdmFsdWUKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURlY2ltYWwKKyAgICA6IElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVdpdGhWYWx1ZTxkb3VibGU/PiB7fQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFJbnQuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludC5jcwppbmRleCBiYTFkNDdjLi40N2VjZmFhIDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludC5jcworKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludC5jcwpAQCAtMTMsMzMgKzEzLDI2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBJbnRlcmZhY2UgZm9yIGEgZGF0YSB2YWxpZGF0aW9uIGZvcm11bGEgb2YgPHNlZSBjcmVmPSJTeXN0ZW0uSW50MzIiLz4gdmFsdWUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50IDogSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhV2l0aFZhbHVlPGludD8+Ci0gICAgewotICAgIH0KLX0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEludGVyZmFjZSBmb3IgYSBkYXRhIHZhbGlkYXRpb24gZm9ybXVsYSBvZiA8c2VlIGNyZWY9IlN5c3RlbS5JbnQzMiIvPiB2YWx1ZQorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBpbnRlcmZhY2UgSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50IDogSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhV2l0aFZhbHVlPGludD8+IHt9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QuY3MKaW5kZXggMjE2MmI1Ny4uNmE3OTliNCAxMDA2NDQKLS0tIGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFMaXN0LmNzCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhTGlzdC5jcwpAQCAtMTMsMzcgKzEzLDMzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBJbnRlcmZhY2UgZm9yIGEgZGF0YSB2YWxpZGF0aW9uIG9mIGxpc3QgdHlwZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFMaXN0IDogSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBIGxpc3Qgb2YgdmFsdWUgc3RyaW5ncy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgSUxpc3Q8c3RyaW5nPiBWYWx1ZXMgeyBnZXQ7IH0KLSAgICB9Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOworCisvLy8gPHN1bW1hcnk+CisvLy8gSW50ZXJmYWNlIGZvciBhIGRhdGEgdmFsaWRhdGlvbiBvZiBsaXN0IHR5cGUKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QgOiBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBIGxpc3Qgb2YgdmFsdWUgc3RyaW5ncy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgSUxpc3Q8c3RyaW5nPiBWYWx1ZXMgeyBnZXQ7IH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZS5jcwppbmRleCAyNmZjMzZhLi5hOWYxZjVkIDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVRpbWUuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0NvbnRyYWN0cy9JRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lLmNzCkBAIC0xMywzMSArMTMsMjQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAogICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzCi17Ci0gICAgcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lIDogSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhV2l0aFZhbHVlPEV4Y2VsVGltZT4KLSAgICB7Ci0gICAgfQotfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOworCitwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVRpbWUKKyAgICA6IElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVdpdGhWYWx1ZTxFeGNlbFRpbWU+IHt9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvQ29udHJhY3RzL0lFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVdpdGhWYWx1ZS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhV2l0aFZhbHVlLmNzCmluZGV4IDcwYjFiYmMuLjIxYjkzN2IgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhV2l0aFZhbHVlLmNzCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9Db250cmFjdHMvSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhV2l0aFZhbHVlLmNzCkBAIC0xMywzOCArMTMsMzIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAogICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEludGVyZmFjZSBmb3IgYSBmb3JtdWxhIHdpdGggYSB2YWx1ZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+PC90eXBlcGFyYW0+Ci0gICAgcHVibGljIGludGVyZmFjZSBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFXaXRoVmFsdWU8VD4gOiBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB2YWx1ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgVCBWYWx1ZSB7IGdldDsgc2V0OyB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOworCisvLy8gPHN1bW1hcnk+CisvLy8gSW50ZXJmYWNlIGZvciBhIGZvcm11bGEgd2l0aCBhIHZhbHVlCisvLy8gPC9zdW1tYXJ5PgorLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+PC90eXBlcGFyYW0+CitwdWJsaWMgaW50ZXJmYWNlIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVdpdGhWYWx1ZTxUPiA6IElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSB2YWx1ZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgVCBWYWx1ZSB7IGdldDsgc2V0OyB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEuY3MKaW5kZXggNzY2MzE5Mi4uYmJjOTgxOSAxMDA2NDQKLS0tIGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0V4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhLmNzCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYS5jcwpAQCAtMTMsMTI2ICsxMywxMDcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAogICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMuQ29udHJhY3RzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRW51bWVyYXRpb24gcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiBhbiA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVmFsdWV7VH0iLz4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIGludGVybmFsIGVudW0gRm9ybXVsYVN0YXRlCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBWYWx1ZSBpcyBzZXQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgVmFsdWUsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvcm11bGEgaXMgc2V0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEZvcm11bGEKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzOworCisvLy8gPHN1bW1hcnk+CisvLy8gRW51bWVyYXRpb24gcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiBhbiA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVmFsdWV7VH0iLz4KKy8vLyA8L3N1bW1hcnk+CitpbnRlcm5hbCBlbnVtIEZvcm11bGFTdGF0ZSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFZhbHVlIGlzIHNldAorICAvLy8gPC9zdW1tYXJ5PgorICBWYWx1ZSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBGb3JtdWxhIGlzIHNldAorICAvLy8gPC9zdW1tYXJ5PgorICBGb3JtdWxhLAorfQorCisvLy8gPHN1bW1hcnk+CisvLy8gQmFzZSBjbGFzcyBmb3IgYSBmb3JtdWxhCisvLy8gPC9zdW1tYXJ5PgoraW50ZXJuYWwgYWJzdHJhY3QgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEgOiBYbWxIZWxwZXIgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPk5hbWVzcGFjZW1hbmdlciBvZiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0b3BOb2RlIj52YWxpZGF0aW9uIHRvcCBub2RlPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmb3JtdWxhUGF0aCI+eG1sIHBhdGggb2YgdGhlIGN1cnJlbnQgZm9ybXVsYTwvcGFyYW0+CisgIHB1YmxpYyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYSgKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlciwKKyAgICAgIFhtbE5vZGUgdG9wTm9kZSwKKyAgICAgIHN0cmluZyBmb3JtdWxhUGF0aCkKKyAgICAgIDogYmFzZShuYW1lc3BhY2VNYW5hZ2VyLCB0b3BOb2RlKSB7CisgICAgUmVxdWlyZS5Bcmd1bWVudChmb3JtdWxhUGF0aCkuSXNOb3ROdWxsT3JFbXB0eSgiZm9ybXVsYVBhdGgiKTsKKyAgICBGb3JtdWxhUGF0aCA9IGZvcm11bGFQYXRoOworICB9CisKKyAgcHJpdmF0ZSBzdHJpbmcgX2Zvcm11bGE7CisKKyAgcHJvdGVjdGVkIHN0cmluZyBGb3JtdWxhUGF0aCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTdGF0ZSBvZiB0aGUgdmFsaWRhdGlvbmZvcm11bGEsIGkuZS4gdGVsbHMgaWYgdmFsdWUgb3IgZm9ybXVsYSBpcyBzZXQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHJvdGVjdGVkIEZvcm11bGFTdGF0ZSBTdGF0ZSB7IGdldDsgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSBmb3JtdWxhIHdoaWNoIG91dHB1dCBtdXN0IG1hdGNoIHRoZSBjdXJyZW50IHZhbGlkYXRpb24gdHlwZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIEV4Y2VsRm9ybXVsYSB7CisgICAgZ2V0ID0+IF9mb3JtdWxhOworICAgIHNldCB7CisgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkgeworICAgICAgICBSZXNldFZhbHVlKCk7CisgICAgICAgIFN0YXRlID0gRm9ybXVsYVN0YXRlLkZvcm11bGE7CisgICAgICB9CisgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5MZW5ndGggPiAyNTUpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAiVGhlIGxlbmd0aCBvZiBhIERhdGFWYWxpZGF0aW9uIGZvcm11bGEgY2Fubm90IGV4Y2VlZCAyNTUgY2hhcmFjdGVycyIpOworICAgICAgfQorICAgICAgLy92YXIgdmFsID0gU3FSZWZVdGlsaXR5LlRvU3FSZWZBZGRyZXNzKHZhbHVlKTsKKyAgICAgIF9mb3JtdWxhID0gdmFsdWU7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKEZvcm11bGFQYXRoLCB2YWx1ZSk7CiAgICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEJhc2UgY2xhc3MgZm9yIGEgZm9ybXVsYQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgYWJzdHJhY3QgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEgOiBYbWxIZWxwZXIKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnN0cnVjdG9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+TmFtZXNwYWNlbWFuZ2VyIG9mIHRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRvcE5vZGUiPnZhbGlkYXRpb24gdG9wIG5vZGU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZvcm11bGFQYXRoIj54bWwgcGF0aCBvZiB0aGUgY3VycmVudCBmb3JtdWxhPC9wYXJhbT4KLSAgICAgICAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlLCBzdHJpbmcgZm9ybXVsYVBhdGgpCi0gICAgICAgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlciwgdG9wTm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudChmb3JtdWxhUGF0aCkuSXNOb3ROdWxsT3JFbXB0eSgiZm9ybXVsYVBhdGgiKTsKLSAgICAgICAgICAgIEZvcm11bGFQYXRoID0gZm9ybXVsYVBhdGg7Ci0gICAgICAgIH0KKyAgaW50ZXJuYWwgYWJzdHJhY3Qgdm9pZCBSZXNldFZhbHVlKCk7CiAKLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgX2Zvcm11bGE7Ci0KLSAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBGb3JtdWxhUGF0aAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBwcml2YXRlIHNldDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFN0YXRlIG9mIHRoZSB2YWxpZGF0aW9uZm9ybXVsYSwgaS5lLiB0ZWxscyBpZiB2YWx1ZSBvciBmb3JtdWxhIGlzIHNldAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcm90ZWN0ZWQgRm9ybXVsYVN0YXRlIFN0YXRlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgZm9ybXVsYSB3aGljaCBvdXRwdXQgbXVzdCBtYXRjaCB0aGUgY3VycmVudCB2YWxpZGF0aW9uIHR5cGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBFeGNlbEZvcm11bGEKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9mb3JtdWxhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBSZXNldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0YXRlID0gRm9ybXVsYVN0YXRlLkZvcm11bGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLkxlbmd0aCA+IDI1NSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgbGVuZ3RoIG9mIGEgRGF0YVZhbGlkYXRpb24gZm9ybXVsYSBjYW5ub3QgZXhjZWVkIDI1NSBjaGFyYWN0ZXJzIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vdmFyIHZhbCA9IFNxUmVmVXRpbGl0eS5Ub1NxUmVmQWRkcmVzcyh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgX2Zvcm11bGEgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEZvcm11bGFQYXRoLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBhYnN0cmFjdCB2b2lkIFJlc2V0VmFsdWUoKTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGlzIHZhbHVlIHdpbGwgYmUgc3RvcmVkIGluIHRoZSB4bWwuIENhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgdmlydHVhbCBzdHJpbmcgR2V0WG1sVmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoU3RhdGUgPT0gRm9ybXVsYVN0YXRlLkZvcm11bGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRm9ybXVsYTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBHZXRWYWx1ZUFzU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBhcyBhIHN0cmluZy4gTXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCBzdHJpbmcgR2V0VmFsdWVBc1N0cmluZygpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIHZhbHVlIHdpbGwgYmUgc3RvcmVkIGluIHRoZSB4bWwuIENhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgdmlydHVhbCBzdHJpbmcgR2V0WG1sVmFsdWUoKSB7CisgICAgaWYgKFN0YXRlID09IEZvcm11bGFTdGF0ZS5Gb3JtdWxhKSB7CisgICAgICByZXR1cm4gRXhjZWxGb3JtdWxhOwogICAgIH0KKyAgICByZXR1cm4gR2V0VmFsdWVBc1N0cmluZygpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBzdHJpbmcuIE11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RyaW5nIEdldFZhbHVlQXNTdHJpbmcoKTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUN1c3RvbS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUN1c3RvbS5jcwppbmRleCAyOTc1YzhkLi4xMDcyNTM1IDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFDdXN0b20uY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0V4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhQ3VzdG9tLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw2MCArMTMsNTUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAogICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7CisKIHVzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFDdXN0b20gOiBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYSwgSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhCi0gICAgewotICAgICAgICBwdWJsaWMgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFDdXN0b20oWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyLCBYbWxOb2RlIHRvcE5vZGUsIHN0cmluZyBmb3JtdWxhUGF0aCkKLSAgICAgICAgICAgIDogYmFzZShuYW1lc3BhY2VNYW5hZ2VyLCB0b3BOb2RlLCBmb3JtdWxhUGF0aCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHZhbHVlID0gR2V0WG1sTm9kZVN0cmluZyhmb3JtdWxhUGF0aCk7Ci0gICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeGNlbEZvcm11bGEgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFN0YXRlID0gRm9ybXVsYVN0YXRlLkZvcm11bGE7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzOwogCi0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBHZXRYbWxWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBFeGNlbEZvcm11bGE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RyaW5nIEdldFZhbHVlQXNTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRXhjZWxGb3JtdWxhOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgdm9pZCBSZXNldFZhbHVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxGb3JtdWxhID0gbnVsbDsKLSAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vCisvLy8gPC9zdW1tYXJ5PgoraW50ZXJuYWwgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFDdXN0b20KKyAgICA6IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhLAorICAgICAgSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhIHsKKyAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhQ3VzdG9tKAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyLAorICAgICAgWG1sTm9kZSB0b3BOb2RlLAorICAgICAgc3RyaW5nIGZvcm11bGFQYXRoKQorICAgICAgOiBiYXNlKG5hbWVzcGFjZU1hbmFnZXIsIHRvcE5vZGUsIGZvcm11bGFQYXRoKSB7CisgICAgdmFyIHZhbHVlID0gR2V0WG1sTm9kZVN0cmluZyhmb3JtdWxhUGF0aCk7CisgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpIHsKKyAgICAgIEV4Y2VsRm9ybXVsYSA9IHZhbHVlOwogICAgIH0KKyAgICBTdGF0ZSA9IEZvcm11bGFTdGF0ZS5Gb3JtdWxhOworICB9CisKKyAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIEdldFhtbFZhbHVlKCkgeworICAgIHJldHVybiBFeGNlbEZvcm11bGE7CisgIH0KKworICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RyaW5nIEdldFZhbHVlQXNTdHJpbmcoKSB7CisgICAgcmV0dXJuIEV4Y2VsRm9ybXVsYTsKKyAgfQorCisgIGludGVybmFsIG92ZXJyaWRlIHZvaWQgUmVzZXRWYWx1ZSgpIHsKKyAgICBFeGNlbEZvcm11bGEgPSBudWxsOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lLmNzCmluZGV4IDYzODFiZTguLjU1NDMwNDYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lLmNzCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw1NiArMTMsNTIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAogICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcwotewotICAgIGludGVybmFsIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWUgOiBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVZhbHVlPERhdGVUaW1lPz4sIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lCi0gICAgewotICAgICAgICBwdWJsaWMgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEYXRlVGltZShYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIsIFhtbE5vZGUgdG9wTm9kZSwgc3RyaW5nIGZvcm11bGFQYXRoKQotICAgICAgICAgICAgOiBiYXNlKG5hbWVzcGFjZU1hbmFnZXIsIHRvcE5vZGUsIGZvcm11bGFQYXRoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdmFsdWUgPSBHZXRYbWxOb2RlU3RyaW5nKGZvcm11bGFQYXRoKTsKLSAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkodmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRvdWJsZSBvQURhdGUgPSBkZWZhdWx0KGRvdWJsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZSh2YWx1ZSwgTnVtYmVyU3R5bGVzLkFueSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IG9BRGF0ZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IERhdGVUaW1lLkZyb21PQURhdGUob0FEYXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRXhjZWxGb3JtdWxhID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhczsKIAotICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RyaW5nIEdldFZhbHVlQXNTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gVmFsdWUuSGFzVmFsdWUgPyBWYWx1ZS5WYWx1ZS5Ub09BRGF0ZSgpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpIDogc3RyaW5nLkVtcHR5OwotICAgICAgICB9Ci0KK2ludGVybmFsIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWUKKyAgICA6IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVmFsdWU8RGF0ZVRpbWU/PiwKKyAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURhdGVUaW1lIHsKKyAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGF0ZVRpbWUoCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIsCisgICAgICBYbWxOb2RlIHRvcE5vZGUsCisgICAgICBzdHJpbmcgZm9ybXVsYVBhdGgpCisgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlciwgdG9wTm9kZSwgZm9ybXVsYVBhdGgpIHsKKyAgICB2YXIgdmFsdWUgPSBHZXRYbWxOb2RlU3RyaW5nKGZvcm11bGFQYXRoKTsKKyAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkgeworICAgICAgZG91YmxlIG9BRGF0ZSA9IGRlZmF1bHQoZG91YmxlKTsKKyAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2UodmFsdWUsIE51bWJlclN0eWxlcy5BbnksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCBvQURhdGUpKSB7CisgICAgICAgIFZhbHVlID0gRGF0ZVRpbWUuRnJvbU9BRGF0ZShvQURhdGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRXhjZWxGb3JtdWxhID0gdmFsdWU7CisgICAgICB9CiAgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0cmluZyBHZXRWYWx1ZUFzU3RyaW5nKCkgeworICAgIHJldHVybiBWYWx1ZS5IYXNWYWx1ZQorICAgICAgICA/IFZhbHVlLlZhbHVlLlRvT0FEYXRlKCkuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkKKyAgICAgICAgOiBzdHJpbmcuRW1wdHk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURlY2ltYWwuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsLmNzCmluZGV4IGRkYTRkOTIuLjY3YjkyMWQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURlY2ltYWwuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0V4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsNTggKzEzLDU0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKKwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsIDogRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFWYWx1ZTxkb3VibGU/PiwgSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbAotICAgIHsKLSAgICAgICAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIsIFhtbE5vZGUgdG9wTm9kZSwgc3RyaW5nIGZvcm11bGFQYXRoKQotICAgICAgICAgICAgOiBiYXNlKG5hbWVzcGFjZU1hbmFnZXIsIHRvcE5vZGUsIGZvcm11bGFQYXRoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdmFsdWUgPSBHZXRYbWxOb2RlU3RyaW5nKGZvcm11bGFQYXRoKTsKLSAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkodmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRvdWJsZSBkVmFsdWUgPSBkZWZhdWx0KGRvdWJsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZSh2YWx1ZSwgTnVtYmVyU3R5bGVzLkFueSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IGRWYWx1ZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IGRWYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRXhjZWxGb3JtdWxhID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhczsKIAotICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RyaW5nIEdldFZhbHVlQXNTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gVmFsdWUuSGFzVmFsdWUgPyBWYWx1ZS5WYWx1ZS5Ub1N0cmluZygiUjE1IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgOiBzdHJpbmcuRW1wdHk7Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLworLy8vIDwvc3VtbWFyeT4KK2ludGVybmFsIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhRGVjaW1hbAorICAgIDogRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFWYWx1ZTxkb3VibGU/PiwKKyAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYURlY2ltYWwgeworICBwdWJsaWMgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFEZWNpbWFsKAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyLAorICAgICAgWG1sTm9kZSB0b3BOb2RlLAorICAgICAgc3RyaW5nIGZvcm11bGFQYXRoKQorICAgICAgOiBiYXNlKG5hbWVzcGFjZU1hbmFnZXIsIHRvcE5vZGUsIGZvcm11bGFQYXRoKSB7CisgICAgdmFyIHZhbHVlID0gR2V0WG1sTm9kZVN0cmluZyhmb3JtdWxhUGF0aCk7CisgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpIHsKKyAgICAgIGRvdWJsZSBkVmFsdWUgPSBkZWZhdWx0KGRvdWJsZSk7CisgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKHZhbHVlLCBOdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgZFZhbHVlKSkgeworICAgICAgICBWYWx1ZSA9IGRWYWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEV4Y2VsRm9ybXVsYSA9IHZhbHVlOworICAgICAgfQogICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBvdmVycmlkZSBzdHJpbmcgR2V0VmFsdWVBc1N0cmluZygpIHsKKyAgICByZXR1cm4gVmFsdWUuSGFzVmFsdWUKKyAgICAgICAgPyBWYWx1ZS5WYWx1ZS5Ub1N0cmluZygiUjE1IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkKKyAgICAgICAgOiBzdHJpbmcuRW1wdHk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludC5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludC5jcwppbmRleCBjODk4YTM5Li43MGRjOGNjIDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFJbnQuY3MKKysrIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0V4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw1NSArMTMsNDggQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAogICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OworCiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXMKLXsKLSAgICBpbnRlcm5hbCBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludCA6IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVmFsdWU8aW50Pz4sIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUludAotICAgIHsKLSAgICAgICAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50KFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlLCBzdHJpbmcgZm9ybXVsYVBhdGgpCi0gICAgICAgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlciwgdG9wTm9kZSwgZm9ybXVsYVBhdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB2YWx1ZSA9IEdldFhtbE5vZGVTdHJpbmcoZm9ybXVsYVBhdGgpOwotICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGludFZhbHVlID0gZGVmYXVsdChpbnQpOwotICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UodmFsdWUsIG91dCBpbnRWYWx1ZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IGludFZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFeGNlbEZvcm11bGEgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzOwogCi0gICAgICAgIHByb3RlY3RlZCBvdmVycmlkZSBzdHJpbmcgR2V0VmFsdWVBc1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBWYWx1ZS5IYXNWYWx1ZSA/IFZhbHVlLlZhbHVlLlRvU3RyaW5nKCkgOiBzdHJpbmcuRW1wdHk7Ci0gICAgICAgIH0KK2ludGVybmFsIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50CisgICAgOiBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVZhbHVlPGludD8+LAorICAgICAgSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50IHsKKyAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhSW50KAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyLAorICAgICAgWG1sTm9kZSB0b3BOb2RlLAorICAgICAgc3RyaW5nIGZvcm11bGFQYXRoKQorICAgICAgOiBiYXNlKG5hbWVzcGFjZU1hbmFnZXIsIHRvcE5vZGUsIGZvcm11bGFQYXRoKSB7CisgICAgdmFyIHZhbHVlID0gR2V0WG1sTm9kZVN0cmluZyhmb3JtdWxhUGF0aCk7CisgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpIHsKKyAgICAgIGludCBpbnRWYWx1ZSA9IGRlZmF1bHQoaW50KTsKKyAgICAgIGlmIChpbnQuVHJ5UGFyc2UodmFsdWUsIG91dCBpbnRWYWx1ZSkpIHsKKyAgICAgICAgVmFsdWUgPSBpbnRWYWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEV4Y2VsRm9ybXVsYSA9IHZhbHVlOworICAgICAgfQogICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBvdmVycmlkZSBzdHJpbmcgR2V0VmFsdWVBc1N0cmluZygpIHsKKyAgICByZXR1cm4gVmFsdWUuSGFzVmFsdWUgPyBWYWx1ZS5WYWx1ZS5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFMaXN0LmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0V4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhTGlzdC5jcwppbmRleCA1MzUyN2ZhLi5iZmU1MzAxIDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFMaXN0LmNzCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDIzNSArMTMsMTgwIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKIHVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKLXVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzCi17Ci0gICAgaW50ZXJuYWwgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFMaXN0IDogRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEsIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QKLSAgICB7Ci0gICAgICAgICNyZWdpb24gY2xhc3MgRGF0YVZhbGlkYXRpb25MaXN0Ci0gICAgICAgIHByaXZhdGUgY2xhc3MgRGF0YVZhbGlkYXRpb25MaXN0IDogSUxpc3Q8c3RyaW5nPiwgSUNvbGxlY3Rpb24KLSAgICAgICAgewotICAgICAgICAgICAgcHJpdmF0ZSBJTGlzdDxzdHJpbmc+IF9pdGVtcyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKLSAgICAgICAgICAgIHByaXZhdGUgRXZlbnRIYW5kbGVyPEV2ZW50QXJncz4gX2xpc3RDaGFuZ2VkOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uRm9ybXVsYXM7CiAKLSAgICAgICAgICAgIHB1YmxpYyBldmVudCBFdmVudEhhbmRsZXI8RXZlbnRBcmdzPiBMaXN0Q2hhbmdlZAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZCB7IF9saXN0Q2hhbmdlZCArPSB2YWx1ZTsgfQotICAgICAgICAgICAgICAgIHJlbW92ZSB7IF9saXN0Q2hhbmdlZCAtPSB2YWx1ZTsgfQotICAgICAgICAgICAgfQoraW50ZXJuYWwgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFMaXN0CisgICAgOiBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYSwKKyAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYUxpc3QgeworICBwcml2YXRlIGNsYXNzIERhdGFWYWxpZGF0aW9uTGlzdCA6IElMaXN0PHN0cmluZz4sIElDb2xsZWN0aW9uIHsKKyAgICBwcml2YXRlIElMaXN0PHN0cmluZz4gX2l0ZW1zID0gbmV3IExpc3Q8c3RyaW5nPigpOworICAgIHByaXZhdGUgRXZlbnRIYW5kbGVyPEV2ZW50QXJncz4gX2xpc3RDaGFuZ2VkOwogCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgT25MaXN0Q2hhbmdlZCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9saXN0Q2hhbmdlZCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2xpc3RDaGFuZ2VkKHRoaXMsIEV2ZW50QXJncy5FbXB0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAjcmVnaW9uIElMaXN0IG1lbWJlcnMKLSAgICAgICAgICAgIGludCBJTGlzdDxzdHJpbmc+LkluZGV4T2Yoc3RyaW5nIGl0ZW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9pdGVtcy5JbmRleE9mKGl0ZW0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2b2lkIElMaXN0PHN0cmluZz4uSW5zZXJ0KGludCBpbmRleCwgc3RyaW5nIGl0ZW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2l0ZW1zLkluc2VydChpbmRleCwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgT25MaXN0Q2hhbmdlZCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2b2lkIElMaXN0PHN0cmluZz4uUmVtb3ZlQXQoaW50IGluZGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9pdGVtcy5SZW1vdmVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgT25MaXN0Q2hhbmdlZCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdHJpbmcgSUxpc3Q8c3RyaW5nPi50aGlzW2ludCBpbmRleF0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfaXRlbXNbaW5kZXhdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9pdGVtc1tpbmRleF0gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgT25MaXN0Q2hhbmdlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdm9pZCBJQ29sbGVjdGlvbjxzdHJpbmc+LkFkZChzdHJpbmcgaXRlbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfaXRlbXMuQWRkKGl0ZW0pOwotICAgICAgICAgICAgICAgIE9uTGlzdENoYW5nZWQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdm9pZCBJQ29sbGVjdGlvbjxzdHJpbmc+LkNsZWFyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfaXRlbXMuQ2xlYXIoKTsKLSAgICAgICAgICAgICAgICBPbkxpc3RDaGFuZ2VkKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2wgSUNvbGxlY3Rpb248c3RyaW5nPi5Db250YWlucyhzdHJpbmcgaXRlbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2l0ZW1zLkNvbnRhaW5zKGl0ZW0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2b2lkIElDb2xsZWN0aW9uPHN0cmluZz4uQ29weVRvKHN0cmluZ1tdIGFycmF5LCBpbnQgYXJyYXlJbmRleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfaXRlbXMuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IElDb2xsZWN0aW9uPHN0cmluZz4uQ291bnQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gX2l0ZW1zLkNvdW50OyB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2wgSUNvbGxlY3Rpb248c3RyaW5nPi5Jc1JlYWRPbmx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2wgSUNvbGxlY3Rpb248c3RyaW5nPi5SZW1vdmUoc3RyaW5nIGl0ZW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJldFZhbCA9IF9pdGVtcy5SZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICAgICAgT25MaXN0Q2hhbmdlZCgpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIElFbnVtZXJhdG9yPHN0cmluZz4gSUVudW1lcmFibGU8c3RyaW5nPi5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2l0ZW1zLkdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2l0ZW1zLkdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgQ29weVRvKEFycmF5IGFycmF5LCBpbnQgaW5kZXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2l0ZW1zLkNvcHlUbygoc3RyaW5nW10pYXJyYXksIGluZGV4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IElDb2xsZWN0aW9uLkNvdW50Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9pdGVtcy5Db3VudDsgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbCBJc1N5bmNocm9uaXplZAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiAoKElDb2xsZWN0aW9uKV9pdGVtcykuSXNTeW5jaHJvbml6ZWQ7IH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIG9iamVjdCBTeW5jUm9vdAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiAoKElDb2xsZWN0aW9uKV9pdGVtcykuU3luY1Jvb3Q7IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhTGlzdChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIsIFhtbE5vZGUgaXRlbU5vZGUsIHN0cmluZyBmb3JtdWxhUGF0aCkKLSAgICAgICAgICAgIDogYmFzZShuYW1lc3BhY2VNYW5hZ2VyLCBpdGVtTm9kZSwgZm9ybXVsYVBhdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlcXVpcmUuQXJndW1lbnQoZm9ybXVsYVBhdGgpLklzTm90TnVsbE9yRW1wdHkoImZvcm11bGFQYXRoIik7Ci0gICAgICAgICAgICBfZm9ybXVsYVBhdGggPSBmb3JtdWxhUGF0aDsKLSAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBuZXcgRGF0YVZhbGlkYXRpb25MaXN0KCk7Ci0gICAgICAgICAgICB2YWx1ZXMuTGlzdENoYW5nZWQgKz0gbmV3IEV2ZW50SGFuZGxlcjxFdmVudEFyZ3M+KHZhbHVlc19MaXN0Q2hhbmdlZCk7Ci0gICAgICAgICAgICBWYWx1ZXMgPSB2YWx1ZXM7Ci0gICAgICAgICAgICBTZXRJbml0aWFsVmFsdWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0cmluZyBfZm9ybXVsYVBhdGg7Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEluaXRpYWxWYWx1ZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgQHZhbHVlID0gR2V0WG1sTm9kZVN0cmluZyhfZm9ybXVsYVBhdGgpOwotICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShAdmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChAdmFsdWUuU3RhcnRzV2l0aCgiXCIiKSAmJiBAdmFsdWUuRW5kc1dpdGgoIlwiIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBAdmFsdWUgPSBAdmFsdWUuVHJpbVN0YXJ0KCciJykuVHJpbUVuZCgnIicpOwotICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbXMgPSBAdmFsdWUuU3BsaXQobmV3IGNoYXJbXXsnLCd9LCBTdHJpbmdTcGxpdE9wdGlvbnMuUmVtb3ZlRW1wdHlFbnRyaWVzKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gaXRlbXMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcy5BZGQoaXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRXhjZWxGb3JtdWxhID0gQHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdmFsdWVzX0xpc3RDaGFuZ2VkKG9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoVmFsdWVzLkNvdW50ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdGF0ZSA9IEZvcm11bGFTdGF0ZS5WYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciB2YWx1ZXNBc1N0cmluZyA9IEdldFZhbHVlQXNTdHJpbmcoKTsKLSAgICAgICAgICAgIC8vIEV4Y2VsIHN1cHBvcnRzIG1heCAyNTUgY2hhcmFjdGVycyBpbiB0aGlzIGZpZWxkLgotICAgICAgICAgICAgaWYgKHZhbHVlc0FzU3RyaW5nLkxlbmd0aCA+IDI1NSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHRvdGFsIGxlbmd0aCBvZiBhIERhdGFWYWxpZGF0aW9uIGxpc3QgY2Fubm90IGV4Y2VlZCAyNTUgY2hhcmFjdGVycyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfZm9ybXVsYVBhdGgsIHZhbHVlc0FzU3RyaW5nKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgSUxpc3Q8c3RyaW5nPiBWYWx1ZXMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RyaW5nICBHZXRWYWx1ZUFzU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWwgaW4gVmFsdWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzYi5MZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgiXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKHZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiLHswfSIsIHZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuQXBwZW5kKCJcIiIpOwotICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIFJlc2V0VmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZXMuQ2xlYXIoKTsKLSAgICAgICAgfQorICAgIHB1YmxpYyBldmVudCBFdmVudEhhbmRsZXI8RXZlbnRBcmdzPiBMaXN0Q2hhbmdlZCB7CisgICAgICBhZGQgPT4gX2xpc3RDaGFuZ2VkICs9IHZhbHVlOworICAgICAgcmVtb3ZlID0+IF9saXN0Q2hhbmdlZCAtPSB2YWx1ZTsKICAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgT25MaXN0Q2hhbmdlZCgpIHsKKyAgICAgIGlmIChfbGlzdENoYW5nZWQgIT0gbnVsbCkgeworICAgICAgICBfbGlzdENoYW5nZWQodGhpcywgRXZlbnRBcmdzLkVtcHR5KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgSUxpc3Q8c3RyaW5nPi5JbmRleE9mKHN0cmluZyBpdGVtKSB7CisgICAgICByZXR1cm4gX2l0ZW1zLkluZGV4T2YoaXRlbSk7CisgICAgfQorCisgICAgdm9pZCBJTGlzdDxzdHJpbmc+Lkluc2VydChpbnQgaW5kZXgsIHN0cmluZyBpdGVtKSB7CisgICAgICBfaXRlbXMuSW5zZXJ0KGluZGV4LCBpdGVtKTsKKyAgICAgIE9uTGlzdENoYW5nZWQoKTsKKyAgICB9CisKKyAgICB2b2lkIElMaXN0PHN0cmluZz4uUmVtb3ZlQXQoaW50IGluZGV4KSB7CisgICAgICBfaXRlbXMuUmVtb3ZlQXQoaW5kZXgpOworICAgICAgT25MaXN0Q2hhbmdlZCgpOworICAgIH0KKworICAgIHN0cmluZyBJTGlzdDxzdHJpbmc+LnRoaXNbaW50IGluZGV4XSB7CisgICAgICBnZXQgPT4gX2l0ZW1zW2luZGV4XTsKKyAgICAgIHNldCB7CisgICAgICAgIF9pdGVtc1tpbmRleF0gPSB2YWx1ZTsKKyAgICAgICAgT25MaXN0Q2hhbmdlZCgpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgSUNvbGxlY3Rpb248c3RyaW5nPi5BZGQoc3RyaW5nIGl0ZW0pIHsKKyAgICAgIF9pdGVtcy5BZGQoaXRlbSk7CisgICAgICBPbkxpc3RDaGFuZ2VkKCk7CisgICAgfQorCisgICAgdm9pZCBJQ29sbGVjdGlvbjxzdHJpbmc+LkNsZWFyKCkgeworICAgICAgX2l0ZW1zLkNsZWFyKCk7CisgICAgICBPbkxpc3RDaGFuZ2VkKCk7CisgICAgfQorCisgICAgYm9vbCBJQ29sbGVjdGlvbjxzdHJpbmc+LkNvbnRhaW5zKHN0cmluZyBpdGVtKSB7CisgICAgICByZXR1cm4gX2l0ZW1zLkNvbnRhaW5zKGl0ZW0pOworICAgIH0KKworICAgIHZvaWQgSUNvbGxlY3Rpb248c3RyaW5nPi5Db3B5VG8oc3RyaW5nW10gYXJyYXksIGludCBhcnJheUluZGV4KSB7CisgICAgICBfaXRlbXMuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsKKyAgICB9CisKKyAgICBpbnQgSUNvbGxlY3Rpb248c3RyaW5nPi5Db3VudCA9PiBfaXRlbXMuQ291bnQ7CisKKyAgICBib29sIElDb2xsZWN0aW9uPHN0cmluZz4uSXNSZWFkT25seSA9PiBmYWxzZTsKKworICAgIGJvb2wgSUNvbGxlY3Rpb248c3RyaW5nPi5SZW1vdmUoc3RyaW5nIGl0ZW0pIHsKKyAgICAgIHZhciByZXRWYWwgPSBfaXRlbXMuUmVtb3ZlKGl0ZW0pOworICAgICAgT25MaXN0Q2hhbmdlZCgpOworICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICBJRW51bWVyYXRvcjxzdHJpbmc+IElFbnVtZXJhYmxlPHN0cmluZz4uR2V0RW51bWVyYXRvcigpIHsKKyAgICAgIHJldHVybiBfaXRlbXMuR2V0RW51bWVyYXRvcigpOworICAgIH0KKworICAgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKSB7CisgICAgICByZXR1cm4gX2l0ZW1zLkdldEVudW1lcmF0b3IoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBDb3B5VG8oQXJyYXkgYXJyYXksIGludCBpbmRleCkgeworICAgICAgX2l0ZW1zLkNvcHlUbygoc3RyaW5nW10pYXJyYXksIGluZGV4KTsKKyAgICB9CisKKyAgICBpbnQgSUNvbGxlY3Rpb24uQ291bnQgPT4gX2l0ZW1zLkNvdW50OworCisgICAgcHVibGljIGJvb2wgSXNTeW5jaHJvbml6ZWQgPT4gKChJQ29sbGVjdGlvbilfaXRlbXMpLklzU3luY2hyb25pemVkOworCisgICAgcHVibGljIG9iamVjdCBTeW5jUm9vdCA9PiAoKElDb2xsZWN0aW9uKV9pdGVtcykuU3luY1Jvb3Q7CisgIH0KKworICBwdWJsaWMgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFMaXN0KAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyLAorICAgICAgWG1sTm9kZSBpdGVtTm9kZSwKKyAgICAgIHN0cmluZyBmb3JtdWxhUGF0aCkKKyAgICAgIDogYmFzZShuYW1lc3BhY2VNYW5hZ2VyLCBpdGVtTm9kZSwgZm9ybXVsYVBhdGgpIHsKKyAgICBSZXF1aXJlLkFyZ3VtZW50KGZvcm11bGFQYXRoKS5Jc05vdE51bGxPckVtcHR5KCJmb3JtdWxhUGF0aCIpOworICAgIF9mb3JtdWxhUGF0aCA9IGZvcm11bGFQYXRoOworICAgIHZhciB2YWx1ZXMgPSBuZXcgRGF0YVZhbGlkYXRpb25MaXN0KCk7CisgICAgdmFsdWVzLkxpc3RDaGFuZ2VkICs9IHZhbHVlc19MaXN0Q2hhbmdlZDsKKyAgICBWYWx1ZXMgPSB2YWx1ZXM7CisgICAgU2V0SW5pdGlhbFZhbHVlcygpOworICB9CisKKyAgcHJpdmF0ZSBzdHJpbmcgX2Zvcm11bGFQYXRoOworCisgIHByaXZhdGUgdm9pZCBTZXRJbml0aWFsVmFsdWVzKCkgeworICAgIHZhciB2YWx1ZSA9IEdldFhtbE5vZGVTdHJpbmcoX2Zvcm11bGFQYXRoKTsKKyAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkgeworICAgICAgaWYgKHZhbHVlLlN0YXJ0c1dpdGgoIlwiIikgJiYgdmFsdWUuRW5kc1dpdGgoIlwiIikpIHsKKyAgICAgICAgdmFsdWUgPSB2YWx1ZS5UcmltU3RhcnQoJyInKS5UcmltRW5kKCciJyk7CisgICAgICAgIHZhciBpdGVtcyA9IHZhbHVlLlNwbGl0KG5ld1tdIHsgJywnIH0sIFN0cmluZ1NwbGl0T3B0aW9ucy5SZW1vdmVFbXB0eUVudHJpZXMpOworICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBpdGVtcykgeworICAgICAgICAgIFZhbHVlcy5BZGQoaXRlbSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEV4Y2VsRm9ybXVsYSA9IHZhbHVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCB2YWx1ZXNfTGlzdENoYW5nZWQob2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGUpIHsKKyAgICBpZiAoVmFsdWVzLkNvdW50ID4gMCkgeworICAgICAgU3RhdGUgPSBGb3JtdWxhU3RhdGUuVmFsdWU7CisgICAgfQorICAgIHZhciB2YWx1ZXNBc1N0cmluZyA9IEdldFZhbHVlQXNTdHJpbmcoKTsKKyAgICAvLyBFeGNlbCBzdXBwb3J0cyBtYXggMjU1IGNoYXJhY3RlcnMgaW4gdGhpcyBmaWVsZC4KKyAgICBpZiAodmFsdWVzQXNTdHJpbmcuTGVuZ3RoID4gMjU1KSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAiVGhlIHRvdGFsIGxlbmd0aCBvZiBhIERhdGFWYWxpZGF0aW9uIGxpc3QgY2Fubm90IGV4Y2VlZCAyNTUgY2hhcmFjdGVycyIpOworICAgIH0KKyAgICBTZXRYbWxOb2RlU3RyaW5nKF9mb3JtdWxhUGF0aCwgdmFsdWVzQXNTdHJpbmcpOworICB9CisKKyAgcHVibGljIElMaXN0PHN0cmluZz4gVmFsdWVzIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgIHByb3RlY3RlZCBvdmVycmlkZSBzdHJpbmcgR2V0VmFsdWVBc1N0cmluZygpIHsKKyAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGZvcmVhY2ggKHZhciB2YWwgaW4gVmFsdWVzKSB7CisgICAgICBpZiAoc2IuTGVuZ3RoID09IDApIHsKKyAgICAgICAgc2IuQXBwZW5kKCJcIiIpOworICAgICAgICBzYi5BcHBlbmQodmFsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiLHswfSIsIHZhbCk7CisgICAgICB9CisgICAgfQorICAgIHNiLkFwcGVuZCgiXCIiKTsKKyAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTsKKyAgfQorCisgIGludGVybmFsIG92ZXJyaWRlIHZvaWQgUmVzZXRWYWx1ZSgpIHsKKyAgICBWYWx1ZXMuQ2xlYXIoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0V4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZS5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9Gb3JtdWxhcy9FeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVRpbWUuY3MKaW5kZXggMWVlMTk3Mi4uMzhhODE3NiAxMDA2NDQKLS0tIGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0V4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZS5jcworKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw3NiArMTMsNjUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wOAogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzLkNvbnRyYWN0czsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247Ci11c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhcy5Db250cmFjdHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzCi17Ci0gICAgaW50ZXJuYWwgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lIDogRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFWYWx1ZTxFeGNlbFRpbWU+LCBJRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lCi0gICAgewotICAgICAgICBwdWJsaWMgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFUaW1lKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlLCBzdHJpbmcgZm9ybXVsYVBhdGgpCi0gICAgICAgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlciwgdG9wTm9kZSwgZm9ybXVsYVBhdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB2YWx1ZSA9IEdldFhtbE5vZGVTdHJpbmcoZm9ybXVsYVBhdGgpOwotICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVjaW1hbCB0aW1lID0gZGVmYXVsdChkZWNpbWFsKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVjaW1hbC5UcnlQYXJzZSh2YWx1ZSwgTnVtYmVyU3R5bGVzLkFueSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IHRpbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBuZXcgRXhjZWxUaW1lKHRpbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IG5ldyBFeGNlbFRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgRXhjZWxGb3JtdWxhID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbHVlID0gbmV3IEV4Y2VsVGltZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVmFsdWUuVGltZUNoYW5nZWQgKz0gbmV3IEV2ZW50SGFuZGxlcihWYWx1ZV9UaW1lQ2hhbmdlZCk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzOwogCi0gICAgICAgIHZvaWQgVmFsdWVfVGltZUNoYW5nZWQob2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoRm9ybXVsYVBhdGgsIFZhbHVlLlRvRXhjZWxTdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgc3RyaW5nIEdldFZhbHVlQXNTdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoU3RhdGUgPT0gRm9ybXVsYVN0YXRlLlZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBWYWx1ZS5Ub0V4Y2VsU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RyaW5nLkVtcHR5OwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgdm9pZCBSZXNldFZhbHVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSBuZXcgRXhjZWxUaW1lKCk7Ci0gICAgICAgIH0KK2ludGVybmFsIGNsYXNzIEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZQorICAgIDogRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFWYWx1ZTxFeGNlbFRpbWU+LAorICAgICAgSUV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVGltZSB7CisgIHB1YmxpYyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVRpbWUoCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIsCisgICAgICBYbWxOb2RlIHRvcE5vZGUsCisgICAgICBzdHJpbmcgZm9ybXVsYVBhdGgpCisgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlciwgdG9wTm9kZSwgZm9ybXVsYVBhdGgpIHsKKyAgICB2YXIgdmFsdWUgPSBHZXRYbWxOb2RlU3RyaW5nKGZvcm11bGFQYXRoKTsKKyAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkgeworICAgICAgZGVjaW1hbCB0aW1lID0gZGVmYXVsdChkZWNpbWFsKTsKKyAgICAgIGlmIChkZWNpbWFsLlRyeVBhcnNlKHZhbHVlLCBOdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgdGltZSkpIHsKKyAgICAgICAgVmFsdWUgPSBuZXcodGltZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBWYWx1ZSA9IG5ldygpOworICAgICAgICBFeGNlbEZvcm11bGEgPSB2YWx1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgVmFsdWUgPSBuZXcoKTsKICAgICB9CisgICAgVmFsdWUuVGltZUNoYW5nZWQgKz0gVmFsdWVfVGltZUNoYW5nZWQ7CisgIH0KKworICBwcml2YXRlIHZvaWQgVmFsdWVfVGltZUNoYW5nZWQob2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGUpIHsKKyAgICBTZXRYbWxOb2RlU3RyaW5nKEZvcm11bGFQYXRoLCBWYWx1ZS5Ub0V4Y2VsU3RyaW5nKCkpOworICB9CisKKyAgcHJvdGVjdGVkIG92ZXJyaWRlIHN0cmluZyBHZXRWYWx1ZUFzU3RyaW5nKCkgeworICAgIGlmIChTdGF0ZSA9PSBGb3JtdWxhU3RhdGUuVmFsdWUpIHsKKyAgICAgIHJldHVybiBWYWx1ZS5Ub0V4Y2VsU3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBzdHJpbmcuRW1wdHk7CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIFJlc2V0VmFsdWUoKSB7CisgICAgVmFsdWUgPSBuZXcoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0Zvcm11bGFzL0V4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhVmFsdWUuY3MgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFWYWx1ZS5jcwppbmRleCA2NmE3Zjk5Li44NDkwYzdhIDEwMDY0NAotLS0gYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFWYWx1ZS5jcworKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vRm9ybXVsYXMvRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFWYWx1ZS5jcwpAQCAtMTMsNzIgKzEzLDU5IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDgKICAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkZvcm11bGFzCi17CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Gb3JtdWxhczsKIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgdmFsaWRhdGlvbiBmb3JtdWxhLiBJdHMgdmFsdWUgY2FuIGJlIHNwZWNpZmllZCBhcyBhIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZGF0YXR5cGUgb3IgYXMgYSBmb3JtdWxhLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+PC90eXBlcGFyYW0+Ci0gICAgaW50ZXJuYWwgYWJzdHJhY3QgY2xhc3MgRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGFWYWx1ZTxUPiA6IEV4Y2VsRGF0YVZhbGlkYXRpb25Gb3JtdWxhCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPk5hbWVzcGFjZW1hbmdlciBvZiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0b3BOb2RlIj52YWxpZGF0aW9uIHRvcCBub2RlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmb3JtdWxhUGF0aCI+eG1sIHBhdGggb2YgdGhlIGN1cnJlbnQgZm9ybXVsYTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVZhbHVlKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlLCBzdHJpbmcgZm9ybXVsYVBhdGgpCi0gICAgICAgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlciwgdG9wTm9kZSwgZm9ybXVsYVBhdGgpCi0gICAgICAgIHsKKy8vLyA8c3VtbWFyeT4KKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSB2YWxpZGF0aW9uIGZvcm11bGEuIEl0cyB2YWx1ZSBjYW4gYmUgc3BlY2lmaWVkIGFzIGEgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBkYXRhdHlwZSBvciBhcyBhIGZvcm11bGEuCisvLy8gPC9zdW1tYXJ5PgorLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+PC90eXBlcGFyYW0+CitpbnRlcm5hbCBhYnN0cmFjdCBjbGFzcyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVZhbHVlPFQ+IDogRXhjZWxEYXRhVmFsaWRhdGlvbkZvcm11bGEgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25zdHJ1Y3RvcgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPk5hbWVzcGFjZW1hbmdlciBvZiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0b3BOb2RlIj52YWxpZGF0aW9uIHRvcCBub2RlPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmb3JtdWxhUGF0aCI+eG1sIHBhdGggb2YgdGhlIGN1cnJlbnQgZm9ybXVsYTwvcGFyYW0+CisgIHB1YmxpYyBFeGNlbERhdGFWYWxpZGF0aW9uRm9ybXVsYVZhbHVlKAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyLAorICAgICAgWG1sTm9kZSB0b3BOb2RlLAorICAgICAgc3RyaW5nIGZvcm11bGFQYXRoKQorICAgICAgOiBiYXNlKG5hbWVzcGFjZU1hbmFnZXIsIHRvcE5vZGUsIGZvcm11bGFQYXRoKSB7fQogCi0gICAgICAgIH0KKyAgcHJpdmF0ZSBUIF92YWx1ZTsKIAotICAgICAgICBwcml2YXRlIFQgX3ZhbHVlOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUeXBlZCB2YWx1ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgVCBWYWx1ZSAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF92YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXRlID0gRm9ybXVsYVN0YXRlLlZhbHVlOwotICAgICAgICAgICAgICAgIF92YWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoRm9ybXVsYVBhdGgsIEdldFZhbHVlQXNTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIFJlc2V0VmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSA9IGRlZmF1bHQoVCk7Ci0gICAgICAgIH0KLQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUeXBlZCB2YWx1ZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgVCBWYWx1ZSB7CisgICAgZ2V0ID0+IF92YWx1ZTsKKyAgICBzZXQgeworICAgICAgU3RhdGUgPSBGb3JtdWxhU3RhdGUuVmFsdWU7CisgICAgICBfdmFsdWUgPSB2YWx1ZTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoRm9ybXVsYVBhdGgsIEdldFZhbHVlQXNTdHJpbmcoKSk7CiAgICAgfQorICB9CisKKyAgaW50ZXJuYWwgb3ZlcnJpZGUgdm9pZCBSZXNldFZhbHVlKCkgeworICAgIFZhbHVlID0gZGVmYXVsdChUKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0lSYW5nZURhdGFWYWxpZGF0aW9uLmNzIGIvRVBQbHVzL0RhdGFWYWxpZGF0aW9uL0lSYW5nZURhdGFWYWxpZGF0aW9uLmNzCmluZGV4IGY3Y2IzYmEuLjAwMDI1NjAgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9JUmFuZ2VEYXRhVmFsaWRhdGlvbi5jcworKysgYi9FUFBsdXMvRGF0YVZhbGlkYXRpb24vSVJhbmdlRGF0YVZhbGlkYXRpb24uY3MKQEAgLTEzLDczICsxMyw3NyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAzLTIzCiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OworCiB1c2luZyBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uLkNvbnRyYWN0czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24KLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIGFkZGluZyBkYXRhdmFsaWRhdGlvbiB0byBhIHJhbmdlICg8c2VlIGNyZWY9IkV4Y2VsUmFuZ2VCYXNlIi8+KS4gRWFjaCBtZXRob2Qgd2lsbAotICAgIC8vLyByZXR1cm4gYSBjb25maWd1cmFibGUgdmFsaWRhdGlvbi4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBpbnRlcmZhY2UgSVJhbmdlRGF0YVZhbGlkYXRpb24KLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHMgYSA8c2VlIGNyZWY9IklFeGNlbERhdGFWYWxpZGF0aW9uQW55Ii8+IHRvIHRoZSByYW5nZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uQW55Ii8+IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGFueSB2YWxpZGF0aW9uPC9yZXR1cm5zPgotICAgICAgICBJRXhjZWxEYXRhVmFsaWRhdGlvbkFueSBBZGRBbnlEYXRhVmFsaWRhdGlvbigpOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJJRXhjZWxEYXRhVmFsaWRhdGlvbkludCIvPiB0byB0aGUgcmFuZ2UKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uSW50Ii8+IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGludGVnZXIgZGF0YSB2YWxpZGF0aW9uPC9yZXR1cm5zPgotICAgICAgICBJRXhjZWxEYXRhVmFsaWRhdGlvbkludCBBZGRJbnRlZ2VyRGF0YVZhbGlkYXRpb24oKTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwiLz4gdG8gdGhlIHJhbmdlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIDxzZWUgY3JlZj0iRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwiLz4gdGhhdCBjYW4gYmUgY29uZmlndXJlZCBmb3IgZGVjaW1hbCBkYXRhIHZhbGlkYXRpb248L3JldHVybnM+Ci0gICAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uRGVjaW1hbCBBZGREZWNpbWFsRGF0YVZhbGlkYXRpb24oKTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lIi8+IHRvIHRoZSByYW5nZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+QSA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsIi8+IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGRhdGV0aW1lIGRhdGEgdmFsaWRhdGlvbjwvcmV0dXJucz4KLSAgICAgICAgSUV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZSBBZGREYXRlVGltZURhdGFWYWxpZGF0aW9uKCk7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHMgYSA8c2VlIGNyZWY9IklFeGNlbERhdGFWYWxpZGF0aW9uTGlzdCIvPiB0byB0aGUgcmFuZ2UKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uTGlzdCIvPiB0aGF0IGNhbiBiZSBjb25maWd1cmVkIGZvciBkYXRldGltZSBkYXRhIHZhbGlkYXRpb248L3JldHVybnM+Ci0gICAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uTGlzdCBBZGRMaXN0RGF0YVZhbGlkYXRpb24oKTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQiLz4gcmVnYXJkaW5nIHRleHQgbGVuZ3RoIHZhbGlkYXRpb24gdG8gdGhlIHJhbmdlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBJRXhjZWxEYXRhVmFsaWRhdGlvbkludCBBZGRUZXh0TGVuZ3RoRGF0YVZhbGlkYXRpb24oKTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lIi8+IHRvIHRoZSByYW5nZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJJRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUiLz4gdGhhdCBjYW4gYmUgY29uZmlndXJlZCBmb3IgdGltZSBkYXRhIHZhbGlkYXRpb248L3JldHVybnM+Ci0gICAgICAgIElFeGNlbERhdGFWYWxpZGF0aW9uVGltZSBBZGRUaW1lRGF0YVZhbGlkYXRpb24oKTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20iLz4gdG8gdGhlIHJhbmdlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+QSA8c2VlIGNyZWY9IklFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tIi8+IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGN1c3RvbSB2YWxpZGF0aW9uPC9yZXR1cm5zPgotICAgICAgICBJRXhjZWxEYXRhVmFsaWRhdGlvbkN1c3RvbSBBZGRDdXN0b21EYXRhVmFsaWRhdGlvbigpOwotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOworCisvLy8gPHN1bW1hcnk+CisvLy8gUHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgYWRkaW5nIGRhdGF2YWxpZGF0aW9uIHRvIGEgcmFuZ2UgKDxzZWUgY3JlZj0iRXhjZWxSYW5nZUJhc2UiLz4pLiBFYWNoIG1ldGhvZCB3aWxsCisvLy8gcmV0dXJuIGEgY29uZmlndXJhYmxlIHZhbGlkYXRpb24uCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJUmFuZ2VEYXRhVmFsaWRhdGlvbiB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSA8c2VlIGNyZWY9IklFeGNlbERhdGFWYWxpZGF0aW9uQW55Ii8+IHRvIHRoZSByYW5nZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uQW55Ii8+IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGFueSB2YWxpZGF0aW9uPC9yZXR1cm5zPgorICBJRXhjZWxEYXRhVmFsaWRhdGlvbkFueSBBZGRBbnlEYXRhVmFsaWRhdGlvbigpOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSA8c2VlIGNyZWY9IklFeGNlbERhdGFWYWxpZGF0aW9uSW50Ii8+IHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+QSA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb25JbnQiLz4gdGhhdCBjYW4gYmUgY29uZmlndXJlZCBmb3IgaW50ZWdlciBkYXRhIHZhbGlkYXRpb248L3JldHVybnM+CisgIElFeGNlbERhdGFWYWxpZGF0aW9uSW50IEFkZEludGVnZXJEYXRhVmFsaWRhdGlvbigpOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsIi8+IHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+QSA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsIi8+IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGRlY2ltYWwgZGF0YSB2YWxpZGF0aW9uPC9yZXR1cm5zPgorICBJRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwgQWRkRGVjaW1hbERhdGFWYWxpZGF0aW9uKCk7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iRXhjZWxEYXRhVmFsaWRhdGlvbkRhdGVUaW1lIi8+IHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+QSA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsIi8+IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGRhdGV0aW1lIGRhdGEgdmFsaWRhdGlvbjwvcmV0dXJucz4KKyAgSUV4Y2VsRGF0YVZhbGlkYXRpb25EYXRlVGltZSBBZGREYXRlVGltZURhdGFWYWxpZGF0aW9uKCk7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0Ii8+IHRvIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+QSA8c2VlIGNyZWY9IkV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0Ii8+IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgZm9yIGRhdGV0aW1lIGRhdGEgdmFsaWRhdGlvbjwvcmV0dXJucz4KKyAgSUV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0IEFkZExpc3REYXRhVmFsaWRhdGlvbigpOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSA8c2VlIGNyZWY9IklFeGNlbERhdGFWYWxpZGF0aW9uSW50Ii8+IHJlZ2FyZGluZyB0ZXh0IGxlbmd0aCB2YWxpZGF0aW9uIHRvIHRoZSByYW5nZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUV4Y2VsRGF0YVZhbGlkYXRpb25JbnQgQWRkVGV4dExlbmd0aERhdGFWYWxpZGF0aW9uKCk7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iSUV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lIi8+IHRvIHRoZSByYW5nZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJJRXhjZWxEYXRhVmFsaWRhdGlvblRpbWUiLz4gdGhhdCBjYW4gYmUgY29uZmlndXJlZCBmb3IgdGltZSBkYXRhIHZhbGlkYXRpb248L3JldHVybnM+CisgIElFeGNlbERhdGFWYWxpZGF0aW9uVGltZSBBZGRUaW1lRGF0YVZhbGlkYXRpb24oKTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgPHNlZSBjcmVmPSJJRXhjZWxEYXRhVmFsaWRhdGlvbkN1c3RvbSIvPiB0byB0aGUgcmFuZ2UuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz5BIDxzZWUgY3JlZj0iSUV4Y2VsRGF0YVZhbGlkYXRpb25DdXN0b20iLz4gdGhhdCBjYW4gYmUgY29uZmlndXJlZCBmb3IgY3VzdG9tIHZhbGlkYXRpb248L3JldHVybnM+CisgIElFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tIEFkZEN1c3RvbURhdGFWYWxpZGF0aW9uKCk7CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRGF0YVZhbGlkYXRpb24vUmFuZ2VEYXRhVmFsaWRhdGlvbi5jcyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9SYW5nZURhdGFWYWxpZGF0aW9uLmNzCmluZGV4IDkwYzUxN2IuLjgyYmY5NWQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9SYW5nZURhdGFWYWxpZGF0aW9uLmNzCisrKyBiL0VQUGx1cy9EYXRhVmFsaWRhdGlvbi9SYW5nZURhdGFWYWxpZGF0aW9uLmNzCkBAIC0xMyw4MiArMTMsNjggQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMy0yMwogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKKwogdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbi5Db250cmFjdHM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbgotewotICAgIGludGVybmFsIGNsYXNzIFJhbmdlRGF0YVZhbGlkYXRpb24gOiBJUmFuZ2VEYXRhVmFsaWRhdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIFJhbmdlRGF0YVZhbGlkYXRpb24oRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWlyZS5Bcmd1bWVudCh3b3Jrc2hlZXQpLklzTm90TnVsbCgid29ya3NoZWV0Iik7Ci0gICAgICAgICAgICBSZXF1aXJlLkFyZ3VtZW50KGFkZHJlc3MpLklzTm90TnVsbE9yRW1wdHkoImFkZHJlc3MiKTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQgPSB3b3Jrc2hlZXQ7Ci0gICAgICAgICAgICBfYWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRhdGFWYWxpZGF0aW9uOwogCi0gICAgICAgIEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQ7Ci0gICAgICAgIHN0cmluZyBfYWRkcmVzczsKK2ludGVybmFsIGNsYXNzIFJhbmdlRGF0YVZhbGlkYXRpb24gOiBJUmFuZ2VEYXRhVmFsaWRhdGlvbiB7CisgIHB1YmxpYyBSYW5nZURhdGFWYWxpZGF0aW9uKEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MpIHsKKyAgICBSZXF1aXJlLkFyZ3VtZW50KHdvcmtzaGVldCkuSXNOb3ROdWxsKCJ3b3Jrc2hlZXQiKTsKKyAgICBSZXF1aXJlLkFyZ3VtZW50KGFkZHJlc3MpLklzTm90TnVsbE9yRW1wdHkoImFkZHJlc3MiKTsKKyAgICBfd29ya3NoZWV0ID0gd29ya3NoZWV0OworICAgIF9hZGRyZXNzID0gYWRkcmVzczsKKyAgfQogCi0gICAgICAgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbkFueSBBZGRBbnlEYXRhVmFsaWRhdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfd29ya3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRBbnlWYWxpZGF0aW9uKF9hZGRyZXNzKTsKLSAgICAgICAgfQorICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQ7CisgIHByaXZhdGUgc3RyaW5nIF9hZGRyZXNzOwogCi0gICAgICAgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbkludCBBZGRJbnRlZ2VyRGF0YVZhbGlkYXRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkSW50ZWdlclZhbGlkYXRpb24oX2FkZHJlc3MpOwotICAgICAgICB9CisgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbkFueSBBZGRBbnlEYXRhVmFsaWRhdGlvbigpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkQW55VmFsaWRhdGlvbihfYWRkcmVzcyk7CisgIH0KIAotICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25EZWNpbWFsIEFkZERlY2ltYWxEYXRhVmFsaWRhdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfd29ya3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREZWNpbWFsVmFsaWRhdGlvbihfYWRkcmVzcyk7Ci0gICAgICAgIH0KKyAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uSW50IEFkZEludGVnZXJEYXRhVmFsaWRhdGlvbigpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkSW50ZWdlclZhbGlkYXRpb24oX2FkZHJlc3MpOworICB9CiAKLSAgICAgICAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUgQWRkRGF0ZVRpbWVEYXRhVmFsaWRhdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfd29ya3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREYXRlVGltZVZhbGlkYXRpb24oX2FkZHJlc3MpOwotICAgICAgICB9CisgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbkRlY2ltYWwgQWRkRGVjaW1hbERhdGFWYWxpZGF0aW9uKCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGREZWNpbWFsVmFsaWRhdGlvbihfYWRkcmVzcyk7CisgIH0KIAotICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25MaXN0IEFkZExpc3REYXRhVmFsaWRhdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfd29ya3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRMaXN0VmFsaWRhdGlvbihfYWRkcmVzcyk7Ci0gICAgICAgIH0KKyAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uRGF0ZVRpbWUgQWRkRGF0ZVRpbWVEYXRhVmFsaWRhdGlvbigpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkRGF0ZVRpbWVWYWxpZGF0aW9uKF9hZGRyZXNzKTsKKyAgfQogCi0gICAgICAgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbkludCBBZGRUZXh0TGVuZ3RoRGF0YVZhbGlkYXRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkVGV4dExlbmd0aFZhbGlkYXRpb24oX2FkZHJlc3MpOwotICAgICAgICB9CisgIHB1YmxpYyBJRXhjZWxEYXRhVmFsaWRhdGlvbkxpc3QgQWRkTGlzdERhdGFWYWxpZGF0aW9uKCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRMaXN0VmFsaWRhdGlvbihfYWRkcmVzcyk7CisgIH0KIAotICAgICAgICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lIEFkZFRpbWVEYXRhVmFsaWRhdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfd29ya3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRUaW1lVmFsaWRhdGlvbihfYWRkcmVzcyk7Ci0gICAgICAgIH0KKyAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uSW50IEFkZFRleHRMZW5ndGhEYXRhVmFsaWRhdGlvbigpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkVGV4dExlbmd0aFZhbGlkYXRpb24oX2FkZHJlc3MpOworICB9CiAKLSAgICAgICAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tIEFkZEN1c3RvbURhdGFWYWxpZGF0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuRGF0YVZhbGlkYXRpb25zLkFkZEN1c3RvbVZhbGlkYXRpb24oX2FkZHJlc3MpOwotICAgICAgICB9Ci0gICAgfQorICBwdWJsaWMgSUV4Y2VsRGF0YVZhbGlkYXRpb25UaW1lIEFkZFRpbWVEYXRhVmFsaWRhdGlvbigpIHsKKyAgICByZXR1cm4gX3dvcmtzaGVldC5EYXRhVmFsaWRhdGlvbnMuQWRkVGltZVZhbGlkYXRpb24oX2FkZHJlc3MpOworICB9CisKKyAgcHVibGljIElFeGNlbERhdGFWYWxpZGF0aW9uQ3VzdG9tIEFkZEN1c3RvbURhdGFWYWxpZGF0aW9uKCkgeworICAgIHJldHVybiBfd29ya3NoZWV0LkRhdGFWYWxpZGF0aW9ucy5BZGRDdXN0b21WYWxpZGF0aW9uKF9hZGRyZXNzKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvVm1sL0V4Y2VsVm1sRHJhd2luZ0Jhc2UuY3MgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQmFzZS5jcwppbmRleCBjZWY0MWRjLi5kZjkzNGM4IDEwMDY0NAotLS0gYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQmFzZS5jcworKysgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQmFzZS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTcgKzEzLDE3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMTAtMDYtMDEKQEAgLTMyLDEzMSArMzIsMTIxIEBACiAKIHVzaW5nIFN5c3RlbS5YbWw7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuVm1sCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBIb3Jpem9udGFsIEFsaW5nbWVudAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZVRleHRBbGlnbkhvcml6b250YWxWbWwKLSAgICB7Ci0gICAgICAgIExlZnQsCi0gICAgICAgIENlbnRlciwKLSAgICAgICAgUmlnaHQKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBWZXJ0aWNhbCBBbGluZ21lbnQKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIGVUZXh0QWxpZ25WZXJ0aWNhbFZtbAotICAgIHsKLSAgICAgICAgVG9wLAotICAgICAgICBDZW50ZXIsCi0gICAgICAgIEJvdHRvbQotICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIExpbmVzdHlsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZUxpbmVTdHlsZVZtbAotICAgIHsKLSAgICAgICAgU29saWQsCi0gICAgICAgIFJvdW5kLAotICAgICAgICBTcXVhcmUsCi0gICAgICAgIERhc2gsCi0gICAgICAgIERhc2hEb3QsCi0gICAgICAgIExvbmdEYXNoLAotICAgICAgICBMb25nRGFzaERvdCwKLSAgICAgICAgTG9uZ0Rhc2hEb3REb3QKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBEcmF3aW5nIG9iamVjdCB1c2VkIGZvciBjb21tZW50cwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsVm1sRHJhd2luZ0Jhc2UgOiBYbWxIZWxwZXIKLSAgICB7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsVm1sRHJhd2luZ0Jhc2UoWG1sTm9kZSB0b3BOb2RlLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zKSA6Ci0gICAgICAgICAgICBiYXNlKG5zLCB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAiZmlsbCIsICJzdHJva2UiLCAic2hhZG93IiwgInBhdGgiLCAidGV4dGJveCIsICJDbGllbnREYXRhIiwgIk1vdmVXaXRoQ2VsbHMiLCAiU2l6ZVdpdGhDZWxscyIsICJBbmNob3IiLCAiTG9ja2VkIiwgIkF1dG9GaWxsIiwgIkxvY2tUZXh0IiwgIlRleHRIQWxpZ24iLCAiVGV4dFZBbGlnbiIsICJSb3ciLCAiQ29sdW1uIiwgIlZpc2libGUiIH07Ci0gICAgICAgIH0gICAKLSAgICAgICAgcHVibGljIHN0cmluZyBJZCAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkBpZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGlkIix2YWx1ZSk7Ci0gICAgICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLlZtbDsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEhvcml6b250YWwgQWxpbmdtZW50CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gZVRleHRBbGlnbkhvcml6b250YWxWbWwgeworICBMZWZ0LAorICBDZW50ZXIsCisgIFJpZ2h0LAorfQorCisvLy8gPHN1bW1hcnk+CisvLy8gVmVydGljYWwgQWxpbmdtZW50CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gZVRleHRBbGlnblZlcnRpY2FsVm1sIHsKKyAgVG9wLAorICBDZW50ZXIsCisgIEJvdHRvbSwKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIExpbmVzdHlsZQorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVMaW5lU3R5bGVWbWwgeworICBTb2xpZCwKKyAgUm91bmQsCisgIFNxdWFyZSwKKyAgRGFzaCwKKyAgRGFzaERvdCwKKyAgTG9uZ0Rhc2gsCisgIExvbmdEYXNoRG90LAorICBMb25nRGFzaERvdERvdCwKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIERyYXdpbmcgb2JqZWN0IHVzZWQgZm9yIGNvbW1lbnRzCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsVm1sRHJhd2luZ0Jhc2UgOiBYbWxIZWxwZXIgeworICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdCYXNlKFhtbE5vZGUgdG9wTm9kZSwgWG1sTmFtZXNwYWNlTWFuYWdlciBucykKKyAgICAgIDogYmFzZShucywgdG9wTm9kZSkgeworICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ld1tdIHsKKyAgICAgICJmaWxsIiwKKyAgICAgICJzdHJva2UiLAorICAgICAgInNoYWRvdyIsCisgICAgICAicGF0aCIsCisgICAgICAidGV4dGJveCIsCisgICAgICAiQ2xpZW50RGF0YSIsCisgICAgICAiTW92ZVdpdGhDZWxscyIsCisgICAgICAiU2l6ZVdpdGhDZWxscyIsCisgICAgICAiQW5jaG9yIiwKKyAgICAgICJMb2NrZWQiLAorICAgICAgIkF1dG9GaWxsIiwKKyAgICAgICJMb2NrVGV4dCIsCisgICAgICAiVGV4dEhBbGlnbiIsCisgICAgICAiVGV4dFZBbGlnbiIsCisgICAgICAiUm93IiwKKyAgICAgICJDb2x1bW4iLAorICAgICAgIlZpc2libGUiLAorICAgIH07CisgIH0KKworICBwdWJsaWMgc3RyaW5nIElkIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZygiQGlkIik7CisgICAgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoIkBpZCIsIHZhbHVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFsdGVybmF0aXZlIHRleHQgdG8gYmUgZGlzcGxheWVkIGluc3RlYWQgb2YgYSBncmFwaGljLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIEFsdGVybmF0aXZlVGV4dCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVTdHJpbmcoIkBhbHQiKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZygiQGFsdCIsIHZhbHVlKTsKKyAgfQorCisgIHByb3RlY3RlZCBib29sIEdldFN0eWxlKHN0cmluZyBzdHlsZSwgc3RyaW5nIGtleSwgb3V0IHN0cmluZyB2YWx1ZSkgeworICAgIHN0cmluZ1tdIHN0eWxlcyA9IHN0eWxlLlNwbGl0KCc7Jyk7CisgICAgZm9yZWFjaCAoc3RyaW5nIHMgaW4gc3R5bGVzKSB7CisgICAgICBpZiAocy5JbmRleE9mKCc6JykgPiAwKSB7CisgICAgICAgIHN0cmluZ1tdIHNwbGl0ID0gcy5TcGxpdCgnOicpOworICAgICAgICBpZiAoc3BsaXRbMF0gPT0ga2V5KSB7CisgICAgICAgICAgdmFsdWUgPSBzcGxpdFsxXTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBbHRlcm5hdGl2ZSB0ZXh0IHRvIGJlIGRpc3BsYXllZCBpbnN0ZWFkIG9mIGEgZ3JhcGhpYy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBBbHRlcm5hdGl2ZVRleHQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkBhbHQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBhbHQiLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI3JlZ2lvbiAiU3R5bGUgSGFuZGxpbmcgbWV0aG9kcyIKLSAgICAgICAgcHJvdGVjdGVkIGJvb2wgR2V0U3R5bGUoc3RyaW5nIHN0eWxlLCBzdHJpbmcga2V5LCBvdXQgc3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmdbXXN0eWxlcyA9IHN0eWxlLlNwbGl0KCc7Jyk7Ci0gICAgICAgICAgICBmb3JlYWNoKHN0cmluZyBzIGluIHN0eWxlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocy5JbmRleE9mKCc6JykgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nW10gc3BsaXQgPSBzLlNwbGl0KCc6Jyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzcGxpdFswXSA9PSBrZXkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXNwbGl0WzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocyA9PSBrZXkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iIjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsdWU9IiI7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBTZXRTdHlsZShzdHJpbmcgc3R5bGUsIHN0cmluZyBrZXksIHN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nW10gc3R5bGVzID0gc3R5bGUuU3BsaXQoJzsnKTsKLSAgICAgICAgICAgIHN0cmluZyBuZXdTdHlsZT0iIjsKLSAgICAgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIHMgaW4gc3R5bGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZ1tdIHNwbGl0ID0gcy5TcGxpdCgnOicpOwotICAgICAgICAgICAgICAgIGlmIChzcGxpdFswXS5UcmltKCkgPT0ga2V5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLlRyaW0oKSAhPSAiIikgLy9JZiBibGFuayByZW1vdmUgdGhlIGl0ZW0KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUgKz0ga2V5ICsgJzonICsgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlICs9IHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5ld1N0eWxlICs9ICc7JzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghY2hhbmdlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXdTdHlsZSArPSBrZXkgKyAnOicgKyB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuZXdTdHlsZSA9IHN0eWxlLlN1YnN0cmluZygwLCBzdHlsZS5MZW5ndGggLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXdTdHlsZTsKLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCisgICAgICB9IGVsc2UgaWYgKHMgPT0ga2V5KSB7CisgICAgICAgIHZhbHVlID0gIiI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQogICAgIH0KKyAgICB2YWx1ZSA9ICIiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHByb3RlY3RlZCBzdHJpbmcgU2V0U3R5bGUoc3RyaW5nIHN0eWxlLCBzdHJpbmcga2V5LCBzdHJpbmcgdmFsdWUpIHsKKyAgICBzdHJpbmdbXSBzdHlsZXMgPSBzdHlsZS5TcGxpdCgnOycpOworICAgIHN0cmluZyBuZXdTdHlsZSA9ICIiOworICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgIGZvcmVhY2ggKHN0cmluZyBzIGluIHN0eWxlcykgeworICAgICAgc3RyaW5nW10gc3BsaXQgPSBzLlNwbGl0KCc6Jyk7CisgICAgICBpZiAoc3BsaXRbMF0uVHJpbSgpID09IGtleSkgeworICAgICAgICBpZiAodmFsdWUuVHJpbSgpCisgICAgICAgICAgICAhPSAiIikgLy9JZiBibGFuayByZW1vdmUgdGhlIGl0ZW0KKyAgICAgICAgeworICAgICAgICAgIG5ld1N0eWxlICs9IGtleSArICc6JyArIHZhbHVlOworICAgICAgICB9CisgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbmV3U3R5bGUgKz0gczsKKyAgICAgIH0KKyAgICAgIG5ld1N0eWxlICs9ICc7JzsKKyAgICB9CisgICAgaWYgKCFjaGFuZ2VkKSB7CisgICAgICBuZXdTdHlsZSArPSBrZXkgKyAnOicgKyB2YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgbmV3U3R5bGUgPSBzdHlsZS5TdWJzdHJpbmcoMCwgc3R5bGUuTGVuZ3RoIC0gMSk7CisgICAgfQorICAgIHJldHVybiBuZXdTdHlsZTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0RyYXdpbmcvVm1sL0V4Y2VsVm1sRHJhd2luZ0Jhc2VDb2xsZWN0aW9uLmNzIGIvRVBQbHVzL0RyYXdpbmcvVm1sL0V4Y2VsVm1sRHJhd2luZ0Jhc2VDb2xsZWN0aW9uLmNzCmluZGV4IDVmYTBlODIuLjkxMjIxNGUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdCYXNlQ29sbGVjdGlvbi5jcworKysgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQmFzZUNvbGxlY3Rpb24uY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDU0ICsxMyw1MSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDEwLTA2LTAxCiAgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmc7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuVm1sCi17Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsVm1sRHJhd2luZ0Jhc2VDb2xsZWN0aW9uCi0gICAgeyAgICAgICAgCi0gICAgICAgIGludGVybmFsIEV4Y2VsVm1sRHJhd2luZ0Jhc2VDb2xsZWN0aW9uKEV4Y2VsUGFja2FnZSBwY2ssIEV4Y2VsV29ya3NoZWV0IHdzLCBVcmkgdXJpKQotICAgICAgICB7Ci0gICAgICAgICAgICBWbWxEcmF3aW5nWG1sID0gbmV3IFhtbERvY3VtZW50KCk7Ci0gICAgICAgICAgICBWbWxEcmF3aW5nWG1sLlByZXNlcnZlV2hpdGVzcGFjZSA9IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBOYW1lVGFibGUgbnQ9bmV3IE5hbWVUYWJsZSgpOwotICAgICAgICAgICAgTmFtZVNwYWNlTWFuYWdlciA9IG5ldyBYbWxOYW1lc3BhY2VNYW5hZ2VyKG50KTsKLSAgICAgICAgICAgIE5hbWVTcGFjZU1hbmFnZXIuQWRkTmFtZXNwYWNlKCJ2IiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1pY3Jvc29mdFZtbCk7Ci0gICAgICAgICAgICBOYW1lU3BhY2VNYW5hZ2VyLkFkZE5hbWVzcGFjZSgibyIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNaWNyb3NvZnRPZmZpY2UpOwotICAgICAgICAgICAgTmFtZVNwYWNlTWFuYWdlci5BZGROYW1lc3BhY2UoIngiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWljcm9zb2Z0RXhjZWwpOwotICAgICAgICAgICAgVXJpID0gdXJpOwotICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhcnQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBhcnQ9cGNrLlBhY2thZ2UuR2V0UGFydCh1cmkpOwotICAgICAgICAgICAgICAgIFhtbEhlbHBlci5Mb2FkWG1sU2FmZShWbWxEcmF3aW5nWG1sLCBQYXJ0LkdldFN0cmVhbSgpKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgWG1sRG9jdW1lbnQgVm1sRHJhd2luZ1htbCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIGludGVybmFsIFVyaSBVcmkgeyBnZXQ7IHNldDsgfQotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgUmVsSWQgeyBnZXQ7IHNldDsgfQotICAgICAgICBpbnRlcm5hbCBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgUGFydCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIGludGVybmFsIFhtbE5hbWVzcGFjZU1hbmFnZXIgTmFtZVNwYWNlTWFuYWdlciB7IGdldDsgc2V0OyB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLlZtbDsKKworcHVibGljIGNsYXNzIEV4Y2VsVm1sRHJhd2luZ0Jhc2VDb2xsZWN0aW9uIHsKKyAgaW50ZXJuYWwgRXhjZWxWbWxEcmF3aW5nQmFzZUNvbGxlY3Rpb24oRXhjZWxQYWNrYWdlIHBjaywgRXhjZWxXb3Jrc2hlZXQgd3MsIFVyaSB1cmkpIHsKKyAgICBWbWxEcmF3aW5nWG1sID0gbmV3KCk7CisgICAgVm1sRHJhd2luZ1htbC5QcmVzZXJ2ZVdoaXRlc3BhY2UgPSBmYWxzZTsKKworICAgIE5hbWVUYWJsZSBudCA9IG5ldyBOYW1lVGFibGUoKTsKKyAgICBOYW1lU3BhY2VNYW5hZ2VyID0gbmV3KG50KTsKKyAgICBOYW1lU3BhY2VNYW5hZ2VyLkFkZE5hbWVzcGFjZSgidiIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWljcm9zb2Z0Vm1sKTsKKyAgICBOYW1lU3BhY2VNYW5hZ2VyLkFkZE5hbWVzcGFjZSgibyIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWljcm9zb2Z0T2ZmaWNlKTsKKyAgICBOYW1lU3BhY2VNYW5hZ2VyLkFkZE5hbWVzcGFjZSgieCIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWljcm9zb2Z0RXhjZWwpOworICAgIFVyaSA9IHVyaTsKKyAgICBpZiAodXJpID09IG51bGwpIHsKKyAgICAgIFBhcnQgPSBudWxsOworICAgIH0gZWxzZSB7CisgICAgICBQYXJ0ID0gcGNrLlBhY2thZ2UuR2V0UGFydCh1cmkpOworICAgICAgWG1sSGVscGVyLkxvYWRYbWxTYWZlKFZtbERyYXdpbmdYbWwsIFBhcnQuR2V0U3RyZWFtKCkpOwogICAgIH0KKyAgfQorCisgIGludGVybmFsIFhtbERvY3VtZW50IFZtbERyYXdpbmdYbWwgeyBnZXQ7IHNldDsgfQorICBpbnRlcm5hbCBVcmkgVXJpIHsgZ2V0OyBzZXQ7IH0KKyAgaW50ZXJuYWwgc3RyaW5nIFJlbElkIHsgZ2V0OyBzZXQ7IH0KKyAgaW50ZXJuYWwgWmlwUGFja2FnZVBhcnQgUGFydCB7IGdldDsgc2V0OyB9CisgIGludGVybmFsIFhtbE5hbWVzcGFjZU1hbmFnZXIgTmFtZVNwYWNlTWFuYWdlciB7IGdldDsgc2V0OyB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQ29tbWVudC5jcyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdDb21tZW50LmNzCmluZGV4IDI3MGViMjQuLjU2MDUyOWUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdDb21tZW50LmNzCisrKyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdDb21tZW50LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw0NDYgKzEzLDQwMiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDEwLTA2LTAxCiAgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CiB1c2luZyBTeXN0ZW0uRHJhd2luZzsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlhtbDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWwKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIERyYXdpbmcgb2JqZWN0IHVzZWQgZm9yIGNvbW1lbnRzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxWbWxEcmF3aW5nQ29tbWVudCA6IEV4Y2VsVm1sRHJhd2luZ0Jhc2UsIElSYW5nZUlECi0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdDb21tZW50KFhtbE5vZGUgdG9wTm9kZSwgRXhjZWxSYW5nZUJhc2UgcmFuZ2UsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMpIDoKLSAgICAgICAgICAgIGJhc2UodG9wTm9kZSwgbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJhbmdlID0gcmFuZ2U7Ci0gICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAiZmlsbCIsICJzdHJva2UiLCAic2hhZG93IiwgInBhdGgiLCAidGV4dGJveCIsICJDbGllbnREYXRhIiwgIk1vdmVXaXRoQ2VsbHMiLCAiU2l6ZVdpdGhDZWxscyIsICJBbmNob3IiLCAiTG9ja2VkIiwgIkF1dG9GaWxsIiwgIkxvY2tUZXh0IiwgIlRleHRIQWxpZ24iLCAiVGV4dFZBbGlnbiIsICJSb3ciLCAiQ29sdW1uIiwgIlZpc2libGUiIH07Ci0gICAgICAgIH0gICAKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxSYW5nZUJhc2UgUmFuZ2UgeyBnZXQ7IHNldDsgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWw7CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcmVzcyBpbiB0aGUgd29ya3NoZWV0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgQWRkcmVzcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2UuQWRkcmVzczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIERyYXdpbmcgb2JqZWN0IHVzZWQgZm9yIGNvbW1lbnRzCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnQgOiBFeGNlbFZtbERyYXdpbmdCYXNlLCBJUmFuZ2VJZCB7CisgIGludGVybmFsIEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnQoWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFJhbmdlQmFzZSByYW5nZSwgWG1sTmFtZXNwYWNlTWFuYWdlciBucykKKyAgICAgIDogYmFzZSh0b3BOb2RlLCBucykgeworICAgIFJhbmdlID0gcmFuZ2U7CisgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3W10geworICAgICAgImZpbGwiLAorICAgICAgInN0cm9rZSIsCisgICAgICAic2hhZG93IiwKKyAgICAgICJwYXRoIiwKKyAgICAgICJ0ZXh0Ym94IiwKKyAgICAgICJDbGllbnREYXRhIiwKKyAgICAgICJNb3ZlV2l0aENlbGxzIiwKKyAgICAgICJTaXplV2l0aENlbGxzIiwKKyAgICAgICJBbmNob3IiLAorICAgICAgIkxvY2tlZCIsCisgICAgICAiQXV0b0ZpbGwiLAorICAgICAgIkxvY2tUZXh0IiwKKyAgICAgICJUZXh0SEFsaWduIiwKKyAgICAgICJUZXh0VkFsaWduIiwKKyAgICAgICJSb3ciLAorICAgICAgIkNvbHVtbiIsCisgICAgICAiVmlzaWJsZSIsCisgICAgfTsKKyAgfQogCi0gICAgICAgIGNvbnN0IHN0cmluZyBWRVJUSUNBTF9BTElHTk1FTlRfUEFUSD0ieDpDbGllbnREYXRhL3g6VGV4dFZBbGlnbiI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFZlcnRpY2FsIGFsaWdubWVudCBmb3IgdGV4dAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZVRleHRBbGlnblZlcnRpY2FsVm1sIFZlcnRpY2FsQWxpZ25tZW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoR2V0WG1sTm9kZVN0cmluZyhWRVJUSUNBTF9BTElHTk1FTlRfUEFUSCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlICJDZW50ZXIiOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVUZXh0QWxpZ25WZXJ0aWNhbFZtbC5DZW50ZXI7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgIkJvdHRvbSI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbGlnblZlcnRpY2FsVm1sLkJvdHRvbTsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlVGV4dEFsaWduVmVydGljYWxWbWwuVG9wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIGVUZXh0QWxpZ25WZXJ0aWNhbFZtbC5DZW50ZXI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFZFUlRJQ0FMX0FMSUdOTUVOVF9QQVRILCAiQ2VudGVyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBlVGV4dEFsaWduVmVydGljYWxWbWwuQm90dG9tOgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhWRVJUSUNBTF9BTElHTk1FTlRfUEFUSCwgIkJvdHRvbSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKFZFUlRJQ0FMX0FMSUdOTUVOVF9QQVRIKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgSE9SSVpPTlRBTF9BTElHTk1FTlRfUEFUSD0ieDpDbGllbnREYXRhL3g6VGV4dEhBbGlnbiI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEhvcml6b250YWwgYWxpZ25tZW50IGZvciB0ZXh0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlVGV4dEFsaWduSG9yaXpvbnRhbFZtbCBIb3Jpem9udGFsQWxpZ25tZW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoR2V0WG1sTm9kZVN0cmluZyhIT1JJWk9OVEFMX0FMSUdOTUVOVF9QQVRIKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgIkNlbnRlciI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbGlnbkhvcml6b250YWxWbWwuQ2VudGVyOwotICAgICAgICAgICAgICAgICAgICBjYXNlICJSaWdodCI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbGlnbkhvcml6b250YWxWbWwuUmlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVRleHRBbGlnbkhvcml6b250YWxWbWwuTGVmdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBlVGV4dEFsaWduSG9yaXpvbnRhbFZtbC5DZW50ZXI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEhPUklaT05UQUxfQUxJR05NRU5UX1BBVEgsICJDZW50ZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGVUZXh0QWxpZ25Ib3Jpem9udGFsVm1sLlJpZ2h0OgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhIT1JJWk9OVEFMX0FMSUdOTUVOVF9QQVRILCAiUmlnaHQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShIT1JJWk9OVEFMX0FMSUdOTUVOVF9QQVRIKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgVklTSUJMRV9QQVRIID0gIng6Q2xpZW50RGF0YS94OlZpc2libGUiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgZHJhd2luZyBvYmplY3QgaXMgdmlzaWJsZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgVmlzaWJsZSAKLSAgICAgICAgeyAKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKFZJU0lCTEVfUEFUSCwgTmFtZVNwYWNlTWFuYWdlcikhPW51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShWSVNJQkxFX1BBVEgpOwotICAgICAgICAgICAgICAgICAgICBTdHlsZSA9IFNldFN0eWxlKFN0eWxlLCJ2aXNpYmlsaXR5IiwgInZpc2libGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShWSVNJQkxFX1BBVEgpOwotICAgICAgICAgICAgICAgICAgICBTdHlsZSA9IFNldFN0eWxlKFN0eWxlLCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIEJBQ0tHUk9VTkRDT0xPUl9QQVRIID0gIkBmaWxsY29sb3IiOwotICAgICAgICBjb25zdCBzdHJpbmcgQkFDS0dST1VORENPTE9SMl9QQVRIID0gInY6ZmlsbC9AY29sb3IyIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQmFja2dyb3VuZCBjb2xvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgQ29sb3IgQmFja2dyb3VuZENvbG9yCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyBjb2wgPSBHZXRYbWxOb2RlU3RyaW5nKEJBQ0tHUk9VTkRDT0xPUl9QQVRIKTsKLSAgICAgICAgICAgICAgICBpZiAoY29sID09ICIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKDB4ZmYsIDB4ZmYsIDB4ZTEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihjb2wuU3RhcnRzV2l0aCgiIyIpKSBjb2w9Y29sLlN1YnN0cmluZygxLGNvbC5MZW5ndGgtMSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UoY29sLFN5c3RlbS5HbG9iYWxpemF0aW9uLk51bWJlclN0eWxlcy5BbGxvd0hleFNwZWNpZmllciwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IHJlcykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xvci5Gcm9tQXJnYihyZXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkVtcHR5OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGNvbG9yID0gIiMiICsgdmFsdWUuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKS5TdWJzdHJpbmcoMiwgNik7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhCQUNLR1JPVU5EQ09MT1JfUEFUSCwgY29sb3IpOwotICAgICAgICAgICAgICAgIC8vU2V0WG1sTm9kZShCQUNLR1JPVU5EQ09MT1IyX1BBVEgsIGNvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgTElORVNUWUxFX1BBVEg9InY6c3Ryb2tlL0BkYXNoc3R5bGUiOwotICAgICAgICBjb25zdCBzdHJpbmcgRU5EQ0FQX1BBVEggPSAidjpzdHJva2UvQGVuZGNhcCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIExpbmVzdHlsZSBmb3IgYm9yZGVyCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlTGluZVN0eWxlVm1sIExpbmVTdHlsZSAKLSAgICAgICAgeyAKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyB2PUdldFhtbE5vZGVTdHJpbmcoTElORVNUWUxFX1BBVEgpOwotICAgICAgICAgICAgICAgIGlmICh2ID09ICIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVMaW5lU3R5bGVWbWwuU29saWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHYgPT0gIjEgMSIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2ID0gR2V0WG1sTm9kZVN0cmluZyhFTkRDQVBfUEFUSCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUxpbmVTdHlsZVZtbClFbnVtLlBhcnNlKHR5cGVvZihlTGluZVN0eWxlVm1sKSwgdiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoZUxpbmVTdHlsZVZtbClFbnVtLlBhcnNlKHR5cGVvZihlTGluZVN0eWxlVm1sKSwgdiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IGVMaW5lU3R5bGVWbWwuUm91bmQgfHwgdmFsdWUgPT0gZUxpbmVTdHlsZVZtbC5TcXVhcmUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKExJTkVTVFlMRV9QQVRILCAiMSAxIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBlTGluZVN0eWxlVm1sLlJvdW5kKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEVORENBUF9QQVRILCAicm91bmQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoRU5EQ0FQX1BBVEgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZyB2ID0gdmFsdWUuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgdiA9IHYuU3Vic3RyaW5nKDAsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyB2LlN1YnN0cmluZygxLCB2Lkxlbmd0aCAtIDEpOwotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKExJTkVTVFlMRV9QQVRILCB2KTsKLSAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShFTkRDQVBfUEFUSCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBMSU5FQ09MT1JfUEFUSD0iQHN0cm9rZWNvbG9yIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTGluZSBjb2xvciAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIENvbG9yIExpbmVDb2xvcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgY29sID0gR2V0WG1sTm9kZVN0cmluZyhMSU5FQ09MT1JfUEFUSCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbCA9PSAiIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xvci5CbGFjazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbC5TdGFydHNXaXRoKCIjIikpIGNvbCA9IGNvbC5TdWJzdHJpbmcoMSwgY29sLkxlbmd0aCAtIDEpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmVzOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKGNvbCwgU3lzdGVtLkdsb2JhbGl6YXRpb24uTnVtYmVyU3R5bGVzLkFsbG93SGV4U3BlY2lmaWVyLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgcmVzKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sb3IuRW1wdHk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGNvbG9yID0gIiMiICsgdmFsdWUuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKS5TdWJzdHJpbmcoMiwgNik7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhMSU5FQ09MT1JfUEFUSCwgY29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBMSU5FV0lEVEhfUEFUSD0iQHN0cm9rZXdlaWdodCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdpZHRoIG9mIHRoZSBib3JkZXIKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIFNpbmdsZSBMaW5lV2lkdGggCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyB3dD1HZXRYbWxOb2RlU3RyaW5nKExJTkVXSURUSF9QQVRIKTsKLSAgICAgICAgICAgICAgICBpZiAod3QgPT0gIiIpIHJldHVybiAoU2luZ2xlKS43NTsKLSAgICAgICAgICAgICAgICBpZih3dC5FbmRzV2l0aCgicHQiKSkgd3Q9d3QuU3Vic3RyaW5nKDAsd3QuTGVuZ3RoLTIpOworICBpbnRlcm5hbCBFeGNlbFJhbmdlQmFzZSBSYW5nZSB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgICAgICAgICBTaW5nbGUgcmV0OwotICAgICAgICAgICAgICAgIGlmKFNpbmdsZS5UcnlQYXJzZSh3dCxTeXN0ZW0uR2xvYmFsaXphdGlvbi5OdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgcmV0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoTElORVdJRFRIX1BBVEgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgInB0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLy8vIFdpZHRoIG9mIHRoZSBDb21tZW50IAotICAgICAgICAvLy8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vcHVibGljIFNpbmdsZSBXaWR0aAotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgZ2V0Ci0gICAgICAgIC8vICAgIHsKLSAgICAgICAgLy8gICAgICAgIHN0cmluZyB2OwotICAgICAgICAvLyAgICAgICAgR2V0U3R5bGUoIndpZHRoIiwgb3V0IHYpOwotICAgICAgICAvLyAgICAgICAgaWYodi5FbmRzV2l0aCgicHQiKSkKLSAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICB2ID0gdi5TdWJzdHJpbmcoMCwgdi5MZW5ndGggLSAyKTsKLSAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgLy8gICAgICAgIHNob3J0IHJldDsKLSAgICAgICAgLy8gICAgICAgIGlmIChzaG9ydC5UcnlQYXJzZSh2LFN5c3RlbS5HbG9iYWxpemF0aW9uLk51bWJlclN0eWxlcy5BbnksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCByZXQpKQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8vICAgICAgICBlbHNlCi0gICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy8gICAgc2V0Ci0gICAgICAgIC8vICAgIHsKLSAgICAgICAgLy8gICAgICAgIFNldFN0eWxlKCJ3aWR0aCIsIHZhbHVlLlRvU3RyaW5nKCJOMiIsQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyAicHQiKTsKLSAgICAgICAgLy8gICAgfQotICAgICAgICAvL30KLSAgICAgICAgLy8vLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLy8vIEhlaWdodCBvZiB0aGUgQ29tbWVudCAKLSAgICAgICAgLy8vLy8gPC9zdW1tYXJ5PgotICAgICAgICAvL3B1YmxpYyBTaW5nbGUgSGVpZ2h0Ci0gICAgICAgIC8vewotICAgICAgICAvLyAgICBnZXQKLSAgICAgICAgLy8gICAgewotICAgICAgICAvLyAgICAgICAgc3RyaW5nIHY7Ci0gICAgICAgIC8vICAgICAgICBHZXRTdHlsZSgiaGVpZ2h0Iiwgb3V0IHYpOwotICAgICAgICAvLyAgICAgICAgaWYgKHYuRW5kc1dpdGgoInB0IikpCi0gICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgdiA9IHYuU3Vic3RyaW5nKDAsIHYuTGVuZ3RoIC0gMik7Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8vICAgICAgICBzaG9ydCByZXQ7Ci0gICAgICAgIC8vICAgICAgICBpZiAoc2hvcnQuVHJ5UGFyc2UodiwgU3lzdGVtLkdsb2JhbGl6YXRpb24uTnVtYmVyU3R5bGVzLkFueSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IHJldCkpCi0gICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgLy8gICAgICAgIGVsc2UKLSAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgLy8gICAgfQotICAgICAgICAvLyAgICBzZXQKLSAgICAgICAgLy8gICAgewotICAgICAgICAvLyAgICAgICAgU2V0U3R5bGUoImhlaWdodCIsIHZhbHVlLlRvU3RyaW5nKCJOMiIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgInB0Iik7Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy99Ci0gICAgICAgIGNvbnN0IHN0cmluZyBURVhUQk9YX1NUWUxFX1BBVEggPSAidjp0ZXh0Ym94L0BzdHlsZSI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEF1dG9maXRzIHRoZSBkcmF3aW5nb2JqZWN0IAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBBdXRvRml0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZTsKLSAgICAgICAgICAgICAgICBHZXRTdHlsZShHZXRYbWxOb2RlU3RyaW5nKFRFWFRCT1hfU1RZTEVfUEFUSCksICJtc28tZml0LXNoYXBlLXRvLXRleHQiLCBvdXQgdmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZT09InQiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVEVYVEJPWF9TVFlMRV9QQVRILCBTZXRTdHlsZShHZXRYbWxOb2RlU3RyaW5nKFRFWFRCT1hfU1RZTEVfUEFUSCksIm1zby1maXQtc2hhcGUtdG8tdGV4dCIsIHZhbHVlPyJ0IjoiIikpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIGNvbnN0IHN0cmluZyBMT0NLRURfUEFUSCA9ICJ4OkNsaWVudERhdGEveDpMb2NrZWQiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgb2JqZWN0IGlzIGxvY2tlZCB3aGVuIHRoZSBzaGVldCBpcyBwcm90ZWN0ZWQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgTG9ja2VkIAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woTE9DS0VEX1BBVEgsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKExPQ0tFRF9QQVRILCB2YWx1ZSwgZmFsc2UpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgTE9DS19URVhUX1BBVEggPSAieDpDbGllbnREYXRhL3g6TG9ja1RleHQiOyAgICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNwZWNpZmllcyB0aGF0IHRoZSBvYmplY3QncyB0ZXh0IGlzIGxvY2tlZAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBMb2NrVGV4dAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woTE9DS19URVhUX1BBVEgsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKExPQ0tfVEVYVF9QQVRILCB2YWx1ZSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsVm1sRHJhd2luZ1Bvc2l0aW9uIF9mcm9tID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRnJvbSBwb3NpdGlvbi4gRm9yIGNvbW1lbnRzIG9ubHkgd2hlbiBWaXNpYmxlPXRydWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFZtbERyYXdpbmdQb3NpdGlvbiBGcm9tCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZnJvbSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2Zyb20gPSBuZXcgRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24oTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJ4OkNsaWVudERhdGEiLCBOYW1lU3BhY2VNYW5hZ2VyKSwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfZnJvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbFZtbERyYXdpbmdQb3NpdGlvbiBfdG8gPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUbyBwb3NpdGlvbi4gRm9yIGNvbW1lbnRzIG9ubHkgd2hlbiBWaXNpYmxlPXRydWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFZtbERyYXdpbmdQb3NpdGlvbiBUbwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3RvID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfdG8gPSBuZXcgRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24oTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJ4OkNsaWVudERhdGEiLCBOYW1lU3BhY2VNYW5hZ2VyKSwgNCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfdG87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIFNUWUxFX1BBVEggPSAiQHN0eWxlIjsKLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFN0eWxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKFNUWUxFX1BBVEgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhTVFlMRV9QQVRILCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI3JlZ2lvbiBJUmFuZ2VJRCBNZW1iZXJzCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHJlc3MgaW4gdGhlIHdvcmtzaGVldAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIEFkZHJlc3MgPT4gUmFuZ2UuQWRkcmVzczsKIAotICAgICAgICB1bG9uZyBJUmFuZ2VJRC5SYW5nZUlECi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbENlbGxCYXNlLkdldENlbGxJRChSYW5nZS5Xb3Jrc2hlZXQuU2hlZXRJRCwgUmFuZ2UuU3RhcnQuUm93LCBSYW5nZS5TdGFydC5Db2x1bW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3ZlcnRpY2FsQWxpZ25tZW50UGF0aCA9ICJ4OkNsaWVudERhdGEveDpUZXh0VkFsaWduIjsKIAotICAgICAgICAjZW5kcmVnaW9uCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFZlcnRpY2FsIGFsaWdubWVudCBmb3IgdGV4dAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZVRleHRBbGlnblZlcnRpY2FsVm1sIFZlcnRpY2FsQWxpZ25tZW50IHsKKyAgICBnZXQgeworICAgICAgc3dpdGNoIChHZXRYbWxOb2RlU3RyaW5nKF92ZXJ0aWNhbEFsaWdubWVudFBhdGgpKSB7CisgICAgICAgIGNhc2UgIkNlbnRlciI6CisgICAgICAgICAgcmV0dXJuIGVUZXh0QWxpZ25WZXJ0aWNhbFZtbC5DZW50ZXI7CisgICAgICAgIGNhc2UgIkJvdHRvbSI6CisgICAgICAgICAgcmV0dXJuIGVUZXh0QWxpZ25WZXJ0aWNhbFZtbC5Cb3R0b207CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIGVUZXh0QWxpZ25WZXJ0aWNhbFZtbC5Ub3A7CisgICAgICB9CiAgICAgfQorICAgIHNldCB7CisgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgIGNhc2UgZVRleHRBbGlnblZlcnRpY2FsVm1sLkNlbnRlcjoKKyAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF92ZXJ0aWNhbEFsaWdubWVudFBhdGgsICJDZW50ZXIiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBlVGV4dEFsaWduVmVydGljYWxWbWwuQm90dG9tOgorICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3ZlcnRpY2FsQWxpZ25tZW50UGF0aCwgIkJvdHRvbSIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIERlbGV0ZU5vZGUoX3ZlcnRpY2FsQWxpZ25tZW50UGF0aCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2hvcml6b250YWxBbGlnbm1lbnRQYXRoID0gIng6Q2xpZW50RGF0YS94OlRleHRIQWxpZ24iOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEhvcml6b250YWwgYWxpZ25tZW50IGZvciB0ZXh0CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBlVGV4dEFsaWduSG9yaXpvbnRhbFZtbCBIb3Jpem9udGFsQWxpZ25tZW50IHsKKyAgICBnZXQgeworICAgICAgc3dpdGNoIChHZXRYbWxOb2RlU3RyaW5nKF9ob3Jpem9udGFsQWxpZ25tZW50UGF0aCkpIHsKKyAgICAgICAgY2FzZSAiQ2VudGVyIjoKKyAgICAgICAgICByZXR1cm4gZVRleHRBbGlnbkhvcml6b250YWxWbWwuQ2VudGVyOworICAgICAgICBjYXNlICJSaWdodCI6CisgICAgICAgICAgcmV0dXJuIGVUZXh0QWxpZ25Ib3Jpem9udGFsVm1sLlJpZ2h0OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBlVGV4dEFsaWduSG9yaXpvbnRhbFZtbC5MZWZ0OworICAgICAgfQorICAgIH0KKyAgICBzZXQgeworICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICBjYXNlIGVUZXh0QWxpZ25Ib3Jpem9udGFsVm1sLkNlbnRlcjoKKyAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9ob3Jpem9udGFsQWxpZ25tZW50UGF0aCwgIkNlbnRlciIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVUZXh0QWxpZ25Ib3Jpem9udGFsVm1sLlJpZ2h0OgorICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2hvcml6b250YWxBbGlnbm1lbnRQYXRoLCAiUmlnaHQiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBEZWxldGVOb2RlKF9ob3Jpem9udGFsQWxpZ25tZW50UGF0aCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3Zpc2libGVQYXRoID0gIng6Q2xpZW50RGF0YS94OlZpc2libGUiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElmIHRoZSBkcmF3aW5nIG9iamVjdCBpcyB2aXNpYmxlLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBWaXNpYmxlIHsKKyAgICBnZXQgeyByZXR1cm4gKFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfdmlzaWJsZVBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpICE9IG51bGwpOyB9CisgICAgc2V0IHsKKyAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICBDcmVhdGVOb2RlKF92aXNpYmxlUGF0aCk7CisgICAgICAgIFN0eWxlID0gU2V0U3R5bGUoU3R5bGUsICJ2aXNpYmlsaXR5IiwgInZpc2libGUiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERlbGV0ZU5vZGUoX3Zpc2libGVQYXRoKTsKKyAgICAgICAgU3R5bGUgPSBTZXRTdHlsZShTdHlsZSwgInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2JhY2tncm91bmRjb2xvclBhdGggPSAiQGZpbGxjb2xvciI7CisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9iYWNrZ3JvdW5kY29sb3IyUGF0aCA9ICJ2OmZpbGwvQGNvbG9yMiI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQmFja2dyb3VuZCBjb2xvcgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgQ29sb3IgQmFja2dyb3VuZENvbG9yIHsKKyAgICBnZXQgeworICAgICAgc3RyaW5nIGNvbCA9IEdldFhtbE5vZGVTdHJpbmcoX2JhY2tncm91bmRjb2xvclBhdGgpOworICAgICAgaWYgKGNvbCA9PSAiIikgeworICAgICAgICByZXR1cm4gQ29sb3IuRnJvbUFyZ2IoMHhmZiwgMHhmZiwgMHhlMSk7CisgICAgICB9CisgICAgICBpZiAoY29sLlN0YXJ0c1dpdGgoIiMiKSkgeworICAgICAgICBjb2wgPSBjb2wuU3Vic3RyaW5nKDEsIGNvbC5MZW5ndGggLSAxKTsKKyAgICAgIH0KKyAgICAgIGludCByZXM7CisgICAgICBpZiAoaW50LlRyeVBhcnNlKAorICAgICAgICAgIGNvbCwKKyAgICAgICAgICBOdW1iZXJTdHlsZXMuQWxsb3dIZXhTcGVjaWZpZXIsCisgICAgICAgICAgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwKKyAgICAgICAgICBvdXQgcmVzKSkgeworICAgICAgICByZXR1cm4gQ29sb3IuRnJvbUFyZ2IocmVzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDb2xvci5FbXB0eTsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0cmluZyBjb2xvciA9ICIjIiArIHZhbHVlLlRvQXJnYigpLlRvU3RyaW5nKCJYIikuU3Vic3RyaW5nKDIsIDYpOworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfYmFja2dyb3VuZGNvbG9yUGF0aCwgY29sb3IpOworICAgICAgLy9TZXRYbWxOb2RlKEJBQ0tHUk9VTkRDT0xPUjJfUEFUSCwgY29sb3IpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9saW5lc3R5bGVQYXRoID0gInY6c3Ryb2tlL0BkYXNoc3R5bGUiOworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZW5kY2FwUGF0aCA9ICJ2OnN0cm9rZS9AZW5kY2FwIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMaW5lc3R5bGUgZm9yIGJvcmRlcgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZUxpbmVTdHlsZVZtbCBMaW5lU3R5bGUgeworICAgIGdldCB7CisgICAgICBzdHJpbmcgdiA9IEdldFhtbE5vZGVTdHJpbmcoX2xpbmVzdHlsZVBhdGgpOworICAgICAgaWYgKHYgPT0gIiIpIHsKKyAgICAgICAgcmV0dXJuIGVMaW5lU3R5bGVWbWwuU29saWQ7CisgICAgICB9CisgICAgICBpZiAodiA9PSAiMSAxIikgeworICAgICAgICB2ID0gR2V0WG1sTm9kZVN0cmluZyhfZW5kY2FwUGF0aCk7CisgICAgICAgIHJldHVybiAoZUxpbmVTdHlsZVZtbClFbnVtLlBhcnNlKHR5cGVvZihlTGluZVN0eWxlVm1sKSwgdiwgdHJ1ZSk7CisgICAgICB9CisgICAgICByZXR1cm4gKGVMaW5lU3R5bGVWbWwpRW51bS5QYXJzZSh0eXBlb2YoZUxpbmVTdHlsZVZtbCksIHYsIHRydWUpOworICAgIH0KKyAgICBzZXQgeworICAgICAgaWYgKHZhbHVlID09IGVMaW5lU3R5bGVWbWwuUm91bmQgfHwgdmFsdWUgPT0gZUxpbmVTdHlsZVZtbC5TcXVhcmUpIHsKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbGluZXN0eWxlUGF0aCwgIjEgMSIpOworICAgICAgICBpZiAodmFsdWUgPT0gZUxpbmVTdHlsZVZtbC5Sb3VuZCkgeworICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2VuZGNhcFBhdGgsICJyb3VuZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIERlbGV0ZU5vZGUoX2VuZGNhcFBhdGgpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHJpbmcgdiA9IHZhbHVlLlRvU3RyaW5nKCk7CisgICAgICAgIHYgPSB2LlN1YnN0cmluZygwLCAxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgdi5TdWJzdHJpbmcoMSwgdi5MZW5ndGggLSAxKTsKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbGluZXN0eWxlUGF0aCwgdik7CisgICAgICAgIERlbGV0ZU5vZGUoX2VuZGNhcFBhdGgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9saW5lY29sb3JQYXRoID0gIkBzdHJva2Vjb2xvciI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTGluZSBjb2xvcgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgQ29sb3IgTGluZUNvbG9yIHsKKyAgICBnZXQgeworICAgICAgc3RyaW5nIGNvbCA9IEdldFhtbE5vZGVTdHJpbmcoX2xpbmVjb2xvclBhdGgpOworICAgICAgaWYgKGNvbCA9PSAiIikgeworICAgICAgICByZXR1cm4gQ29sb3IuQmxhY2s7CisgICAgICB9CisgICAgICBpZiAoY29sLlN0YXJ0c1dpdGgoIiMiKSkgeworICAgICAgICBjb2wgPSBjb2wuU3Vic3RyaW5nKDEsIGNvbC5MZW5ndGggLSAxKTsKKyAgICAgIH0KKyAgICAgIGludCByZXM7CisgICAgICBpZiAoaW50LlRyeVBhcnNlKAorICAgICAgICAgIGNvbCwKKyAgICAgICAgICBOdW1iZXJTdHlsZXMuQWxsb3dIZXhTcGVjaWZpZXIsCisgICAgICAgICAgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwKKyAgICAgICAgICBvdXQgcmVzKSkgeworICAgICAgICByZXR1cm4gQ29sb3IuRnJvbUFyZ2IocmVzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDb2xvci5FbXB0eTsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0cmluZyBjb2xvciA9ICIjIiArIHZhbHVlLlRvQXJnYigpLlRvU3RyaW5nKCJYIikuU3Vic3RyaW5nKDIsIDYpOworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbGluZWNvbG9yUGF0aCwgY29sb3IpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9saW5ld2lkdGhQYXRoID0gIkBzdHJva2V3ZWlnaHQiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFdpZHRoIG9mIHRoZSBib3JkZXIKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIFNpbmdsZSBMaW5lV2lkdGggeworICAgIGdldCB7CisgICAgICBzdHJpbmcgd3QgPSBHZXRYbWxOb2RlU3RyaW5nKF9saW5ld2lkdGhQYXRoKTsKKyAgICAgIGlmICh3dCA9PSAiIikgeworICAgICAgICByZXR1cm4gKFNpbmdsZSkuNzU7CisgICAgICB9CisgICAgICBpZiAod3QuRW5kc1dpdGgoInB0IikpIHsKKyAgICAgICAgd3QgPSB3dC5TdWJzdHJpbmcoMCwgd3QuTGVuZ3RoIC0gMik7CisgICAgICB9CisKKyAgICAgIFNpbmdsZSByZXQ7CisgICAgICBpZiAoU2luZ2xlLlRyeVBhcnNlKHd0LCBOdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgcmV0KSkgeworICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNldCB7IFNldFhtbE5vZGVTdHJpbmcoX2xpbmV3aWR0aFBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgInB0Iik7IH0KKyAgfQorCisgIC8vLy8vIDxzdW1tYXJ5PgorICAvLy8vLyBXaWR0aCBvZiB0aGUgQ29tbWVudAorICAvLy8vLyA8L3N1bW1hcnk+CisgIC8vcHVibGljIFNpbmdsZSBXaWR0aAorICAvL3sKKyAgLy8gICAgZ2V0CisgIC8vICAgIHsKKyAgLy8gICAgICAgIHN0cmluZyB2OworICAvLyAgICAgICAgR2V0U3R5bGUoIndpZHRoIiwgb3V0IHYpOworICAvLyAgICAgICAgaWYodi5FbmRzV2l0aCgicHQiKSkKKyAgLy8gICAgICAgIHsKKyAgLy8gICAgICAgICAgICB2ID0gdi5TdWJzdHJpbmcoMCwgdi5MZW5ndGggLSAyKTsKKyAgLy8gICAgICAgIH0KKyAgLy8gICAgICAgIHNob3J0IHJldDsKKyAgLy8gICAgICAgIGlmIChzaG9ydC5UcnlQYXJzZSh2LFN5c3RlbS5HbG9iYWxpemF0aW9uLk51bWJlclN0eWxlcy5BbnksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCByZXQpKQorICAvLyAgICAgICAgeworICAvLyAgICAgICAgICAgIHJldHVybiByZXQ7CisgIC8vICAgICAgICB9CisgIC8vICAgICAgICBlbHNlCisgIC8vICAgICAgICB7CisgIC8vICAgICAgICAgICAgcmV0dXJuIDA7CisgIC8vICAgICAgICB9CisgIC8vICAgIH0KKyAgLy8gICAgc2V0CisgIC8vICAgIHsKKyAgLy8gICAgICAgIFNldFN0eWxlKCJ3aWR0aCIsIHZhbHVlLlRvU3RyaW5nKCJOMiIsQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyAicHQiKTsKKyAgLy8gICAgfQorICAvL30KKyAgLy8vLy8gPHN1bW1hcnk+CisgIC8vLy8vIEhlaWdodCBvZiB0aGUgQ29tbWVudAorICAvLy8vLyA8L3N1bW1hcnk+CisgIC8vcHVibGljIFNpbmdsZSBIZWlnaHQKKyAgLy97CisgIC8vICAgIGdldAorICAvLyAgICB7CisgIC8vICAgICAgICBzdHJpbmcgdjsKKyAgLy8gICAgICAgIEdldFN0eWxlKCJoZWlnaHQiLCBvdXQgdik7CisgIC8vICAgICAgICBpZiAodi5FbmRzV2l0aCgicHQiKSkKKyAgLy8gICAgICAgIHsKKyAgLy8gICAgICAgICAgICB2ID0gdi5TdWJzdHJpbmcoMCwgdi5MZW5ndGggLSAyKTsKKyAgLy8gICAgICAgIH0KKyAgLy8gICAgICAgIHNob3J0IHJldDsKKyAgLy8gICAgICAgIGlmIChzaG9ydC5UcnlQYXJzZSh2LCBTeXN0ZW0uR2xvYmFsaXphdGlvbi5OdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgcmV0KSkKKyAgLy8gICAgICAgIHsKKyAgLy8gICAgICAgICAgICByZXR1cm4gcmV0OworICAvLyAgICAgICAgfQorICAvLyAgICAgICAgZWxzZQorICAvLyAgICAgICAgeworICAvLyAgICAgICAgICAgIHJldHVybiAwOworICAvLyAgICAgICAgfQorICAvLyAgICB9CisgIC8vICAgIHNldAorICAvLyAgICB7CisgIC8vICAgICAgICBTZXRTdHlsZSgiaGVpZ2h0IiwgdmFsdWUuVG9TdHJpbmcoIk4yIiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyAicHQiKTsKKyAgLy8gICAgfQorICAvL30KKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3RleHRib3hTdHlsZVBhdGggPSAidjp0ZXh0Ym94L0BzdHlsZSI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQXV0b2ZpdHMgdGhlIGRyYXdpbmdvYmplY3QKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQXV0b0ZpdCB7CisgICAgZ2V0IHsKKyAgICAgIHN0cmluZyB2YWx1ZTsKKyAgICAgIEdldFN0eWxlKEdldFhtbE5vZGVTdHJpbmcoX3RleHRib3hTdHlsZVBhdGgpLCAibXNvLWZpdC1zaGFwZS10by10ZXh0Iiwgb3V0IHZhbHVlKTsKKyAgICAgIHJldHVybiB2YWx1ZSA9PSAidCI7CisgICAgfQorICAgIHNldCB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgIF90ZXh0Ym94U3R5bGVQYXRoLAorICAgICAgICAgIFNldFN0eWxlKEdldFhtbE5vZGVTdHJpbmcoX3RleHRib3hTdHlsZVBhdGgpLCAibXNvLWZpdC1zaGFwZS10by10ZXh0IiwgdmFsdWUgPyAidCIgOiAiIikpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9sb2NrZWRQYXRoID0gIng6Q2xpZW50RGF0YS94OkxvY2tlZCI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhlIG9iamVjdCBpcyBsb2NrZWQgd2hlbiB0aGUgc2hlZXQgaXMgcHJvdGVjdGVkCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIExvY2tlZCB7CisgICAgZ2V0IHsgcmV0dXJuIEdldFhtbE5vZGVCb29sKF9sb2NrZWRQYXRoLCBmYWxzZSk7IH0KKyAgICBzZXQgeyBTZXRYbWxOb2RlQm9vbChfbG9ja2VkUGF0aCwgdmFsdWUsIGZhbHNlKTsgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2xvY2tUZXh0UGF0aCA9ICJ4OkNsaWVudERhdGEveDpMb2NrVGV4dCI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU3BlY2lmaWVzIHRoYXQgdGhlIG9iamVjdCdzIHRleHQgaXMgbG9ja2VkCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIExvY2tUZXh0IHsKKyAgICBnZXQgeyByZXR1cm4gR2V0WG1sTm9kZUJvb2woX2xvY2tUZXh0UGF0aCwgZmFsc2UpOyB9CisgICAgc2V0IHsgU2V0WG1sTm9kZUJvb2woX2xvY2tUZXh0UGF0aCwgdmFsdWUsIGZhbHNlKTsgfQorICB9CisKKyAgcHJpdmF0ZSBFeGNlbFZtbERyYXdpbmdQb3NpdGlvbiBfZnJvbTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBGcm9tIHBvc2l0aW9uLiBGb3IgY29tbWVudHMgb25seSB3aGVuIFZpc2libGU9dHJ1ZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsVm1sRHJhd2luZ1Bvc2l0aW9uIEZyb20geworICAgIGdldCB7CisgICAgICBpZiAoX2Zyb20gPT0gbnVsbCkgeworICAgICAgICBfZnJvbSA9IG5ldygKKyAgICAgICAgICAgIE5hbWVTcGFjZU1hbmFnZXIsCisgICAgICAgICAgICBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoIng6Q2xpZW50RGF0YSIsIE5hbWVTcGFjZU1hbmFnZXIpLAorICAgICAgICAgICAgMCk7CisgICAgICB9CisgICAgICByZXR1cm4gX2Zyb207CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBFeGNlbFZtbERyYXdpbmdQb3NpdGlvbiBfdG87CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVG8gcG9zaXRpb24uIEZvciBjb21tZW50cyBvbmx5IHdoZW4gVmlzaWJsZT10cnVlLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24gVG8geworICAgIGdldCB7CisgICAgICBpZiAoX3RvID09IG51bGwpIHsKKyAgICAgICAgX3RvID0gbmV3KE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgieDpDbGllbnREYXRhIiwgTmFtZVNwYWNlTWFuYWdlciksIDQpOworICAgICAgfQorICAgICAgcmV0dXJuIF90bzsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfc3R5bGVQYXRoID0gIkBzdHlsZSI7CisKKyAgaW50ZXJuYWwgc3RyaW5nIFN0eWxlIHsKKyAgICBnZXQgeyByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhfc3R5bGVQYXRoKTsgfQorICAgIHNldCB7IFNldFhtbE5vZGVTdHJpbmcoX3N0eWxlUGF0aCwgdmFsdWUpOyB9CisgIH0KKworICB1bG9uZyBJUmFuZ2VJZC5SYW5nZUlEIHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIEV4Y2VsQ2VsbEJhc2UuR2V0Q2VsbElkKFJhbmdlLldvcmtzaGVldC5TaGVldElELCBSYW5nZS5TdGFydC5Sb3csIFJhbmdlLlN0YXJ0LkNvbHVtbik7CisgICAgfQorICAgIHNldCB7fQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQ29tbWVudENvbGxlY3Rpb24uY3MgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nQ29tbWVudENvbGxlY3Rpb24uY3MKaW5kZXggMjdhZGQ5NS4uNmE5MDhlMyAxMDA2NDQKLS0tIGEvRVBQbHVzL0RyYXdpbmcvVm1sL0V4Y2VsVm1sRHJhd2luZ0NvbW1lbnRDb2xsZWN0aW9uLmNzCisrKyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdDb21tZW50Q29sbGVjdGlvbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTkzICsxMywxNzkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAxMC0wNi0wMQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5EcmF3aW5nLlZtbAotewotICAgIGludGVybmFsIGNsYXNzIEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnRDb2xsZWN0aW9uIDogRXhjZWxWbWxEcmF3aW5nQmFzZUNvbGxlY3Rpb24sIElFbnVtZXJhYmxlCi0gICAgewotICAgICAgICBpbnRlcm5hbCBSYW5nZUNvbGxlY3Rpb24gX2RyYXdpbmdzOwotICAgICAgICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdDb21tZW50Q29sbGVjdGlvbihFeGNlbFBhY2thZ2UgcGNrLCBFeGNlbFdvcmtzaGVldCB3cywgVXJpIHVyaSkgOgotICAgICAgICAgICAgYmFzZShwY2ssIHdzLHVyaSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZtbERyYXdpbmdYbWwuTG9hZFhtbChDcmVhdGVWbWxEcmF3aW5ncygpKTsKLSAgICAgICAgICAgICAgICBfZHJhd2luZ3MgPSBuZXcgUmFuZ2VDb2xsZWN0aW9uKG5ldyBMaXN0PElSYW5nZUlEPigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBZGREcmF3aW5nc0Zyb21YbWwod3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIEFkZERyYXdpbmdzRnJvbVhtbChFeGNlbFdvcmtzaGVldCB3cykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG5vZGVzID0gVm1sRHJhd2luZ1htbC5TZWxlY3ROb2RlcygiLy92OnNoYXBlIiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBMaXN0PElSYW5nZUlEPigpOwotICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBub2RlIGluIG5vZGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByb3dOb2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJ4OkNsaWVudERhdGEveDpSb3ciLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB2YXIgY29sTm9kZSA9IG5vZGUuU2VsZWN0U2luZ2xlTm9kZSgieDpDbGllbnREYXRhL3g6Q29sdW1uIiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgaWYgKHJvd05vZGUgIT0gbnVsbCAmJiBjb2xOb2RlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgcm93ID0gaW50LlBhcnNlKHJvd05vZGUuSW5uZXJUZXh0KSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBjb2wgPSBpbnQuUGFyc2UoY29sTm9kZS5Jbm5lclRleHQpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5BZGQobmV3IEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnQobm9kZSwgd3MuQ2VsbHNbcm93LCBjb2xdLCBOYW1lU3BhY2VNYW5hZ2VyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuQWRkKG5ldyBFeGNlbFZtbERyYXdpbmdDb21tZW50KG5vZGUsIHdzLkNlbGxzWzEsIDFdLCBOYW1lU3BhY2VNYW5hZ2VyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGlzdC5Tb3J0KG5ldyBDb21wYXJpc29uPElSYW5nZUlEPigocjEsIHIyKSA9PiAocjEuUmFuZ2VJRCA8IHIyLlJhbmdlSUQgPyAtMSA6IHIxLlJhbmdlSUQgPiByMi5SYW5nZUlEID8gMSA6IDApKSk7ICAvL1ZtbCBkcmF3aW5ncyBhcmUgbm90IHNvcnRlZC4gU29ydCB0byBhdm9pZCBtaXNzbWF0Y2hlcy4KLSAgICAgICAgICAgIF9kcmF3aW5ncyA9IG5ldyBSYW5nZUNvbGxlY3Rpb24obGlzdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgQ3JlYXRlVm1sRHJhd2luZ3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcgdm1sPXN0cmluZy5Gb3JtYXQoIjx4bWwgeG1sbnM6dj1cInswfVwiIHhtbG5zOm89XCJ7MX1cIiB4bWxuczp4PVwiezJ9XCI+IiwgCi0gICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLnNjaGVtYU1pY3Jvc29mdFZtbCwgCi0gICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLnNjaGVtYU1pY3Jvc29mdE9mZmljZSwgCi0gICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLnNjaGVtYU1pY3Jvc29mdEV4Y2VsKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgIHZtbCs9IjxvOnNoYXBlbGF5b3V0IHY6ZXh0PVwiZWRpdFwiPiI7Ci0gICAgICAgICAgICAgdm1sKz0iPG86aWRtYXAgdjpleHQ9XCJlZGl0XCIgZGF0YT1cIjFcIi8+IjsKLSAgICAgICAgICAgICB2bWwrPSI8L286c2hhcGVsYXlvdXQ+IjsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuVm1sOwogCi0gICAgICAgICAgICAgdm1sKz0iPHY6c2hhcGV0eXBlIGlkPVwiX3gwMDAwX3QyMDJcIiBjb29yZHNpemU9XCIyMTYwMCwyMTYwMFwiIG86c3B0PVwiMjAyXCIgcGF0aD1cIm0sbCwyMTYwMHIyMTYwMCxsMjE2MDAseGVcIj4iOwotICAgICAgICAgICAgIHZtbCs9Ijx2OnN0cm9rZSBqb2luc3R5bGU9XCJtaXRlclwiIC8+IjsKLSAgICAgICAgICAgICB2bWwrPSI8djpwYXRoIGdyYWRpZW50c2hhcGVvaz1cInRcIiBvOmNvbm5lY3R0eXBlPVwicmVjdFwiIC8+IjsKLSAgICAgICAgICAgICB2bWwrPSI8L3Y6c2hhcGV0eXBlPiI7Ci0gICAgICAgICAgICAgdm1sKz0gIjwveG1sPiI7CitpbnRlcm5hbCBjbGFzcyBFeGNlbFZtbERyYXdpbmdDb21tZW50Q29sbGVjdGlvbiA6IEV4Y2VsVm1sRHJhd2luZ0Jhc2VDb2xsZWN0aW9uLCBJRW51bWVyYWJsZSB7CisgIGludGVybmFsIFJhbmdlQ29sbGVjdGlvbiBfZHJhd2luZ3M7CiAKLSAgICAgICAgICAgIHJldHVybiB2bWw7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxWbWxEcmF3aW5nQ29tbWVudCBBZGQoRXhjZWxSYW5nZUJhc2UgY2VsbCkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sTm9kZSBub2RlID0gQWRkRHJhd2luZyhjZWxsKTsKLSAgICAgICAgICAgIHZhciBkcmF3ID0gbmV3IEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnQobm9kZSwgY2VsbCwgTmFtZVNwYWNlTWFuYWdlcik7ICAgICAgICAgICAgCi0gICAgICAgICAgICBfZHJhd2luZ3MuQWRkKGRyYXcpOwotICAgICAgICAgICAgcmV0dXJuIGRyYXc7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBYbWxOb2RlIEFkZERyYXdpbmcoRXhjZWxSYW5nZUJhc2UgY2VsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHJvdyA9IGNlbGwuU3RhcnQuUm93LCBjb2wgPSBjZWxsLlN0YXJ0LkNvbHVtbjsKLSAgICAgICAgICAgIHZhciBub2RlID0gVm1sRHJhd2luZ1htbC5DcmVhdGVFbGVtZW50KCJ2IiwgInNoYXBlIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1pY3Jvc29mdFZtbCk7Ci0KLSAgICAgICAgICAgIHZhciBpZCA9IEV4Y2VsQ2VsbEJhc2UuR2V0Q2VsbElEKGNlbGwuV29ya3NoZWV0LlNoZWV0SUQsIGNlbGwuX2Zyb21Sb3csIGNlbGwuX2Zyb21Db2wpOwotICAgICAgICAgICAgdmFyIGl4ID0gX2RyYXdpbmdzLkluZGV4T2YoaWQpOwotICAgICAgICAgICAgaWYgKGl4IDwgMCAmJiAofml4IDwgX2RyYXdpbmdzLkNvdW50KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpeCA9IH5peDsKLSAgICAgICAgICAgICAgICB2YXIgcHJldkRyYXcgPSBfZHJhd2luZ3NbaXhdIGFzIEV4Y2VsVm1sRHJhd2luZ0Jhc2U7Ci0gICAgICAgICAgICAgICAgcHJldkRyYXcuVG9wTm9kZS5QYXJlbnROb2RlLkluc2VydEJlZm9yZShub2RlLCBwcmV2RHJhdy5Ub3BOb2RlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWbWxEcmF3aW5nWG1sLkRvY3VtZW50RWxlbWVudC5BcHBlbmRDaGlsZChub2RlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbm9kZS5TZXRBdHRyaWJ1dGUoImlkIiwgR2V0TmV3SWQoKSk7Ci0gICAgICAgICAgICBub2RlLlNldEF0dHJpYnV0ZSgidHlwZSIsICIjX3gwMDAwX3QyMDIiKTsKLSAgICAgICAgICAgIG5vZGUuU2V0QXR0cmlidXRlKCJzdHlsZSIsICJwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjE7IHZpc2liaWxpdHk6aGlkZGVuIik7Ci0gICAgICAgICAgICAvL25vZGUuU2V0QXR0cmlidXRlKCJzdHlsZSIsICJwb3NpdGlvbjphYnNvbHV0ZTsgbWFyZ2luLWxlZnQ6NTkuMjVwdDttYXJnaW4tdG9wOjEuNXB0O3dpZHRoOjEwOHB0O2hlaWdodDo1OS4yNXB0O3otaW5kZXg6MTsgdmlzaWJpbGl0eTpoaWRkZW4iKTsgCi0gICAgICAgICAgICBub2RlLlNldEF0dHJpYnV0ZSgiZmlsbGNvbG9yIiwgIiNmZmZmZTEiKTsKLSAgICAgICAgICAgIG5vZGUuU2V0QXR0cmlidXRlKCJpbnNldG1vZGUiLEV4Y2VsUGFja2FnZS5zY2hlbWFNaWNyb3NvZnRPZmZpY2UsImF1dG8iKTsKLQotICAgICAgICAgICAgc3RyaW5nIHZtbCA9ICI8djpmaWxsIGNvbG9yMj1cIiNmZmZmZTFcIiAvPiI7Ci0gICAgICAgICAgICB2bWwgKz0gIjx2OnNoYWRvdyBvbj1cInRcIiBjb2xvcj1cImJsYWNrXCIgb2JzY3VyZWQ9XCJ0XCIgLz4iOwotICAgICAgICAgICAgdm1sICs9ICI8djpwYXRoIG86Y29ubmVjdHR5cGU9XCJub25lXCIgLz4iOwotICAgICAgICAgICAgdm1sICs9ICI8djp0ZXh0Ym94IHN0eWxlPVwibXNvLWRpcmVjdGlvbi1hbHQ6YXV0b1wiPiI7Ci0gICAgICAgICAgICB2bWwgKz0gIjxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOmxlZnRcIiAvPiI7Ci0gICAgICAgICAgICB2bWwgKz0gIjwvdjp0ZXh0Ym94PiI7Ci0gICAgICAgICAgICB2bWwgKz0gIjx4OkNsaWVudERhdGEgT2JqZWN0VHlwZT1cIk5vdGVcIj4iOwotICAgICAgICAgICAgdm1sICs9ICI8eDpNb3ZlV2l0aENlbGxzIC8+IjsKLSAgICAgICAgICAgIHZtbCArPSAiPHg6U2l6ZVdpdGhDZWxscyAvPiI7Ci0gICAgICAgICAgICB2bWwgKz0gc3RyaW5nLkZvcm1hdCgiPHg6QW5jaG9yPnswfSwgMTUsIHsxfSwgMiwgezJ9LCAzMSwgezN9LCAxPC94OkFuY2hvcj4iLCBjb2wsIHJvdyAtIDEsIGNvbCArIDIsIHJvdyArIDMpOwotICAgICAgICAgICAgdm1sICs9ICI8eDpBdXRvRmlsbD5GYWxzZTwveDpBdXRvRmlsbD4iOwotICAgICAgICAgICAgdm1sICs9IHN0cmluZy5Gb3JtYXQoIjx4OlJvdz57MH08L3g6Um93PiIsIHJvdyAtIDEpOyA7Ci0gICAgICAgICAgICB2bWwgKz0gc3RyaW5nLkZvcm1hdCgiPHg6Q29sdW1uPnswfTwveDpDb2x1bW4+IiwgY29sIC0gMSk7Ci0gICAgICAgICAgICB2bWwgKz0gIjwveDpDbGllbnREYXRhPiI7Ci0KLSAgICAgICAgICAgIG5vZGUuSW5uZXJYbWwgPSB2bWw7Ci0gICAgICAgICAgICByZXR1cm4gbm9kZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgX25leHRJRCA9IDA7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIHJldHVybnMgdGhlIG5leHQgZHJhd2luZyBpZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEdldE5ld0lkKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0SUQgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3JlYWNoIChFeGNlbFZtbERyYXdpbmdDb21tZW50IGRyYXcgaW4gdGhpcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkcmF3LklkLkxlbmd0aCA+IDMgJiYgZHJhdy5JZC5TdGFydHNXaXRoKCJ2bWwiKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludC5UcnlQYXJzZShkcmF3LklkLlN1YnN0cmluZygzLCBkcmF3LklkLkxlbmd0aCAtIDMpLCBvdXQgaWQpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCA+IF9uZXh0SUQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbmV4dElEID0gaWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX25leHRJRCsrOwotICAgICAgICAgICAgcmV0dXJuICJ2bWwiICsgX25leHRJRC5Ub1N0cmluZygpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsVm1sRHJhd2luZ0Jhc2UgdGhpc1t1bG9uZyByYW5nZUlEXQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2RyYXdpbmdzW3JhbmdlSURdIGFzIEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgYm9vbCBDb250YWluc0tleSh1bG9uZyByYW5nZUlEKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2RyYXdpbmdzLkNvbnRhaW5zS2V5KHJhbmdlSUQpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGludCBDb3VudAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2RyYXdpbmdzLkNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNyZWdpb24gSUVudW1lcmFibGUgTWVtYmVycwotCi0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3IgR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfZHJhd2luZ3M7Ci0gICAgICAgIH0KLQotICAgICAgICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9kcmF3aW5nczsKLSAgICAgICAgfQorICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdDb21tZW50Q29sbGVjdGlvbihFeGNlbFBhY2thZ2UgcGNrLCBFeGNlbFdvcmtzaGVldCB3cywgVXJpIHVyaSkKKyAgICAgIDogYmFzZShwY2ssIHdzLCB1cmkpIHsKKyAgICBpZiAodXJpID09IG51bGwpIHsKKyAgICAgIFZtbERyYXdpbmdYbWwuTG9hZFhtbChDcmVhdGVWbWxEcmF3aW5ncygpKTsKKyAgICAgIF9kcmF3aW5ncyA9IG5ldyhuZXcoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZERyYXdpbmdzRnJvbVhtbCh3cyk7CiAgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgQWRkRHJhd2luZ3NGcm9tWG1sKEV4Y2VsV29ya3NoZWV0IHdzKSB7CisgICAgdmFyIG5vZGVzID0gVm1sRHJhd2luZ1htbC5TZWxlY3ROb2RlcygiLy92OnNoYXBlIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgdmFyIGxpc3QgPSBuZXcgTGlzdDxJUmFuZ2VJZD4oKTsKKyAgICBmb3JlYWNoIChYbWxOb2RlIG5vZGUgaW4gbm9kZXMpIHsKKyAgICAgIHZhciByb3dOb2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJ4OkNsaWVudERhdGEveDpSb3ciLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgIHZhciBjb2xOb2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJ4OkNsaWVudERhdGEveDpDb2x1bW4iLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgIGlmIChyb3dOb2RlICE9IG51bGwgJiYgY29sTm9kZSAhPSBudWxsKSB7CisgICAgICAgIHZhciByb3cgPSBpbnQuUGFyc2Uocm93Tm9kZS5Jbm5lclRleHQpICsgMTsKKyAgICAgICAgdmFyIGNvbCA9IGludC5QYXJzZShjb2xOb2RlLklubmVyVGV4dCkgKyAxOworICAgICAgICBsaXN0LkFkZChuZXcgRXhjZWxWbWxEcmF3aW5nQ29tbWVudChub2RlLCB3cy5DZWxsc1tyb3csIGNvbF0sIE5hbWVTcGFjZU1hbmFnZXIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxpc3QuQWRkKG5ldyBFeGNlbFZtbERyYXdpbmdDb21tZW50KG5vZGUsIHdzLkNlbGxzWzEsIDFdLCBOYW1lU3BhY2VNYW5hZ2VyKSk7CisgICAgICB9CisgICAgfQorICAgIGxpc3QuU29ydCgocjEsIHIyKSA9PgorICAgICAgICAocjEuUmFuZ2VJRCA8IHIyLlJhbmdlSUQKKyAgICAgICAgICAgICAgICA/IC0xCisgICAgICAgICAgICAgICAgOiByMS5SYW5nZUlEID4gcjIuUmFuZ2VJRAorICAgICAgICAgICAgICAgICAgICA/IDEKKyAgICAgICAgICAgICAgICAgICAgOiAwKSk7IC8vVm1sIGRyYXdpbmdzIGFyZSBub3Qgc29ydGVkLiBTb3J0IHRvIGF2b2lkIG1pc3NtYXRjaGVzLgorICAgIF9kcmF3aW5ncyA9IG5ldyhsaXN0KTsKKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIENyZWF0ZVZtbERyYXdpbmdzKCkgeworICAgIHN0cmluZyB2bWwgPSBzdHJpbmcuRm9ybWF0KAorICAgICAgICAiPHhtbCB4bWxuczp2PVwiezB9XCIgeG1sbnM6bz1cInsxfVwiIHhtbG5zOng9XCJ7Mn1cIj4iLAorICAgICAgICBFeGNlbFBhY2thZ2UuX3NjaGVtYU1pY3Jvc29mdFZtbCwKKyAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFNaWNyb3NvZnRPZmZpY2UsCisgICAgICAgIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWljcm9zb2Z0RXhjZWwpOworCisgICAgdm1sICs9ICI8bzpzaGFwZWxheW91dCB2OmV4dD1cImVkaXRcIj4iOworICAgIHZtbCArPSAiPG86aWRtYXAgdjpleHQ9XCJlZGl0XCIgZGF0YT1cIjFcIi8+IjsKKyAgICB2bWwgKz0gIjwvbzpzaGFwZWxheW91dD4iOworCisgICAgdm1sICs9CisgICAgICAgICI8djpzaGFwZXR5cGUgaWQ9XCJfeDAwMDBfdDIwMlwiIGNvb3Jkc2l6ZT1cIjIxNjAwLDIxNjAwXCIgbzpzcHQ9XCIyMDJcIiBwYXRoPVwibSxsLDIxNjAwcjIxNjAwLGwyMTYwMCx4ZVwiPiI7CisgICAgdm1sICs9ICI8djpzdHJva2Ugam9pbnN0eWxlPVwibWl0ZXJcIiAvPiI7CisgICAgdm1sICs9ICI8djpwYXRoIGdyYWRpZW50c2hhcGVvaz1cInRcIiBvOmNvbm5lY3R0eXBlPVwicmVjdFwiIC8+IjsKKyAgICB2bWwgKz0gIjwvdjpzaGFwZXR5cGU+IjsKKyAgICB2bWwgKz0gIjwveG1sPiI7CisKKyAgICByZXR1cm4gdm1sOworICB9CisKKyAgaW50ZXJuYWwgRXhjZWxWbWxEcmF3aW5nQ29tbWVudCBBZGQoRXhjZWxSYW5nZUJhc2UgY2VsbCkgeworICAgIFhtbE5vZGUgbm9kZSA9IEFkZERyYXdpbmcoY2VsbCk7CisgICAgdmFyIGRyYXcgPSBuZXcgRXhjZWxWbWxEcmF3aW5nQ29tbWVudChub2RlLCBjZWxsLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBfZHJhd2luZ3MuQWRkKGRyYXcpOworICAgIHJldHVybiBkcmF3OworICB9CisKKyAgcHJpdmF0ZSBYbWxOb2RlIEFkZERyYXdpbmcoRXhjZWxSYW5nZUJhc2UgY2VsbCkgeworICAgIGludCByb3cgPSBjZWxsLlN0YXJ0LlJvdywKKyAgICAgICAgY29sID0gY2VsbC5TdGFydC5Db2x1bW47CisgICAgdmFyIG5vZGUgPSBWbWxEcmF3aW5nWG1sLkNyZWF0ZUVsZW1lbnQoInYiLCAic2hhcGUiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1pY3Jvc29mdFZtbCk7CisKKyAgICB2YXIgaWQgPSBFeGNlbENlbGxCYXNlLkdldENlbGxJZChjZWxsLldvcmtzaGVldC5TaGVldElELCBjZWxsLl9mcm9tUm93LCBjZWxsLl9mcm9tQ29sKTsKKyAgICB2YXIgaXggPSBfZHJhd2luZ3MuSW5kZXhPZihpZCk7CisgICAgaWYgKGl4IDwgMCAmJiAofml4IDwgX2RyYXdpbmdzLkNvdW50KSkgeworICAgICAgaXggPSB+aXg7CisgICAgICB2YXIgcHJldkRyYXcgPSBfZHJhd2luZ3NbaXhdIGFzIEV4Y2VsVm1sRHJhd2luZ0Jhc2U7CisgICAgICBwcmV2RHJhdy5Ub3BOb2RlLlBhcmVudE5vZGUuSW5zZXJ0QmVmb3JlKG5vZGUsIHByZXZEcmF3LlRvcE5vZGUpOworICAgIH0gZWxzZSB7CisgICAgICBWbWxEcmF3aW5nWG1sLkRvY3VtZW50RWxlbWVudC5BcHBlbmRDaGlsZChub2RlKTsKKyAgICB9CisKKyAgICBub2RlLlNldEF0dHJpYnV0ZSgiaWQiLCBHZXROZXdJZCgpKTsKKyAgICBub2RlLlNldEF0dHJpYnV0ZSgidHlwZSIsICIjX3gwMDAwX3QyMDIiKTsKKyAgICBub2RlLlNldEF0dHJpYnV0ZSgic3R5bGUiLCAicG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxOyB2aXNpYmlsaXR5OmhpZGRlbiIpOworICAgIC8vbm9kZS5TZXRBdHRyaWJ1dGUoInN0eWxlIiwgInBvc2l0aW9uOmFic29sdXRlOyBtYXJnaW4tbGVmdDo1OS4yNXB0O21hcmdpbi10b3A6MS41cHQ7d2lkdGg6MTA4cHQ7aGVpZ2h0OjU5LjI1cHQ7ei1pbmRleDoxOyB2aXNpYmlsaXR5OmhpZGRlbiIpOworICAgIG5vZGUuU2V0QXR0cmlidXRlKCJmaWxsY29sb3IiLCAiI2ZmZmZlMSIpOworICAgIG5vZGUuU2V0QXR0cmlidXRlKCJpbnNldG1vZGUiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1pY3Jvc29mdE9mZmljZSwgImF1dG8iKTsKKworICAgIHN0cmluZyB2bWwgPSAiPHY6ZmlsbCBjb2xvcjI9XCIjZmZmZmUxXCIgLz4iOworICAgIHZtbCArPSAiPHY6c2hhZG93IG9uPVwidFwiIGNvbG9yPVwiYmxhY2tcIiBvYnNjdXJlZD1cInRcIiAvPiI7CisgICAgdm1sICs9ICI8djpwYXRoIG86Y29ubmVjdHR5cGU9XCJub25lXCIgLz4iOworICAgIHZtbCArPSAiPHY6dGV4dGJveCBzdHlsZT1cIm1zby1kaXJlY3Rpb24tYWx0OmF1dG9cIj4iOworICAgIHZtbCArPSAiPGRpdiBzdHlsZT1cInRleHQtYWxpZ246bGVmdFwiIC8+IjsKKyAgICB2bWwgKz0gIjwvdjp0ZXh0Ym94PiI7CisgICAgdm1sICs9ICI8eDpDbGllbnREYXRhIE9iamVjdFR5cGU9XCJOb3RlXCI+IjsKKyAgICB2bWwgKz0gIjx4Ok1vdmVXaXRoQ2VsbHMgLz4iOworICAgIHZtbCArPSAiPHg6U2l6ZVdpdGhDZWxscyAvPiI7CisgICAgdm1sICs9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICI8eDpBbmNob3I+ezB9LCAxNSwgezF9LCAyLCB7Mn0sIDMxLCB7M30sIDE8L3g6QW5jaG9yPiIsCisgICAgICAgIGNvbCwKKyAgICAgICAgcm93IC0gMSwKKyAgICAgICAgY29sICsgMiwKKyAgICAgICAgcm93ICsgMyk7CisgICAgdm1sICs9ICI8eDpBdXRvRmlsbD5GYWxzZTwveDpBdXRvRmlsbD4iOworICAgIHZtbCArPSBzdHJpbmcuRm9ybWF0KCI8eDpSb3c+ezB9PC94OlJvdz4iLCByb3cgLSAxKTsKKyAgICA7CisgICAgdm1sICs9IHN0cmluZy5Gb3JtYXQoIjx4OkNvbHVtbj57MH08L3g6Q29sdW1uPiIsIGNvbCAtIDEpOworICAgIHZtbCArPSAiPC94OkNsaWVudERhdGE+IjsKKworICAgIG5vZGUuSW5uZXJYbWwgPSB2bWw7CisgICAgcmV0dXJuIG5vZGU7CisgIH0KKworICBwcml2YXRlIGludCBfbmV4dElEOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIHJldHVybnMgdGhlIG5leHQgZHJhd2luZyBpZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgaW50ZXJuYWwgc3RyaW5nIEdldE5ld0lkKCkgeworICAgIGlmIChfbmV4dElEID09IDApIHsKKyAgICAgIGZvcmVhY2ggKEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnQgZHJhdyBpbiB0aGlzKSB7CisgICAgICAgIGlmIChkcmF3LklkLkxlbmd0aCA+IDMgJiYgZHJhdy5JZC5TdGFydHNXaXRoKCJ2bWwiKSkgeworICAgICAgICAgIGludCBpZDsKKyAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKGRyYXcuSWQuU3Vic3RyaW5nKDMsIGRyYXcuSWQuTGVuZ3RoIC0gMyksIG91dCBpZCkpIHsKKyAgICAgICAgICAgIGlmIChpZCA+IF9uZXh0SUQpIHsKKyAgICAgICAgICAgICAgX25leHRJRCA9IGlkOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBfbmV4dElEKys7CisgICAgcmV0dXJuICJ2bWwiICsgX25leHRJRDsKKyAgfQorCisgIGludGVybmFsIEV4Y2VsVm1sRHJhd2luZ0Jhc2UgdGhpc1t1bG9uZyByYW5nZUlkXSA9PiBfZHJhd2luZ3NbcmFuZ2VJZF0gYXMgRXhjZWxWbWxEcmF3aW5nQ29tbWVudDsKKworICBpbnRlcm5hbCBib29sIENvbnRhaW5zS2V5KHVsb25nIHJhbmdlSWQpIHsKKyAgICByZXR1cm4gX2RyYXdpbmdzLkNvbnRhaW5zS2V5KHJhbmdlSWQpOworICB9CisKKyAgaW50ZXJuYWwgaW50IENvdW50IHsKKyAgICBnZXQgeyByZXR1cm4gX2RyYXdpbmdzLkNvdW50OyB9CisgIH0KKworICBwdWJsaWMgSUVudW1lcmF0b3IgR2V0RW51bWVyYXRvcigpIHsKKyAgICByZXR1cm4gX2RyYXdpbmdzOworICB9CisKKyAgSUVudW1lcmF0b3IgSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpIHsKKyAgICByZXR1cm4gX2RyYXdpbmdzOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24uY3MgYi9FUFBsdXMvRHJhd2luZy9WbWwvRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24uY3MKaW5kZXggYmQzZDFiNC4uNzU1ZmFkMCAxMDA2NDQKLS0tIGEvRVBQbHVzL0RyYXdpbmcvVm1sL0V4Y2VsVm1sRHJhd2luZ1Bvc2l0aW9uLmNzCisrKyBiL0VQUGx1cy9EcmF3aW5nL1ZtbC9FeGNlbFZtbERyYXdpbmdQb3NpdGlvbi5jcwpAQCAtMTMsMTIxICsxMyw5MSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDEwLTA2LTAxCiAgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uWG1sOwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWwKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoZSBwb3NpdGlvbiBvZiBhIFZNTCBkcmF3aW5nLiBVc2VkIGZvciBjb21tZW50cwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsVm1sRHJhd2luZ1Bvc2l0aW9uIDogWG1sSGVscGVyCi0gICAgewotICAgICAgICBpbnQgX3N0YXJ0UG9zOwotICAgICAgICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdQb3NpdGlvbihYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIHRvcE5vZGUsIGludCBzdGFydFBvcykgOiAKLSAgICAgICAgICAgIGJhc2UobnMsIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9zdGFydFBvcyA9IHN0YXJ0UG9zOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJvdy4gWmVybyBiYXNlZAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IFJvdwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0TnVtYmVyKDIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0TnVtYmVyKDIsIHZhbHVlKTsKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUm93IG9mZnNldCBpbiBwaXhlbHMuIFplcm8gYmFzZWQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBSb3dPZmZzZXQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldE51bWJlcigzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldE51bWJlcigzLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29sdW1uLiBaZXJvIGJhc2VkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgQ29sdW1uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXROdW1iZXIoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXROdW1iZXIoMCwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbHVtbiBvZmZzZXQuIFplcm8gYmFzZWQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBDb2x1bW5PZmZzZXQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldE51bWJlcigxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldE51bWJlcigxLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldE51bWJlcihpbnQgcG9zLCBpbnQgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBhbmNob3IgPSBHZXRYbWxOb2RlU3RyaW5nKCJ4OkFuY2hvciIpOwotICAgICAgICAgICAgc3RyaW5nW10gbnVtYmVycyA9IGFuY2hvci5TcGxpdCgnLCcpOwotICAgICAgICAgICAgaWYgKG51bWJlcnMuTGVuZ3RoID09IDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbnVtYmVyc1tfc3RhcnRQb3MgKyBwb3NdID0gdmFsdWUuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiQW5jaG9yIGVsZW1lbnQgaXMgaW52YWxpZCBpbiB2bWxEcmF3aW5nIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygieDpBbmNob3IiLCBzdHJpbmcuSm9pbigiLCIsbnVtYmVycykpOwotICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBpbnQgR2V0TnVtYmVyKGludCBwb3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBhbmNob3IgPSBHZXRYbWxOb2RlU3RyaW5nKCJ4OkFuY2hvciIpOwotICAgICAgICAgICAgc3RyaW5nW10gbnVtYmVycyA9IGFuY2hvci5TcGxpdCgnLCcpOwotICAgICAgICAgICAgaWYgKG51bWJlcnMuTGVuZ3RoID09IDgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHJldDsKLSAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKG51bWJlcnNbX3N0YXJ0UG9zICsgcG9zXSwgb3V0IHJldCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93KG5ldyBFeGNlcHRpb24oIkFuY2hvciBlbGVtZW50IGlzIGludmFsaWQgaW4gdm1sRHJhd2luZyIpKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWw7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBUaGUgcG9zaXRpb24gb2YgYSBWTUwgZHJhd2luZy4gVXNlZCBmb3IgY29tbWVudHMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24gOiBYbWxIZWxwZXIgeworICBwcml2YXRlIGludCBfc3RhcnRQb3M7CisKKyAgaW50ZXJuYWwgRXhjZWxWbWxEcmF3aW5nUG9zaXRpb24oWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLCBpbnQgc3RhcnRQb3MpCisgICAgICA6IGJhc2UobnMsIHRvcE5vZGUpIHsKKyAgICBfc3RhcnRQb3MgPSBzdGFydFBvczsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJvdy4gWmVybyBiYXNlZAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IFJvdyB7CisgICAgZ2V0ID0+IEdldE51bWJlcigyKTsKKyAgICBzZXQgPT4gU2V0TnVtYmVyKDIsIHZhbHVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJvdyBvZmZzZXQgaW4gcGl4ZWxzLiBaZXJvIGJhc2VkCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgUm93T2Zmc2V0IHsKKyAgICBnZXQgPT4gR2V0TnVtYmVyKDMpOworICAgIHNldCA9PiBTZXROdW1iZXIoMywgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29sdW1uLiBaZXJvIGJhc2VkCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgQ29sdW1uIHsKKyAgICBnZXQgPT4gR2V0TnVtYmVyKDApOworICAgIHNldCA9PiBTZXROdW1iZXIoMCwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29sdW1uIG9mZnNldC4gWmVybyBiYXNlZAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IENvbHVtbk9mZnNldCB7CisgICAgZ2V0ID0+IEdldE51bWJlcigxKTsKKyAgICBzZXQgPT4gU2V0TnVtYmVyKDEsIHZhbHVlKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBTZXROdW1iZXIoaW50IHBvcywgaW50IHZhbHVlKSB7CisgICAgc3RyaW5nIGFuY2hvciA9IEdldFhtbE5vZGVTdHJpbmcoIng6QW5jaG9yIik7CisgICAgc3RyaW5nW10gbnVtYmVycyA9IGFuY2hvci5TcGxpdCgnLCcpOworICAgIGlmIChudW1iZXJzLkxlbmd0aCA9PSA4KSB7CisgICAgICBudW1iZXJzW19zdGFydFBvcyArIHBvc10gPSB2YWx1ZS5Ub1N0cmluZygpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyAobmV3KCJBbmNob3IgZWxlbWVudCBpcyBpbnZhbGlkIGluIHZtbERyYXdpbmciKSk7CiAgICAgfQorICAgIFNldFhtbE5vZGVTdHJpbmcoIng6QW5jaG9yIiwgc3RyaW5nLkpvaW4oIiwiLCBudW1iZXJzKSk7CisgIH0KKworICBwcml2YXRlIGludCBHZXROdW1iZXIoaW50IHBvcykgeworICAgIHN0cmluZyBhbmNob3IgPSBHZXRYbWxOb2RlU3RyaW5nKCJ4OkFuY2hvciIpOworICAgIHN0cmluZ1tdIG51bWJlcnMgPSBhbmNob3IuU3BsaXQoJywnKTsKKyAgICBpZiAobnVtYmVycy5MZW5ndGggPT0gOCkgeworICAgICAgaW50IHJldDsKKyAgICAgIGlmIChpbnQuVHJ5UGFyc2UobnVtYmVyc1tfc3RhcnRQb3MgKyBwb3NdLCBvdXQgcmV0KSkgeworICAgICAgICByZXR1cm4gcmV0OworICAgICAgfQorICAgIH0KKyAgICB0aHJvdyAobmV3KCJBbmNob3IgZWxlbWVudCBpcyBpbnZhbGlkIGluIHZtbERyYXdpbmciKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9FUFBsdXNTREsuY3Nwcm9qIGIvRVBQbHVzL0VQUGx1c1NESy5jc3Byb2oKaW5kZXggYzgxZmU5YS4uMDBmMTllZCAxMDA2NDQKLS0tIGEvRVBQbHVzL0VQUGx1c1NESy5jc3Byb2oKKysrIGIvRVBQbHVzL0VQUGx1c1NESy5jc3Byb2oKQEAgLTEwLDExICsxMCwxMSBAQAogICAgIDxJbXBsaWNpdFVzaW5ncz5kaXNhYmxlPC9JbXBsaWNpdFVzaW5ncz4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5DU2hhcnAiIFZlcnNpb249IjQuNy4wIiAvPgotICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5Db2RlRG9tIiBWZXJzaW9uPSI1LjAuMCIgLz4KLSAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uRHJhd2luZy5Db21tb24iIFZlcnNpb249IjYuMC4wIiAvPgotICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuUGtjcyIgVmVyc2lvbj0iNS4wLjEiIC8+Ci0gICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlNlY3VyaXR5LlBlcm1pc3Npb25zIiBWZXJzaW9uPSI1LjAuMCIgLz4KLSAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uVGV4dC5FbmNvZGluZy5Db2RlUGFnZXMiIFZlcnNpb249IjUuMC4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5DU2hhcnAiIFZlcnNpb249IjQuNy4wIi8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkNvZGVEb20iIFZlcnNpb249IjUuMC4wIi8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLkRyYXdpbmcuQ29tbW9uIiBWZXJzaW9uPSI2LjAuMCIvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5TZWN1cml0eS5DcnlwdG9ncmFwaHkuUGtjcyIgVmVyc2lvbj0iNS4wLjEiLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uU2VjdXJpdHkuUGVybWlzc2lvbnMiIFZlcnNpb249IjUuMC4wIi8+CisgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlRleHQuRW5jb2RpbmcuQ29kZVBhZ2VzIiBWZXJzaW9uPSI1LjAuMCIvPgogICA8L0l0ZW1Hcm91cD4KIDwvUHJvamVjdD4KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbEFkZHJlc3MuY3MgYi9FUFBsdXMvRXhjZWxBZGRyZXNzLmNzCmluZGV4IDcwZjMwMTIuLjU0ZTU0NjAgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9FeGNlbEFkZHJlc3MuY3MKKysrIGIvRVBQbHVzL0V4Y2VsQWRkcmVzcy5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTQxNCArMTMsMTM0MiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTE4LU1BUi0yMDEwCiAgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCi17Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsVGFibGVBZGRyZXNzCi0gICAgewotICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQotICAgICAgICBwdWJsaWMgc3RyaW5nIENvbHVtblNwYW4geyBnZXQ7IHNldDsgfQotICAgICAgICBwdWJsaWMgYm9vbCBJc0FsbCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIHB1YmxpYyBib29sIElzSGVhZGVyIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgcHVibGljIGJvb2wgSXNEYXRhIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgcHVibGljIGJvb2wgSXNUb3RhbHMgeyBnZXQ7IHNldDsgfQotICAgICAgICBwdWJsaWMgYm9vbCBJc1RoaXNSb3cgeyBnZXQ7IHNldDsgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWw7CisKK3B1YmxpYyBjbGFzcyBFeGNlbFRhYmxlQWRkcmVzcyB7CisgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9CisKKyAgcHVibGljIHN0cmluZyBDb2x1bW5TcGFuIHsgZ2V0OyBzZXQ7IH0KKworICBwdWJsaWMgYm9vbCBJc0FsbCB7IGdldDsgc2V0OyB9CisKKyAgcHVibGljIGJvb2wgSXNIZWFkZXIgeyBnZXQ7IHNldDsgfQorCisgIHB1YmxpYyBib29sIElzRGF0YSB7IGdldDsgc2V0OyB9CisKKyAgcHVibGljIGJvb2wgSXNUb3RhbHMgeyBnZXQ7IHNldDsgfQorCisgIHB1YmxpYyBib29sIElzVGhpc1JvdyB7IGdldDsgc2V0OyB9Cit9CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBBIHJhbmdlIGFkZHJlc3MKKy8vLyA8L3N1bW1hcnk+CisvLy8gPHJlbWFya3M+RXhhbXBsZXMgb2YgYWRkcmVzc2VzIGFyZSAiQTEiICJCMTpDMiIgIkE6QSIgIjE6MSIgIkExOkUyLEczOkc1IiA8L3JlbWFya3M+CitwdWJsaWMgY2xhc3MgRXhjZWxBZGRyZXNzQmFzZSA6IEV4Y2VsQ2VsbEJhc2UgeworICBwcm90ZWN0ZWQgaW50ZXJuYWwgaW50IF9mcm9tUm93ID0gLTEsCisgICAgICBfdG9Sb3csCisgICAgICBfZnJvbUNvbCwKKyAgICAgIF90b0NvbDsKKyAgcHJvdGVjdGVkIGludGVybmFsIGJvb2wgX2Zyb21Sb3dGaXhlZCwKKyAgICAgIF9mcm9tQ29sRml4ZWQsCisgICAgICBfdG9Sb3dGaXhlZCwKKyAgICAgIF90b0NvbEZpeGVkOworICBwcm90ZWN0ZWQgaW50ZXJuYWwgc3RyaW5nIF93YjsKKyAgcHJvdGVjdGVkIGludGVybmFsIHN0cmluZyBfd3M7CisgIHByb3RlY3RlZCBpbnRlcm5hbCBzdHJpbmcgX2FkZHJlc3M7CisKKyAgcHJvdGVjdGVkIGludGVybmFsIGV2ZW50IEV2ZW50SGFuZGxlciBBZGRyZXNzQ2hhbmdlOworCisgIGludGVybmFsIGVudW0gZUFkZHJlc3NDb2xsaXRpb24geworICAgIE5vLAorICAgIFBhcnRseSwKKyAgICBJbnNpZGUsCisgICAgRXF1YWwsCisgIH0KKworICBpbnRlcm5hbCBlbnVtIGVTaGlmdFR5cGUgeworICAgIFJpZ2h0LAorICAgIERvd24sCisgICAgRW50aXJlUm93LAorICAgIEVudGlyZUNvbHVtbiwKKyAgfQorCisgIGludGVybmFsIEV4Y2VsQWRkcmVzc0Jhc2UoKSB7fQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENyZWF0ZXMgYW4gQWRkcmVzcyBvYmplY3QKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmcm9tUm93Ij5zdGFydCByb3c8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImZyb21Db2wiPnN0YXJ0IGNvbHVtbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idG9Sb3ciPkVuZCByb3c8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InRvQ29sdW1uIj5FbmQgY29sdW1uPC9wYXJhbT4KKyAgcHVibGljIEV4Y2VsQWRkcmVzc0Jhc2UoaW50IGZyb21Sb3csIGludCBmcm9tQ29sLCBpbnQgdG9Sb3csIGludCB0b0NvbHVtbikgeworICAgIF9mcm9tUm93ID0gZnJvbVJvdzsKKyAgICBfdG9Sb3cgPSB0b1JvdzsKKyAgICBfZnJvbUNvbCA9IGZyb21Db2w7CisgICAgX3RvQ29sID0gdG9Db2x1bW47CisgICAgVmFsaWRhdGUoKTsKKworICAgIF9hZGRyZXNzID0gR2V0QWRkcmVzcyhfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENyZWF0ZXMgYW4gQWRkcmVzcyBvYmplY3QKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmcm9tUm93Ij5zdGFydCByb3c8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImZyb21Db2wiPnN0YXJ0IGNvbHVtbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idG9Sb3ciPkVuZCByb3c8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InRvQ29sdW1uIj5FbmQgY29sdW1uPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmcm9tUm93Rml4ZWQiPnN0YXJ0IHJvdyBmaXhlZDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZnJvbUNvbEZpeGVkIj5zdGFydCBjb2x1bW4gZml4ZWQ8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InRvUm93Rml4ZWQiPkVuZCByb3cgZml4ZWQ8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InRvQ29sRml4ZWQiPkVuZCBjb2x1bW4gZml4ZWQ8L3BhcmFtPgorICBwdWJsaWMgRXhjZWxBZGRyZXNzQmFzZSgKKyAgICAgIGludCBmcm9tUm93LAorICAgICAgaW50IGZyb21Db2wsCisgICAgICBpbnQgdG9Sb3csCisgICAgICBpbnQgdG9Db2x1bW4sCisgICAgICBib29sIGZyb21Sb3dGaXhlZCwKKyAgICAgIGJvb2wgZnJvbUNvbEZpeGVkLAorICAgICAgYm9vbCB0b1Jvd0ZpeGVkLAorICAgICAgYm9vbCB0b0NvbEZpeGVkKSB7CisgICAgX2Zyb21Sb3cgPSBmcm9tUm93OworICAgIF90b1JvdyA9IHRvUm93OworICAgIF9mcm9tQ29sID0gZnJvbUNvbDsKKyAgICBfdG9Db2wgPSB0b0NvbHVtbjsKKyAgICBfZnJvbVJvd0ZpeGVkID0gZnJvbVJvd0ZpeGVkOworICAgIF9mcm9tQ29sRml4ZWQgPSBmcm9tQ29sRml4ZWQ7CisgICAgX3RvUm93Rml4ZWQgPSB0b1Jvd0ZpeGVkOworICAgIF90b0NvbEZpeGVkID0gdG9Db2xGaXhlZDsKKyAgICBWYWxpZGF0ZSgpOworCisgICAgX2FkZHJlc3MgPSBHZXRBZGRyZXNzKAorICAgICAgICBfZnJvbVJvdywKKyAgICAgICAgX2Zyb21Db2wsCisgICAgICAgIF90b1JvdywKKyAgICAgICAgX3RvQ29sLAorICAgICAgICBfZnJvbVJvd0ZpeGVkLAorICAgICAgICBmcm9tQ29sRml4ZWQsCisgICAgICAgIF90b1Jvd0ZpeGVkLAorICAgICAgICBfdG9Db2xGaXhlZCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDcmVhdGVzIGFuIEFkZHJlc3Mgb2JqZWN0CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5FeGFtcGxlcyBvZiBhZGRyZXNzZXMgYXJlICJBMSIgIkIxOkMyIiAiQTpBIiAiMToxIiAiQTE6RTIsRzM6RzUiIDwvcmVtYXJrcz4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5UaGUgRXhjZWwgQWRkcmVzczwvcGFyYW0+CisgIHB1YmxpYyBFeGNlbEFkZHJlc3NCYXNlKHN0cmluZyBhZGRyZXNzKSB7CisgICAgU2V0QWRkcmVzcyhhZGRyZXNzKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENyZWF0ZXMgYW4gQWRkcmVzcyBvYmplY3QKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPkV4YW1wbGVzIG9mIGFkZHJlc3NlcyBhcmUgIkExIiAiQjE6QzIiICJBOkEiICIxOjEiICJBMTpFMixHMzpHNSIgPC9yZW1hcmtzPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBFeGNlbCBBZGRyZXNzPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwY2siPlJlZmVyZW5jZSB0byB0aGUgcGFja2FnZSB0byBmaW5kIGluZm9ybWF0aW9uIGFib3V0IHRhYmxlcyBhbmQgbmFtZXM8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InJlZmVyZW5jZUFkZHJlc3MiPlRoZSBhZGRyZXNzPC9wYXJhbT4KKyAgcHVibGljIEV4Y2VsQWRkcmVzc0Jhc2Uoc3RyaW5nIGFkZHJlc3MsIEV4Y2VsUGFja2FnZSBwY2ssIEV4Y2VsQWRkcmVzc0Jhc2UgcmVmZXJlbmNlQWRkcmVzcykgeworICAgIFNldEFkZHJlc3MoYWRkcmVzcyk7CisgICAgU2V0UmNGcm9tVGFibGUocGNrLCByZWZlcmVuY2VBZGRyZXNzKTsKKyAgfQorCisgIGludGVybmFsIHZvaWQgU2V0UmNGcm9tVGFibGUoRXhjZWxQYWNrYWdlIHBjaywgRXhjZWxBZGRyZXNzQmFzZSByZWZlcmVuY2VBZGRyZXNzKSB7CisgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KF93YikgJiYgVGFibGUgIT0gbnVsbCkgeworICAgICAgZm9yZWFjaCAodmFyIHdzIGluIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzKSB7CisgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIHdzLlRhYmxlcykgeworICAgICAgICAgIGlmICh0Lk5hbWUuRXF1YWxzKFRhYmxlLk5hbWUsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKSB7CisgICAgICAgICAgICBfd3MgPSB3cy5OYW1lOworICAgICAgICAgICAgaWYgKFRhYmxlLklzQWxsKSB7CisgICAgICAgICAgICAgIF9mcm9tUm93ID0gdC5BZGRyZXNzLl9mcm9tUm93OworICAgICAgICAgICAgICBfdG9Sb3cgPSB0LkFkZHJlc3MuX3RvUm93OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKFRhYmxlLklzVGhpc1JvdykgeworICAgICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VBZGRyZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gLTE7CisgICAgICAgICAgICAgICAgICBfdG9Sb3cgPSAtMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgX2Zyb21Sb3cgPSByZWZlcmVuY2VBZGRyZXNzLl9mcm9tUm93OworICAgICAgICAgICAgICAgICAgX3RvUm93ID0gX2Zyb21Sb3c7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRhYmxlLklzSGVhZGVyICYmIFRhYmxlLklzRGF0YSkgeworICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gdC5BZGRyZXNzLl9mcm9tUm93OworICAgICAgICAgICAgICAgIF90b1JvdyA9IHQuU2hvd1RvdGFsID8gdC5BZGRyZXNzLl90b1JvdyAtIDEgOiB0LkFkZHJlc3MuX3RvUm93OworICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRhYmxlLklzRGF0YSAmJiBUYWJsZS5Jc1RvdGFscykgeworICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gdC5TaG93SGVhZGVyID8gdC5BZGRyZXNzLl9mcm9tUm93ICsgMSA6IHQuQWRkcmVzcy5fZnJvbVJvdzsKKyAgICAgICAgICAgICAgICBfdG9Sb3cgPSB0LkFkZHJlc3MuX3RvUm93OworICAgICAgICAgICAgICB9IGVsc2UgaWYgKFRhYmxlLklzSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgX2Zyb21Sb3cgPSB0LlNob3dIZWFkZXIgPyB0LkFkZHJlc3MuX2Zyb21Sb3cgOiAtMTsKKyAgICAgICAgICAgICAgICBfdG9Sb3cgPSB0LlNob3dIZWFkZXIgPyB0LkFkZHJlc3MuX2Zyb21Sb3cgOiAtMTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChUYWJsZS5Jc1RvdGFscykgeworICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gdC5TaG93VG90YWwgPyB0LkFkZHJlc3MuX3RvUm93IDogLTE7CisgICAgICAgICAgICAgICAgX3RvUm93ID0gdC5TaG93VG90YWwgPyB0LkFkZHJlc3MuX3RvUm93IDogLTE7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX2Zyb21Sb3cgPSB0LlNob3dIZWFkZXIgPyB0LkFkZHJlc3MuX2Zyb21Sb3cgKyAxIDogdC5BZGRyZXNzLl9mcm9tUm93OworICAgICAgICAgICAgICAgIF90b1JvdyA9IHQuU2hvd1RvdGFsID8gdC5BZGRyZXNzLl90b1JvdyAtIDEgOiB0LkFkZHJlc3MuX3RvUm93OworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShUYWJsZS5Db2x1bW5TcGFuKSkgeworICAgICAgICAgICAgICBfZnJvbUNvbCA9IHQuQWRkcmVzcy5fZnJvbUNvbDsKKyAgICAgICAgICAgICAgX3RvQ29sID0gdC5BZGRyZXNzLl90b0NvbDsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIGNvbCA9IHQuQWRkcmVzcy5fZnJvbUNvbDsKKyAgICAgICAgICAgIHZhciBjb2xzID0gVGFibGUuQ29sdW1uU3Bhbi5TcGxpdCgnOicpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGMgaW4gdC5Db2x1bW5zKSB7CisgICAgICAgICAgICAgIGlmIChfZnJvbUNvbCA8PSAwCisgICAgICAgICAgICAgICAgICAmJiBjb2xzWzBdCisgICAgICAgICAgICAgICAgICAgICAgLkVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYy5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkgLy9Jc3N1ZTE1MDYzIEFkZCBpbnZhcmlhbnQgaWdvcmUgY2FzZQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2Zyb21Db2wgPSBjb2w7CisgICAgICAgICAgICAgICAgaWYgKGNvbHMuTGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICAgIF90b0NvbCA9IF9mcm9tQ29sOworICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2xzLkxlbmd0aCA+IDEKKyAgICAgICAgICAgICAgICAgICYmIF9mcm9tQ29sID4gMAorICAgICAgICAgICAgICAgICAgJiYgY29sc1sxXQorICAgICAgICAgICAgICAgICAgICAgIC5FcXVhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGMuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpIC8vSXNzdWUxNTA2MyBBZGQgaW52YXJpYW50IGlnb3JlIGNhc2UKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF90b0NvbCA9IGNvbDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBjb2wrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIHJhbmdlIGFkZHJlc3MKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz5FeGFtcGxlcyBvZiBhZGRyZXNzZXMgYXJlICJBMSIgIkIxOkMyIiAiQTpBIiAiMToxIiAiQTE6RTIsRzM6RzUiIDwvcmVtYXJrcz4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxBZGRyZXNzQmFzZSA6IEV4Y2VsQ2VsbEJhc2UKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHJlc3MgaXMgYW4gZGVmaW5lZCBuYW1lCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+dGhlIG5hbWU8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImlzTmFtZSI+U2hvdWxkIGFsd2F5cyBiZSB0cnVlPC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxBZGRyZXNzQmFzZShzdHJpbmcgYWRkcmVzcywgYm9vbCBpc05hbWUpIHsKKyAgICBpZiAoaXNOYW1lKSB7CisgICAgICBfYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgICBfZnJvbVJvdyA9IC0xOworICAgICAgX2Zyb21Db2wgPSAtMTsKKyAgICAgIF90b1JvdyA9IC0xOworICAgICAgX3RvQ29sID0gLTE7CisgICAgICBfc3RhcnQgPSBudWxsOworICAgICAgX2VuZCA9IG51bGw7CisgICAgfSBlbHNlIHsKKyAgICAgIFNldEFkZHJlc3MoYWRkcmVzcyk7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIGludGVybmFsIHZvaWQgU2V0QWRkcmVzcyhzdHJpbmcgYWRkcmVzcykgeworICAgIGFkZHJlc3MgPSBhZGRyZXNzLlRyaW0oKTsKKyAgICBpZiAoYWRkcmVzcy5TdGFydHNXaXRoKCInIikpIHsKKyAgICAgIFNldFdiV3MoYWRkcmVzcyk7CisgICAgfSBlbHNlIGlmIChhZGRyZXNzLlN0YXJ0c1dpdGgoCisgICAgICAgICJbIikpIC8vUmVtb3ZlIGFueSBleHRlcm5hbCByZWZlcmVuY2UKICAgICB7Ci0gICAgICAgIGludGVybmFsIHByb3RlY3RlZCBpbnQgX2Zyb21Sb3c9LTEsIF90b1JvdywgX2Zyb21Db2wsIF90b0NvbDsKLSAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIGJvb2wgX2Zyb21Sb3dGaXhlZCwgX2Zyb21Db2xGaXhlZCwgX3RvUm93Rml4ZWQsIF90b0NvbEZpeGVkOwotICAgICAgICBpbnRlcm5hbCBwcm90ZWN0ZWQgc3RyaW5nIF93YjsKLSAgICAgICAgaW50ZXJuYWwgcHJvdGVjdGVkIHN0cmluZyBfd3M7Ci0gICAgICAgIGludGVybmFsIHByb3RlY3RlZCBzdHJpbmcgX2FkZHJlc3M7Ci0gICAgICAgIGludGVybmFsIHByb3RlY3RlZCBldmVudCBFdmVudEhhbmRsZXIgQWRkcmVzc0NoYW5nZTsKKyAgICAgIFNldFdiV3MoYWRkcmVzcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9hZGRyZXNzID0gYWRkcmVzczsKKyAgICB9CisgICAgaWYgKF9hZGRyZXNzLkluZGV4T2ZBbnkobmV3W10geyAnLCcsICchJywgJ1snIH0pID4gLTEpIHsKKyAgICAgIC8vQWR2YW5jZWQgYWRkcmVzcy4gSW5jbHVkaW5nIFNoZWV0IG9yIG11bHRpIG9yIHRhYmxlLgorICAgICAgRXh0cmFjdEFkZHJlc3MoX2FkZHJlc3MpOworICAgIH0gZWxzZSB7CisgICAgICAvL1NpbXBsZSBhZGRyZXNzCisgICAgICBHZXRSb3dDb2xGcm9tQWRkcmVzcygKKyAgICAgICAgICBfYWRkcmVzcywKKyAgICAgICAgICBvdXQgX2Zyb21Sb3csCisgICAgICAgICAgb3V0IF9mcm9tQ29sLAorICAgICAgICAgIG91dCBfdG9Sb3csCisgICAgICAgICAgb3V0IF90b0NvbCwKKyAgICAgICAgICBvdXQgX2Zyb21Sb3dGaXhlZCwKKyAgICAgICAgICBvdXQgX2Zyb21Db2xGaXhlZCwKKyAgICAgICAgICBvdXQgX3RvUm93Rml4ZWQsCisgICAgICAgICAgb3V0IF90b0NvbEZpeGVkKTsKKyAgICAgIF9hZGRyZXNzZXMgPSBudWxsOworICAgICAgX3N0YXJ0ID0gbnVsbDsKKyAgICAgIF9lbmQgPSBudWxsOworICAgIH0KKyAgICBfYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgVmFsaWRhdGUoKTsKKyAgfQogCi0gICAgICAgIGludGVybmFsIGVudW0gZUFkZHJlc3NDb2xsaXRpb24KLSAgICAgICAgewotICAgICAgICAgICAgTm8sCi0gICAgICAgICAgICBQYXJ0bHksCi0gICAgICAgICAgICBJbnNpZGUsCi0gICAgICAgICAgICBFcXVhbAotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgaW50ZXJuYWwgZW51bSBlU2hpZnRUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJpZ2h0LAotICAgICAgICAgICAgRG93biwKLSAgICAgICAgICAgIEVudGlyZVJvdywKLSAgICAgICAgICAgIEVudGlyZUNvbHVtbgotICAgICAgICB9Ci0gICAgICAgICNyZWdpb24gIkNvbnN0cnVjdG9ycyIKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxBZGRyZXNzQmFzZSgpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGFuIEFkZHJlc3Mgb2JqZWN0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZnJvbVJvdyI+c3RhcnQgcm93PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmcm9tQ29sIj5zdGFydCBjb2x1bW48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRvUm93Ij5FbmQgcm93PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0b0NvbHVtbiI+RW5kIGNvbHVtbjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEFkZHJlc3NCYXNlKGludCBmcm9tUm93LCBpbnQgZnJvbUNvbCwgaW50IHRvUm93LCBpbnQgdG9Db2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9mcm9tUm93ID0gZnJvbVJvdzsKLSAgICAgICAgICAgIF90b1JvdyA9IHRvUm93OwotICAgICAgICAgICAgX2Zyb21Db2wgPSBmcm9tQ29sOwotICAgICAgICAgICAgX3RvQ29sID0gdG9Db2x1bW47Ci0gICAgICAgICAgICBWYWxpZGF0ZSgpOworICBpbnRlcm5hbCB2b2lkIENoYW5nZUFkZHJlc3MoKSB7CisgICAgaWYgKEFkZHJlc3NDaGFuZ2UgIT0gbnVsbCkgeworICAgICAgQWRkcmVzc0NoYW5nZSh0aGlzLCBuZXcoKSk7CisgICAgfQorICB9CiAKLSAgICAgICAgICAgIF9hZGRyZXNzID0gR2V0QWRkcmVzcyhfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGFuIEFkZHJlc3Mgb2JqZWN0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZnJvbVJvdyI+c3RhcnQgcm93PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmcm9tQ29sIj5zdGFydCBjb2x1bW48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRvUm93Ij5FbmQgcm93PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0b0NvbHVtbiI+RW5kIGNvbHVtbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZnJvbVJvd0ZpeGVkIj5zdGFydCByb3cgZml4ZWQ8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZyb21Db2xGaXhlZCI+c3RhcnQgY29sdW1uIGZpeGVkPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0b1Jvd0ZpeGVkIj5FbmQgcm93IGZpeGVkPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0b0NvbEZpeGVkIj5FbmQgY29sdW1uIGZpeGVkPC9wYXJhbT4KLSAgICAgICAgcHVibGljIEV4Y2VsQWRkcmVzc0Jhc2UoaW50IGZyb21Sb3csIGludCBmcm9tQ29sLCBpbnQgdG9Sb3csIGludCB0b0NvbHVtbiwgYm9vbCBmcm9tUm93Rml4ZWQsIGJvb2wgZnJvbUNvbEZpeGVkLCBib29sIHRvUm93Rml4ZWQsIGJvb2wgdG9Db2xGaXhlZCkKLSAgICAgICAgewotICAgICAgICAgICAgX2Zyb21Sb3cgPSBmcm9tUm93OwotICAgICAgICAgICAgX3RvUm93ID0gdG9Sb3c7Ci0gICAgICAgICAgICBfZnJvbUNvbCA9IGZyb21Db2w7Ci0gICAgICAgICAgICBfdG9Db2wgPSB0b0NvbHVtbjsKLSAgICAgICAgICAgIF9mcm9tUm93Rml4ZWQgPSBmcm9tUm93Rml4ZWQ7Ci0gICAgICAgICAgICBfZnJvbUNvbEZpeGVkID0gZnJvbUNvbEZpeGVkOwotICAgICAgICAgICAgX3RvUm93Rml4ZWQgPSB0b1Jvd0ZpeGVkOwotICAgICAgICAgICAgX3RvQ29sRml4ZWQgPSB0b0NvbEZpeGVkOwotICAgICAgICAgICAgVmFsaWRhdGUoKTsKKyAgcHJpdmF0ZSB2b2lkIFNldFdiV3Moc3RyaW5nIGFkZHJlc3MpIHsKKyAgICBpbnQgcG9zID0gMDsKIAotICAgICAgICAgICAgX2FkZHJlc3MgPSBHZXRBZGRyZXNzKF9mcm9tUm93LCBfZnJvbUNvbCwgX3RvUm93LCBfdG9Db2wsIF9mcm9tUm93Rml4ZWQsIGZyb21Db2xGaXhlZCwgX3RvUm93Rml4ZWQsIF90b0NvbEZpeGVkICk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhbiBBZGRyZXNzIG9iamVjdAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+RXhhbXBsZXMgb2YgYWRkcmVzc2VzIGFyZSAiQTEiICJCMTpDMiIgIkE6QSIgIjE6MSIgIkExOkUyLEczOkc1IiA8L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIEV4Y2VsIEFkZHJlc3M8L3BhcmFtPgotICAgICAgICBwdWJsaWMgRXhjZWxBZGRyZXNzQmFzZShzdHJpbmcgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgU2V0QWRkcmVzcyhhZGRyZXNzKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGFuIEFkZHJlc3Mgb2JqZWN0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz5FeGFtcGxlcyBvZiBhZGRyZXNzZXMgYXJlICJBMSIgIkIxOkMyIiAiQTpBIiAiMToxIiAiQTE6RTIsRzM6RzUiIDwvcmVtYXJrcz4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5UaGUgRXhjZWwgQWRkcmVzczwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGNrIj5SZWZlcmVuY2UgdG8gdGhlIHBhY2thZ2UgdG8gZmluZCBpbmZvcm1hdGlvbiBhYm91dCB0YWJsZXMgYW5kIG5hbWVzPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyZWZlcmVuY2VBZGRyZXNzIj5UaGUgYWRkcmVzczwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEFkZHJlc3NCYXNlKHN0cmluZyBhZGRyZXNzLCBFeGNlbFBhY2thZ2UgcGNrLCBFeGNlbEFkZHJlc3NCYXNlIHJlZmVyZW5jZUFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldEFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgICAgICAgICBTZXRSQ0Zyb21UYWJsZShwY2ssIHJlZmVyZW5jZUFkZHJlc3MpOwotICAgICAgICB9CisgICAgLy8gR2V0IFdvcmtib29rLCBpZiBhbnkKKyAgICBpZiAoYWRkcmVzc1twb3NdID09ICdbJykgeworICAgICAgcG9zID0gYWRkcmVzcy5JbmRleE9mKCJdIik7CisgICAgICBfd2IgPSBhZGRyZXNzLlN1YnN0cmluZygxLCBwb3MgLSAxKTsKKyAgICAgIHBvcysrOworICAgIH0gZWxzZSB7CisgICAgICBfd2IgPSAiIjsKKyAgICB9CiAKLSAgICAgICAgaW50ZXJuYWwgdm9pZCBTZXRSQ0Zyb21UYWJsZShFeGNlbFBhY2thZ2UgcGNrLCBFeGNlbEFkZHJlc3NCYXNlIHJlZmVyZW5jZUFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfd2IpICYmIFRhYmxlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHdzIGluIHBjay5Xb3JrYm9vay5Xb3Jrc2hlZXRzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gd3MuVGFibGVzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5OYW1lLkVxdWFscyhUYWJsZS5OYW1lLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfd3MgPSB3cy5OYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUYWJsZS5Jc0FsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gdC5BZGRyZXNzLl9mcm9tUm93OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9Sb3cgPSB0LkFkZHJlc3MuX3RvUm93OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVGFibGUuSXNUaGlzUm93KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlQWRkcmVzcyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvUm93ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zyb21Sb3cgPSByZWZlcmVuY2VBZGRyZXNzLl9mcm9tUm93OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b1JvdyA9IF9mcm9tUm93OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRhYmxlLklzSGVhZGVyICYmIFRhYmxlLklzRGF0YSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zyb21Sb3cgPSB0LkFkZHJlc3MuX2Zyb21Sb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9Sb3cgPSB0LlNob3dUb3RhbCA/IHQuQWRkcmVzcy5fdG9Sb3cgLSAxIDogdC5BZGRyZXNzLl90b1JvdzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChUYWJsZS5Jc0RhdGEgJiYgVGFibGUuSXNUb3RhbHMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gdC5TaG93SGVhZGVyID8gdC5BZGRyZXNzLl9mcm9tUm93ICsgMSA6IHQuQWRkcmVzcy5fZnJvbVJvdzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b1JvdyA9IHQuQWRkcmVzcy5fdG9Sb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGFibGUuSXNIZWFkZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gdC5TaG93SGVhZGVyID8gdC5BZGRyZXNzLl9mcm9tUm93IDogLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9Sb3cgPSB0LlNob3dIZWFkZXIgPyB0LkFkZHJlc3MuX2Zyb21Sb3cgOiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChUYWJsZS5Jc1RvdGFscykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zyb21Sb3cgPSB0LlNob3dUb3RhbCA/IHQuQWRkcmVzcy5fdG9Sb3cgOiAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b1JvdyA9IHQuU2hvd1RvdGFsID8gdC5BZGRyZXNzLl90b1JvdyA6IC0xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zyb21Sb3cgPSB0LlNob3dIZWFkZXIgPyB0LkFkZHJlc3MuX2Zyb21Sb3cgKyAxIDogdC5BZGRyZXNzLl9mcm9tUm93OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvUm93ID0gdC5TaG93VG90YWwgPyB0LkFkZHJlc3MuX3RvUm93IC0gMSA6IHQuQWRkcmVzcy5fdG9Sb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgLy8gR2V0IFdvcmtzaGVldAorICAgIGlmIChhZGRyZXNzW3Bvc10gPT0gJ1wnJykgeworICAgICAgaW50IHN0YXJ0UG9zID0gcG9zOworICAgICAgcG9zID0gYWRkcmVzcy5JbmRleE9mKCInIiwgcG9zICsgMSk7CisgICAgICB3aGlsZSAocG9zIDwgYWRkcmVzcy5MZW5ndGggJiYgYWRkcmVzc1twb3MgKyAxXSA9PSAnXCcnKSB7CisgICAgICAgIHBvcyA9IGFkZHJlc3MuSW5kZXhPZigiJyIsIHBvcyArIDIpOworICAgICAgfQorICAgICAgX3dzID0gYWRkcmVzcy5TdWJzdHJpbmcoc3RhcnRQb3MgKyAxLCBwb3MgLSBzdGFydFBvcyAtIDEpLlJlcGxhY2UoIicnIiwgIiciKTsKKyAgICAgIHBvcysrOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgc3RhcnRQb3MgPSBwb3M7CisgICAgICBwb3MgPSBhZGRyZXNzLkluZGV4T2YoIiEiLCBwb3MpOworICAgICAgaWYgKHBvcyA+IC0xKSB7CisgICAgICAgIF93cyA9IGFkZHJlc3MuU3Vic3RyaW5nKHN0YXJ0UG9zLCBwb3MgLSBzdGFydFBvcyk7CisgICAgICB9CisgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KFRhYmxlLkNvbHVtblNwYW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zyb21Db2wgPSB0LkFkZHJlc3MuX2Zyb21Db2w7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b0NvbCA9IHQuQWRkcmVzcy5fdG9Db2w7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbCA9IHQuQWRkcmVzcy5fZnJvbUNvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHMgPSBUYWJsZS5Db2x1bW5TcGFuLlNwbGl0KCc6Jyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjIGluIHQuQ29sdW1ucykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9mcm9tQ29sIDw9IDAgJiYgY29sc1swXS5FcXVhbHMoYy5OYW1lLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkgICAvL0lzc3VlMTUwNjMgQWRkIGludmFyaWFudCBpZ29yZSBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zyb21Db2wgPSBjb2w7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHMuTGVuZ3RoID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9Db2wgPSBfZnJvbUNvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbHMuTGVuZ3RoID4gMSAmJiBfZnJvbUNvbCA+IDAgJiYgY29sc1sxXS5FcXVhbHMoYy5OYW1lLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkgLy9Jc3N1ZTE1MDYzIEFkZCBpbnZhcmlhbnQgaWdvcmUgY2FzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90b0NvbCA9IGNvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgLy8gR2V0IEFkZHJlc3MKKyAgICBwb3MgPSBhZGRyZXNzLkluZGV4T2YoIiEiLCBwb3MpOworICAgIGlmIChwb3MgPiAtMSkgeworICAgICAgX2FkZHJlc3MgPSBhZGRyZXNzLlN1YnN0cmluZyhwb3MgKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgX2FkZHJlc3MgPSAiIjsKKyAgICB9CisgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgaW50ZXJuYWwgdm9pZCBDaGFuZ2VXb3Jrc2hlZXQoc3RyaW5nIHdzTmFtZSwgc3RyaW5nIG5ld1dzKSB7CisgICAgaWYgKF93cyA9PSB3c05hbWUpIHsKKyAgICAgIF93cyA9IG5ld1dzOworICAgIH0KKyAgICB2YXIgZnVsbEFkZHJlc3MgPSBHZXRBZGRyZXNzKCk7CisKKyAgICBpZiAoQWRkcmVzc2VzICE9IG51bGwpIHsKKyAgICAgIGZvcmVhY2ggKHZhciBhIGluIEFkZHJlc3NlcykgeworICAgICAgICBpZiAoYS5fd3MgPT0gd3NOYW1lKSB7CisgICAgICAgICAgYS5fd3MgPSBuZXdXczsKKyAgICAgICAgICBmdWxsQWRkcmVzcyArPSAiLCIgKyBhLkdldEFkZHJlc3MoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmdWxsQWRkcmVzcyArPSAiLCIgKyBhLl9hZGRyZXNzOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIF9hZGRyZXNzID0gZnVsbEFkZHJlc3M7CisgIH0KKworICBwcml2YXRlIHN0cmluZyBHZXRBZGRyZXNzKCkgeworICAgIHZhciBhZHIgPSAiIjsKKyAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoX3diKSkgeworICAgICAgYWRyID0gIlsiICsgX3diICsgIl0iOworICAgIH0KKworICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfd3MpKSB7CisgICAgICBhZHIgKz0gc3RyaW5nLkZvcm1hdCgiJ3swfSchIiwgX3dzKTsKKyAgICB9CisgICAgYWRyICs9IEdldEFkZHJlc3MoX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCk7CisgICAgcmV0dXJuIGFkcjsKKyAgfQorCisgIHByaXZhdGUgRXhjZWxDZWxsQWRkcmVzcyBfc3RhcnQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0cyB0aGUgcm93IGFuZCBjb2x1bW4gb2YgdGhlIHRvcCBsZWZ0IGNlbGwuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8dmFsdWU+VGhlIHN0YXJ0IHJvdyBjb2x1bW4uPC92YWx1ZT4KKyAgcHVibGljIEV4Y2VsQ2VsbEFkZHJlc3MgU3RhcnQgeworICAgIGdldCB7CisgICAgICBpZiAoX3N0YXJ0ID09IG51bGwpIHsKKyAgICAgICAgX3N0YXJ0ID0gbmV3KF9mcm9tUm93LCBfZnJvbUNvbCk7CisgICAgICB9CisgICAgICByZXR1cm4gX3N0YXJ0OworICAgIH0KKyAgfQorCisgIHByaXZhdGUgRXhjZWxDZWxsQWRkcmVzcyBfZW5kOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldHMgdGhlIHJvdyBhbmQgY29sdW1uIG9mIHRoZSBib3R0b20gcmlnaHQgY2VsbC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDx2YWx1ZT5UaGUgZW5kIHJvdyBjb2x1bW4uPC92YWx1ZT4KKyAgcHVibGljIEV4Y2VsQ2VsbEFkZHJlc3MgRW5kIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9lbmQgPT0gbnVsbCkgeworICAgICAgICBfZW5kID0gbmV3KF90b1JvdywgX3RvQ29sKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfZW5kOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgRXhjZWxUYWJsZUFkZHJlc3MgX3RhYmxlOworCisgIHB1YmxpYyBFeGNlbFRhYmxlQWRkcmVzcyBUYWJsZSA9PiBfdGFibGU7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIGFkZHJlc3MgZm9yIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgdmlydHVhbCBzdHJpbmcgQWRkcmVzcyB7CisgICAgZ2V0IHsgcmV0dXJuIF9hZGRyZXNzOyB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgYWRkcmVzcyBpcyBhIGRlZmluZWQgbmFtZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBJc05hbWUgeworICAgIGdldCB7IHJldHVybiBfZnJvbVJvdyA8IDA7IH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgdGhlIGFkZHJlc3MgdGV4dAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeworICAgIHJldHVybiBfYWRkcmVzczsKKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIF9maXJzdEFkZHJlc3M7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gcmV0dXJucyB0aGUgZmlyc3QgYWRkcmVzcyBpZiB0aGUgYWRkcmVzcyBpcyBhIG11bHRpIGFkZHJlc3MuCisgIC8vLyBBMTpBMixCMTpCMiByZXR1cm5zIEExOkEyCisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIHN0cmluZyBGaXJzdEFkZHJlc3MgeworICAgIGdldCB7CisgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoX2ZpcnN0QWRkcmVzcykpIHsKKyAgICAgICAgcmV0dXJuIF9hZGRyZXNzOworICAgICAgfQorICAgICAgcmV0dXJuIF9maXJzdEFkZHJlc3M7CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgc3RyaW5nIEFkZHJlc3NTcGFjZVNlcGFyYXRlZCB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBfYWRkcmVzcy5SZXBsYWNlKCcsJywgJyAnKTsgLy9Db25kaXRpb25hbCBmb3JtYXR0aW5nIGFuZCBhIGZldyBvdGhlciBwbGFjZXMgdXNlIHNwYWNlIGFzIHNlcGFyYXRvciBmb3IgbXVsaXQgYWRkcmVzc2VzLgorICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFZhbGlkYXRlIHRoZSBhZGRyZXNzCisgIC8vLyA8L3N1bW1hcnk+CisgIHByb3RlY3RlZCB2b2lkIFZhbGlkYXRlKCkgeworICAgIGlmIChfZnJvbVJvdyA+IF90b1JvdyB8fCBfZnJvbUNvbCA+IF90b0NvbCkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigKKyAgICAgICAgICAiU3RhcnQgY2VsbCBBZGRyZXNzIG11c3QgYmUgbGVzcyBvciBlcXVhbCB0byBFbmQgY2VsbCBhZGRyZXNzIik7CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgc3RyaW5nIFdvcmtTaGVldCB7CisgICAgZ2V0IHsgcmV0dXJuIF93czsgfQorICB9CisKKyAgcHJvdGVjdGVkIGludGVybmFsIExpc3Q8RXhjZWxBZGRyZXNzPiBfYWRkcmVzc2VzOworCisgIGludGVybmFsIHZpcnR1YWwgTGlzdDxFeGNlbEFkZHJlc3M+IEFkZHJlc3NlcyB7CisgICAgZ2V0IHsgcmV0dXJuIF9hZGRyZXNzZXM7IH0KKyAgfQorCisgIHByaXZhdGUgYm9vbCBFeHRyYWN0QWRkcmVzcyhzdHJpbmcgZnVsbEFkZHJlc3MpIHsKKyAgICB2YXIgYnJhY2tQb3MgPSBuZXcgU3RhY2s8aW50PigpOworICAgIHZhciBicmFja2V0UGFydHMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgc3RyaW5nIGZpcnN0ID0gIiIsCisgICAgICAgIHNlY29uZCA9ICIiOworICAgIGJvb2wgaXNUZXh0ID0gZmFsc2UsCisgICAgICAgIGhhc1NoZWV0ID0gZmFsc2U7CisgICAgdHJ5IHsKKyAgICAgIGlmIChmdWxsQWRkcmVzcyA9PSAiI1JFRiEiKSB7CisgICAgICAgIFNldEFkZHJlc3MocmVmIGZ1bGxBZGRyZXNzLCByZWYgc2Vjb25kLCByZWYgaGFzU2hlZXQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChmdWxsQWRkcmVzcy5TdGFydHNXaXRoKCIhIikpIHsKKyAgICAgICAgLy8gaW52YWxpZCBhZGRyZXNzIQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZ1bGxBZGRyZXNzLkxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZhciBjID0gZnVsbEFkZHJlc3NbaV07CisgICAgICAgIGlmIChjID09ICdcJycpIHsKKyAgICAgICAgICBpZiAoaXNUZXh0ICYmIGkgKyAxIDwgZnVsbEFkZHJlc3MuTGVuZ3RoICYmIGZ1bGxBZGRyZXNzW2ldID09ICdcJycpIHsKKyAgICAgICAgICAgIGlmIChoYXNTaGVldCkgeworICAgICAgICAgICAgICBzZWNvbmQgKz0gYzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGZpcnN0ICs9IGM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlzVGV4dCA9ICFpc1RleHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGJyYWNrUG9zLkNvdW50ID4gMCkgeworICAgICAgICAgICAgaWYgKGMgPT0gJ1snICYmICFpc1RleHQpIHsKKyAgICAgICAgICAgICAgYnJhY2tQb3MuUHVzaChpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXScgJiYgIWlzVGV4dCkgeworICAgICAgICAgICAgICBpZiAoYnJhY2tQb3MuQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgdmFyIGZyb20gPSBicmFja1Bvcy5Qb3AoKTsKKyAgICAgICAgICAgICAgICBicmFja2V0UGFydHMuQWRkKGZ1bGxBZGRyZXNzLlN1YnN0cmluZyhmcm9tICsgMSwgaSAtIGZyb20gLSAxKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoYnJhY2tQb3MuQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgSGFuZGxlQnJhY2tldHMoZmlyc3QsIHNlY29uZCwgYnJhY2tldFBhcnRzKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHJlc3MgaXMgYW4gZGVmaW5lZCBuYW1lCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+dGhlIG5hbWU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlzTmFtZSI+U2hvdWxkIGFsd2F5cyBiZSB0cnVlPC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxBZGRyZXNzQmFzZShzdHJpbmcgYWRkcmVzcywgYm9vbCBpc05hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpc05hbWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2FkZHJlc3MgPSBhZGRyZXNzOwotICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gLTE7Ci0gICAgICAgICAgICAgICAgX2Zyb21Db2wgPSAtMTsKLSAgICAgICAgICAgICAgICBfdG9Sb3cgPSAtMTsKLSAgICAgICAgICAgICAgICBfdG9Db2wgPSAtMTsKLSAgICAgICAgICAgICAgICBfc3RhcnQgPSBudWxsOwotICAgICAgICAgICAgICAgIF9lbmQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldEFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgdm9pZCBTZXRBZGRyZXNzKHN0cmluZyBhZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5UcmltKCk7Ci0gICAgICAgICAgICBpZiAoYWRkcmVzcy5TdGFydHNXaXRoKCInIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0V2JXcyhhZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJlc3MuU3RhcnRzV2l0aCgiWyIpKSAvL1JlbW92ZSBhbnkgZXh0ZXJuYWwgcmVmZXJlbmNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0V2JXcyhhZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfYWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihfYWRkcmVzcy5JbmRleE9mQW55KG5ldyBjaGFyW10geycsJywnIScsICdbJ30pID4gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9BZHZhbmNlZCBhZGRyZXNzLiBJbmNsdWRpbmcgU2hlZXQgb3IgbXVsdGkgb3IgdGFibGUuCi0gICAgICAgICAgICAgICAgRXh0cmFjdEFkZHJlc3MoX2FkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vU2ltcGxlIGFkZHJlc3MKLSAgICAgICAgICAgICAgICBHZXRSb3dDb2xGcm9tQWRkcmVzcyhfYWRkcmVzcywgb3V0IF9mcm9tUm93LCBvdXQgX2Zyb21Db2wsIG91dCBfdG9Sb3csIG91dCAgX3RvQ29sLCBvdXQgX2Zyb21Sb3dGaXhlZCwgb3V0IF9mcm9tQ29sRml4ZWQsICBvdXQgX3RvUm93Rml4ZWQsIG91dCBfdG9Db2xGaXhlZCk7Ci0gICAgICAgICAgICAgICAgX2FkZHJlc3NlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgX3N0YXJ0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBfZW5kID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9hZGRyZXNzID0gYWRkcmVzczsKLSAgICAgICAgICAgIFZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBDaGFuZ2VBZGRyZXNzKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEFkZHJlc3NDaGFuZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBZGRyZXNzQ2hhbmdlKHRoaXMsIG5ldyBFdmVudEFyZ3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFdiV3Moc3RyaW5nIGFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBwb3MgPSAwOwotCi0gICAgICAgICAgICAvLyBHZXQgV29ya2Jvb2ssIGlmIGFueQotICAgICAgICAgICAgaWYgKGFkZHJlc3NbcG9zXSA9PSAnWycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcG9zID0gYWRkcmVzcy5JbmRleE9mKCJdIik7Ci0gICAgICAgICAgICAgICAgX3diID0gYWRkcmVzcy5TdWJzdHJpbmcoMSwgcG9zIC0gMSk7Ci0gICAgICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3diID0gIiI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEdldCBXb3Jrc2hlZXQKLSAgICAgICAgICAgIGlmIChhZGRyZXNzW3Bvc10gPT0gJ1wnJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgc3RhcnRQb3MgPSBwb3M7Ci0gICAgICAgICAgICAgICAgcG9zID0gYWRkcmVzcy5JbmRleE9mKCInIiwgcG9zICsgMSk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHBvcyA8IGFkZHJlc3MuTGVuZ3RoICYmIGFkZHJlc3NbcG9zICsgMV0gPT0gJ1wnJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBvcyA9IGFkZHJlc3MuSW5kZXhPZigiJyIsIHBvcyArIDIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfd3MgPSBhZGRyZXNzLlN1YnN0cmluZyhzdGFydFBvcyArIDEsIHBvcyAtIHN0YXJ0UG9zIC0gMSkuUmVwbGFjZSgiJyciLCAiJyIpOwotICAgICAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBzdGFydFBvcyA9IHBvczsKLSAgICAgICAgICAgICAgICBwb3MgPSBhZGRyZXNzLkluZGV4T2YoIiEiLCBwb3MpOwotICAgICAgICAgICAgICAgIGlmIChwb3MgPiAtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF93cyA9IGFkZHJlc3MuU3Vic3RyaW5nKHN0YXJ0UG9zLCBwb3MgLSBzdGFydFBvcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBHZXQgQWRkcmVzcwotICAgICAgICAgICAgcG9zID0gYWRkcmVzcy5JbmRleE9mKCIhIiwgcG9zKTsKLSAgICAgICAgICAgIGlmIChwb3MgPiAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfYWRkcmVzcyA9IGFkZHJlc3MuU3Vic3RyaW5nKHBvcyArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9hZGRyZXNzID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBDaGFuZ2VXb3Jrc2hlZXQoc3RyaW5nIHdzTmFtZSwgc3RyaW5nIG5ld1dzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3dzID09IHdzTmFtZSkgX3dzID0gbmV3V3M7Ci0gICAgICAgICAgICB2YXIgZnVsbEFkZHJlc3MgPSBHZXRBZGRyZXNzKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChBZGRyZXNzZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgYSBpbiBBZGRyZXNzZXMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoYS5fd3MgPT0gd3NOYW1lKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhLl93cyA9IG5ld1dzOwotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbEFkZHJlc3MgKz0gIiwiICsgYS5HZXRBZGRyZXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmdWxsQWRkcmVzcyArPSAiLCIgKyBhLl9hZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2FkZHJlc3MgPSBmdWxsQWRkcmVzczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RyaW5nIEdldEFkZHJlc3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYWRyID0gIiI7Ci0gICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoX3diKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZHIgPSAiWyIgKyBfd2IgKyAiXSI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfd3MpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkciArPSBzdHJpbmcuRm9ybWF0KCInezB9JyEiLCBfd3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYWRyICs9IEdldEFkZHJlc3MoX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCk7Ci0gICAgICAgICAgICByZXR1cm4gYWRyOwotICAgICAgICB9Ci0KLSAgICAgICAgRXhjZWxDZWxsQWRkcmVzcyBfc3RhcnQgPSBudWxsOwotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldHMgdGhlIHJvdyBhbmQgY29sdW1uIG9mIHRoZSB0b3AgbGVmdCBjZWxsLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHZhbHVlPlRoZSBzdGFydCByb3cgY29sdW1uLjwvdmFsdWU+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENlbGxBZGRyZXNzIFN0YXJ0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfc3RhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9zdGFydCA9IG5ldyBFeGNlbENlbGxBZGRyZXNzKF9mcm9tUm93LCBfZnJvbUNvbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfc3RhcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxDZWxsQWRkcmVzcyBfZW5kID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0cyB0aGUgcm93IGFuZCBjb2x1bW4gb2YgdGhlIGJvdHRvbSByaWdodCBjZWxsLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHZhbHVlPlRoZSBlbmQgcm93IGNvbHVtbi48L3ZhbHVlPgotICAgICAgICBwdWJsaWMgRXhjZWxDZWxsQWRkcmVzcyBFbmQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9lbmQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9lbmQgPSBuZXcgRXhjZWxDZWxsQWRkcmVzcyhfdG9Sb3csIF90b0NvbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfZW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsVGFibGVBZGRyZXNzIF90YWJsZT1udWxsOwotICAgICAgICBwdWJsaWMgRXhjZWxUYWJsZUFkZHJlc3MgVGFibGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF90YWJsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBhZGRyZXNzIGZvciB0aGUgcmFuZ2UKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHZpcnR1YWwgc3RyaW5nIEFkZHJlc3MKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9hZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSWYgdGhlIGFkZHJlc3MgaXMgYSBkZWZpbmVkIG5hbWUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgSXNOYW1lCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfZnJvbVJvdyA8IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgYWRkcmVzcyB0ZXh0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2FkZHJlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIF9maXJzdEFkZHJlc3M7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIHJldHVybnMgdGhlIGZpcnN0IGFkZHJlc3MgaWYgdGhlIGFkZHJlc3MgaXMgYSBtdWx0aSBhZGRyZXNzLgotICAgICAgICAvLy8gQTE6QTIsQjE6QjIgcmV0dXJucyBBMTpBMgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgRmlyc3RBZGRyZXNzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfZmlyc3RBZGRyZXNzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfYWRkcmVzczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9maXJzdEFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHN0cmluZyBBZGRyZXNzU3BhY2VTZXBhcmF0ZWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9hZGRyZXNzLlJlcGxhY2UoJywnLCAnICcpOyAvL0NvbmRpdGlvbmFsIGZvcm1hdHRpbmcgYW5kIGEgZmV3IG90aGVyIHBsYWNlcyB1c2Ugc3BhY2UgYXMgc2VwYXJhdG9yIGZvciBtdWxpdCBhZGRyZXNzZXMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVmFsaWRhdGUgdGhlIGFkZHJlc3MKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgVmFsaWRhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2Zyb21Sb3cgPiBfdG9Sb3cgfHwgX2Zyb21Db2wgPiBfdG9Db2wpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiU3RhcnQgY2VsbCBBZGRyZXNzIG11c3QgYmUgbGVzcyBvciBlcXVhbCB0byBFbmQgY2VsbCBhZGRyZXNzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFdvcmtTaGVldAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3dzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHByb3RlY3RlZCBMaXN0PEV4Y2VsQWRkcmVzcz4gX2FkZHJlc3NlcyA9IG51bGw7Ci0gICAgICAgIGludGVybmFsIHZpcnR1YWwgTGlzdDxFeGNlbEFkZHJlc3M+IEFkZHJlc3NlcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2FkZHJlc3NlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbCBFeHRyYWN0QWRkcmVzcyhzdHJpbmcgZnVsbEFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBicmFja1Bvcz1uZXcgU3RhY2s8aW50PigpOwotICAgICAgICAgICAgdmFyIGJyYWNrZXRQYXJ0cz1uZXcgTGlzdDxzdHJpbmc+KCk7Ci0gICAgICAgICAgICBzdHJpbmcgZmlyc3Q9IiIsIHNlY29uZD0iIjsKLSAgICAgICAgICAgIGJvb2wgaXNUZXh0PWZhbHNlLCBoYXNTaGVldD1mYWxzZTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmdWxsQWRkcmVzcyA9PSAiI1JFRiEiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2V0QWRkcmVzcyhyZWYgZnVsbEFkZHJlc3MsIHJlZiBzZWNvbmQsIHJlZiBoYXNTaGVldCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChmdWxsQWRkcmVzcy5TdGFydHNXaXRoKCIhIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBpbnZhbGlkIGFkZHJlc3MhCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmdWxsQWRkcmVzcy5MZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBjID0gZnVsbEFkZHJlc3NbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcJycpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RleHQgJiYgaSArIDEgPCBmdWxsQWRkcmVzcy5MZW5ndGggJiYgZnVsbEFkZHJlc3NbaV0gPT0gJ1wnJykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzU2hlZXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgKz0gYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgKz0gYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1RleHQgPSAhaXNUZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyYWNrUG9zLkNvdW50ID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnWycgJiYgIWlzVGV4dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYWNrUG9zLlB1c2goaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ10nICYmICFpc1RleHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJhY2tQb3MuQ291bnQgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZnJvbSA9IGJyYWNrUG9zLlBvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhY2tldFBhcnRzLkFkZChmdWxsQWRkcmVzcy5TdWJzdHJpbmcoZnJvbSArIDEsIGkgLSBmcm9tIC0gMSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJhY2tQb3MuQ291bnQgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVCcmFja2V0cyhmaXJzdCwgc2Vjb25kLCBicmFja2V0UGFydHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JbnZhbGlkIGFkZHJlc3MhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICdbJyAmJiAhaXNUZXh0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYWNrUG9zLlB1c2goaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICchJyAmJiAhaXNUZXh0ICYmICFmaXJzdC5FbmRzV2l0aCgiI1JFRiIpICYmICFzZWNvbmQuRW5kc1dpdGgoIiNSRUYiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNTaGVldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICcsJyAmJiAhaXNUZXh0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEFkZHJlc3MocmVmIGZpcnN0LCByZWYgc2Vjb25kLCByZWYgaGFzU2hlZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNTaGVldCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCArPSBjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCArPSBjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoVGFibGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNldEFkZHJlc3MocmVmIGZpcnN0LCByZWYgc2Vjb25kLCByZWYgaGFzU2hlZXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICB7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy9JbnZhbGlkIGFkZHJlc3MhCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChjID09ICdbJyAmJiAhaXNUZXh0KSB7CisgICAgICAgICAgICBicmFja1Bvcy5QdXNoKGkpOworICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnIScgJiYgIWlzVGV4dCAmJiAhZmlyc3QuRW5kc1dpdGgoIiNSRUYiKSAmJiAhc2Vjb25kLkVuZHNXaXRoKCIjUkVGIikpIHsKKyAgICAgICAgICAgIGhhc1NoZWV0ID0gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJywnICYmICFpc1RleHQpIHsKKyAgICAgICAgICAgIFNldEFkZHJlc3MocmVmIGZpcnN0LCByZWYgc2Vjb25kLCByZWYgaGFzU2hlZXQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaGFzU2hlZXQpIHsKKyAgICAgICAgICAgICAgc2Vjb25kICs9IGM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBmaXJzdCArPSBjOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKFRhYmxlID09IG51bGwpIHsKKyAgICAgICAgU2V0QWRkcmVzcyhyZWYgZmlyc3QsIHJlZiBzZWNvbmQsIHJlZiBoYXNTaGVldCk7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGNhdGNoIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgSGFuZGxlQnJhY2tldHMoc3RyaW5nIGZpcnN0LCBzdHJpbmcgc2Vjb25kLCBMaXN0PHN0cmluZz4gYnJhY2tldFBhcnRzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZighc3RyaW5nLklzTnVsbE9yRW1wdHkoZmlyc3QpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF90YWJsZSA9IG5ldyBFeGNlbFRhYmxlQWRkcmVzcygpOwotICAgICAgICAgICAgICAgIFRhYmxlLk5hbWUgPSBmaXJzdDsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcyBpbiBicmFja2V0UGFydHMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZihzLkluZGV4T2YoIlsiKTwwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2gocy5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIjYWxsIjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RhYmxlLklzQWxsID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiI2hlYWRlcnMiOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90YWJsZS5Jc0hlYWRlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiNkYXRhIjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RhYmxlLklzRGF0YSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgIiN0b3RhbHMiOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGFibGUuSXNUb3RhbHMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICIjdGhpcyByb3ciOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGFibGUuSXNUaGlzUm93ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RyaW5nLklzTnVsbE9yRW1wdHkoX3RhYmxlLkNvbHVtblNwYW4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGFibGUuQ29sdW1uU3Bhbj1zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RhYmxlLkNvbHVtblNwYW4gKz0gIjoiICsgczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgIHByaXZhdGUgdm9pZCBIYW5kbGVCcmFja2V0cyhzdHJpbmcgZmlyc3QsIHN0cmluZyBzZWNvbmQsIExpc3Q8c3RyaW5nPiBicmFja2V0UGFydHMpIHsKKyAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGZpcnN0KSkgeworICAgICAgX3RhYmxlID0gbmV3KCk7CisgICAgICBUYWJsZS5OYW1lID0gZmlyc3Q7CisgICAgICBmb3JlYWNoICh2YXIgcyBpbiBicmFja2V0UGFydHMpIHsKKyAgICAgICAgaWYgKHMuSW5kZXhPZigiWyIpIDwgMCkgeworICAgICAgICAgIHN3aXRjaCAocy5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKSB7CisgICAgICAgICAgICBjYXNlICIjYWxsIjoKKyAgICAgICAgICAgICAgX3RhYmxlLklzQWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICIjaGVhZGVycyI6CisgICAgICAgICAgICAgIF90YWJsZS5Jc0hlYWRlciA9IHRydWU7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAiI2RhdGEiOgorICAgICAgICAgICAgICBfdGFibGUuSXNEYXRhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICIjdG90YWxzIjoKKyAgICAgICAgICAgICAgX3RhYmxlLklzVG90YWxzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICIjdGhpcyByb3ciOgorICAgICAgICAgICAgICBfdGFibGUuSXNUaGlzUm93ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoX3RhYmxlLkNvbHVtblNwYW4pKSB7CisgICAgICAgICAgICAgICAgX3RhYmxlLkNvbHVtblNwYW4gPSBzOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF90YWJsZS5Db2x1bW5TcGFuICs9ICI6IiArIHM7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgICNyZWdpb24gQWRkcmVzcyBtYW5pcHVsYXRpb24gbWV0aG9kcwotICAgICAgICBpbnRlcm5hbCBlQWRkcmVzc0NvbGxpdGlvbiBDb2xsaWRlKEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFkZHJlc3MuV29ya1NoZWV0ICE9IFdvcmtTaGVldCAmJiBhZGRyZXNzLldvcmtTaGVldCE9bnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZUFkZHJlc3NDb2xsaXRpb24uTm87Ci0gICAgICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CiAKLSAgICAgICAgICAgIGlmIChhZGRyZXNzLl9mcm9tUm93ID4gX3RvUm93IHx8IGFkZHJlc3MuX2Zyb21Db2wgPiBfdG9Db2wKLSAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgIF9mcm9tUm93ID4gYWRkcmVzcy5fdG9Sb3cgfHwgX2Zyb21Db2wgPiBhZGRyZXNzLl90b0NvbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZUFkZHJlc3NDb2xsaXRpb24uTm87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChhZGRyZXNzLl9mcm9tUm93ID09IF9mcm9tUm93ICYmIGFkZHJlc3MuX2Zyb21Db2wgPT0gX2Zyb21Db2wgJiYKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5fdG9Sb3cgPT0gX3RvUm93ICYmIGFkZHJlc3MuX3RvQ29sID09IF90b0NvbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZUFkZHJlc3NDb2xsaXRpb24uRXF1YWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChhZGRyZXNzLl9mcm9tUm93ID49IF9mcm9tUm93ICYmIGFkZHJlc3MuX3RvUm93IDw9IF90b1JvdyAmJgotICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5fZnJvbUNvbCA+PSBfZnJvbUNvbCAmJiBhZGRyZXNzLl90b0NvbCA8PSBfdG9Db2wpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVBZGRyZXNzQ29sbGl0aW9uLkluc2lkZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gZUFkZHJlc3NDb2xsaXRpb24uUGFydGx5OwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsQWRkcmVzc0Jhc2UgQWRkUm93KGludCByb3csIGludCByb3dzLCBib29sIHNldEZpeGVkPWZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocm93ID4gX3RvUm93KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocm93IDw9IF9mcm9tUm93KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxBZGRyZXNzQmFzZSgoc2V0Rml4ZWQgJiYgX2Zyb21Sb3dGaXhlZCA/IF9mcm9tUm93IDogX2Zyb21Sb3cgKyByb3dzKSwgX2Zyb21Db2wsIChzZXRGaXhlZCAmJiBfdG9Sb3dGaXhlZCA/IF90b1JvdyA6IF90b1JvdyArIHJvd3MpLCBfdG9Db2wsIF9mcm9tUm93Rml4ZWQsIF9mcm9tQ29sRml4ZWQsIF90b1Jvd0ZpeGVkLCBfdG9Db2xGaXhlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3NCYXNlKF9mcm9tUm93LCBfZnJvbUNvbCwgKHNldEZpeGVkICYmIF90b1Jvd0ZpeGVkID8gX3RvUm93IDogX3RvUm93ICsgcm93cyksIF90b0NvbCwgX2Zyb21Sb3dGaXhlZCwgX2Zyb21Db2xGaXhlZCwgX3RvUm93Rml4ZWQsIF90b0NvbEZpeGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbEFkZHJlc3NCYXNlIERlbGV0ZVJvdyhpbnQgcm93LCBpbnQgcm93cywgYm9vbCBzZXRGaXhlZCA9IGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocm93ID4gX3RvUm93KSAvL0FmdGVyCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgICAgICBlbHNlIGlmIChyb3crcm93cyA8PSBfZnJvbVJvdykgLy9CZWZvcmUKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoKHNldEZpeGVkICYmIF9mcm9tUm93Rml4ZWQgPyBfZnJvbVJvdyA6IF9mcm9tUm93IC0gcm93cyksIF9mcm9tQ29sLCAoc2V0Rml4ZWQgJiYgX3RvUm93Rml4ZWQgPyBfdG9Sb3cgOiBfdG9Sb3cgLSByb3dzKSwgX3RvQ29sLCBfZnJvbVJvd0ZpeGVkLCBfZnJvbUNvbEZpeGVkLCBfdG9Sb3dGaXhlZCwgX3RvQ29sRml4ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocm93IDw9IF9mcm9tUm93ICYmIHJvdyArIHJvd3MgPiBfdG9Sb3cpIC8vSW5zaWRlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlICAvL1BhcnRseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChyb3cgPD0gX2Zyb21Sb3cpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQWRkcmVzc0Jhc2Uocm93LCBfZnJvbUNvbCwgKHNldEZpeGVkICYmIF90b1Jvd0ZpeGVkID8gX3RvUm93IDogX3RvUm93IC0gcm93cyksIF90b0NvbCwgX2Zyb21Sb3dGaXhlZCwgX2Zyb21Db2xGaXhlZCwgX3RvUm93Rml4ZWQsIF90b0NvbEZpeGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3NCYXNlKF9mcm9tUm93LCBfZnJvbUNvbCwgKHNldEZpeGVkICYmIF90b1Jvd0ZpeGVkID8gX3RvUm93IDogX3RvUm93IC0gcm93cyA8IHJvdyA/IHJvdyAtIDEgOiBfdG9Sb3cgLSByb3dzKSwgX3RvQ29sLCBfZnJvbVJvd0ZpeGVkLCBfZnJvbUNvbEZpeGVkLCBfdG9Sb3dGaXhlZCwgX3RvQ29sRml4ZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbEFkZHJlc3NCYXNlIEFkZENvbHVtbihpbnQgY29sLCBpbnQgY29scywgYm9vbCBzZXRGaXhlZCA9IGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29sID4gX3RvQ29sKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY29sIDw9IF9mcm9tQ29sKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxBZGRyZXNzQmFzZShfZnJvbVJvdywgKHNldEZpeGVkICYmIF9mcm9tQ29sRml4ZWQgPyBfZnJvbUNvbCA6IF9mcm9tQ29sICsgY29scyksIF90b1JvdywgKHNldEZpeGVkICYmIF90b0NvbEZpeGVkID8gX3RvQ29sIDogX3RvQ29sICsgY29scyksIF9mcm9tUm93Rml4ZWQsIF9mcm9tQ29sRml4ZWQsIF90b1Jvd0ZpeGVkLCBfdG9Db2xGaXhlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3NCYXNlKF9mcm9tUm93LCBfZnJvbUNvbCwgX3RvUm93LCAoc2V0Rml4ZWQgJiYgX3RvQ29sRml4ZWQgPyBfdG9Db2wgOiBfdG9Db2wgKyBjb2xzKSwgX2Zyb21Sb3dGaXhlZCwgX2Zyb21Db2xGaXhlZCwgX3RvUm93Rml4ZWQsIF90b0NvbEZpeGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbEFkZHJlc3NCYXNlIERlbGV0ZUNvbHVtbihpbnQgY29sLCBpbnQgY29scywgYm9vbCBzZXRGaXhlZCA9IGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29sID4gX3RvQ29sKSAvL0FmdGVyCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjb2wgKyBjb2xzIDw9IF9mcm9tQ29sKSAvL0JlZm9yZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxBZGRyZXNzQmFzZShfZnJvbVJvdywgKHNldEZpeGVkICYmIF9mcm9tQ29sRml4ZWQgPyBfZnJvbUNvbCA6IF9mcm9tQ29sIC0gY29scyksIF90b1JvdywgKHNldEZpeGVkICYmIF90b0NvbEZpeGVkID8gX3RvQ29sIDpfdG9Db2wgLSBjb2xzKSwgX2Zyb21Sb3dGaXhlZCwgX2Zyb21Db2xGaXhlZCwgX3RvUm93Rml4ZWQsIF90b0NvbEZpeGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGNvbCA8PSBfZnJvbUNvbCAmJiBjb2wgKyBjb2xzID4gX3RvQ29sKSAvL0luc2lkZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAgLy9QYXJ0bHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY29sIDw9IF9mcm9tQ29sKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3NCYXNlKF9mcm9tUm93LCBjb2wsIF90b1JvdywgKHNldEZpeGVkICYmIF90b0NvbEZpeGVkID8gX3RvQ29sIDogX3RvQ29sIC0gY29scyksIF9mcm9tUm93Rml4ZWQsIF9mcm9tQ29sRml4ZWQsIF90b1Jvd0ZpeGVkLCBfdG9Db2xGaXhlZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxBZGRyZXNzQmFzZShfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgKHNldEZpeGVkICYmIF90b0NvbEZpeGVkID8gX3RvQ29sIDpfdG9Db2wgLSBjb2xzIDwgY29sID8gY29sIC0gMSA6IF90b0NvbCAtIGNvbHMpLCBfZnJvbVJvd0ZpeGVkLCBfZnJvbUNvbEZpeGVkLCBfdG9Sb3dGaXhlZCwgX3RvQ29sRml4ZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbEFkZHJlc3NCYXNlIEluc2VydChFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MsIGVTaGlmdFR5cGUgU2hpZnQvKiwgb3V0IEV4Y2VsQWRkcmVzc0Jhc2UgdG9wQWRkcmVzcywgb3V0IEV4Y2VsQWRkcmVzc0Jhc2UgbGVmdEFkZHJlc3MsIG91dCBFeGNlbEFkZHJlc3NCYXNlIHJpZ2h0QWRkcmVzcywgb3V0IEV4Y2VsQWRkcmVzc0Jhc2UgYm90dG9tQWRkcmVzcyovKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL0JlZm9yZSBvciBhZnRlciwgbm8gY2hhbmdlCi0gICAgICAgICAgICAvL2lmICgoX3RvUm93ID4gYWRkcmVzcy5fZnJvbVJvdyAmJiBfdG9Db2wgPiBhZGRyZXNzLmNvbHVtbikgfHwgCi0gICAgICAgICAgICAvLyAgICAoX2Zyb21Sb3cgPiBhZGRyZXNzLl90b1JvdyAmJiBjb2x1bW4gPiBhZGRyZXNzLl90b0NvbCkpCi0gICAgICAgICAgICBpZihfdG9Sb3cgPCBhZGRyZXNzLl9mcm9tUm93IHx8IF90b0NvbCA8IGFkZHJlc3MuX2Zyb21Db2wgfHwgKF9mcm9tUm93ID4gYWRkcmVzcy5fdG9Sb3cgJiYgX2Zyb21Db2wgPiBhZGRyZXNzLl90b0NvbCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy90b3BBZGRyZXNzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAvL2xlZnRBZGRyZXNzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAvL3JpZ2h0QWRkcmVzcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgLy9ib3R0b21BZGRyZXNzID0gbnVsbDsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KKyAgaW50ZXJuYWwgZUFkZHJlc3NDb2xsaXRpb24gQ29sbGlkZShFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MpIHsKKyAgICBpZiAoYWRkcmVzcy5Xb3JrU2hlZXQgIT0gV29ya1NoZWV0ICYmIGFkZHJlc3MuV29ya1NoZWV0ICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBlQWRkcmVzc0NvbGxpdGlvbi5ObzsKKyAgICB9CiAKLSAgICAgICAgICAgIGludCByb3dzID0gYWRkcmVzcy5Sb3dzOwotICAgICAgICAgICAgaW50IGNvbHMgPSBhZGRyZXNzLkNvbHVtbnM7Ci0gICAgICAgICAgICBzdHJpbmcgcmV0QWRkcmVzcyA9ICIiOwotICAgICAgICAgICAgaWYgKFNoaWZ0PT1lU2hpZnRUeXBlLlJpZ2h0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLl9mcm9tUm93ID4gX2Zyb21Sb3cpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXRBZGRyZXNzID0gR2V0QWRkcmVzcyhfZnJvbVJvdywgX2Zyb21Db2wsIGFkZHJlc3MuX2Zyb21Sb3csIF90b0NvbCwgX2Zyb21Sb3dGaXhlZCwgX2Zyb21Db2xGaXhlZCwgX3RvUm93Rml4ZWQsIF90b0NvbEZpeGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoYWRkcmVzcy5fZnJvbUNvbCA+IF9mcm9tQ29sKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0QWRkcmVzcyA9IEdldEFkZHJlc3MoX2Zyb21Sb3cgPCBhZGRyZXNzLl9mcm9tUm93ID8gX2Zyb21Sb3cgOiBhZGRyZXNzLl9mcm9tUm93LCBfZnJvbUNvbCwgYWRkcmVzcy5fZnJvbVJvdywgX3RvQ29sLCBfZnJvbVJvd0ZpeGVkLCBfZnJvbUNvbEZpeGVkLCBfdG9Sb3dGaXhlZCwgX3RvQ29sRml4ZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChfdG9Sb3cgPCBhZGRyZXNzLl9mcm9tUm93KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZnJvbVJvdyA8IGFkZHJlc3MuX2Zyb21Sb3cpCi0gICAgICAgICAgICAgICAgeworICAgIGlmIChhZGRyZXNzLl9mcm9tUm93ID4gX3RvUm93CisgICAgICAgIHx8IGFkZHJlc3MuX2Zyb21Db2wgPiBfdG9Db2wKKyAgICAgICAgfHwgX2Zyb21Sb3cgPiBhZGRyZXNzLl90b1JvdworICAgICAgICB8fCBfZnJvbUNvbCA+IGFkZHJlc3MuX3RvQ29sKSB7CisgICAgICByZXR1cm4gZUFkZHJlc3NDb2xsaXRpb24uTm87CisgICAgfQorICAgIGlmIChhZGRyZXNzLl9mcm9tUm93ID09IF9mcm9tUm93CisgICAgICAgICYmIGFkZHJlc3MuX2Zyb21Db2wgPT0gX2Zyb21Db2wKKyAgICAgICAgJiYgYWRkcmVzcy5fdG9Sb3cgPT0gX3RvUm93CisgICAgICAgICYmIGFkZHJlc3MuX3RvQ29sID09IF90b0NvbCkgeworICAgICAgcmV0dXJuIGVBZGRyZXNzQ29sbGl0aW9uLkVxdWFsOworICAgIH0KKyAgICBpZiAoYWRkcmVzcy5fZnJvbVJvdyA+PSBfZnJvbVJvdworICAgICAgICAmJiBhZGRyZXNzLl90b1JvdyA8PSBfdG9Sb3cKKyAgICAgICAgJiYgYWRkcmVzcy5fZnJvbUNvbCA+PSBfZnJvbUNvbAorICAgICAgICAmJiBhZGRyZXNzLl90b0NvbCA8PSBfdG9Db2wpIHsKKyAgICAgIHJldHVybiBlQWRkcmVzc0NvbGxpdGlvbi5JbnNpZGU7CisgICAgfQorICAgIHJldHVybiBlQWRkcmVzc0NvbGxpdGlvbi5QYXJ0bHk7CisgIH0KIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOworICBpbnRlcm5hbCBFeGNlbEFkZHJlc3NCYXNlIEFkZFJvdyhpbnQgcm93LCBpbnQgcm93cywgYm9vbCBzZXRGaXhlZCA9IGZhbHNlKSB7CisgICAgaWYgKHJvdyA+IF90b1JvdykgeworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIGlmIChyb3cgPD0gX2Zyb21Sb3cpIHsKKyAgICAgIHJldHVybiBuZXcoCisgICAgICAgICAgKHNldEZpeGVkICYmIF9mcm9tUm93Rml4ZWQgPyBfZnJvbVJvdyA6IF9mcm9tUm93ICsgcm93cyksCisgICAgICAgICAgX2Zyb21Db2wsCisgICAgICAgICAgKHNldEZpeGVkICYmIF90b1Jvd0ZpeGVkID8gX3RvUm93IDogX3RvUm93ICsgcm93cyksCisgICAgICAgICAgX3RvQ29sLAorICAgICAgICAgIF9mcm9tUm93Rml4ZWQsCisgICAgICAgICAgX2Zyb21Db2xGaXhlZCwKKyAgICAgICAgICBfdG9Sb3dGaXhlZCwKKyAgICAgICAgICBfdG9Db2xGaXhlZCk7CisgICAgfQorICAgIHJldHVybiBuZXcoCisgICAgICAgIF9mcm9tUm93LAorICAgICAgICBfZnJvbUNvbCwKKyAgICAgICAgKHNldEZpeGVkICYmIF90b1Jvd0ZpeGVkID8gX3RvUm93IDogX3RvUm93ICsgcm93cyksCisgICAgICAgIF90b0NvbCwKKyAgICAgICAgX2Zyb21Sb3dGaXhlZCwKKyAgICAgICAgX2Zyb21Db2xGaXhlZCwKKyAgICAgICAgX3RvUm93Rml4ZWQsCisgICAgICAgIF90b0NvbEZpeGVkKTsKKyAgfQorCisgIGludGVybmFsIEV4Y2VsQWRkcmVzc0Jhc2UgRGVsZXRlUm93KGludCByb3csIGludCByb3dzLCBib29sIHNldEZpeGVkID0gZmFsc2UpIHsKKyAgICBpZiAocm93CisgICAgICAgID4gX3RvUm93KSAvL0FmdGVyCisgICAgeworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIGlmIChyb3cgKyByb3dzCisgICAgICAgIDw9IF9mcm9tUm93KSAvL0JlZm9yZQorICAgIHsKKyAgICAgIHJldHVybiBuZXcoCisgICAgICAgICAgKHNldEZpeGVkICYmIF9mcm9tUm93Rml4ZWQgPyBfZnJvbVJvdyA6IF9mcm9tUm93IC0gcm93cyksCisgICAgICAgICAgX2Zyb21Db2wsCisgICAgICAgICAgKHNldEZpeGVkICYmIF90b1Jvd0ZpeGVkID8gX3RvUm93IDogX3RvUm93IC0gcm93cyksCisgICAgICAgICAgX3RvQ29sLAorICAgICAgICAgIF9mcm9tUm93Rml4ZWQsCisgICAgICAgICAgX2Zyb21Db2xGaXhlZCwKKyAgICAgICAgICBfdG9Sb3dGaXhlZCwKKyAgICAgICAgICBfdG9Db2xGaXhlZCk7CisgICAgfQorICAgIGlmIChyb3cgPD0gX2Zyb21Sb3cKKyAgICAgICAgJiYgcm93ICsgcm93cworICAgICAgICAgICAgPiBfdG9Sb3cpIC8vSW5zaWRlCisgICAgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSAvL1BhcnRseQorICAgIGlmIChyb3cgPD0gX2Zyb21Sb3cpIHsKKyAgICAgIHJldHVybiBuZXcoCisgICAgICAgICAgcm93LAorICAgICAgICAgIF9mcm9tQ29sLAorICAgICAgICAgIChzZXRGaXhlZCAmJiBfdG9Sb3dGaXhlZCA/IF90b1JvdyA6IF90b1JvdyAtIHJvd3MpLAorICAgICAgICAgIF90b0NvbCwKKyAgICAgICAgICBfZnJvbVJvd0ZpeGVkLAorICAgICAgICAgIF9mcm9tQ29sRml4ZWQsCisgICAgICAgICAgX3RvUm93Rml4ZWQsCisgICAgICAgICAgX3RvQ29sRml4ZWQpOworICAgIH0KKyAgICByZXR1cm4gbmV3KAorICAgICAgICBfZnJvbVJvdywKKyAgICAgICAgX2Zyb21Db2wsCisgICAgICAgIChzZXRGaXhlZCAmJiBfdG9Sb3dGaXhlZAorICAgICAgICAgICAgICAgID8gX3RvUm93CisgICAgICAgICAgICAgICAgOiBfdG9Sb3cgLSByb3dzIDwgcm93CisgICAgICAgICAgICAgICAgICAgID8gcm93IC0gMQorICAgICAgICAgICAgICAgICAgICA6IF90b1JvdyAtIHJvd3MpLAorICAgICAgICBfdG9Db2wsCisgICAgICAgIF9mcm9tUm93Rml4ZWQsCisgICAgICAgIF9mcm9tQ29sRml4ZWQsCisgICAgICAgIF90b1Jvd0ZpeGVkLAorICAgICAgICBfdG9Db2xGaXhlZCk7CisgIH0KKworICBpbnRlcm5hbCBFeGNlbEFkZHJlc3NCYXNlIEFkZENvbHVtbihpbnQgY29sLCBpbnQgY29scywgYm9vbCBzZXRGaXhlZCA9IGZhbHNlKSB7CisgICAgaWYgKGNvbCA+IF90b0NvbCkgeworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIGlmIChjb2wgPD0gX2Zyb21Db2wpIHsKKyAgICAgIHJldHVybiBuZXcoCisgICAgICAgICAgX2Zyb21Sb3csCisgICAgICAgICAgKHNldEZpeGVkICYmIF9mcm9tQ29sRml4ZWQgPyBfZnJvbUNvbCA6IF9mcm9tQ29sICsgY29scyksCisgICAgICAgICAgX3RvUm93LAorICAgICAgICAgIChzZXRGaXhlZCAmJiBfdG9Db2xGaXhlZCA/IF90b0NvbCA6IF90b0NvbCArIGNvbHMpLAorICAgICAgICAgIF9mcm9tUm93Rml4ZWQsCisgICAgICAgICAgX2Zyb21Db2xGaXhlZCwKKyAgICAgICAgICBfdG9Sb3dGaXhlZCwKKyAgICAgICAgICBfdG9Db2xGaXhlZCk7CisgICAgfQorICAgIHJldHVybiBuZXcoCisgICAgICAgIF9mcm9tUm93LAorICAgICAgICBfZnJvbUNvbCwKKyAgICAgICAgX3RvUm93LAorICAgICAgICAoc2V0Rml4ZWQgJiYgX3RvQ29sRml4ZWQgPyBfdG9Db2wgOiBfdG9Db2wgKyBjb2xzKSwKKyAgICAgICAgX2Zyb21Sb3dGaXhlZCwKKyAgICAgICAgX2Zyb21Db2xGaXhlZCwKKyAgICAgICAgX3RvUm93Rml4ZWQsCisgICAgICAgIF90b0NvbEZpeGVkKTsKKyAgfQorCisgIGludGVybmFsIEV4Y2VsQWRkcmVzc0Jhc2UgRGVsZXRlQ29sdW1uKGludCBjb2wsIGludCBjb2xzLCBib29sIHNldEZpeGVkID0gZmFsc2UpIHsKKyAgICBpZiAoY29sCisgICAgICAgID4gX3RvQ29sKSAvL0FmdGVyCisgICAgeworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIGlmIChjb2wgKyBjb2xzCisgICAgICAgIDw9IF9mcm9tQ29sKSAvL0JlZm9yZQorICAgIHsKKyAgICAgIHJldHVybiBuZXcoCisgICAgICAgICAgX2Zyb21Sb3csCisgICAgICAgICAgKHNldEZpeGVkICYmIF9mcm9tQ29sRml4ZWQgPyBfZnJvbUNvbCA6IF9mcm9tQ29sIC0gY29scyksCisgICAgICAgICAgX3RvUm93LAorICAgICAgICAgIChzZXRGaXhlZCAmJiBfdG9Db2xGaXhlZCA/IF90b0NvbCA6IF90b0NvbCAtIGNvbHMpLAorICAgICAgICAgIF9mcm9tUm93Rml4ZWQsCisgICAgICAgICAgX2Zyb21Db2xGaXhlZCwKKyAgICAgICAgICBfdG9Sb3dGaXhlZCwKKyAgICAgICAgICBfdG9Db2xGaXhlZCk7CisgICAgfQorICAgIGlmIChjb2wgPD0gX2Zyb21Db2wKKyAgICAgICAgJiYgY29sICsgY29scworICAgICAgICAgICAgPiBfdG9Db2wpIC8vSW5zaWRlCisgICAgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfSAvL1BhcnRseQorICAgIGlmIChjb2wgPD0gX2Zyb21Db2wpIHsKKyAgICAgIHJldHVybiBuZXcoCisgICAgICAgICAgX2Zyb21Sb3csCisgICAgICAgICAgY29sLAorICAgICAgICAgIF90b1JvdywKKyAgICAgICAgICAoc2V0Rml4ZWQgJiYgX3RvQ29sRml4ZWQgPyBfdG9Db2wgOiBfdG9Db2wgLSBjb2xzKSwKKyAgICAgICAgICBfZnJvbVJvd0ZpeGVkLAorICAgICAgICAgIF9mcm9tQ29sRml4ZWQsCisgICAgICAgICAgX3RvUm93Rml4ZWQsCisgICAgICAgICAgX3RvQ29sRml4ZWQpOworICAgIH0KKyAgICByZXR1cm4gbmV3KAorICAgICAgICBfZnJvbVJvdywKKyAgICAgICAgX2Zyb21Db2wsCisgICAgICAgIF90b1JvdywKKyAgICAgICAgKHNldEZpeGVkICYmIF90b0NvbEZpeGVkCisgICAgICAgICAgICAgICAgPyBfdG9Db2wKKyAgICAgICAgICAgICAgICA6IF90b0NvbCAtIGNvbHMgPCBjb2wKKyAgICAgICAgICAgICAgICAgICAgPyBjb2wgLSAxCisgICAgICAgICAgICAgICAgICAgIDogX3RvQ29sIC0gY29scyksCisgICAgICAgIF9mcm9tUm93Rml4ZWQsCisgICAgICAgIF9mcm9tQ29sRml4ZWQsCisgICAgICAgIF90b1Jvd0ZpeGVkLAorICAgICAgICBfdG9Db2xGaXhlZCk7CisgIH0KKworICBpbnRlcm5hbCBFeGNlbEFkZHJlc3NCYXNlIEluc2VydCgKKyAgICAgIEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcywKKyAgICAgIGVTaGlmdFR5cGUgc2hpZnQgLyosIG91dCBFeGNlbEFkZHJlc3NCYXNlIHRvcEFkZHJlc3MsIG91dCBFeGNlbEFkZHJlc3NCYXNlIGxlZnRBZGRyZXNzLCBvdXQgRXhjZWxBZGRyZXNzQmFzZSByaWdodEFkZHJlc3MsIG91dCBFeGNlbEFkZHJlc3NCYXNlIGJvdHRvbUFkZHJlc3MqLykgeworICAgIC8vQmVmb3JlIG9yIGFmdGVyLCBubyBjaGFuZ2UKKyAgICAvL2lmICgoX3RvUm93ID4gYWRkcmVzcy5fZnJvbVJvdyAmJiBfdG9Db2wgPiBhZGRyZXNzLmNvbHVtbikgfHwKKyAgICAvLyAgICAoX2Zyb21Sb3cgPiBhZGRyZXNzLl90b1JvdyAmJiBjb2x1bW4gPiBhZGRyZXNzLl90b0NvbCkpCisgICAgaWYgKF90b1JvdyA8IGFkZHJlc3MuX2Zyb21Sb3cKKyAgICAgICAgfHwgX3RvQ29sIDwgYWRkcmVzcy5fZnJvbUNvbAorICAgICAgICB8fCAoX2Zyb21Sb3cgPiBhZGRyZXNzLl90b1JvdyAmJiBfZnJvbUNvbCA+IGFkZHJlc3MuX3RvQ29sKSkgeworICAgICAgLy90b3BBZGRyZXNzID0gbnVsbDsKKyAgICAgIC8vbGVmdEFkZHJlc3MgPSBudWxsOworICAgICAgLy9yaWdodEFkZHJlc3MgPSBudWxsOworICAgICAgLy9ib3R0b21BZGRyZXNzID0gbnVsbDsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIGludCByb3dzID0gYWRkcmVzcy5Sb3dzOworICAgIGludCBjb2xzID0gYWRkcmVzcy5Db2x1bW5zOworICAgIHN0cmluZyByZXRBZGRyZXNzID0gIiI7CisgICAgaWYgKHNoaWZ0ID09IGVTaGlmdFR5cGUuUmlnaHQpIHsKKyAgICAgIGlmIChhZGRyZXNzLl9mcm9tUm93ID4gX2Zyb21Sb3cpIHsKKyAgICAgICAgcmV0QWRkcmVzcyA9IEdldEFkZHJlc3MoCisgICAgICAgICAgICBfZnJvbVJvdywKKyAgICAgICAgICAgIF9mcm9tQ29sLAorICAgICAgICAgICAgYWRkcmVzcy5fZnJvbVJvdywKKyAgICAgICAgICAgIF90b0NvbCwKKyAgICAgICAgICAgIF9mcm9tUm93Rml4ZWQsCisgICAgICAgICAgICBfZnJvbUNvbEZpeGVkLAorICAgICAgICAgICAgX3RvUm93Rml4ZWQsCisgICAgICAgICAgICBfdG9Db2xGaXhlZCk7CisgICAgICB9CisgICAgICBpZiAoYWRkcmVzcy5fZnJvbUNvbCA+IF9mcm9tQ29sKSB7CisgICAgICAgIHJldEFkZHJlc3MgPSBHZXRBZGRyZXNzKAorICAgICAgICAgICAgX2Zyb21Sb3cgPCBhZGRyZXNzLl9mcm9tUm93ID8gX2Zyb21Sb3cgOiBhZGRyZXNzLl9mcm9tUm93LAorICAgICAgICAgICAgX2Zyb21Db2wsCisgICAgICAgICAgICBhZGRyZXNzLl9mcm9tUm93LAorICAgICAgICAgICAgX3RvQ29sLAorICAgICAgICAgICAgX2Zyb21Sb3dGaXhlZCwKKyAgICAgICAgICAgIF9mcm9tQ29sRml4ZWQsCisgICAgICAgICAgICBfdG9Sb3dGaXhlZCwKKyAgICAgICAgICAgIF90b0NvbEZpeGVkKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKF90b1JvdyA8IGFkZHJlc3MuX2Zyb21Sb3cpIHsKKyAgICAgIGlmIChfZnJvbVJvdyA8IGFkZHJlc3MuX2Zyb21Sb3cpIHt9CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIFNldEFkZHJlc3MocmVmIHN0cmluZyBmaXJzdCwgcmVmIHN0cmluZyBzZWNvbmQsIHJlZiBib29sIGhhc1NoZWV0KSB7CisgICAgc3RyaW5nIHdzLAorICAgICAgICBhZGRyZXNzOworICAgIGlmIChoYXNTaGVldCkgeworICAgICAgd3MgPSBmaXJzdDsKKyAgICAgIGFkZHJlc3MgPSBzZWNvbmQ7CisgICAgICBmaXJzdCA9ICIiOworICAgICAgc2Vjb25kID0gIiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGFkZHJlc3MgPSBmaXJzdDsKKyAgICAgIHdzID0gIiI7CisgICAgICBmaXJzdCA9ICIiOworICAgIH0KKyAgICBoYXNTaGVldCA9IGZhbHNlOworICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfZmlyc3RBZGRyZXNzKSkgeworICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KF93cykgfHwgIXN0cmluZy5Jc051bGxPckVtcHR5KHdzKSkgeworICAgICAgICBfd3MgPSB3czsKKyAgICAgIH0KKyAgICAgIF9maXJzdEFkZHJlc3MgPSBhZGRyZXNzOworICAgICAgR2V0Um93Q29sRnJvbUFkZHJlc3MoCisgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICBvdXQgX2Zyb21Sb3csCisgICAgICAgICAgb3V0IF9mcm9tQ29sLAorICAgICAgICAgIG91dCBfdG9Sb3csCisgICAgICAgICAgb3V0IF90b0NvbCwKKyAgICAgICAgICBvdXQgX2Zyb21Sb3dGaXhlZCwKKyAgICAgICAgICBvdXQgX2Zyb21Db2xGaXhlZCwKKyAgICAgICAgICBvdXQgX3RvUm93Rml4ZWQsCisgICAgICAgICAgb3V0IF90b0NvbEZpeGVkKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKF9hZGRyZXNzZXMgPT0gbnVsbCkgeworICAgICAgICBfYWRkcmVzc2VzID0gbmV3KCk7CisgICAgICB9CisgICAgICBfYWRkcmVzc2VzLkFkZChuZXcoX3dzLCBhZGRyZXNzKSk7CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgZW51bSBBZGRyZXNzVHlwZSB7CisgICAgSW52YWxpZCwKKyAgICBJbnRlcm5hbEFkZHJlc3MsCisgICAgRXh0ZXJuYWxBZGRyZXNzLAorICAgIEludGVybmFsTmFtZSwKKyAgICBFeHRlcm5hbE5hbWUsCisgICAgRm9ybXVsYSwKKyAgfQorCisgIGludGVybmFsIHN0YXRpYyBBZGRyZXNzVHlwZSBJc1ZhbGlkKHN0cmluZyBhZGRyZXNzKSB7CisgICAgZG91YmxlIGQ7CisgICAgaWYgKGFkZHJlc3MgPT0gIiNSRUYhIikgeworICAgICAgcmV0dXJuIEFkZHJlc3NUeXBlLkludmFsaWQ7CisgICAgfQorICAgIGlmIChkb3VibGUuVHJ5UGFyc2UoCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgIE51bWJlclN0eWxlcy5BbnksCisgICAgICAgIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsCisgICAgICAgIG91dCBkKSkgLy9BIGRvdWJsZSwgbm8gdmFsaWQgYWRkcmVzcworICAgIHsKKyAgICAgIHJldHVybiBBZGRyZXNzVHlwZS5JbnZhbGlkOworICAgIH0KKyAgICBpZiAoSXNGb3JtdWxhKGFkZHJlc3MpKSB7CisgICAgICByZXR1cm4gQWRkcmVzc1R5cGUuRm9ybXVsYTsKKyAgICB9CisgICAgc3RyaW5nIHdiLAorICAgICAgICB3cywKKyAgICAgICAgaW50QWRkcmVzczsKKyAgICBpZiAoU3BsaXRBZGRyZXNzKGFkZHJlc3MsIG91dCB3Yiwgb3V0IHdzLCBvdXQgaW50QWRkcmVzcykpIHsKKyAgICAgIGlmIChpbnRBZGRyZXNzLkNvbnRhaW5zKAorICAgICAgICAgICJbIikpIC8vVGFibGUgcmVmZXJlbmNlCisgICAgICB7CisgICAgICAgIHJldHVybiBzdHJpbmcuSXNOdWxsT3JFbXB0eSh3YikgPyBBZGRyZXNzVHlwZS5JbnRlcm5hbEFkZHJlc3MgOiBBZGRyZXNzVHlwZS5FeHRlcm5hbEFkZHJlc3M7CisgICAgICB9CisgICAgICBpZiAoaW50QWRkcmVzcy5Db250YWlucygiLCIpKSB7CisgICAgICAgIGludEFkZHJlc3MgPSBpbnRBZGRyZXNzLlN1YnN0cmluZygwLCBpbnRBZGRyZXNzLkluZGV4T2YoJywnKSk7CisgICAgICB9CisgICAgICBpZiAoSXNBZGRyZXNzKGludEFkZHJlc3MpKSB7CisgICAgICAgIHJldHVybiBzdHJpbmcuSXNOdWxsT3JFbXB0eSh3YikgPyBBZGRyZXNzVHlwZS5JbnRlcm5hbEFkZHJlc3MgOiBBZGRyZXNzVHlwZS5FeHRlcm5hbEFkZHJlc3M7CisgICAgICB9CisgICAgICByZXR1cm4gc3RyaW5nLklzTnVsbE9yRW1wdHkod2IpID8gQWRkcmVzc1R5cGUuSW50ZXJuYWxOYW1lIDogQWRkcmVzc1R5cGUuRXh0ZXJuYWxOYW1lOworICAgIH0KKyAgICByZXR1cm4gQWRkcmVzc1R5cGUuSW52YWxpZDsKKworICAgIC8vaWYoc3RyaW5nLklzTnVsbE9yRW1wdHkod2IpKTsKKyAgICAvL0V4Y2VsQWRkcmVzcyBhID0gbmV3IEV4Y2VsQWRkcmVzcyhBZGRyZXNzKTsKKyAgICAvL2lmIChBZGRyZXNzLkluZGV4T2YoJyEnKSA+IDApCisgICAgLy97CisgICAgLy8gICAgc3RyaW5nW10gc3BsaXQgPSBBZGRyZXNzLlNwbGl0KCchJyk7CisgICAgLy8gICAgaWYgKHNwbGl0Lkxlbmd0aCA9PSAyKQorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICAgd3MgPSBzcGxpdFswXTsKKyAgICAvLyAgICAgICAgQWRkcmVzcyA9IHNwbGl0WzFdOworICAgIC8vICAgIH0KKyAgICAvLyAgICBlbHNlIGlmIChzcGxpdC5MZW5ndGggPT0gMyAmJiBzcGxpdFsxXSA9PSAiI1JFRiIgJiYgc3BsaXRbMl0gPT0gIiIpCisgICAgLy8gICAgeworICAgIC8vICAgICAgICB3cyA9IHNwbGl0WzBdOworICAgIC8vICAgICAgICBBZGRyZXNzID0gIiNSRUYhIjsKKyAgICAvLyAgICAgICAgaWYgKHdzLlN0YXJ0c1dpdGgoIlsiKSAmJiB3cy5JbmRleE9mKCJdIikgPiAxKQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICByZXR1cm4gQWRkcmVzc1R5cGUuRXh0ZXJuYWxBZGRyZXNzOworICAgIC8vICAgICAgICB9CisgICAgLy8gICAgICAgIGVsc2UKKyAgICAvLyAgICAgICAgeworICAgIC8vICAgICAgICAgICAgcmV0dXJuIEFkZHJlc3NUeXBlLkludGVybmFsQWRkcmVzczsKKyAgICAvLyAgICAgICAgfQorICAgIC8vICAgIH0KKyAgICAvLyAgICBlbHNlCisgICAgLy8gICAgeworICAgIC8vICAgICAgICByZXR1cm4gQWRkcmVzc1R5cGUuSW52YWxpZDsKKyAgICAvLyAgICB9CisgICAgLy99CisgICAgLy9pbnQgX2Zyb21Sb3csIGNvbHVtbiwgX3RvUm93LCBfdG9Db2w7CisgICAgLy9pZiAoRXhjZWxBZGRyZXNzQmFzZS5HZXRSb3dDb2xGcm9tQWRkcmVzcyhBZGRyZXNzLCBvdXQgX2Zyb21Sb3csIG91dCBjb2x1bW4sIG91dCBfdG9Sb3csIG91dCBfdG9Db2wpKQorICAgIC8veworICAgIC8vICAgIGlmIChfZnJvbVJvdyA+IDAgJiYgY29sdW1uID4gMCAmJiBfdG9Sb3cgPD0gRXhjZWxQYWNrYWdlLk1heFJvd3MgJiYgX3RvQ29sIDw9IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKQorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICAgaWYgKHdzLlN0YXJ0c1dpdGgoIlsiKSAmJiB3cy5JbmRleE9mKCJdIikgPiAxKQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICByZXR1cm4gQWRkcmVzc1R5cGUuRXh0ZXJuYWxBZGRyZXNzOworICAgIC8vICAgICAgICB9CisgICAgLy8gICAgICAgIGVsc2UKKyAgICAvLyAgICAgICAgeworICAgIC8vICAgICAgICAgICAgcmV0dXJuIEFkZHJlc3NUeXBlLkludGVybmFsQWRkcmVzczsKKyAgICAvLyAgICAgICAgfQorICAgIC8vICAgIH0KKyAgICAvLyAgICBlbHNlCisgICAgLy8gICAgeworICAgIC8vICAgICAgICByZXR1cm4gQWRkcmVzc1R5cGUuSW52YWxpZDsKKyAgICAvLyAgICB9CisgICAgLy99CisgICAgLy9lbHNlCisgICAgLy97CisgICAgLy8gICAgaWYoSXNWYWxpZE5hbWUoQWRkcmVzcykpCisgICAgLy8gICAgeworICAgIC8vICAgICAgICBpZiAod3MuU3RhcnRzV2l0aCgiWyIpICYmIHdzLkluZGV4T2YoIl0iKSA+IDEpCisgICAgLy8gICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgIHJldHVybiBBZGRyZXNzVHlwZS5FeHRlcm5hbE5hbWU7CisgICAgLy8gICAgICAgIH0KKyAgICAvLyAgICAgICAgZWxzZQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICByZXR1cm4gQWRkcmVzc1R5cGUuSW50ZXJuYWxOYW1lOworICAgIC8vICAgICAgICB9CisgICAgLy8gICAgfQorICAgIC8vICAgIGVsc2UKKyAgICAvLyAgICB7CisgICAgLy8gICAgICAgIHJldHVybiBBZGRyZXNzVHlwZS5JbnZhbGlkOworICAgIC8vICAgIH0KKyAgICAvL30KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2wgSXNBZGRyZXNzKHN0cmluZyBpbnRBZGRyZXNzKSB7CisgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGludEFkZHJlc3MpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZhciBjZWxscyA9IGludEFkZHJlc3MuU3BsaXQoJzonKTsKKyAgICBpbnQgZnJvbVJvdywKKyAgICAgICAgdG9Sb3csCisgICAgICAgIGZyb21Db2wsCisgICAgICAgIHRvQ29sOworCisgICAgaWYgKCFHZXRSb3dDb2woY2VsbHNbMF0sIG91dCBmcm9tUm93LCBvdXQgZnJvbUNvbCwgZmFsc2UpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChjZWxscy5MZW5ndGggPiAxKSB7CisgICAgICBpZiAoIUdldFJvd0NvbChjZWxsc1sxXSwgb3V0IHRvUm93LCBvdXQgdG9Db2wsIGZhbHNlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRvUm93ID0gZnJvbVJvdzsKKyAgICAgIHRvQ29sID0gZnJvbUNvbDsKKyAgICB9CisgICAgaWYgKGZyb21Sb3cgPD0gdG9Sb3cKKyAgICAgICAgJiYgZnJvbUNvbCA8PSB0b0NvbAorICAgICAgICAmJiBmcm9tQ29sID4gLTEKKyAgICAgICAgJiYgdG9Db2wgPD0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMKKyAgICAgICAgJiYgZnJvbVJvdyA+IC0xCisgICAgICAgICYmIHRvUm93IDw9IEV4Y2VsUGFja2FnZS5NYXhSb3dzKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBTcGxpdEFkZHJlc3MoCisgICAgICBzdHJpbmcgYWRkcmVzcywKKyAgICAgIG91dCBzdHJpbmcgd2IsCisgICAgICBvdXQgc3RyaW5nIHdzLAorICAgICAgb3V0IHN0cmluZyBpbnRBZGRyZXNzKSB7CisgICAgd2IgPSAiIjsKKyAgICB3cyA9ICIiOworICAgIGludEFkZHJlc3MgPSAiIjsKKyAgICB2YXIgdGV4dCA9ICIiOworICAgIGJvb2wgaXNUZXh0ID0gZmFsc2U7CisgICAgdmFyIGJyYWNrUG9zID0gLTE7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRyZXNzLkxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAoYWRkcmVzc1tpXSA9PSAnXCcnKSB7CisgICAgICAgIGlzVGV4dCA9ICFpc1RleHQ7CisgICAgICAgIGlmIChpID4gMCAmJiBhZGRyZXNzW2kgLSAxXSA9PSAnXCcnKSB7CisgICAgICAgICAgdGV4dCArPSAiJyI7CiAgICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICBwcml2YXRlIHZvaWQgU2V0QWRkcmVzcyhyZWYgc3RyaW5nIGZpcnN0LCByZWYgc3RyaW5nIHNlY29uZCwgcmVmIGJvb2wgaGFzU2hlZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyB3cywgYWRkcmVzczsKLSAgICAgICAgICAgIGlmIChoYXNTaGVldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cyA9IGZpcnN0OwotICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBzZWNvbmQ7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSAiIjsKLSAgICAgICAgICAgICAgICBzZWNvbmQgPSAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRyZXNzID0gZmlyc3Q7Ci0gICAgICAgICAgICAgICAgd3MgPSAiIjsKLSAgICAgICAgICAgICAgICBmaXJzdCA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGFzU2hlZXQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfZmlyc3RBZGRyZXNzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihzdHJpbmcuSXNOdWxsT3JFbXB0eShfd3MpIHx8ICFzdHJpbmcuSXNOdWxsT3JFbXB0eSh3cykpIF93cyA9IHdzOwotICAgICAgICAgICAgICAgIF9maXJzdEFkZHJlc3MgPSBhZGRyZXNzOwotICAgICAgICAgICAgICAgIEdldFJvd0NvbEZyb21BZGRyZXNzKGFkZHJlc3MsIG91dCBfZnJvbVJvdywgb3V0IF9mcm9tQ29sLCBvdXQgX3RvUm93LCBvdXQgIF90b0NvbCwgb3V0IF9mcm9tUm93Rml4ZWQsIG91dCBfZnJvbUNvbEZpeGVkLCBvdXQgX3RvUm93Rml4ZWQsIG91dCBfdG9Db2xGaXhlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9hZGRyZXNzZXMgPT0gbnVsbCkgX2FkZHJlc3NlcyA9IG5ldyBMaXN0PEV4Y2VsQWRkcmVzcz4oKTsKLSAgICAgICAgICAgICAgICBfYWRkcmVzc2VzLkFkZChuZXcgRXhjZWxBZGRyZXNzKF93cywgYWRkcmVzcykpOwotICAgICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGFkZHJlc3NbaV0gPT0gJyEnICYmICFpc1RleHQpIHsKKyAgICAgICAgICBpZiAodGV4dC5MZW5ndGggPiAwICYmIHRleHRbMF0gPT0gJ1snKSB7CisgICAgICAgICAgICB3YiA9IHRleHQuU3Vic3RyaW5nKDEsIHRleHQuSW5kZXhPZigiXSIpIC0gMSk7CisgICAgICAgICAgICB3cyA9IHRleHQuU3Vic3RyaW5nKHRleHQuSW5kZXhPZigiXSIpICsgMSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdzID0gdGV4dDsKKyAgICAgICAgICB9CisgICAgICAgICAgaW50QWRkcmVzcyA9IGFkZHJlc3MuU3Vic3RyaW5nKGkgKyAxKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBlbnVtIEFkZHJlc3NUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEludmFsaWQsCi0gICAgICAgICAgICBJbnRlcm5hbEFkZHJlc3MsCi0gICAgICAgICAgICBFeHRlcm5hbEFkZHJlc3MsCi0gICAgICAgICAgICBJbnRlcm5hbE5hbWUsCi0gICAgICAgICAgICBFeHRlcm5hbE5hbWUsCi0gICAgICAgICAgICBGb3JtdWxhCi0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgQWRkcmVzc1R5cGUgSXNWYWxpZChzdHJpbmcgQWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlIGQ7Ci0gICAgICAgICAgICBpZiAoQWRkcmVzcyA9PSAiI1JFRiEiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBBZGRyZXNzVHlwZS5JbnZhbGlkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZihkb3VibGUuVHJ5UGFyc2UoQWRkcmVzcywgTnVtYmVyU3R5bGVzLkFueSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IGQpKSAvL0EgZG91YmxlLCBubyB2YWxpZCBhZGRyZXNzCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFkZHJlc3NUeXBlLkludmFsaWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChJc0Zvcm11bGEoQWRkcmVzcykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFkZHJlc3NUeXBlLkZvcm11bGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHdiLCB3cywgaW50QWRkcmVzczsKLSAgICAgICAgICAgICAgICBpZihTcGxpdEFkZHJlc3MoQWRkcmVzcywgb3V0IHdiLCBvdXQgd3MsIG91dCBpbnRBZGRyZXNzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGludEFkZHJlc3MuQ29udGFpbnMoIlsiKSkgLy9UYWJsZSByZWZlcmVuY2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5Jc051bGxPckVtcHR5KHdiKSA/IEFkZHJlc3NUeXBlLkludGVybmFsQWRkcmVzcyA6IEFkZHJlc3NUeXBlLkV4dGVybmFsQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGludEFkZHJlc3MuQ29udGFpbnMoIiwiKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50QWRkcmVzcz1pbnRBZGRyZXNzLlN1YnN0cmluZygwLCBpbnRBZGRyZXNzLkluZGV4T2YoJywnKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoSXNBZGRyZXNzKGludEFkZHJlc3MpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLklzTnVsbE9yRW1wdHkod2IpID8gQWRkcmVzc1R5cGUuSW50ZXJuYWxBZGRyZXNzIDogQWRkcmVzc1R5cGUuRXh0ZXJuYWxBZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5Jc051bGxPckVtcHR5KHdiKSA/IEFkZHJlc3NUeXBlLkludGVybmFsTmFtZSA6IEFkZHJlc3NUeXBlLkV4dGVybmFsTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWRkcmVzc1R5cGUuSW52YWxpZDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL2lmKHN0cmluZy5Jc051bGxPckVtcHR5KHdiKSk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vRXhjZWxBZGRyZXNzIGEgPSBuZXcgRXhjZWxBZGRyZXNzKEFkZHJlc3MpOwotICAgICAgICAgICAgLy9pZiAoQWRkcmVzcy5JbmRleE9mKCchJykgPiAwKQotICAgICAgICAgICAgLy97ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gICAgc3RyaW5nW10gc3BsaXQgPSBBZGRyZXNzLlNwbGl0KCchJyk7Ci0gICAgICAgICAgICAvLyAgICBpZiAoc3BsaXQuTGVuZ3RoID09IDIpCi0gICAgICAgICAgICAvLyAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgd3MgPSBzcGxpdFswXTsKLSAgICAgICAgICAgIC8vICAgICAgICBBZGRyZXNzID0gc3BsaXRbMV07Ci0gICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAvLyAgICBlbHNlIGlmIChzcGxpdC5MZW5ndGggPT0gMyAmJiBzcGxpdFsxXSA9PSAiI1JFRiIgJiYgc3BsaXRbMl0gPT0gIiIpCi0gICAgICAgICAgICAvLyAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgd3MgPSBzcGxpdFswXTsKLSAgICAgICAgICAgIC8vICAgICAgICBBZGRyZXNzID0gIiNSRUYhIjsKLSAgICAgICAgICAgIC8vICAgICAgICBpZiAod3MuU3RhcnRzV2l0aCgiWyIpICYmIHdzLkluZGV4T2YoIl0iKSA+IDEpCi0gICAgICAgICAgICAvLyAgICAgICAgewotICAgICAgICAgICAgLy8gICAgICAgICAgICByZXR1cm4gQWRkcmVzc1R5cGUuRXh0ZXJuYWxBZGRyZXNzOwotICAgICAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgICAgIC8vICAgICAgICBlbHNlCi0gICAgICAgICAgICAvLyAgICAgICAgewotICAgICAgICAgICAgLy8gICAgICAgICAgICByZXR1cm4gQWRkcmVzc1R5cGUuSW50ZXJuYWxBZGRyZXNzOwotICAgICAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgICAgIC8vICAgIH0KLSAgICAgICAgICAgIC8vICAgIGVsc2UKLSAgICAgICAgICAgIC8vICAgIHsKLSAgICAgICAgICAgIC8vICAgICAgICByZXR1cm4gQWRkcmVzc1R5cGUuSW52YWxpZDsKLSAgICAgICAgICAgIC8vICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgLy9pbnQgX2Zyb21Sb3csIGNvbHVtbiwgX3RvUm93LCBfdG9Db2w7Ci0gICAgICAgICAgICAvL2lmIChFeGNlbEFkZHJlc3NCYXNlLkdldFJvd0NvbEZyb21BZGRyZXNzKEFkZHJlc3MsIG91dCBfZnJvbVJvdywgb3V0IGNvbHVtbiwgb3V0IF90b1Jvdywgb3V0IF90b0NvbCkpCi0gICAgICAgICAgICAvL3sKLSAgICAgICAgICAgIC8vICAgIGlmIChfZnJvbVJvdyA+IDAgJiYgY29sdW1uID4gMCAmJiBfdG9Sb3cgPD0gRXhjZWxQYWNrYWdlLk1heFJvd3MgJiYgX3RvQ29sIDw9IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKQotICAgICAgICAgICAgLy8gICAgewotICAgICAgICAgICAgLy8gICAgICAgIGlmICh3cy5TdGFydHNXaXRoKCJbIikgJiYgd3MuSW5kZXhPZigiXSIpID4gMSkKLSAgICAgICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBBZGRyZXNzVHlwZS5FeHRlcm5hbEFkZHJlc3M7Ci0gICAgICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAgICAgLy8gICAgICAgIGVsc2UKLSAgICAgICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBBZGRyZXNzVHlwZS5JbnRlcm5hbEFkZHJlc3M7Ci0gICAgICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAgICAgLy8gICAgfQotICAgICAgICAgICAgLy8gICAgZWxzZQotICAgICAgICAgICAgLy8gICAgewotICAgICAgICAgICAgLy8gICAgICAgIHJldHVybiBBZGRyZXNzVHlwZS5JbnZhbGlkOwotICAgICAgICAgICAgLy8gICAgfQotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAvL2Vsc2UKLSAgICAgICAgICAgIC8vewotICAgICAgICAgICAgLy8gICAgaWYoSXNWYWxpZE5hbWUoQWRkcmVzcykpCi0gICAgICAgICAgICAvLyAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgaWYgKHdzLlN0YXJ0c1dpdGgoIlsiKSAmJiB3cy5JbmRleE9mKCJdIikgPiAxKQotICAgICAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIEFkZHJlc3NUeXBlLkV4dGVybmFsTmFtZTsKLSAgICAgICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgICAgICAvLyAgICAgICAgZWxzZQotICAgICAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIEFkZHJlc3NUeXBlLkludGVybmFsTmFtZTsKLSAgICAgICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAvLyAgICBlbHNlCi0gICAgICAgICAgICAvLyAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgcmV0dXJuIEFkZHJlc3NUeXBlLkludmFsaWQ7Ci0gICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAvL30KLQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBJc0FkZHJlc3Moc3RyaW5nIGludEFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KGludEFkZHJlc3MpKSByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgCi0gICAgICAgICAgICB2YXIgY2VsbHMgPSBpbnRBZGRyZXNzLlNwbGl0KCc6Jyk7Ci0gICAgICAgICAgICBpbnQgZnJvbVJvdyx0b1JvdywgZnJvbUNvbCwgdG9Db2w7Ci0KLSAgICAgICAgICAgIGlmKCFHZXRSb3dDb2woY2VsbHNbMF0sIG91dCBmcm9tUm93LCBvdXQgZnJvbUNvbCwgZmFsc2UpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjZWxscy5MZW5ndGggPiAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghR2V0Um93Q29sKGNlbGxzWzFdLCBvdXQgdG9Sb3csIG91dCB0b0NvbCwgZmFsc2UpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b1JvdyA9IGZyb21Sb3c7Ci0gICAgICAgICAgICAgICAgdG9Db2wgPSBmcm9tQ29sOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIGZyb21Sb3cgPD0gdG9Sb3cgJiYgCi0gICAgICAgICAgICAgICAgZnJvbUNvbCA8PSB0b0NvbCAmJiAKLSAgICAgICAgICAgICAgICBmcm9tQ29sID4gLTEgJiYgCi0gICAgICAgICAgICAgICAgdG9Db2wgPD0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMgJiYgCi0gICAgICAgICAgICAgICAgZnJvbVJvdyA+IC0xICYmIAotICAgICAgICAgICAgICAgIHRvUm93IDw9IEV4Y2VsUGFja2FnZS5NYXhSb3dzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgU3BsaXRBZGRyZXNzKHN0cmluZyBBZGRyZXNzLCBvdXQgc3RyaW5nIHdiLCBvdXQgc3RyaW5nIHdzLCBvdXQgc3RyaW5nIGludEFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdiID0gIiI7Ci0gICAgICAgICAgICB3cyA9ICIiOwotICAgICAgICAgICAgaW50QWRkcmVzcyA9ICIiOwotICAgICAgICAgICAgdmFyIHRleHQgPSAiIjsKLSAgICAgICAgICAgIGJvb2wgaXNUZXh0ID0gZmFsc2U7Ci0gICAgICAgICAgICB2YXIgYnJhY2tQb3M9LTE7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFkZHJlc3MuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEFkZHJlc3NbaV0gPT0gJ1wnJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlzVGV4dCA9ICFpc1RleHQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGk+MCAmJiBBZGRyZXNzW2ktMV09PSdcJycpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gIiciOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKEFkZHJlc3NbaV09PSchJyAmJiAhaXNUZXh0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dC5MZW5ndGg+MCAmJiB0ZXh0WzBdID09ICdbJykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YiA9IHRleHQuU3Vic3RyaW5nKDEsIHRleHQuSW5kZXhPZigiXSIpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MgPSB0ZXh0LlN1YnN0cmluZyh0ZXh0LkluZGV4T2YoIl0iKSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzPXRleHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRBZGRyZXNzPUFkZHJlc3MuU3Vic3RyaW5nKGkrMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKEFkZHJlc3NbaV09PSdbJyAmJiAhaXNUZXh0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkgLy9UYWJsZSByZWZlcmVuY2UgcmV0dXJuIGZ1bGwgYWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludEFkZHJlc3M9QWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYWNrUG9zPWk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKEFkZHJlc3NbaV09PSddJyAmJiAhaXNUZXh0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChicmFja1BvcyA+IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2IgPSB0ZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCs9QWRkcmVzc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludEFkZHJlc3MgPSB0ZXh0OworICAgICAgICBpZiAoYWRkcmVzc1tpXSA9PSAnWycgJiYgIWlzVGV4dCkgeworICAgICAgICAgIGlmIChpCisgICAgICAgICAgICAgID4gMCkgLy9UYWJsZSByZWZlcmVuY2UgcmV0dXJuIGZ1bGwgYWRkcmVzczsKKyAgICAgICAgICB7CisgICAgICAgICAgICBpbnRBZGRyZXNzID0gYWRkcmVzczsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBJc0Zvcm11bGEoc3RyaW5nIGFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpc1RleHQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkcmVzcy5MZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWRkcmVzc1tpXSA9PSAnXCcnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXNUZXh0ID0gIWlzVGV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVGV4dD09ZmFsc2UgICYmIGFkZHJlc3MuU3Vic3RyaW5nKGksIDEpLkluZGV4T2ZBbnkobmV3IGNoYXJbXSB7ICcoJywgJyknLCAnKycsICctJywgJyonLCAnLycsICcuJywgJz0nLCAnXicsICcmJywgJyUnLCAnXCInIH0pID4gLTEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmFja1BvcyA9IGk7CisgICAgICAgIH0gZWxzZSBpZiAoYWRkcmVzc1tpXSA9PSAnXScgJiYgIWlzVGV4dCkgeworICAgICAgICAgIGlmIChicmFja1BvcyA+IC0xKSB7CisgICAgICAgICAgICB3YiA9IHRleHQ7CisgICAgICAgICAgICB0ZXh0ID0gIiI7CisgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGV4dCArPSBhZGRyZXNzW2ldOwogICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBJc1ZhbGlkTmFtZShzdHJpbmcgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goYWRkcmVzcywgIlteMC05Li8qLSsswr0hXCJAI8KjJSYve30oKVxcW1xcXT0/YF5+Jzo7PD58XVteLyotKyzCvSFcIkAjwqMlJi97fSgpXFxbXFxdPT9gXn4nOjs8PnxdKiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgUm93cyAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF90b1JvdyAtIF9mcm9tUm93KzE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGludCBDb2x1bW5zCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfdG9Db2wgLSBfZnJvbUNvbCArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBib29sIElzTXVsdGlDZWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChfZnJvbVJvdyA8IF9mcm9tQ29sIHx8IF9mcm9tQ29sIDwgX3RvQ29sKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgU3RyaW5nIEdldFdvcmtib29rUGFydChzdHJpbmcgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGl4ID0gMDsKLSAgICAgICAgICAgIGlmIChhZGRyZXNzWzBdID09ICdbJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpeCA9IGFkZHJlc3MuSW5kZXhPZignXScpICsgMTsKLSAgICAgICAgICAgICAgICBpZiAoaXggPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3MuU3Vic3RyaW5nKDEsIGl4IC0gMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgR2V0V29ya3NoZWV0UGFydChzdHJpbmcgYWRkcmVzcywgc3RyaW5nIGRlZmF1bHRXb3JrU2hlZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpeD0wOwotICAgICAgICAgICAgcmV0dXJuIEdldFdvcmtzaGVldFBhcnQoYWRkcmVzcywgZGVmYXVsdFdvcmtTaGVldCwgcmVmIGl4KTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldFdvcmtzaGVldFBhcnQoc3RyaW5nIGFkZHJlc3MsIHN0cmluZyBkZWZhdWx0V29ya1NoZWV0LCByZWYgaW50IGVuZEl4KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihhZGRyZXNzPT0iIikgcmV0dXJuIGRlZmF1bHRXb3JrU2hlZXQ7Ci0gICAgICAgICAgICB2YXIgaXggPSAwOwotICAgICAgICAgICAgaWYgKGFkZHJlc3NbMF0gPT0gJ1snKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGl4ID0gYWRkcmVzcy5JbmRleE9mKCddJykrMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpeCA+IDAgJiYgaXggPCBhZGRyZXNzLkxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWRkcmVzc1tpeF0gPT0gJ1wnJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRTdHJpbmcoYWRkcmVzcywgaXgsIG91dCBlbmRJeCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBpeEVuZCA9IGFkZHJlc3MuSW5kZXhPZignIScsaXgpOwotICAgICAgICAgICAgICAgICAgICBpZihpeEVuZD5peCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3MuU3Vic3RyaW5nKGl4LCBpeEVuZC1peCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFdvcmtTaGVldDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFdvcmtTaGVldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldEFkZHJlc3NQYXJ0KHN0cmluZyBhZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaXg9MDsKLSAgICAgICAgICAgIEdldFdvcmtzaGVldFBhcnQoYWRkcmVzcywgIiIsIHJlZiBpeCk7Ci0gICAgICAgICAgICBpZihpeDxhZGRyZXNzLkxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWRkcmVzc1tpeF0gPT0gJyEnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3MuU3Vic3RyaW5nKGl4ICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgU3BsaXRBZGRyZXNzKHN0cmluZyBmdWxsQWRkcmVzcywgb3V0IHN0cmluZyB3Yiwgb3V0IHN0cmluZyB3cywgb3V0IHN0cmluZyBhZGRyZXNzLCBzdHJpbmcgZGVmYXVsdFdvcmtzaGVldD0iIikKLSAgICAgICAgewotICAgICAgICAgICAgd2IgPSBHZXRXb3JrYm9va1BhcnQoZnVsbEFkZHJlc3MpOwotICAgICAgICAgICAgaW50IGl4PTA7Ci0gICAgICAgICAgICB3cyA9IEdldFdvcmtzaGVldFBhcnQoZnVsbEFkZHJlc3MsIGRlZmF1bHRXb3Jrc2hlZXQsIHJlZiBpeCk7Ci0gICAgICAgICAgICBpZiAoaXggPCBmdWxsQWRkcmVzcy5MZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZ1bGxBZGRyZXNzW2l4XSA9PSAnIScpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gZnVsbEFkZHJlc3MuU3Vic3RyaW5nKGl4ICsgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBmdWxsQWRkcmVzcy5TdWJzdHJpbmcoaXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRyZXNzPSIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBHZXRTdHJpbmcoc3RyaW5nIGFkZHJlc3MsIGludCBpeCwgb3V0IGludCBlbmRJeCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHN0ckl4ID0gYWRkcmVzcy5JbmRleE9mKCInJyIpOwotICAgICAgICAgICAgdmFyIHByZXZTdHJJeCA9IGl4OwotICAgICAgICAgICAgd2hpbGUoc3RySXggPiAtMSkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJldlN0ckl4ID0gc3RySXg7Ci0gICAgICAgICAgICAgICAgc3RySXggPSBhZGRyZXNzLkluZGV4T2YoIicnIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbmRJeCA9IGFkZHJlc3MuSW5kZXhPZigiJyIpOwotICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3MuU3Vic3RyaW5nKGl4LCBlbmRJeCAtIGl4KS5SZXBsYWNlKCInJyIsIiciKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIGJvb2wgSXNWYWxpZFJvd0NvbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAhKF9mcm9tUm93ID4gX3RvUm93ICB8fAotICAgICAgICAgICAgICAgICAgIF9mcm9tQ29sID4gX3RvQ29sIHx8Ci0gICAgICAgICAgICAgICAgICAgX2Zyb21Sb3cgPCAxIHx8Ci0gICAgICAgICAgICAgICAgICAgX2Zyb21Db2wgPCAxIHx8Ci0gICAgICAgICAgICAgICAgICAgX3RvUm93ID4gRXhjZWxQYWNrYWdlLk1heFJvd3MgfHwKLSAgICAgICAgICAgICAgICAgICBfdG9Db2wgPiBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7Ci0gICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBSYW5nZSBhZGRyZXNzIHdpdGggdGhlIGFkZHJlc3MgcHJvcGVydHkgcmVhZG9ubHkKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbEFkZHJlc3MgOiBFeGNlbEFkZHJlc3NCYXNlCi0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbEFkZHJlc3MoKQotICAgICAgICAgICAgOiBiYXNlKCkKLSAgICAgICAgeworICAgIGludEFkZHJlc3MgPSB0ZXh0OworICAgIHJldHVybiB0cnVlOworICB9CiAKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBJc0Zvcm11bGEoc3RyaW5nIGFkZHJlc3MpIHsKKyAgICB2YXIgaXNUZXh0ID0gZmFsc2U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRyZXNzLkxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAoYWRkcmVzc1tpXSA9PSAnXCcnKSB7CisgICAgICAgIGlzVGV4dCA9ICFpc1RleHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoaXNUZXh0ID09IGZhbHNlCisgICAgICAgICAgICAmJiBhZGRyZXNzCisgICAgICAgICAgICAgICAgLlN1YnN0cmluZyhpLCAxKQorICAgICAgICAgICAgICAgIC5JbmRleE9mQW55KG5ld1tdIHsgJygnLCAnKScsICcrJywgJy0nLCAnKicsICcvJywgJy4nLCAnPScsICdeJywgJyYnLCAnJScsICdcIicgfSkKKyAgICAgICAgICAgICAgICA+IC0xKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRXhjZWxBZGRyZXNzKGludCBmcm9tUm93LCBpbnQgZnJvbUNvbCwgaW50IHRvUm93LCBpbnQgdG9Db2x1bW4pCi0gICAgICAgICAgICA6IGJhc2UoZnJvbVJvdywgZnJvbUNvbCwgdG9Sb3csIHRvQ29sdW1uKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd3MgPSAiIjsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgRXhjZWxBZGRyZXNzKHN0cmluZyBhZGRyZXNzKQotICAgICAgICAgICAgOiBiYXNlKGFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxBZGRyZXNzKHN0cmluZyB3cywgc3RyaW5nIGFkZHJlc3MpCi0gICAgICAgICAgICA6IGJhc2UoYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KF93cykpIF93cyA9IHdzOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsQWRkcmVzcyhzdHJpbmcgd3MsIHN0cmluZyBhZGRyZXNzLCBib29sIGlzTmFtZSkKLSAgICAgICAgICAgIDogYmFzZShhZGRyZXNzLCBpc05hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfd3MpKSBfd3MgPSB3czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBFeGNlbEFkZHJlc3Moc3RyaW5nIEFkZHJlc3MsIEV4Y2VsUGFja2FnZSBwYWNrYWdlLCBFeGNlbEFkZHJlc3NCYXNlIHJlZmVyZW5jZUFkZHJlc3MpIDoKLSAgICAgICAgICAgIGJhc2UoQWRkcmVzcywgcGFja2FnZSwgcmVmZXJlbmNlQWRkcmVzcykKLSAgICAgICAgewotCi0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGFkZHJlc3MgZm9yIHRoZSByYW5nZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+RXhhbXBsZXMgb2YgYWRkcmVzc2VzIGFyZSAiQTEiICJCMTpDMiIgIkE6QSIgIjE6MSIgIkExOkUyLEczOkc1IiA8L3JlbWFya3M+Ci0gICAgICAgIHB1YmxpYyBuZXcgc3RyaW5nIEFkZHJlc3MKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KF9hZGRyZXNzKSAmJiBfZnJvbVJvdz4wKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2FkZHJlc3MgPSBHZXRBZGRyZXNzKF9mcm9tUm93LCBfZnJvbUNvbCwgX3RvUm93LCBfdG9Db2wpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2FkZHJlc3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU2V0QWRkcmVzcyh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgYmFzZS5DaGFuZ2VBZGRyZXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRm9ybXVsYUFkZHJlc3MgOiBFeGNlbEFkZHJlc3NCYXNlCi0gICAgewotICAgICAgICBib29sIF9mcm9tUm93Rml4ZWQsIF90b1Jvd0ZpeGVkLCBfZnJvbUNvbEZpeGVkLCBfdG9Db2xGaXhlZDsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxGb3JtdWxhQWRkcmVzcygpCi0gICAgICAgICAgICA6IGJhc2UoKQotICAgICAgICB7Ci0gICAgICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KIAotICAgICAgICBwdWJsaWMgRXhjZWxGb3JtdWxhQWRkcmVzcyhpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCB0b1JvdywgaW50IHRvQ29sdW1uKQotICAgICAgICAgICAgOiBiYXNlKGZyb21Sb3csIGZyb21Db2wsIHRvUm93LCB0b0NvbHVtbikKLSAgICAgICAgewotICAgICAgICAgICAgX3dzID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIEV4Y2VsRm9ybXVsYUFkZHJlc3Moc3RyaW5nIGFkZHJlc3MpCi0gICAgICAgICAgICA6IGJhc2UoYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgU2V0Rml4ZWQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxGb3JtdWxhQWRkcmVzcyhzdHJpbmcgd3MsIHN0cmluZyBhZGRyZXNzKQotICAgICAgICAgICAgOiBiYXNlKGFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfd3MpKSBfd3MgPSB3czsKLSAgICAgICAgICAgIFNldEZpeGVkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxGb3JtdWxhQWRkcmVzcyhzdHJpbmcgd3MsIHN0cmluZyBhZGRyZXNzLCBib29sIGlzTmFtZSkKLSAgICAgICAgICAgIDogYmFzZShhZGRyZXNzLCBpc05hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfd3MpKSBfd3MgPSB3czsKLSAgICAgICAgICAgIGlmKCFpc05hbWUpCi0gICAgICAgICAgICAgICAgU2V0Rml4ZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBTZXRGaXhlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChBZGRyZXNzLkluZGV4T2YoIlsiKSA+PSAwKSByZXR1cm47Ci0gICAgICAgICAgICB2YXIgYWRkcmVzcz1GaXJzdEFkZHJlc3M7Ci0gICAgICAgICAgICBpZihfZnJvbVJvdz09X3RvUm93ICYmIF9mcm9tQ29sPT1fdG9Db2wpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgR2V0Rml4ZWQoYWRkcmVzcywgb3V0IF9mcm9tUm93Rml4ZWQsIG91dCBfZnJvbUNvbEZpeGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgY2VsbHMgPSBhZGRyZXNzLlNwbGl0KCc6Jyk7Ci0gICAgICAgICAgICAgICAgR2V0Rml4ZWQoY2VsbHNbMF0sIG91dCBfZnJvbVJvd0ZpeGVkLCBvdXQgX2Zyb21Db2xGaXhlZCk7Ci0gICAgICAgICAgICAgICAgR2V0Rml4ZWQoY2VsbHNbMV0sIG91dCBfdG9Sb3dGaXhlZCwgb3V0IF90b0NvbEZpeGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBHZXRGaXhlZChzdHJpbmcgYWRkcmVzcywgb3V0IGJvb2wgcm93Rml4ZWQsIG91dCBib29sIGNvbEZpeGVkKQotICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgICByb3dGaXhlZD1jb2xGaXhlZD1mYWxzZTsKLSAgICAgICAgICAgIHZhciBpeD1hZGRyZXNzLkluZGV4T2YoJyQnKTsKLSAgICAgICAgICAgIHdoaWxlKGl4Pi0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGl4Kys7Ci0gICAgICAgICAgICAgICAgaWYoaXggPCBhZGRyZXNzLkxlbmd0aCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGFkZHJlc3NbaXhdPj0nMCcgJiYgYWRkcmVzc1tpeF08PSc5JykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcm93Rml4ZWQ9dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29sRml4ZWQ9dHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpeCA9IGFkZHJlc3MuSW5kZXhPZignJCcsIGl4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgYWRkcmVzcyBmb3IgdGhlIHJhbmdlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz5FeGFtcGxlcyBvZiBhZGRyZXNzZXMgYXJlICJBMSIgIkIxOkMyIiAiQTpBIiAiMToxIiAiQTE6RTIsRzM6RzUiIDwvcmVtYXJrcz4KLSAgICAgICAgcHVibGljIG5ldyBzdHJpbmcgQWRkcmVzcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoX2FkZHJlc3MpICYmIF9mcm9tUm93PjApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfYWRkcmVzcyA9IEdldEFkZHJlc3MoX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCwgX2Zyb21Sb3dGaXhlZCwgX3RvUm93Rml4ZWQsIF9mcm9tQ29sRml4ZWQsIF90b0NvbEZpeGVkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9hZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNldEFkZHJlc3ModmFsdWUpOwotICAgICAgICAgICAgICAgIGJhc2UuQ2hhbmdlQWRkcmVzcygpOwotICAgICAgICAgICAgICAgIFNldEZpeGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgbmV3IExpc3Q8RXhjZWxGb3JtdWxhQWRkcmVzcz4gX2FkZHJlc3NlczsKLSAgICAgICAgcHVibGljIG5ldyBMaXN0PEV4Y2VsRm9ybXVsYUFkZHJlc3M+IEFkZHJlc3NlcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2FkZHJlc3NlcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2FkZHJlc3NlcyA9IG5ldyBMaXN0PEV4Y2VsRm9ybXVsYUFkZHJlc3M+KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfYWRkcmVzc2VzOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEdldE9mZnNldChpbnQgcm93LCBpbnQgY29sdW1uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgZnJvbVJvdyA9IF9mcm9tUm93LCBmcm9tQ29sID0gX2Zyb21Db2wsIHRvUm93ID0gX3RvUm93LCB0b2NvbCA9IF90b0NvbDsKLSAgICAgICAgICAgIHZhciBpc011bHRpID0gKGZyb21Sb3cgIT0gdG9Sb3cgfHwgZnJvbUNvbCAhPSB0b2NvbCk7Ci0gICAgICAgICAgICBpZiAoIV9mcm9tUm93Rml4ZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJvbVJvdyArPSByb3c7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIV9mcm9tQ29sRml4ZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJvbUNvbCArPSBjb2x1bW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNNdWx0aSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIV90b1Jvd0ZpeGVkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG9Sb3cgKz0gcm93OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIV90b0NvbEZpeGVkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG9jb2wgKz0gY29sdW1uOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b1JvdyA9IGZyb21Sb3c7Ci0gICAgICAgICAgICAgICAgdG9jb2wgPSBmcm9tQ29sOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RyaW5nIGEgPSBHZXRBZGRyZXNzKGZyb21Sb3csIGZyb21Db2wsIHRvUm93LCB0b2NvbCwgX2Zyb21Sb3dGaXhlZCwgX2Zyb21Db2xGaXhlZCwgX3RvUm93Rml4ZWQsIF90b0NvbEZpeGVkKTsKLSAgICAgICAgICAgIGlmIChBZGRyZXNzZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgc2EgaW4gQWRkcmVzc2VzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYSs9IiwiICsgc2EuR2V0T2Zmc2V0KHJvdywgY29sdW1uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYTsKLSAgICAgICAgfQorICBwcml2YXRlIHN0YXRpYyBib29sIElzVmFsaWROYW1lKHN0cmluZyBhZGRyZXNzKSB7CisgICAgaWYgKFJlZ2V4LklzTWF0Y2goCisgICAgICAgIGFkZHJlc3MsCisgICAgICAgICJbXjAtOS4vKi0rLMK9IVwiQCPCoyUmL3t9KClcXFtcXF09P2Befic6Ozw+fF1bXi8qLSsswr0hXCJAI8KjJSYve30oKVxcW1xcXT0/YF5+Jzo7PD58XSoiKSkgeworICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBpbnQgUm93cyB7CisgICAgZ2V0IHsgcmV0dXJuIF90b1JvdyAtIF9mcm9tUm93ICsgMTsgfQorICB9CisKKyAgcHVibGljIGludCBDb2x1bW5zIHsKKyAgICBnZXQgeyByZXR1cm4gX3RvQ29sIC0gX2Zyb21Db2wgKyAxOyB9CisgIH0KKworICBpbnRlcm5hbCBib29sIElzTXVsdGlDZWxsKCkgeworICAgIHJldHVybiAoX2Zyb21Sb3cgPCBfZnJvbUNvbCB8fCBfZnJvbUNvbCA8IF90b0NvbCk7CisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgU3RyaW5nIEdldFdvcmtib29rUGFydChzdHJpbmcgYWRkcmVzcykgeworICAgIHZhciBpeCA9IDA7CisgICAgaWYgKGFkZHJlc3NbMF0gPT0gJ1snKSB7CisgICAgICBpeCA9IGFkZHJlc3MuSW5kZXhPZignXScpICsgMTsKKyAgICAgIGlmIChpeCA+IDApIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3MuU3Vic3RyaW5nKDEsIGl4IC0gMik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAiIjsKKyAgfQorCisgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgR2V0V29ya3NoZWV0UGFydChzdHJpbmcgYWRkcmVzcywgc3RyaW5nIGRlZmF1bHRXb3JrU2hlZXQpIHsKKyAgICBpbnQgaXggPSAwOworICAgIHJldHVybiBHZXRXb3Jrc2hlZXRQYXJ0KGFkZHJlc3MsIGRlZmF1bHRXb3JrU2hlZXQsIHJlZiBpeCk7CisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldFdvcmtzaGVldFBhcnQoc3RyaW5nIGFkZHJlc3MsIHN0cmluZyBkZWZhdWx0V29ya1NoZWV0LCByZWYgaW50IGVuZEl4KSB7CisgICAgaWYgKGFkZHJlc3MgPT0gIiIpIHsKKyAgICAgIHJldHVybiBkZWZhdWx0V29ya1NoZWV0OworICAgIH0KKyAgICB2YXIgaXggPSAwOworICAgIGlmIChhZGRyZXNzWzBdID09ICdbJykgeworICAgICAgaXggPSBhZGRyZXNzLkluZGV4T2YoJ10nKSArIDE7CisgICAgfQorICAgIGlmIChpeCA+IDAgJiYgaXggPCBhZGRyZXNzLkxlbmd0aCkgeworICAgICAgaWYgKGFkZHJlc3NbaXhdID09ICdcJycpIHsKKyAgICAgICAgcmV0dXJuIEdldFN0cmluZyhhZGRyZXNzLCBpeCwgb3V0IGVuZEl4KTsKKyAgICAgIH0KKyAgICAgIHZhciBpeEVuZCA9IGFkZHJlc3MuSW5kZXhPZignIScsIGl4KTsKKyAgICAgIGlmIChpeEVuZCA+IGl4KSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzLlN1YnN0cmluZyhpeCwgaXhFbmQgLSBpeCk7CisgICAgICB9CisgICAgICByZXR1cm4gZGVmYXVsdFdvcmtTaGVldDsKKyAgICB9CisgICAgcmV0dXJuIGRlZmF1bHRXb3JrU2hlZXQ7CisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldEFkZHJlc3NQYXJ0KHN0cmluZyBhZGRyZXNzKSB7CisgICAgdmFyIGl4ID0gMDsKKyAgICBHZXRXb3Jrc2hlZXRQYXJ0KGFkZHJlc3MsICIiLCByZWYgaXgpOworICAgIGlmIChpeCA8IGFkZHJlc3MuTGVuZ3RoKSB7CisgICAgICBpZiAoYWRkcmVzc1tpeF0gPT0gJyEnKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzLlN1YnN0cmluZyhpeCArIDEpOworICAgICAgfQorICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICByZXR1cm4gIiI7CisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBTcGxpdEFkZHJlc3MoCisgICAgICBzdHJpbmcgZnVsbEFkZHJlc3MsCisgICAgICBvdXQgc3RyaW5nIHdiLAorICAgICAgb3V0IHN0cmluZyB3cywKKyAgICAgIG91dCBzdHJpbmcgYWRkcmVzcywKKyAgICAgIHN0cmluZyBkZWZhdWx0V29ya3NoZWV0ID0gIiIpIHsKKyAgICB3YiA9IEdldFdvcmtib29rUGFydChmdWxsQWRkcmVzcyk7CisgICAgaW50IGl4ID0gMDsKKyAgICB3cyA9IEdldFdvcmtzaGVldFBhcnQoZnVsbEFkZHJlc3MsIGRlZmF1bHRXb3Jrc2hlZXQsIHJlZiBpeCk7CisgICAgaWYgKGl4IDwgZnVsbEFkZHJlc3MuTGVuZ3RoKSB7CisgICAgICBpZiAoZnVsbEFkZHJlc3NbaXhdID09ICchJykgeworICAgICAgICBhZGRyZXNzID0gZnVsbEFkZHJlc3MuU3Vic3RyaW5nKGl4ICsgMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhZGRyZXNzID0gZnVsbEFkZHJlc3MuU3Vic3RyaW5nKGl4KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgYWRkcmVzcyA9ICIiOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHN0cmluZyBHZXRTdHJpbmcoc3RyaW5nIGFkZHJlc3MsIGludCBpeCwgb3V0IGludCBlbmRJeCkgeworICAgIHZhciBzdHJJeCA9IGFkZHJlc3MuSW5kZXhPZigiJyciKTsKKyAgICB2YXIgcHJldlN0ckl4ID0gaXg7CisgICAgd2hpbGUgKHN0ckl4ID4gLTEpIHsKKyAgICAgIHByZXZTdHJJeCA9IHN0ckl4OworICAgICAgc3RySXggPSBhZGRyZXNzLkluZGV4T2YoIicnIik7CisgICAgfQorICAgIGVuZEl4ID0gYWRkcmVzcy5JbmRleE9mKCInIik7CisgICAgcmV0dXJuIGFkZHJlc3MuU3Vic3RyaW5nKGl4LCBlbmRJeCAtIGl4KS5SZXBsYWNlKCInJyIsICInIik7CisgIH0KKworICBpbnRlcm5hbCBib29sIElzVmFsaWRSb3dDb2woKSB7CisgICAgcmV0dXJuICEoX2Zyb21Sb3cgPiBfdG9Sb3cKKyAgICAgICAgICAgIHx8IF9mcm9tQ29sID4gX3RvQ29sCisgICAgICAgICAgICB8fCBfZnJvbVJvdyA8IDEKKyAgICAgICAgICAgIHx8IF9mcm9tQ29sIDwgMQorICAgICAgICAgICAgfHwgX3RvUm93ID4gRXhjZWxQYWNrYWdlLk1heFJvd3MKKyAgICAgICAgICAgIHx8IF90b0NvbCA+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgfQorfQorCisvLy8gPHN1bW1hcnk+CisvLy8gUmFuZ2UgYWRkcmVzcyB3aXRoIHRoZSBhZGRyZXNzIHByb3BlcnR5IHJlYWRvbmx5CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQWRkcmVzcyA6IEV4Y2VsQWRkcmVzc0Jhc2UgeworICBpbnRlcm5hbCBFeGNlbEFkZHJlc3MoKSB7fQorCisgIHB1YmxpYyBFeGNlbEFkZHJlc3MoaW50IGZyb21Sb3csIGludCBmcm9tQ29sLCBpbnQgdG9Sb3csIGludCB0b0NvbHVtbikKKyAgICAgIDogYmFzZShmcm9tUm93LCBmcm9tQ29sLCB0b1JvdywgdG9Db2x1bW4pIHsKKyAgICBfd3MgPSAiIjsKKyAgfQorCisgIHB1YmxpYyBFeGNlbEFkZHJlc3Moc3RyaW5nIGFkZHJlc3MpCisgICAgICA6IGJhc2UoYWRkcmVzcykge30KKworICBpbnRlcm5hbCBFeGNlbEFkZHJlc3Moc3RyaW5nIHdzLCBzdHJpbmcgYWRkcmVzcykKKyAgICAgIDogYmFzZShhZGRyZXNzKSB7CisgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KF93cykpIHsKKyAgICAgIF93cyA9IHdzOworICAgIH0KKyAgfQorCisgIGludGVybmFsIEV4Y2VsQWRkcmVzcyhzdHJpbmcgd3MsIHN0cmluZyBhZGRyZXNzLCBib29sIGlzTmFtZSkKKyAgICAgIDogYmFzZShhZGRyZXNzLCBpc05hbWUpIHsKKyAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoX3dzKSkgeworICAgICAgX3dzID0gd3M7CisgICAgfQorICB9CisKKyAgcHVibGljIEV4Y2VsQWRkcmVzcyhzdHJpbmcgYWRkcmVzcywgRXhjZWxQYWNrYWdlIHBhY2thZ2UsIEV4Y2VsQWRkcmVzc0Jhc2UgcmVmZXJlbmNlQWRkcmVzcykKKyAgICAgIDogYmFzZShhZGRyZXNzLCBwYWNrYWdlLCByZWZlcmVuY2VBZGRyZXNzKSB7fQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBhZGRyZXNzIGZvciB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZW1hcmtzPkV4YW1wbGVzIG9mIGFkZHJlc3NlcyBhcmUgIkExIiAiQjE6QzIiICJBOkEiICIxOjEiICJBMTpFMixHMzpHNSIgPC9yZW1hcmtzPgorICBwdWJsaWMgbmV3IHN0cmluZyBBZGRyZXNzIHsKKyAgICBnZXQgeworICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KF9hZGRyZXNzKSAmJiBfZnJvbVJvdyA+IDApIHsKKyAgICAgICAgX2FkZHJlc3MgPSBHZXRBZGRyZXNzKF9mcm9tUm93LCBfZnJvbUNvbCwgX3RvUm93LCBfdG9Db2wpOworICAgICAgfQorICAgICAgcmV0dXJuIF9hZGRyZXNzOworICAgIH0KKyAgICBzZXQgeworICAgICAgU2V0QWRkcmVzcyh2YWx1ZSk7CisgICAgICBDaGFuZ2VBZGRyZXNzKCk7CisgICAgfQorICB9Cit9CisKK3B1YmxpYyBjbGFzcyBFeGNlbEZvcm11bGFBZGRyZXNzIDogRXhjZWxBZGRyZXNzQmFzZSB7CisgIHByaXZhdGUgYm9vbCBfZnJvbVJvd0ZpeGVkLAorICAgICAgX3RvUm93Rml4ZWQsCisgICAgICBfZnJvbUNvbEZpeGVkLAorICAgICAgX3RvQ29sRml4ZWQ7CisKKyAgaW50ZXJuYWwgRXhjZWxGb3JtdWxhQWRkcmVzcygpIHt9CisKKyAgcHVibGljIEV4Y2VsRm9ybXVsYUFkZHJlc3MoaW50IGZyb21Sb3csIGludCBmcm9tQ29sLCBpbnQgdG9Sb3csIGludCB0b0NvbHVtbikKKyAgICAgIDogYmFzZShmcm9tUm93LCBmcm9tQ29sLCB0b1JvdywgdG9Db2x1bW4pIHsKKyAgICBfd3MgPSAiIjsKKyAgfQorCisgIHB1YmxpYyBFeGNlbEZvcm11bGFBZGRyZXNzKHN0cmluZyBhZGRyZXNzKQorICAgICAgOiBiYXNlKGFkZHJlc3MpIHsKKyAgICBTZXRGaXhlZCgpOworICB9CisKKyAgaW50ZXJuYWwgRXhjZWxGb3JtdWxhQWRkcmVzcyhzdHJpbmcgd3MsIHN0cmluZyBhZGRyZXNzKQorICAgICAgOiBiYXNlKGFkZHJlc3MpIHsKKyAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoX3dzKSkgeworICAgICAgX3dzID0gd3M7CisgICAgfQorICAgIFNldEZpeGVkKCk7CisgIH0KKworICBpbnRlcm5hbCBFeGNlbEZvcm11bGFBZGRyZXNzKHN0cmluZyB3cywgc3RyaW5nIGFkZHJlc3MsIGJvb2wgaXNOYW1lKQorICAgICAgOiBiYXNlKGFkZHJlc3MsIGlzTmFtZSkgeworICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfd3MpKSB7CisgICAgICBfd3MgPSB3czsKKyAgICB9CisgICAgaWYgKCFpc05hbWUpIHsKKyAgICAgIFNldEZpeGVkKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIFNldEZpeGVkKCkgeworICAgIGlmIChBZGRyZXNzLkluZGV4T2YoIlsiKSA+PSAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHZhciBhZGRyZXNzID0gRmlyc3RBZGRyZXNzOworICAgIGlmIChfZnJvbVJvdyA9PSBfdG9Sb3cgJiYgX2Zyb21Db2wgPT0gX3RvQ29sKSB7CisgICAgICBHZXRGaXhlZChhZGRyZXNzLCBvdXQgX2Zyb21Sb3dGaXhlZCwgb3V0IF9mcm9tQ29sRml4ZWQpOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgY2VsbHMgPSBhZGRyZXNzLlNwbGl0KCc6Jyk7CisgICAgICBHZXRGaXhlZChjZWxsc1swXSwgb3V0IF9mcm9tUm93Rml4ZWQsIG91dCBfZnJvbUNvbEZpeGVkKTsKKyAgICAgIEdldEZpeGVkKGNlbGxzWzFdLCBvdXQgX3RvUm93Rml4ZWQsIG91dCBfdG9Db2xGaXhlZCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIEdldEZpeGVkKHN0cmluZyBhZGRyZXNzLCBvdXQgYm9vbCByb3dGaXhlZCwgb3V0IGJvb2wgY29sRml4ZWQpIHsKKyAgICByb3dGaXhlZCA9IGNvbEZpeGVkID0gZmFsc2U7CisgICAgdmFyIGl4ID0gYWRkcmVzcy5JbmRleE9mKCckJyk7CisgICAgd2hpbGUgKGl4ID4gLTEpIHsKKyAgICAgIGl4Kys7CisgICAgICBpZiAoaXggPCBhZGRyZXNzLkxlbmd0aCkgeworICAgICAgICBpZiAoYWRkcmVzc1tpeF0gPj0gJzAnICYmIGFkZHJlc3NbaXhdIDw9ICc5JykgeworICAgICAgICAgIHJvd0ZpeGVkID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb2xGaXhlZCA9IHRydWU7CisgICAgICB9CisgICAgICBpeCA9IGFkZHJlc3MuSW5kZXhPZignJCcsIGl4KTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgYWRkcmVzcyBmb3IgdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz5FeGFtcGxlcyBvZiBhZGRyZXNzZXMgYXJlICJBMSIgIkIxOkMyIiAiQTpBIiAiMToxIiAiQTE6RTIsRzM6RzUiIDwvcmVtYXJrcz4KKyAgcHVibGljIG5ldyBzdHJpbmcgQWRkcmVzcyB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShfYWRkcmVzcykgJiYgX2Zyb21Sb3cgPiAwKSB7CisgICAgICAgIF9hZGRyZXNzID0gR2V0QWRkcmVzcygKKyAgICAgICAgICAgIF9mcm9tUm93LAorICAgICAgICAgICAgX2Zyb21Db2wsCisgICAgICAgICAgICBfdG9Sb3csCisgICAgICAgICAgICBfdG9Db2wsCisgICAgICAgICAgICBfZnJvbVJvd0ZpeGVkLAorICAgICAgICAgICAgX3RvUm93Rml4ZWQsCisgICAgICAgICAgICBfZnJvbUNvbEZpeGVkLAorICAgICAgICAgICAgX3RvQ29sRml4ZWQpOworICAgICAgfQorICAgICAgcmV0dXJuIF9hZGRyZXNzOworICAgIH0KKyAgICBzZXQgeworICAgICAgU2V0QWRkcmVzcyh2YWx1ZSk7CisgICAgICBDaGFuZ2VBZGRyZXNzKCk7CisgICAgICBTZXRGaXhlZCgpOworICAgIH0KKyAgfQorCisgIGludGVybmFsIG5ldyBMaXN0PEV4Y2VsRm9ybXVsYUFkZHJlc3M+IF9hZGRyZXNzZXM7CisKKyAgcHVibGljIG5ldyBMaXN0PEV4Y2VsRm9ybXVsYUFkZHJlc3M+IEFkZHJlc3NlcyB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfYWRkcmVzc2VzID09IG51bGwpIHsKKyAgICAgICAgX2FkZHJlc3NlcyA9IG5ldygpOworICAgICAgfQorICAgICAgcmV0dXJuIF9hZGRyZXNzZXM7CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgc3RyaW5nIEdldE9mZnNldChpbnQgcm93LCBpbnQgY29sdW1uKSB7CisgICAgaW50IGZyb21Sb3cgPSBfZnJvbVJvdywKKyAgICAgICAgZnJvbUNvbCA9IF9mcm9tQ29sLAorICAgICAgICB0b1JvdyA9IF90b1JvdywKKyAgICAgICAgdG9jb2wgPSBfdG9Db2w7CisgICAgdmFyIGlzTXVsdGkgPSAoZnJvbVJvdyAhPSB0b1JvdyB8fCBmcm9tQ29sICE9IHRvY29sKTsKKyAgICBpZiAoIV9mcm9tUm93Rml4ZWQpIHsKKyAgICAgIGZyb21Sb3cgKz0gcm93OworICAgIH0KKyAgICBpZiAoIV9mcm9tQ29sRml4ZWQpIHsKKyAgICAgIGZyb21Db2wgKz0gY29sdW1uOworICAgIH0KKyAgICBpZiAoaXNNdWx0aSkgeworICAgICAgaWYgKCFfdG9Sb3dGaXhlZCkgeworICAgICAgICB0b1JvdyArPSByb3c7CisgICAgICB9CisgICAgICBpZiAoIV90b0NvbEZpeGVkKSB7CisgICAgICAgIHRvY29sICs9IGNvbHVtbjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdG9Sb3cgPSBmcm9tUm93OworICAgICAgdG9jb2wgPSBmcm9tQ29sOworICAgIH0KKyAgICBzdHJpbmcgYSA9IEdldEFkZHJlc3MoCisgICAgICAgIGZyb21Sb3csCisgICAgICAgIGZyb21Db2wsCisgICAgICAgIHRvUm93LAorICAgICAgICB0b2NvbCwKKyAgICAgICAgX2Zyb21Sb3dGaXhlZCwKKyAgICAgICAgX2Zyb21Db2xGaXhlZCwKKyAgICAgICAgX3RvUm93Rml4ZWQsCisgICAgICAgIF90b0NvbEZpeGVkKTsKKyAgICBpZiAoQWRkcmVzc2VzICE9IG51bGwpIHsKKyAgICAgIGZvcmVhY2ggKHZhciBzYSBpbiBBZGRyZXNzZXMpIHsKKyAgICAgICAgYSArPSAiLCIgKyBzYS5HZXRPZmZzZXQocm93LCBjb2x1bW4pOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsQ2VsbEFkZHJlc3MuY3MgYi9FUFBsdXMvRXhjZWxDZWxsQWRkcmVzcy5jcwppbmRleCA5OTQzM2VmLi5iNzY1YTczIDEwMDY0NAotLS0gYS9FUFBsdXMvRXhjZWxDZWxsQWRkcmVzcy5jcworKysgYi9FUFBsdXMvRXhjZWxDZWxsQWRkcmVzcy5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTQzICsxMywxMjEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgU3Rhcm51dG8gRGkgVG9wbyAmIEphbiBLw6RsbG1hbiAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMTAtMDMtMTQKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIHNpbmdsZSBjZWxsIGFkZHJlc3MgCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxDZWxsQWRkcmVzcwotICAgIHsKLSAgICAgICAgcHVibGljIEV4Y2VsQ2VsbEFkZHJlc3MoKQotICAgICAgICAgICAgOiB0aGlzKDEsIDEpCi0gICAgICAgIHsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOwogCi0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBBIHNpbmdsZSBjZWxsIGFkZHJlc3MKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDZWxsQWRkcmVzcyB7CisgIHB1YmxpYyBFeGNlbENlbGxBZGRyZXNzKCkKKyAgICAgIDogdGhpcygxLCAxKSB7fQogCi0gICAgICAgIHByaXZhdGUgaW50IF9yb3c7Ci0gICAgICAgIHByaXZhdGUgaW50IF9jb2x1bW47Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIF9hZGRyZXNzOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRXhjZWxDZWxsQWRkcmVzcyBjbGFzcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPlRoZSByb3cuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPlRoZSBjb2x1bW4uPC9wYXJhbT4KLSAgICAgICAgcHVibGljIEV4Y2VsQ2VsbEFkZHJlc3MoaW50IHJvdywgaW50IGNvbHVtbikKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5Sb3cgPSByb3c7Ci0gICAgICAgICAgICB0aGlzLkNvbHVtbiA9IGNvbHVtbjsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRXhjZWxDZWxsQWRkcmVzcyBjbGFzcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBhZGRyZXNzPC9wYXJhbT4KLSAgICAgICAgcHVibGljIEV4Y2VsQ2VsbEFkZHJlc3Moc3RyaW5nIGFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuQWRkcmVzcyA9IGFkZHJlc3M7IAotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJvdwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IFJvdwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcm93OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpdmF0ZSBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPD0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oInZhbHVlIiwgIlJvdyBjYW5ub3QgYmUgbGVzcyB0aGFuIDEuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMuX3JvdyA9IHZhbHVlOwotICAgICAgICAgICAgICAgIGlmKF9jb2x1bW4+MCkgCi0gICAgICAgICAgICAgICAgICAgIF9hZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKF9yb3csIF9jb2x1bW4pOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgX2FkZHJlc3MgPSAiI1JFRiEiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbHVtbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IENvbHVtbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpdmF0ZSBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPD0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oInZhbHVlIiwgIkNvbHVtbiBjYW5ub3QgYmUgbGVzcyB0aGFuIDEuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRoaXMuX2NvbHVtbiA9IHZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChfcm93ID4gMCkKLSAgICAgICAgICAgICAgICAgICAgX2FkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoX3JvdywgX2NvbHVtbik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBfYWRkcmVzcyA9ICIjUkVGISI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ2VsbGFkZHJlc3MKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBBZGRyZXNzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfYWRkcmVzczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9hZGRyZXNzID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgRXhjZWxDZWxsQmFzZS5HZXRSb3dDb2xGcm9tQWRkcmVzcyhfYWRkcmVzcywgb3V0IF9yb3csIG91dCBfY29sdW1uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgYWRkcmVzcyBpcyBhbiBpbnZhbGlkIHJlZmVyZW5jZSAoI1JFRiEpCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIElzUmVmCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfcm93IDw9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgcHJpdmF0ZSBpbnQgX3JvdzsKKyAgcHJpdmF0ZSBpbnQgX2NvbHVtbjsKKyAgcHJpdmF0ZSBzdHJpbmcgX2FkZHJlc3M7CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgbGV0dGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1cHBsaWVkIDEtYmFzZWQgY29sdW1uIGluZGV4LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+SW5kZXggb2YgdGhlIGNvbHVtbiAoMS1iYXNlZCk8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIGNvcnJlc3BvbmRpbmcgbGV0dGVyLCBsaWtlIEEgZm9yIDEuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRDb2x1bW5MZXR0ZXIoaW50IGNvbHVtbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbHVtbiA+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zIHx8IGNvbHVtbiA8IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkludmFsaWQgMS1iYXNlZCBjb2x1bW4gaW5kZXg6ICIgKyBjb2x1bW4gKyAiLiBWYWxpZCByYW5nZSBpcyAxIHRvICIgKyBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRXhjZWxDZWxsQmFzZS5HZXRDb2x1bW5MZXR0ZXIoY29sdW1uKTsKLSAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRXhjZWxDZWxsQWRkcmVzcyBjbGFzcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPlRoZSByb3cuPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPlRoZSBjb2x1bW4uPC9wYXJhbT4KKyAgcHVibGljIEV4Y2VsQ2VsbEFkZHJlc3MoaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIFJvdyA9IHJvdzsKKyAgICBDb2x1bW4gPSBjb2x1bW47CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRXhjZWxDZWxsQWRkcmVzcyBjbGFzcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBhZGRyZXNzPC9wYXJhbT4KKyAgcHVibGljIEV4Y2VsQ2VsbEFkZHJlc3Moc3RyaW5nIGFkZHJlc3MpIHsKKyAgICBBZGRyZXNzID0gYWRkcmVzczsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJvdworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IFJvdyB7CisgICAgZ2V0ID0+IF9yb3c7CisgICAgcHJpdmF0ZSBzZXQgeworICAgICAgaWYgKHZhbHVlIDw9IDApIHsKKyAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigidmFsdWUiLCAiUm93IGNhbm5vdCBiZSBsZXNzIHRoYW4gMS4iKTsKKyAgICAgIH0KKyAgICAgIF9yb3cgPSB2YWx1ZTsKKyAgICAgIGlmIChfY29sdW1uID4gMCkgeworICAgICAgICBfYWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhfcm93LCBfY29sdW1uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9hZGRyZXNzID0gIiNSRUYhIjsKKyAgICAgIH0KICAgICB9Ci19CisgIH0KIAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb2x1bW4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBDb2x1bW4geworICAgIGdldCA9PiBfY29sdW1uOworICAgIHByaXZhdGUgc2V0IHsKKyAgICAgIGlmICh2YWx1ZSA8PSAwKSB7CisgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oInZhbHVlIiwgIkNvbHVtbiBjYW5ub3QgYmUgbGVzcyB0aGFuIDEuIik7CisgICAgICB9CisgICAgICBfY29sdW1uID0gdmFsdWU7CisgICAgICBpZiAoX3JvdyA+IDApIHsKKyAgICAgICAgX2FkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoX3JvdywgX2NvbHVtbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBfYWRkcmVzcyA9ICIjUkVGISI7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ2VsbGFkZHJlc3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBBZGRyZXNzIHsKKyAgICBnZXQgPT4gX2FkZHJlc3M7CisgICAgaW50ZXJuYWwgc2V0IHsKKyAgICAgIF9hZGRyZXNzID0gdmFsdWU7CisgICAgICBFeGNlbENlbGxCYXNlLkdldFJvd0NvbEZyb21BZGRyZXNzKF9hZGRyZXNzLCBvdXQgX3Jvdywgb3V0IF9jb2x1bW4pOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElmIHRoZSBhZGRyZXNzIGlzIGFuIGludmFsaWQgcmVmZXJlbmNlICgjUkVGISkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgSXNSZWYgPT4gX3JvdyA8PSAwOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgdGhlIGxldHRlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzdXBwbGllZCAxLWJhc2VkIGNvbHVtbiBpbmRleC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPkluZGV4IG9mIHRoZSBjb2x1bW4gKDEtYmFzZWQpPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPlRoZSBjb3JyZXNwb25kaW5nIGxldHRlciwgbGlrZSBBIGZvciAxLjwvcmV0dXJucz4KKyAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0Q29sdW1uTGV0dGVyKGludCBjb2x1bW4pIHsKKyAgICBpZiAoY29sdW1uID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMgfHwgY29sdW1uIDwgMSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgIkludmFsaWQgMS1iYXNlZCBjb2x1bW4gaW5kZXg6ICIKKyAgICAgICAgICAgICAgKyBjb2x1bW4KKyAgICAgICAgICAgICAgKyAiLiBWYWxpZCByYW5nZSBpcyAxIHRvICIKKyAgICAgICAgICAgICAgKyBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgfQorICAgIHJldHVybiBFeGNlbENlbGxCYXNlLkdldENvbHVtbkxldHRlcihjb2x1bW4pOworICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxDZWxsQmFzZS5jcyBiL0VQUGx1cy9FeGNlbENlbGxCYXNlLmNzCmluZGV4IGU3YThmMjUuLjM2ZTE0NTAgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9FeGNlbENlbGxCYXNlLmNzCisrKyBiL0VQUGx1cy9FeGNlbENlbGxCYXNlLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxNDU3ICsxMywxMzY4IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKLXVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Ci1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQmFzZSBjbGFzcyBjb250YWluaW5nIGNlbGwgYWRkcmVzcyBtYW5pcHVsYXRpbmcgbWV0aG9kcy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeGNlbENlbGxCYXNlCi0gICAgewotICAgICAgICAjcmVnaW9uICJwdWJsaWMgZnVuY3Rpb25zIgotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXQgdGhlIHNoZWV0LCByb3cgYW5kIGNvbHVtbiBmcm9tIHRoZSBDZWxsSUQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZWxsSUQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2hlZXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+PC9wYXJhbT4KLSAgICAgICAgc3RhdGljIGludGVybmFsIHZvaWQgU3BsaXRDZWxsSUQodWxvbmcgY2VsbElELCBvdXQgaW50IHNoZWV0LCBvdXQgaW50IHJvdywgb3V0IGludCBjb2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNoZWV0ID0gKGludCkoY2VsbElEICUgMHg4MDAwKTsKLSAgICAgICAgICAgIGNvbCA9ICgoaW50KShjZWxsSUQgPj4gMTUpICYgMHgzRkYpOwotICAgICAgICAgICAgcm93ID0gKChpbnQpKGNlbGxJRCA+PiAyOSkpOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldCB0aGUgY2VsbElEIGZvciB0aGUgY2VsbC4gCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iU2hlZXRJRCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdWxvbmcgR2V0Q2VsbElEKGludCBTaGVldElELCBpbnQgcm93LCBpbnQgY29sKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKCh1bG9uZylTaGVldElEKSArICgoKHVsb25nKWNvbCkgPDwgMTUpICsgKCgodWxvbmcpcm93KSA8PCAyOSk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAjcmVnaW9uICJGb3JtdWxhIEZ1bmN0aW9ucyIKLSAgICAgICAgcHJpdmF0ZSBkZWxlZ2F0ZSBzdHJpbmcgZGxnVHJhbnNsKHN0cmluZyBwYXJ0LCBpbnQgcm93LCBpbnQgY29sLCBpbnQgcm93SW5jciwgaW50IGNvbEluY3IpOwotICAgICAgICAjcmVnaW9uIFIxQzEgRnVuY3Rpb25zIgotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUcmFuc2xhdGVzIGEgUjFDMSB0byBhbiBhYnNvbHV0IGFkZHJlc3MvRm9ybXVsYQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5BZGRyZXNzPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPkN1cnJlbnQgcm93PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2wiPkN1cnJlbnQgY29sdW1uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBSQyBhZGRyZXNzPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBUcmFuc2xhdGVGcm9tUjFDMShzdHJpbmcgdmFsdWUsIGludCByb3csIGludCBjb2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUcmFuc2xhdGUodmFsdWUsIFRvQWJzLCByb3csIGNvbCwgLTEsIC0xKTsKLSAgICAgICAgfQordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUcmFuc2xhdGVzIGEgUjFDMSB0byBhbiBhYnNvbHV0IGFkZHJlc3MvRm9ybXVsYTogVmVyc2lvbiAxCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPkFkZHJlc3M8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+Q3VycmVudCByb3c8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+Q3VycmVudCBjb2x1bW48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIFJDIGFkZHJlc3M8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFRyYW5zbGF0ZUZyb21SMUMxX1YxKHN0cmluZyB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFRyYW5zbGF0ZV9WMSh2YWx1ZSwgVG9BYnNfVjEsIHJvdywgY29sLCAtMSwgLTEpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbDsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUcmFuc2xhdGVzIGEgYWJzb2x1dCBhZGRyZXNzIHRvIFIxQzEgRm9ybWF0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlIxQzEgQWRkcmVzczwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij5DdXJyZW50IHJvdzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj5DdXJyZW50IGNvbHVtbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgYWJzb2x1dCBhZGRyZXNzL0Zvcm11bGE8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFRyYW5zbGF0ZVRvUjFDMShzdHJpbmcgdmFsdWUsIGludCByb3csIGludCBjb2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUcmFuc2xhdGUodmFsdWUsIFRvUjFDMSwgcm93LCBjb2wsIC0xLCAtMSk7Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBCYXNlIGNsYXNzIGNvbnRhaW5pbmcgY2VsbCBhZGRyZXNzIG1hbmlwdWxhdGluZyBtZXRob2RzLgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeGNlbENlbGxCYXNlIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0IHRoZSBzaGVldCwgcm93IGFuZCBjb2x1bW4gZnJvbSB0aGUgQ2VsbElECisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iY2VsbElkIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InNoZWV0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2wiPjwvcGFyYW0+CisgIHN0YXRpYyBpbnRlcm5hbCB2b2lkIFNwbGl0Q2VsbElkKHVsb25nIGNlbGxJZCwgb3V0IGludCBzaGVldCwgb3V0IGludCByb3csIG91dCBpbnQgY29sKSB7CisgICAgc2hlZXQgPSAoaW50KShjZWxsSWQgJSAweDgwMDApOworICAgIGNvbCA9ICgoaW50KShjZWxsSWQgPj4gMTUpICYgMHgzRkYpOworICAgIHJvdyA9ICgoaW50KShjZWxsSWQgPj4gMjkpKTsKKyAgfQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRyYW5zbGF0ZXMgYSBhYnNvbHV0ZSBhZGRyZXNzIHRvIFIxQzEgRm9ybWF0IDogVmVyc2lvbiAxCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlIxQzEgQWRkcmVzczwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij5DdXJyZW50IHJvdzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj5DdXJyZW50IGNvbHVtbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgYWJzb2x1dCBhZGRyZXNzL0Zvcm11bGE8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFRyYW5zbGF0ZVRvUjFDMV9WMShzdHJpbmcgdmFsdWUsIGludCByb3csIGludCBjb2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUcmFuc2xhdGVfVjEodmFsdWUsIFRvUjFDMV9WMSwgcm93LCBjb2wsIC0xLCAtMSk7Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0IHRoZSBjZWxsSUQgZm9yIHRoZSBjZWxsLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InNoZWV0SWQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgaW50ZXJuYWwgc3RhdGljIHVsb25nIEdldENlbGxJZChpbnQgc2hlZXRJZCwgaW50IHJvdywgaW50IGNvbCkgeworICAgIHJldHVybiAoKHVsb25nKXNoZWV0SWQpICsgKCgodWxvbmcpY29sKSA8PCAxNSkgKyAoKCh1bG9uZylyb3cpIDw8IDI5KTsKKyAgfQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRyYW5zbGF0ZXMgYmV0d2VlaW4gUjFDMSBvciBhYnNvbHV0ZSBhZGRyZXNzZXMgOiBWZXJzaW9uIDEKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIGFkZHJlc3NzL2Z1bmN0aW9uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzVHJhbnNsYXRvciI+VGhlIHRyYW5zbGF0aW5nIGZ1bmN0aW9uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd0luY3IiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sSW5jciI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIFRyYW5zbGF0ZShzdHJpbmcgdmFsdWUsIGRsZ1RyYW5zbCBhZGRyZXNzVHJhbnNsYXRvciwgaW50IHJvdywgaW50IGNvbCwgaW50IHJvd0luY3IsIGludCBjb2xJbmNyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gIiIpCi0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgYm9vbCBpc1RleHQgPSBmYWxzZTsKLSAgICAgICAgICAgIHN0cmluZyByZXQgPSAiIjsKLSAgICAgICAgICAgIHN0cmluZyBwYXJ0ID0gIiI7Ci0gICAgICAgICAgICBjaGFyIHByZXZUUSA9IChjaGFyKTA7Ci0gICAgICAgICAgICBmb3IgKGludCBwb3MgPSAwOyBwb3MgPCB2YWx1ZS5MZW5ndGg7IHBvcysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgYyA9IHZhbHVlW3Bvc107Ci0gICAgICAgICAgICAgICAgaWYgKGMgPT0gJyInIHx8IGM9PSdcJycpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUZXh0ID09IHRydWUgJiYgcHJldlRRICE9IGMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSBjOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgcHJpdmF0ZSBkZWxlZ2F0ZSBzdHJpbmcgQWRkcmVzc1RyYW5zbGF0b3IoCisgICAgc3RyaW5nIHBhcnQsCisgICAgaW50IHJvdywKKyAgICBpbnQgY29sLAorICAgIGludCByb3dJbmNyLAorICAgIGludCBjb2xJbmNyKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoaXNUZXh0ID09IGZhbHNlICYmIHBhcnQgIT0gIiIgJiYgcHJldlRRPT1jKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gYWRkcmVzc1RyYW5zbGF0b3IocGFydCwgcm93LCBjb2wsIHJvd0luY3IsIGNvbEluY3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJldlRRID0gKGNoYXIpMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwcmV2VFEgPSBjOwotICAgICAgICAgICAgICAgICAgICBpc1RleHQgPSAhaXNUZXh0OwotICAgICAgICAgICAgICAgICAgICByZXQgKz0gYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNUZXh0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ICs9IGM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoYyA9PSAnLScgfHwgYyA9PSAnKycgfHwgYyA9PSAnKicgfHwgYyA9PSAnLycgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJz0nIHx8IGMgPT0gJ14nIHx8IGMgPT0gJywnIHx8IGMgPT0gJzonIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID09ICc8JyB8fCBjID09ICc+JyB8fCBjID09ICcoJyB8fCBjID09ICcpJyB8fCBjID09ICchJyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnICcgfHwgYyA9PSAnJicgfHwgYyA9PSAnJScpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAocG9zID09IDAgfHwgdmFsdWVbcG9zIC0gMV0gIT0gJ1snKSkgLy9MYXN0IHBhcnQgdG8gYWxsb3cgZm9yIFIxQzEgc3R5bGUgWy14XQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgKz0gYWRkcmVzc1RyYW5zbGF0b3IocGFydCwgcm93LCBjb2wsIHJvd0luY3IsIGNvbEluY3IpICsgYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgKz0gYzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJ0ICE9ICIiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldCArPSBhZGRyZXNzVHJhbnNsYXRvcihwYXJ0LCByb3csIGNvbCwgcm93SW5jciwgY29sSW5jcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRyYW5zbGF0ZXMgYSBSMUMxIHRvIGFuIGFic29sdXQgYWRkcmVzcy9Gb3JtdWxhCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPkFkZHJlc3M8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+Q3VycmVudCByb3c8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+Q3VycmVudCBjb2x1bW48L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIFJDIGFkZHJlc3M8L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFRyYW5zbGF0ZUZyb21SMUMxKHN0cmluZyB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkgeworICAgIHJldHVybiBUcmFuc2xhdGUodmFsdWUsIFRvQWJzLCByb3csIGNvbCwgLTEsIC0xKTsKKyAgfQogCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBUcmFuc2xhdGVfVjEoc3RyaW5nIHZhbHVlLCBkbGdUcmFuc2wgYWRkcmVzc1RyYW5zbGF0b3IsIGludCByb3csIGludCBjb2wsIGludCByb3dJbmNyLCBpbnQgY29sSW5jcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlID09ICIiKQotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIGJvb2wgaXNUZXh0ID0gZmFsc2U7Ci0gICAgICAgICAgICBzdHJpbmcgcmV0ID0gIiI7Ci0gICAgICAgICAgICBzdHJpbmcgcGFydCA9ICIiOwotICAgICAgICAgICAgY2hhciBwcmV2VFEgPSAoY2hhcikwOwotICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5SZXBsYWNlKCJcbiIsICIiKTsgIC8vIEVsaW1pbmF0ZSBuZXcgbGluZSBjaGFyYWN0ZXJzIGluIHRoZSBmb3JtdWxhCi0gICAgICAgICAgICBmb3IgKGludCBwb3MgPSAwOyBwb3MgPCB2YWx1ZS5MZW5ndGg7IHBvcysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgYyA9IHZhbHVlW3Bvc107Ci0gICAgICAgICAgICAgICAgaWYgKGMgPT0gJyInIHx8IGMgPT0gJ1wnJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RleHQgPT0gdHJ1ZSAmJiBwcmV2VFEgIT0gYykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICs9IGM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUcmFuc2xhdGVzIGEgUjFDMSB0byBhbiBhYnNvbHV0IGFkZHJlc3MvRm9ybXVsYTogVmVyc2lvbiAxCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPkFkZHJlc3M8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+Q3VycmVudCByb3c8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+Q3VycmVudCBjb2x1bW48L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIFJDIGFkZHJlc3M8L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFRyYW5zbGF0ZUZyb21SMUMxX1YxKHN0cmluZyB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkgeworICAgIHJldHVybiBUcmFuc2xhdGVfVjEodmFsdWUsIFRvQWJzX1YxLCByb3csIGNvbCwgLTEsIC0xKTsKKyAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc1RleHQgPT0gZmFsc2UgJiYgcGFydCAhPSAiIiAmJiBwcmV2VFEgPT0gYykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICs9IGFkZHJlc3NUcmFuc2xhdG9yKHBhcnQsIHJvdywgY29sLCByb3dJbmNyLCBjb2xJbmNyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZUUSA9IChjaGFyKTA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcHJldlRRID0gYzsKLSAgICAgICAgICAgICAgICAgICAgaXNUZXh0ID0gIWlzVGV4dDsKLSAgICAgICAgICAgICAgICAgICAgcmV0ICs9IGM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzVGV4dCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCArPSBjOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICc6JykgIC8vIEtlZXAgUmFuZ2UgZXhwcmVzc2lvbnMgdG9nZXRoZXIKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnQgKz0gYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjID09ICctJyB8fCBjID09ICcrJyB8fCBjID09ICcqJyB8fCBjID09ICcvJyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnPScgfHwgYyA9PSAnXicgfHwgYyA9PSAnLCcgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJzwnIHx8IGMgPT0gJz4nIHx8IGMgPT0gJygnIHx8IGMgPT0gJyknIHx8IGMgPT0gJyEnIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID09ICcgJyB8fCBjID09ICcmJyB8fCBjID09ICclJykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChwb3MgPT0gMCB8fCB2YWx1ZVtwb3MgLSAxXSAhPSAnWycpKSAvL0xhc3QgcGFydCB0byBhbGxvdyBmb3IgUjFDMSBzdHlsZSBbLXhdCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSBhZGRyZXNzVHJhbnNsYXRvcihwYXJ0LCByb3csIGNvbCwgcm93SW5jciwgY29sSW5jcikgKyBjOwotICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9ICIiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFydCArPSBjOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcnQgIT0gIiIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0ICs9IGFkZHJlc3NUcmFuc2xhdG9yKHBhcnQsIHJvdywgY29sLCByb3dJbmNyLCBjb2xJbmNyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHJhbnNsYXRlcyBhIGFic29sdXQgYWRkcmVzcyB0byBSMUMxIEZvcm1hdAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5SMUMxIEFkZHJlc3M8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+Q3VycmVudCByb3c8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+Q3VycmVudCBjb2x1bW48L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIGFic29sdXQgYWRkcmVzcy9Gb3JtdWxhPC9yZXR1cm5zPgorICBwdWJsaWMgc3RhdGljIHN0cmluZyBUcmFuc2xhdGVUb1IxQzEoc3RyaW5nIHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKSB7CisgICAgcmV0dXJuIFRyYW5zbGF0ZSh2YWx1ZSwgVG9SMUMxLCByb3csIGNvbCwgLTEsIC0xKTsKKyAgfQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRyYW5zbGF0ZSB0byBSMUMxCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFydCI+dGhlIHZhbHVlIHRvIGJlIHRyYW5zbGF0ZWQ8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2wiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93SW5jciI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2xJbmNyIj48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgVG9SMUMxKHN0cmluZyBwYXJ0LCBpbnQgcm93LCBpbnQgY29sLCBpbnQgcm93SW5jciwgaW50IGNvbEluY3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBhZGRyUm93LCBhZGRyQ29sOwotICAgICAgICAgICAgc3RyaW5nIFJldCA9ICJSIjsKLSAgICAgICAgICAgIGlmIChHZXRSb3dDb2wocGFydCwgb3V0IGFkZHJSb3csIG91dCBhZGRyQ29sLCBmYWxzZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJSb3cgPT0gMCB8fCBhZGRyQ29sID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhcnQuSW5kZXhPZignJCcsIDEpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFJldCArPSBhZGRyUm93LlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJSb3cgLSByb3cgIT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFJldCArPSBzdHJpbmcuRm9ybWF0KCJbezB9XSIsIGFkZHJSb3cgLSByb3cpOwotICAgICAgICAgICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHJhbnNsYXRlcyBhIGFic29sdXRlIGFkZHJlc3MgdG8gUjFDMSBGb3JtYXQgOiBWZXJzaW9uIDEKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+UjFDMSBBZGRyZXNzPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPkN1cnJlbnQgcm93PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2wiPkN1cnJlbnQgY29sdW1uPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPlRoZSBhYnNvbHV0IGFkZHJlc3MvRm9ybXVsYTwvcmV0dXJucz4KKyAgcHVibGljIHN0YXRpYyBzdHJpbmcgVHJhbnNsYXRlVG9SMUMxX1YxKHN0cmluZyB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkgeworICAgIHJldHVybiBUcmFuc2xhdGVfVjEodmFsdWUsIFRvUjFDMV9WMSwgcm93LCBjb2wsIC0xLCAtMSk7CisgIH0KIAotICAgICAgICAgICAgICAgIGlmIChwYXJ0LlN0YXJ0c1dpdGgoIiQiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXQgKyAiQyIgKyBhZGRyQ29sOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChhZGRyQ29sIC0gY29sICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmV0ICsgIkMiICsgc3RyaW5nLkZvcm1hdCgiW3swfV0iLCBhZGRyQ29sIC0gY29sKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJldCArICJDIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgVG9SMUMxX1YxKHN0cmluZyBwYXJ0LCBpbnQgcm93LCBpbnQgY29sLCBpbnQgcm93SW5jciwgaW50IGNvbEluY3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBhZGRyUm93LCBhZGRyQ29sOwotCi0gICAgICAgICAgICAvLyBIYW5kbGUgcmFuZ2UgZXhwcmVzc2lvbnMKLSAgICAgICAgICAgIGlmICgocGFydC5MZW5ndGggPiAxKSAmJiAocGFydC5JbmRleE9mKCc6JywgMSkgPiAwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUmFuZ2VUb1IxQzFfVjEocGFydCwgcm93LCBjb2wsIHJvd0luY3IsIGNvbEluY3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdHJpbmcgUmV0ID0gIlIiOwotICAgICAgICAgICAgaWYgKEdldFJvd0NvbChwYXJ0LCBvdXQgYWRkclJvdywgb3V0IGFkZHJDb2wsIGZhbHNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWRkclJvdyA9PSAwIHx8IGFkZHJDb2wgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocGFydC5JbmRleE9mKCckJywgMSkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUmV0ICs9IGFkZHJSb3cuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYWRkclJvdyAtIHJvdyAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUmV0ICs9IHN0cmluZy5Gb3JtYXQoIlt7MH1dIiwgYWRkclJvdyAtIHJvdyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBhcnQuU3RhcnRzV2l0aCgiJCIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJldCArICJDIiArIGFkZHJDb2w7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJDb2wgLSBjb2wgIT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXQgKyAiQyIgKyBzdHJpbmcuRm9ybWF0KCJbezB9XSIsIGFkZHJDb2wgLSBjb2wpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmV0ICsgIkMiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFydDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBSYW5nZVRvUjFDMV9WMShzdHJpbmcgcGFydCwgaW50IHJvdywgaW50IGNvbCwgaW50IHJvd0luY3IsIGludCBjb2xJbmNyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTcGxpdCByYW5nZSBleHByZXNzaW9uCi0gICAgICAgICAgICBzdHJpbmdbXSBjZWxsVmFsdWVzID0gcGFydC5TcGxpdChuZXcgY2hhcltdIHsgJzonIH0sIFN0cmluZ1NwbGl0T3B0aW9ucy5SZW1vdmVFbXB0eUVudHJpZXMpOwotCi0gICAgICAgICAgICAvLyBDb252ZXJ0IHJhbmdlIGV4cHJlc3Npb25zCi0gICAgICAgICAgICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gICAgICAgICAgICByZXN1bHQgKz0gUmFuZ2VDZWxsVG9SMUMxX1YxKGNlbGxWYWx1ZXNbMF0sIHJvdywgY29sLCByb3dJbmNyLCBjb2xJbmNyKTsKLSAgICAgICAgICAgIHJlc3VsdCArPSAiOiI7Ci0gICAgICAgICAgICByZXN1bHQgKz0gKGNlbGxWYWx1ZXMuTGVuZ3RoID4gMSkgPyBSYW5nZUNlbGxUb1IxQzFfVjEoY2VsbFZhbHVlc1sxXSwgcm93LCBjb2wsIHJvd0luY3IsIGNvbEluY3IpIDogIiI7Ci0KLSAgICAgICAgICAgIC8vIFJldHVybiBjb252ZXJ0ZWQgcmFuZ2UgZXhwcmVzc2lvbgotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBSYW5nZUNlbGxUb1IxQzFfVjEoc3RyaW5nIHBhcnQsIGludCByb3csIGludCBjb2wsIGludCByb3dJbmNyLCBpbnQgY29sSW5jcikKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGFkZHJSb3csIGFkZHJDb2w7Ci0gICAgICAgICAgICBib29sIGZpeGVkUm93LCBmaXhlZENvbDsKLQotICAgICAgICAgICAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICAgICAgICAgICAgaWYgKEdldFJvd0NvbF9WMShwYXJ0LCBvdXQgYWRkclJvdywgb3V0IGFkZHJDb2wsIGZhbHNlLCBvdXQgZml4ZWRSb3csIG91dCBmaXhlZENvbCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJSb3cgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICJSIjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpeGVkUm93KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBYnNvbHV0ZSByb3cKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhZGRyUm93LlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWRkclJvdyAtIHJvdyAhPSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWxhdGl2ZSByb3cKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzdHJpbmcuRm9ybWF0KCJbezB9XSIsIGFkZHJSb3cgLSByb3cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGFkZHJDb2wgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICJDIjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpeGVkQ29sKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBYnNvbHV0ZSBjb2x1bW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhZGRyQ29sOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJDb2wgLSBjb2wgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVsYXRpdmUgY29sdW1uCi0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nLkZvcm1hdCgiW3swfV0iLCBhZGRyQ29sIC0gY29sKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFydDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUcmFuc2xhdGVzIHRvIGFic29sdXRlIGFkZHJlc3MKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXJ0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2wiPjwvcGFyYW0+IAotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd0luY3IiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sSW5jciI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgLy8vIAotCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIFRvQWJzKHN0cmluZyBwYXJ0LCBpbnQgcm93LCBpbnQgY29sLCBpbnQgcm93SW5jciwgaW50IGNvbEluY3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBjaGVjayA9IHBhcnQuVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLQotICAgICAgICAgICAgaW50IHJTdGFydCA9IGNoZWNrLkluZGV4T2YoIlIiKTsKLSAgICAgICAgICAgIGlmIChyU3RhcnQgIT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFydDsKLSAgICAgICAgICAgIGlmIChwYXJ0Lkxlbmd0aCA9PSAxKSAvL1IKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0QWRkcmVzcyhyb3csIGNvbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBjU3RhcnQgPSBjaGVjay5JbmRleE9mKCJDIik7Ci0gICAgICAgICAgICBib29sIGFic29sdXRlUm93LCBhYnNvbHV0ZUNvbDsKLSAgICAgICAgICAgIGlmIChjU3RhcnQgPT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IFJOdW0gPSBHZXRSQyhwYXJ0LCByb3csIG91dCBhYnNvbHV0ZVJvdyk7Ci0gICAgICAgICAgICAgICAgaWYgKFJOdW0gPiBpbnQuTWluVmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0QWRkcmVzcyhSTnVtLCBhYnNvbHV0ZVJvdywgY29sLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgUk51bSA9IEdldFJDKHBhcnQuU3Vic3RyaW5nKDEsIGNTdGFydCAtIDEpLCByb3csIG91dCBhYnNvbHV0ZVJvdyk7Ci0gICAgICAgICAgICAgICAgaW50IENOdW0gPSBHZXRSQyhwYXJ0LlN1YnN0cmluZyhjU3RhcnQgKyAxLCBwYXJ0Lkxlbmd0aCAtIGNTdGFydCAtIDEpLCBjb2wsIG91dCBhYnNvbHV0ZUNvbCk7Ci0gICAgICAgICAgICAgICAgaWYgKFJOdW0gPiBpbnQuTWluVmFsdWUgJiYgQ051bSA+IGludC5NaW5WYWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBHZXRBZGRyZXNzKFJOdW0sIGFic29sdXRlUm93LCBDTnVtLCBhYnNvbHV0ZUNvbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBUb0Fic19WMShzdHJpbmcgcGFydCwgaW50IHJvdywgaW50IGNvbCwgaW50IHJvd0luY3IsIGludCBjb2xJbmNyKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sIGFic29sdXRlQ29sID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIGFic29sdXRlUm93ID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgY29sTnVtID0gLTE7Ci0gICAgICAgICAgICBpbnQgcm93TnVtID0gLTE7Ci0gICAgICAgICAgICBpbnQgbnVtOwotICAgICAgICAgICAgaW50IG51bUxlbmd0aDsKLSAgICAgICAgICAgIGludCBwb3MgPSAwOwotCi0KLSAgICAgICAgICAgIC8vIEhhbmRsZSByYW5nZSBleHByZXNzaW9ucwotICAgICAgICAgICAgaWYgKChwYXJ0Lkxlbmd0aCA+IDEpICYmIChwYXJ0LkluZGV4T2YoJzonLCAxKSA+IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBSYW5nZVRvQTFfVjEocGFydCwgcm93LCBjb2wsIHJvd0luY3IsIGNvbEluY3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFbnN1cmUgcGFydCBpcyBwcmVzZW50Ci0gICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShwYXJ0KSkKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgICAgIC8vIENvbnZlcnQgdG8gdXBwZXIgY2FzZQotICAgICAgICAgICAgc3RyaW5nIGNoZWNrID0gcGFydC5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgIAotICAgICAgICAgICAgLy8gUGFyc2UgIlIiLCBpZiBhbnkKLSAgICAgICAgICAgIGlmIChwb3MgPCBwYXJ0Lkxlbmd0aCAmJiBjaGVja1twb3NdID09ICdSJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3MgKz0gMTsKLQotICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gcGFydC5MZW5ndGgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBPbmx5ICJSIiBwcmVzZW50Ci0gICAgICAgICAgICAgICAgICAgIGFic29sdXRlUm93ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHJvd051bSA9IHJvdzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocG9zIDwgcGFydC5MZW5ndGggJiYgY2hlY2tbcG9zXSA9PSAnQycpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyAiUiIgZm9sbG93ZWQgYnkgIkMiCi0gICAgICAgICAgICAgICAgICAgIGFic29sdXRlUm93ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIHJvd051bSA9IHJvdzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocG9zIDwgcGFydC5MZW5ndGggJiYgY2hlY2tbcG9zXSA9PSAnWycpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyAiUiIgZm9sbG93ZWQgYnkgcmVsYXRpdmUgcm93IG51bWJlcgotICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgbnVtID0gR2V0TnVtYmVyX1YxKGNoZWNrLlN1YnN0cmluZyhwb3MsIHBhcnQuTGVuZ3RoIC0gcG9zKSwgb3V0IG51bUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChudW0gPT0gSW50MzIuTWluVmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydDsKLSAgICAgICAgICAgICAgICAgICAgcG9zICs9IG51bUxlbmd0aDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocG9zIDwgcGFydC5MZW5ndGggJiYgY2hlY2tbcG9zXSA9PSAnXScpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZVJvdyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICByb3dOdW0gPSByb3cgKyBudW07Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocG9zIDwgcGFydC5MZW5ndGgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyAiUiIgZm9sbG93ZWQgYnkgYWJzb2x1dGUgcm93IG51bWJlcgotICAgICAgICAgICAgICAgICAgICBudW0gPSBHZXROdW1iZXJfVjEoY2hlY2suU3Vic3RyaW5nKHBvcywgcGFydC5MZW5ndGggLSBwb3MpLCBvdXQgbnVtTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvd051bSA9PSBJbnQzMi5NaW5WYWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0OwotICAgICAgICAgICAgICAgICAgICBwb3MgKz0gbnVtTGVuZ3RoOwotCi0gICAgICAgICAgICAgICAgICAgIGFic29sdXRlUm93ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcm93TnVtID0gbnVtOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUGFyc2UgIkMiLCBpZiBhbnkKLSAgICAgICAgICAgIGlmIChwb3MgPCBwYXJ0Lkxlbmd0aCAmJiBjaGVja1twb3NdID09ICdDJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwb3MgKz0gMTsKLQotICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gcGFydC5MZW5ndGgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBPbmx5ICJDIiBwcmVzZW50Ci0gICAgICAgICAgICAgICAgICAgIGFic29sdXRlQ29sID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGNvbE51bSA9IGNvbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocG9zIDwgcGFydC5MZW5ndGggJiYgY2hlY2tbcG9zXSA9PSAnWycpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyAiQyIgZm9sbG93ZWQgYnkgcmVsYXRpdmUgY29sdW1uIG51bWJlcgotICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgbnVtID0gR2V0TnVtYmVyX1YxKGNoZWNrLlN1YnN0cmluZyhwb3MsIHBhcnQuTGVuZ3RoIC0gcG9zKSwgb3V0IG51bUxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChudW0gPT0gSW50MzIuTWluVmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFydDsKLSAgICAgICAgICAgICAgICAgICAgcG9zICs9IG51bUxlbmd0aDsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocG9zIDwgcGFydC5MZW5ndGggJiYgY2hlY2tbcG9zXSA9PSAnXScpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcyArPSAxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZUNvbCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBjb2xOdW0gPSBjb2wgKyBudW07Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocG9zIDwgcGFydC5MZW5ndGgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyAiQyIgZm9sbG93ZWQgYnkgYWJzb2x1dGUgY29sdW1uIG51bWJlcgotICAgICAgICAgICAgICAgICAgICBudW0gPSBHZXROdW1iZXJfVjEoY2hlY2suU3Vic3RyaW5nKHBvcywgcGFydC5MZW5ndGggLSBwb3MpLCBvdXQgbnVtTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bSA9PSBJbnQzMi5NaW5WYWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0OwotICAgICAgICAgICAgICAgICAgICBwb3MgKz0gbnVtTGVuZ3RoOwotCi0gICAgICAgICAgICAgICAgICAgIGFic29sdXRlQ29sID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgY29sTnVtID0gbnVtOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRW5zdXJlIG5vdGhpbmcgcmVtYWlucyB1bnBhcnNlZAotICAgICAgICAgICAgaWYgKHBvcyA8IHBhcnQuTGVuZ3RoKQotICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0OwotCi0gICAgICAgICAgICAvLyBFeGl0IGlmIG5laXRoZXIgcm93IG5vciBjb2x1bW4gaXMgcHJlc2VudAotICAgICAgICAgICAgaWYgKChyb3dOdW0gPT0gSW50MzIuTWluVmFsdWUpICYmIChjb2xOdW0gPT0gSW50MzIuTWluVmFsdWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBwYXJ0OwotCi0gICAgICAgICAgICAvLyBBcHBlbmQgY29sdW1uCi0gICAgICAgICAgICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gICAgICAgICAgICBpZiAoY29sTnVtID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFic29sdXRlQ29sKQotICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIiQiOwotICAgICAgICAgICAgICAgIHJlc3VsdCArPSBHZXRDb2x1bW5MZXR0ZXIoY29sTnVtKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQXBwZW5kIHJvdwotICAgICAgICAgICAgaWYgKHJvd051bSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhYnNvbHV0ZVJvdykKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9ICIkIjsKLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gcm93TnVtLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFJldHVybiByZXN1bHQKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgR2V0TnVtYmVyX1YxKHN0cmluZyB2YWx1ZSwgb3V0IGludCBsZW5ndGgpCi0gICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIEdldCBudW1iZXIgbGVuZ3RoCi0gICAgICAgICAgICBsZW5ndGggPSAwOwotCi0gICAgICAgICAgICAvLyBFbnN1cmUgdmFsdWUgaXMgcHJlc2VudAotICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPcldoaXRlU3BhY2UodmFsdWUpKQotICAgICAgICAgICAgICAgIHJldHVybiBJbnQzMi5NaW5WYWx1ZTsKLQotICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHNpZ24KLSAgICAgICAgICAgIGlmICgobGVuZ3RoIDwgdmFsdWUuTGVuZ3RoKSAmJiAoKHZhbHVlW2xlbmd0aF0gPT0gJy0nKSB8fCAodmFsdWVbbGVuZ3RoXSA9PSAnKycpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZW5ndGggKz0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gR2V0IG51bWJlciBsZW5ndGgKLSAgICAgICAgICAgIHdoaWxlIChsZW5ndGggPCB2YWx1ZS5MZW5ndGggJiYgdmFsdWVbbGVuZ3RoXSA+PSAnMCcgJiYgdmFsdWVbbGVuZ3RoXSA8PSAnOScpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoICs9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5vIG51bWJlciBmb3VuZAotICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBJbnQzMi5NaW5WYWx1ZTsKLQotICAgICAgICAgICAgLy8gUmV0dXJuIG51bWJlciB2YWx1ZQotICAgICAgICAgICAgaW50IHJlc3VsdDsKLSAgICAgICAgICAgIHJldHVybiAoaW50LlRyeVBhcnNlKHZhbHVlLlN1YnN0cmluZygwLCBsZW5ndGgpLCBvdXQgcmVzdWx0KSkgPyByZXN1bHQgOiBJbnQzMi5NaW5WYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBSYW5nZVRvQTFfVjEoc3RyaW5nIHBhcnQsIGludCByb3csIGludCBjb2wsIGludCByb3dJbmNyLCBpbnQgY29sSW5jcikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU3BsaXQgcmFuZ2UgZXhwcmVzc2lvbgotICAgICAgICAgICAgc3RyaW5nW10gY2VsbFZhbHVlcyA9IHBhcnQuU3BsaXQobmV3IGNoYXJbXSB7ICc6JyB9LCBTdHJpbmdTcGxpdE9wdGlvbnMuUmVtb3ZlRW1wdHlFbnRyaWVzKTsKLQotICAgICAgICAgICAgLy8gQ29udmVydCByYW5nZSBleHByZXNzaW9ucwotICAgICAgICAgICAgc3RyaW5nIHJlc3VsdCA9ICIiOwotICAgICAgICAgICAgcmVzdWx0ICs9IFRvQWJzX1YxKGNlbGxWYWx1ZXNbMF0sIHJvdywgY29sLCByb3dJbmNyLCBjb2xJbmNyKTsKLSAgICAgICAgICAgIHJlc3VsdCArPSAiOiI7Ci0gICAgICAgICAgICByZXN1bHQgKz0gVG9BYnNfVjEoY2VsbFZhbHVlc1sxXSwgcm93LCBjb2wsIHJvd0luY3IsIGNvbEluY3IpOwotCi0gICAgICAgICAgICAvLyBSZXR1cm4gY29udmVydGVkIHJhbmdlIGV4cHJlc3Npb24KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgUmFuZ2VDZWxsVG9BMV9WMShzdHJpbmcgcGFydCwgaW50IHJvdywgaW50IGNvbCwgaW50IHJvd0luY3IsIGludCBjb2xJbmNyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYWRkclJvdywgYWRkckNvbDsKLSAgICAgICAgICAgIGJvb2wgZml4ZWRSb3csIGZpeGVkQ29sOwotCi0gICAgICAgICAgICBzdHJpbmcgcmVzdWx0ID0gIiI7Ci0gICAgICAgICAgICBpZiAoR2V0Um93Q29sX1YxKHBhcnQsIG91dCBhZGRyUm93LCBvdXQgYWRkckNvbCwgZmFsc2UsIG91dCBmaXhlZFJvdywgb3V0IGZpeGVkQ29sKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYWRkclJvdyA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIlIiOwotICAgICAgICAgICAgICAgICAgICBpZiAoZml4ZWRSb3cpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFic29sdXRlIHJvdwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFkZHJSb3cuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhZGRyUm93IC0gcm93ICE9IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbGF0aXZlIHJvdwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZy5Gb3JtYXQoIlt7MH1dIiwgYWRkclJvdyAtIHJvdyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYWRkckNvbCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gIkMiOwotICAgICAgICAgICAgICAgICAgICBpZiAoZml4ZWRDb2wpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFic29sdXRlIGNvbHVtbgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFkZHJDb2w7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYWRkckNvbCAtIGNvbCAhPSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWxhdGl2ZSBjb2x1bW4KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBzdHJpbmcuRm9ybWF0KCJbezB9XSIsIGFkZHJDb2wgLSBjb2wpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIG9yIHN1YnRyYWN0cyBhIHJvdyBvciBjb2x1bW4gdG8gYW4gYWRkcmVzcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3dJbmNyIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbEluY3IiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBBZGRUb1Jvd0NvbHVtblRyYW5zbGF0b3Ioc3RyaW5nIEFkZHJlc3MsIGludCByb3csIGludCBjb2wsIGludCByb3dJbmNyLCBpbnQgY29sSW5jcikKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGZyb21Sb3csIGZyb21Db2w7Ci0gICAgICAgICAgICBpZiAoQWRkcmVzcyA9PSAiI1JFRiEiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBBZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKEdldFJvd0NvbChBZGRyZXNzLCBvdXQgZnJvbVJvdywgb3V0IGZyb21Db2wsIGZhbHNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZnJvbVJvdyA9PSAwIHx8IGZyb21Db2wgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBZGRyZXNzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocm93SW5jciAhPSAwICYmIHJvdyAhPSAwICYmIGZyb21Sb3cgPj0gcm93ICYmIEFkZHJlc3MuSW5kZXhPZignJCcsIDEpID09IC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21Sb3cgPCByb3cgLSByb3dJbmNyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiNSRUYhIjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZyb21Sb3cgPSBmcm9tUm93ICsgcm93SW5jcjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29sSW5jciAhPSAwICYmIGNvbCAhPSAwICYmIGZyb21Db2wgPj0gY29sICYmIEFkZHJlc3MuU3RhcnRzV2l0aCgiJCIpID09IGZhbHNlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21Db2wgPCBjb2wgLSBjb2xJbmNyKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiNSRUYhIjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZyb21Db2wgPSBmcm9tQ29sICsgY29sSW5jcjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBZGRyZXNzID0gR2V0QWRkcmVzcyhmcm9tUm93LCBBZGRyZXNzLkluZGV4T2YoJyQnLCAxKSA+IC0xLCBmcm9tQ29sLCBBZGRyZXNzLlN0YXJ0c1dpdGgoIiQiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQWRkcmVzczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgd2l0aCBicmFja2V0cyBpZiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2Ij5UaGUgdmFsdWU8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0UkNGbXQoaW50IHYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAodiA8IDAgPyBzdHJpbmcuRm9ybWF0KCJbezB9XSIsIHYpIDogdiA+IDAgPyB2LlRvU3RyaW5nKCkgOiAiIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0IHRoZSBvZmZzZXQgdmFsdWUgZm9yIFJDIGZvcm1hdAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik9mZnNldFZhbHVlIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpeGVkQWRkciI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgLy8vIAotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgR2V0UkMoc3RyaW5nIHZhbHVlLCBpbnQgT2Zmc2V0VmFsdWUsIG91dCBib29sIGZpeGVkQWRkcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlID09ICIiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpeGVkQWRkciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiBPZmZzZXRWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBudW07Ci0gICAgICAgICAgICBpZiAodmFsdWVbMF0gPT0gJ1snICYmIHZhbHVlW3ZhbHVlLkxlbmd0aCAtIDFdID09ICddJykgLy9PZmZzZXQ/ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpeGVkQWRkciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UodmFsdWUuU3Vic3RyaW5nKDEsIHZhbHVlLkxlbmd0aCAtIDIpLCBvdXQgbnVtKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoT2Zmc2V0VmFsdWUgKyBudW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50Lk1pblZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBBYnNvbHV0ZSBhZGRyZXNzCi0gICAgICAgICAgICAgICAgZml4ZWRBZGRyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKHZhbHVlLCBvdXQgbnVtKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnQuTWluVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEdldFJDX1YxKHN0cmluZyB2YWx1ZSwgaW50IE9mZnNldFZhbHVlLCBvdXQgYm9vbCBmaXhlZEFkZHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgodmFsdWUgPT0gIiIpIHx8ICh2YWx1ZSA9PSAiUiIpIHx8ICh2YWx1ZSA9PSAiQyIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFJlbGF0aXZlIGFkZHJlc3Mgd2l0aCBubyBvZmZzZXQKLSAgICAgICAgICAgICAgICBmaXhlZEFkZHIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT2Zmc2V0VmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgbnVtOwotICAgICAgICAgICAgaWYgKHZhbHVlWzFdID09ICdbJyAmJiB2YWx1ZVt2YWx1ZS5MZW5ndGggLSAxXSA9PSAnXScpIC8vT2Zmc2V0PyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGl2ZSBhZGRyZXNzCi0gICAgICAgICAgICAgICAgZml4ZWRBZGRyID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGludC5UcnlQYXJzZSh2YWx1ZS5TdWJzdHJpbmcoMiwgdmFsdWUuTGVuZ3RoIC0gMyksIG91dCBudW0pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChPZmZzZXRWYWx1ZSArIG51bSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnQuTWluVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIEFic29sdXRlIGFkZHJlc3MKLSAgICAgICAgICAgICAgICBmaXhlZEFkZHIgPSB0cnVlOwotICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UodmFsdWUuU3Vic3RyaW5nKDEsIHZhbHVlLkxlbmd0aCAtIDEpLCBvdXQgbnVtKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnQuTWluVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgI3JlZ2lvbiAiQWRkcmVzcyBGdW5jdGlvbnMiCi0gICAgICAgICNyZWdpb24gR2V0Q29sdW1uTGV0dGVyCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIGNoYXJhY3RlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgbnVtYmVyZWQgY29sdW1uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaUNvbHVtbk51bWJlciI+VGhlIG51bWJlciBvZiB0aGUgY29sdW1uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBsZXR0ZXIgcmVwcmVzZW50aW5nIHRoZSBjb2x1bW48L3JldHVybnM+Ci0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldENvbHVtbkxldHRlcihpbnQgaUNvbHVtbk51bWJlcikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEdldENvbHVtbkxldHRlcihpQ29sdW1uTnVtYmVyLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIHN0YXRpYyBzdHJpbmcgR2V0Q29sdW1uTGV0dGVyKGludCBpQ29sdW1uTnVtYmVyLCBib29sIGZpeGVkQ29sKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGlmIChpQ29sdW1uTnVtYmVyIDwgMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBFeGNlcHRpb24oIkNvbHVtbiBudW1iZXIgaXMgb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIjUkVGISI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0cmluZyBzQ29sID0gIiI7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNDb2wgPSAoKGNoYXIpKCdBJyArICgoaUNvbHVtbk51bWJlciAtIDEpICUgMjYpKSkgKyBzQ29sOwotICAgICAgICAgICAgICAgIGlDb2x1bW5OdW1iZXIgPSAoaUNvbHVtbk51bWJlciAtICgoaUNvbHVtbk51bWJlciAtIDEpICUgMjYpKSAvIDI2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKGlDb2x1bW5OdW1iZXIgPiAwKTsKLSAgICAgICAgICAgIHJldHVybiBmaXhlZENvbCA/ICIkIiArIHNDb2wgOiBzQ29sOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBHZXRSb3dDb2xGcm9tQWRkcmVzcyhzdHJpbmcgQ2VsbEFkZHJlc3MsIG91dCBpbnQgRnJvbVJvdywgb3V0IGludCBGcm9tQ29sdW1uLCBvdXQgaW50IFRvUm93LCBvdXQgaW50IFRvQ29sdW1uKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sIGZpeGVkRnJvbVJvdywgZml4ZWRGcm9tQ29sdW1uLCBmaXhlZFRvUm93LCBmaXhlZFRvQ29sdW1uOwotICAgICAgICAgICAgcmV0dXJuIEdldFJvd0NvbEZyb21BZGRyZXNzKENlbGxBZGRyZXNzLCBvdXQgRnJvbVJvdywgb3V0IEZyb21Db2x1bW4sIG91dCBUb1Jvdywgb3V0IFRvQ29sdW1uLCBvdXQgZml4ZWRGcm9tUm93LCBvdXQgZml4ZWRGcm9tQ29sdW1uLCBvdXQgZml4ZWRUb1Jvdywgb3V0IGZpeGVkVG9Db2x1bW4pOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldCB0aGUgcm93L2NvbHVtbnMgZm9yIGEgQ2VsbC1hZGRyZXNzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQ2VsbEFkZHJlc3MiPlRoZSBhZGRyZXNzPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGcm9tUm93Ij5SZXR1cm5zIHRoZSB0byBjb2x1bW48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkZyb21Db2x1bW4iPlJldHVybnMgdGhlIGZyb20gY29sdW1uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJUb1JvdyI+UmV0dXJucyB0aGUgdG8gcm93PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJUb0NvbHVtbiI+UmV0dXJucyB0aGUgZnJvbSByb3c8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpeGVkRnJvbVJvdyI+SXMgdGhlIGZyb20gcm93IGZpeGVkPzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZml4ZWRGcm9tQ29sdW1uIj5JcyB0aGUgZnJvbSBjb2x1bW4gZml4ZWQ/PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaXhlZFRvUm93Ij5JcyB0aGUgdG8gcm93IGZpeGVkPzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZml4ZWRUb0NvbHVtbiI+SXMgdGhlIHRvIGNvbHVtbiBmaXhlZD88L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBHZXRSb3dDb2xGcm9tQWRkcmVzcyhzdHJpbmcgQ2VsbEFkZHJlc3MsIG91dCBpbnQgRnJvbVJvdywgb3V0IGludCBGcm9tQ29sdW1uLCBvdXQgaW50IFRvUm93LCBvdXQgaW50IFRvQ29sdW1uLCBvdXQgYm9vbCBmaXhlZEZyb21Sb3csIG91dCBib29sIGZpeGVkRnJvbUNvbHVtbiwgb3V0IGJvb2wgZml4ZWRUb1Jvdywgb3V0IGJvb2wgZml4ZWRUb0NvbHVtbikKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbCByZXQ7Ci0gICAgICAgICAgICBpZiAoQ2VsbEFkZHJlc3MuSW5kZXhPZignWycpID4gMCkgLy9FeHRlcm5hbCByZWZlcmVuY2Ugb3IgcmVmZXJlbmNlIHRvIFRhYmxlIG9yIFBpdm90dGFibGUuCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRnJvbVJvdyA9IC0xOwotICAgICAgICAgICAgICAgIEZyb21Db2x1bW4gPSAtMTsKLSAgICAgICAgICAgICAgICBUb1JvdyA9IC0xOwotICAgICAgICAgICAgICAgIFRvQ29sdW1uID0gLTE7Ci0gICAgICAgICAgICAgICAgZml4ZWRGcm9tUm93ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZml4ZWRGcm9tQ29sdW1uID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZml4ZWRUb1Jvdz0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgZml4ZWRUb0NvbHVtbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ2VsbEFkZHJlc3MgPSBDZWxsQWRkcmVzcy5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgICAgLy9UaGlzIG9uZSBjYW4gYmUgcmVtb3ZlZCB3aGVuIHRoZSB3b3Jrc2hlZXQgU2VsZWN0IGZvcm1hdCBpcyBmaXhlZAotICAgICAgICAgICAgaWYgKENlbGxBZGRyZXNzLkluZGV4T2YoJyAnKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2VsbEFkZHJlc3MgPSBDZWxsQWRkcmVzcy5TdWJzdHJpbmcoMCwgQ2VsbEFkZHJlc3MuSW5kZXhPZignICcpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKENlbGxBZGRyZXNzLkluZGV4T2YoJzonKSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gR2V0Um93Q29sRnJvbUFkZHJlc3MoQ2VsbEFkZHJlc3MsIG91dCBGcm9tUm93LCBvdXQgRnJvbUNvbHVtbiwgb3V0IGZpeGVkRnJvbVJvdywgb3V0IGZpeGVkRnJvbUNvbHVtbik7Ci0gICAgICAgICAgICAgICAgVG9Db2x1bW4gPSBGcm9tQ29sdW1uOwotICAgICAgICAgICAgICAgIFRvUm93ID0gRnJvbVJvdzsKLSAgICAgICAgICAgICAgICBmaXhlZFRvUm93ID0gZml4ZWRGcm9tUm93OwotICAgICAgICAgICAgICAgIGZpeGVkVG9Db2x1bW4gPSBmaXhlZEZyb21Db2x1bW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nW10gY2VsbHMgPSBDZWxsQWRkcmVzcy5TcGxpdCgnOicpOwotICAgICAgICAgICAgICAgIHJldCA9IEdldFJvd0NvbEZyb21BZGRyZXNzKGNlbGxzWzBdLCBvdXQgRnJvbVJvdywgb3V0IEZyb21Db2x1bW4sIG91dCBmaXhlZEZyb21Sb3csIG91dCBmaXhlZEZyb21Db2x1bW4pOwotICAgICAgICAgICAgICAgIGlmIChyZXQpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IEdldFJvd0NvbEZyb21BZGRyZXNzKGNlbGxzWzFdLCBvdXQgVG9Sb3csIG91dCBUb0NvbHVtbiwgb3V0IGZpeGVkVG9Sb3csIG91dCBmaXhlZFRvQ29sdW1uKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBHZXRSb3dDb2xGcm9tQWRkcmVzcyhjZWxsc1sxXSwgb3V0IFRvUm93LCBvdXQgVG9Db2x1bW4sIG91dCBmaXhlZFRvUm93LCBvdXQgZml4ZWRUb0NvbHVtbik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKEZyb21Db2x1bW4gPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgRnJvbUNvbHVtbiA9IDE7Ci0gICAgICAgICAgICAgICAgaWYgKEZyb21Sb3cgPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgRnJvbVJvdyA9IDE7Ci0gICAgICAgICAgICAgICAgaWYgKFRvQ29sdW1uIDw9IDApCi0gICAgICAgICAgICAgICAgICAgIFRvQ29sdW1uID0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnM7Ci0gICAgICAgICAgICAgICAgaWYgKFRvUm93IDw9IDApCi0gICAgICAgICAgICAgICAgICAgIFRvUm93ID0gRXhjZWxQYWNrYWdlLk1heFJvd3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldCB0aGUgcm93L2NvbHVtbiBmb3IgbiBDZWxsLWFkZHJlc3MKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJDZWxsQWRkcmVzcyI+VGhlIGFkZHJlc3M8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJvdyI+UmV0dXJucyBUdGhlIHJvdzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQ29sdW1uIj5SZXR1cm5zIHRoZSBjb2x1bW48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB2YWxpZDwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJvb2wgR2V0Um93Q29sRnJvbUFkZHJlc3Moc3RyaW5nIENlbGxBZGRyZXNzLCBvdXQgaW50IFJvdywgb3V0IGludCBDb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBHZXRSb3dDb2woQ2VsbEFkZHJlc3MsIG91dCBSb3csIG91dCBDb2x1bW4sIHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBib29sIEdldFJvd0NvbEZyb21BZGRyZXNzKHN0cmluZyBDZWxsQWRkcmVzcywgb3V0IGludCByb3csIG91dCBpbnQgY29sLCBvdXQgYm9vbCBmaXhlZFJvdywgb3V0IGJvb2wgZml4ZWRDb2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBHZXRSb3dDb2woQ2VsbEFkZHJlc3MsIG91dCByb3csIG91dCBjb2wsIHRydWUsIG91dCBmaXhlZFJvdywgb3V0IGZpeGVkQ29sKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldCB0aGUgcm93L2NvbHVtbiBmb3IgYSBDZWxsLWFkZHJlc3MKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj50aGUgYWRkcmVzczwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij5yZXR1cm5zIHRoZSByb3c8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+cmV0dXJucyB0aGUgY29sdW1uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0aHJvd0V4Y2VwdGlvbiI+dGhyb3cgZXhjZXB0aW9uIGlmIGludmFsaWQsIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJvb2wgR2V0Um93Q29sKHN0cmluZyBhZGRyZXNzLCBvdXQgaW50IHJvdywgb3V0IGludCBjb2wsIGJvb2wgdGhyb3dFeGNlcHRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgZml4ZWRSb3csIGZpeGVkQ29sOwotICAgICAgICAgICAgcmV0dXJuIEdldFJvd0NvbChhZGRyZXNzLCBvdXQgcm93LCBvdXQgY29sLCB0aHJvd0V4Y2VwdGlvbiwgb3V0IGZpeGVkUm93LCBvdXQgZml4ZWRDb2wpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBib29sIEdldFJvd0NvbChzdHJpbmcgYWRkcmVzcywgb3V0IGludCByb3csIG91dCBpbnQgY29sLCBib29sIHRocm93RXhjZXB0aW9uLCBvdXQgYm9vbCBmaXhlZFJvdywgb3V0IGJvb2wgZml4ZWRDb2wpCi0gICAgICAgIHsKLSAgICAgICAgICBib29sIGNvbFBhcnQgPSB0cnVlOwotICAgICAgICAgIGludCBjb2xTdGFydEl4ID0gMDsKLSAgICAgICAgICBpbnQgY29sTGVuZ3RoID0gMDsKLSAgICAgICAgICBjb2wgPSAwOwotICAgICAgICAgIHJvdyA9IDA7Ci0gICAgICAgICAgZml4ZWRSb3cgPSBmYWxzZTsKLSAgICAgICAgICBmaXhlZENvbCA9IGZhbHNlOwotCi0gICAgICAgICAgaWYgKGFkZHJlc3MuRW5kc1dpdGgoIiNSRUYhIikpCi0gICAgICAgICAgewotICAgICAgICAgICAgcm93ID0gMDsKLSAgICAgICAgICAgIGNvbCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpbnQgc2hlZXRNYXJrZXJJbmRleCA9IGFkZHJlc3MuSW5kZXhPZignIScpOwotICAgICAgICAgIGlmIChzaGVldE1hcmtlckluZGV4ID49IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgY29sU3RhcnRJeCA9IHNoZWV0TWFya2VySW5kZXggKyAxOwotICAgICAgICAgIH0KLSAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgIGZvciAoaW50IGkgPSBjb2xTdGFydEl4OyBpIDwgYWRkcmVzcy5MZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGFyIGMgPSBhZGRyZXNzW2ldOwotICAgICAgICAgICAgaWYgKGNvbFBhcnQgJiYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSAmJiBjb2xMZW5ndGggPD0gMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb2wgKj0gMjY7Ci0gICAgICAgICAgICAgICAgY29sICs9ICgoaW50KWMpIC0gNjQ7Ci0gICAgICAgICAgICAgICAgY29sTGVuZ3RoKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByb3cgKj0gMTA7Ci0gICAgICAgICAgICAgICAgcm93ICs9ICgoaW50KWMpIC0gNDg7Ci0gICAgICAgICAgICAgICAgY29sUGFydCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnJCcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPT0gY29sU3RhcnRJeCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbFN0YXJ0SXgrKzsKLSAgICAgICAgICAgICAgICAgICAgZml4ZWRDb2wgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb2xQYXJ0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGZpeGVkUm93ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcm93ID0gMDsKLSAgICAgICAgICAgICAgICBjb2wgPSAwOwotICAgICAgICAgICAgICAgIGlmICh0aHJvd0V4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIkludmFsaWQgQWRkcmVzcyBmb3JtYXQgezB9IiwgYWRkcmVzcykpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIHJvdyAhPSAwIHx8IGNvbCAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJvb2wgR2V0Um93Q29sX1YxKHN0cmluZyBhZGRyZXNzLCBvdXQgaW50IHJvdywgb3V0IGludCBjb2wsIGJvb2wgdGhyb3dFeGNlcHRpb24sIG91dCBib29sIGZpeGVkUm93LCBvdXQgYm9vbCBmaXhlZENvbCkKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbCBjb2xQYXJ0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJvb2wgaXNGaXhlZCA9IGZhbHNlOwotICAgICAgICAgICAgaW50IGNvbFN0YXJ0SXggPSAwOwotICAgICAgICAgICAgaW50IGNvbExlbmd0aCA9IDA7Ci0gICAgICAgICAgICBjb2wgPSAwOwotICAgICAgICAgICAgcm93ID0gMDsKLSAgICAgICAgICAgIGZpeGVkUm93ID0gZmFsc2U7Ci0gICAgICAgICAgICBmaXhlZENvbCA9IGZhbHNlOwotCi0gICAgICAgICAgICBpZiAoYWRkcmVzcy5FbmRzV2l0aCgiI1JFRiEiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByb3cgPSAwOwotICAgICAgICAgICAgICAgIGNvbCA9IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBzaGVldE1hcmtlckluZGV4ID0gYWRkcmVzcy5JbmRleE9mKCchJyk7Ci0gICAgICAgICAgICBpZiAoc2hlZXRNYXJrZXJJbmRleCA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbFN0YXJ0SXggPSBzaGVldE1hcmtlckluZGV4ICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFkZHJlc3MgPSBhZGRyZXNzLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gY29sU3RhcnRJeDsgaSA8IGFkZHJlc3MuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gYWRkcmVzc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoYyA9PSAnJCcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBBYnNvbHV0ZSBhZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIGlzRml4ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xQYXJ0ICYmIChjID49ICdBJyAmJiBjIDw9ICdaJykgJiYgY29sTGVuZ3RoIDw9IDMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb2x1bW4gcG9ydGlvbiBvZiBhZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0ZpeGVkKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXhlZENvbCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0ZpeGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjb2wgKj0gMjY7Ci0gICAgICAgICAgICAgICAgICAgIGNvbCArPSAoKGludCljKSAtIDY0OwotICAgICAgICAgICAgICAgICAgICBjb2xMZW5ndGgrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBSb3cgcG9ydGlvbiBvZiBhZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIGlmIChpc0ZpeGVkKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXhlZFJvdyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0ZpeGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICByb3cgKj0gMTA7Ci0gICAgICAgICAgICAgICAgICAgIHJvdyArPSAoKGludCljKSAtIDQ4OwotICAgICAgICAgICAgICAgICAgICBjb2xQYXJ0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJvdyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGNvbCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aHJvd0V4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiSW52YWxpZCBBZGRyZXNzIGZvcm1hdCB7MH0iLCBhZGRyZXNzKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJvdyAhPSAwIHx8IGNvbCAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IEdldENvbHVtbihzdHJpbmcgc0NvbCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNvbCA9IDA7Ci0gICAgICAgICAgICBpbnQgbGVuID0gc0NvbC5MZW5ndGggLSAxOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxlbjsgaSA+PSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29sICs9ICgoKGludClzQ29sW2ldKSAtIDY0KSAqIChpbnQpKE1hdGguUG93KDI2LCBsZW4gLSBpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29sOwotICAgICAgICB9Ci0gICAgICAgICNyZWdpb24gR2V0QWRkcmVzcwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRoZSBBbHBoYU51bWVyaWMgcmVwcmVzZW50YXRpb24gdGhhdCBFeGNlbCBleHBlY3RzIGZvciBhIENlbGwgQWRkcmVzcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJvdyI+VGhlIG51bWJlciBvZiB0aGUgcm93PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJDb2x1bW4iPlRoZSBudW1iZXIgb2YgdGhlIGNvbHVtbiBpbiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBjZWxsIGFkZHJlc3MgaW4gdGhlIGZvcm1hdCBBMTwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0QWRkcmVzcyhpbnQgUm93LCBpbnQgQ29sdW1uKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gR2V0QWRkcmVzcyhSb3csIENvbHVtbixmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgQWxwaGFOdW1lcmljIHJlcHJlc2VudGF0aW9uIHRoYXQgRXhjZWwgZXhwZWN0cyBmb3IgYSBDZWxsIEFkZHJlc3MKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJSb3ciPlRoZSBudW1iZXIgb2YgdGhlIHJvdzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQ29sdW1uIj5UaGUgbnVtYmVyIG9mIHRoZSBjb2x1bW4gaW4gdGhlIHdvcmtzaGVldDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQWJzb2x1dGVSb3ciPkFic29sdXRlIHJvdzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQWJzb2x1dGVDb2wiPkFic29sdXRlIGNvbHVtbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgY2VsbCBhZGRyZXNzIGluIHRoZSBmb3JtYXQgQTE8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEFkZHJlc3MoaW50IFJvdywgYm9vbCBBYnNvbHV0ZVJvdywgaW50IENvbHVtbiwgYm9vbCBBYnNvbHV0ZUNvbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICggQWJzb2x1dGVDb2wgPyAiJCIgOiAiIikgKyBHZXRDb2x1bW5MZXR0ZXIoQ29sdW1uKSArICggQWJzb2x1dGVSb3cgPyAiJCIgOiAiIikgKyBSb3cuVG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRoZSBBbHBoYU51bWVyaWMgcmVwcmVzZW50YXRpb24gdGhhdCBFeGNlbCBleHBlY3RzIGZvciBhIENlbGwgQWRkcmVzcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJvdyI+VGhlIG51bWJlciBvZiB0aGUgcm93PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJDb2x1bW4iPlRoZSBudW1iZXIgb2YgdGhlIGNvbHVtbiBpbiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJBYnNvbHV0ZSI+R2V0IGFuIGFic29sdXRlIGFkZHJlc3MgKCRBJDEpPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBjZWxsIGFkZHJlc3MgaW4gdGhlIGZvcm1hdCBBMTwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0QWRkcmVzcyhpbnQgUm93LCBpbnQgQ29sdW1uLCBib29sIEFic29sdXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUm93ID09IDAgfHwgQ29sdW1uID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIjUkVGISI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoQWJzb2x1dGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgiJCIgKyBHZXRDb2x1bW5MZXR0ZXIoQ29sdW1uKSArICIkIiArIFJvdy5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEdldENvbHVtbkxldHRlcihDb2x1bW4pICsgUm93LlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIEFscGhhTnVtZXJpYyByZXByZXNlbnRhdGlvbiB0aGF0IEV4Y2VsIGV4cGVjdHMgZm9yIGEgQ2VsbCBBZGRyZXNzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRnJvbVJvdyI+RnJvbSByb3cgbnVtYmVyPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGcm9tQ29sdW1uIj5Gcm9tIGNvbHVtbiBudW1iZXI8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlRvUm93Ij5UbyByb3cgbnVtYmVyPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJUb0NvbHVtbiI+RnJvbSBjb2x1bW4gbnVtYmVyPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBjZWxsIGFkZHJlc3MgaW4gdGhlIGZvcm1hdCBBMTwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0QWRkcmVzcyhpbnQgRnJvbVJvdywgaW50IEZyb21Db2x1bW4sIGludCBUb1JvdywgaW50IFRvQ29sdW1uKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gR2V0QWRkcmVzcyhGcm9tUm93LCBGcm9tQ29sdW1uLCBUb1JvdywgVG9Db2x1bW4sIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRoZSBBbHBoYU51bWVyaWMgcmVwcmVzZW50YXRpb24gdGhhdCBFeGNlbCBleHBlY3RzIGZvciBhIENlbGwgQWRkcmVzcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkZyb21Sb3ciPkZyb20gcm93IG51bWJlcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRnJvbUNvbHVtbiI+RnJvbSBjb2x1bW4gbnVtYmVyPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJUb1JvdyI+VG8gcm93IG51bWJlcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iVG9Db2x1bW4iPkZyb20gY29sdW1uIG51bWJlcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQWJzb2x1dGUiPmlmIHRydWUgYWRkcmVzcyBpcyBhYnNvbHV0ZSAobGlrZSAkQSQxKTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgY2VsbCBhZGRyZXNzIGluIHRoZSBmb3JtYXQgQTE8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEFkZHJlc3MoaW50IEZyb21Sb3csIGludCBGcm9tQ29sdW1uLCBpbnQgVG9Sb3csIGludCBUb0NvbHVtbiwgYm9vbCBBYnNvbHV0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEZyb21Sb3cgPT0gVG9Sb3cgJiYgRnJvbUNvbHVtbiA9PSBUb0NvbHVtbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0QWRkcmVzcyhGcm9tUm93LCBGcm9tQ29sdW1uLCBBYnNvbHV0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEZyb21Sb3cgPT0gMSAmJiBUb1JvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBhYnNDaGFyID0gQWJzb2x1dGUgPyAiJCIgOiAiIjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFic0NoYXIgKyBHZXRDb2x1bW5MZXR0ZXIoRnJvbUNvbHVtbikgKyAiOiIgKyBhYnNDaGFyICsgR2V0Q29sdW1uTGV0dGVyKFRvQ29sdW1uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihGcm9tQ29sdW1uPT0xICYmIFRvQ29sdW1uPT1FeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBhYnNDaGFyID0gQWJzb2x1dGUgPyAiJCIgOiAiIjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFic0NoYXIgKyBGcm9tUm93LlRvU3RyaW5nKCkgKyAiOiIgKyBhYnNDaGFyICsgVG9Sb3cuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdldEFkZHJlc3MoRnJvbVJvdywgRnJvbUNvbHVtbiwgQWJzb2x1dGUpICsgIjoiICsgR2V0QWRkcmVzcyhUb1JvdywgVG9Db2x1bW4sIEFic29sdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgQWxwaGFOdW1lcmljIHJlcHJlc2VudGF0aW9uIHRoYXQgRXhjZWwgZXhwZWN0cyBmb3IgYSBDZWxsIEFkZHJlc3MKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGcm9tUm93Ij5Gcm9tIHJvdyBudW1iZXI8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkZyb21Db2x1bW4iPkZyb20gY29sdW1uIG51bWJlcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iVG9Sb3ciPlRvIHJvdyBudW1iZXI8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlRvQ29sdW1uIj5Gcm9tIGNvbHVtbiBudW1iZXI8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkZpeGVkRnJvbUNvbHVtbiI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGaXhlZEZyb21Sb3ciPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRml4ZWRUb0NvbHVtbiI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGaXhlZFRvUm93Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIGNlbGwgYWRkcmVzcyBpbiB0aGUgZm9ybWF0IEExPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRBZGRyZXNzKGludCBGcm9tUm93LCBpbnQgRnJvbUNvbHVtbiwgaW50IFRvUm93LCBpbnQgVG9Db2x1bW4sIGJvb2wgRml4ZWRGcm9tUm93LCBib29sIEZpeGVkRnJvbUNvbHVtbiwgYm9vbCBGaXhlZFRvUm93LCBib29sICBGaXhlZFRvQ29sdW1uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoRnJvbVJvdyA9PSBUb1JvdyAmJiBGcm9tQ29sdW1uID09IFRvQ29sdW1uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRBZGRyZXNzKEZyb21Sb3csIEZpeGVkRnJvbVJvdywgRnJvbUNvbHVtbiwgRml4ZWRGcm9tQ29sdW1uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoRnJvbVJvdyA9PSAxICYmIFRvUm93ID09IEV4Y2VsUGFja2FnZS5NYXhSb3dzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdldENvbHVtbkxldHRlcihGcm9tQ29sdW1uLCBGaXhlZEZyb21Db2x1bW4pICsgIjoiICsgR2V0Q29sdW1uTGV0dGVyKFRvQ29sdW1uLCBGaXhlZFRvQ29sdW1uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoRnJvbUNvbHVtbiA9PSAxICYmIFRvQ29sdW1uID09IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKQotICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEZpeGVkRnJvbVJvdyA/ICIkIjoiIikgKyBGcm9tUm93LlRvU3RyaW5nKCkgKyAiOiIgKyAoRml4ZWRUb1JvdyA/ICIkIjoiIikgKyBUb1Jvdy5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gR2V0QWRkcmVzcyhGcm9tUm93LCBGaXhlZEZyb21Sb3csIEZyb21Db2x1bW4sIEZpeGVkRnJvbUNvbHVtbikgKyAiOiIgKyBHZXRBZGRyZXNzKFRvUm93LCBGaXhlZFRvUm93LCBUb0NvbHVtbiwgRml4ZWRUb0NvbHVtbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldCB0aGUgZnVsbCBhZGRyZXNzIGluY2x1ZGluZyB0aGUgd29ya3NoZWV0IG5hbWUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXROYW1lIj5UaGUgbmFtZSBvZiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5UaGUgYWRkcmVzczwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgZnVsbCBhZGRyZXNzPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRGdWxsQWRkcmVzcyhzdHJpbmcgd29ya3NoZWV0TmFtZSwgc3RyaW5nIGFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBHZXRGdWxsQWRkcmVzcyh3b3Jrc2hlZXROYW1lLCBhZGRyZXNzLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldEZ1bGxBZGRyZXNzKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBzdHJpbmcgYWRkcmVzcywgYm9vbCBmdWxsUm93Q29sKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICBpZiAoYWRkcmVzcy5JbmRleE9mKCIhIikgPT0gLTEgfHwgYWRkcmVzcz09IiNSRUYhIikKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICBpZiAoZnVsbFJvd0NvbCkKLSAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1tdIGNlbGxzID0gYWRkcmVzcy5TcGxpdCgnOicpOwotICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbHMuTGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IHN0cmluZy5Gb3JtYXQoIid7MH0nIXsxfSIsIHdvcmtzaGVldE5hbWUsIGNlbGxzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxscy5MZW5ndGggPiAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgKz0gc3RyaW5nLkZvcm1hdCgiOnswfSIsIGNlbGxzWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKGFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGEuX2Zyb21Sb3cgPT0gMSAmJiBhLl90b1JvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cykgfHwgKGEuX2Zyb21Db2wgPT0gMSAmJiBhLl90b0NvbCA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykpCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBzdHJpbmcuRm9ybWF0KCInezB9JyF7MX17Mn06ezN9ezR9Iiwgd29ya3NoZWV0TmFtZSwgRXhjZWxBZGRyZXNzLkdldENvbHVtbkxldHRlcihhLl9mcm9tQ29sKSwgYS5fZnJvbVJvdywgRXhjZWxBZGRyZXNzLkdldENvbHVtbkxldHRlcihhLl90b0NvbCksIGEuX3RvUm93KTsKLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M9R2V0RnVsbEFkZHJlc3Mod29ya3NoZWV0TmFtZSwgYWRkcmVzcywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICByZXR1cm4gYWRkcmVzczsKLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgICNyZWdpb24gSXNWYWxpZENlbGxBZGRyZXNzCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBJc1ZhbGlkQWRkcmVzcyhzdHJpbmcgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MuVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgIHN0cmluZyByMSA9ICIiLCBjMSA9ICIiLCByMiA9ICIiLCBjMiA9ICIiOwotICAgICAgICAgICAgYm9vbCBpc1NlY29uZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRyZXNzLkxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzW2ldID49ICdBJyAmJiBhZGRyZXNzW2ldIDw9ICdaJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1NlY29uZCA9PSBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIxICE9ICIiKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjMSArPSBhZGRyZXNzW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMxLkxlbmd0aCA+IDMpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyMiAhPSAiIikgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYzIgKz0gYWRkcmVzc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjMi5MZW5ndGggPiAzKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYWRkcmVzc1tpXSA+PSAnMCcgJiYgYWRkcmVzc1tpXSA8PSAnOScpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTZWNvbmQgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIxICs9IGFkZHJlc3NbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocjEuTGVuZ3RoID4gNykgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcjIgKz0gYWRkcmVzc1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyMi5MZW5ndGggPiA3KSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYWRkcmVzc1tpXSA9PSAnOicpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpc1NlY29uZD10cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChhZGRyZXNzW2ldID09ICckJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID09IGFkZHJlc3MuTGVuZ3RoIC0gMSB8fCBhZGRyZXNzW2kgKyAxXSA9PSAnOicpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocjEhPSIiICYmIGMxIT0iIiAmJiByMiA9PSAiIiAmJiBjMiA9PSAiIikgICAvL1NpbmdsZSBDZWxsCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChHZXRDb2x1bW4oYzEpPD1FeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyAmJiBpbnQuUGFyc2UocjEpPD1FeGNlbFBhY2thZ2UuTWF4Um93cyk7ICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChyMSAhPSAiIiAmJiByMiAhPSAiIiAmJiBjMSAhPSAiIiAmJiBjMiAhPSAiIikgLy9SYW5nZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBpUjIgPSBpbnQuUGFyc2UocjIpOwotICAgICAgICAgICAgICAgIHZhciBpQzIgPSBHZXRDb2x1bW4oYzIpOwotCi0gICAgICAgICAgICAgICAgcmV0dXJuIEdldENvbHVtbihjMSkgPD0gaUMyICYmIGludC5QYXJzZShyMSkgPD0gaVIyICYmCi0gICAgICAgICAgICAgICAgICAgIGlDMiA8PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyAmJiBpUjIgPD0gRXhjZWxQYWNrYWdlLk1heFJvd3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChyMSA9PSAiIiAmJiByMiA9PSAiIiAmJiBjMSAhPSAiIiAmJiBjMiAhPSAiIikgLy9GdWxsIENvbHVtbgotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB2YXIgYzJuPUdldENvbHVtbihjMik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChHZXRDb2x1bW4oYzEpIDw9IGMybiAmJiBjMm4gPD0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAocjEgIT0gIiIgJiYgcjIgIT0gIiIgJiYgYzEgPT0gIiIgJiYgYzIgPT0gIiIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGlSMiA9IGludC5QYXJzZShyMik7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gaW50LlBhcnNlKHIxKSA8PSBpUjIgJiYgaVIyIDw9IEV4Y2VsUGFja2FnZS5NYXhSb3dzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDaGVja3MgdGhhdCBhIGNlbGwgYWRkcmVzcyAoZS5nLiBBNSkgaXMgdmFsaWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VsbEFkZHJlc3MiPlRoZSBhbHBoYW51bWVyaWMgY2VsbCBhZGRyZXNzPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRydWUgaWYgdGhlIGNlbGwgYWRkcmVzcyBpcyB2YWxpZDwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sIElzVmFsaWRDZWxsQWRkcmVzcyhzdHJpbmcgY2VsbEFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgcm93LCBjb2w7Ci0gICAgICAgICAgICAgICAgaWYgKEdldFJvd0NvbEZyb21BZGRyZXNzKGNlbGxBZGRyZXNzLCBvdXQgcm93LCBvdXQgY29sKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyb3cgPiAwICYmIGNvbCA+IDAgJiYgcm93IDw9IEV4Y2VsUGFja2FnZS5NYXhSb3dzICYmIGNvbCA8PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIHsgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgICNyZWdpb24gVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVXBkYXRlcyB0aGUgRXhjZWwgZm9ybXVsYSBzbyB0aGF0IGFsbCB0aGUgY2VsbEFkZHJlc3NlcyBhcmUgaW5jcmVtZW50ZWQgYnkgdGhlIHJvdyBhbmQgY29sdW1uIGluY3JlbWVudHMKLSAgICAgICAgLy8vIGlmIHRoZXkgZmFsbCBhZnRlciB0aGUgYWZ0ZXJSb3cgYW5kIGFmdGVyQ29sdW1uLgotICAgICAgICAvLy8gU3VwcG9ydHMgaW5zZXJ0aW5nIHJvd3MgYW5kIGNvbHVtbnMgaW50byBleGlzdGluZyB0ZW1wbGF0ZXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRm9ybXVsYSI+VGhlIEV4Y2VsIGZvcm11bGE8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd0luY3JlbWVudCI+VGhlIGFtb3VudCB0byBpbmNyZW1lbnQgdGhlIGNlbGwgcmVmZXJlbmNlIGJ5PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2xJbmNyZW1lbnQiPlRoZSBhbW91bnQgdG8gaW5jcmVtZW50IHRoZSBjZWxsIHJlZmVyZW5jZSBieTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWZ0ZXJSb3ciPk9ubHkgY2hhbmdlIHJvd3MgYWZ0ZXIgdGhpcyByb3c8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFmdGVyQ29sdW1uIj5Pbmx5IGNoYW5nZSBjb2x1bW5zIGFmdGVyIHRoaXMgY29sdW1uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBVcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhzdHJpbmcgRm9ybXVsYSwgaW50IHJvd0luY3JlbWVudCwgaW50IGNvbEluY3JlbWVudCwgaW50IGFmdGVyUm93LCBpbnQgYWZ0ZXJDb2x1bW4sIGJvb2wgc2V0Rml4ZWQ9ZmFsc2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vcmV0dXJuIFRyYW5zbGF0ZShGb3JtdWxhLCBBZGRUb1Jvd0NvbHVtblRyYW5zbGF0b3IsIGFmdGVyUm93LCBhZnRlckNvbHVtbiwgcm93SW5jcmVtZW50LCBjb2xJbmNyZW1lbnQpOwotICAgICAgICAgICAgdmFyIGQ9bmV3IERpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+KCk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2N0ID0gbmV3IFNvdXJjZUNvZGVUb2tlbml6ZXIoRnVuY3Rpb25OYW1lUHJvdmlkZXIuRW1wdHksIE5hbWVWYWx1ZVByb3ZpZGVyLkVtcHR5KTsKLSAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gc2N0LlRva2VuaXplKEZvcm11bGEpOwotICAgICAgICAgICAgICAgIFN0cmluZyBmID0gIiI7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gdG9rZW5zKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuVG9rZW5UeXBlID09IFRva2VuVHlwZS5FeGNlbEFkZHJlc3MpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UodC5WYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghU3RyaW5nLklzTnVsbE9yRW1wdHkoYS5fd3MpKSAgLy8gQnVnIDE1MzM5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBmcm9tIGEgZGlmZmVyZW50IHdvcmtzaGVldCwgdGh1cyBubyB1cGRhdGUgaXMgcmVxdWlyZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmICs9IGEuQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvd0luY3JlbWVudCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGEuQWRkUm93KGFmdGVyUm93LCByb3dJbmNyZW1lbnQsIHNldEZpeGVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJvd0luY3JlbWVudCA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGEuRGVsZXRlUm93KGFmdGVyUm93LCAtcm93SW5jcmVtZW50LCBzZXRGaXhlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sSW5jcmVtZW50ID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gYS5BZGRDb2x1bW4oYWZ0ZXJDb2x1bW4sIGNvbEluY3JlbWVudCwgc2V0Rml4ZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sSW5jcmVtZW50IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhID0gYS5EZWxldGVDb2x1bW4oYWZ0ZXJDb2x1bW4sIC1jb2xJbmNyZW1lbnQsIHNldEZpeGVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhID09IG51bGwgfHwgIWEuSXNWYWxpZFJvd0NvbCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgKz0gIiNSRUYhIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmICs9IGEuQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmICs9IHQuVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAvL0ludmFsaWQgZm9ybXVsYSwgc2tpcCB1cGRhdGVpbmcgYWRkcmVzc2VzCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZvcm11bGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgI2VuZHJlZ2lvbgorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUcmFuc2xhdGVzIGJldHdlZWluIFIxQzEgb3IgYWJzb2x1dGUgYWRkcmVzc2VzIDogVmVyc2lvbiAxCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBhZGRyZXNzcy9mdW5jdGlvbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzc1RyYW5zbGF0b3IiPlRoZSB0cmFuc2xhdGluZyBmdW5jdGlvbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3dJbmNyIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbEluY3IiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHByaXZhdGUgc3RhdGljIHN0cmluZyBUcmFuc2xhdGUoCisgICAgICBzdHJpbmcgdmFsdWUsCisgICAgICBBZGRyZXNzVHJhbnNsYXRvciBhZGRyZXNzVHJhbnNsYXRvciwKKyAgICAgIGludCByb3csCisgICAgICBpbnQgY29sLAorICAgICAgaW50IHJvd0luY3IsCisgICAgICBpbnQgY29sSW5jcikgeworICAgIGlmICh2YWx1ZSA9PSAiIikgeworICAgICAgcmV0dXJuICIiOwogICAgIH0KKyAgICBib29sIGlzVGV4dCA9IGZhbHNlOworICAgIHN0cmluZyByZXQgPSAiIjsKKyAgICBzdHJpbmcgcGFydCA9ICIiOworICAgIGNoYXIgcHJldlRxID0gKGNoYXIpMDsKKyAgICBmb3IgKGludCBwb3MgPSAwOyBwb3MgPCB2YWx1ZS5MZW5ndGg7IHBvcysrKSB7CisgICAgICBjaGFyIGMgPSB2YWx1ZVtwb3NdOworICAgICAgaWYgKGMgPT0gJyInIHx8IGMgPT0gJ1wnJykgeworICAgICAgICBpZiAoaXNUZXh0ICYmIHByZXZUcSAhPSBjKSB7CisgICAgICAgICAgcmV0ICs9IGM7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNUZXh0ID09IGZhbHNlICYmIHBhcnQgIT0gIiIgJiYgcHJldlRxID09IGMpIHsKKyAgICAgICAgICByZXQgKz0gYWRkcmVzc1RyYW5zbGF0b3IocGFydCwgcm93LCBjb2wsIHJvd0luY3IsIGNvbEluY3IpOworICAgICAgICAgIHBhcnQgPSAiIjsKKyAgICAgICAgICBwcmV2VHEgPSAoY2hhcikwOworICAgICAgICB9CisgICAgICAgIHByZXZUcSA9IGM7CisgICAgICAgIGlzVGV4dCA9ICFpc1RleHQ7CisgICAgICAgIHJldCArPSBjOworICAgICAgfSBlbHNlIGlmIChpc1RleHQpIHsKKyAgICAgICAgcmV0ICs9IGM7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoKGMgPT0gJy0nCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJysnCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJyonCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJy8nCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJz0nCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJ14nCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJywnCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJzonCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJzwnCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJz4nCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJygnCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJyknCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJyEnCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJyAnCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJyYnCisgICAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJyUnKQorICAgICAgICAgICAgJiYgKHBvcyA9PSAwCisgICAgICAgICAgICAgICAgICAgIHx8IHZhbHVlW3BvcyAtIDFdCisgICAgICAgICAgICAgICAgICAgICAgICAhPSAnWycpKSAvL0xhc3QgcGFydCB0byBhbGxvdyBmb3IgUjFDMSBzdHlsZSBbLXhdCisgICAgICAgIHsKKyAgICAgICAgICByZXQgKz0gYWRkcmVzc1RyYW5zbGF0b3IocGFydCwgcm93LCBjb2wsIHJvd0luY3IsIGNvbEluY3IpICsgYzsKKyAgICAgICAgICBwYXJ0ID0gIiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcGFydCArPSBjOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChwYXJ0ICE9ICIiKSB7CisgICAgICByZXQgKz0gYWRkcmVzc1RyYW5zbGF0b3IocGFydCwgcm93LCBjb2wsIHJvd0luY3IsIGNvbEluY3IpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIFRyYW5zbGF0ZV9WMSgKKyAgICAgIHN0cmluZyB2YWx1ZSwKKyAgICAgIEFkZHJlc3NUcmFuc2xhdG9yIGFkZHJlc3NUcmFuc2xhdG9yLAorICAgICAgaW50IHJvdywKKyAgICAgIGludCBjb2wsCisgICAgICBpbnQgcm93SW5jciwKKyAgICAgIGludCBjb2xJbmNyKSB7CisgICAgaWYgKHZhbHVlID09ICIiKSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIGJvb2wgaXNUZXh0ID0gZmFsc2U7CisgICAgc3RyaW5nIHJldCA9ICIiOworICAgIHN0cmluZyBwYXJ0ID0gIiI7CisgICAgY2hhciBwcmV2VHEgPSAoY2hhcikwOworICAgIHZhbHVlID0gdmFsdWUuUmVwbGFjZSgiXG4iLCAiIik7IC8vIEVsaW1pbmF0ZSBuZXcgbGluZSBjaGFyYWN0ZXJzIGluIHRoZSBmb3JtdWxhCisgICAgZm9yIChpbnQgcG9zID0gMDsgcG9zIDwgdmFsdWUuTGVuZ3RoOyBwb3MrKykgeworICAgICAgY2hhciBjID0gdmFsdWVbcG9zXTsKKyAgICAgIGlmIChjID09ICciJyB8fCBjID09ICdcJycpIHsKKyAgICAgICAgaWYgKGlzVGV4dCAmJiBwcmV2VHEgIT0gYykgeworICAgICAgICAgIHJldCArPSBjOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzVGV4dCA9PSBmYWxzZSAmJiBwYXJ0ICE9ICIiICYmIHByZXZUcSA9PSBjKSB7CisgICAgICAgICAgcmV0ICs9IGFkZHJlc3NUcmFuc2xhdG9yKHBhcnQsIHJvdywgY29sLCByb3dJbmNyLCBjb2xJbmNyKTsKKyAgICAgICAgICBwYXJ0ID0gIiI7CisgICAgICAgICAgcHJldlRxID0gKGNoYXIpMDsKKyAgICAgICAgfQorICAgICAgICBwcmV2VHEgPSBjOworICAgICAgICBpc1RleHQgPSAhaXNUZXh0OworICAgICAgICByZXQgKz0gYzsKKyAgICAgIH0gZWxzZSBpZiAoaXNUZXh0KSB7CisgICAgICAgIHJldCArPSBjOworICAgICAgfSBlbHNlIGlmIChjCisgICAgICAgICAgPT0gJzonKSAvLyBLZWVwIFJhbmdlIGV4cHJlc3Npb25zIHRvZ2V0aGVyCisgICAgICB7CisgICAgICAgIHBhcnQgKz0gYzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoYyA9PSAnLScKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnKycKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnKicKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnLycKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnPScKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnXicKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnLCcKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnPCcKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnPicKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnKCcKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnKScKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnIScKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnICcKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnJicKKyAgICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnJScpCisgICAgICAgICAgICAmJiAocG9zID09IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgdmFsdWVbcG9zIC0gMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICE9ICdbJykpIC8vTGFzdCBwYXJ0IHRvIGFsbG93IGZvciBSMUMxIHN0eWxlIFsteF0KKyAgICAgICAgeworICAgICAgICAgIHJldCArPSBhZGRyZXNzVHJhbnNsYXRvcihwYXJ0LCByb3csIGNvbCwgcm93SW5jciwgY29sSW5jcikgKyBjOworICAgICAgICAgIHBhcnQgPSAiIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwYXJ0ICs9IGM7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhcnQgIT0gIiIpIHsKKyAgICAgIHJldCArPSBhZGRyZXNzVHJhbnNsYXRvcihwYXJ0LCByb3csIGNvbCwgcm93SW5jciwgY29sSW5jcik7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUcmFuc2xhdGUgdG8gUjFDMQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InBhcnQiPnRoZSB2YWx1ZSB0byBiZSB0cmFuc2xhdGVkPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InJvd0luY3IiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sSW5jciI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIFRvUjFDMShzdHJpbmcgcGFydCwgaW50IHJvdywgaW50IGNvbCwgaW50IHJvd0luY3IsIGludCBjb2xJbmNyKSB7CisgICAgaW50IGFkZHJSb3csCisgICAgICAgIGFkZHJDb2w7CisgICAgc3RyaW5nIHJldCA9ICJSIjsKKyAgICBpZiAoR2V0Um93Q29sKHBhcnQsIG91dCBhZGRyUm93LCBvdXQgYWRkckNvbCwgZmFsc2UpKSB7CisgICAgICBpZiAoYWRkclJvdyA9PSAwIHx8IGFkZHJDb2wgPT0gMCkgeworICAgICAgICByZXR1cm4gcGFydDsKKyAgICAgIH0KKyAgICAgIGlmIChwYXJ0LkluZGV4T2YoJyQnLCAxKSA+IDApIHsKKyAgICAgICAgcmV0ICs9IGFkZHJSb3cuVG9TdHJpbmcoKTsKKyAgICAgIH0gZWxzZSBpZiAoYWRkclJvdyAtIHJvdyAhPSAwKSB7CisgICAgICAgIHJldCArPSBzdHJpbmcuRm9ybWF0KCJbezB9XSIsIGFkZHJSb3cgLSByb3cpOworICAgICAgfQorCisgICAgICBpZiAocGFydC5TdGFydHNXaXRoKCIkIikpIHsKKyAgICAgICAgcmV0dXJuIHJldCArICJDIiArIGFkZHJDb2w7CisgICAgICB9CisgICAgICBpZiAoYWRkckNvbCAtIGNvbCAhPSAwKSB7CisgICAgICAgIHJldHVybiByZXQgKyAiQyIgKyBzdHJpbmcuRm9ybWF0KCJbezB9XSIsIGFkZHJDb2wgLSBjb2wpOworICAgICAgfQorICAgICAgcmV0dXJuIHJldCArICJDIjsKKyAgICB9CisgICAgcmV0dXJuIHBhcnQ7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgVG9SMUMxX1YxKHN0cmluZyBwYXJ0LCBpbnQgcm93LCBpbnQgY29sLCBpbnQgcm93SW5jciwgaW50IGNvbEluY3IpIHsKKyAgICBpbnQgYWRkclJvdywKKyAgICAgICAgYWRkckNvbDsKKworICAgIC8vIEhhbmRsZSByYW5nZSBleHByZXNzaW9ucworICAgIGlmICgocGFydC5MZW5ndGggPiAxKSAmJiAocGFydC5JbmRleE9mKCc6JywgMSkgPiAwKSkgeworICAgICAgcmV0dXJuIFJhbmdlVG9SMUMxX1YxKHBhcnQsIHJvdywgY29sLCByb3dJbmNyLCBjb2xJbmNyKTsKKyAgICB9CisKKyAgICBzdHJpbmcgcmV0ID0gIlIiOworICAgIGlmIChHZXRSb3dDb2wocGFydCwgb3V0IGFkZHJSb3csIG91dCBhZGRyQ29sLCBmYWxzZSkpIHsKKyAgICAgIGlmIChhZGRyUm93ID09IDAgfHwgYWRkckNvbCA9PSAwKSB7CisgICAgICAgIHJldHVybiBwYXJ0OworICAgICAgfQorICAgICAgaWYgKHBhcnQuSW5kZXhPZignJCcsIDEpID4gMCkgeworICAgICAgICByZXQgKz0gYWRkclJvdy5Ub1N0cmluZygpOworICAgICAgfSBlbHNlIGlmIChhZGRyUm93IC0gcm93ICE9IDApIHsKKyAgICAgICAgcmV0ICs9IHN0cmluZy5Gb3JtYXQoIlt7MH1dIiwgYWRkclJvdyAtIHJvdyk7CisgICAgICB9CisKKyAgICAgIGlmIChwYXJ0LlN0YXJ0c1dpdGgoIiQiKSkgeworICAgICAgICByZXR1cm4gcmV0ICsgIkMiICsgYWRkckNvbDsKKyAgICAgIH0KKyAgICAgIGlmIChhZGRyQ29sIC0gY29sICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHJldCArICJDIiArIHN0cmluZy5Gb3JtYXQoIlt7MH1dIiwgYWRkckNvbCAtIGNvbCk7CisgICAgICB9CisgICAgICByZXR1cm4gcmV0ICsgIkMiOworICAgIH0KKyAgICByZXR1cm4gcGFydDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHN0cmluZyBSYW5nZVRvUjFDMV9WMShzdHJpbmcgcGFydCwgaW50IHJvdywgaW50IGNvbCwgaW50IHJvd0luY3IsIGludCBjb2xJbmNyKSB7CisgICAgLy8gU3BsaXQgcmFuZ2UgZXhwcmVzc2lvbgorICAgIHN0cmluZ1tdIGNlbGxWYWx1ZXMgPSBwYXJ0LlNwbGl0KG5ld1tdIHsgJzonIH0sIFN0cmluZ1NwbGl0T3B0aW9ucy5SZW1vdmVFbXB0eUVudHJpZXMpOworCisgICAgLy8gQ29udmVydCByYW5nZSBleHByZXNzaW9ucworICAgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgICByZXN1bHQgKz0gUmFuZ2VDZWxsVG9SMUMxX1YxKGNlbGxWYWx1ZXNbMF0sIHJvdywgY29sLCByb3dJbmNyLCBjb2xJbmNyKTsKKyAgICByZXN1bHQgKz0gIjoiOworICAgIHJlc3VsdCArPQorICAgICAgICAoY2VsbFZhbHVlcy5MZW5ndGggPiAxKQorICAgICAgICAgICAgPyBSYW5nZUNlbGxUb1IxQzFfVjEoY2VsbFZhbHVlc1sxXSwgcm93LCBjb2wsIHJvd0luY3IsIGNvbEluY3IpCisgICAgICAgICAgICA6ICIiOworCisgICAgLy8gUmV0dXJuIGNvbnZlcnRlZCByYW5nZSBleHByZXNzaW9uCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHN0cmluZyBSYW5nZUNlbGxUb1IxQzFfVjEoCisgICAgICBzdHJpbmcgcGFydCwKKyAgICAgIGludCByb3csCisgICAgICBpbnQgY29sLAorICAgICAgaW50IHJvd0luY3IsCisgICAgICBpbnQgY29sSW5jcikgeworICAgIGludCBhZGRyUm93LAorICAgICAgICBhZGRyQ29sOworICAgIGJvb2wgZml4ZWRSb3csCisgICAgICAgIGZpeGVkQ29sOworCisgICAgc3RyaW5nIHJlc3VsdCA9ICIiOworICAgIGlmIChHZXRSb3dDb2xfVjEocGFydCwgb3V0IGFkZHJSb3csIG91dCBhZGRyQ29sLCBmYWxzZSwgb3V0IGZpeGVkUm93LCBvdXQgZml4ZWRDb2wpKSB7CisgICAgICBpZiAoYWRkclJvdyA+IDApIHsKKyAgICAgICAgcmVzdWx0ICs9ICJSIjsKKyAgICAgICAgaWYgKGZpeGVkUm93KSB7CisgICAgICAgICAgLy8gQWJzb2x1dGUgcm93CisgICAgICAgICAgcmVzdWx0ICs9IGFkZHJSb3cuVG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChhZGRyUm93IC0gcm93ICE9IDApIHsKKyAgICAgICAgICAvLyBSZWxhdGl2ZSByb3cKKyAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nLkZvcm1hdCgiW3swfV0iLCBhZGRyUm93IC0gcm93KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoYWRkckNvbCA+IDApIHsKKyAgICAgICAgcmVzdWx0ICs9ICJDIjsKKyAgICAgICAgaWYgKGZpeGVkQ29sKSB7CisgICAgICAgICAgLy8gQWJzb2x1dGUgY29sdW1uCisgICAgICAgICAgcmVzdWx0ICs9IGFkZHJDb2w7CisgICAgICAgIH0gZWxzZSBpZiAoYWRkckNvbCAtIGNvbCAhPSAwKSB7CisgICAgICAgICAgLy8gUmVsYXRpdmUgY29sdW1uCisgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZy5Gb3JtYXQoIlt7MH1dIiwgYWRkckNvbCAtIGNvbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiBwYXJ0OworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHJhbnNsYXRlcyB0byBhYnNvbHV0ZSBhZGRyZXNzCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icGFydCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InJvd0luY3IiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sSW5jciI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgLy8vCisgIHByaXZhdGUgc3RhdGljIHN0cmluZyBUb0FicyhzdHJpbmcgcGFydCwgaW50IHJvdywgaW50IGNvbCwgaW50IHJvd0luY3IsIGludCBjb2xJbmNyKSB7CisgICAgc3RyaW5nIGNoZWNrID0gcGFydC5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworCisgICAgaW50IHJTdGFydCA9IGNoZWNrLkluZGV4T2YoIlIiKTsKKyAgICBpZiAoclN0YXJ0ICE9IDApIHsKKyAgICAgIHJldHVybiBwYXJ0OworICAgIH0KKyAgICBpZiAocGFydC5MZW5ndGgKKyAgICAgICAgPT0gMSkgLy9SCisgICAgeworICAgICAgcmV0dXJuIEdldEFkZHJlc3Mocm93LCBjb2wpOworICAgIH0KKworICAgIGludCBjU3RhcnQgPSBjaGVjay5JbmRleE9mKCJDIik7CisgICAgYm9vbCBhYnNvbHV0ZVJvdywKKyAgICAgICAgYWJzb2x1dGVDb2w7CisgICAgaWYgKGNTdGFydCA9PSAtMSkgeworICAgICAgaW50IHJOdW0gPSBHZXRSYyhwYXJ0LCByb3csIG91dCBhYnNvbHV0ZVJvdyk7CisgICAgICBpZiAock51bSA+IGludC5NaW5WYWx1ZSkgeworICAgICAgICByZXR1cm4gR2V0QWRkcmVzcyhyTnVtLCBhYnNvbHV0ZVJvdywgY29sLCBmYWxzZSk7CisgICAgICB9CisgICAgICByZXR1cm4gcGFydDsKKyAgICB9IGVsc2UgeworICAgICAgaW50IHJOdW0gPSBHZXRSYyhwYXJ0LlN1YnN0cmluZygxLCBjU3RhcnQgLSAxKSwgcm93LCBvdXQgYWJzb2x1dGVSb3cpOworICAgICAgaW50IGNOdW0gPSBHZXRSYyhwYXJ0LlN1YnN0cmluZyhjU3RhcnQgKyAxLCBwYXJ0Lkxlbmd0aCAtIGNTdGFydCAtIDEpLCBjb2wsIG91dCBhYnNvbHV0ZUNvbCk7CisgICAgICBpZiAock51bSA+IGludC5NaW5WYWx1ZSAmJiBjTnVtID4gaW50Lk1pblZhbHVlKSB7CisgICAgICAgIHJldHVybiBHZXRBZGRyZXNzKHJOdW0sIGFic29sdXRlUm93LCBjTnVtLCBhYnNvbHV0ZUNvbCk7CisgICAgICB9CisgICAgICByZXR1cm4gcGFydDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgVG9BYnNfVjEoc3RyaW5nIHBhcnQsIGludCByb3csIGludCBjb2wsIGludCByb3dJbmNyLCBpbnQgY29sSW5jcikgeworICAgIGJvb2wgYWJzb2x1dGVDb2wgPSBmYWxzZTsKKyAgICBib29sIGFic29sdXRlUm93ID0gZmFsc2U7CisgICAgaW50IGNvbE51bSA9IC0xOworICAgIGludCByb3dOdW0gPSAtMTsKKyAgICBpbnQgbnVtOworICAgIGludCBudW1MZW5ndGg7CisgICAgaW50IHBvcyA9IDA7CisKKyAgICAvLyBIYW5kbGUgcmFuZ2UgZXhwcmVzc2lvbnMKKyAgICBpZiAoKHBhcnQuTGVuZ3RoID4gMSkgJiYgKHBhcnQuSW5kZXhPZignOicsIDEpID4gMCkpIHsKKyAgICAgIHJldHVybiBSYW5nZVRvQTFfVjEocGFydCwgcm93LCBjb2wsIHJvd0luY3IsIGNvbEluY3IpOworICAgIH0KKworICAgIC8vIEVuc3VyZSBwYXJ0IGlzIHByZXNlbnQKKyAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZShwYXJ0KSkgeworICAgICAgcmV0dXJuICIiOworICAgIH0KKworICAgIC8vIENvbnZlcnQgdG8gdXBwZXIgY2FzZQorICAgIHN0cmluZyBjaGVjayA9IHBhcnQuVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKworICAgIC8vIFBhcnNlICJSIiwgaWYgYW55CisgICAgaWYgKHBvcyA8IHBhcnQuTGVuZ3RoICYmIGNoZWNrW3Bvc10gPT0gJ1InKSB7CisgICAgICBwb3MgKz0gMTsKKworICAgICAgaWYgKHBvcyA+PSBwYXJ0Lkxlbmd0aCkgeworICAgICAgICAvLyBPbmx5ICJSIiBwcmVzZW50CisgICAgICAgIGFic29sdXRlUm93ID0gZmFsc2U7CisgICAgICAgIHJvd051bSA9IHJvdzsKKyAgICAgIH0gZWxzZSBpZiAocG9zIDwgcGFydC5MZW5ndGggJiYgY2hlY2tbcG9zXSA9PSAnQycpIHsKKyAgICAgICAgLy8gIlIiIGZvbGxvd2VkIGJ5ICJDIgorICAgICAgICBhYnNvbHV0ZVJvdyA9IGZhbHNlOworICAgICAgICByb3dOdW0gPSByb3c7CisgICAgICB9IGVsc2UgaWYgKHBvcyA8IHBhcnQuTGVuZ3RoICYmIGNoZWNrW3Bvc10gPT0gJ1snKSB7CisgICAgICAgIC8vICJSIiBmb2xsb3dlZCBieSByZWxhdGl2ZSByb3cgbnVtYmVyCisgICAgICAgIHBvcyArPSAxOworICAgICAgICBudW0gPSBHZXROdW1iZXJfVjEoY2hlY2suU3Vic3RyaW5nKHBvcywgcGFydC5MZW5ndGggLSBwb3MpLCBvdXQgbnVtTGVuZ3RoKTsKKyAgICAgICAgaWYgKG51bSA9PSBJbnQzMi5NaW5WYWx1ZSkgeworICAgICAgICAgIHJldHVybiBwYXJ0OworICAgICAgICB9CisgICAgICAgIHBvcyArPSBudW1MZW5ndGg7CisKKyAgICAgICAgaWYgKHBvcyA8IHBhcnQuTGVuZ3RoICYmIGNoZWNrW3Bvc10gPT0gJ10nKSB7CisgICAgICAgICAgcG9zICs9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIHBhcnQ7CisgICAgICAgIH0KKworICAgICAgICBhYnNvbHV0ZVJvdyA9IGZhbHNlOworICAgICAgICByb3dOdW0gPSByb3cgKyBudW07CisgICAgICB9IGVsc2UgaWYgKHBvcyA8IHBhcnQuTGVuZ3RoKSB7CisgICAgICAgIC8vICJSIiBmb2xsb3dlZCBieSBhYnNvbHV0ZSByb3cgbnVtYmVyCisgICAgICAgIG51bSA9IEdldE51bWJlcl9WMShjaGVjay5TdWJzdHJpbmcocG9zLCBwYXJ0Lkxlbmd0aCAtIHBvcyksIG91dCBudW1MZW5ndGgpOworICAgICAgICBpZiAocm93TnVtID09IEludDMyLk1pblZhbHVlKSB7CisgICAgICAgICAgcmV0dXJuIHBhcnQ7CisgICAgICAgIH0KKyAgICAgICAgcG9zICs9IG51bUxlbmd0aDsKKworICAgICAgICBhYnNvbHV0ZVJvdyA9IHRydWU7CisgICAgICAgIHJvd051bSA9IG51bTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQYXJzZSAiQyIsIGlmIGFueQorICAgIGlmIChwb3MgPCBwYXJ0Lkxlbmd0aCAmJiBjaGVja1twb3NdID09ICdDJykgeworICAgICAgcG9zICs9IDE7CisKKyAgICAgIGlmIChwb3MgPj0gcGFydC5MZW5ndGgpIHsKKyAgICAgICAgLy8gT25seSAiQyIgcHJlc2VudAorICAgICAgICBhYnNvbHV0ZUNvbCA9IGZhbHNlOworICAgICAgICBjb2xOdW0gPSBjb2w7CisgICAgICB9IGVsc2UgaWYgKHBvcyA8IHBhcnQuTGVuZ3RoICYmIGNoZWNrW3Bvc10gPT0gJ1snKSB7CisgICAgICAgIC8vICJDIiBmb2xsb3dlZCBieSByZWxhdGl2ZSBjb2x1bW4gbnVtYmVyCisgICAgICAgIHBvcyArPSAxOworICAgICAgICBudW0gPSBHZXROdW1iZXJfVjEoY2hlY2suU3Vic3RyaW5nKHBvcywgcGFydC5MZW5ndGggLSBwb3MpLCBvdXQgbnVtTGVuZ3RoKTsKKyAgICAgICAgaWYgKG51bSA9PSBJbnQzMi5NaW5WYWx1ZSkgeworICAgICAgICAgIHJldHVybiBwYXJ0OworICAgICAgICB9CisgICAgICAgIHBvcyArPSBudW1MZW5ndGg7CisKKyAgICAgICAgaWYgKHBvcyA8IHBhcnQuTGVuZ3RoICYmIGNoZWNrW3Bvc10gPT0gJ10nKSB7CisgICAgICAgICAgcG9zICs9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIHBhcnQ7CisgICAgICAgIH0KKworICAgICAgICBhYnNvbHV0ZUNvbCA9IGZhbHNlOworICAgICAgICBjb2xOdW0gPSBjb2wgKyBudW07CisgICAgICB9IGVsc2UgaWYgKHBvcyA8IHBhcnQuTGVuZ3RoKSB7CisgICAgICAgIC8vICJDIiBmb2xsb3dlZCBieSBhYnNvbHV0ZSBjb2x1bW4gbnVtYmVyCisgICAgICAgIG51bSA9IEdldE51bWJlcl9WMShjaGVjay5TdWJzdHJpbmcocG9zLCBwYXJ0Lkxlbmd0aCAtIHBvcyksIG91dCBudW1MZW5ndGgpOworICAgICAgICBpZiAobnVtID09IEludDMyLk1pblZhbHVlKSB7CisgICAgICAgICAgcmV0dXJuIHBhcnQ7CisgICAgICAgIH0KKyAgICAgICAgcG9zICs9IG51bUxlbmd0aDsKKworICAgICAgICBhYnNvbHV0ZUNvbCA9IHRydWU7CisgICAgICAgIGNvbE51bSA9IG51bTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFbnN1cmUgbm90aGluZyByZW1haW5zIHVucGFyc2VkCisgICAgaWYgKHBvcyA8IHBhcnQuTGVuZ3RoKSB7CisgICAgICByZXR1cm4gcGFydDsKKyAgICB9CisKKyAgICAvLyBFeGl0IGlmIG5laXRoZXIgcm93IG5vciBjb2x1bW4gaXMgcHJlc2VudAorICAgIGlmICgocm93TnVtID09IEludDMyLk1pblZhbHVlKSAmJiAoY29sTnVtID09IEludDMyLk1pblZhbHVlKSkgeworICAgICAgcmV0dXJuIHBhcnQ7CisgICAgfQorCisgICAgLy8gQXBwZW5kIGNvbHVtbgorICAgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgICBpZiAoY29sTnVtID49IDApIHsKKyAgICAgIGlmIChhYnNvbHV0ZUNvbCkgeworICAgICAgICByZXN1bHQgKz0gIiQiOworICAgICAgfQorICAgICAgcmVzdWx0ICs9IEdldENvbHVtbkxldHRlcihjb2xOdW0pOworICAgIH0KKworICAgIC8vIEFwcGVuZCByb3cKKyAgICBpZiAocm93TnVtID49IDApIHsKKyAgICAgIGlmIChhYnNvbHV0ZVJvdykgeworICAgICAgICByZXN1bHQgKz0gIiQiOworICAgICAgfQorICAgICAgcmVzdWx0ICs9IHJvd051bS5Ub1N0cmluZygpOworICAgIH0KKworICAgIC8vIFJldHVybiByZXN1bHQKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IEdldE51bWJlcl9WMShzdHJpbmcgdmFsdWUsIG91dCBpbnQgbGVuZ3RoKSB7CisgICAgLy8gR2V0IG51bWJlciBsZW5ndGgKKyAgICBsZW5ndGggPSAwOworCisgICAgLy8gRW5zdXJlIHZhbHVlIGlzIHByZXNlbnQKKyAgICBpZiAoc3RyaW5nLklzTnVsbE9yV2hpdGVTcGFjZSh2YWx1ZSkpIHsKKyAgICAgIHJldHVybiBJbnQzMi5NaW5WYWx1ZTsKKyAgICB9CisKKyAgICAvLyBDaGVjayBmb3Igc2lnbgorICAgIGlmICgobGVuZ3RoIDwgdmFsdWUuTGVuZ3RoKSAmJiAoKHZhbHVlW2xlbmd0aF0gPT0gJy0nKSB8fCAodmFsdWVbbGVuZ3RoXSA9PSAnKycpKSkgeworICAgICAgbGVuZ3RoICs9IDE7CisgICAgfQorCisgICAgLy8gR2V0IG51bWJlciBsZW5ndGgKKyAgICB3aGlsZSAobGVuZ3RoIDwgdmFsdWUuTGVuZ3RoICYmIHZhbHVlW2xlbmd0aF0gPj0gJzAnICYmIHZhbHVlW2xlbmd0aF0gPD0gJzknKSB7CisgICAgICBsZW5ndGggKz0gMTsKKyAgICB9CisKKyAgICAvLyBObyBudW1iZXIgZm91bmQKKyAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgIHJldHVybiBJbnQzMi5NaW5WYWx1ZTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gbnVtYmVyIHZhbHVlCisgICAgaW50IHJlc3VsdDsKKyAgICByZXR1cm4gKGludC5UcnlQYXJzZSh2YWx1ZS5TdWJzdHJpbmcoMCwgbGVuZ3RoKSwgb3V0IHJlc3VsdCkpID8gcmVzdWx0IDogSW50MzIuTWluVmFsdWU7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgUmFuZ2VUb0ExX1YxKHN0cmluZyBwYXJ0LCBpbnQgcm93LCBpbnQgY29sLCBpbnQgcm93SW5jciwgaW50IGNvbEluY3IpIHsKKyAgICAvLyBTcGxpdCByYW5nZSBleHByZXNzaW9uCisgICAgc3RyaW5nW10gY2VsbFZhbHVlcyA9IHBhcnQuU3BsaXQobmV3W10geyAnOicgfSwgU3RyaW5nU3BsaXRPcHRpb25zLlJlbW92ZUVtcHR5RW50cmllcyk7CisKKyAgICAvLyBDb252ZXJ0IHJhbmdlIGV4cHJlc3Npb25zCisgICAgc3RyaW5nIHJlc3VsdCA9ICIiOworICAgIHJlc3VsdCArPSBUb0Fic19WMShjZWxsVmFsdWVzWzBdLCByb3csIGNvbCwgcm93SW5jciwgY29sSW5jcik7CisgICAgcmVzdWx0ICs9ICI6IjsKKyAgICByZXN1bHQgKz0gVG9BYnNfVjEoY2VsbFZhbHVlc1sxXSwgcm93LCBjb2wsIHJvd0luY3IsIGNvbEluY3IpOworCisgICAgLy8gUmV0dXJuIGNvbnZlcnRlZCByYW5nZSBleHByZXNzaW9uCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHN0cmluZyBSYW5nZUNlbGxUb0ExX1YxKHN0cmluZyBwYXJ0LCBpbnQgcm93LCBpbnQgY29sLCBpbnQgcm93SW5jciwgaW50IGNvbEluY3IpIHsKKyAgICBpbnQgYWRkclJvdywKKyAgICAgICAgYWRkckNvbDsKKyAgICBib29sIGZpeGVkUm93LAorICAgICAgICBmaXhlZENvbDsKKworICAgIHN0cmluZyByZXN1bHQgPSAiIjsKKyAgICBpZiAoR2V0Um93Q29sX1YxKHBhcnQsIG91dCBhZGRyUm93LCBvdXQgYWRkckNvbCwgZmFsc2UsIG91dCBmaXhlZFJvdywgb3V0IGZpeGVkQ29sKSkgeworICAgICAgaWYgKGFkZHJSb3cgPiAwKSB7CisgICAgICAgIHJlc3VsdCArPSAiUiI7CisgICAgICAgIGlmIChmaXhlZFJvdykgeworICAgICAgICAgIC8vIEFic29sdXRlIHJvdworICAgICAgICAgIHJlc3VsdCArPSBhZGRyUm93LlRvU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSBpZiAoYWRkclJvdyAtIHJvdyAhPSAwKSB7CisgICAgICAgICAgLy8gUmVsYXRpdmUgcm93CisgICAgICAgICAgcmVzdWx0ICs9IHN0cmluZy5Gb3JtYXQoIlt7MH1dIiwgYWRkclJvdyAtIHJvdyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGFkZHJDb2wgPiAwKSB7CisgICAgICAgIHJlc3VsdCArPSAiQyI7CisgICAgICAgIGlmIChmaXhlZENvbCkgeworICAgICAgICAgIC8vIEFic29sdXRlIGNvbHVtbgorICAgICAgICAgIHJlc3VsdCArPSBhZGRyQ29sOworICAgICAgICB9IGVsc2UgaWYgKGFkZHJDb2wgLSBjb2wgIT0gMCkgeworICAgICAgICAgIC8vIFJlbGF0aXZlIGNvbHVtbgorICAgICAgICAgIHJlc3VsdCArPSBzdHJpbmcuRm9ybWF0KCJbezB9XSIsIGFkZHJDb2wgLSBjb2wpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcGFydDsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgb3Igc3VidHJhY3RzIGEgcm93IG9yIGNvbHVtbiB0byBhbiBhZGRyZXNzCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InJvd0luY3IiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sSW5jciI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEFkZFRvUm93Q29sdW1uVHJhbnNsYXRvcigKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgaW50IHJvdywKKyAgICAgIGludCBjb2wsCisgICAgICBpbnQgcm93SW5jciwKKyAgICAgIGludCBjb2xJbmNyKSB7CisgICAgaW50IGZyb21Sb3csCisgICAgICAgIGZyb21Db2w7CisgICAgaWYgKGFkZHJlc3MgPT0gIiNSRUYhIikgeworICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorICAgIGlmIChHZXRSb3dDb2woYWRkcmVzcywgb3V0IGZyb21Sb3csIG91dCBmcm9tQ29sLCBmYWxzZSkpIHsKKyAgICAgIGlmIChmcm9tUm93ID09IDAgfHwgZnJvbUNvbCA9PSAwKSB7CisgICAgICAgIHJldHVybiBhZGRyZXNzOworICAgICAgfQorICAgICAgaWYgKHJvd0luY3IgIT0gMCAmJiByb3cgIT0gMCAmJiBmcm9tUm93ID49IHJvdyAmJiBhZGRyZXNzLkluZGV4T2YoJyQnLCAxKSA9PSAtMSkgeworICAgICAgICBpZiAoZnJvbVJvdyA8IHJvdyAtIHJvd0luY3IpIHsKKyAgICAgICAgICByZXR1cm4gIiNSRUYhIjsKKyAgICAgICAgfQorCisgICAgICAgIGZyb21Sb3cgPSBmcm9tUm93ICsgcm93SW5jcjsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbEluY3IgIT0gMCAmJiBjb2wgIT0gMCAmJiBmcm9tQ29sID49IGNvbCAmJiBhZGRyZXNzLlN0YXJ0c1dpdGgoIiQiKSA9PSBmYWxzZSkgeworICAgICAgICBpZiAoZnJvbUNvbCA8IGNvbCAtIGNvbEluY3IpIHsKKyAgICAgICAgICByZXR1cm4gIiNSRUYhIjsKKyAgICAgICAgfQorCisgICAgICAgIGZyb21Db2wgPSBmcm9tQ29sICsgY29sSW5jcjsKKyAgICAgIH0KKworICAgICAgYWRkcmVzcyA9IEdldEFkZHJlc3MoZnJvbVJvdywgYWRkcmVzcy5JbmRleE9mKCckJywgMSkgPiAtMSwgZnJvbUNvbCwgYWRkcmVzcy5TdGFydHNXaXRoKCIkIikpOworICAgIH0KKyAgICByZXR1cm4gYWRkcmVzczsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgd2l0aCBicmFja2V0cyBpZiB0aGUgdmFsdWUgaXMgbmVnYXRpdmUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2Ij5UaGUgdmFsdWU8L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0UmNGbXQoaW50IHYpIHsKKyAgICByZXR1cm4gKHYgPCAwCisgICAgICAgICAgICA/IHN0cmluZy5Gb3JtYXQoIlt7MH1dIiwgdikKKyAgICAgICAgICAgIDogdiA+IDAKKyAgICAgICAgICAgICAgICA/IHYuVG9TdHJpbmcoKQorICAgICAgICAgICAgICAgIDogIiIpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0IHRoZSBvZmZzZXQgdmFsdWUgZm9yIFJDIGZvcm1hdAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im9mZnNldFZhbHVlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImZpeGVkQWRkciI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgLy8vCisgIHByaXZhdGUgc3RhdGljIGludCBHZXRSYyhzdHJpbmcgdmFsdWUsIGludCBvZmZzZXRWYWx1ZSwgb3V0IGJvb2wgZml4ZWRBZGRyKSB7CisgICAgaWYgKHZhbHVlID09ICIiKSB7CisgICAgICBmaXhlZEFkZHIgPSBmYWxzZTsKKyAgICAgIHJldHVybiBvZmZzZXRWYWx1ZTsKKyAgICB9CisgICAgaW50IG51bTsKKyAgICBpZiAodmFsdWVbMF0gPT0gJ1snCisgICAgICAgICYmIHZhbHVlW3ZhbHVlLkxlbmd0aCAtIDFdCisgICAgICAgICAgICA9PSAnXScpIC8vT2Zmc2V0PworICAgIHsKKyAgICAgIGZpeGVkQWRkciA9IGZhbHNlOworICAgICAgaWYgKGludC5UcnlQYXJzZSh2YWx1ZS5TdWJzdHJpbmcoMSwgdmFsdWUuTGVuZ3RoIC0gMiksIG91dCBudW0pKSB7CisgICAgICAgIHJldHVybiAob2Zmc2V0VmFsdWUgKyBudW0pOworICAgICAgfQorICAgICAgcmV0dXJuIGludC5NaW5WYWx1ZTsKKyAgICB9CisgICAgLy8gQWJzb2x1dGUgYWRkcmVzcworICAgIGZpeGVkQWRkciA9IHRydWU7CisgICAgaWYgKGludC5UcnlQYXJzZSh2YWx1ZSwgb3V0IG51bSkpIHsKKyAgICAgIHJldHVybiBudW07CisgICAgfQorICAgIHJldHVybiBpbnQuTWluVmFsdWU7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBpbnQgR2V0UkNfVjEoc3RyaW5nIHZhbHVlLCBpbnQgb2Zmc2V0VmFsdWUsIG91dCBib29sIGZpeGVkQWRkcikgeworICAgIGlmICgodmFsdWUgPT0gIiIpIHx8ICh2YWx1ZSA9PSAiUiIpIHx8ICh2YWx1ZSA9PSAiQyIpKSB7CisgICAgICAvLyBSZWxhdGl2ZSBhZGRyZXNzIHdpdGggbm8gb2Zmc2V0CisgICAgICBmaXhlZEFkZHIgPSBmYWxzZTsKKyAgICAgIHJldHVybiBvZmZzZXRWYWx1ZTsKKyAgICB9CisgICAgaW50IG51bTsKKyAgICBpZiAodmFsdWVbMV0gPT0gJ1snCisgICAgICAgICYmIHZhbHVlW3ZhbHVlLkxlbmd0aCAtIDFdCisgICAgICAgICAgICA9PSAnXScpIC8vT2Zmc2V0PworICAgIHsKKyAgICAgIC8vIFJlbGF0aXZlIGFkZHJlc3MKKyAgICAgIGZpeGVkQWRkciA9IGZhbHNlOworICAgICAgaWYgKGludC5UcnlQYXJzZSh2YWx1ZS5TdWJzdHJpbmcoMiwgdmFsdWUuTGVuZ3RoIC0gMyksIG91dCBudW0pKSB7CisgICAgICAgIHJldHVybiAob2Zmc2V0VmFsdWUgKyBudW0pOworICAgICAgfQorICAgICAgcmV0dXJuIGludC5NaW5WYWx1ZTsKKyAgICB9CisgICAgLy8gQWJzb2x1dGUgYWRkcmVzcworICAgIGZpeGVkQWRkciA9IHRydWU7CisgICAgaWYgKGludC5UcnlQYXJzZSh2YWx1ZS5TdWJzdHJpbmcoMSwgdmFsdWUuTGVuZ3RoIC0gMSksIG91dCBudW0pKSB7CisgICAgICByZXR1cm4gbnVtOworICAgIH0KKyAgICByZXR1cm4gaW50Lk1pblZhbHVlOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyB0aGUgY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBudW1iZXJlZCBjb2x1bW4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpQ29sdW1uTnVtYmVyIj5UaGUgbnVtYmVyIG9mIHRoZSBjb2x1bW48L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIGxldHRlciByZXByZXNlbnRpbmcgdGhlIGNvbHVtbjwvcmV0dXJucz4KKyAgcHJvdGVjdGVkIGludGVybmFsIHN0YXRpYyBzdHJpbmcgR2V0Q29sdW1uTGV0dGVyKGludCBpQ29sdW1uTnVtYmVyKSB7CisgICAgcmV0dXJuIEdldENvbHVtbkxldHRlcihpQ29sdW1uTnVtYmVyLCBmYWxzZSk7CisgIH0KKworICBwcm90ZWN0ZWQgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBHZXRDb2x1bW5MZXR0ZXIoaW50IGlDb2x1bW5OdW1iZXIsIGJvb2wgZml4ZWRDb2wpIHsKKyAgICBpZiAoaUNvbHVtbk51bWJlciA8IDEpIHsKKyAgICAgIC8vdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ29sdW1uIG51bWJlciBpcyBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgIHJldHVybiAiI1JFRiEiOworICAgIH0KKworICAgIHN0cmluZyBzQ29sID0gIiI7CisgICAgZG8geworICAgICAgc0NvbCA9ICgoY2hhcikoJ0EnICsgKChpQ29sdW1uTnVtYmVyIC0gMSkgJSAyNikpKSArIHNDb2w7CisgICAgICBpQ29sdW1uTnVtYmVyID0gKGlDb2x1bW5OdW1iZXIgLSAoKGlDb2x1bW5OdW1iZXIgLSAxKSAlIDI2KSkgLyAyNjsKKyAgICB9IHdoaWxlIChpQ29sdW1uTnVtYmVyID4gMCk7CisgICAgcmV0dXJuIGZpeGVkQ29sID8gIiQiICsgc0NvbCA6IHNDb2w7CisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBHZXRSb3dDb2xGcm9tQWRkcmVzcygKKyAgICAgIHN0cmluZyBjZWxsQWRkcmVzcywKKyAgICAgIG91dCBpbnQgZnJvbVJvdywKKyAgICAgIG91dCBpbnQgZnJvbUNvbHVtbiwKKyAgICAgIG91dCBpbnQgdG9Sb3csCisgICAgICBvdXQgaW50IHRvQ29sdW1uKSB7CisgICAgYm9vbCBmaXhlZEZyb21Sb3csCisgICAgICAgIGZpeGVkRnJvbUNvbHVtbiwKKyAgICAgICAgZml4ZWRUb1JvdywKKyAgICAgICAgZml4ZWRUb0NvbHVtbjsKKyAgICByZXR1cm4gR2V0Um93Q29sRnJvbUFkZHJlc3MoCisgICAgICAgIGNlbGxBZGRyZXNzLAorICAgICAgICBvdXQgZnJvbVJvdywKKyAgICAgICAgb3V0IGZyb21Db2x1bW4sCisgICAgICAgIG91dCB0b1JvdywKKyAgICAgICAgb3V0IHRvQ29sdW1uLAorICAgICAgICBvdXQgZml4ZWRGcm9tUm93LAorICAgICAgICBvdXQgZml4ZWRGcm9tQ29sdW1uLAorICAgICAgICBvdXQgZml4ZWRUb1JvdywKKyAgICAgICAgb3V0IGZpeGVkVG9Db2x1bW4pOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0IHRoZSByb3cvY29sdW1ucyBmb3IgYSBDZWxsLWFkZHJlc3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjZWxsQWRkcmVzcyI+VGhlIGFkZHJlc3M8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImZyb21Sb3ciPlJldHVybnMgdGhlIHRvIGNvbHVtbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZnJvbUNvbHVtbiI+UmV0dXJucyB0aGUgZnJvbSBjb2x1bW48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InRvUm93Ij5SZXR1cm5zIHRoZSB0byByb3c8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InRvQ29sdW1uIj5SZXR1cm5zIHRoZSBmcm9tIHJvdzwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZml4ZWRGcm9tUm93Ij5JcyB0aGUgZnJvbSByb3cgZml4ZWQ/PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmaXhlZEZyb21Db2x1bW4iPklzIHRoZSBmcm9tIGNvbHVtbiBmaXhlZD88L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImZpeGVkVG9Sb3ciPklzIHRoZSB0byByb3cgZml4ZWQ/PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmaXhlZFRvQ29sdW1uIj5JcyB0aGUgdG8gY29sdW1uIGZpeGVkPzwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIGludGVybmFsIHN0YXRpYyBib29sIEdldFJvd0NvbEZyb21BZGRyZXNzKAorICAgICAgc3RyaW5nIGNlbGxBZGRyZXNzLAorICAgICAgb3V0IGludCBmcm9tUm93LAorICAgICAgb3V0IGludCBmcm9tQ29sdW1uLAorICAgICAgb3V0IGludCB0b1JvdywKKyAgICAgIG91dCBpbnQgdG9Db2x1bW4sCisgICAgICBvdXQgYm9vbCBmaXhlZEZyb21Sb3csCisgICAgICBvdXQgYm9vbCBmaXhlZEZyb21Db2x1bW4sCisgICAgICBvdXQgYm9vbCBmaXhlZFRvUm93LAorICAgICAgb3V0IGJvb2wgZml4ZWRUb0NvbHVtbikgeworICAgIGJvb2wgcmV0OworICAgIGlmIChjZWxsQWRkcmVzcy5JbmRleE9mKCdbJykKKyAgICAgICAgPiAwKSAvL0V4dGVybmFsIHJlZmVyZW5jZSBvciByZWZlcmVuY2UgdG8gVGFibGUgb3IgUGl2b3R0YWJsZS4KKyAgICB7CisgICAgICBmcm9tUm93ID0gLTE7CisgICAgICBmcm9tQ29sdW1uID0gLTE7CisgICAgICB0b1JvdyA9IC0xOworICAgICAgdG9Db2x1bW4gPSAtMTsKKyAgICAgIGZpeGVkRnJvbVJvdyA9IGZhbHNlOworICAgICAgZml4ZWRGcm9tQ29sdW1uID0gZmFsc2U7CisgICAgICBmaXhlZFRvUm93ID0gZmFsc2U7CisgICAgICBmaXhlZFRvQ29sdW1uID0gZmFsc2U7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY2VsbEFkZHJlc3MgPSBjZWxsQWRkcmVzcy5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgIC8vVGhpcyBvbmUgY2FuIGJlIHJlbW92ZWQgd2hlbiB0aGUgd29ya3NoZWV0IFNlbGVjdCBmb3JtYXQgaXMgZml4ZWQKKyAgICBpZiAoY2VsbEFkZHJlc3MuSW5kZXhPZignICcpID4gMCkgeworICAgICAgY2VsbEFkZHJlc3MgPSBjZWxsQWRkcmVzcy5TdWJzdHJpbmcoMCwgY2VsbEFkZHJlc3MuSW5kZXhPZignICcpKTsKKyAgICB9CisKKyAgICBpZiAoY2VsbEFkZHJlc3MuSW5kZXhPZignOicpIDwgMCkgeworICAgICAgcmV0ID0gR2V0Um93Q29sRnJvbUFkZHJlc3MoCisgICAgICAgICAgY2VsbEFkZHJlc3MsCisgICAgICAgICAgb3V0IGZyb21Sb3csCisgICAgICAgICAgb3V0IGZyb21Db2x1bW4sCisgICAgICAgICAgb3V0IGZpeGVkRnJvbVJvdywKKyAgICAgICAgICBvdXQgZml4ZWRGcm9tQ29sdW1uKTsKKyAgICAgIHRvQ29sdW1uID0gZnJvbUNvbHVtbjsKKyAgICAgIHRvUm93ID0gZnJvbVJvdzsKKyAgICAgIGZpeGVkVG9Sb3cgPSBmaXhlZEZyb21Sb3c7CisgICAgICBmaXhlZFRvQ29sdW1uID0gZml4ZWRGcm9tQ29sdW1uOworICAgIH0gZWxzZSB7CisgICAgICBzdHJpbmdbXSBjZWxscyA9IGNlbGxBZGRyZXNzLlNwbGl0KCc6Jyk7CisgICAgICByZXQgPSBHZXRSb3dDb2xGcm9tQWRkcmVzcygKKyAgICAgICAgICBjZWxsc1swXSwKKyAgICAgICAgICBvdXQgZnJvbVJvdywKKyAgICAgICAgICBvdXQgZnJvbUNvbHVtbiwKKyAgICAgICAgICBvdXQgZml4ZWRGcm9tUm93LAorICAgICAgICAgIG91dCBmaXhlZEZyb21Db2x1bW4pOworICAgICAgaWYgKHJldCkgeworICAgICAgICByZXQgPSBHZXRSb3dDb2xGcm9tQWRkcmVzcygKKyAgICAgICAgICAgIGNlbGxzWzFdLAorICAgICAgICAgICAgb3V0IHRvUm93LAorICAgICAgICAgICAgb3V0IHRvQ29sdW1uLAorICAgICAgICAgICAgb3V0IGZpeGVkVG9Sb3csCisgICAgICAgICAgICBvdXQgZml4ZWRUb0NvbHVtbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBHZXRSb3dDb2xGcm9tQWRkcmVzcyhjZWxsc1sxXSwgb3V0IHRvUm93LCBvdXQgdG9Db2x1bW4sIG91dCBmaXhlZFRvUm93LCBvdXQgZml4ZWRUb0NvbHVtbik7CisgICAgICB9CisKKyAgICAgIGlmIChmcm9tQ29sdW1uIDw9IDApIHsKKyAgICAgICAgZnJvbUNvbHVtbiA9IDE7CisgICAgICB9CisgICAgICBpZiAoZnJvbVJvdyA8PSAwKSB7CisgICAgICAgIGZyb21Sb3cgPSAxOworICAgICAgfQorICAgICAgaWYgKHRvQ29sdW1uIDw9IDApIHsKKyAgICAgICAgdG9Db2x1bW4gPSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1uczsKKyAgICAgIH0KKyAgICAgIGlmICh0b1JvdyA8PSAwKSB7CisgICAgICAgIHRvUm93ID0gRXhjZWxQYWNrYWdlLk1heFJvd3M7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXQgdGhlIHJvdy9jb2x1bW4gZm9yIG4gQ2VsbC1hZGRyZXNzCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iY2VsbEFkZHJlc3MiPlRoZSBhZGRyZXNzPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPlJldHVybnMgVHRoZSByb3c8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+UmV0dXJucyB0aGUgY29sdW1uPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPnRydWUgaWYgdmFsaWQ8L3JldHVybnM+CisgIGludGVybmFsIHN0YXRpYyBib29sIEdldFJvd0NvbEZyb21BZGRyZXNzKHN0cmluZyBjZWxsQWRkcmVzcywgb3V0IGludCByb3csIG91dCBpbnQgY29sdW1uKSB7CisgICAgcmV0dXJuIEdldFJvd0NvbChjZWxsQWRkcmVzcywgb3V0IHJvdywgb3V0IGNvbHVtbiwgdHJ1ZSk7CisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBHZXRSb3dDb2xGcm9tQWRkcmVzcygKKyAgICAgIHN0cmluZyBjZWxsQWRkcmVzcywKKyAgICAgIG91dCBpbnQgcm93LAorICAgICAgb3V0IGludCBjb2wsCisgICAgICBvdXQgYm9vbCBmaXhlZFJvdywKKyAgICAgIG91dCBib29sIGZpeGVkQ29sKSB7CisgICAgcmV0dXJuIEdldFJvd0NvbChjZWxsQWRkcmVzcywgb3V0IHJvdywgb3V0IGNvbCwgdHJ1ZSwgb3V0IGZpeGVkUm93LCBvdXQgZml4ZWRDb2wpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0IHRoZSByb3cvY29sdW1uIGZvciBhIENlbGwtYWRkcmVzcworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPnRoZSBhZGRyZXNzPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPnJldHVybnMgdGhlIHJvdzwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj5yZXR1cm5zIHRoZSBjb2x1bW48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InRocm93RXhjZXB0aW9uIj50aHJvdyBleGNlcHRpb24gaWYgaW52YWxpZCwgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2U8L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBHZXRSb3dDb2woc3RyaW5nIGFkZHJlc3MsIG91dCBpbnQgcm93LCBvdXQgaW50IGNvbCwgYm9vbCB0aHJvd0V4Y2VwdGlvbikgeworICAgIGJvb2wgZml4ZWRSb3csCisgICAgICAgIGZpeGVkQ29sOworICAgIHJldHVybiBHZXRSb3dDb2woYWRkcmVzcywgb3V0IHJvdywgb3V0IGNvbCwgdGhyb3dFeGNlcHRpb24sIG91dCBmaXhlZFJvdywgb3V0IGZpeGVkQ29sKTsKKyAgfQorCisgIGludGVybmFsIHN0YXRpYyBib29sIEdldFJvd0NvbCgKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgb3V0IGludCByb3csCisgICAgICBvdXQgaW50IGNvbCwKKyAgICAgIGJvb2wgdGhyb3dFeGNlcHRpb24sCisgICAgICBvdXQgYm9vbCBmaXhlZFJvdywKKyAgICAgIG91dCBib29sIGZpeGVkQ29sKSB7CisgICAgYm9vbCBjb2xQYXJ0ID0gdHJ1ZTsKKyAgICBpbnQgY29sU3RhcnRJeCA9IDA7CisgICAgaW50IGNvbExlbmd0aCA9IDA7CisgICAgY29sID0gMDsKKyAgICByb3cgPSAwOworICAgIGZpeGVkUm93ID0gZmFsc2U7CisgICAgZml4ZWRDb2wgPSBmYWxzZTsKKworICAgIGlmIChhZGRyZXNzLkVuZHNXaXRoKCIjUkVGISIpKSB7CisgICAgICByb3cgPSAwOworICAgICAgY29sID0gMDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGludCBzaGVldE1hcmtlckluZGV4ID0gYWRkcmVzcy5JbmRleE9mKCchJyk7CisgICAgaWYgKHNoZWV0TWFya2VySW5kZXggPj0gMCkgeworICAgICAgY29sU3RhcnRJeCA9IHNoZWV0TWFya2VySW5kZXggKyAxOworICAgIH0KKyAgICBhZGRyZXNzID0gYWRkcmVzcy5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgIGZvciAoaW50IGkgPSBjb2xTdGFydEl4OyBpIDwgYWRkcmVzcy5MZW5ndGg7IGkrKykgeworICAgICAgY2hhciBjID0gYWRkcmVzc1tpXTsKKyAgICAgIGlmIChjb2xQYXJ0ICYmIChjID49ICdBJyAmJiBjIDw9ICdaJykgJiYgY29sTGVuZ3RoIDw9IDMpIHsKKyAgICAgICAgY29sICo9IDI2OworICAgICAgICBjb2wgKz0gYyAtIDY0OworICAgICAgICBjb2xMZW5ndGgrKzsKKyAgICAgIH0gZWxzZSBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICAgICAgcm93ICo9IDEwOworICAgICAgICByb3cgKz0gYyAtIDQ4OworICAgICAgICBjb2xQYXJ0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgaWYgKGMgPT0gJyQnKSB7CisgICAgICAgIGlmIChpID09IGNvbFN0YXJ0SXgpIHsKKyAgICAgICAgICBjb2xTdGFydEl4Kys7CisgICAgICAgICAgZml4ZWRDb2wgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNvbFBhcnQgPSBmYWxzZTsKKyAgICAgICAgICBmaXhlZFJvdyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJvdyA9IDA7CisgICAgICAgIGNvbCA9IDA7CisgICAgICAgIGlmICh0aHJvd0V4Y2VwdGlvbikgeworICAgICAgICAgIHRocm93IChuZXcoc3RyaW5nLkZvcm1hdCgiSW52YWxpZCBBZGRyZXNzIGZvcm1hdCB7MH0iLCBhZGRyZXNzKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJvdyAhPSAwIHx8IGNvbCAhPSAwOworICB9CisKKyAgaW50ZXJuYWwgc3RhdGljIGJvb2wgR2V0Um93Q29sX1YxKAorICAgICAgc3RyaW5nIGFkZHJlc3MsCisgICAgICBvdXQgaW50IHJvdywKKyAgICAgIG91dCBpbnQgY29sLAorICAgICAgYm9vbCB0aHJvd0V4Y2VwdGlvbiwKKyAgICAgIG91dCBib29sIGZpeGVkUm93LAorICAgICAgb3V0IGJvb2wgZml4ZWRDb2wpIHsKKyAgICBib29sIGNvbFBhcnQgPSB0cnVlOworICAgIGJvb2wgaXNGaXhlZCA9IGZhbHNlOworICAgIGludCBjb2xTdGFydEl4ID0gMDsKKyAgICBpbnQgY29sTGVuZ3RoID0gMDsKKyAgICBjb2wgPSAwOworICAgIHJvdyA9IDA7CisgICAgZml4ZWRSb3cgPSBmYWxzZTsKKyAgICBmaXhlZENvbCA9IGZhbHNlOworCisgICAgaWYgKGFkZHJlc3MuRW5kc1dpdGgoIiNSRUYhIikpIHsKKyAgICAgIHJvdyA9IDA7CisgICAgICBjb2wgPSAwOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaW50IHNoZWV0TWFya2VySW5kZXggPSBhZGRyZXNzLkluZGV4T2YoJyEnKTsKKyAgICBpZiAoc2hlZXRNYXJrZXJJbmRleCA+PSAwKSB7CisgICAgICBjb2xTdGFydEl4ID0gc2hlZXRNYXJrZXJJbmRleCArIDE7CisgICAgfQorICAgIGFkZHJlc3MgPSBhZGRyZXNzLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgZm9yIChpbnQgaSA9IGNvbFN0YXJ0SXg7IGkgPCBhZGRyZXNzLkxlbmd0aDsgaSsrKSB7CisgICAgICBjaGFyIGMgPSBhZGRyZXNzW2ldOworICAgICAgaWYgKGMgPT0gJyQnKSB7CisgICAgICAgIC8vIEFic29sdXRlIGFkZHJlc3MKKyAgICAgICAgaXNGaXhlZCA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGNvbFBhcnQgJiYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSAmJiBjb2xMZW5ndGggPD0gMykgeworICAgICAgICAvLyBDb2x1bW4gcG9ydGlvbiBvZiBhZGRyZXNzCisgICAgICAgIGlmIChpc0ZpeGVkKSB7CisgICAgICAgICAgZml4ZWRDb2wgPSB0cnVlOworICAgICAgICAgIGlzRml4ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbCAqPSAyNjsKKyAgICAgICAgY29sICs9IGMgLSA2NDsKKyAgICAgICAgY29sTGVuZ3RoKys7CisgICAgICB9IGVsc2UgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgICAgIC8vIFJvdyBwb3J0aW9uIG9mIGFkZHJlc3MKKyAgICAgICAgaWYgKGlzRml4ZWQpIHsKKyAgICAgICAgICBmaXhlZFJvdyA9IHRydWU7CisgICAgICAgICAgaXNGaXhlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcm93ICo9IDEwOworICAgICAgICByb3cgKz0gYyAtIDQ4OworICAgICAgICBjb2xQYXJ0ID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICByb3cgPSAwOworICAgICAgICBjb2wgPSAwOworICAgICAgICBpZiAodGhyb3dFeGNlcHRpb24pIHsKKyAgICAgICAgICB0aHJvdyAobmV3KHN0cmluZy5Gb3JtYXQoIkludmFsaWQgQWRkcmVzcyBmb3JtYXQgezB9IiwgYWRkcmVzcykpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByb3cgIT0gMCB8fCBjb2wgIT0gMDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGludCBHZXRDb2x1bW4oc3RyaW5nIHNDb2wpIHsKKyAgICBpbnQgY29sID0gMDsKKyAgICBpbnQgbGVuID0gc0NvbC5MZW5ndGggLSAxOworICAgIGZvciAoaW50IGkgPSBsZW47IGkgPj0gMDsgaS0tKSB7CisgICAgICBjb2wgKz0gKHNDb2xbaV0gLSA2NCkgKiAoaW50KShNYXRoLlBvdygyNiwgbGVuIC0gaSkpOworICAgIH0KKyAgICByZXR1cm4gY29sOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyB0aGUgQWxwaGFOdW1lcmljIHJlcHJlc2VudGF0aW9uIHRoYXQgRXhjZWwgZXhwZWN0cyBmb3IgYSBDZWxsIEFkZHJlc3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPlRoZSBudW1iZXIgb2YgdGhlIHJvdzwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1uIj5UaGUgbnVtYmVyIG9mIHRoZSBjb2x1bW4gaW4gdGhlIHdvcmtzaGVldDwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UaGUgY2VsbCBhZGRyZXNzIGluIHRoZSBmb3JtYXQgQTE8L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEFkZHJlc3MoaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIHJldHVybiBHZXRBZGRyZXNzKHJvdywgY29sdW1uLCBmYWxzZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZXR1cm5zIHRoZSBBbHBoYU51bWVyaWMgcmVwcmVzZW50YXRpb24gdGhhdCBFeGNlbCBleHBlY3RzIGZvciBhIENlbGwgQWRkcmVzcworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+VGhlIG51bWJlciBvZiB0aGUgcm93PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPlRoZSBudW1iZXIgb2YgdGhlIGNvbHVtbiBpbiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhYnNvbHV0ZVJvdyI+QWJzb2x1dGUgcm93PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhYnNvbHV0ZUNvbCI+QWJzb2x1dGUgY29sdW1uPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPlRoZSBjZWxsIGFkZHJlc3MgaW4gdGhlIGZvcm1hdCBBMTwvcmV0dXJucz4KKyAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0QWRkcmVzcyhpbnQgcm93LCBib29sIGFic29sdXRlUm93LCBpbnQgY29sdW1uLCBib29sIGFic29sdXRlQ29sKSB7CisgICAgcmV0dXJuIChhYnNvbHV0ZUNvbCA/ICIkIiA6ICIiKSArIEdldENvbHVtbkxldHRlcihjb2x1bW4pICsgKGFic29sdXRlUm93ID8gIiQiIDogIiIpICsgcm93OworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyB0aGUgQWxwaGFOdW1lcmljIHJlcHJlc2VudGF0aW9uIHRoYXQgRXhjZWwgZXhwZWN0cyBmb3IgYSBDZWxsIEFkZHJlc3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPlRoZSBudW1iZXIgb2YgdGhlIHJvdzwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1uIj5UaGUgbnVtYmVyIG9mIHRoZSBjb2x1bW4gaW4gdGhlIHdvcmtzaGVldDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWJzb2x1dGUiPkdldCBhbiBhYnNvbHV0ZSBhZGRyZXNzICgkQSQxKTwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UaGUgY2VsbCBhZGRyZXNzIGluIHRoZSBmb3JtYXQgQTE8L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEFkZHJlc3MoaW50IHJvdywgaW50IGNvbHVtbiwgYm9vbCBhYnNvbHV0ZSkgeworICAgIGlmIChyb3cgPT0gMCB8fCBjb2x1bW4gPT0gMCkgeworICAgICAgcmV0dXJuICIjUkVGISI7CisgICAgfQorICAgIGlmIChhYnNvbHV0ZSkgeworICAgICAgcmV0dXJuICgiJCIgKyBHZXRDb2x1bW5MZXR0ZXIoY29sdW1uKSArICIkIiArIHJvdyk7CisgICAgfQorICAgIHJldHVybiAoR2V0Q29sdW1uTGV0dGVyKGNvbHVtbikgKyByb3cpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyB0aGUgQWxwaGFOdW1lcmljIHJlcHJlc2VudGF0aW9uIHRoYXQgRXhjZWwgZXhwZWN0cyBmb3IgYSBDZWxsIEFkZHJlc3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmcm9tUm93Ij5Gcm9tIHJvdyBudW1iZXI8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImZyb21Db2x1bW4iPkZyb20gY29sdW1uIG51bWJlcjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idG9Sb3ciPlRvIHJvdyBudW1iZXI8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InRvQ29sdW1uIj5Gcm9tIGNvbHVtbiBudW1iZXI8L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIGNlbGwgYWRkcmVzcyBpbiB0aGUgZm9ybWF0IEExPC9yZXR1cm5zPgorICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRBZGRyZXNzKGludCBmcm9tUm93LCBpbnQgZnJvbUNvbHVtbiwgaW50IHRvUm93LCBpbnQgdG9Db2x1bW4pIHsKKyAgICByZXR1cm4gR2V0QWRkcmVzcyhmcm9tUm93LCBmcm9tQ29sdW1uLCB0b1JvdywgdG9Db2x1bW4sIGZhbHNlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgdGhlIEFscGhhTnVtZXJpYyByZXByZXNlbnRhdGlvbiB0aGF0IEV4Y2VsIGV4cGVjdHMgZm9yIGEgQ2VsbCBBZGRyZXNzCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iZnJvbVJvdyI+RnJvbSByb3cgbnVtYmVyPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmcm9tQ29sdW1uIj5Gcm9tIGNvbHVtbiBudW1iZXI8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InRvUm93Ij5UbyByb3cgbnVtYmVyPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0b0NvbHVtbiI+RnJvbSBjb2x1bW4gbnVtYmVyPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhYnNvbHV0ZSI+aWYgdHJ1ZSBhZGRyZXNzIGlzIGFic29sdXRlIChsaWtlICRBJDEpPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPlRoZSBjZWxsIGFkZHJlc3MgaW4gdGhlIGZvcm1hdCBBMTwvcmV0dXJucz4KKyAgcHVibGljIHN0YXRpYyBzdHJpbmcgR2V0QWRkcmVzcygKKyAgICAgIGludCBmcm9tUm93LAorICAgICAgaW50IGZyb21Db2x1bW4sCisgICAgICBpbnQgdG9Sb3csCisgICAgICBpbnQgdG9Db2x1bW4sCisgICAgICBib29sIGFic29sdXRlKSB7CisgICAgaWYgKGZyb21Sb3cgPT0gdG9Sb3cgJiYgZnJvbUNvbHVtbiA9PSB0b0NvbHVtbikgeworICAgICAgcmV0dXJuIEdldEFkZHJlc3MoZnJvbVJvdywgZnJvbUNvbHVtbiwgYWJzb2x1dGUpOworICAgIH0KKyAgICBpZiAoZnJvbVJvdyA9PSAxICYmIHRvUm93ID09IEV4Y2VsUGFja2FnZS5NYXhSb3dzKSB7CisgICAgICB2YXIgYWJzQ2hhciA9IGFic29sdXRlID8gIiQiIDogIiI7CisgICAgICByZXR1cm4gYWJzQ2hhciArIEdldENvbHVtbkxldHRlcihmcm9tQ29sdW1uKSArICI6IiArIGFic0NoYXIgKyBHZXRDb2x1bW5MZXR0ZXIodG9Db2x1bW4pOworICAgIH0KKyAgICBpZiAoZnJvbUNvbHVtbiA9PSAxICYmIHRvQ29sdW1uID09IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSB7CisgICAgICB2YXIgYWJzQ2hhciA9IGFic29sdXRlID8gIiQiIDogIiI7CisgICAgICByZXR1cm4gYWJzQ2hhciArIGZyb21Sb3cgKyAiOiIgKyBhYnNDaGFyICsgdG9Sb3c7CisgICAgfQorICAgIHJldHVybiBHZXRBZGRyZXNzKGZyb21Sb3csIGZyb21Db2x1bW4sIGFic29sdXRlKSArICI6IiArIEdldEFkZHJlc3ModG9Sb3csIHRvQ29sdW1uLCBhYnNvbHV0ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZXR1cm5zIHRoZSBBbHBoYU51bWVyaWMgcmVwcmVzZW50YXRpb24gdGhhdCBFeGNlbCBleHBlY3RzIGZvciBhIENlbGwgQWRkcmVzcworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImZyb21Sb3ciPkZyb20gcm93IG51bWJlcjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZnJvbUNvbHVtbiI+RnJvbSBjb2x1bW4gbnVtYmVyPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0b1JvdyI+VG8gcm93IG51bWJlcjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idG9Db2x1bW4iPkZyb20gY29sdW1uIG51bWJlcjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZml4ZWRGcm9tQ29sdW1uIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImZpeGVkRnJvbVJvdyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmaXhlZFRvQ29sdW1uIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImZpeGVkVG9Sb3ciPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UaGUgY2VsbCBhZGRyZXNzIGluIHRoZSBmb3JtYXQgQTE8L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEdldEFkZHJlc3MoCisgICAgICBpbnQgZnJvbVJvdywKKyAgICAgIGludCBmcm9tQ29sdW1uLAorICAgICAgaW50IHRvUm93LAorICAgICAgaW50IHRvQ29sdW1uLAorICAgICAgYm9vbCBmaXhlZEZyb21Sb3csCisgICAgICBib29sIGZpeGVkRnJvbUNvbHVtbiwKKyAgICAgIGJvb2wgZml4ZWRUb1JvdywKKyAgICAgIGJvb2wgZml4ZWRUb0NvbHVtbikgeworICAgIGlmIChmcm9tUm93ID09IHRvUm93ICYmIGZyb21Db2x1bW4gPT0gdG9Db2x1bW4pIHsKKyAgICAgIHJldHVybiBHZXRBZGRyZXNzKGZyb21Sb3csIGZpeGVkRnJvbVJvdywgZnJvbUNvbHVtbiwgZml4ZWRGcm9tQ29sdW1uKTsKKyAgICB9CisgICAgaWYgKGZyb21Sb3cgPT0gMSAmJiB0b1JvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cykgeworICAgICAgcmV0dXJuIEdldENvbHVtbkxldHRlcihmcm9tQ29sdW1uLCBmaXhlZEZyb21Db2x1bW4pCisgICAgICAgICAgKyAiOiIKKyAgICAgICAgICArIEdldENvbHVtbkxldHRlcih0b0NvbHVtbiwgZml4ZWRUb0NvbHVtbik7CisgICAgfQorICAgIGlmIChmcm9tQ29sdW1uID09IDEgJiYgdG9Db2x1bW4gPT0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpIHsKKyAgICAgIHJldHVybiAoZml4ZWRGcm9tUm93ID8gIiQiIDogIiIpICsgZnJvbVJvdyArICI6IiArIChmaXhlZFRvUm93ID8gIiQiIDogIiIpICsgdG9Sb3c7CisgICAgfQorICAgIHJldHVybiBHZXRBZGRyZXNzKGZyb21Sb3csIGZpeGVkRnJvbVJvdywgZnJvbUNvbHVtbiwgZml4ZWRGcm9tQ29sdW1uKQorICAgICAgICArICI6IgorICAgICAgICArIEdldEFkZHJlc3ModG9Sb3csIGZpeGVkVG9Sb3csIHRvQ29sdW1uLCBmaXhlZFRvQ29sdW1uKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldCB0aGUgZnVsbCBhZGRyZXNzIGluY2x1ZGluZyB0aGUgd29ya3NoZWV0IG5hbWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXROYW1lIj5UaGUgbmFtZSBvZiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5UaGUgYWRkcmVzczwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UaGUgZnVsbCBhZGRyZXNzPC9yZXR1cm5zPgorICBwdWJsaWMgc3RhdGljIHN0cmluZyBHZXRGdWxsQWRkcmVzcyhzdHJpbmcgd29ya3NoZWV0TmFtZSwgc3RyaW5nIGFkZHJlc3MpIHsKKyAgICByZXR1cm4gR2V0RnVsbEFkZHJlc3Mod29ya3NoZWV0TmFtZSwgYWRkcmVzcywgdHJ1ZSk7CisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldEZ1bGxBZGRyZXNzKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBzdHJpbmcgYWRkcmVzcywgYm9vbCBmdWxsUm93Q29sKSB7CisgICAgaWYgKGFkZHJlc3MuSW5kZXhPZigiISIpID09IC0xIHx8IGFkZHJlc3MgPT0gIiNSRUYhIikgeworICAgICAgaWYgKGZ1bGxSb3dDb2wpIHsKKyAgICAgICAgc3RyaW5nW10gY2VsbHMgPSBhZGRyZXNzLlNwbGl0KCc6Jyk7CisgICAgICAgIGlmIChjZWxscy5MZW5ndGggPiAwKSB7CisgICAgICAgICAgYWRkcmVzcyA9IHN0cmluZy5Gb3JtYXQoIid7MH0nIXsxfSIsIHdvcmtzaGVldE5hbWUsIGNlbGxzWzBdKTsKKyAgICAgICAgICBpZiAoY2VsbHMuTGVuZ3RoID4gMSkgeworICAgICAgICAgICAgYWRkcmVzcyArPSBzdHJpbmcuRm9ybWF0KCI6ezB9IiwgY2VsbHNbMV0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIGEgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZShhZGRyZXNzKTsKKyAgICAgICAgaWYgKChhLl9mcm9tUm93ID09IDEgJiYgYS5fdG9Sb3cgPT0gRXhjZWxQYWNrYWdlLk1heFJvd3MpCisgICAgICAgICAgICB8fCAoYS5fZnJvbUNvbCA9PSAxICYmIGEuX3RvQ29sID09IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSkgeworICAgICAgICAgIGFkZHJlc3MgPSBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAiJ3swfSchezF9ezJ9OnszfXs0fSIsCisgICAgICAgICAgICAgIHdvcmtzaGVldE5hbWUsCisgICAgICAgICAgICAgIEdldENvbHVtbkxldHRlcihhLl9mcm9tQ29sKSwKKyAgICAgICAgICAgICAgYS5fZnJvbVJvdywKKyAgICAgICAgICAgICAgR2V0Q29sdW1uTGV0dGVyKGEuX3RvQ29sKSwKKyAgICAgICAgICAgICAgYS5fdG9Sb3cpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGFkZHJlc3MgPSBHZXRGdWxsQWRkcmVzcyh3b3Jrc2hlZXROYW1lLCBhZGRyZXNzLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYWRkcmVzczsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgYm9vbCBJc1ZhbGlkQWRkcmVzcyhzdHJpbmcgYWRkcmVzcykgeworICAgIGFkZHJlc3MgPSBhZGRyZXNzLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgc3RyaW5nIHIxID0gIiIsCisgICAgICAgIGMxID0gIiIsCisgICAgICAgIHIyID0gIiIsCisgICAgICAgIGMyID0gIiI7CisgICAgYm9vbCBpc1NlY29uZCA9IGZhbHNlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRkcmVzcy5MZW5ndGg7IGkrKykgeworICAgICAgaWYgKGFkZHJlc3NbaV0gPj0gJ0EnICYmIGFkZHJlc3NbaV0gPD0gJ1onKSB7CisgICAgICAgIGlmIChpc1NlY29uZCA9PSBmYWxzZSkgeworICAgICAgICAgIGlmIChyMSAhPSAiIikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgICBjMSArPSBhZGRyZXNzW2ldOworICAgICAgICAgIGlmIChjMS5MZW5ndGggPiAzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChyMiAhPSAiIikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgICBjMiArPSBhZGRyZXNzW2ldOworICAgICAgICAgIGlmIChjMi5MZW5ndGggPiAzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGFkZHJlc3NbaV0gPj0gJzAnICYmIGFkZHJlc3NbaV0gPD0gJzknKSB7CisgICAgICAgIGlmIChpc1NlY29uZCA9PSBmYWxzZSkgeworICAgICAgICAgIHIxICs9IGFkZHJlc3NbaV07CisgICAgICAgICAgaWYgKHIxLkxlbmd0aCA+IDcpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcjIgKz0gYWRkcmVzc1tpXTsKKyAgICAgICAgICBpZiAocjIuTGVuZ3RoID4gNykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChhZGRyZXNzW2ldID09ICc6JykgeworICAgICAgICBpc1NlY29uZCA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKGFkZHJlc3NbaV0gPT0gJyQnKSB7CisgICAgICAgIGlmIChpID09IGFkZHJlc3MuTGVuZ3RoIC0gMSB8fCBhZGRyZXNzW2kgKyAxXSA9PSAnOicpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocjEgIT0gIiIKKyAgICAgICAgJiYgYzEgIT0gIiIKKyAgICAgICAgJiYgcjIgPT0gIiIKKyAgICAgICAgJiYgYzIKKyAgICAgICAgICAgID09ICIiKSAvL1NpbmdsZSBDZWxsCisgICAgeworICAgICAgcmV0dXJuIChHZXRDb2x1bW4oYzEpIDw9IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zICYmIGludC5QYXJzZShyMSkgPD0gRXhjZWxQYWNrYWdlLk1heFJvd3MpOworICAgIH0KKyAgICBpZiAocjEgIT0gIiIKKyAgICAgICAgJiYgcjIgIT0gIiIKKyAgICAgICAgJiYgYzEgIT0gIiIKKyAgICAgICAgJiYgYzIKKyAgICAgICAgICAgICE9ICIiKSAvL1JhbmdlCisgICAgeworICAgICAgdmFyIGlSMiA9IGludC5QYXJzZShyMik7CisgICAgICB2YXIgaUMyID0gR2V0Q29sdW1uKGMyKTsKKworICAgICAgcmV0dXJuIEdldENvbHVtbihjMSkgPD0gaUMyCisgICAgICAgICAgJiYgaW50LlBhcnNlKHIxKSA8PSBpUjIKKyAgICAgICAgICAmJiBpQzIgPD0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMKKyAgICAgICAgICAmJiBpUjIgPD0gRXhjZWxQYWNrYWdlLk1heFJvd3M7CisgICAgfQorICAgIGlmIChyMSA9PSAiIgorICAgICAgICAmJiByMiA9PSAiIgorICAgICAgICAmJiBjMSAhPSAiIgorICAgICAgICAmJiBjMgorICAgICAgICAgICAgIT0gIiIpIC8vRnVsbCBDb2x1bW4KKyAgICB7CisgICAgICB2YXIgYzJOID0gR2V0Q29sdW1uKGMyKTsKKyAgICAgIHJldHVybiAoR2V0Q29sdW1uKGMxKSA8PSBjMk4gJiYgYzJOIDw9IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICB9CisgICAgaWYgKHIxICE9ICIiICYmIHIyICE9ICIiICYmIGMxID09ICIiICYmIGMyID09ICIiKSB7CisgICAgICB2YXIgaVIyID0gaW50LlBhcnNlKHIyKTsKKworICAgICAgcmV0dXJuIGludC5QYXJzZShyMSkgPD0gaVIyICYmIGlSMiA8PSBFeGNlbFBhY2thZ2UuTWF4Um93czsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ2hlY2tzIHRoYXQgYSBjZWxsIGFkZHJlc3MgKGUuZy4gQTUpIGlzIHZhbGlkLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImNlbGxBZGRyZXNzIj5UaGUgYWxwaGFudW1lcmljIGNlbGwgYWRkcmVzczwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UcnVlIGlmIHRoZSBjZWxsIGFkZHJlc3MgaXMgdmFsaWQ8L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgYm9vbCBJc1ZhbGlkQ2VsbEFkZHJlc3Moc3RyaW5nIGNlbGxBZGRyZXNzKSB7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgICB0cnkgeworICAgICAgaW50IHJvdywKKyAgICAgICAgICBjb2w7CisgICAgICBpZiAoR2V0Um93Q29sRnJvbUFkZHJlc3MoY2VsbEFkZHJlc3MsIG91dCByb3csIG91dCBjb2wpKSB7CisgICAgICAgIGlmIChyb3cgPiAwICYmIGNvbCA+IDAgJiYgcm93IDw9IEV4Y2VsUGFja2FnZS5NYXhSb3dzICYmIGNvbCA8PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgeworICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGNhdGNoIHt9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFVwZGF0ZXMgdGhlIEV4Y2VsIGZvcm11bGEgc28gdGhhdCBhbGwgdGhlIGNlbGxBZGRyZXNzZXMgYXJlIGluY3JlbWVudGVkIGJ5IHRoZSByb3cgYW5kIGNvbHVtbiBpbmNyZW1lbnRzCisgIC8vLyBpZiB0aGV5IGZhbGwgYWZ0ZXIgdGhlIGFmdGVyUm93IGFuZCBhZnRlckNvbHVtbi4KKyAgLy8vIFN1cHBvcnRzIGluc2VydGluZyByb3dzIGFuZCBjb2x1bW5zIGludG8gZXhpc3RpbmcgdGVtcGxhdGVzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImZvcm11bGEiPlRoZSBFeGNlbCBmb3JtdWxhPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3dJbmNyZW1lbnQiPlRoZSBhbW91bnQgdG8gaW5jcmVtZW50IHRoZSBjZWxsIHJlZmVyZW5jZSBieTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sSW5jcmVtZW50Ij5UaGUgYW1vdW50IHRvIGluY3JlbWVudCB0aGUgY2VsbCByZWZlcmVuY2UgYnk8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFmdGVyUm93Ij5Pbmx5IGNoYW5nZSByb3dzIGFmdGVyIHRoaXMgcm93PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZnRlckNvbHVtbiI+T25seSBjaGFuZ2UgY29sdW1ucyBhZnRlciB0aGlzIGNvbHVtbjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoCisgICAgICBzdHJpbmcgZm9ybXVsYSwKKyAgICAgIGludCByb3dJbmNyZW1lbnQsCisgICAgICBpbnQgY29sSW5jcmVtZW50LAorICAgICAgaW50IGFmdGVyUm93LAorICAgICAgaW50IGFmdGVyQ29sdW1uLAorICAgICAgYm9vbCBzZXRGaXhlZCA9IGZhbHNlKSB7CisgICAgLy9yZXR1cm4gVHJhbnNsYXRlKEZvcm11bGEsIEFkZFRvUm93Q29sdW1uVHJhbnNsYXRvciwgYWZ0ZXJSb3csIGFmdGVyQ29sdW1uLCByb3dJbmNyZW1lbnQsIGNvbEluY3JlbWVudCk7CisgICAgdmFyIGQgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4oKTsKKyAgICB0cnkgeworICAgICAgdmFyIHNjdCA9IG5ldyBTb3VyY2VDb2RlVG9rZW5pemVyKEZ1bmN0aW9uTmFtZVByb3ZpZGVyLkVtcHR5LCBOYW1lVmFsdWVQcm92aWRlci5FbXB0eSk7CisgICAgICB2YXIgdG9rZW5zID0gc2N0LlRva2VuaXplKGZvcm11bGEpOworICAgICAgU3RyaW5nIGYgPSAiIjsKKyAgICAgIGZvcmVhY2ggKHZhciB0IGluIHRva2VucykgeworICAgICAgICBpZiAodC5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLkV4Y2VsQWRkcmVzcykgeworICAgICAgICAgIHZhciBhID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UodC5WYWx1ZSk7CisKKyAgICAgICAgICBpZiAoIVN0cmluZy5Jc051bGxPckVtcHR5KAorICAgICAgICAgICAgICBhLl93cykpIC8vIEJ1ZyAxNTMzOQorICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgZnJvbSBhIGRpZmZlcmVudCB3b3Jrc2hlZXQsIHRodXMgbm8gdXBkYXRlIGlzIHJlcXVpcmVkCisgICAgICAgICAgICBmICs9IGEuQWRkcmVzczsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmIChyb3dJbmNyZW1lbnQgPiAwKSB7CisgICAgICAgICAgICBhID0gYS5BZGRSb3coYWZ0ZXJSb3csIHJvd0luY3JlbWVudCwgc2V0Rml4ZWQpOworICAgICAgICAgIH0gZWxzZSBpZiAocm93SW5jcmVtZW50IDwgMCkgeworICAgICAgICAgICAgYSA9IGEuRGVsZXRlUm93KGFmdGVyUm93LCAtcm93SW5jcmVtZW50LCBzZXRGaXhlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChjb2xJbmNyZW1lbnQgPiAwKSB7CisgICAgICAgICAgICBhID0gYS5BZGRDb2x1bW4oYWZ0ZXJDb2x1bW4sIGNvbEluY3JlbWVudCwgc2V0Rml4ZWQpOworICAgICAgICAgIH0gZWxzZSBpZiAoY29sSW5jcmVtZW50IDwgMCkgeworICAgICAgICAgICAgYSA9IGEuRGVsZXRlQ29sdW1uKGFmdGVyQ29sdW1uLCAtY29sSW5jcmVtZW50LCBzZXRGaXhlZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChhID09IG51bGwgfHwgIWEuSXNWYWxpZFJvd0NvbCgpKSB7CisgICAgICAgICAgICBmICs9ICIjUkVGISI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGYgKz0gYS5BZGRyZXNzOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmICs9IHQuVmFsdWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBmOworICAgIH0gY2F0Y2ggLy9JbnZhbGlkIGZvcm11bGEsIHNraXAgdXBkYXRlaW5nIGFkZHJlc3NlcworICAgIHsKKyAgICAgIHJldHVybiBmb3JtdWxhOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsQ29sdW1uLmNzIGIvRVBQbHVzL0V4Y2VsQ29sdW1uLmNzCmluZGV4IDU2ZWE5OTQuLmJiMjY5NTggMTAwNjQ0Ci0tLSBhL0VQUGx1cy9FeGNlbENvbHVtbi5jcworKysgYi9FUFBsdXMvRXhjZWxDb2x1bW4uY3MKQEAgLTEzLDI5OSArMTMsMjQyIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvvv71sbG1hbgkJSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBL77+9bGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotCS8vLyBSZXByZXNlbnRzIG9uZSBvciBtb3JlIGNvbHVtbnMgd2l0aGluIHRoZSB3b3Jrc2hlZXQKLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBjbGFzcyBFeGNlbENvbHVtbiA6IElSYW5nZUlECi0JewotCQlwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQ7Ci0JCXByaXZhdGUgWG1sRWxlbWVudCBfY29sRWxlbWVudCA9IG51bGw7CiAKLQkJI3JlZ2lvbiBFeGNlbENvbHVtbiBDb25zdHJ1Y3RvcgotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBFeGNlbENvbHVtbiBjbGFzcy4gIAotCQkvLy8gRm9yIGludGVybmFsIHVzZSBvbmx5IQotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9IldvcmtzaGVldCI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJjb2wiPjwvcGFyYW0+Ci0JCXByb3RlY3RlZCBpbnRlcm5hbCBFeGNlbENvbHVtbihFeGNlbFdvcmtzaGVldCBXb3Jrc2hlZXQsIGludCBjb2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQgPSBXb3Jrc2hlZXQ7Ci0gICAgICAgICAgICBfY29sdW1uTWluID0gY29sOwotICAgICAgICAgICAgX2NvbHVtbk1heCA9IGNvbDsKLSAgICAgICAgICAgIF93aWR0aCA9IF93b3Jrc2hlZXQuRGVmYXVsdENvbFdpZHRoOwotICAgICAgICB9Ci0JCSNlbmRyZWdpb24KLSAgICAgICAgaW50ZXJuYWwgaW50IF9jb2x1bW5NaW47CQkKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gU2V0cyB0aGUgZmlyc3QgY29sdW1uIHRoZSBkZWZpbml0aW9uIHJlZmVycyB0by4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIGludCBDb2x1bW5NaW4gCi0JCXsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfY29sdW1uTWluOyB9Ci0JCQkvL3NldCB7IF9jb2x1bW5NaW49dmFsdWU7IH0gCi0JCX0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOwogCi0gICAgICAgIGludGVybmFsIGludCBfY29sdW1uTWF4OwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0JCS8vLyBTZXRzIHRoZSBsYXN0IGNvbHVtbiB0aGUgZGVmaW5pdGlvbiByZWZlcnMgdG8uCi0JCS8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgQ29sdW1uTWF4IAotCQl7IAotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9jb2x1bW5NYXg7IH0KLQkJCXNldCAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCBfY29sdW1uTWluICYmIHZhbHVlID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJDb2x1bW5NYXggb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgICAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIFJlcHJlc2VudHMgb25lIG9yIG1vcmUgY29sdW1ucyB3aXRoaW4gdGhlIHdvcmtzaGVldAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbENvbHVtbiA6IElSYW5nZUlkIHsKKyAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OworICBwcml2YXRlIFhtbEVsZW1lbnQgX2NvbEVsZW1lbnQgPSBudWxsOwogCi0gICAgICAgICAgICAgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF93b3Jrc2hlZXQuX3ZhbHVlcywgMCwgMCwgMCwgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOwotICAgICAgICAgICAgICAgIHdoaWxlKGNzZS5OZXh0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGNzZS5WYWx1ZSBhcyBFeGNlbENvbHVtbjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNzZS5Db2x1bW4gPiBfY29sdW1uTWluICYmIGMuQ29sdW1uTWF4IDw9IHZhbHVlICYmIGNzZS5Db2x1bW4hPV9jb2x1bW5NaW4pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiQ29sdW1uTWF4IGNhbiBub3Qgc3BhbiBvdmVyIGV4aXN0aW5nIGNvbHVtbiB7MH0uIixjLkNvbHVtbk1pbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9jb2x1bW5NYXggPSB2YWx1ZTsgCi0gICAgICAgICAgICB9IAotCQl9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEludGVybmFsIHJhbmdlIGlkIGZvciB0aGUgY29sdW1uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIHVsb25nIENvbHVtbklECi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbENvbHVtbi5HZXRDb2x1bW5JRChfd29ya3NoZWV0LlNoZWV0SUQsIENvbHVtbk1pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJI3JlZ2lvbiBFeGNlbENvbHVtbiBIaWRkZW4KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQWxsb3dzIHRoZSBjb2x1bW4gdG8gYmUgaGlkZGVuIGluIHRoZSB3b3Jrc2hlZXQKLQkJLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgYm9vbCBfaGlkZGVuPWZhbHNlOwotICAgICAgICBwdWJsaWMgYm9vbCBIaWRkZW4KLQkJewotCQkJZ2V0Ci0JCQl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9oaWRkZW47Ci0JCQl9Ci0JCQlzZXQKLQkJCXsKLSAgICAgICAgICAgICAgICBfaGlkZGVuID0gdmFsdWU7Ci0JCQl9Ci0JCX0KLQkJI2VuZHJlZ2lvbgorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBFeGNlbENvbHVtbiBjbGFzcy4KKyAgLy8vIEZvciBpbnRlcm5hbCB1c2Ugb25seSEKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj48L3BhcmFtPgorICBwcm90ZWN0ZWQgaW50ZXJuYWwgRXhjZWxDb2x1bW4oRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBpbnQgY29sKSB7CisgICAgX3dvcmtzaGVldCA9IHdvcmtzaGVldDsKKyAgICBfY29sdW1uTWluID0gY29sOworICAgIF9jb2x1bW5NYXggPSBjb2w7CisgICAgX3dpZHRoID0gX3dvcmtzaGVldC5EZWZhdWx0Q29sV2lkdGg7CisgIH0KIAotCQkjcmVnaW9uIEV4Y2VsQ29sdW1uIFdpZHRoCi0gICAgICAgIGludGVybmFsIGRvdWJsZSBWaXN1YWxXaWR0aAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2hpZGRlbiB8fCAoQ29sbGFwc2VkICYmIE91dGxpbmVMZXZlbD4wKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3dpZHRoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBkb3VibGUgX3dpZHRoOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uIGluIHRoZSB3b3Jrc2hlZXQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZSBXaWR0aAotCQl7Ci0JCQlnZXQKLQkJCXsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3dpZHRoOwotCQkJfQotCQkJc2V0CQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF93aWR0aCA9IHZhbHVlOworICBpbnRlcm5hbCBpbnQgX2NvbHVtbk1pbjsKIAotICAgICAgICAgICAgICAgIGlmIChfaGlkZGVuICYmIHZhbHVlIT0wKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2hpZGRlbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQkJfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiBzZXQgdG8gdHJ1ZSBhIGNvbHVtbiBhdXRvbWF0aWNsbHkgcmVzaXplKGdyb3cgd2lkZXIpIHdoZW4gYSB1c2VyIGlucHV0cyBudW1iZXJzIGluIGEgY2VsbC4gCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEJlc3RGaXQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgc2V0OwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBjb2x1bW4gaXMgY29sbGFwc2VkIGluIG91dGxpbmUgbW9kZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBDb2xsYXBzZWQgeyBnZXQ7IHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBPdXRsaW5lIGxldmVsLiBaZXJvIGlmIG5vIG91dGxpbmUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBPdXRsaW5lTGV2ZWwgeyBnZXQ7IHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQaG9uZXRpYwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBQaG9uZXRpYyB7IGdldDsgc2V0OyB9Ci0gICAgICAgICNlbmRyZWdpb24KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2V0cyB0aGUgZmlyc3QgY29sdW1uIHRoZSBkZWZpbml0aW9uIHJlZmVycyB0by4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBDb2x1bW5NaW4gPT4gX2NvbHVtbk1pbjsKIAotCQkjcmVnaW9uIEV4Y2VsQ29sdW1uIFN0eWxlCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBTdHlsZSBhcHBsaWVkIHRvIHRoZSB3aG9sZSBjb2x1bW4uIE9ubHkgZWZmZWN0cyBjZWxscyB3aXRoIG5vIGluZGl2aWR1YWwgc3R5bGUgc2V0LiAKLSAgICAgICAgLy8vIFVzZSBSYW5nZSBvYmplY3QgaWYgeW91IHdhbnQgdG8gc2V0IHNwZWNpZmljIHN0eWxlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsU3R5bGUgU3R5bGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGxldHRlciA9IEV4Y2VsQ2VsbEJhc2UuR2V0Q29sdW1uTGV0dGVyKENvbHVtbk1pbik7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGVuZExldHRlciA9IEV4Y2VsQ2VsbEJhc2UuR2V0Q29sdW1uTGV0dGVyKENvbHVtbk1heCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuV29ya2Jvb2suU3R5bGVzLkdldFN0eWxlT2JqZWN0KFN0eWxlSUQsIF93b3Jrc2hlZXQuUG9zaXRpb25JRCwgbGV0dGVyICsgIjoiICsgZW5kTGV0dGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgX3N0eWxlTmFtZT0iIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotCQkvLy8gU2V0cyB0aGUgc3R5bGUgZm9yIHRoZSBlbnRpcmUgY29sdW1uIHVzaW5nIGEgc3R5bGUgbmFtZS4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIHN0cmluZyBTdHlsZU5hbWUKLQkJewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZU5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHlsZUlEID0gX3dvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXMuR2V0U3R5bGVJZEZyb21OYW1lKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBfc3R5bGVOYW1lID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0JCX0KLSAgICAgICAgLy9pbnRlcm5hbCBpbnQgX3N0eWxlSUQgPSAwOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXRzIHRoZSBzdHlsZSBmb3IgdGhlIGVudGlyZSBjb2x1bW4gdXNpbmcgdGhlIHN0eWxlIElELiAgCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgU3R5bGVJRAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5fc3R5bGVzLkdldFZhbHVlKDAsIENvbHVtbk1pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll9zdHlsZXMuU2V0VmFsdWUoMCwgQ29sdW1uTWluLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBhIG1hbnVhbCBwYWdlIGJyZWFrIGFmdGVyIHRoZSBjb2x1bW4uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFBhZ2VCcmVhawotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGJvb2wgTWVyZ2VkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfd29ya3NoZWV0Lk1lcmdlZENlbGxzW0NvbHVtbk1pbiwgMF0gIT0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuQWRkKG5ldyBFeGNlbEFkZHJlc3NCYXNlKDEsIENvbHVtbk1pbiwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIENvbHVtbk1heCksIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KKyAgLy9zZXQgeyBfY29sdW1uTWluPXZhbHVlOyB9CisgIGludGVybmFsIGludCBfY29sdW1uTWF4OwogCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFJldHVybnMgdGhlIHJhbmdlIG9mIGNvbHVtbnMgY292ZXJlZCBieSB0aGUgY29sdW1uIGRlZmluaXRpb24uCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cmV0dXJucz5BIHN0cmluZyBkZXNjcmliaW5nIHRoZSByYW5nZSBvZiBjb2x1bW5zIGNvdmVyZWQgYnkgdGhlIGNvbHVtbiBkZWZpbml0aW9uLjwvcmV0dXJucz4KLQkJcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCi0JCXsKLQkJCXJldHVybiBzdHJpbmcuRm9ybWF0KCJDb2x1bW4gUmFuZ2U6IHswfSB0byB7MX0iLCBfY29sRWxlbWVudC5HZXRBdHRyaWJ1dGUoIm1pbiIpLCBfY29sRWxlbWVudC5HZXRBdHRyaWJ1dGUoIm1pbiIpKTsKLQkJfQotICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0IHRoZSBpbnRlcm5hbCBSYW5nZUlECi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2hlZXRJRCI+U2hlZXQgbm88L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+Q29sdW1uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHVsb25nIEdldENvbHVtbklEKGludCBzaGVldElELCBpbnQgY29sdW1uKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKCh1bG9uZylzaGVldElEKSArICgoKHVsb25nKWNvbHVtbikgPDwgMTUpOwotICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNldHMgdGhlIGxhc3QgY29sdW1uIHRoZSBkZWZpbml0aW9uIHJlZmVycyB0by4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBDb2x1bW5NYXggeworICAgIGdldCA9PiBfY29sdW1uTWF4OworICAgIHNldCB7CisgICAgICBpZiAodmFsdWUgPCBfY29sdW1uTWluICYmIHZhbHVlID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpIHsKKyAgICAgICAgdGhyb3cgbmV3KCJDb2x1bW5NYXggb3V0IG9mIHJhbmdlIik7CisgICAgICB9CiAKLSAgICAgICAgI3JlZ2lvbiBJUmFuZ2VJRCBNZW1iZXJzCi0KLSAgICAgICAgdWxvbmcgSVJhbmdlSUQuUmFuZ2VJRAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29sdW1uSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgcHJldkNvbE1pbiA9IF9jb2x1bW5NaW47Ci0gICAgICAgICAgICAgICAgX2NvbHVtbk1pbiA9ICgoaW50KSh2YWx1ZSA+PiAxNSkgJiAweDNGRik7Ci0gICAgICAgICAgICAgICAgX2NvbHVtbk1heCArPSBwcmV2Q29sTWluIC0gQ29sdW1uTWluOwotICAgICAgICAgICAgICAgIC8vVG9kbzpNb3JlIFZhbGlkYXRpb24KLSAgICAgICAgICAgICAgICBpZiAoX2NvbHVtbk1heCA+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSBfY29sdW1uTWF4ID0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnM7Ci0gICAgICAgICAgICB9CisgICAgICB2YXIgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oCisgICAgICAgICAgX3dvcmtzaGVldC5fdmFsdWVzLAorICAgICAgICAgIDAsCisgICAgICAgICAgMCwKKyAgICAgICAgICAwLAorICAgICAgICAgIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICAgIHdoaWxlIChjc2UuTmV4dCgpKSB7CisgICAgICAgIHZhciBjID0gY3NlLlZhbHVlIGFzIEV4Y2VsQ29sdW1uOworICAgICAgICBpZiAoY3NlLkNvbHVtbiA+IF9jb2x1bW5NaW4gJiYgYy5Db2x1bW5NYXggPD0gdmFsdWUgJiYgY3NlLkNvbHVtbiAhPSBfY29sdW1uTWluKSB7CisgICAgICAgICAgdGhyb3cgbmV3KHN0cmluZy5Gb3JtYXQoIkNvbHVtbk1heCBjYW4gbm90IHNwYW4gb3ZlciBleGlzdGluZyBjb2x1bW4gezB9LiIsIGMuQ29sdW1uTWluKSk7CiAgICAgICAgIH0KLQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29waWVzIHRoZSBjdXJyZW50IGNvbHVtbiB0byBhIG5ldyB3b3Jrc2hlZXQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRlZCI+VGhlIHdvcmtzaGVldCB3aGVyZSB0aGUgY29weSB3aWxsIGJlIGNyZWF0ZWQ8L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBFeGNlbENvbHVtbiBDbG9uZShFeGNlbFdvcmtzaGVldCBhZGRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENsb25lKGFkZGVkLCBDb2x1bW5NaW4pOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsQ29sdW1uIENsb25lKEV4Y2VsV29ya3NoZWV0IGFkZGVkLCBpbnQgY29sKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeGNlbENvbHVtbiBuZXdDb2wgPSBhZGRlZC5Db2x1bW4oY29sKTsKLSAgICAgICAgICAgICAgICBuZXdDb2wuQ29sdW1uTWF4ID0gQ29sdW1uTWF4OwotICAgICAgICAgICAgICAgIG5ld0NvbC5CZXN0Rml0ID0gQmVzdEZpdDsKLSAgICAgICAgICAgICAgICBuZXdDb2wuQ29sbGFwc2VkID0gQ29sbGFwc2VkOwotICAgICAgICAgICAgICAgIG5ld0NvbC5PdXRsaW5lTGV2ZWwgPSBPdXRsaW5lTGV2ZWw7Ci0gICAgICAgICAgICAgICAgbmV3Q29sLlBhZ2VCcmVhayA9IFBhZ2VCcmVhazsKLSAgICAgICAgICAgICAgICBuZXdDb2wuUGhvbmV0aWMgPSBQaG9uZXRpYzsKLSAgICAgICAgICAgICAgICBuZXdDb2wuX3N0eWxlTmFtZSA9IF9zdHlsZU5hbWU7Ci0gICAgICAgICAgICAgICAgbmV3Q29sLlN0eWxlSUQgPSBTdHlsZUlEOwotICAgICAgICAgICAgICAgIG5ld0NvbC5XaWR0aCA9IFdpZHRoOwotICAgICAgICAgICAgICAgIG5ld0NvbC5IaWRkZW4gPSBIaWRkZW47Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ld0NvbDsKLSAgICAgICAgfQorICAgICAgfQorICAgICAgX2NvbHVtbk1heCA9IHZhbHVlOwogICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEludGVybmFsIHJhbmdlIGlkIGZvciB0aGUgY29sdW1uCisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIHVsb25nIENvbHVtbklEID0+IEdldENvbHVtbklkKF93b3Jrc2hlZXQuU2hlZXRJRCwgQ29sdW1uTWluKTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBbGxvd3MgdGhlIGNvbHVtbiB0byBiZSBoaWRkZW4gaW4gdGhlIHdvcmtzaGVldAorICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCBib29sIF9oaWRkZW47CisgIHB1YmxpYyBib29sIEhpZGRlbiB7CisgICAgZ2V0ID0+IF9oaWRkZW47CisgICAgc2V0ID0+IF9oaWRkZW4gPSB2YWx1ZTsKKyAgfQorCisgIGludGVybmFsIGRvdWJsZSBWaXN1YWxXaWR0aCB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfaGlkZGVuIHx8IChDb2xsYXBzZWQgJiYgT3V0bGluZUxldmVsID4gMCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByZXR1cm4gX3dpZHRoOworICAgIH0KKyAgfQorICBpbnRlcm5hbCBkb3VibGUgX3dpZHRoOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBjb2x1bW4gaW4gdGhlIHdvcmtzaGVldAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZG91YmxlIFdpZHRoIHsKKyAgICBnZXQgPT4gX3dpZHRoOworICAgIHNldCB7CisgICAgICBfd2lkdGggPSB2YWx1ZTsKKworICAgICAgaWYgKF9oaWRkZW4gJiYgdmFsdWUgIT0gMCkgeworICAgICAgICBfaGlkZGVuID0gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgc2V0IHRvIHRydWUgYSBjb2x1bW4gYXV0b21hdGljbGx5IHJlc2l6ZShncm93IHdpZGVyKSB3aGVuIGEgdXNlciBpbnB1dHMgbnVtYmVycyBpbiBhIGNlbGwuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIEJlc3RGaXQgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElmIHRoZSBjb2x1bW4gaXMgY29sbGFwc2VkIGluIG91dGxpbmUgbW9kZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBDb2xsYXBzZWQgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE91dGxpbmUgbGV2ZWwuIFplcm8gaWYgbm8gb3V0bGluZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IE91dGxpbmVMZXZlbCB7IGdldDsgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUGhvbmV0aWMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgUGhvbmV0aWMgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBTdHlsZSBhcHBsaWVkIHRvIHRoZSB3aG9sZSBjb2x1bW4uIE9ubHkgZWZmZWN0cyBjZWxscyB3aXRoIG5vIGluZGl2aWR1YWwgc3R5bGUgc2V0LgorICAvLy8gVXNlIFJhbmdlIG9iamVjdCBpZiB5b3Ugd2FudCB0byBzZXQgc3BlY2lmaWMgc3R5bGVzLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxTdHlsZSBTdHlsZSB7CisgICAgZ2V0IHsKKyAgICAgIHN0cmluZyBsZXR0ZXIgPSBFeGNlbENlbGxCYXNlLkdldENvbHVtbkxldHRlcihDb2x1bW5NaW4pOworICAgICAgc3RyaW5nIGVuZExldHRlciA9IEV4Y2VsQ2VsbEJhc2UuR2V0Q29sdW1uTGV0dGVyKENvbHVtbk1heCk7CisgICAgICByZXR1cm4gX3dvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXMuR2V0U3R5bGVPYmplY3QoCisgICAgICAgICAgU3R5bGVJRCwKKyAgICAgICAgICBfd29ya3NoZWV0LlBvc2l0aW9uSUQsCisgICAgICAgICAgbGV0dGVyICsgIjoiICsgZW5kTGV0dGVyKTsKKyAgICB9CisgIH0KKyAgaW50ZXJuYWwgc3RyaW5nIF9zdHlsZU5hbWUgPSAiIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTZXRzIHRoZSBzdHlsZSBmb3IgdGhlIGVudGlyZSBjb2x1bW4gdXNpbmcgYSBzdHlsZSBuYW1lLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIFN0eWxlTmFtZSB7CisgICAgZ2V0ID0+IF9zdHlsZU5hbWU7CisgICAgc2V0IHsKKyAgICAgIFN0eWxlSUQgPSBfd29ya3NoZWV0Lldvcmtib29rLlN0eWxlcy5HZXRTdHlsZUlkRnJvbU5hbWUodmFsdWUpOworICAgICAgX3N0eWxlTmFtZSA9IHZhbHVlOworICAgIH0KKyAgfQorCisgIC8vaW50ZXJuYWwgaW50IF9zdHlsZUlEID0gMDsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2V0cyB0aGUgc3R5bGUgZm9yIHRoZSBlbnRpcmUgY29sdW1uIHVzaW5nIHRoZSBzdHlsZSBJRC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBTdHlsZUlEIHsKKyAgICBnZXQgPT4gX3dvcmtzaGVldC5fc3R5bGVzLkdldFZhbHVlKDAsIENvbHVtbk1pbik7CisgICAgc2V0ID0+IF93b3Jrc2hlZXQuX3N0eWxlcy5TZXRWYWx1ZSgwLCBDb2x1bW5NaW4sIHZhbHVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBtYW51YWwgcGFnZSBicmVhayBhZnRlciB0aGUgY29sdW1uLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBQYWdlQnJlYWsgeyBnZXQ7IHNldDsgfQorICBwdWJsaWMgYm9vbCBNZXJnZWQgeworICAgIGdldCA9PiBfd29ya3NoZWV0Lk1lcmdlZENlbGxzW0NvbHVtbk1pbiwgMF0gIT0gbnVsbDsKKyAgICBzZXQgPT4gX3dvcmtzaGVldC5NZXJnZWRDZWxscy5BZGQobmV3KDEsIENvbHVtbk1pbiwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIENvbHVtbk1heCksIHRydWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgY29sdW1ucyBjb3ZlcmVkIGJ5IHRoZSBjb2x1bW4gZGVmaW5pdGlvbi4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPkEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHJhbmdlIG9mIGNvbHVtbnMgY292ZXJlZCBieSB0aGUgY29sdW1uIGRlZmluaXRpb24uPC9yZXR1cm5zPgorICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeworICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KAorICAgICAgICAiQ29sdW1uIFJhbmdlOiB7MH0gdG8gezF9IiwKKyAgICAgICAgX2NvbEVsZW1lbnQuR2V0QXR0cmlidXRlKCJtaW4iKSwKKyAgICAgICAgX2NvbEVsZW1lbnQuR2V0QXR0cmlidXRlKCJtaW4iKSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXQgdGhlIGludGVybmFsIFJhbmdlSUQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJzaGVldElkIj5TaGVldCBubzwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1uIj5Db2x1bW48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBpbnRlcm5hbCBzdGF0aWMgdWxvbmcgR2V0Q29sdW1uSWQoaW50IHNoZWV0SWQsIGludCBjb2x1bW4pIHsKKyAgICByZXR1cm4gKCh1bG9uZylzaGVldElkKSArICgoKHVsb25nKWNvbHVtbikgPDwgMTUpOworICB9CisKKyAgdWxvbmcgSVJhbmdlSWQuUmFuZ2VJRCB7CisgICAgZ2V0ID0+IENvbHVtbklEOworICAgIHNldCB7CisgICAgICBpbnQgcHJldkNvbE1pbiA9IF9jb2x1bW5NaW47CisgICAgICBfY29sdW1uTWluID0gKChpbnQpKHZhbHVlID4+IDE1KSAmIDB4M0ZGKTsKKyAgICAgIF9jb2x1bW5NYXggKz0gcHJldkNvbE1pbiAtIENvbHVtbk1pbjsKKyAgICAgIC8vVG9kbzpNb3JlIFZhbGlkYXRpb24KKyAgICAgIGlmIChfY29sdW1uTWF4ID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpIHsKKyAgICAgICAgX2NvbHVtbk1heCA9IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENvcGllcyB0aGUgY3VycmVudCBjb2x1bW4gdG8gYSBuZXcgd29ya3NoZWV0CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkZWQiPlRoZSB3b3Jrc2hlZXQgd2hlcmUgdGhlIGNvcHkgd2lsbCBiZSBjcmVhdGVkPC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxDb2x1bW4gQ2xvbmUoRXhjZWxXb3Jrc2hlZXQgYWRkZWQpIHsKKyAgICByZXR1cm4gQ2xvbmUoYWRkZWQsIENvbHVtbk1pbik7CisgIH0KKworICBpbnRlcm5hbCBFeGNlbENvbHVtbiBDbG9uZShFeGNlbFdvcmtzaGVldCBhZGRlZCwgaW50IGNvbCkgeworICAgIEV4Y2VsQ29sdW1uIG5ld0NvbCA9IGFkZGVkLkNvbHVtbihjb2wpOworICAgIG5ld0NvbC5Db2x1bW5NYXggPSBDb2x1bW5NYXg7CisgICAgbmV3Q29sLkJlc3RGaXQgPSBCZXN0Rml0OworICAgIG5ld0NvbC5Db2xsYXBzZWQgPSBDb2xsYXBzZWQ7CisgICAgbmV3Q29sLk91dGxpbmVMZXZlbCA9IE91dGxpbmVMZXZlbDsKKyAgICBuZXdDb2wuUGFnZUJyZWFrID0gUGFnZUJyZWFrOworICAgIG5ld0NvbC5QaG9uZXRpYyA9IFBob25ldGljOworICAgIG5ld0NvbC5fc3R5bGVOYW1lID0gX3N0eWxlTmFtZTsKKyAgICBuZXdDb2wuU3R5bGVJRCA9IFN0eWxlSUQ7CisgICAgbmV3Q29sLldpZHRoID0gV2lkdGg7CisgICAgbmV3Q29sLkhpZGRlbiA9IEhpZGRlbjsKKyAgICByZXR1cm4gbmV3Q29sOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxDb21tZW50LmNzIGIvRVBQbHVzL0V4Y2VsQ29tbWVudC5jcwppbmRleCBlMjVlN2Q4Li5hY2Q0MmFkIDEwMDY0NAotLS0gYS9FUFBsdXMvRXhjZWxDb21tZW50LmNzCisrKyBiL0VQUGx1cy9FeGNlbENvbW1lbnQuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDEzOSArMTMsMTM0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQlJbml0aWFsIFJlbGVhc2UJCSAgICAgCisgKiBKYW4gS8OkbGxtYW4JCUluaXRpYWwgUmVsZWFzZQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7CisKIHVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmc7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuVm1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFuIEV4Y2VsIENlbGwgQ29tbWVudAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsQ29tbWVudCA6IEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnQKLSAgICB7Ci0gICAgICAgIGludGVybmFsIFhtbEhlbHBlciBfY29tbWVudEhlbHBlcjsKLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgX3RleHQ7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsQ29tbWVudChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIGNvbW1lbnRUb3BOb2RlLCBFeGNlbFJhbmdlQmFzZSBjZWxsKQotICAgICAgICAgICAgOiBiYXNlKG51bGwsIGNlbGwsIGNlbGwuV29ya3NoZWV0LlZtbERyYXdpbmdzQ29tbWVudHMuTmFtZVNwYWNlTWFuYWdlcikKLSAgICAgICAgewotICAgICAgICAgICAgLy9fY29tbWVudEhlbHBlciA9IG5ldyBYbWxIZWxwZXIobnMsIGNvbW1lbnRUb3BOb2RlKTsKLSAgICAgICAgICAgIF9jb21tZW50SGVscGVyID0gWG1sSGVscGVyRmFjdG9yeS5DcmVhdGUobnMsIGNvbW1lbnRUb3BOb2RlKTsKLSAgICAgICAgICAgIHZhciB0ZXh0RWxlbT1jb21tZW50VG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOnRleHQiLCBucyk7Ci0gICAgICAgICAgICBpZiAodGV4dEVsZW0gPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0ZXh0RWxlbSA9IGNvbW1lbnRUb3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgidGV4dCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgICAgICBjb21tZW50VG9wTm9kZS5BcHBlbmRDaGlsZCh0ZXh0RWxlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNlbGwuV29ya3NoZWV0Ll92bWxEcmF3aW5ncy5Db250YWluc0tleShFeGNlbEFkZHJlc3MuR2V0Q2VsbElEKGNlbGwuV29ya3NoZWV0LlNoZWV0SUQsIGNlbGwuU3RhcnQuUm93LCBjZWxsLlN0YXJ0LkNvbHVtbikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNlbGwuV29ya3NoZWV0Ll92bWxEcmF3aW5ncy5BZGQoY2VsbCk7Ci0gICAgICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbDsKIAotICAgICAgICAgICAgVG9wTm9kZSA9IGNlbGwuV29ya3NoZWV0LlZtbERyYXdpbmdzQ29tbWVudHNbRXhjZWxDZWxsQmFzZS5HZXRDZWxsSUQoY2VsbC5Xb3Jrc2hlZXQuU2hlZXRJRCwgY2VsbC5TdGFydC5Sb3csIGNlbGwuU3RhcnQuQ29sdW1uKV0uVG9wTm9kZTsKLSAgICAgICAgICAgIFJpY2hUZXh0ID0gbmV3IEV4Y2VsUmljaFRleHRDb2xsZWN0aW9uKG5zLHRleHRFbGVtKTsKLSAgICAgICAgICAgIHZhciB0Tm9kZSA9IHRleHRFbGVtLlNlbGVjdFNpbmdsZU5vZGUoImQ6dCIsIG5zKTsKLSAgICAgICAgICAgIGlmICh0Tm9kZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF90ZXh0ID0gdE5vZGUuSW5uZXJUZXh0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBBVVRIT1JTX1BBVEggPSAiZDpjb21tZW50cy9kOmF1dGhvcnMiOwotICAgICAgICBjb25zdCBzdHJpbmcgQVVUSE9SX1BBVEggPSAiZDpjb21tZW50cy9kOmF1dGhvcnMvZDphdXRob3IiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBdXRob3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBBdXRob3IKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGF1dGhvclJlZiA9IF9jb21tZW50SGVscGVyLkdldFhtbE5vZGVJbnQoIkBhdXRob3JJZCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBfY29tbWVudEhlbHBlci5Ub3BOb2RlLk93bmVyRG9jdW1lbnQuU2VsZWN0U2luZ2xlTm9kZShzdHJpbmcuRm9ybWF0KCJ7MH1bezF9XSIsIEFVVEhPUl9QQVRILCBhdXRob3JSZWYrMSksIF9jb21tZW50SGVscGVyLk5hbWVTcGFjZU1hbmFnZXIpLklubmVyVGV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBhdXRob3JSZWYgPSBHZXRBdXRob3IodmFsdWUpOwotICAgICAgICAgICAgICAgIF9jb21tZW50SGVscGVyLlNldFhtbE5vZGVTdHJpbmcoIkBhdXRob3JJZCIsIGF1dGhvclJlZi5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIGludCBHZXRBdXRob3Ioc3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYXV0aG9yUmVmID0gMDsKLSAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgbm9kZSBpbiBfY29tbWVudEhlbHBlci5Ub3BOb2RlLk93bmVyRG9jdW1lbnQuU2VsZWN0Tm9kZXMoQVVUSE9SX1BBVEgsIF9jb21tZW50SGVscGVyLk5hbWVTcGFjZU1hbmFnZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChub2RlLklubmVyVGV4dCA9PSB2YWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF1dGhvclJlZisrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmb3VuZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZWxlbSA9IF9jb21tZW50SGVscGVyLlRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJkIiwgImF1dGhvciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgICAgICBfY29tbWVudEhlbHBlci5Ub3BOb2RlLk93bmVyRG9jdW1lbnQuU2VsZWN0U2luZ2xlTm9kZShBVVRIT1JTX1BBVEgsIF9jb21tZW50SGVscGVyLk5hbWVTcGFjZU1hbmFnZXIpLkFwcGVuZENoaWxkKGVsZW0pOwotICAgICAgICAgICAgICAgIGVsZW0uSW5uZXJUZXh0ID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYXV0aG9yUmVmOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBjb21tZW50IHRleHQgCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVGV4dAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZighc3RyaW5nLklzTnVsbE9yRW1wdHkoUmljaFRleHQuVGV4dCkpIHJldHVybiBSaWNoVGV4dC5UZXh0OwotICAgICAgICAgICAgICAgIHJldHVybiBfdGV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJpY2hUZXh0LlRleHQgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXRzIHRoZSBmb250IG9mIHRoZSBmaXJzdCByaWNodGV4dCBpdGVtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxSaWNoVGV4dCBGb250Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChSaWNoVGV4dC5Db3VudCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmljaFRleHRbMF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJpY2h0ZXh0IGNvbGxlY3Rpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsUmljaFRleHRDb2xsZWN0aW9uIFJpY2hUZXh0IAotICAgICAgICB7IAotICAgICAgICAgICBnZXQ7IAotICAgICAgICAgICBzZXQ7IAotICAgICAgICB9CisvLy8gPHN1bW1hcnk+CisvLy8gQW4gRXhjZWwgQ2VsbCBDb21tZW50CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsQ29tbWVudCA6IEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnQgeworICBpbnRlcm5hbCBYbWxIZWxwZXIgX2NvbW1lbnRIZWxwZXI7CisgIHByaXZhdGUgc3RyaW5nIF90ZXh0OworCisgIGludGVybmFsIEV4Y2VsQ29tbWVudChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIGNvbW1lbnRUb3BOb2RlLCBFeGNlbFJhbmdlQmFzZSBjZWxsKQorICAgICAgOiBiYXNlKG51bGwsIGNlbGwsIGNlbGwuV29ya3NoZWV0LlZtbERyYXdpbmdzQ29tbWVudHMuTmFtZVNwYWNlTWFuYWdlcikgeworICAgIC8vX2NvbW1lbnRIZWxwZXIgPSBuZXcgWG1sSGVscGVyKG5zLCBjb21tZW50VG9wTm9kZSk7CisgICAgX2NvbW1lbnRIZWxwZXIgPSBYbWxIZWxwZXJGYWN0b3J5LkNyZWF0ZShucywgY29tbWVudFRvcE5vZGUpOworICAgIHZhciB0ZXh0RWxlbSA9IGNvbW1lbnRUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6dGV4dCIsIG5zKTsKKyAgICBpZiAodGV4dEVsZW0gPT0gbnVsbCkgeworICAgICAgdGV4dEVsZW0gPSBjb21tZW50VG9wTm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoInRleHQiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgY29tbWVudFRvcE5vZGUuQXBwZW5kQ2hpbGQodGV4dEVsZW0pOwogICAgIH0KKyAgICBpZiAoIWNlbGwuV29ya3NoZWV0Ll92bWxEcmF3aW5ncy5Db250YWluc0tleSgKKyAgICAgICAgRXhjZWxDZWxsQmFzZS5HZXRDZWxsSWQoY2VsbC5Xb3Jrc2hlZXQuU2hlZXRJRCwgY2VsbC5TdGFydC5Sb3csIGNlbGwuU3RhcnQuQ29sdW1uKSkpIHsKKyAgICAgIGNlbGwuV29ya3NoZWV0Ll92bWxEcmF3aW5ncy5BZGQoY2VsbCk7CisgICAgfQorCisgICAgVG9wTm9kZSA9IGNlbGwuV29ya3NoZWV0LlZtbERyYXdpbmdzQ29tbWVudHNbRXhjZWxDZWxsQmFzZS5HZXRDZWxsSWQoCisgICAgICAgICAgY2VsbC5Xb3Jrc2hlZXQuU2hlZXRJRCwKKyAgICAgICAgICBjZWxsLlN0YXJ0LlJvdywKKyAgICAgICAgICBjZWxsLlN0YXJ0LkNvbHVtbildLlRvcE5vZGU7CisgICAgUmljaFRleHQgPSBuZXcobnMsIHRleHRFbGVtKTsKKyAgICB2YXIgdE5vZGUgPSB0ZXh0RWxlbS5TZWxlY3RTaW5nbGVOb2RlKCJkOnQiLCBucyk7CisgICAgaWYgKHROb2RlICE9IG51bGwpIHsKKyAgICAgIF90ZXh0ID0gdE5vZGUuSW5uZXJUZXh0OworICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9hdXRob3JzUGF0aCA9ICJkOmNvbW1lbnRzL2Q6YXV0aG9ycyI7CisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9hdXRob3JQYXRoID0gImQ6Y29tbWVudHMvZDphdXRob3JzL2Q6YXV0aG9yIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBdXRob3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBBdXRob3IgeworICAgIGdldCB7CisgICAgICBpbnQgYXV0aG9yUmVmID0gX2NvbW1lbnRIZWxwZXIuR2V0WG1sTm9kZUludCgiQGF1dGhvcklkIik7CisgICAgICByZXR1cm4gX2NvbW1lbnRIZWxwZXIuVG9wTm9kZS5Pd25lckRvY3VtZW50CisgICAgICAgICAgLlNlbGVjdFNpbmdsZU5vZGUoCisgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoInswfVt7MX1dIiwgX2F1dGhvclBhdGgsIGF1dGhvclJlZiArIDEpLAorICAgICAgICAgICAgICBfY29tbWVudEhlbHBlci5OYW1lU3BhY2VNYW5hZ2VyKQorICAgICAgICAgIC5Jbm5lclRleHQ7CisgICAgfQorICAgIHNldCB7CisgICAgICBpbnQgYXV0aG9yUmVmID0gR2V0QXV0aG9yKHZhbHVlKTsKKyAgICAgIF9jb21tZW50SGVscGVyLlNldFhtbE5vZGVTdHJpbmcoIkBhdXRob3JJZCIsIGF1dGhvclJlZi5Ub1N0cmluZygpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGludCBHZXRBdXRob3Ioc3RyaW5nIHZhbHVlKSB7CisgICAgaW50IGF1dGhvclJlZiA9IDA7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgbm9kZSBpbiBfY29tbWVudEhlbHBlci5Ub3BOb2RlLk93bmVyRG9jdW1lbnQuU2VsZWN0Tm9kZXMoCisgICAgICAgIF9hdXRob3JQYXRoLAorICAgICAgICBfY29tbWVudEhlbHBlci5OYW1lU3BhY2VNYW5hZ2VyKSkgeworICAgICAgaWYgKG5vZGUuSW5uZXJUZXh0ID09IHZhbHVlKSB7CisgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBhdXRob3JSZWYrKzsKKyAgICB9CisgICAgaWYgKCFmb3VuZCkgeworICAgICAgdmFyIGVsZW0gPSBfY29tbWVudEhlbHBlci5Ub3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgKKyAgICAgICAgICAiZCIsCisgICAgICAgICAgImF1dGhvciIsCisgICAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKTsKKyAgICAgIF9jb21tZW50SGVscGVyLlRvcE5vZGUuT3duZXJEb2N1bWVudAorICAgICAgICAgIC5TZWxlY3RTaW5nbGVOb2RlKF9hdXRob3JzUGF0aCwgX2NvbW1lbnRIZWxwZXIuTmFtZVNwYWNlTWFuYWdlcikKKyAgICAgICAgICAuQXBwZW5kQ2hpbGQoZWxlbSk7CisgICAgICBlbGVtLklubmVyVGV4dCA9IHZhbHVlOworICAgIH0KKyAgICByZXR1cm4gYXV0aG9yUmVmOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIGNvbW1lbnQgdGV4dAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIFRleHQgeworICAgIGdldCB7CisgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KFJpY2hUZXh0LlRleHQpKSB7CisgICAgICAgIHJldHVybiBSaWNoVGV4dC5UZXh0OworICAgICAgfQorICAgICAgcmV0dXJuIF90ZXh0OworICAgIH0KKyAgICBzZXQgPT4gUmljaFRleHQuVGV4dCA9IHZhbHVlOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2V0cyB0aGUgZm9udCBvZiB0aGUgZmlyc3QgcmljaHRleHQgaXRlbS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsUmljaFRleHQgRm9udCB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChSaWNoVGV4dC5Db3VudCA+IDApIHsKKyAgICAgICAgcmV0dXJuIFJpY2hUZXh0WzBdOworICAgICAgfQorICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmljaHRleHQgY29sbGVjdGlvbgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxSaWNoVGV4dENvbGxlY3Rpb24gUmljaFRleHQgeyBnZXQ7IHNldDsgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsQ29tbWVudENvbGxlY3Rpb24uY3MgYi9FUFBsdXMvRXhjZWxDb21tZW50Q29sbGVjdGlvbi5jcwppbmRleCBjZjBhNTQwLi5iNGE2MGFmIDEwMDY0NAotLS0gYS9FUFBsdXMvRXhjZWxDb21tZW50Q29sbGVjdGlvbi5jcworKysgYi9FUFBsdXMvRXhjZWxDb21tZW50Q29sbGVjdGlvbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMjIzICsxMywyMDQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBDb2xsZWN0aW9uIG9mIEV4Y2VsY29tbWVudCBvYmplY3RzCi0gICAgLy8vIDwvc3VtbWFyeT4gIAotICAgIHB1YmxpYyBjbGFzcyBFeGNlbENvbW1lbnRDb2xsZWN0aW9uIDogSUVudW1lcmFibGUsIElEaXNwb3NhYmxlCi0gICAgewotICAgICAgICBpbnRlcm5hbCBSYW5nZUNvbGxlY3Rpb24gX2NvbW1lbnRzOwotICAgICAgICBpbnRlcm5hbCBFeGNlbENvbW1lbnRDb2xsZWN0aW9uKEV4Y2VsUGFja2FnZSBwY2ssIEV4Y2VsV29ya3NoZWV0IHdzLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb21tZW50WG1sID0gbmV3IFhtbERvY3VtZW50KCk7Ci0gICAgICAgICAgICBDb21tZW50WG1sLlByZXNlcnZlV2hpdGVzcGFjZSA9IGZhbHNlOwotICAgICAgICAgICAgTmFtZVNwYWNlTWFuYWdlcj1uczsKLSAgICAgICAgICAgIFdvcmtzaGVldD13czsKLSAgICAgICAgICAgIENyZWF0ZVhtbChwY2spOwotICAgICAgICAgICAgQWRkQ29tbWVudHNGcm9tWG1sKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIENyZWF0ZVhtbChFeGNlbFBhY2thZ2UgcGNrKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgY29tbWVudFBhcnRzID0gV29ya3NoZWV0LlBhcnQuR2V0UmVsYXRpb25zaGlwc0J5VHlwZShFeGNlbFBhY2thZ2Uuc2NoZW1hQ29tbWVudCk7Ci0gICAgICAgICAgICBib29sIGlzTG9hZGVkPWZhbHNlOwotICAgICAgICAgICAgQ29tbWVudFhtbD1uZXcgWG1sRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGZvcmVhY2godmFyIGNvbW1lbnRQYXJ0IGluIGNvbW1lbnRQYXJ0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBVcmkgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkoY29tbWVudFBhcnQuU291cmNlVXJpLCBjb21tZW50UGFydC5UYXJnZXRVcmkpOwotICAgICAgICAgICAgICAgIFBhcnQgPSBwY2suUGFja2FnZS5HZXRQYXJ0KFVyaSk7Ci0gICAgICAgICAgICAgICAgWG1sSGVscGVyLkxvYWRYbWxTYWZlKENvbW1lbnRYbWwsIFBhcnQuR2V0U3RyZWFtKCkpOyAKLSAgICAgICAgICAgICAgICBSZWxJZCA9IGNvbW1lbnRQYXJ0LklkOwotICAgICAgICAgICAgICAgIGlzTG9hZGVkPXRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0NyZWF0ZSBhIG5ldyBkb2N1bWVudAotICAgICAgICAgICAgaWYoIWlzTG9hZGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbW1lbnRYbWwuTG9hZFhtbCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCIgPz48Y29tbWVudHMgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW5cIj48YXV0aG9ycyAvPjxjb21tZW50TGlzdCAvPjwvY29tbWVudHM+Iik7Ci0gICAgICAgICAgICAgICAgVXJpID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgQWRkQ29tbWVudHNGcm9tWG1sKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGxzdCA9IG5ldyBMaXN0PElSYW5nZUlEPigpOwotICAgICAgICAgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBub2RlIGluIENvbW1lbnRYbWwuU2VsZWN0Tm9kZXMoIi8vZDpjb21tZW50TGlzdC9kOmNvbW1lbnQiLCBOYW1lU3BhY2VNYW5hZ2VyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgY29tbWVudCA9IG5ldyBFeGNlbENvbW1lbnQoTmFtZVNwYWNlTWFuYWdlciwgbm9kZSwgbmV3IEV4Y2VsUmFuZ2VCYXNlKFdvcmtzaGVldCwgbm9kZS5HZXRBdHRyaWJ1dGUoInJlZiIpKSk7Ci0gICAgICAgICAgICAgICAgbHN0LkFkZChjb21tZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9jb21tZW50cyA9IG5ldyBSYW5nZUNvbGxlY3Rpb24obHN0KTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBY2Nlc3MgdG8gdGhlIGNvbW1lbnQgeG1sIGRvY3VtZW50Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBYbWxEb2N1bWVudCBDb21tZW50WG1sIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgaW50ZXJuYWwgVXJpIFVyaSB7IGdldDsgc2V0OyB9Ci0gICAgICAgIGludGVybmFsIHN0cmluZyBSZWxJZCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIGludGVybmFsIFhtbE5hbWVzcGFjZU1hbmFnZXIgTmFtZVNwYWNlTWFuYWdlciB7IGdldDsgc2V0OyB9Ci0gICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBQYXJ0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgd29ya3NoZWV0IG9iamVjdAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxXb3Jrc2hlZXQgV29ya3NoZWV0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBOdW1iZXIgb2YgY29tbWVudHMgaW4gdGhlIGNvbGxlY3Rpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBDb3VudAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2NvbW1lbnRzLkNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluZGV4ZXIgZm9yIHRoZSBjb21tZW50cyBjb2xsZWN0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iSW5kZXgiPlRoZSBpbmRleDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgY29tbWVudDwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIEV4Y2VsQ29tbWVudCB0aGlzW2ludCBJbmRleF0KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEluZGV4IDwgMCB8fCBJbmRleCA+PSBfY29tbWVudHMuQ291bnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJDb21tZW50IGluZGV4IG91dCBvZiByYW5nZSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9jb21tZW50c1tJbmRleF0gYXMgRXhjZWxDb21tZW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluZGV4ZXIgZm9yIHRoZSBjb21tZW50cyBjb2xsZWN0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2VsbCI+VGhlIGNlbGw8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIGNvbW1lbnQ8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENvbW1lbnQgdGhpc1tFeGNlbENlbGxBZGRyZXNzIGNlbGxdCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVsb25nIGNlbGxJRD1FeGNlbENlbGxCYXNlLkdldENlbGxJRChXb3Jrc2hlZXQuU2hlZXRJRCwgY2VsbC5Sb3csIGNlbGwuQ29sdW1uKTsKLSAgICAgICAgICAgICAgICBpZiAoX2NvbW1lbnRzLkluZGV4T2YoY2VsbElEKSA+PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb21tZW50c1tjZWxsSURdIGFzIEV4Y2VsQ29tbWVudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHMgYSBjb21tZW50IHRvIHRoZSB0b3AgbGVmdCBjZWxsIG9mIHRoZSByYW5nZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlbGwiPlRoZSBjZWxsPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJUZXh0Ij5UaGUgY29tbWVudCB0ZXh0PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhdXRob3IiPkF1dGhvcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgY29tbWVudDwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIEV4Y2VsQ29tbWVudCBBZGQoRXhjZWxSYW5nZUJhc2UgY2VsbCwgc3RyaW5nIFRleHQsIHN0cmluZyBhdXRob3IpCi0gICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIHZhciBlbGVtID0gQ29tbWVudFhtbC5DcmVhdGVFbGVtZW50KCJjb21tZW50IiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotICAgICAgICAgICAgaW50IGl4PV9jb21tZW50cy5JbmRleE9mKEV4Y2VsQWRkcmVzcy5HZXRDZWxsSUQoV29ya3NoZWV0LlNoZWV0SUQsIGNlbGwuX2Zyb21Sb3csIGNlbGwuX2Zyb21Db2wpKTsKLSAgICAgICAgICAgIC8vTWFrZSBzdXJlIHRoZSBub2RlcyBjb21lIG9uIG9yZGVyLgotICAgICAgICAgICAgaWYgKGl4IDwgMCAmJiAofml4IDwgX2NvbW1lbnRzLkNvdW50KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpeCA9IH5peDsKLSAgICAgICAgICAgICAgICB2YXIgcHJlQ29tbWVudCA9IF9jb21tZW50c1tpeF0gYXMgRXhjZWxDb21tZW50OwotICAgICAgICAgICAgICAgIHByZUNvbW1lbnQuX2NvbW1lbnRIZWxwZXIuVG9wTm9kZS5QYXJlbnROb2RlLkluc2VydEJlZm9yZShlbGVtLCBwcmVDb21tZW50Ll9jb21tZW50SGVscGVyLlRvcE5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbW1lbnRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiZDpjb21tZW50cy9kOmNvbW1lbnRMaXN0IiwgTmFtZVNwYWNlTWFuYWdlcikuQXBwZW5kQ2hpbGQoZWxlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbGVtLlNldEF0dHJpYnV0ZSgicmVmIiwgY2VsbC5TdGFydC5BZGRyZXNzKTsKLSAgICAgICAgICAgIEV4Y2VsQ29tbWVudCBjb21tZW50ID0gbmV3IEV4Y2VsQ29tbWVudChOYW1lU3BhY2VNYW5hZ2VyLCBlbGVtICwgY2VsbCk7Ci0gICAgICAgICAgICBjb21tZW50LlJpY2hUZXh0LkFkZChUZXh0KTsKLSAgICAgICAgICAgIGlmKGF1dGhvciE9IiIpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbW1lbnQuQXV0aG9yPWF1dGhvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9jb21tZW50cy5BZGQoY29tbWVudCk7Ci0gICAgICAgICAgICAvL0NoZWNrIGlmIGEgdmFsdWUgZXhpc3RzIG90aGVyd2lzZSBhZGQgb25lIHNvIGl0IGlzIHNhdmVkIHdoZW4gdGhlIGNlbGxzIGNvbGxlY3Rpb24gaXMgaXRlcmF0ZWQKLSAgICAgICAgICAgIGlmICghV29ya3NoZWV0Ll92YWx1ZXMuRXhpc3RzKGNlbGwuX2Zyb21Sb3csIGNlbGwuX2Zyb21Db2wpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFdvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKGNlbGwuX2Zyb21Sb3csIGNlbGwuX2Zyb21Db2wsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVtb3ZlcyB0aGUgY29tbWVudAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbW1lbnQiPlRoZSBjb21tZW50IHRvIHJlbW92ZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZShFeGNlbENvbW1lbnQgY29tbWVudCkKLSAgICAgICAgewotICAgICAgICAgICAgdWxvbmcgaWQgPSBFeGNlbEFkZHJlc3MuR2V0Q2VsbElEKFdvcmtzaGVldC5TaGVldElELCBjb21tZW50LlJhbmdlLl9mcm9tUm93LCBjb21tZW50LlJhbmdlLl9mcm9tQ29sKTsKLSAgICAgICAgICAgIGludCBpeD1fY29tbWVudHMuSW5kZXhPZihpZCk7Ci0gICAgICAgICAgICBpZiAoaXggPj0gMCAmJiBjb21tZW50ID09IF9jb21tZW50c1tpeF0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29tbWVudC5Ub3BOb2RlLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQoY29tbWVudC5Ub3BOb2RlKTsgLy9SZW1vdmUgVk1MCi0gICAgICAgICAgICAgICAgY29tbWVudC5fY29tbWVudEhlbHBlci5Ub3BOb2RlLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQoY29tbWVudC5fY29tbWVudEhlbHBlci5Ub3BOb2RlKTsgLy9SZW1vdmUgQ29tbWVudAogCi0gICAgICAgICAgICAgICAgV29ya3NoZWV0LlZtbERyYXdpbmdzQ29tbWVudHMuX2RyYXdpbmdzLkRlbGV0ZShpZCk7Ci0gICAgICAgICAgICAgICAgX2NvbW1lbnRzLkRlbGV0ZShpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ29tbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgd29ya3NoZWV0IikpOwotICAgICAgICAgICAgfQotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbDsKIAotICAgICAgICB2b2lkIElEaXNwb3NhYmxlLkRpc3Bvc2UoKSB7IH0gCi0gICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZW1vdmVzIHRoZSBjb21tZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJbmRleCI+VGhlIGluZGV4PC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlQXQoaW50IEluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBSZW1vdmUodGhpc1tJbmRleF0pOwotICAgICAgICB9Ci0gICAgICAgICNyZWdpb24gSUVudW1lcmFibGUgTWVtYmVycworLy8vIDxzdW1tYXJ5PgorLy8vIENvbGxlY3Rpb24gb2YgRXhjZWxjb21tZW50IG9iamVjdHMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDb21tZW50Q29sbGVjdGlvbiA6IElFbnVtZXJhYmxlLCBJRGlzcG9zYWJsZSB7CisgIGludGVybmFsIFJhbmdlQ29sbGVjdGlvbiBfY29tbWVudHM7CiAKLSAgICAgICAgSUVudW1lcmF0b3IgSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY29tbWVudHM7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgorICBpbnRlcm5hbCBFeGNlbENvbW1lbnRDb2xsZWN0aW9uKEV4Y2VsUGFja2FnZSBwY2ssIEV4Y2VsV29ya3NoZWV0IHdzLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zKSB7CisgICAgQ29tbWVudFhtbCA9IG5ldygpOworICAgIENvbW1lbnRYbWwuUHJlc2VydmVXaGl0ZXNwYWNlID0gZmFsc2U7CisgICAgTmFtZVNwYWNlTWFuYWdlciA9IG5zOworICAgIFdvcmtzaGVldCA9IHdzOworICAgIENyZWF0ZVhtbChwY2spOworICAgIEFkZENvbW1lbnRzRnJvbVhtbCgpOworICB9CiAKLSAgICAgICAgaW50ZXJuYWwgdm9pZCBDbGVhcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlKENvdW50PjApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUmVtb3ZlQXQoMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgcHJpdmF0ZSB2b2lkIENyZWF0ZVhtbChFeGNlbFBhY2thZ2UgcGNrKSB7CisgICAgdmFyIGNvbW1lbnRQYXJ0cyA9IFdvcmtzaGVldC5QYXJ0LkdldFJlbGF0aW9uc2hpcHNCeVR5cGUoRXhjZWxQYWNrYWdlLl9zY2hlbWFDb21tZW50KTsKKyAgICBib29sIGlzTG9hZGVkID0gZmFsc2U7CisgICAgQ29tbWVudFhtbCA9IG5ldygpOworICAgIGZvcmVhY2ggKHZhciBjb21tZW50UGFydCBpbiBjb21tZW50UGFydHMpIHsKKyAgICAgIFVyaSA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShjb21tZW50UGFydC5Tb3VyY2VVcmksIGNvbW1lbnRQYXJ0LlRhcmdldFVyaSk7CisgICAgICBQYXJ0ID0gcGNrLlBhY2thZ2UuR2V0UGFydChVcmkpOworICAgICAgWG1sSGVscGVyLkxvYWRYbWxTYWZlKENvbW1lbnRYbWwsIFBhcnQuR2V0U3RyZWFtKCkpOworICAgICAgUmVsSWQgPSBjb21tZW50UGFydC5JZDsKKyAgICAgIGlzTG9hZGVkID0gdHJ1ZTsKICAgICB9CisgICAgLy9DcmVhdGUgYSBuZXcgZG9jdW1lbnQKKyAgICBpZiAoIWlzTG9hZGVkKSB7CisgICAgICBDb21tZW50WG1sLkxvYWRYbWwoCisgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiID8+PGNvbW1lbnRzIHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCI+PGF1dGhvcnMgLz48Y29tbWVudExpc3QgLz48L2NvbW1lbnRzPiIpOworICAgICAgVXJpID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgQWRkQ29tbWVudHNGcm9tWG1sKCkgeworICAgIHZhciBsc3QgPSBuZXcgTGlzdDxJUmFuZ2VJZD4oKTsKKyAgICBmb3JlYWNoIChYbWxFbGVtZW50IG5vZGUgaW4gQ29tbWVudFhtbC5TZWxlY3ROb2RlcygKKyAgICAgICAgIi8vZDpjb21tZW50TGlzdC9kOmNvbW1lbnQiLAorICAgICAgICBOYW1lU3BhY2VNYW5hZ2VyKSkgeworICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgRXhjZWxDb21tZW50KAorICAgICAgICAgIE5hbWVTcGFjZU1hbmFnZXIsCisgICAgICAgICAgbm9kZSwKKyAgICAgICAgICBuZXcoV29ya3NoZWV0LCBub2RlLkdldEF0dHJpYnV0ZSgicmVmIikpKTsKKyAgICAgIGxzdC5BZGQoY29tbWVudCk7CisgICAgfQorICAgIF9jb21tZW50cyA9IG5ldyhsc3QpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWNjZXNzIHRvIHRoZSBjb21tZW50IHhtbCBkb2N1bWVudAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgWG1sRG9jdW1lbnQgQ29tbWVudFhtbCB7IGdldDsgc2V0OyB9CisKKyAgaW50ZXJuYWwgVXJpIFVyaSB7IGdldDsgc2V0OyB9CisKKyAgaW50ZXJuYWwgc3RyaW5nIFJlbElkIHsgZ2V0OyBzZXQ7IH0KKworICBpbnRlcm5hbCBYbWxOYW1lc3BhY2VNYW5hZ2VyIE5hbWVTcGFjZU1hbmFnZXIgeyBnZXQ7IHNldDsgfQorCisgIGludGVybmFsIFppcFBhY2thZ2VQYXJ0IFBhcnQgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgcmVmZXJlbmNlIHRvIHRoZSB3b3Jrc2hlZXQgb2JqZWN0CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFdvcmtzaGVldCBXb3Jrc2hlZXQgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE51bWJlciBvZiBjb21tZW50cyBpbiB0aGUgY29sbGVjdGlvbgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IENvdW50ID0+IF9jb21tZW50cy5Db3VudDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbmRleGVyIGZvciB0aGUgY29tbWVudHMgY29sbGVjdGlvbgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij5UaGUgaW5kZXg8L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIGNvbW1lbnQ8L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbENvbW1lbnQgdGhpc1tpbnQgaW5kZXhdIHsKKyAgICBnZXQgeworICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBfY29tbWVudHMuQ291bnQpIHsKKyAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkNvbW1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIikpOworICAgICAgfQorICAgICAgcmV0dXJuIF9jb21tZW50c1tpbmRleF0gYXMgRXhjZWxDb21tZW50OworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluZGV4ZXIgZm9yIHRoZSBjb21tZW50cyBjb2xsZWN0aW9uCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iY2VsbCI+VGhlIGNlbGw8L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIGNvbW1lbnQ8L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbENvbW1lbnQgdGhpc1tFeGNlbENlbGxBZGRyZXNzIGNlbGxdIHsKKyAgICBnZXQgeworICAgICAgdWxvbmcgY2VsbElkID0gRXhjZWxDZWxsQmFzZS5HZXRDZWxsSWQoV29ya3NoZWV0LlNoZWV0SUQsIGNlbGwuUm93LCBjZWxsLkNvbHVtbik7CisgICAgICBpZiAoX2NvbW1lbnRzLkluZGV4T2YoY2VsbElkKSA+PSAwKSB7CisgICAgICAgIHJldHVybiBfY29tbWVudHNbY2VsbElkXSBhcyBFeGNlbENvbW1lbnQ7CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGRzIGEgY29tbWVudCB0byB0aGUgdG9wIGxlZnQgY2VsbCBvZiB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjZWxsIj5UaGUgY2VsbDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idGV4dCI+VGhlIGNvbW1lbnQgdGV4dDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYXV0aG9yIj5BdXRob3I8L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIGNvbW1lbnQ8L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbENvbW1lbnQgQWRkKEV4Y2VsUmFuZ2VCYXNlIGNlbGwsIHN0cmluZyB0ZXh0LCBzdHJpbmcgYXV0aG9yKSB7CisgICAgdmFyIGVsZW0gPSBDb21tZW50WG1sLkNyZWF0ZUVsZW1lbnQoImNvbW1lbnQiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgIGludCBpeCA9IF9jb21tZW50cy5JbmRleE9mKAorICAgICAgICBFeGNlbENlbGxCYXNlLkdldENlbGxJZChXb3Jrc2hlZXQuU2hlZXRJRCwgY2VsbC5fZnJvbVJvdywgY2VsbC5fZnJvbUNvbCkpOworICAgIC8vTWFrZSBzdXJlIHRoZSBub2RlcyBjb21lIG9uIG9yZGVyLgorICAgIGlmIChpeCA8IDAgJiYgKH5peCA8IF9jb21tZW50cy5Db3VudCkpIHsKKyAgICAgIGl4ID0gfml4OworICAgICAgdmFyIHByZUNvbW1lbnQgPSBfY29tbWVudHNbaXhdIGFzIEV4Y2VsQ29tbWVudDsKKyAgICAgIHByZUNvbW1lbnQuX2NvbW1lbnRIZWxwZXIuVG9wTm9kZS5QYXJlbnROb2RlLkluc2VydEJlZm9yZSgKKyAgICAgICAgICBlbGVtLAorICAgICAgICAgIHByZUNvbW1lbnQuX2NvbW1lbnRIZWxwZXIuVG9wTm9kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENvbW1lbnRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiZDpjb21tZW50cy9kOmNvbW1lbnRMaXN0IiwgTmFtZVNwYWNlTWFuYWdlcikuQXBwZW5kQ2hpbGQoZWxlbSk7CisgICAgfQorICAgIGVsZW0uU2V0QXR0cmlidXRlKCJyZWYiLCBjZWxsLlN0YXJ0LkFkZHJlc3MpOworICAgIEV4Y2VsQ29tbWVudCBjb21tZW50ID0gbmV3IEV4Y2VsQ29tbWVudChOYW1lU3BhY2VNYW5hZ2VyLCBlbGVtLCBjZWxsKTsKKyAgICBjb21tZW50LlJpY2hUZXh0LkFkZCh0ZXh0KTsKKyAgICBpZiAoYXV0aG9yICE9ICIiKSB7CisgICAgICBjb21tZW50LkF1dGhvciA9IGF1dGhvcjsKKyAgICB9CisgICAgX2NvbW1lbnRzLkFkZChjb21tZW50KTsKKyAgICAvL0NoZWNrIGlmIGEgdmFsdWUgZXhpc3RzIG90aGVyd2lzZSBhZGQgb25lIHNvIGl0IGlzIHNhdmVkIHdoZW4gdGhlIGNlbGxzIGNvbGxlY3Rpb24gaXMgaXRlcmF0ZWQKKyAgICBpZiAoIVdvcmtzaGVldC5fdmFsdWVzLkV4aXN0cyhjZWxsLl9mcm9tUm93LCBjZWxsLl9mcm9tQ29sKSkgeworICAgICAgV29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUoY2VsbC5fZnJvbVJvdywgY2VsbC5fZnJvbUNvbCwgbnVsbCk7CisgICAgfQorICAgIHJldHVybiBjb21tZW50OworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmVtb3ZlcyB0aGUgY29tbWVudAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbW1lbnQiPlRoZSBjb21tZW50IHRvIHJlbW92ZTwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIFJlbW92ZShFeGNlbENvbW1lbnQgY29tbWVudCkgeworICAgIHVsb25nIGlkID0gRXhjZWxDZWxsQmFzZS5HZXRDZWxsSWQoCisgICAgICAgIFdvcmtzaGVldC5TaGVldElELAorICAgICAgICBjb21tZW50LlJhbmdlLl9mcm9tUm93LAorICAgICAgICBjb21tZW50LlJhbmdlLl9mcm9tQ29sKTsKKyAgICBpbnQgaXggPSBfY29tbWVudHMuSW5kZXhPZihpZCk7CisgICAgaWYgKGl4ID49IDAgJiYgY29tbWVudCA9PSBfY29tbWVudHNbaXhdKSB7CisgICAgICBjb21tZW50LlRvcE5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChjb21tZW50LlRvcE5vZGUpOyAvL1JlbW92ZSBWTUwKKyAgICAgIGNvbW1lbnQuX2NvbW1lbnRIZWxwZXIuVG9wTm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKGNvbW1lbnQuX2NvbW1lbnRIZWxwZXIuVG9wTm9kZSk7IC8vUmVtb3ZlIENvbW1lbnQKKworICAgICAgV29ya3NoZWV0LlZtbERyYXdpbmdzQ29tbWVudHMuX2RyYXdpbmdzLkRlbGV0ZShpZCk7CisgICAgICBfY29tbWVudHMuRGVsZXRlKGlkKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ29tbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgd29ya3NoZWV0IikpOworICAgIH0KKyAgfQorCisgIHZvaWQgSURpc3Bvc2FibGUuRGlzcG9zZSgpIHt9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmVtb3ZlcyB0aGUgY29tbWVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iaW5kZXgiPlRoZSBpbmRleDwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIFJlbW92ZUF0KGludCBpbmRleCkgeworICAgIFJlbW92ZSh0aGlzW2luZGV4XSk7CisgIH0KKworICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkgeworICAgIHJldHVybiBfY29tbWVudHM7CisgIH0KKworICBpbnRlcm5hbCB2b2lkIENsZWFyKCkgeworICAgIHdoaWxlIChDb3VudCA+IDApIHsKKyAgICAgIFJlbW92ZUF0KDApOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsSGVhZGVyRm9vdGVyLmNzIGIvRVBQbHVzL0V4Y2VsSGVhZGVyRm9vdGVyLmNzCmluZGV4IGNlNzJkZDguLjlhNTNmOTIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9FeGNlbEhlYWRlckZvb3Rlci5jcworKysgYi9FUFBsdXMvRXhjZWxIZWFkZXJGb290ZXIuY3MKQEAgLTEzLDM2NSArMTMsMzM3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbiAgICAgICAgICAgICAgICAgICAgICBUb3RhbCByZXdyaXRlICAgICAgICAgICAgICAgMjAxMC0wMy0wMQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW0uWG1sOwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsgICAgCi0gICAgI3JlZ2lvbiBjbGFzcyBFeGNlbEhlYWRlckZvb3RlclRleHQKLQkvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFByaW50IGhlYWRlciBhbmQgZm9vdGVyIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGNsYXNzIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dAotCXsKLSAgICAgICAgRXhjZWxXb3Jrc2hlZXQgX3dzOwotICAgICAgICBzdHJpbmcgX2hmOwotICAgICAgICBpbnRlcm5hbCBFeGNlbEhlYWRlckZvb3RlclRleHQoWG1sTm9kZSBUZXh0Tm9kZSwgRXhjZWxXb3Jrc2hlZXQgd3MsIHN0cmluZyBoZikKLSAgICAgICAgewotICAgICAgICAgICAgX3dzID0gd3M7Ci0gICAgICAgICAgICBfaGYgPSBoZjsKLSAgICAgICAgICAgIGlmIChUZXh0Tm9kZSA9PSBudWxsIHx8IHN0cmluZy5Jc051bGxPckVtcHR5KFRleHROb2RlLklubmVyVGV4dCkpIHJldHVybjsKLSAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gVGV4dE5vZGUuSW5uZXJUZXh0OwotICAgICAgICAgICAgc3RyaW5nIGNvZGUgPSB0ZXh0LlN1YnN0cmluZygwLCAyKTsgIAotICAgICAgICAgICAgaW50IHN0YXJ0UG9zPTI7Ci0gICAgICAgICAgICBmb3IgKGludCBwb3M9c3RhcnRQb3M7cG9zPHRleHQuTGVuZ3RoLTI7cG9zKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIG5ld0NvZGUgPSB0ZXh0LlN1YnN0cmluZyhwb3MsIDIpOwotICAgICAgICAgICAgICAgIGlmIChuZXdDb2RlID09ICImQyIgfHwgbmV3Q29kZSA9PSAiJlIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2V0VGV4dChjb2RlLCB0ZXh0LlN1YnN0cmluZyhzdGFydFBvcywgcG9zLXN0YXJ0UG9zKSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gcG9zKzI7Ci0gICAgICAgICAgICAgICAgICAgIHBvcyA9IHN0YXJ0UG9zOwotICAgICAgICAgICAgICAgICAgICBjb2RlID0gbmV3Q29kZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXRUZXh0KGNvZGUsIHRleHQuU3Vic3RyaW5nKHN0YXJ0UG9zLCB0ZXh0Lkxlbmd0aCAtIHN0YXJ0UG9zKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFRleHQoc3RyaW5nIGNvZGUsIHN0cmluZyB0ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNvZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAiJkwiOgotICAgICAgICAgICAgICAgICAgICBMZWZ0QWxpZ25lZFRleHQ9dGV4dDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAiJkMiOgotICAgICAgICAgICAgICAgICAgICBDZW50ZXJlZFRleHQ9dGV4dDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgUmlnaHRBbGlnbmVkVGV4dD10ZXh0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBHZXQvc2V0IHRoZSB0ZXh0IHRvIGFwcGVhciBvbiB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlIGhlYWRlciAob3IgZm9vdGVyKSBvbiB0aGUgd29ya3NoZWV0LgotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgc3RyaW5nIExlZnRBbGlnbmVkVGV4dCA9IG51bGw7Ci0JCS8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldC9zZXQgdGhlIHRleHQgdG8gYXBwZWFyIGluIHRoZSBjZW50ZXIgb2YgdGhlIGhlYWRlciAob3IgZm9vdGVyKSBvbiB0aGUgd29ya3NoZWV0LgotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgc3RyaW5nIENlbnRlcmVkVGV4dCA9IG51bGw7Ci0JCS8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldC9zZXQgdGhlIHRleHQgdG8gYXBwZWFyIG9uIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhlIGhlYWRlciAob3IgZm9vdGVyKSBvbiB0aGUgd29ya3NoZWV0LgotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgc3RyaW5nIFJpZ2h0QWxpZ25lZFRleHQgPSBudWxsOwotCX0KLQkjZW5kcmVnaW9uCiAKLQkjcmVnaW9uIEV4Y2VsSGVhZGVyRm9vdGVyCi0JLy8vIDxzdW1tYXJ5PgotCS8vLyBSZXByZXNlbnRzIHRoZSBIZWFkZXIgYW5kIEZvb3RlciBvbiBhbiBFeGNlbCBXb3Jrc2hlZXQKLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxIZWFkZXJGb290ZXIgOiBYbWxIZWxwZXIKLQl7Ci0JCSNyZWdpb24gU3RhdGljIFByb3BlcnRpZXMKLQkJLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGNvZGUgZm9yICJjdXJyZW50IHBhZ2UgIyIKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIGNvbnN0IHN0cmluZyBQYWdlTnVtYmVyID0gQCImUCI7Ci0JCS8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBjb2RlIGZvciAidG90YWwgcGFnZXMiCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBjb25zdCBzdHJpbmcgTnVtYmVyT2ZQYWdlcyA9IEAiJk4iOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgY29kZSBmb3IgInRleHQgZm9udCBjb2xvciIKLSAgICAgICAgLy8vIFJHQiBDb2xvciBpcyBzcGVjaWZpZWQgYXMgUlJHR0JCCi0gICAgICAgIC8vLyBUaGVtZSBDb2xvciBpcyBzcGVjaWZpZWQgYXMgVFRTTk4gd2hlcmUgVFQgaXMgdGhlIHRoZW1lIGNvbG9yIElkLCBTIGlzIGVpdGhlciAiKyIgb3IgIi0iIG9mIHRoZSB0aW50L3NoYWRlIHZhbHVlLCBOTiBpcyB0aGUgdGludC9zaGFkZSB2YWx1ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBGb250Q29sb3IgPSBAIiZLIjsKLQkJLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGNvZGUgZm9yICJzaGVldCB0YWIgbmFtZSIKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIGNvbnN0IHN0cmluZyBTaGVldE5hbWUgPSBAIiZBIjsKLQkJLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGNvZGUgZm9yICJ0aGlzIHdvcmtib29rJ3MgZmlsZSBwYXRoIgotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgY29uc3Qgc3RyaW5nIEZpbGVQYXRoID0gQCImWiI7Ci0JCS8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBjb2RlIGZvciAidGhpcyB3b3JrYm9vaydzIGZpbGUgbmFtZSIKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIGNvbnN0IHN0cmluZyBGaWxlTmFtZSA9IEAiJkYiOwotCQkvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgY29kZSBmb3IgImRhdGUiCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBjb25zdCBzdHJpbmcgQ3VycmVudERhdGUgPSBAIiZEIjsKLQkJLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGNvZGUgZm9yICJ0aW1lIgotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgY29uc3Qgc3RyaW5nIEN1cnJlbnRUaW1lID0gQCImVCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBjb2RlIGZvciAicGljdHVyZSBhcyBiYWNrZ3JvdW5kIgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIEltYWdlID0gQCImRyI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBjb2RlIGZvciAib3V0bGluZSBzdHlsZSIKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBPdXRsaW5lU3R5bGUgPSBAIiZPIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGNvZGUgZm9yICJzaGFkb3cgc3R5bGUiCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgU2hhZG93U3R5bGUgPSBAIiZIIjsKLQkJI2VuZHJlZ2lvbgorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWw7CiAKLQkJI3JlZ2lvbiBFeGNlbEhlYWRlckZvb3RlciBQcml2YXRlIFByb3BlcnRpZXMKLQkJaW50ZXJuYWwgRXhjZWxIZWFkZXJGb290ZXJUZXh0IF9vZGRIZWFkZXI7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBfb2RkRm9vdGVyOwotCQlpbnRlcm5hbCBFeGNlbEhlYWRlckZvb3RlclRleHQgX2V2ZW5IZWFkZXI7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBfZXZlbkZvb3RlcjsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxIZWFkZXJGb290ZXJUZXh0IF9maXJzdEhlYWRlcjsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxIZWFkZXJGb290ZXJUZXh0IF9maXJzdEZvb3RlcjsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd3M7Ci0gICAgICAgICNlbmRyZWdpb24KKy8vLyA8c3VtbWFyeT4KKy8vLyBQcmludCBoZWFkZXIgYW5kIGZvb3RlcgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbEhlYWRlckZvb3RlclRleHQgeworICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF93czsKKyAgcHJpdmF0ZSBzdHJpbmcgX2hmOwogCi0JCSNyZWdpb24gRXhjZWxIZWFkZXJGb290ZXIgQ29uc3RydWN0b3IKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gRXhjZWxIZWFkZXJGb290ZXIgQ29uc3RydWN0b3IKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJuYW1lU3BhY2VNYW5hZ2VyIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRvcE5vZGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id3MiPlRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgotCQlpbnRlcm5hbCBFeGNlbEhlYWRlckZvb3RlcihYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIsIFhtbE5vZGUgdG9wTm9kZSwgRXhjZWxXb3Jrc2hlZXQgd3MpIDoKLSAgICAgICAgICAgIGJhc2UobmFtZVNwYWNlTWFuYWdlciwgdG9wTm9kZSkKLQkJewotICAgICAgICAgICAgX3dzID0gd3M7Ci0gICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAiaGVhZGVyRm9vdGVyIiwgIm9kZEhlYWRlciIsICJvZGRGb290ZXIiLCAiZXZlbkhlYWRlciIsICJldmVuRm9vdGVyIiwgImZpcnN0SGVhZGVyIiwgImZpcnN0Rm9vdGVyIiB9OwotCQl9Ci0JCSNlbmRyZWdpb24KKyAgaW50ZXJuYWwgRXhjZWxIZWFkZXJGb290ZXJUZXh0KFhtbE5vZGUgdGV4dE5vZGUsIEV4Y2VsV29ya3NoZWV0IHdzLCBzdHJpbmcgaGYpIHsKKyAgICBfd3MgPSB3czsKKyAgICBfaGYgPSBoZjsKKyAgICBpZiAodGV4dE5vZGUgPT0gbnVsbCB8fCBzdHJpbmcuSXNOdWxsT3JFbXB0eSh0ZXh0Tm9kZS5Jbm5lclRleHQpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHN0cmluZyB0ZXh0ID0gdGV4dE5vZGUuSW5uZXJUZXh0OworICAgIHN0cmluZyBjb2RlID0gdGV4dC5TdWJzdHJpbmcoMCwgMik7CisgICAgaW50IHN0YXJ0UG9zID0gMjsKKyAgICBmb3IgKGludCBwb3MgPSBzdGFydFBvczsgcG9zIDwgdGV4dC5MZW5ndGggLSAyOyBwb3MrKykgeworICAgICAgc3RyaW5nIG5ld0NvZGUgPSB0ZXh0LlN1YnN0cmluZyhwb3MsIDIpOworICAgICAgaWYgKG5ld0NvZGUgPT0gIiZDIiB8fCBuZXdDb2RlID09ICImUiIpIHsKKyAgICAgICAgU2V0VGV4dChjb2RlLCB0ZXh0LlN1YnN0cmluZyhzdGFydFBvcywgcG9zIC0gc3RhcnRQb3MpKTsKKyAgICAgICAgc3RhcnRQb3MgPSBwb3MgKyAyOworICAgICAgICBwb3MgPSBzdGFydFBvczsKKyAgICAgICAgY29kZSA9IG5ld0NvZGU7CisgICAgICB9CisgICAgfQorICAgIFNldFRleHQoY29kZSwgdGV4dC5TdWJzdHJpbmcoc3RhcnRQb3MsIHRleHQuTGVuZ3RoIC0gc3RhcnRQb3MpKTsKKyAgfQogCi0JCSNyZWdpb24gYWxpZ25XaXRoTWFyZ2lucwotICAgICAgICBjb25zdCBzdHJpbmcgYWxpZ25XaXRoTWFyZ2luc1BhdGg9IkBhbGlnbldpdGhNYXJnaW5zIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotCQkvLy8gR2V0cy9zZXRzIHRoZSBhbGlnbldpdGhNYXJnaW5zIGF0dHJpYnV0ZQotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgYm9vbCBBbGlnbldpdGhNYXJnaW5zCi0JCXsKLQkJCWdldAotCQkJewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChhbGlnbldpdGhNYXJnaW5zUGF0aCk7Ci0JCQl9Ci0JCQlzZXQKLQkJCXsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKGFsaWduV2l0aE1hcmdpbnNQYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7Ci0JCQl9Ci0JCX0KLQkJI2VuZHJlZ2lvbgorICBwcml2YXRlIHZvaWQgU2V0VGV4dChzdHJpbmcgY29kZSwgc3RyaW5nIHRleHQpIHsKKyAgICBzd2l0Y2ggKGNvZGUpIHsKKyAgICAgIGNhc2UgIiZMIjoKKyAgICAgICAgTGVmdEFsaWduZWRUZXh0ID0gdGV4dDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICImQyI6CisgICAgICAgIENlbnRlcmVkVGV4dCA9IHRleHQ7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgUmlnaHRBbGlnbmVkVGV4dCA9IHRleHQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQogCi0gICAgICAgICNyZWdpb24gZGlmZmVyZW50T2RkRXZlbgotICAgICAgICBjb25zdCBzdHJpbmcgZGlmZmVyZW50T2RkRXZlblBhdGggPSAiQGRpZmZlcmVudE9kZEV2ZW4iOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0JCS8vLyBHZXRzL3NldHMgdGhlIGZsYWcgdGhhdCB0ZWxscyBFeGNlbCB0byBkaXNwbGF5IGRpZmZlcmVudCBoZWFkZXJzIGFuZCBmb290ZXJzIG9uIG9kZCBhbmQgZXZlbiBwYWdlcy4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIGJvb2wgZGlmZmVyZW50T2RkRXZlbgotCQl7Ci0JCQlnZXQKLQkJCXsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woZGlmZmVyZW50T2RkRXZlblBhdGgpOwotCQkJfQotCQkJc2V0Ci0JCQl7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhkaWZmZXJlbnRPZGRFdmVuUGF0aCwgdmFsdWUgPyAiMSIgOiAiMCIpOwotCQkJfQotCQl9Ci0JCSNlbmRyZWdpb24KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0L3NldCB0aGUgdGV4dCB0byBhcHBlYXIgb24gdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBoZWFkZXIgKG9yIGZvb3Rlcikgb24gdGhlIHdvcmtzaGVldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBMZWZ0QWxpZ25lZFRleHQ7CiAKLQkJI3JlZ2lvbiBkaWZmZXJlbnRGaXJzdAotICAgICAgICBjb25zdCBzdHJpbmcgZGlmZmVyZW50Rmlyc3RQYXRoID0gIkBkaWZmZXJlbnRGaXJzdCI7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldC9zZXQgdGhlIHRleHQgdG8gYXBwZWFyIGluIHRoZSBjZW50ZXIgb2YgdGhlIGhlYWRlciAob3IgZm9vdGVyKSBvbiB0aGUgd29ya3NoZWV0LgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIENlbnRlcmVkVGV4dDsKIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBHZXRzL3NldHMgdGhlIGZsYWcgdGhhdCB0ZWxscyBFeGNlbCB0byBkaXNwbGF5IGRpZmZlcmVudCBoZWFkZXJzIGFuZCBmb290ZXJzIG9uIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB3b3Jrc2hlZXQuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBib29sIGRpZmZlcmVudEZpcnN0Ci0JCXsKLQkJCWdldAotCQkJewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChkaWZmZXJlbnRGaXJzdFBhdGgpOwotCQkJfQotCQkJc2V0Ci0JCQl7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhkaWZmZXJlbnRGaXJzdFBhdGgsIHZhbHVlID8gIjEiIDogIjAiKTsKLQkJCX0KLQkJfQotCQkjZW5kcmVnaW9uCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldC9zZXQgdGhlIHRleHQgdG8gYXBwZWFyIG9uIHRoZSByaWdodCBoYW5kIHNpZGUgb2YgdGhlIGhlYWRlciAob3IgZm9vdGVyKSBvbiB0aGUgd29ya3NoZWV0LgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIFJpZ2h0QWxpZ25lZFRleHQ7Cit9CiAKLQkJI3JlZ2lvbiBFeGNlbEhlYWRlckZvb3RlciBQdWJsaWMgUHJvcGVydGllcwotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGhlYWRlciBvbiBvZGQgbnVtYmVyZWQgcGFnZXMgb2YgdGhlIGRvY3VtZW50LgotCQkvLy8gSWYgeW91IHdhbnQgdGhlIHNhbWUgaGVhZGVyIG9uIGJvdGggb2RkIGFuZCBldmVuIHBhZ2VzLCB0aGVuIG9ubHkgc2V0IHZhbHVlcyBpbiB0aGlzIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBjbGFzcy4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBPZGRIZWFkZXIgCi0gICAgICAgIHsgCi0gICAgICAgICAgICBnZXQgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9vZGRIZWFkZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9vZGRIZWFkZXIgPSBuZXcgRXhjZWxIZWFkZXJGb290ZXJUZXh0KFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpvZGRIZWFkZXIiLCBOYW1lU3BhY2VNYW5hZ2VyKSwgX3dzLCAiSCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX29kZEhlYWRlcjsgfSAKLSAgICAgICAgfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGZvb3RlciBvbiBvZGQgbnVtYmVyZWQgcGFnZXMgb2YgdGhlIGRvY3VtZW50LgotCQkvLy8gSWYgeW91IHdhbnQgdGhlIHNhbWUgZm9vdGVyIG9uIGJvdGggb2RkIGFuZCBldmVuIHBhZ2VzLCB0aGVuIG9ubHkgc2V0IHZhbHVlcyBpbiB0aGlzIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBjbGFzcy4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBPZGRGb290ZXIgCi0gICAgICAgIHsgCi0gICAgICAgICAgICBnZXQgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9vZGRGb290ZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9vZGRGb290ZXIgPSBuZXcgRXhjZWxIZWFkZXJGb290ZXJUZXh0KFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpvZGRGb290ZXIiLCBOYW1lU3BhY2VNYW5hZ2VyKSwgX3dzLCAiRiIpOyA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfb2RkRm9vdGVyOyAKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0KLQkJLy8gZXZlbkhlYWRlciBhbmQgZXZlbkZvb3RlciBzZXQgZGlmZmVyZW50T2RkRXZlbiA9IHRydWUKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBoZWFkZXIgb24gZXZlbiBudW1iZXJlZCBwYWdlcyBvZiB0aGUgZG9jdW1lbnQuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBFeGNlbEhlYWRlckZvb3RlclRleHQgRXZlbkhlYWRlciAKLSAgICAgICAgeyAKLSAgICAgICAgICAgIGdldCAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2V2ZW5IZWFkZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9ldmVuSGVhZGVyID0gbmV3IEV4Y2VsSGVhZGVyRm9vdGVyVGV4dChUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6ZXZlbkhlYWRlciIsIE5hbWVTcGFjZU1hbmFnZXIpLCBfd3MsICJIRVZFTiIpOwotICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnRPZGRFdmVuID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9ldmVuSGVhZGVyOyAKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmb290ZXIgb24gZXZlbiBudW1iZXJlZCBwYWdlcyBvZiB0aGUgZG9jdW1lbnQuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBFeGNlbEhlYWRlckZvb3RlclRleHQgRXZlbkZvb3RlcgotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0IAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZXZlbkZvb3RlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2V2ZW5Gb290ZXIgPSBuZXcgRXhjZWxIZWFkZXJGb290ZXJUZXh0KFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpldmVuRm9vdGVyIiwgTmFtZVNwYWNlTWFuYWdlciksIF93cywgIkZFVkVOIik7Ci0gICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudE9kZEV2ZW4gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2V2ZW5Gb290ZXIgOyAKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBoZWFkZXIgb24gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGRvY3VtZW50LgotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgRXhjZWxIZWFkZXJGb290ZXJUZXh0IEZpcnN0SGVhZGVyCi0gICAgICAgIHsgCi0gICAgICAgICAgICBnZXQgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9maXJzdEhlYWRlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2ZpcnN0SGVhZGVyID0gbmV3IEV4Y2VsSGVhZGVyRm9vdGVyVGV4dChUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6Zmlyc3RIZWFkZXIiLCBOYW1lU3BhY2VNYW5hZ2VyKSwgX3dzLCAiSEZJUlNUIik7IAotICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50Rmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2ZpcnN0SGVhZGVyOyAKLSAgICAgICAgICAgIH0gCi0gICAgICAgIH0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmb290ZXIgb24gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGRvY3VtZW50LgotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgRXhjZWxIZWFkZXJGb290ZXJUZXh0IEZpcnN0Rm9vdGVyCi0gICAgICAgIHsgCi0gICAgICAgICAgICBnZXQgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9maXJzdEZvb3RlciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2ZpcnN0Rm9vdGVyID0gbmV3IEV4Y2VsSGVhZGVyRm9vdGVyVGV4dChUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6Zmlyc3RGb290ZXIiLCBOYW1lU3BhY2VNYW5hZ2VyKSwgX3dzLCAiRkZJUlNUIik7IAotICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnRGaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfZmlyc3RGb290ZXI7IAotICAgICAgICAgICAgfSAKLSAgICAgICAgfQotCQkjZW5kcmVnaW9uCi0JCSNyZWdpb24gU2F2ZSAgLy8gIEV4Y2VsSGVhZGVyRm9vdGVyCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFNhdmVzIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBpbmZvcm1hdGlvbiB0byB0aGUgd29ya3NoZWV0IFhNTAotCQkvLy8gPC9zdW1tYXJ5PgotCQlpbnRlcm5hbCB2b2lkIFNhdmUoKQotCQl7Ci0JCQlpZiAoX29kZEhlYWRlciAhPSBudWxsKQotCQkJewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImQ6b2RkSGVhZGVyIiwgR2V0VGV4dChPZGRIZWFkZXIpKTsKLQkJCX0KLQkJCWlmIChfb2RkRm9vdGVyICE9IG51bGwpCi0JCQl7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiZDpvZGRGb290ZXIiLCBHZXRUZXh0KE9kZEZvb3RlcikpOwotCQkJfQorLy8vIDxzdW1tYXJ5PgorLy8vIFJlcHJlc2VudHMgdGhlIEhlYWRlciBhbmQgRm9vdGVyIG9uIGFuIEV4Y2VsIFdvcmtzaGVldAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxIZWFkZXJGb290ZXIgOiBYbWxIZWxwZXIgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgY29kZSBmb3IgImN1cnJlbnQgcGFnZSAjIgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY29uc3Qgc3RyaW5nIFBhZ2VOdW1iZXIgPSAiJlAiOwogCi0JCQkvLyBvbmx5IHNldCBldmVuSGVhZGVyIGFuZCBldmVuRm9vdGVyIAotCQkJaWYgKGRpZmZlcmVudE9kZEV2ZW4pCi0JCQl7Ci0JCQkJaWYgKF9ldmVuSGVhZGVyICE9IG51bGwpCi0JCQkJewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJkOmV2ZW5IZWFkZXIiLCBHZXRUZXh0KEV2ZW5IZWFkZXIpKTsKLQkJCQl9Ci0JCQkJaWYgKF9ldmVuRm9vdGVyICE9IG51bGwpCi0JCQkJewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJkOmV2ZW5Gb290ZXIiLCBHZXRUZXh0KEV2ZW5Gb290ZXIpKTsKLQkJCQl9Ci0JCQl9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBjb2RlIGZvciAidG90YWwgcGFnZXMiCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjb25zdCBzdHJpbmcgTnVtYmVyT2ZQYWdlcyA9ICImTiI7CiAKLQkJCS8vIG9ubHkgc2V0IGZpcnN0SGVhZGVyIGFuZCBmaXJzdEZvb3RlcgotCQkJaWYgKGRpZmZlcmVudEZpcnN0KQotCQkJewotCQkJCWlmIChfZmlyc3RIZWFkZXIgIT0gbnVsbCkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImQ6Zmlyc3RIZWFkZXIiLCBHZXRUZXh0KEZpcnN0SGVhZGVyKSk7Ci0JCQkJfQotCQkJCWlmIChfZmlyc3RGb290ZXIgIT0gbnVsbCkKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImQ6Zmlyc3RGb290ZXIiLCBHZXRUZXh0KEZpcnN0Rm9vdGVyKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXByaXZhdGUgc3RyaW5nIEdldFRleHQoRXhjZWxIZWFkZXJGb290ZXJUZXh0IGhlYWRlckZvb3RlcikKLQkJewotCQkJc3RyaW5nIHJldCA9ICIiOwotCQkJaWYgKGhlYWRlckZvb3Rlci5MZWZ0QWxpZ25lZFRleHQgIT0gbnVsbCkKLQkJCQlyZXQgKz0gIiZMIiArIGhlYWRlckZvb3Rlci5MZWZ0QWxpZ25lZFRleHQ7Ci0JCQlpZiAoaGVhZGVyRm9vdGVyLkNlbnRlcmVkVGV4dCAhPSBudWxsKQotCQkJCXJldCArPSAiJkMiICsgaGVhZGVyRm9vdGVyLkNlbnRlcmVkVGV4dDsKLQkJCWlmIChoZWFkZXJGb290ZXIuUmlnaHRBbGlnbmVkVGV4dCAhPSBudWxsKQotCQkJCXJldCArPSAiJlIiICsgaGVhZGVyRm9vdGVyLlJpZ2h0QWxpZ25lZFRleHQ7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCSNlbmRyZWdpb24KLQl9Ci0JI2VuZHJlZ2lvbgorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgY29kZSBmb3IgInRleHQgZm9udCBjb2xvciIKKyAgLy8vIFJHQiBDb2xvciBpcyBzcGVjaWZpZWQgYXMgUlJHR0JCCisgIC8vLyBUaGVtZSBDb2xvciBpcyBzcGVjaWZpZWQgYXMgVFRTTk4gd2hlcmUgVFQgaXMgdGhlIHRoZW1lIGNvbG9yIElkLCBTIGlzIGVpdGhlciAiKyIgb3IgIi0iIG9mIHRoZSB0aW50L3NoYWRlIHZhbHVlLCBOTiBpcyB0aGUgdGludC9zaGFkZSB2YWx1ZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNvbnN0IHN0cmluZyBGb250Q29sb3IgPSAiJksiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBjb2RlIGZvciAic2hlZXQgdGFiIG5hbWUiCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjb25zdCBzdHJpbmcgU2hlZXROYW1lID0gIiZBIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgY29kZSBmb3IgInRoaXMgd29ya2Jvb2sncyBmaWxlIHBhdGgiCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjb25zdCBzdHJpbmcgRmlsZVBhdGggPSAiJloiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBjb2RlIGZvciAidGhpcyB3b3JrYm9vaydzIGZpbGUgbmFtZSIKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNvbnN0IHN0cmluZyBGaWxlTmFtZSA9ICImRiI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIGNvZGUgZm9yICJkYXRlIgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY29uc3Qgc3RyaW5nIEN1cnJlbnREYXRlID0gIiZEIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgY29kZSBmb3IgInRpbWUiCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjb25zdCBzdHJpbmcgQ3VycmVudFRpbWUgPSAiJlQiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBjb2RlIGZvciAicGljdHVyZSBhcyBiYWNrZ3JvdW5kIgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY29uc3Qgc3RyaW5nIEltYWdlID0gIiZHIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgY29kZSBmb3IgIm91dGxpbmUgc3R5bGUiCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjb25zdCBzdHJpbmcgT3V0bGluZVN0eWxlID0gIiZPIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgY29kZSBmb3IgInNoYWRvdyBzdHlsZSIKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNvbnN0IHN0cmluZyBTaGFkb3dTdHlsZSA9ICImSCI7CisKKyAgaW50ZXJuYWwgRXhjZWxIZWFkZXJGb290ZXJUZXh0IF9vZGRIZWFkZXI7CisgIGludGVybmFsIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBfb2RkRm9vdGVyOworICBpbnRlcm5hbCBFeGNlbEhlYWRlckZvb3RlclRleHQgX2V2ZW5IZWFkZXI7CisgIGludGVybmFsIEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBfZXZlbkZvb3RlcjsKKyAgaW50ZXJuYWwgRXhjZWxIZWFkZXJGb290ZXJUZXh0IF9maXJzdEhlYWRlcjsKKyAgaW50ZXJuYWwgRXhjZWxIZWFkZXJGb290ZXJUZXh0IF9maXJzdEZvb3RlcjsKKyAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd3M7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjZWxIZWFkZXJGb290ZXIgQ29uc3RydWN0b3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lU3BhY2VNYW5hZ2VyIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InRvcE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id3MiPlRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgorICBpbnRlcm5hbCBFeGNlbEhlYWRlckZvb3RlcigKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlciwKKyAgICAgIFhtbE5vZGUgdG9wTm9kZSwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdzKQorICAgICAgOiBiYXNlKG5hbWVTcGFjZU1hbmFnZXIsIHRvcE5vZGUpIHsKKyAgICBfd3MgPSB3czsKKyAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXdbXSB7CisgICAgICAiaGVhZGVyRm9vdGVyIiwKKyAgICAgICJvZGRIZWFkZXIiLAorICAgICAgIm9kZEZvb3RlciIsCisgICAgICAiZXZlbkhlYWRlciIsCisgICAgICAiZXZlbkZvb3RlciIsCisgICAgICAiZmlyc3RIZWFkZXIiLAorICAgICAgImZpcnN0Rm9vdGVyIiwKKyAgICB9OworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2FsaWduV2l0aE1hcmdpbnNQYXRoID0gIkBhbGlnbldpdGhNYXJnaW5zIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXRzL3NldHMgdGhlIGFsaWduV2l0aE1hcmdpbnMgYXR0cmlidXRlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIEFsaWduV2l0aE1hcmdpbnMgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbChfYWxpZ25XaXRoTWFyZ2luc1BhdGgpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKF9hbGlnbldpdGhNYXJnaW5zUGF0aCwgdmFsdWUgPyAiMSIgOiAiMCIpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2RpZmZlcmVudE9kZEV2ZW5QYXRoID0gIkBkaWZmZXJlbnRPZGRFdmVuIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXRzL3NldHMgdGhlIGZsYWcgdGhhdCB0ZWxscyBFeGNlbCB0byBkaXNwbGF5IGRpZmZlcmVudCBoZWFkZXJzIGFuZCBmb290ZXJzIG9uIG9kZCBhbmQgZXZlbiBwYWdlcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgZGlmZmVyZW50T2RkRXZlbiB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKF9kaWZmZXJlbnRPZGRFdmVuUGF0aCk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoX2RpZmZlcmVudE9kZEV2ZW5QYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZGlmZmVyZW50Rmlyc3RQYXRoID0gIkBkaWZmZXJlbnRGaXJzdCI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0cy9zZXRzIHRoZSBmbGFnIHRoYXQgdGVsbHMgRXhjZWwgdG8gZGlzcGxheSBkaWZmZXJlbnQgaGVhZGVycyBhbmQgZm9vdGVycyBvbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgd29ya3NoZWV0LgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBkaWZmZXJlbnRGaXJzdCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKF9kaWZmZXJlbnRGaXJzdFBhdGgpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKF9kaWZmZXJlbnRGaXJzdFBhdGgsIHZhbHVlID8gIjEiIDogIjAiKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgaGVhZGVyIG9uIG9kZCBudW1iZXJlZCBwYWdlcyBvZiB0aGUgZG9jdW1lbnQuCisgIC8vLyBJZiB5b3Ugd2FudCB0aGUgc2FtZSBoZWFkZXIgb24gYm90aCBvZGQgYW5kIGV2ZW4gcGFnZXMsIHRoZW4gb25seSBzZXQgdmFsdWVzIGluIHRoaXMgRXhjZWxIZWFkZXJGb290ZXJUZXh0IGNsYXNzLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxIZWFkZXJGb290ZXJUZXh0IE9kZEhlYWRlciB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfb2RkSGVhZGVyID09IG51bGwpIHsKKyAgICAgICAgX29kZEhlYWRlciA9IG5ldyhUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6b2RkSGVhZGVyIiwgTmFtZVNwYWNlTWFuYWdlciksIF93cywgIkgiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfb2RkSGVhZGVyOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZm9vdGVyIG9uIG9kZCBudW1iZXJlZCBwYWdlcyBvZiB0aGUgZG9jdW1lbnQuCisgIC8vLyBJZiB5b3Ugd2FudCB0aGUgc2FtZSBmb290ZXIgb24gYm90aCBvZGQgYW5kIGV2ZW4gcGFnZXMsIHRoZW4gb25seSBzZXQgdmFsdWVzIGluIHRoaXMgRXhjZWxIZWFkZXJGb290ZXJUZXh0IGNsYXNzLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxIZWFkZXJGb290ZXJUZXh0IE9kZEZvb3RlciB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfb2RkRm9vdGVyID09IG51bGwpIHsKKyAgICAgICAgX29kZEZvb3RlciA9IG5ldyhUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6b2RkRm9vdGVyIiwgTmFtZVNwYWNlTWFuYWdlciksIF93cywgIkYiKTsKKyAgICAgICAgOworICAgICAgfQorICAgICAgcmV0dXJuIF9vZGRGb290ZXI7CisgICAgfQorICB9CisKKyAgLy8gZXZlbkhlYWRlciBhbmQgZXZlbkZvb3RlciBzZXQgZGlmZmVyZW50T2RkRXZlbiA9IHRydWUKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBoZWFkZXIgb24gZXZlbiBudW1iZXJlZCBwYWdlcyBvZiB0aGUgZG9jdW1lbnQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEhlYWRlckZvb3RlclRleHQgRXZlbkhlYWRlciB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfZXZlbkhlYWRlciA9PSBudWxsKSB7CisgICAgICAgIF9ldmVuSGVhZGVyID0gbmV3KFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpldmVuSGVhZGVyIiwgTmFtZVNwYWNlTWFuYWdlciksIF93cywgIkhFVkVOIik7CisgICAgICAgIGRpZmZlcmVudE9kZEV2ZW4gPSB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIF9ldmVuSGVhZGVyOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZm9vdGVyIG9uIGV2ZW4gbnVtYmVyZWQgcGFnZXMgb2YgdGhlIGRvY3VtZW50LgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxIZWFkZXJGb290ZXJUZXh0IEV2ZW5Gb290ZXIgeworICAgIGdldCB7CisgICAgICBpZiAoX2V2ZW5Gb290ZXIgPT0gbnVsbCkgeworICAgICAgICBfZXZlbkZvb3RlciA9IG5ldyhUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6ZXZlbkZvb3RlciIsIE5hbWVTcGFjZU1hbmFnZXIpLCBfd3MsICJGRVZFTiIpOworICAgICAgICBkaWZmZXJlbnRPZGRFdmVuID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfZXZlbkZvb3RlcjsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGhlYWRlciBvbiB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgZG9jdW1lbnQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEhlYWRlckZvb3RlclRleHQgRmlyc3RIZWFkZXIgeworICAgIGdldCB7CisgICAgICBpZiAoX2ZpcnN0SGVhZGVyID09IG51bGwpIHsKKyAgICAgICAgX2ZpcnN0SGVhZGVyID0gbmV3KAorICAgICAgICAgICAgVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOmZpcnN0SGVhZGVyIiwgTmFtZVNwYWNlTWFuYWdlciksCisgICAgICAgICAgICBfd3MsCisgICAgICAgICAgICAiSEZJUlNUIik7CisgICAgICAgIGRpZmZlcmVudEZpcnN0ID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfZmlyc3RIZWFkZXI7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBmb290ZXIgb24gdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIGRvY3VtZW50LgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxIZWFkZXJGb290ZXJUZXh0IEZpcnN0Rm9vdGVyIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9maXJzdEZvb3RlciA9PSBudWxsKSB7CisgICAgICAgIF9maXJzdEZvb3RlciA9IG5ldygKKyAgICAgICAgICAgIFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpmaXJzdEZvb3RlciIsIE5hbWVTcGFjZU1hbmFnZXIpLAorICAgICAgICAgICAgX3dzLAorICAgICAgICAgICAgIkZGSVJTVCIpOworICAgICAgICBkaWZmZXJlbnRGaXJzdCA9IHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gX2ZpcnN0Rm9vdGVyOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNhdmVzIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBpbmZvcm1hdGlvbiB0byB0aGUgd29ya3NoZWV0IFhNTAorICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCB2b2lkIFNhdmUoKSB7CisgICAgaWYgKF9vZGRIZWFkZXIgIT0gbnVsbCkgeworICAgICAgU2V0WG1sTm9kZVN0cmluZygiZDpvZGRIZWFkZXIiLCBHZXRUZXh0KE9kZEhlYWRlcikpOworICAgIH0KKyAgICBpZiAoX29kZEZvb3RlciAhPSBudWxsKSB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJkOm9kZEZvb3RlciIsIEdldFRleHQoT2RkRm9vdGVyKSk7CisgICAgfQorCisgICAgLy8gb25seSBzZXQgZXZlbkhlYWRlciBhbmQgZXZlbkZvb3RlcgorICAgIGlmIChkaWZmZXJlbnRPZGRFdmVuKSB7CisgICAgICBpZiAoX2V2ZW5IZWFkZXIgIT0gbnVsbCkgeworICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJkOmV2ZW5IZWFkZXIiLCBHZXRUZXh0KEV2ZW5IZWFkZXIpKTsKKyAgICAgIH0KKyAgICAgIGlmIChfZXZlbkZvb3RlciAhPSBudWxsKSB7CisgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImQ6ZXZlbkZvb3RlciIsIEdldFRleHQoRXZlbkZvb3RlcikpOworICAgICAgfQorICAgIH0KKworICAgIC8vIG9ubHkgc2V0IGZpcnN0SGVhZGVyIGFuZCBmaXJzdEZvb3RlcgorICAgIGlmIChkaWZmZXJlbnRGaXJzdCkgeworICAgICAgaWYgKF9maXJzdEhlYWRlciAhPSBudWxsKSB7CisgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImQ6Zmlyc3RIZWFkZXIiLCBHZXRUZXh0KEZpcnN0SGVhZGVyKSk7CisgICAgICB9CisgICAgICBpZiAoX2ZpcnN0Rm9vdGVyICE9IG51bGwpIHsKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiZDpmaXJzdEZvb3RlciIsIEdldFRleHQoRmlyc3RGb290ZXIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0cmluZyBHZXRUZXh0KEV4Y2VsSGVhZGVyRm9vdGVyVGV4dCBoZWFkZXJGb290ZXIpIHsKKyAgICBzdHJpbmcgcmV0ID0gIiI7CisgICAgaWYgKGhlYWRlckZvb3Rlci5MZWZ0QWxpZ25lZFRleHQgIT0gbnVsbCkgeworICAgICAgcmV0ICs9ICImTCIgKyBoZWFkZXJGb290ZXIuTGVmdEFsaWduZWRUZXh0OworICAgIH0KKyAgICBpZiAoaGVhZGVyRm9vdGVyLkNlbnRlcmVkVGV4dCAhPSBudWxsKSB7CisgICAgICByZXQgKz0gIiZDIiArIGhlYWRlckZvb3Rlci5DZW50ZXJlZFRleHQ7CisgICAgfQorICAgIGlmIChoZWFkZXJGb290ZXIuUmlnaHRBbGlnbmVkVGV4dCAhPSBudWxsKSB7CisgICAgICByZXQgKz0gIiZSIiArIGhlYWRlckZvb3Rlci5SaWdodEFsaWduZWRUZXh0OworICAgIH0KKyAgICByZXR1cm4gcmV0OworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxIeXBlckxpbmsuY3MgYi9FUFBsdXMvRXhjZWxIeXBlckxpbmsuY3MKaW5kZXggM2QxYTAyNy4uZGM0YWEzYiAxMDA2NDQKLS0tIGEvRVBQbHVzL0V4Y2VsSHlwZXJMaW5rLmNzCisrKyBiL0VQUGx1cy9FeGNlbEh5cGVyTGluay5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTU1ICsxMywxMjUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQlBZGRlZCB0aGlzIGNsYXNzCQkgICAgICAgIDIwMTAtMDEtMjQKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gSHlwZXJsaW5rQ2xhc3MKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbEh5cGVyTGluayA6IFVyaQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQSBuZXcgaHlwZXJsaW5rIHdpdGggdGhlIHNwZWNpZmllZCBVUkkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1cmlTdHJpbmciPlRoZSBVUkk8L3BhcmFtPgotICAgICAgICBwdWJsaWMgRXhjZWxIeXBlckxpbmsoc3RyaW5nIHVyaVN0cmluZykgOgotICAgICAgICAgICAgYmFzZSh1cmlTdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9yaWdpbmFsVXJpID0gKFVyaSl0aGlzOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgbmV3IGh5cGVybGluayB3aXRoIHRoZSBzcGVjaWZpZWQgVVJJLiBUaGlzIHN5bnRheCBpcyBvYnNvbGV0ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVyaVN0cmluZyI+VGhlIFVSSTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZG9udEVzY2FwZSI+PC9wYXJhbT4KLSAgICAgICAgW09ic29sZXRlKCJiYXNlIGNvbnN0cnVjdG9yICdTeXN0ZW0uVXJpLlVyaShzdHJpbmcsIGJvb2wpJyBpcyBvYnNvbGV0ZTogJ1RoZSBjb25zdHJ1Y3RvciBoYXMgYmVlbiBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIG5ldyBFeGNlbEh5cGVyTGluayhzdHJpbmcpLiBUaGUgZG9udEVzY2FwZSBwYXJhbWV0ZXIgaXMgZGVwcmVjYXRlZCBhbmQgaXMgYWx3YXlzIGZhbHNlLiIpXQotICAgICAgICBwdWJsaWMgRXhjZWxIeXBlckxpbmsoc3RyaW5nIHVyaVN0cmluZywgYm9vbCBkb250RXNjYXBlKSA6Ci0gICAgICAgICAgICBiYXNlKHVyaVN0cmluZywgZG9udEVzY2FwZSkKLSAgICAgICAgewotICAgICAgICAgICAgT3JpZ2luYWxVcmkgPSAoVXJpKXRoaXM7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQSBuZXcgaHlwZXJsaW5rIHdpdGggdGhlIHNwZWNpZmllZCBVUkkgYW5kIGtpbmQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ1cmlTdHJpbmciPlRoZSBVUkk8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InVyaUtpbmQiPktpbmQgKGFic29sdXRlL3JlbGF0aXZlIG9yIGluZGV0ZXJtaW5hdGUpPC9wYXJhbT4KLSAgICAgICAgcHVibGljIEV4Y2VsSHlwZXJMaW5rKHN0cmluZyB1cmlTdHJpbmcsIFVyaUtpbmQgdXJpS2luZCkgOgotICAgICAgICAgICAgYmFzZSh1cmlTdHJpbmcsIHVyaUtpbmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9yaWdpbmFsVXJpID0gKFVyaSl0aGlzOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNoZWV0IGludGVybmFsIHJlZmVyZW5jZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJlZmVyZW5jZUFkZHJlc3MiPkFkZHJlc3M8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRpc3BsYXkiPkRpc3BsYXllZCB0ZXh0PC9wYXJhbT4KLSAgICAgICAgcHVibGljIEV4Y2VsSHlwZXJMaW5rKHN0cmluZyByZWZlcmVuY2VBZGRyZXNzLCBzdHJpbmcgZGlzcGxheSkgOgotICAgICAgICAgICAgYmFzZSgieGw6Ly9pbnRlcm5hbCIpICAgLy9VUkkgaXMgbm90IHVzZWQgb24gaW50ZXJuYWwgbGlua3Mgc28gcHV0IGEgZHVtbXkgdXJpIGhlcmUuCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yZWZlcmVuY2VBZGRyZXNzID0gcmVmZXJlbmNlQWRkcmVzczsKLSAgICAgICAgICAgIF9kaXNwbGF5ID0gZGlzcGxheTsKLSAgICAgICAgfQotICAgICAgICBzdHJpbmcgX3JlZmVyZW5jZUFkZHJlc3MgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgRXhjZWwgYWRkcmVzcyBmb3IgaW50ZXJuYWwgbGlua3MuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgUmVmZXJlbmNlQWRkcmVzcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3JlZmVyZW5jZUFkZHJlc3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcmVmZXJlbmNlQWRkcmVzcyA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN0cmluZyBfZGlzcGxheSA9ICIiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEaXNwbGF5ZWQgdGV4dAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIERpc3BsYXkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9kaXNwbGF5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2Rpc3BsYXkgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUb29sdGlwCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVG9vbFRpcAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IF9jb2xTcGFubiA9IDA7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBoeXBlcmxpbmsgc3BhbnMgbXVsdGlwbGUgY29sdW1ucwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IENvbFNwYW5uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY29sU3Bhbm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29sU3Bhbm4gPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgX3Jvd1NwYW5uID0gMDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSWYgdGhlIGh5cGVybGluayBzcGFucyBtdWx0aXBsZSByb3dzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgUm93U3Bhbm4KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9yb3dTcGFubjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9yb3dTcGFubiA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFVzZWQgdG8gaGFuZGxlIG5vbiBhYnNvbHV0ZSBVUkkncy4gCi0gICAgICAgIC8vLyBJcyB1c2VkIGlmIElzQWJsc29sdXRlVXJpIGlzIHRydWUuIFRoZSBiYXNlIFVSSSB3aWxsIGhhdmUgYSBkdW1teSB2YWx1ZSBvZiB4bDovL25vbkFic29sdXRlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgVXJpIE9yaWdpbmFsVXJpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIGludGVybmFsIHNldDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgUklkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgIH0KK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWw7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBIeXBlcmxpbmtDbGFzcworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbEh5cGVyTGluayA6IFVyaSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgbmV3IGh5cGVybGluayB3aXRoIHRoZSBzcGVjaWZpZWQgVVJJCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idXJpU3RyaW5nIj5UaGUgVVJJPC9wYXJhbT4KKyAgcHVibGljIEV4Y2VsSHlwZXJMaW5rKHN0cmluZyB1cmlTdHJpbmcpCisgICAgICA6IGJhc2UodXJpU3RyaW5nKSB7CisgICAgT3JpZ2luYWxVcmkgPSB0aGlzOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSBuZXcgaHlwZXJsaW5rIHdpdGggdGhlIHNwZWNpZmllZCBVUkkuIFRoaXMgc3ludGF4IGlzIG9ic29sZXRlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idXJpU3RyaW5nIj5UaGUgVVJJPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJkb250RXNjYXBlIj48L3BhcmFtPgorICBbT2Jzb2xldGUoCisgICAgICAiYmFzZSBjb25zdHJ1Y3RvciAnU3lzdGVtLlVyaS5Vcmkoc3RyaW5nLCBib29sKScgaXMgb2Jzb2xldGU6ICdUaGUgY29uc3RydWN0b3IgaGFzIGJlZW4gZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBuZXcgRXhjZWxIeXBlckxpbmsoc3RyaW5nKS4gVGhlIGRvbnRFc2NhcGUgcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIGFsd2F5cyBmYWxzZS4iKV0KKyAgcHVibGljIEV4Y2VsSHlwZXJMaW5rKHN0cmluZyB1cmlTdHJpbmcsIGJvb2wgZG9udEVzY2FwZSkKKyAgICAgIDogYmFzZSh1cmlTdHJpbmcsIGRvbnRFc2NhcGUpIHsKKyAgICBPcmlnaW5hbFVyaSA9IHRoaXM7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBIG5ldyBoeXBlcmxpbmsgd2l0aCB0aGUgc3BlY2lmaWVkIFVSSSBhbmQga2luZAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InVyaVN0cmluZyI+VGhlIFVSSTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idXJpS2luZCI+S2luZCAoYWJzb2x1dGUvcmVsYXRpdmUgb3IgaW5kZXRlcm1pbmF0ZSk8L3BhcmFtPgorICBwdWJsaWMgRXhjZWxIeXBlckxpbmsoc3RyaW5nIHVyaVN0cmluZywgVXJpS2luZCB1cmlLaW5kKQorICAgICAgOiBiYXNlKHVyaVN0cmluZywgdXJpS2luZCkgeworICAgIE9yaWdpbmFsVXJpID0gdGhpczsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNoZWV0IGludGVybmFsIHJlZmVyZW5jZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InJlZmVyZW5jZUFkZHJlc3MiPkFkZHJlc3M8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImRpc3BsYXkiPkRpc3BsYXllZCB0ZXh0PC9wYXJhbT4KKyAgcHVibGljIEV4Y2VsSHlwZXJMaW5rKHN0cmluZyByZWZlcmVuY2VBZGRyZXNzLCBzdHJpbmcgZGlzcGxheSkKKyAgICAgIDogYmFzZSgKKyAgICAgICAgICAieGw6Ly9pbnRlcm5hbCIpIC8vVVJJIGlzIG5vdCB1c2VkIG9uIGludGVybmFsIGxpbmtzIHNvIHB1dCBhIGR1bW15IHVyaSBoZXJlLgorICB7CisgICAgX3JlZmVyZW5jZUFkZHJlc3MgPSByZWZlcmVuY2VBZGRyZXNzOworICAgIF9kaXNwbGF5ID0gZGlzcGxheTsKKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIF9yZWZlcmVuY2VBZGRyZXNzOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBFeGNlbCBhZGRyZXNzIGZvciBpbnRlcm5hbCBsaW5rcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBSZWZlcmVuY2VBZGRyZXNzIHsKKyAgICBnZXQgPT4gX3JlZmVyZW5jZUFkZHJlc3M7CisgICAgc2V0ID0+IF9yZWZlcmVuY2VBZGRyZXNzID0gdmFsdWU7CisgIH0KKworICBwcml2YXRlIHN0cmluZyBfZGlzcGxheSA9ICIiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIERpc3BsYXllZCB0ZXh0CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgRGlzcGxheSB7CisgICAgZ2V0ID0+IF9kaXNwbGF5OworICAgIHNldCA9PiBfZGlzcGxheSA9IHZhbHVlOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVG9vbHRpcAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIFRvb2xUaXAgeyBnZXQ7IHNldDsgfQorCisgIHByaXZhdGUgaW50IF9jb2xTcGFubjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgaHlwZXJsaW5rIHNwYW5zIG11bHRpcGxlIGNvbHVtbnMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBDb2xTcGFubiB7CisgICAgZ2V0ID0+IF9jb2xTcGFubjsKKyAgICBzZXQgPT4gX2NvbFNwYW5uID0gdmFsdWU7CisgIH0KKworICBwcml2YXRlIGludCBfcm93U3Bhbm47CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhlIGh5cGVybGluayBzcGFucyBtdWx0aXBsZSByb3dzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgUm93U3Bhbm4geworICAgIGdldCA9PiBfcm93U3Bhbm47CisgICAgc2V0ID0+IF9yb3dTcGFubiA9IHZhbHVlOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVXNlZCB0byBoYW5kbGUgbm9uIGFic29sdXRlIFVSSSdzLgorICAvLy8gSXMgdXNlZCBpZiBJc0FibHNvbHV0ZVVyaSBpcyB0cnVlLiBUaGUgYmFzZSBVUkkgd2lsbCBoYXZlIGEgZHVtbXkgdmFsdWUgb2YgeGw6Ly9ub25BYnNvbHV0ZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIFVyaSBPcmlnaW5hbFVyaSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgaW50ZXJuYWwgc3RyaW5nIFJJZCB7IGdldDsgc2V0OyB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxOYW1lZFJhbmdlLmNzIGIvRVBQbHVzL0V4Y2VsTmFtZWRSYW5nZS5jcwppbmRleCBlOGJlZjE3Li5kYTg2ODMwIDEwMDY0NAotLS0gYS9FUFBsdXMvRXhjZWxOYW1lZFJhbmdlLmNzCisrKyBiL0VQUGx1cy9FeGNlbE5hbWVkUmFuZ2UuY3MKQEAgLTEzLDExMCArMTMsOTIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQlBZGRlZCB0aGlzIGNsYXNzCQkgICAgICAgIDIwMTAtMDEtMjgKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQSBuYW1lZCByYW5nZS4gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsTmFtZWRSYW5nZSA6IEV4Y2VsUmFuZ2VCYXNlIAotICAgIHsKLSAgICAgICAgRXhjZWxXb3Jrc2hlZXQgX3NoZWV0OwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBIG5hbWVkIHJhbmdlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIG5hbWU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWVTaGVldCI+VGhlIHNoZWV0IGNvbnRhaW5pbmcgdGhlIG5hbWUuIG51bGwgaWYgaXRzIGEgZ2xvYmFsIG5hbWU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNoZWV0Ij5TaGVldCB3aGVyZSB0aGUgYWRkcmVzcyBwb2ludHM8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBhZGRyZXNzPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbmRleCI+VGhlIGluZGV4IGluIHRoZSBjb2xsZWN0aW9uPC9wYXJhbT4KLSAgICAgICAgcHVibGljIEV4Y2VsTmFtZWRSYW5nZShzdHJpbmcgbmFtZSwgRXhjZWxXb3Jrc2hlZXQgbmFtZVNoZWV0ICwgRXhjZWxXb3Jrc2hlZXQgc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBpbnQgaW5kZXgpIDoKLSAgICAgICAgICAgIGJhc2Uoc2hlZXQsIGFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5hbWUgPSBuYW1lOwotICAgICAgICAgICAgX3NoZWV0ID0gbmFtZVNoZWV0OwotICAgICAgICAgICAgSW5kZXggPSBpbmRleDsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOwogCi0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxOYW1lZFJhbmdlKHN0cmluZyBuYW1lLEV4Y2VsV29ya2Jvb2sgd2IsIEV4Y2VsV29ya3NoZWV0IG5hbWVTaGVldCwgaW50IGluZGV4KSA6Ci0gICAgICAgICAgICBiYXNlKHdiLCBuYW1lU2hlZXQsIG5hbWUsIHRydWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5hbWUgPSBuYW1lOwotICAgICAgICAgICAgX3NoZWV0ID0gbmFtZVNoZWV0OwotICAgICAgICAgICAgSW5kZXggPSBpbmRleDsKLSAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIEEgbmFtZWQgcmFuZ2UuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbE5hbWVkUmFuZ2UgOiBFeGNlbFJhbmdlQmFzZSB7CisgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3NoZWV0OwogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE5hbWUgb2YgdGhlIHJhbmdlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSXMgdGhlIG5hbWVkIHJhbmdlIGxvY2FsIGZvciB0aGUgc2hlZXQgCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgTG9jYWxTaGVldElkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfc2hlZXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zaGVldC5Qb3NpdGlvbklELTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGludCBJbmRleAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSXMgdGhlIG5hbWUgaGlkZGVuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIElzTmFtZUhpZGRlbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQSBjb21tZW50IGZvciB0aGUgTmFtZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWVDb21tZW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBvYmplY3QgTmFtZVZhbHVlIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIE5hbWVGb3JtdWxhIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOYW1lOwotICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgbmFtZWQgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj5UaGUgbmFtZTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZVNoZWV0Ij5UaGUgc2hlZXQgY29udGFpbmluZyB0aGUgbmFtZS4gbnVsbCBpZiBpdHMgYSBnbG9iYWwgbmFtZTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ic2hlZXQiPlNoZWV0IHdoZXJlIHRoZSBhZGRyZXNzIHBvaW50czwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIGFkZHJlc3M8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij5UaGUgaW5kZXggaW4gdGhlIGNvbGxlY3Rpb248L3BhcmFtPgorICBwdWJsaWMgRXhjZWxOYW1lZFJhbmdlKAorICAgICAgc3RyaW5nIG5hbWUsCisgICAgICBFeGNlbFdvcmtzaGVldCBuYW1lU2hlZXQsCisgICAgICBFeGNlbFdvcmtzaGVldCBzaGVldCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgaW50IGluZGV4KQorICAgICAgOiBiYXNlKHNoZWV0LCBhZGRyZXNzKSB7CisgICAgTmFtZSA9IG5hbWU7CisgICAgX3NoZWV0ID0gbmFtZVNoZWV0OworICAgIEluZGV4ID0gaW5kZXg7CisgIH0KIAorICBpbnRlcm5hbCBFeGNlbE5hbWVkUmFuZ2Uoc3RyaW5nIG5hbWUsIEV4Y2VsV29ya2Jvb2sgd2IsIEV4Y2VsV29ya3NoZWV0IG5hbWVTaGVldCwgaW50IGluZGV4KQorICAgICAgOiBiYXNlKHdiLCBuYW1lU2hlZXQsIG5hbWUsIHRydWUpIHsKKyAgICBOYW1lID0gbmFtZTsKKyAgICBfc2hlZXQgPSBuYW1lU2hlZXQ7CisgICAgSW5kZXggPSBpbmRleDsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE5hbWUgb2YgdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSXMgdGhlIG5hbWVkIHJhbmdlIGxvY2FsIGZvciB0aGUgc2hlZXQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBMb2NhbFNoZWV0SWQgeworICAgIGdldCB7CisgICAgICBpZiAoX3NoZWV0ID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgcmV0dXJuIF9zaGVldC5Qb3NpdGlvbklEIC0gMTsKICAgICB9CisgIH0KKworICBpbnRlcm5hbCBpbnQgSW5kZXggeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElzIHRoZSBuYW1lIGhpZGRlbgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBJc05hbWVIaWRkZW4geyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgY29tbWVudCBmb3IgdGhlIE5hbWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBOYW1lQ29tbWVudCB7IGdldDsgc2V0OyB9CisKKyAgaW50ZXJuYWwgb2JqZWN0IE5hbWVWYWx1ZSB7IGdldDsgc2V0OyB9CisKKyAgaW50ZXJuYWwgc3RyaW5nIE5hbWVGb3JtdWxhIHsgZ2V0OyBzZXQ7IH0KKworICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgeworICAgIHJldHVybiBOYW1lOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbi5jcyBiL0VQUGx1cy9FeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uLmNzCmluZGV4IDJjYWQ1MjguLmFiMjgxZjkgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9FeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uLmNzCisrKyBiL0VQUGx1cy9FeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywyMjggKzEzLDE5OCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCUFkZGVkIHRoaXMgY2xhc3MJCSAgICAgICAgMjAxMC0wMS0yOAogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQ29sbGVjdGlvbiBmb3IgbmFtZWQgcmFuZ2VzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbiA6IElFbnVtZXJhYmxlPEV4Y2VsTmFtZWRSYW5nZT4KLSAgICB7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsV29ya3NoZWV0IF93czsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxXb3JrYm9vayBfd2I7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24oRXhjZWxXb3JrYm9vayB3YikKLSAgICAgICAgewotICAgICAgICAgICAgX3diID0gd2I7Ci0gICAgICAgICAgICBfd3MgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24oRXhjZWxXb3JrYm9vayB3YiwgRXhjZWxXb3Jrc2hlZXQgd3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93YiA9IHdiOwotICAgICAgICAgICAgX3dzID0gd3M7Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxFeGNlbE5hbWVkUmFuZ2U+IF9saXN0ID0gbmV3IExpc3Q8RXhjZWxOYW1lZFJhbmdlPigpOwotICAgICAgICBEaWN0aW9uYXJ5PHN0cmluZywgaW50PiBfZGljID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+KFN0cmluZ0NvbXBhcmVyLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkIGEgbmV3IG5hbWVkIHJhbmdlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+VGhlIG5hbWU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJhbmdlIj5UaGUgcmFuZ2U8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgRXhjZWxOYW1lZFJhbmdlIEFkZChzdHJpbmcgTmFtZSwgRXhjZWxSYW5nZUJhc2UgUmFuZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsTmFtZWRSYW5nZSBpdGVtOwotICAgICAgICAgICAgaWYgKFJhbmdlLklzTmFtZSkKLSAgICAgICAgICAgIHsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOwogCi0gICAgICAgICAgICAgICAgaXRlbSA9IG5ldyBFeGNlbE5hbWVkUmFuZ2UoTmFtZSwgX3diLF93cywgX2RpYy5Db3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXRlbSA9IG5ldyBFeGNlbE5hbWVkUmFuZ2UoTmFtZSwgX3dzLCBSYW5nZS5Xb3Jrc2hlZXQsIFJhbmdlLkFkZHJlc3MsIF9kaWMuQ291bnQpOwotICAgICAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIENvbGxlY3Rpb24gZm9yIG5hbWVkIHJhbmdlcworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uIDogSUVudW1lcmFibGU8RXhjZWxOYW1lZFJhbmdlPiB7CisgIGludGVybmFsIEV4Y2VsV29ya3NoZWV0IF93czsKKyAgaW50ZXJuYWwgRXhjZWxXb3JrYm9vayBfd2I7CiAKLSAgICAgICAgICAgIEFkZE5hbWUoTmFtZSwgaXRlbSk7CisgIGludGVybmFsIEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24oRXhjZWxXb3JrYm9vayB3YikgeworICAgIF93YiA9IHdiOworICAgIF93cyA9IG51bGw7CisgIH0KIAotICAgICAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgICAgIH0KKyAgaW50ZXJuYWwgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbihFeGNlbFdvcmtib29rIHdiLCBFeGNlbFdvcmtzaGVldCB3cykgeworICAgIF93YiA9IHdiOworICAgIF93cyA9IHdzOworICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZE5hbWUoc3RyaW5nIE5hbWUsIEV4Y2VsTmFtZWRSYW5nZSBpdGVtKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJcyAnTmFtZScgYWxyZWFkeSBwcmVzZW50Ci0gICAgICAgICAgICBpZiAoX2RpYy5Db250YWluc0tleShOYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBfZGljW05hbWVdOwotICAgICAgICAgICAgICAgIGlmICgoMCA8PSBpbmRleCkgJiYgKGluZGV4IDwgX2xpc3QuQ291bnQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRXhjZWxOYW1lZFJhbmdlIGxpc3RJdGVtID0gX2xpc3RbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICBpZiAoKGxpc3RJdGVtICE9IG51bGwpICYmIChsaXN0SXRlbS5GdWxsQWRkcmVzcyAhPSBudWxsKSAmJiAobGlzdEl0ZW0uRnVsbEFkZHJlc3MgPT0gaXRlbS5GdWxsQWRkcmVzcykpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgIHByaXZhdGUgTGlzdDxFeGNlbE5hbWVkUmFuZ2U+IF9saXN0ID0gbmV3KCk7CisgIHByaXZhdGUgRGljdGlvbmFyeTxzdHJpbmcsIGludD4gX2RpYyA9IG5ldyhTdHJpbmdDb21wYXJlci5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSk7CiAKLSAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIk5hbWUgJ3swfScgaXMgZGVmaW5lZCBpbiB0aGUgd29ya3NoZWV0IG1vcmUgdGhhbiBvbmNlLiBGaXJzdCBhcyAnezF9JyBhbmQgc2Vjb25kIGFzICd7Mn0nLiIsIE5hbWUsIGxpc3RJdGVtLkZ1bGxBZGRyZXNzLCBpdGVtLkZ1bGxBZGRyZXNzKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL3Rocm93IG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiTmFtZSAnezB9JyBpcyBkZWZpbmVkIGluIHRoZSB3b3Jrc2hlZXQgbW9yZSB0aGFuIG9uY2UuIiwgTmFtZSkpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgX2RpYy5BZGQoTmFtZSwgX2xpc3QuQ291bnQpOwotICAgICAgICAgICAgX2xpc3QuQWRkKGl0ZW0pOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZCBhIGRlZmluZWQgbmFtZSByZWZlcmVuY2luZyB2YWx1ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBFeGNlbE5hbWVkUmFuZ2UgQWRkVmFsdWUoc3RyaW5nIE5hbWUsIG9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgRXhjZWxOYW1lZFJhbmdlKE5hbWUsX3diLCBfd3MsIF9kaWMuQ291bnQpOwotICAgICAgICAgICAgaXRlbS5OYW1lVmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgIEFkZE5hbWUoTmFtZSwgaXRlbSk7Ci0gICAgICAgICAgICByZXR1cm4gaXRlbTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZCBhIGRlZmluZWQgbmFtZSByZWZlcmVuY2luZyBhIGZvcm11bGEgLS0gdGhlIG1ldGhvZCBuYW1lIGNvbnRhaW5zIGEgdHlwby4KLSAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGlzIG9ic29sZXRlIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLSAgICAgICAgLy8vIFVzZSA8c2VlIGNyZWY9IkFkZEZvcm11bGEiLz4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkZvcm11bGEiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIFtPYnNvbGV0ZSgiQ2FsbCBBZGRGb3JtdWxhKCkgaW5zdGVhZC4gIFNlZSBJc3N1ZSBUcmFja2VyIElkICMxNDY4NyIpXQotICAgICAgICBwdWJsaWMgRXhjZWxOYW1lZFJhbmdlIEFkZEZvcm1sYShzdHJpbmcgTmFtZSwgc3RyaW5nIEZvcm11bGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAgdGhpcy5BZGRGb3JtdWxhKE5hbWUsIEZvcm11bGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkIGEgZGVmaW5lZCBuYW1lIHJlZmVyZW5jaW5nIGEgZm9ybXVsYQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRm9ybXVsYSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIEV4Y2VsTmFtZWRSYW5nZSBBZGRGb3JtdWxhKHN0cmluZyBOYW1lLCBzdHJpbmcgRm9ybXVsYSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgRXhjZWxOYW1lZFJhbmdlKE5hbWUsIF93YiwgX3dzLCBfZGljLkNvdW50KTsKLSAgICAgICAgICAgIGl0ZW0uTmFtZUZvcm11bGEgPSBGb3JtdWxhOwotICAgICAgICAgICAgQWRkTmFtZShOYW1lLCBpdGVtKTsKLSAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlbW92ZSBhIGRlZmluZWQgbmFtZSBmcm9tIHRoZSBjb2xsZWN0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+VGhlIG5hbWU8L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoc3RyaW5nIE5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKF9kaWMuQ29udGFpbnNLZXkoTmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGl4ID0gX2RpY1tOYW1lXTsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBpeCsxOyBpIDwgX2xpc3QuQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9kaWMuUmVtb3ZlKF9saXN0W2ldLk5hbWUpOwotICAgICAgICAgICAgICAgICAgICBfbGlzdFtpXS5JbmRleC0tOwotICAgICAgICAgICAgICAgICAgICBfZGljLkFkZChfbGlzdFtpXS5OYW1lLCBfbGlzdFtpXS5JbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9kaWMuUmVtb3ZlKE5hbWUpOwotICAgICAgICAgICAgICAgIF9saXN0LlJlbW92ZUF0KGl4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDaGVja3MgY29sbGVjdGlvbiBmb3IgdGhlIHByZXNlbmNlIG9mIGEga2V5Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ia2V5Ij5rZXkgdG8gc2VhcmNoIGZvcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz50cnVlIGlmIHRoZSBrZXkgaXMgaW4gdGhlIGNvbGxlY3Rpb248L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBib29sIENvbnRhaW5zS2V5KHN0cmluZyBrZXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfZGljLkNvbnRhaW5zS2V5KGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgQ291bnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9kaWMuQ291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTmFtZSBpbmRleGVyCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+VGhlIG5hbWUgKGtleSkgZm9yIGEgTmFtZWQgcmFuZ2U8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+YSByZWZlcmVuY2UgdG8gdGhlIHJhbmdlPC9yZXR1cm5zPgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBUaHJvd3MgYSBLZXlOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgY29sbGVjdGlvbi4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgcHVibGljIEV4Y2VsTmFtZWRSYW5nZSB0aGlzW3N0cmluZyBOYW1lXQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2xpc3RbX2RpY1tOYW1lXV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIEV4Y2VsTmFtZWRSYW5nZSB0aGlzW2ludCBJbmRleF0KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9saXN0W0luZGV4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICNyZWdpb24gIklFbnVtZXJhYmxlIgotICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlPEV4Y2VsTmFtZWRSYW5nZT4gTWVtYmVycwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbXBsZW1lbnQgaW50ZXJmYWNlIG1ldGhvZCBJRW51bWVyYXRvciZsdDtFeGNlbE5hbWVkUmFuZ2UmZ3Q7IEdldEVudW1lcmF0b3IoKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3I8RXhjZWxOYW1lZFJhbmdlPiBHZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9saXN0LkdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgICNyZWdpb24gSUVudW1lcmFibGUgTWVtYmVycwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbXBsZW1lbnQgaW50ZXJmYWNlIG1ldGhvZCBJRW51bWVyYXRhYmxlIEdldEVudW1lcmF0b3IoKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9saXN0LkdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgIGludGVybmFsIHZvaWQgQ2xlYXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZShDb3VudD4wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlbW92ZShfbGlzdFswXS5OYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgYSBuZXcgbmFtZWQgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj5UaGUgbmFtZTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icmFuZ2UiPlRoZSByYW5nZTwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbE5hbWVkUmFuZ2UgQWRkKHN0cmluZyBuYW1lLCBFeGNlbFJhbmdlQmFzZSByYW5nZSkgeworICAgIEV4Y2VsTmFtZWRSYW5nZSBpdGVtOworICAgIGlmIChyYW5nZS5Jc05hbWUpIHsKKyAgICAgIGl0ZW0gPSBuZXcobmFtZSwgX3diLCBfd3MsIF9kaWMuQ291bnQpOworICAgIH0gZWxzZSB7CisgICAgICBpdGVtID0gbmV3KG5hbWUsIF93cywgcmFuZ2UuV29ya3NoZWV0LCByYW5nZS5BZGRyZXNzLCBfZGljLkNvdW50KTsKICAgICB9CisKKyAgICBBZGROYW1lKG5hbWUsIGl0ZW0pOworCisgICAgcmV0dXJuIGl0ZW07CisgIH0KKworICBwcml2YXRlIHZvaWQgQWRkTmFtZShzdHJpbmcgbmFtZSwgRXhjZWxOYW1lZFJhbmdlIGl0ZW0pIHsKKyAgICAvLyBJcyAnTmFtZScgYWxyZWFkeSBwcmVzZW50CisgICAgaWYgKF9kaWMuQ29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgIGludCBpbmRleCA9IF9kaWNbbmFtZV07CisgICAgICBpZiAoKDAgPD0gaW5kZXgpICYmIChpbmRleCA8IF9saXN0LkNvdW50KSkgeworICAgICAgICBFeGNlbE5hbWVkUmFuZ2UgbGlzdEl0ZW0gPSBfbGlzdFtpbmRleF07CisgICAgICAgIGlmICgobGlzdEl0ZW0gIT0gbnVsbCkKKyAgICAgICAgICAgICYmIChsaXN0SXRlbS5GdWxsQWRkcmVzcyAhPSBudWxsKQorICAgICAgICAgICAgJiYgKGxpc3RJdGVtLkZ1bGxBZGRyZXNzID09IGl0ZW0uRnVsbEFkZHJlc3MpKSB7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy90aHJvdyBuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIk5hbWUgJ3swfScgaXMgZGVmaW5lZCBpbiB0aGUgd29ya3NoZWV0IG1vcmUgdGhhbiBvbmNlLiBGaXJzdCBhcyAnezF9JyBhbmQgc2Vjb25kIGFzICd7Mn0nLiIsIE5hbWUsIGxpc3RJdGVtLkZ1bGxBZGRyZXNzLCBpdGVtLkZ1bGxBZGRyZXNzKSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgLy90aHJvdyBuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIk5hbWUgJ3swfScgaXMgZGVmaW5lZCBpbiB0aGUgd29ya3NoZWV0IG1vcmUgdGhhbiBvbmNlLiIsIE5hbWUpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfZGljLkFkZChuYW1lLCBfbGlzdC5Db3VudCk7CisgICAgX2xpc3QuQWRkKGl0ZW0pOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIGEgZGVmaW5lZCBuYW1lIHJlZmVyZW5jaW5nIHZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIEV4Y2VsTmFtZWRSYW5nZSBBZGRWYWx1ZShzdHJpbmcgbmFtZSwgb2JqZWN0IHZhbHVlKSB7CisgICAgdmFyIGl0ZW0gPSBuZXcgRXhjZWxOYW1lZFJhbmdlKG5hbWUsIF93YiwgX3dzLCBfZGljLkNvdW50KTsKKyAgICBpdGVtLk5hbWVWYWx1ZSA9IHZhbHVlOworICAgIEFkZE5hbWUobmFtZSwgaXRlbSk7CisgICAgcmV0dXJuIGl0ZW07CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgYSBkZWZpbmVkIG5hbWUgcmVmZXJlbmNpbmcgYSBmb3JtdWxhIC0tIHRoZSBtZXRob2QgbmFtZSBjb250YWlucyBhIHR5cG8uCisgIC8vLyBUaGlzIG1ldGhvZCBpcyBvYnNvbGV0ZSBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCisgIC8vLyBVc2UgPHNlZSBjcmVmPSJBZGRGb3JtdWxhIi8+CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmb3JtdWxhIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBbT2Jzb2xldGUoIkNhbGwgQWRkRm9ybXVsYSgpIGluc3RlYWQuICBTZWUgSXNzdWUgVHJhY2tlciBJZCAjMTQ2ODciKV0KKyAgcHVibGljIEV4Y2VsTmFtZWRSYW5nZSBBZGRGb3JtbGEoc3RyaW5nIG5hbWUsIHN0cmluZyBmb3JtdWxhKSB7CisgICAgcmV0dXJuIEFkZEZvcm11bGEobmFtZSwgZm9ybXVsYSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgYSBkZWZpbmVkIG5hbWUgcmVmZXJlbmNpbmcgYSBmb3JtdWxhCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmb3JtdWxhIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxOYW1lZFJhbmdlIEFkZEZvcm11bGEoc3RyaW5nIG5hbWUsIHN0cmluZyBmb3JtdWxhKSB7CisgICAgdmFyIGl0ZW0gPSBuZXcgRXhjZWxOYW1lZFJhbmdlKG5hbWUsIF93YiwgX3dzLCBfZGljLkNvdW50KTsKKyAgICBpdGVtLk5hbWVGb3JtdWxhID0gZm9ybXVsYTsKKyAgICBBZGROYW1lKG5hbWUsIGl0ZW0pOworICAgIHJldHVybiBpdGVtOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmVtb3ZlIGEgZGVmaW5lZCBuYW1lIGZyb20gdGhlIGNvbGxlY3Rpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj5UaGUgbmFtZTwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIFJlbW92ZShzdHJpbmcgbmFtZSkgeworICAgIGlmIChfZGljLkNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICB2YXIgaXggPSBfZGljW25hbWVdOworCisgICAgICBmb3IgKGludCBpID0gaXggKyAxOyBpIDwgX2xpc3QuQ291bnQ7IGkrKykgeworICAgICAgICBfZGljLlJlbW92ZShfbGlzdFtpXS5OYW1lKTsKKyAgICAgICAgX2xpc3RbaV0uSW5kZXgtLTsKKyAgICAgICAgX2RpYy5BZGQoX2xpc3RbaV0uTmFtZSwgX2xpc3RbaV0uSW5kZXgpOworICAgICAgfQorICAgICAgX2RpYy5SZW1vdmUobmFtZSk7CisgICAgICBfbGlzdC5SZW1vdmVBdChpeCk7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ2hlY2tzIGNvbGxlY3Rpb24gZm9yIHRoZSBwcmVzZW5jZSBvZiBhIGtleQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImtleSI+a2V5IHRvIHNlYXJjaCBmb3I8L3BhcmFtPgorICAvLy8gPHJldHVybnM+dHJ1ZSBpZiB0aGUga2V5IGlzIGluIHRoZSBjb2xsZWN0aW9uPC9yZXR1cm5zPgorICBwdWJsaWMgYm9vbCBDb250YWluc0tleShzdHJpbmcga2V5KSB7CisgICAgcmV0dXJuIF9kaWMuQ29udGFpbnNLZXkoa2V5KTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBjdXJyZW50IG51bWJlciBvZiBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IENvdW50ID0+IF9kaWMuQ291bnQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTmFtZSBpbmRleGVyCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIG5hbWUgKGtleSkgZm9yIGEgTmFtZWQgcmFuZ2U8L3BhcmFtPgorICAvLy8gPHJldHVybnM+YSByZWZlcmVuY2UgdG8gdGhlIHJhbmdlPC9yZXR1cm5zPgorICAvLy8gPHJlbWFya3M+CisgIC8vLyBUaHJvd3MgYSBLZXlOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgY29sbGVjdGlvbi4KKyAgLy8vIDwvcmVtYXJrcz4KKyAgcHVibGljIEV4Y2VsTmFtZWRSYW5nZSB0aGlzW3N0cmluZyBuYW1lXSB7CisgICAgZ2V0IHsgcmV0dXJuIF9saXN0W19kaWNbbmFtZV1dOyB9CisgIH0KKworICBwdWJsaWMgRXhjZWxOYW1lZFJhbmdlIHRoaXNbaW50IGluZGV4XSB7CisgICAgZ2V0IHsgcmV0dXJuIF9saXN0W2luZGV4XTsgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW1wbGVtZW50IGludGVyZmFjZSBtZXRob2QgSUVudW1lcmF0b3ImbHQ7RXhjZWxOYW1lZFJhbmdlJmd0OyBHZXRFbnVtZXJhdG9yKCkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIElFbnVtZXJhdG9yPEV4Y2VsTmFtZWRSYW5nZT4gR2V0RW51bWVyYXRvcigpIHsKKyAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW1wbGVtZW50IGludGVyZmFjZSBtZXRob2QgSUVudW1lcmF0YWJsZSBHZXRFbnVtZXJhdG9yKCkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgSUVudW1lcmF0b3IgSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpIHsKKyAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBDbGVhcigpIHsKKyAgICB3aGlsZSAoQ291bnQgPiAwKSB7CisgICAgICBSZW1vdmUoX2xpc3RbMF0uTmFtZSk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxQYWNrYWdlLmNzIGIvRVBQbHVzL0V4Y2VsUGFja2FnZS5jcwppbmRleCA3OGM0MDgzLi41YmQ5Mzk1IDEwMDY0NAotLS0gYS9FUFBsdXMvRXhjZWxQYWNrYWdlLmNzCisrKyBiL0VQUGx1cy9FeGNlbFBhY2thZ2UuY3MKQEAgLTEzLDM1MiArMTMsMzQ5IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCi0gKiBTdGFybnV0byBEaSBUb3BvICYgSmFuIEvDpGxsbWFuICAgQWRkZWQgc3RyZWFtIGNvbnN0cnVjdG9ycyAKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBMb2FkIG1ldGhvZCBTYXZlIGFzIAorICogU3Rhcm51dG8gRGkgVG9wbyAmIEphbiBLw6RsbG1hbiAgIEFkZGVkIHN0cmVhbSBjb25zdHJ1Y3RvcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBMb2FkIG1ldGhvZCBTYXZlIGFzCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgMjAxMC0wMy0xNAogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeTsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Ci1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTWFwcyB0byBEb3ROZXRaaXBzIENvbXByZXNzaW9uTGV2ZWwgZW51bQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gQ29tcHJlc3Npb25MZXZlbAotICAgIHsKLSAgICAgICAgTGV2ZWwwID0gMCwKLSAgICAgICAgTm9uZSA9IDAsCi0gICAgICAgIExldmVsMSA9IDEsCi0gICAgICAgIEJlc3RTcGVlZCA9IDEsCi0gICAgICAgIExldmVsMiA9IDIsCi0gICAgICAgIExldmVsMyA9IDMsCi0gICAgICAgIExldmVsNCA9IDQsCi0gICAgICAgIExldmVsNSA9IDUsCi0gICAgICAgIExldmVsNiA9IDYsCi0gICAgICAgIERlZmF1bHQgPSA2LAotICAgICAgICBMZXZlbDcgPSA3LAotICAgICAgICBMZXZlbDggPSA4LAotICAgICAgICBCZXN0Q29tcHJlc3Npb24gPSA5LAotICAgICAgICBMZXZlbDkgPSA5LAotICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFJlcHJlc2VudHMgYW4gRXhjZWwgMjAwNy8yMDEwIFhMU1ggZmlsZSBwYWNrYWdlLiAgCi0gICAgLy8vIFRoaXMgaXMgdGhlIHRvcC1sZXZlbCBvYmplY3QgdG8gYWNjZXNzIGFsbCBwYXJ0cyBvZiB0aGUgZG9jdW1lbnQuCi0gICAgLy8vIDxjb2RlPgotCS8vLyAgICAgRmlsZUluZm8gbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUxLnhsc3giKTsKLQkvLy8gCWlmIChuZXdGaWxlLkV4aXN0cykKLQkvLy8gCXsKLQkvLy8gCQluZXdGaWxlLkRlbGV0ZSgpOyAgLy8gZW5zdXJlcyB3ZSBjcmVhdGUgYSBuZXcgd29ya2Jvb2sKLQkvLy8gCQluZXdGaWxlID0gbmV3IEZpbGVJbmZvKG91dHB1dERpci5GdWxsTmFtZSArIEAiXHNhbXBsZTEueGxzeCIpOwotCS8vLyAJfQotCS8vLyAJdXNpbmcgKEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXdGaWxlKSkKLSAgICAvLy8gICAgIHsKLSAgICAvLy8gICAgICAgICAvLyBhZGQgYSBuZXcgd29ya3NoZWV0IHRvIHRoZSBlbXB0eSB3b3JrYm9vawotICAgIC8vLyAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkludmVudG9yeSIpOwotICAgIC8vLyAgICAgICAgIC8vQWRkIHRoZSBoZWFkZXJzCi0gICAgLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWzEsIDFdLlZhbHVlID0gIklEIjsKLSAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgMl0uVmFsdWUgPSAiUHJvZHVjdCI7Ci0gICAgLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWzEsIDNdLlZhbHVlID0gIlF1YW50aXR5IjsKLSAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgNF0uVmFsdWUgPSAiUHJpY2UiOwotICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCA1XS5WYWx1ZSA9ICJWYWx1ZSI7Ci0gICAgLy8vCi0gICAgLy8vICAgICAgICAgLy9BZGQgc29tZSBpdGVtcy4uLgotICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICIxMjAwMSI7Ci0gICAgLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJCMiJdLlZhbHVlID0gIk5haWxzIjsKLSAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkMyIl0uVmFsdWUgPSAzNzsKLSAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkQyIl0uVmFsdWUgPSAzLjk5OwotICAgIC8vLwotICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTMiXS5WYWx1ZSA9ICIxMjAwMiI7Ci0gICAgLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gIkhhbW1lciI7Ci0gICAgLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJDMyJdLlZhbHVlID0gNTsKLSAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkQzIl0uVmFsdWUgPSAxMi4xMDsKLSAgICAvLy8KLSAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkE0Il0uVmFsdWUgPSAiMTIwMDMiOwotICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQjQiXS5WYWx1ZSA9ICJTYXciOwotICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQzQiXS5WYWx1ZSA9IDEyOwotICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siRDQiXS5WYWx1ZSA9IDE1LjM3OwotICAgIC8vLwotICAgIC8vLyAgICAgICAgIC8vQWRkIGEgZm9ybXVsYSBmb3IgdGhlIHZhbHVlLWNvbHVtbgotICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siRTI6RTQiXS5Gb3JtdWxhID0gIkMyKkQyIjsKLSAgICAvLy8KLSAgICAvLy8gICAgICAgICAgICAvL09rIG5vdyBmb3JtYXQgdGhlIHZhbHVlczsKLSAgICAvLy8gICAgICAgICB1c2luZyAodmFyIHJhbmdlID0gd29ya3NoZWV0LkNlbGxzWzEsIDEsIDEsIDVdKSAKLSAgICAvLy8gICAgICAgICAgewotICAgIC8vLyAgICAgICAgICAgICByYW5nZS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwotICAgIC8vLyAgICAgICAgICAgICByYW5nZS5TdHlsZS5GaWxsLlBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuU29saWQ7Ci0gICAgLy8vICAgICAgICAgICAgIHJhbmdlLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkRhcmtCbHVlKTsKLSAgICAvLy8gICAgICAgICAgICAgcmFuZ2UuU3R5bGUuRm9udC5Db2xvci5TZXRDb2xvcihDb2xvci5XaGl0ZSk7Ci0gICAgLy8vICAgICAgICAgfQotICAgIC8vLwotICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTU6RTUiXS5TdHlsZS5Cb3JkZXIuVG9wLlN0eWxlID0gRXhjZWxCb3JkZXJTdHlsZS5UaGluOwotICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTU6RTUiXS5TdHlsZS5Gb250LkJvbGQgPSB0cnVlOwotICAgIC8vLwotICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1s1LCAzLCA1LCA1XS5Gb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgiU1VCVE9UQUwoOSx7MH0pIiwgbmV3IEV4Y2VsQWRkcmVzcygyLDMsNCwzKS5BZGRyZXNzKTsKLSAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkMyOkM1Il0uU3R5bGUuTnVtYmVyZm9ybWF0LkZvcm1hdCA9ICIjLCMjMCI7Ci0gICAgLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJEMjpFNSJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAuMDAiOwotICAgIC8vLwotICAgIC8vLyAgICAgICAgIC8vQ3JlYXRlIGFuIGF1dG9maWx0ZXIgZm9yIHRoZSByYW5nZQotICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTE6RTQiXS5BdXRvRmlsdGVyID0gdHJ1ZTsKLSAgICAvLy8KLSAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkExOkU1Il0uQXV0b0ZpdENvbHVtbnMoMCk7Ci0gICAgLy8vCi0gICAgLy8vICAgICAgICAgLy8gbGV0cyBzZXQgdGhlIGhlYWRlciB0ZXh0IAotICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5IZWFkZXJGb290ZXIub2RkSGVhZGVyLkNlbnRlcmVkVGV4dCA9ICImYW1wOzI0JmFtcDtVJmFtcDtcIkFyaWFsLFJlZ3VsYXIgQm9sZFwiIEludmVudG9yeSI7Ci0gICAgLy8vICAgICAgICAgLy8gYWRkIHRoZSBwYWdlIG51bWJlciB0byB0aGUgZm9vdGVyIHBsdXMgdGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcwotICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5IZWFkZXJGb290ZXIub2RkRm9vdGVyLlJpZ2h0QWxpZ25lZFRleHQgPQotICAgIC8vLyAgICAgICAgIHN0cmluZy5Gb3JtYXQoIlBhZ2UgezB9IG9mIHsxfSIsIEV4Y2VsSGVhZGVyRm9vdGVyLlBhZ2VOdW1iZXIsIEV4Y2VsSGVhZGVyRm9vdGVyLk51bWJlck9mUGFnZXMpOwotICAgIC8vLyAgICAgICAgIC8vIGFkZCB0aGUgc2hlZXQgbmFtZSB0byB0aGUgZm9vdGVyCi0gICAgLy8vICAgICAgICAgd29ya3NoZWV0LkhlYWRlckZvb3Rlci5vZGRGb290ZXIuQ2VudGVyZWRUZXh0ID0gRXhjZWxIZWFkZXJGb290ZXIuU2hlZXROYW1lOwotICAgIC8vLyAgICAgICAgIC8vIGFkZCB0aGUgZmlsZSBwYXRoIHRvIHRoZSBmb290ZXIKLSAgICAvLy8gICAgICAgICB3b3Jrc2hlZXQuSGVhZGVyRm9vdGVyLm9kZEZvb3Rlci5MZWZ0QWxpZ25lZFRleHQgPSBFeGNlbEhlYWRlckZvb3Rlci5GaWxlUGF0aCArIEV4Y2VsSGVhZGVyRm9vdGVyLkZpbGVOYW1lOwotICAgIC8vLwotICAgIC8vLyAgICAgICAgIHdvcmtzaGVldC5QcmludGVyU2V0dGluZ3MuUmVwZWF0Um93cyA9IHdvcmtzaGVldC5DZWxsc1siMToyIl07Ci0gICAgLy8vICAgICAgICAgd29ya3NoZWV0LlByaW50ZXJTZXR0aW5ncy5SZXBlYXRDb2x1bW5zID0gd29ya3NoZWV0LkNlbGxzWyJBOkciXTsKLSAgICAvLy8KLSAgICAvLy8gICAgICAgICAgLy8gQ2hhbmdlIHRoZSBzaGVldCB2aWV3IHRvIHNob3cgaXQgaW4gcGFnZSBsYXlvdXQgbW9kZQotICAgIC8vLyAgICAgICAgICAgd29ya3NoZWV0LlZpZXcuUGFnZUxheW91dFZpZXcgPSB0cnVlOwotICAgIC8vLwotICAgIC8vLyAgICAgICAgIC8vIHNldCBzb21lIGRvY3VtZW50IHByb3BlcnRpZXMKLSAgICAvLy8gICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuVGl0bGUgPSAiSW52ZXJ0b3J5IjsKLSAgICAvLy8gICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuQXV0aG9yID0gIkphbiBL77+9bGxtYW4iOwotICAgIC8vLyAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5Db21tZW50cyA9ICJUaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSBhbiBFeGNlbCAyMDA3IHdvcmtib29rIHVzaW5nIEVQUGx1cyI7Ci0gICAgLy8vCi0gICAgLy8vICAgICAgICAgLy8gc2V0IHNvbWUgZXh0ZW5kZWQgcHJvcGVydHkgdmFsdWVzCi0gICAgLy8vICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkNvbXBhbnkgPSAiQWR2ZW50dXJlV29ya3MgSW5jLiI7Ci0gICAgLy8vCi0gICAgLy8vICAgICAgICAgLy8gc2V0IHNvbWUgY3VzdG9tIHByb3BlcnR5IHZhbHVlcwotICAgIC8vLyAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5TZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJDaGVja2VkIGJ5IiwgIkphbiBL77+9bGxtYW4iKTsKLSAgICAvLy8gICAgICAgICBwYWNrYWdlLldvcmtib29rLlByb3BlcnRpZXMuU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZSgiQXNzZW1ibHlOYW1lIiwgIkVQUGx1cyIpOwotICAgIC8vLwotICAgIC8vLyAgICAgICAgIC8vIHNhdmUgb3VyIG5ldyB3b3JrYm9vayBhbmQgd2UgYXJlIGRvbmUhCi0gICAgLy8vICAgICAgICAgcGFja2FnZS5TYXZlKCk7Ci0gICAgLy8vCi0gICAgLy8vICAgICAgIH0KLSAgICAvLy8KLSAgICAvLy8gICAgICAgcmV0dXJuIG5ld0ZpbGUuRnVsbE5hbWU7Ci0gICAgLy8vIDwvY29kZT4KLSAgICAvLy8gTW9yZSBzYW1wbGVzIGNhbiBiZSBmb3VuZCBhdCAgPGEgaHJlZj0iaHR0cDovL2VwcGx1cy5jb2RlcGxleC5jb20vIj5odHRwOi8vZXBwbHVzLmNvZGVwbGV4LmNvbS88L2E+Ci0gICAgLy8vIDwvc3VtbWFyeT4KLQlwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsUGFja2FnZQotCXsKLSAgICAgICAgaW50ZXJuYWwgY29uc3QgYm9vbCBwcmVzZXJ2ZVdoaXRlc3BhY2U9ZmFsc2U7Ci0gICAgICAgIAotCQkjcmVnaW9uIFByb3BlcnRpZXMKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gRXh0ZW50aW9uIFNjaGVtYSB0eXBlcwotCQkvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hWG1sRXh0ZW5zaW9uID0gImFwcGxpY2F0aW9uL3htbCI7Ci0gICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBzY2hlbWFSZWxzRXh0ZW5zaW9uID0gImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1wYWNrYWdlLnJlbGF0aW9uc2hpcHMreG1sIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotCQkvLy8gTWFpbiBYbWwgc2NoZW1hIG5hbWUKLQkJLy8vIDwvc3VtbWFyeT4KLQkJaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYU1haW4gPSBAImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiI7Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFJlbGF0aW9uc2hpcCBzY2hlbWEgbmFtZQotCQkvLy8gPC9zdW1tYXJ5PgotCQlpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hUmVsYXRpb25zaGlwcyA9IEAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcyI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYURyYXdpbmdzID0gQCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbWFpbiI7CiAKLSAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYU1pY3Jvc29mdFZtbCA9IEAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiOwotICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hTWljcm9zb2Z0T2ZmaWNlID0gInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSI7Ci0gICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBzY2hlbWFNaWNyb3NvZnRFeGNlbCA9ICJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpleGNlbCI7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbDsKIAotICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hQ2hhcnQgPSBAImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9jaGFydCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYUh5cGVybGluayA9IEAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9oeXBlcmxpbmsiOwotICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hQ29tbWVudCA9IEAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9jb21tZW50cyI7Ci0gICAgICAgIC8vT2ZmaWNlIHByb3BlcnRpZXMKLSAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYUNvcmUgPSBAImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvbWV0YWRhdGEvY29yZS1wcm9wZXJ0aWVzIjsKLSAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYUV4dGVuZGVkID0gQCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9leHRlbmRlZC1wcm9wZXJ0aWVzIjsKLSAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYUN1c3RvbSA9IEAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvY3VzdG9tLXByb3BlcnRpZXMiOwotICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hRGMgPSBAImh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIjsKLSAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYURjVGVybXMgPSBAImh0dHA6Ly9wdXJsLm9yZy9kYy90ZXJtcy8iOwotICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hRGNtaVR5cGUgPSBAImh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS8iOwotICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hWHNpID0gQCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7Ci0gICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBzY2hlbWFWdCA9IEAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvZG9jUHJvcHNWVHlwZXMiOworLy8vIDxzdW1tYXJ5PgorLy8vIE1hcHMgdG8gRG90TmV0WmlwcyBDb21wcmVzc2lvbkxldmVsIGVudW0KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgZW51bSBDb21wcmVzc2lvbkxldmVsIHsKKyAgTGV2ZWwwID0gMCwKKyAgTm9uZSA9IDAsCisgIExldmVsMSA9IDEsCisgIEJlc3RTcGVlZCA9IDEsCisgIExldmVsMiA9IDIsCisgIExldmVsMyA9IDMsCisgIExldmVsNCA9IDQsCisgIExldmVsNSA9IDUsCisgIExldmVsNiA9IDYsCisgIERlZmF1bHQgPSA2LAorICBMZXZlbDcgPSA3LAorICBMZXZlbDggPSA4LAorICBCZXN0Q29tcHJlc3Npb24gPSA5LAorICBMZXZlbDkgPSA5LAorfQogCi0gICAgICAgIC8vUGl2b3R0YWJsZXMKLSAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYVBpdm90VGFibGUgPSBAImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnBpdm90VGFibGUreG1sIjsKLSAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIHNjaGVtYVBpdm90Q2FjaGVEZWZpbml0aW9uID0gQCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5waXZvdENhY2hlRGVmaW5pdGlvbit4bWwiOwotICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgc2NoZW1hUGl2b3RDYWNoZVJlY29yZHMgPSBAImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnBpdm90Q2FjaGVSZWNvcmRzK3htbCI7CisvLy8gPHN1bW1hcnk+CisvLy8gUmVwcmVzZW50cyBhbiBFeGNlbCAyMDA3LzIwMTAgWExTWCBmaWxlIHBhY2thZ2UuCisvLy8gVGhpcyBpcyB0aGUgdG9wLWxldmVsIG9iamVjdCB0byBhY2Nlc3MgYWxsIHBhcnRzIG9mIHRoZSBkb2N1bWVudC4KKy8vLyA8Y29kZT4KKy8vLyAgICAgRmlsZUluZm8gbmV3RmlsZSA9IG5ldyBGaWxlSW5mbyhvdXRwdXREaXIuRnVsbE5hbWUgKyBAIlxzYW1wbGUxLnhsc3giKTsKKy8vLyAJaWYgKG5ld0ZpbGUuRXhpc3RzKQorLy8vIAl7CisvLy8gCQluZXdGaWxlLkRlbGV0ZSgpOyAgLy8gZW5zdXJlcyB3ZSBjcmVhdGUgYSBuZXcgd29ya2Jvb2sKKy8vLyAJCW5ld0ZpbGUgPSBuZXcgRmlsZUluZm8ob3V0cHV0RGlyLkZ1bGxOYW1lICsgQCJcc2FtcGxlMS54bHN4Iik7CisvLy8gCX0KKy8vLyAJdXNpbmcgKEV4Y2VsUGFja2FnZSBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXdGaWxlKSkKKy8vLyAgICAgeworLy8vICAgICAgICAgLy8gYWRkIGEgbmV3IHdvcmtzaGVldCB0byB0aGUgZW1wdHkgd29ya2Jvb2sKKy8vLyAgICAgICAgIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5BZGQoIkludmVudG9yeSIpOworLy8vICAgICAgICAgLy9BZGQgdGhlIGhlYWRlcnMKKy8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCAxXS5WYWx1ZSA9ICJJRCI7CisvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgMl0uVmFsdWUgPSAiUHJvZHVjdCI7CisvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbMSwgM10uVmFsdWUgPSAiUXVhbnRpdHkiOworLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWzEsIDRdLlZhbHVlID0gIlByaWNlIjsKKy8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1sxLCA1XS5WYWx1ZSA9ICJWYWx1ZSI7CisvLy8KKy8vLyAgICAgICAgIC8vQWRkIHNvbWUgaXRlbXMuLi4KKy8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTIiXS5WYWx1ZSA9ICIxMjAwMSI7CisvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkIyIl0uVmFsdWUgPSAiTmFpbHMiOworLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJDMiJdLlZhbHVlID0gMzc7CisvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkQyIl0uVmFsdWUgPSAzLjk5OworLy8vCisvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkEzIl0uVmFsdWUgPSAiMTIwMDIiOworLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJCMyJdLlZhbHVlID0gIkhhbW1lciI7CisvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkMzIl0uVmFsdWUgPSA1OworLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJEMyJdLlZhbHVlID0gMTIuMTA7CisvLy8KKy8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTQiXS5WYWx1ZSA9ICIxMjAwMyI7CisvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkI0Il0uVmFsdWUgPSAiU2F3IjsKKy8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQzQiXS5WYWx1ZSA9IDEyOworLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJENCJdLlZhbHVlID0gMTUuMzc7CisvLy8KKy8vLyAgICAgICAgIC8vQWRkIGEgZm9ybXVsYSBmb3IgdGhlIHZhbHVlLWNvbHVtbgorLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJFMjpFNCJdLkZvcm11bGEgPSAiQzIqRDIiOworLy8vCisvLy8gICAgICAgICAgICAvL09rIG5vdyBmb3JtYXQgdGhlIHZhbHVlczsKKy8vLyAgICAgICAgIHVzaW5nICh2YXIgcmFuZ2UgPSB3b3Jrc2hlZXQuQ2VsbHNbMSwgMSwgMSwgNV0pCisvLy8gICAgICAgICAgeworLy8vICAgICAgICAgICAgIHJhbmdlLlN0eWxlLkZvbnQuQm9sZCA9IHRydWU7CisvLy8gICAgICAgICAgICAgcmFuZ2UuU3R5bGUuRmlsbC5QYXR0ZXJuVHlwZSA9IEV4Y2VsRmlsbFN0eWxlLlNvbGlkOworLy8vICAgICAgICAgICAgIHJhbmdlLlN0eWxlLkZpbGwuQmFja2dyb3VuZENvbG9yLlNldENvbG9yKENvbG9yLkRhcmtCbHVlKTsKKy8vLyAgICAgICAgICAgICByYW5nZS5TdHlsZS5Gb250LkNvbG9yLlNldENvbG9yKENvbG9yLldoaXRlKTsKKy8vLyAgICAgICAgIH0KKy8vLworLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBNTpFNSJdLlN0eWxlLkJvcmRlci5Ub3AuU3R5bGUgPSBFeGNlbEJvcmRlclN0eWxlLlRoaW47CisvLy8gICAgICAgICB3b3Jrc2hlZXQuQ2VsbHNbIkE1OkU1Il0uU3R5bGUuRm9udC5Cb2xkID0gdHJ1ZTsKKy8vLworLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWzUsIDMsIDUsIDVdLkZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KCJTVUJUT1RBTCg5LHswfSkiLCBuZXcgRXhjZWxBZGRyZXNzKDIsMyw0LDMpLkFkZHJlc3MpOworLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJDMjpDNSJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAiOworLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJEMjpFNSJdLlN0eWxlLk51bWJlcmZvcm1hdC5Gb3JtYXQgPSAiIywjIzAuMDAiOworLy8vCisvLy8gICAgICAgICAvL0NyZWF0ZSBhbiBhdXRvZmlsdGVyIGZvciB0aGUgcmFuZ2UKKy8vLyAgICAgICAgIHdvcmtzaGVldC5DZWxsc1siQTE6RTQiXS5BdXRvRmlsdGVyID0gdHJ1ZTsKKy8vLworLy8vICAgICAgICAgd29ya3NoZWV0LkNlbGxzWyJBMTpFNSJdLkF1dG9GaXRDb2x1bW5zKDApOworLy8vCisvLy8gICAgICAgICAvLyBsZXRzIHNldCB0aGUgaGVhZGVyIHRleHQKKy8vLyAgICAgICAgIHdvcmtzaGVldC5IZWFkZXJGb290ZXIub2RkSGVhZGVyLkNlbnRlcmVkVGV4dCA9ICImYW1wOzI0JmFtcDtVJmFtcDtcIkFyaWFsLFJlZ3VsYXIgQm9sZFwiIEludmVudG9yeSI7CisvLy8gICAgICAgICAvLyBhZGQgdGhlIHBhZ2UgbnVtYmVyIHRvIHRoZSBmb290ZXIgcGx1cyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzCisvLy8gICAgICAgICB3b3Jrc2hlZXQuSGVhZGVyRm9vdGVyLm9kZEZvb3Rlci5SaWdodEFsaWduZWRUZXh0ID0KKy8vLyAgICAgICAgIHN0cmluZy5Gb3JtYXQoIlBhZ2UgezB9IG9mIHsxfSIsIEV4Y2VsSGVhZGVyRm9vdGVyLlBhZ2VOdW1iZXIsIEV4Y2VsSGVhZGVyRm9vdGVyLk51bWJlck9mUGFnZXMpOworLy8vICAgICAgICAgLy8gYWRkIHRoZSBzaGVldCBuYW1lIHRvIHRoZSBmb290ZXIKKy8vLyAgICAgICAgIHdvcmtzaGVldC5IZWFkZXJGb290ZXIub2RkRm9vdGVyLkNlbnRlcmVkVGV4dCA9IEV4Y2VsSGVhZGVyRm9vdGVyLlNoZWV0TmFtZTsKKy8vLyAgICAgICAgIC8vIGFkZCB0aGUgZmlsZSBwYXRoIHRvIHRoZSBmb290ZXIKKy8vLyAgICAgICAgIHdvcmtzaGVldC5IZWFkZXJGb290ZXIub2RkRm9vdGVyLkxlZnRBbGlnbmVkVGV4dCA9IEV4Y2VsSGVhZGVyRm9vdGVyLkZpbGVQYXRoICsgRXhjZWxIZWFkZXJGb290ZXIuRmlsZU5hbWU7CisvLy8KKy8vLyAgICAgICAgIHdvcmtzaGVldC5QcmludGVyU2V0dGluZ3MuUmVwZWF0Um93cyA9IHdvcmtzaGVldC5DZWxsc1siMToyIl07CisvLy8gICAgICAgICB3b3Jrc2hlZXQuUHJpbnRlclNldHRpbmdzLlJlcGVhdENvbHVtbnMgPSB3b3Jrc2hlZXQuQ2VsbHNbIkE6RyJdOworLy8vCisvLy8gICAgICAgICAgLy8gQ2hhbmdlIHRoZSBzaGVldCB2aWV3IHRvIHNob3cgaXQgaW4gcGFnZSBsYXlvdXQgbW9kZQorLy8vICAgICAgICAgICB3b3Jrc2hlZXQuVmlldy5QYWdlTGF5b3V0VmlldyA9IHRydWU7CisvLy8KKy8vLyAgICAgICAgIC8vIHNldCBzb21lIGRvY3VtZW50IHByb3BlcnRpZXMKKy8vLyAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5UaXRsZSA9ICJJbnZlcnRvcnkiOworLy8vICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkF1dGhvciA9ICJKYW4gS++/vWxsbWFuIjsKKy8vLyAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5Db21tZW50cyA9ICJUaGlzIHNhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSBhbiBFeGNlbCAyMDA3IHdvcmtib29rIHVzaW5nIEVQUGx1cyI7CisvLy8KKy8vLyAgICAgICAgIC8vIHNldCBzb21lIGV4dGVuZGVkIHByb3BlcnR5IHZhbHVlcworLy8vICAgICAgICAgcGFja2FnZS5Xb3JrYm9vay5Qcm9wZXJ0aWVzLkNvbXBhbnkgPSAiQWR2ZW50dXJlV29ya3MgSW5jLiI7CisvLy8KKy8vLyAgICAgICAgIC8vIHNldCBzb21lIGN1c3RvbSBwcm9wZXJ0eSB2YWx1ZXMKKy8vLyAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5TZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJDaGVja2VkIGJ5IiwgIkphbiBL77+9bGxtYW4iKTsKKy8vLyAgICAgICAgIHBhY2thZ2UuV29ya2Jvb2suUHJvcGVydGllcy5TZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKCJBc3NlbWJseU5hbWUiLCAiRVBQbHVzIik7CisvLy8KKy8vLyAgICAgICAgIC8vIHNhdmUgb3VyIG5ldyB3b3JrYm9vayBhbmQgd2UgYXJlIGRvbmUhCisvLy8gICAgICAgICBwYWNrYWdlLlNhdmUoKTsKKy8vLworLy8vICAgICAgIH0KKy8vLworLy8vICAgICAgIHJldHVybiBuZXdGaWxlLkZ1bGxOYW1lOworLy8vIDwvY29kZT4KKy8vLyBNb3JlIHNhbXBsZXMgY2FuIGJlIGZvdW5kIGF0ICA8YSBocmVmPSJodHRwOi8vZXBwbHVzLmNvZGVwbGV4LmNvbS8iPmh0dHA6Ly9lcHBsdXMuY29kZXBsZXguY29tLzwvYT4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsUGFja2FnZSB7CisgIGludGVybmFsIGNvbnN0IGJvb2wgX3ByZXNlcnZlV2hpdGVzcGFjZSA9IGZhbHNlOwogCi0gICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBjb250ZW50VHlwZVdvcmtib29rRGVmYXVsdCA9IEAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQubWFpbit4bWwiOwotICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgY29udGVudFR5cGVXb3JrYm9va01hY3JvRW5hYmxlZCA9ICJhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwuc2hlZXQubWFjcm9FbmFibGVkLm1haW4reG1sIjsKLSAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIGNvbnRlbnRUeXBlU2hhcmVkU3RyaW5nID0gQCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGFyZWRTdHJpbmdzK3htbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE1heGltdW0gbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSB3b3Jrc2hlZXQgKDE2Mzg0KS4gCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTWF4Q29sdW1ucyA9IDE2Mzg0OwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBNYXhpbXVtIG51bWJlciBvZiByb3dzIGluIGEgd29ya3NoZWV0ICgxMDQ4NTc2KS4gCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTWF4Um93cyA9IDEwNDg1NzY7Ci0JCSNlbmRyZWdpb24KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXh0ZW50aW9uIFNjaGVtYSB0eXBlcworICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3NjaGVtYVhtbEV4dGVuc2lvbiA9ICJhcHBsaWNhdGlvbi94bWwiOworICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3NjaGVtYVJlbHNFeHRlbnNpb24gPQorICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1wYWNrYWdlLnJlbGF0aW9uc2hpcHMreG1sIjsKIAotCQkjcmVnaW9uIEV4Y2VsUGFja2FnZSBDb25zdHJ1Y3RvcnMKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBFeGNlbFBhY2thZ2UuIE91dHB1dCBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBTdHJlYW0gcHJvcGVydHkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFBhY2thZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBQYWNrYWdlID0gbmV3KCk7IAotICAgICAgICAgICAgV29ya2Jvb2sgPSBDcmVhdGVXb3JrYm9vaygpOwotICAgICAgICAgICAgXyA9IFdvcmtib29rLldvcmtib29rWG1sOwotICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSByZWxhdGlvbnNoaXAgdG8gdGhlIG1haW4gcGFydAotICAgICAgICAgICAgUGFja2FnZS5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKG5ldyBVcmkoIi94bCIsIFVyaUtpbmQuUmVsYXRpdmUpLCBXb3JrYm9vay5Xb3JrYm9va1VyaSksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBzY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9vZmZpY2VEb2N1bWVudCIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0JCS8vLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEV4Y2VsUGFja2FnZSBjbGFzcyBiYXNlZCBvbiBhIGV4aXN0aW5nIGZpbGUgb3IgY3JlYXRlcyBhIG5ldyBmaWxlLiAKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJuZXdGaWxlIj5JZiBuZXdGaWxlIGV4aXN0cywgaXQgaXMgb3BlbmVkLiAgT3RoZXJ3aXNlIGl0IGlzIGNyZWF0ZWQgZnJvbSBzY3JhdGNoLjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFBhY2thZ2UoRmlsZUluZm8gbmV3RmlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgdmFyIGlucHV0U3RyZWFtID0gbmV3RmlsZS5PcGVuUmVhZCgpOwotICAgICAgICAgICAgUGFja2FnZSA9IG5ldyhpbnB1dFN0cmVhbSk7Ci0gICAgICAgICAgICBXb3JrYm9vayA9IENyZWF0ZVdvcmtib29rKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRXhjZWxQYWNrYWdlIGNsYXNzIGJhc2VkIG9uIGEgc3RyZWFtCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmV3U3RyZWFtIj5UaGUgc3RyZWFtIG9iamVjdCBjYW4gYmUgZW1wdHkgb3IgY29udGFpbiBhIHBhY2thZ2UuIFRoZSBzdHJlYW0gbXVzdCBiZSBSZWFkL1dyaXRlPC9wYXJhbT4KLSAgICAgICAgcHVibGljIEV4Y2VsUGFja2FnZShTdHJlYW0gbmV3U3RyZWFtKSAKLSAgICAgICAgewotICAgICAgICAgICAgUGFja2FnZSA9IG5ldyhuZXdTdHJlYW0pOwotICAgICAgICAgICAgV29ya2Jvb2sgPSBDcmVhdGVXb3JrYm9vaygpOwotICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE1haW4gWG1sIHNjaGVtYSBuYW1lCisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIGNvbnN0IHN0cmluZyBfc2NoZW1hTWFpbiA9ICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW4iOwogCi0gICAgICAgIHByaXZhdGUgRXhjZWxXb3JrYm9vayBDcmVhdGVXb3JrYm9vaygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsV29ya2Jvb2sgd29ya2Jvb2sgPSBuZXcodGhpcywgQ3JlYXRlRGVmYXVsdE5TTSgpKTsKLSAgICAgICAgICAgIHdvcmtib29rLkdldEV4dGVybmFsUmVmZXJlbmNlcygpOwotICAgICAgICAgICAgd29ya2Jvb2suR2V0RGVmaW5lZE5hbWVzKCk7Ci0gICAgICAgICAgICByZXR1cm4gd29ya2Jvb2s7Ci0gICAgICAgIH0gCi0gICAgICAgIAotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBwYWNrYWdlCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCWludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlIFBhY2thZ2UgeyBnZXQ7IH0KLQkJCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHdvcmtib29rIGNvbXBvbmVudCB3aXRoaW4gdGhlIHBhY2thZ2UuCi0JCS8vLyBBbGwgd29ya3NoZWV0cyBhbmQgY2VsbHMgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlIHdvcmtib29rLgotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgRXhjZWxXb3JrYm9vayBXb3JrYm9vayB7IGdldDsgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZWxhdGlvbnNoaXAgc2NoZW1hIG5hbWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9zY2hlbWFSZWxhdGlvbnNoaXBzID0KKyAgICAgICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIjsKIAotCQlwcml2YXRlIFhtbE5hbWVzcGFjZU1hbmFnZXIgQ3JlYXRlRGVmYXVsdE5TTSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vICBDcmVhdGUgYSBOYW1lc3BhY2VNYW5hZ2VyIHRvIGhhbmRsZSB0aGUgZGVmYXVsdCBuYW1lc3BhY2UsIAotICAgICAgICAgICAgLy8gIGFuZCBjcmVhdGUgYSBwcmVmaXggZm9yIHRoZSBkZWZhdWx0IG5hbWVzcGFjZToKLSAgICAgICAgICAgIE5hbWVUYWJsZSBudCA9IG5ldyBOYW1lVGFibGUoKTsKLSAgICAgICAgICAgIHZhciBucyA9IG5ldyBYbWxOYW1lc3BhY2VNYW5hZ2VyKG50KTsKLSAgICAgICAgICAgIG5zLkFkZE5hbWVzcGFjZShzdHJpbmcuRW1wdHksIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgIG5zLkFkZE5hbWVzcGFjZSgiZCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgIG5zLkFkZE5hbWVzcGFjZSgiciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgICAgIG5zLkFkZE5hbWVzcGFjZSgiYyIsIEV4Y2VsUGFja2FnZS5zY2hlbWFDaGFydCk7Ci0gICAgICAgICAgICBucy5BZGROYW1lc3BhY2UoInZ0Iiwgc2NoZW1hVnQpOwotICAgICAgICAgICAgLy8gZXh0ZW5kZWQgcHJvcGVydGllcyAoYXBwLnhtbCkKLSAgICAgICAgICAgIG5zLkFkZE5hbWVzcGFjZSgieHAiLCBzY2hlbWFFeHRlbmRlZCk7Ci0gICAgICAgICAgICAvLyBjdXN0b20gcHJvcGVydGllcwotICAgICAgICAgICAgbnMuQWRkTmFtZXNwYWNlKCJjdHAiLCBzY2hlbWFDdXN0b20pOwotICAgICAgICAgICAgLy8gY29yZSBwcm9wZXJ0aWVzCi0gICAgICAgICAgICBucy5BZGROYW1lc3BhY2UoImNwIiwgc2NoZW1hQ29yZSk7Ci0gICAgICAgICAgICAvLyBjb3JlIHByb3BlcnR5IG5hbWVzcGFjZXMgCi0gICAgICAgICAgICBucy5BZGROYW1lc3BhY2UoImRjIiwgc2NoZW1hRGMpOwotICAgICAgICAgICAgbnMuQWRkTmFtZXNwYWNlKCJkY3Rlcm1zIiwgc2NoZW1hRGNUZXJtcyk7Ci0gICAgICAgICAgICBucy5BZGROYW1lc3BhY2UoImRjbWl0eXBlIiwgc2NoZW1hRGNtaVR5cGUpOwotICAgICAgICAgICAgbnMuQWRkTmFtZXNwYWNlKCJ4c2kiLCBzY2hlbWFYc2kpOwotICAgICAgICAgICAgcmV0dXJuIG5zOwotICAgICAgICB9Ci0JCQotCQkjcmVnaW9uIFNhdmVQYXJ0Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFNhdmVzIHRoZSBYbWxEb2N1bWVudCBpbnRvIHRoZSBwYWNrYWdlIGF0IHRoZSBzcGVjaWZpZWQgVXJpLgotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InVyaSI+VGhlIFVyaSBvZiB0aGUgY29tcG9uZW50PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ4bWxEb2MiPlRoZSBYbWxEb2N1bWVudCB0byBzYXZlPC9wYXJhbT4KLQkJaW50ZXJuYWwgdm9pZCBTYXZlUGFydChVcmkgdXJpLCBYbWxEb2N1bWVudCB4bWxEb2MpCi0JCXsKLSAgICAgICAgICAgIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBwYXJ0ID0gUGFja2FnZS5HZXRQYXJ0KHVyaSk7Ci0JCQl4bWxEb2MuU2F2ZShwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKLQkJfQorICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3NjaGVtYURyYXdpbmdzID0gImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9tYWluIjsKIAotICAgICAgICAjZW5kcmVnaW9uCisgIGludGVybmFsIGNvbnN0IHN0cmluZyBfc2NoZW1hTWljcm9zb2Z0Vm1sID0gInVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206dm1sIjsKKyAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9zY2hlbWFNaWNyb3NvZnRPZmZpY2UgPSAidXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIjsKKyAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9zY2hlbWFNaWNyb3NvZnRFeGNlbCA9ICJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpleGNlbCI7CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29tcHJlc3Npb24gb3B0aW9uIGZvciB0aGUgcGFja2FnZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgICAgICAgCi0gICAgICAgIHB1YmxpYyBDb21wcmVzc2lvbkxldmVsIENvbXByZXNzaW9uIAotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBhY2thZ2UuQ29tcHJlc3Npb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQYWNrYWdlLkNvbXByZXNzaW9uID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJI3JlZ2lvbiBHZXRYbWxGcm9tVXJpCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIEdldCB0aGUgWG1sRG9jdW1lbnQgZnJvbSBhbiBVUkkKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ1cmkiPlRoZSBVcmkgdG8gdGhlIHBhcnQ8L3BhcmFtPgotCQkvLy8gPHJldHVybnM+VGhlIFhtbERvY3VtZW50PC9yZXR1cm5zPgotCQlpbnRlcm5hbCBYbWxEb2N1bWVudCBHZXRYbWxGcm9tVXJpKFVyaSB1cmkpCi0JCXsKLQkJCVhtbERvY3VtZW50IHhtbCA9IG5ldyBYbWxEb2N1bWVudCgpOwotCQkJUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhcnQgPSBQYWNrYWdlLkdldFBhcnQodXJpKTsKLSAgICAgICAgICAgIFhtbEhlbHBlci5Mb2FkWG1sU2FmZSh4bWwsIHBhcnQuR2V0U3RyZWFtKCkpOyAKLQkJCXJldHVybiAoeG1sKTsKLQkJfQotCQkjZW5kcmVnaW9uCisgIGludGVybmFsIGNvbnN0IHN0cmluZyBfc2NoZW1hQ2hhcnQgPSAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L2NoYXJ0IjsKKyAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9zY2hlbWFIeXBlcmxpbmsgPQorICAgICAgImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvaHlwZXJsaW5rIjsKKyAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9zY2hlbWFDb21tZW50ID0KKyAgICAgICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2NvbW1lbnRzIjsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTYXZlcyBhbmQgcmV0dXJucyB0aGUgRXhjZWwgZmlsZXMgYXMgYSBieXRlYXJyYXkuCi0gICAgICAgIC8vLyBOb3RlIHRoYXQgdGhlIHBhY2thZ2UgaXMgY2xvc2VkIHVwb24gc2F2ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPGV4YW1wbGU+ICAgICAgCi0gICAgICAgIC8vLyBFeGFtcGxlIGhvdyB0byByZXR1cm4gYSBkb2N1bWVudCBmcm9tIGEgV2Vic2VydmVyLi4uCi0gICAgICAgIC8vLyA8Y29kZT4gCi0gICAgICAgIC8vLyAgRXhjZWxQYWNrYWdlIHBhY2thZ2U9bmV3IEV4Y2VsUGFja2FnZSgpOwotICAgICAgICAvLy8gIC8qKioqIC4uLiBDcmVhdGUgdGhlIGRvY3VtZW50ICoqKiovCi0gICAgICAgIC8vLyAgQnl0ZVtdIGJpbiA9IHBhY2thZ2UuR2V0QXNCeXRlQXJyYXkoKTsKLSAgICAgICAgLy8vICBSZXNwb25zZS5Db250ZW50VHlwZSA9ICJBcHBsaWNhdGlvbi92bmQubXMtRXhjZWwiOwotICAgICAgICAvLy8gIFJlc3BvbnNlLkFkZEhlYWRlcigiY29udGVudC1kaXNwb3NpdGlvbiIsICJhdHRhY2htZW50OyAgZmlsZW5hbWU9VGhlRmlsZS54bHN4Iik7Ci0JCS8vLyAgUmVzcG9uc2UuQmluYXJ5V3JpdGUoYmluKTsKLSAgICAgICAgLy8vIDwvY29kZT4KLSAgICAgICAgLy8vIDwvZXhhbXBsZT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIGJ5dGVbXSBHZXRBc0J5dGVBcnJheSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICBXb3JrYm9vay5TYXZlKCk7Ci0gICAgICAgICAgICBQYWNrYWdlLlNhdmUocmVzdWx0KTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQuVG9BcnJheSgpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgLy9PZmZpY2UgcHJvcGVydGllcworICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3NjaGVtYUNvcmUgPQorICAgICAgImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvbWV0YWRhdGEvY29yZS1wcm9wZXJ0aWVzIjsKKyAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9zY2hlbWFFeHRlbmRlZCA9CisgICAgICAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvZXh0ZW5kZWQtcHJvcGVydGllcyI7CisgIGludGVybmFsIGNvbnN0IHN0cmluZyBfc2NoZW1hQ3VzdG9tID0KKyAgICAgICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9jdXN0b20tcHJvcGVydGllcyI7CisgIGludGVybmFsIGNvbnN0IHN0cmluZyBfc2NoZW1hRGMgPSAiaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iOworICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3NjaGVtYURjVGVybXMgPSAiaHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zLyI7CisgIGludGVybmFsIGNvbnN0IHN0cmluZyBfc2NoZW1hRGNtaVR5cGUgPSAiaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlLyI7CisgIGludGVybmFsIGNvbnN0IHN0cmluZyBfc2NoZW1hWHNpID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsKKyAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9zY2hlbWFWdCA9CisgICAgICAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvZG9jUHJvcHNWVHlwZXMiOworCisgIC8vUGl2b3R0YWJsZXMKKyAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9zY2hlbWFQaXZvdFRhYmxlID0KKyAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5waXZvdFRhYmxlK3htbCI7CisgIGludGVybmFsIGNvbnN0IHN0cmluZyBfc2NoZW1hUGl2b3RDYWNoZURlZmluaXRpb24gPQorICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnBpdm90Q2FjaGVEZWZpbml0aW9uK3htbCI7CisgIGludGVybmFsIGNvbnN0IHN0cmluZyBfc2NoZW1hUGl2b3RDYWNoZVJlY29yZHMgPQorICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnBpdm90Q2FjaGVSZWNvcmRzK3htbCI7CisKKyAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9jb250ZW50VHlwZVdvcmtib29rRGVmYXVsdCA9CisgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQubWFpbit4bWwiOworICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2NvbnRlbnRUeXBlV29ya2Jvb2tNYWNyb0VuYWJsZWQgPQorICAgICAgImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbC5zaGVldC5tYWNyb0VuYWJsZWQubWFpbit4bWwiOworICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX2NvbnRlbnRUeXBlU2hhcmVkU3RyaW5nID0KKyAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGFyZWRTdHJpbmdzK3htbCI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTWF4aW11bSBudW1iZXIgb2YgY29sdW1ucyBpbiBhIHdvcmtzaGVldCAoMTYzODQpLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY29uc3QgaW50IE1heENvbHVtbnMgPSAxNjM4NDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBNYXhpbXVtIG51bWJlciBvZiByb3dzIGluIGEgd29ya3NoZWV0ICgxMDQ4NTc2KS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGNvbnN0IGludCBNYXhSb3dzID0gMTA0ODU3NjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEV4Y2VsUGFja2FnZS4gT3V0cHV0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIFN0cmVhbSBwcm9wZXJ0eS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsUGFja2FnZSgpIHsKKyAgICBQYWNrYWdlID0gbmV3KCk7CisgICAgV29ya2Jvb2sgPSBDcmVhdGVXb3JrYm9vaygpOworICAgIF8gPSBXb3JrYm9vay5Xb3JrYm9va1htbDsKKyAgICAvLyBjcmVhdGUgdGhlIHJlbGF0aW9uc2hpcCB0byB0aGUgbWFpbiBwYXJ0CisgICAgUGFja2FnZS5DcmVhdGVSZWxhdGlvbnNoaXAoCisgICAgICAgIFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShuZXcoIi94bCIsIFVyaUtpbmQuUmVsYXRpdmUpLCBXb3JrYm9vay5Xb3JrYm9va1VyaSksCisgICAgICAgIFRhcmdldE1vZGUuSW50ZXJuYWwsCisgICAgICAgIF9zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9vZmZpY2VEb2N1bWVudCIpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBFeGNlbFBhY2thZ2UgY2xhc3MgYmFzZWQgb24gYSBleGlzdGluZyBmaWxlIG9yIGNyZWF0ZXMgYSBuZXcgZmlsZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuZXdGaWxlIj5JZiBuZXdGaWxlIGV4aXN0cywgaXQgaXMgb3BlbmVkLiAgT3RoZXJ3aXNlIGl0IGlzIGNyZWF0ZWQgZnJvbSBzY3JhdGNoLjwvcGFyYW0+CisgIHB1YmxpYyBFeGNlbFBhY2thZ2UoRmlsZUluZm8gbmV3RmlsZSkgeworICAgIHVzaW5nIHZhciBpbnB1dFN0cmVhbSA9IG5ld0ZpbGUuT3BlblJlYWQoKTsKKyAgICBQYWNrYWdlID0gbmV3KGlucHV0U3RyZWFtKTsKKyAgICBXb3JrYm9vayA9IENyZWF0ZVdvcmtib29rKCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEV4Y2VsUGFja2FnZSBjbGFzcyBiYXNlZCBvbiBhIHN0cmVhbQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Im5ld1N0cmVhbSI+VGhlIHN0cmVhbSBvYmplY3QgY2FuIGJlIGVtcHR5IG9yIGNvbnRhaW4gYSBwYWNrYWdlLiBUaGUgc3RyZWFtIG11c3QgYmUgUmVhZC9Xcml0ZTwvcGFyYW0+CisgIHB1YmxpYyBFeGNlbFBhY2thZ2UoU3RyZWFtIG5ld1N0cmVhbSkgeworICAgIFBhY2thZ2UgPSBuZXcobmV3U3RyZWFtKTsKKyAgICBXb3JrYm9vayA9IENyZWF0ZVdvcmtib29rKCk7CisgIH0KKworICBwcml2YXRlIEV4Y2VsV29ya2Jvb2sgQ3JlYXRlV29ya2Jvb2soKSB7CisgICAgRXhjZWxXb3JrYm9vayB3b3JrYm9vayA9IG5ldyh0aGlzLCBDcmVhdGVEZWZhdWx0TnNtKCkpOworICAgIHdvcmtib29rLkdldEV4dGVybmFsUmVmZXJlbmNlcygpOworICAgIHdvcmtib29rLkdldERlZmluZWROYW1lcygpOworICAgIHJldHVybiB3b3JrYm9vazsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHBhY2thZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgWmlwUGFja2FnZSBQYWNrYWdlIHsgZ2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgd29ya2Jvb2sgY29tcG9uZW50IHdpdGhpbiB0aGUgcGFja2FnZS4KKyAgLy8vIEFsbCB3b3Jrc2hlZXRzIGFuZCBjZWxscyBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgd29ya2Jvb2suCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFdvcmtib29rIFdvcmtib29rIHsgZ2V0OyB9CisKKyAgcHJpdmF0ZSBYbWxOYW1lc3BhY2VNYW5hZ2VyIENyZWF0ZURlZmF1bHROc20oKSB7CisgICAgLy8gIENyZWF0ZSBhIE5hbWVzcGFjZU1hbmFnZXIgdG8gaGFuZGxlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSwKKyAgICAvLyAgYW5kIGNyZWF0ZSBhIHByZWZpeCBmb3IgdGhlIGRlZmF1bHQgbmFtZXNwYWNlOgorICAgIE5hbWVUYWJsZSBudCA9IG5ldyBOYW1lVGFibGUoKTsKKyAgICB2YXIgbnMgPSBuZXcgWG1sTmFtZXNwYWNlTWFuYWdlcihudCk7CisgICAgbnMuQWRkTmFtZXNwYWNlKHN0cmluZy5FbXB0eSwgX3NjaGVtYU1haW4pOworICAgIG5zLkFkZE5hbWVzcGFjZSgiZCIsIF9zY2hlbWFNYWluKTsKKyAgICBucy5BZGROYW1lc3BhY2UoInIiLCBfc2NoZW1hUmVsYXRpb25zaGlwcyk7CisgICAgbnMuQWRkTmFtZXNwYWNlKCJjIiwgX3NjaGVtYUNoYXJ0KTsKKyAgICBucy5BZGROYW1lc3BhY2UoInZ0IiwgX3NjaGVtYVZ0KTsKKyAgICAvLyBleHRlbmRlZCBwcm9wZXJ0aWVzIChhcHAueG1sKQorICAgIG5zLkFkZE5hbWVzcGFjZSgieHAiLCBfc2NoZW1hRXh0ZW5kZWQpOworICAgIC8vIGN1c3RvbSBwcm9wZXJ0aWVzCisgICAgbnMuQWRkTmFtZXNwYWNlKCJjdHAiLCBfc2NoZW1hQ3VzdG9tKTsKKyAgICAvLyBjb3JlIHByb3BlcnRpZXMKKyAgICBucy5BZGROYW1lc3BhY2UoImNwIiwgX3NjaGVtYUNvcmUpOworICAgIC8vIGNvcmUgcHJvcGVydHkgbmFtZXNwYWNlcworICAgIG5zLkFkZE5hbWVzcGFjZSgiZGMiLCBfc2NoZW1hRGMpOworICAgIG5zLkFkZE5hbWVzcGFjZSgiZGN0ZXJtcyIsIF9zY2hlbWFEY1Rlcm1zKTsKKyAgICBucy5BZGROYW1lc3BhY2UoImRjbWl0eXBlIiwgX3NjaGVtYURjbWlUeXBlKTsKKyAgICBucy5BZGROYW1lc3BhY2UoInhzaSIsIF9zY2hlbWFYc2kpOworICAgIHJldHVybiBuczsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNhdmVzIHRoZSBYbWxEb2N1bWVudCBpbnRvIHRoZSBwYWNrYWdlIGF0IHRoZSBzcGVjaWZpZWQgVXJpLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InVyaSI+VGhlIFVyaSBvZiB0aGUgY29tcG9uZW50PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ4bWxEb2MiPlRoZSBYbWxEb2N1bWVudCB0byBzYXZlPC9wYXJhbT4KKyAgaW50ZXJuYWwgdm9pZCBTYXZlUGFydChVcmkgdXJpLCBYbWxEb2N1bWVudCB4bWxEb2MpIHsKKyAgICBaaXBQYWNrYWdlUGFydCBwYXJ0ID0gUGFja2FnZS5HZXRQYXJ0KHVyaSk7CisgICAgeG1sRG9jLlNhdmUocGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb21wcmVzc2lvbiBvcHRpb24gZm9yIHRoZSBwYWNrYWdlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBDb21wcmVzc2lvbkxldmVsIENvbXByZXNzaW9uIHsKKyAgICBnZXQgPT4gUGFja2FnZS5Db21wcmVzc2lvbjsKKyAgICBzZXQgPT4gUGFja2FnZS5Db21wcmVzc2lvbiA9IHZhbHVlOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0IHRoZSBYbWxEb2N1bWVudCBmcm9tIGFuIFVSSQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InVyaSI+VGhlIFVyaSB0byB0aGUgcGFydDwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UaGUgWG1sRG9jdW1lbnQ8L3JldHVybnM+CisgIGludGVybmFsIFhtbERvY3VtZW50IEdldFhtbEZyb21VcmkoVXJpIHVyaSkgeworICAgIFhtbERvY3VtZW50IHhtbCA9IG5ldyBYbWxEb2N1bWVudCgpOworICAgIFppcFBhY2thZ2VQYXJ0IHBhcnQgPSBQYWNrYWdlLkdldFBhcnQodXJpKTsKKyAgICBYbWxIZWxwZXIuTG9hZFhtbFNhZmUoeG1sLCBwYXJ0LkdldFN0cmVhbSgpKTsKKyAgICByZXR1cm4gKHhtbCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTYXZlcyBhbmQgcmV0dXJucyB0aGUgRXhjZWwgZmlsZXMgYXMgYSBieXRlYXJyYXkuCisgIC8vLyBOb3RlIHRoYXQgdGhlIHBhY2thZ2UgaXMgY2xvc2VkIHVwb24gc2F2ZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPGV4YW1wbGU+CisgIC8vLyBFeGFtcGxlIGhvdyB0byByZXR1cm4gYSBkb2N1bWVudCBmcm9tIGEgV2Vic2VydmVyLi4uCisgIC8vLyA8Y29kZT4KKyAgLy8vICBFeGNlbFBhY2thZ2UgcGFja2FnZT1uZXcgRXhjZWxQYWNrYWdlKCk7CisgIC8vLyAgLyoqKiogLi4uIENyZWF0ZSB0aGUgZG9jdW1lbnQgKioqKi8KKyAgLy8vICBCeXRlW10gYmluID0gcGFja2FnZS5HZXRBc0J5dGVBcnJheSgpOworICAvLy8gIFJlc3BvbnNlLkNvbnRlbnRUeXBlID0gIkFwcGxpY2F0aW9uL3ZuZC5tcy1FeGNlbCI7CisgIC8vLyAgUmVzcG9uc2UuQWRkSGVhZGVyKCJjb250ZW50LWRpc3Bvc2l0aW9uIiwgImF0dGFjaG1lbnQ7ICBmaWxlbmFtZT1UaGVGaWxlLnhsc3giKTsKKyAgLy8vICBSZXNwb25zZS5CaW5hcnlXcml0ZShiaW4pOworICAvLy8gPC9jb2RlPgorICAvLy8gPC9leGFtcGxlPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgYnl0ZVtdIEdldEFzQnl0ZUFycmF5KCkgeworICAgIHZhciByZXN1bHQgPSBuZXcgTWVtb3J5U3RyZWFtKCk7CisgICAgV29ya2Jvb2suU2F2ZSgpOworICAgIFBhY2thZ2UuU2F2ZShyZXN1bHQpOworICAgIHJldHVybiByZXN1bHQuVG9BcnJheSgpOworICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxQcmludGVyU2V0dGluZ3MuY3MgYi9FUFBsdXMvRXhjZWxQcmludGVyU2V0dGluZ3MuY3MKaW5kZXggZjM2MjY1MC4uMTdlZDA1MiAxMDA2NDQKLS0tIGEvRVBQbHVzL0V4Y2VsUHJpbnRlclNldHRpbmdzLmNzCisrKyBiL0VQUGx1cy9FeGNlbFByaW50ZXJTZXR0aW5ncy5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsODMxICsxMyw3NjEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlhtbDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKLSAgICAjcmVnaW9uICJFbnVtcyIKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFByaW50ZXIgb3JpZW50YXRpb24KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIGVPcmllbnRhdGlvbgotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUG9ydHJhaXQgb3JpZW50YXRpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgUG9ydHJhaXQsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIExhbmRzY2FwZSBvcmllbnRhdGlvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBMYW5kc2NhcGUKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOworCisvLy8gPHN1bW1hcnk+CisvLy8gUHJpbnRlciBvcmllbnRhdGlvbgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVPcmllbnRhdGlvbiB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFBvcnRyYWl0IG9yaWVudGF0aW9uCisgIC8vLyA8L3N1bW1hcnk+CisgIFBvcnRyYWl0LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIExhbmRzY2FwZSBvcmllbnRhdGlvbgorICAvLy8gPC9zdW1tYXJ5PgorICBMYW5kc2NhcGUsCit9CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBQYXBlcnNpemUKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgZW51bSBlUGFwZXJTaXplIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTGV0dGVyIHBhcGVyICg4LjUgaW4uIGJ5IDExIGluLikKKyAgLy8vIDwvc3VtbWFyeT4KKyAgTGV0dGVyID0gMSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMZXR0ZXIgc21hbGwgcGFwZXIgKDguNSBpbi4gYnkgMTEgaW4uKQorICAvLy8gPC9zdW1tYXJ5PgorICBMZXR0ZXJTbWFsbCA9IDIsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gLy8gVGFibG9pZCBwYXBlciAoMTEgaW4uIGJ5IDE3IGluLikKKyAgLy8vIDwvc3VtbWFyeT4KKyAgVGFibG9pZCA9IDMsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTGVkZ2VyIHBhcGVyICgxNyBpbi4gYnkgMTEgaW4uKQorICAvLy8gPC9zdW1tYXJ5PgorICBMZWRnZXIgPSA0LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIExlZ2FsIHBhcGVyICg4LjUgaW4uIGJ5IDE0IGluLikKKyAgLy8vIDwvc3VtbWFyeT4KKyAgTGVnYWwgPSA1LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFN0YXRlbWVudCBwYXBlciAoNS41IGluLiBieSA4LjUgaW4uKQorICAvLy8gPC9zdW1tYXJ5PgorICBTdGF0ZW1lbnQgPSA2LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEV4ZWN1dGl2ZSBwYXBlciAoNy4yNSBpbi4gYnkgMTAuNSBpbi4pCisgIC8vLyA8L3N1bW1hcnk+CisgIEV4ZWN1dGl2ZSA9IDcsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQTMgcGFwZXIgKDI5NyBtbSBieSA0MjAgbW0pCisgIC8vLyA8L3N1bW1hcnk+CisgIEEzID0gOCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBNCBwYXBlciAoMjEwIG1tIGJ5IDI5NyBtbSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgQTQgPSA5LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEE0IHNtYWxsIHBhcGVyICgyMTAgbW0gYnkgMjk3IG1tKQorICAvLy8gPC9zdW1tYXJ5PgorICBBNFNtYWxsID0gMTAsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQTUgcGFwZXIgKDE0OCBtbSBieSAyMTAgbW0pCisgIC8vLyA8L3N1bW1hcnk+CisgIEE1ID0gMTEsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQjQgcGFwZXIgKDI1MCBtbSBieSAzNTMgbW0pCisgIC8vLyA8L3N1bW1hcnk+CisgIEI0ID0gMTIsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQjUgcGFwZXIgKDE3NiBtbSBieSAyNTAgbW0pCisgIC8vLyA8L3N1bW1hcnk+CisgIEI1ID0gMTMsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRm9saW8gcGFwZXIgKDguNSBpbi4gYnkgMTMgaW4uKQorICAvLy8gPC9zdW1tYXJ5PgorICBGb2xpbyA9IDE0LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFF1YXJ0byBwYXBlciAoMjE1IG1tIGJ5IDI3NSBtbSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgUXVhcnRvID0gMTUsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU3RhbmRhcmQgcGFwZXIgKDEwIGluLiBieSAxNCBpbi4pCisgIC8vLyA8L3N1bW1hcnk+CisgIFN0YW5kYXJkMTAxNCA9IDE2LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFN0YW5kYXJkIHBhcGVyICgxMSBpbi4gYnkgMTcgaW4uKQorICAvLy8gPC9zdW1tYXJ5PgorICBTdGFuZGFyZDExMTcgPSAxNywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOb3RlIHBhcGVyICg4LjUgaW4uIGJ5IDExIGluLikKKyAgLy8vIDwvc3VtbWFyeT4KKyAgTm90ZSA9IDE4LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICM5IGVudmVsb3BlICgzLjg3NSBpbi4gYnkgOC44NzUgaW4uKQorICAvLy8gPC9zdW1tYXJ5PgorICBFbnZlbG9wZTkgPSAxOSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAjMTAgZW52ZWxvcGUgKDQuMTI1IGluLiBieSA5LjUgaW4uKQorICAvLy8gPC9zdW1tYXJ5PgorICBFbnZlbG9wZTEwID0gMjAsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gIzExIGVudmVsb3BlICg0LjUgaW4uIGJ5IDEwLjM3NSBpbi4pCisgIC8vLyA8L3N1bW1hcnk+CisgIEVudmVsb3BlMTEgPSAyMSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAjMTIgZW52ZWxvcGUgKDQuNzUgaW4uIGJ5IDExIGluLikKKyAgLy8vIDwvc3VtbWFyeT4KKyAgRW52ZWxvcGUxMiA9IDIyLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICMxNCBlbnZlbG9wZSAoNSBpbi4gYnkgMTEuNSBpbi4pCisgIC8vLyA8L3N1bW1hcnk+CisgIEVudmVsb3BlMTQgPSAyMywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDIHBhcGVyICgxNyBpbi4gYnkgMjIgaW4uKQorICAvLy8gPC9zdW1tYXJ5PgorICBDID0gMjQsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRCBwYXBlciAoMjIgaW4uIGJ5IDM0IGluLikKKyAgLy8vIDwvc3VtbWFyeT4KKyAgRCA9IDI1LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEUgcGFwZXIgKDM0IGluLiBieSA0NCBpbi4pCisgIC8vLyA8L3N1bW1hcnk+CisgIEUgPSAyNiwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBETCBlbnZlbG9wZSAoMTEwIG1tIGJ5IDIyMCBtbSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgRGxFbnZlbG9wZSA9IDI3LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEM1IGVudmVsb3BlICgxNjIgbW0gYnkgMjI5IG1tKQorICAvLy8gPC9zdW1tYXJ5PgorICBDNUVudmVsb3BlID0gMjgsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQzMgZW52ZWxvcGUgKDMyNCBtbSBieSA0NTggbW0pCisgIC8vLyA8L3N1bW1hcnk+CisgIEMzRW52ZWxvcGUgPSAyOSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDNCBlbnZlbG9wZSAoMjI5IG1tIGJ5IDMyNCBtbSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgQzRFbnZlbG9wZSA9IDMwLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEM2IGVudmVsb3BlICgxMTQgbW0gYnkgMTYyIG1tKQorICAvLy8gPC9zdW1tYXJ5PgorICBDNkVudmVsb3BlID0gMzEsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQzY1IGVudmVsb3BlICgxMTQgbW0gYnkgMjI5IG1tKQorICAvLy8gPC9zdW1tYXJ5PgorICBDNjVFbnZlbG9wZSA9IDMyLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEI0IGVudmVsb3BlICgyNTAgbW0gYnkgMzUzIG1tKQorICAvLy8gPC9zdW1tYXJ5PgorICBCNEVudmVsb3BlID0gMzMsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQjUgZW52ZWxvcGUgKDE3NiBtbSBieSAyNTAgbW0pCisgIC8vLyA8L3N1bW1hcnk+CisgIEI1RW52ZWxvcGUgPSAzNCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBCNiBlbnZlbG9wZSAoMTc2IG1tIGJ5IDEyNSBtbSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgQjZFbnZlbG9wZSA9IDM1LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEl0YWx5IGVudmVsb3BlICgxMTAgbW0gYnkgMjMwIG1tKQorICAvLy8gPC9zdW1tYXJ5PgorICBJdGFseUVudmVsb3BlID0gMzYsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTW9uYXJjaCBlbnZlbG9wZSAoMy44NzUgaW4uIGJ5IDcuNSBpbi4pLgorICAvLy8gPC9zdW1tYXJ5PgorICBNb25hcmNoRW52ZWxvcGUgPSAzNywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyA2IDMvNCBlbnZlbG9wZSAoMy42MjUgaW4uIGJ5IDYuNSBpbi4pCisgIC8vLyA8L3N1bW1hcnk+CisgIFNpeDM0RW52ZWxvcGUgPSAzOCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBVUyBzdGFuZGFyZCBmYW5mb2xkICgxNC44NzUgaW4uIGJ5IDExIGluLikKKyAgLy8vIDwvc3VtbWFyeT4KKyAgVXNTdGFuZGFyZCA9IDM5LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdlcm1hbiBzdGFuZGFyZCBmYW5mb2xkICg4LjUgaW4uIGJ5IDEyIGluLikKKyAgLy8vIDwvc3VtbWFyeT4KKyAgR2VybWFuU3RhbmRhcmQgPSA0MCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXJtYW4gbGVnYWwgZmFuZm9sZCAoOC41IGluLiBieSAxMyBpbi4pCisgIC8vLyA8L3N1bW1hcnk+CisgIEdlcm1hbkxlZ2FsID0gNDEsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSVNPIEI0ICgyNTAgbW0gYnkgMzUzIG1tKQorICAvLy8gPC9zdW1tYXJ5PgorICBJc29iNCA9IDQyLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vICBKYXBhbmVzZSBkb3VibGUgcG9zdGNhcmQgKDIwMCBtbSBieSAxNDggbW0pCisgIC8vLyA8L3N1bW1hcnk+CisgIEphcGFuZXNlRG91YmxlUG9zdGNhcmQgPSA0MywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTdGFuZGFyZCBwYXBlciAoOSBpbi4gYnkgMTEgaW4uKQorICAvLy8gPC9zdW1tYXJ5PgorICBTdGFuZGFyZDkgPSA0NCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTdGFuZGFyZCBwYXBlciAoMTAgaW4uIGJ5IDExIGluLikKKyAgLy8vIDwvc3VtbWFyeT4KKyAgU3RhbmRhcmQxMCA9IDQ1LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFN0YW5kYXJkIHBhcGVyICgxNSBpbi4gYnkgMTEgaW4uKQorICAvLy8gPC9zdW1tYXJ5PgorICBTdGFuZGFyZDE1ID0gNDYsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW52aXRlIGVudmVsb3BlICgyMjAgbW0gYnkgMjIwIG1tKQorICAvLy8gPC9zdW1tYXJ5PgorICBJbnZpdGVFbnZlbG9wZSA9IDQ3LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIExldHRlciBleHRyYSBwYXBlciAoOS4yNzUgaW4uIGJ5IDEyIGluLikKKyAgLy8vIDwvc3VtbWFyeT4KKyAgTGV0dGVyRXh0cmEgPSA1MCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMZWdhbCBleHRyYSBwYXBlciAoOS4yNzUgaW4uIGJ5IDE1IGluLikKKyAgLy8vIDwvc3VtbWFyeT4KKyAgTGVnYWxFeHRyYSA9IDUxLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRhYmxvaWQgZXh0cmEgcGFwZXIgKDExLjY5IGluLiBieSAxOCBpbi4pCisgIC8vLyA8L3N1bW1hcnk+CisgIFRhYmxvaWRFeHRyYSA9IDUyLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEE0IGV4dHJhIHBhcGVyICgyMzYgbW0gYnkgMzIyIG1tKQorICAvLy8gPC9zdW1tYXJ5PgorICBBNEV4dHJhID0gNTMsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTGV0dGVyIHRyYW5zdmVyc2UgcGFwZXIgKDguMjc1IGluLiBieSAxMSBpbi4pCisgIC8vLyA8L3N1bW1hcnk+CisgIExldHRlclRyYW5zdmVyc2UgPSA1NCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBNCB0cmFuc3ZlcnNlIHBhcGVyICgyMTAgbW0gYnkgMjk3IG1tKQorICAvLy8gPC9zdW1tYXJ5PgorICBBNFRyYW5zdmVyc2UgPSA1NSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMZXR0ZXIgZXh0cmEgdHJhbnN2ZXJzZSBwYXBlciAoOS4yNzUgaW4uIGJ5IDEyIGluLikKKyAgLy8vIDwvc3VtbWFyeT4KKyAgTGV0dGVyRXh0cmFUcmFuc3ZlcnNlID0gNTYsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU3VwZXJBL1N1cGVyQS9BNCBwYXBlciAoMjI3IG1tIGJ5IDM1NiBtbSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgU3VwZXJBID0gNTcsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU3VwZXJCL1N1cGVyQi9BMyBwYXBlciAoMzA1IG1tIGJ5IDQ4NyBtbSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgU3VwZXJCID0gNTgsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTGV0dGVyIHBsdXMgcGFwZXIgKDguNSBpbi4gYnkgMTIuNjkgaW4uKQorICAvLy8gPC9zdW1tYXJ5PgorICBMZXR0ZXJQbHVzID0gNTksCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQTQgcGx1cyBwYXBlciAoMjEwIG1tIGJ5IDMzMCBtbSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgQTRQbHVzID0gNjAsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQTUgdHJhbnN2ZXJzZSBwYXBlciAoMTQ4IG1tIGJ5IDIxMCBtbSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgQTVUcmFuc3ZlcnNlID0gNjEsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSklTIEI1IHRyYW5zdmVyc2UgcGFwZXIgKDE4MiBtbSBieSAyNTcgbW0pCisgIC8vLyA8L3N1bW1hcnk+CisgIEppc2I1VHJhbnN2ZXJzZSA9IDYyLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEzIGV4dHJhIHBhcGVyICgzMjIgbW0gYnkgNDQ1IG1tKQorICAvLy8gPC9zdW1tYXJ5PgorICBBM0V4dHJhID0gNjMsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQTUgZXh0cmEgcGFwZXIgKDE3NCBtbSBieSAyMzUgbW0pCisgIC8vLyA8L3N1bW1hcnk+CisgIEE1RXh0cmEgPSA2NCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJU08gQjUgZXh0cmEgcGFwZXIgKDIwMSBtbSBieSAyNzYgbW0pCisgIC8vLyA8L3N1bW1hcnk+CisgIElzb2I1ID0gNjUsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQTIgcGFwZXIgKDQyMCBtbSBieSA1OTQgbW0pCisgIC8vLyA8L3N1bW1hcnk+CisgIEEyID0gNjYsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQTMgdHJhbnN2ZXJzZSBwYXBlciAoMjk3IG1tIGJ5IDQyMCBtbSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgQTNUcmFuc3ZlcnNlID0gNjcsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQTMgZXh0cmEgdHJhbnN2ZXJzZSBwYXBlciAoMzIyIG1tIGJ5IDQ0NSBtbSovCisgIC8vLyA8L3N1bW1hcnk+CisgIEEzRXh0cmFUcmFuc3ZlcnNlID0gNjgsCit9CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBTcGVjaWZpZXMgcHJpbnRlZCBwYWdlIG9yZGVyCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gZVBhZ2VPcmRlciB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE9yZGVyIHBhZ2VzIHZlcnRpY2FsbHkgZmlyc3QsIHRoZW4gbW92ZSBob3Jpem9udGFsbHkuCisgIC8vLyA8L3N1bW1hcnk+CisgIERvd25UaGVuT3ZlciwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBPcmRlciBwYWdlcyBob3Jpem9udGFsbHkgZmlyc3QsIHRoZW4gbW92ZSB2ZXJ0aWNhbGx5CisgIC8vLyA8L3N1bW1hcnk+CisgIE92ZXJUaGVuRG93biwKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIFByaW50ZXIgc2V0dGluZ3MKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsUHJpbnRlclNldHRpbmdzIDogWG1sSGVscGVyIHsKKyAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd3M7CisgIHByaXZhdGUgYm9vbCBfbWFyZ2luc0NyZWF0ZWQ7CisKKyAgaW50ZXJuYWwgRXhjZWxQcmludGVyU2V0dGluZ3MoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFdvcmtzaGVldCB3cykKKyAgICAgIDogYmFzZShucywgdG9wTm9kZSkgeworICAgIF93cyA9IHdzOworICAgIFNjaGVtYU5vZGVPcmRlciA9IHdzLlNjaGVtYU5vZGVPcmRlcjsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9sZWZ0TWFyZ2luUGF0aCA9ICJkOnBhZ2VNYXJnaW5zL0BsZWZ0IjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMZWZ0IG1hcmdpbiBpbiBpbmNoZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGRlY2ltYWwgTGVmdE1hcmdpbiB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVEZWNpbWFsKF9sZWZ0TWFyZ2luUGF0aCk7CisgICAgc2V0IHsKKyAgICAgIENyZWF0ZU1hcmdpbnMoKTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2xlZnRNYXJnaW5QYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CiAgICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUGFwZXJzaXplCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlUGFwZXJTaXplCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMZXR0ZXIgcGFwZXIgKDguNSBpbi4gYnkgMTEgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBMZXR0ZXI9IDEsICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIExldHRlciBzbWFsbCBwYXBlciAoOC41IGluLiBieSAxMSBpbi4pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIExldHRlclNtYWxsPTIsICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gLy8gVGFibG9pZCBwYXBlciAoMTEgaW4uIGJ5IDE3IGluLikKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgVGFibG9pZD0zLCAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMZWRnZXIgcGFwZXIgKDE3IGluLiBieSAxMSBpbi4pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIExlZGdlcj00LCAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTGVnYWwgcGFwZXIgKDguNSBpbi4gYnkgMTQgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBMZWdhbD01LCAgICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTdGF0ZW1lbnQgcGFwZXIgKDUuNSBpbi4gYnkgOC41IGluLikKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgU3RhdGVtZW50PTYsICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBFeGVjdXRpdmUgcGFwZXIgKDcuMjUgaW4uIGJ5IDEwLjUgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBFeGVjdXRpdmU9NywgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBMyBwYXBlciAoMjk3IG1tIGJ5IDQyMCBtbSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQTM9OCwgICAgICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBNCBwYXBlciAoMjEwIG1tIGJ5IDI5NyBtbSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQTQ9OSwgICAgICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQTQgc21hbGwgcGFwZXIgKDIxMCBtbSBieSAyOTcgbW0pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEE0U21hbGw9MTAsICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEE1IHBhcGVyICgxNDggbW0gYnkgMjEwIG1tKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBBNT0xMSwgICAgICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBCNCBwYXBlciAoMjUwIG1tIGJ5IDM1MyBtbSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQjQ9MTIsICAgICAgICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEI1IHBhcGVyICgxNzYgbW0gYnkgMjUwIG1tKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBCNT0xMywgICAgICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRm9saW8gcGFwZXIgKDguNSBpbi4gYnkgMTMgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBGb2xpbz0xNCwgICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUXVhcnRvIHBhcGVyICgyMTUgbW0gYnkgMjc1IG1tKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBRdWFydG89MTUsICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3RhbmRhcmQgcGFwZXIgKDEwIGluLiBieSAxNCBpbi4pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFN0YW5kYXJkMTBfMTQ9MTYsIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTdGFuZGFyZCBwYXBlciAoMTEgaW4uIGJ5IDE3IGluLikKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgU3RhbmRhcmQxMV8xNz0xNywgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBOb3RlIHBhcGVyICg4LjUgaW4uIGJ5IDExIGluLikKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgTm90ZT0xOCwgICAgICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAjOSBlbnZlbG9wZSAoMy44NzUgaW4uIGJ5IDguODc1IGluLikKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgRW52ZWxvcGU5PTE5LCAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAjMTAgZW52ZWxvcGUgKDQuMTI1IGluLiBieSA5LjUgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBFbnZlbG9wZTEwPTIwLCAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICMxMSBlbnZlbG9wZSAoNC41IGluLiBieSAxMC4zNzUgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBFbnZlbG9wZTExPTIxLCAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICMxMiBlbnZlbG9wZSAoNC43NSBpbi4gYnkgMTEgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBFbnZlbG9wZTEyPTIyLCAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICMxNCBlbnZlbG9wZSAoNSBpbi4gYnkgMTEuNSBpbi4pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEVudmVsb3BlMTQ9MjMsICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQyBwYXBlciAoMTcgaW4uIGJ5IDIyIGluLikKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQz0yNCwgICAgICAgICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEIHBhcGVyICgyMiBpbi4gYnkgMzQgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBEPTI1LCAgICAgICAgICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBFIHBhcGVyICgzNCBpbi4gYnkgNDQgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBFPTI2LCAgICAgICAgICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBETCBlbnZlbG9wZSAoMTEwIG1tIGJ5IDIyMCBtbSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgRExFbnZlbG9wZSA9IDI3LAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDNSBlbnZlbG9wZSAoMTYyIG1tIGJ5IDIyOSBtbSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQzVFbnZlbG9wZSA9IDI4LAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDMyBlbnZlbG9wZSAoMzI0IG1tIGJ5IDQ1OCBtbSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQzNFbnZlbG9wZSA9IDI5LCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQzQgZW52ZWxvcGUgKDIyOSBtbSBieSAzMjQgbW0pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEM0RW52ZWxvcGUgPSAzMCwgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEM2IGVudmVsb3BlICgxMTQgbW0gYnkgMTYyIG1tKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBDNkVudmVsb3BlID0gMzEsIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDNjUgZW52ZWxvcGUgKDExNCBtbSBieSAyMjkgbW0pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEM2NUVudmVsb3BlID0gMzIsIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBCNCBlbnZlbG9wZSAoMjUwIG1tIGJ5IDM1MyBtbSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQjRFbnZlbG9wZT0gMzMsIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBCNSBlbnZlbG9wZSAoMTc2IG1tIGJ5IDI1MCBtbSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQjVFbnZlbG9wZT0gMzQsIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBCNiBlbnZlbG9wZSAoMTc2IG1tIGJ5IDEyNSBtbSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQjZFbnZlbG9wZSA9IDM1LCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSXRhbHkgZW52ZWxvcGUgKDExMCBtbSBieSAyMzAgbW0pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEl0YWx5RW52ZWxvcGUgPSAzNiwgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE1vbmFyY2ggZW52ZWxvcGUgKDMuODc1IGluLiBieSA3LjUgaW4uKS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgTW9uYXJjaEVudmVsb3BlID0gMzcsIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyA2IDMvNCBlbnZlbG9wZSAoMy42MjUgaW4uIGJ5IDYuNSBpbi4pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFNpeDNfNEVudmVsb3BlID0gMzgsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFVTIHN0YW5kYXJkIGZhbmZvbGQgKDE0Ljg3NSBpbi4gYnkgMTEgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBVU1N0YW5kYXJkPTM5LCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2VybWFuIHN0YW5kYXJkIGZhbmZvbGQgKDguNSBpbi4gYnkgMTIgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBHZXJtYW5TdGFuZGFyZD00MCwgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdlcm1hbiBsZWdhbCBmYW5mb2xkICg4LjUgaW4uIGJ5IDEzIGluLikKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgR2VybWFuTGVnYWw9NDEsIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJU08gQjQgKDI1MCBtbSBieSAzNTMgbW0pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIElTT0I0PTQyLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgSmFwYW5lc2UgZG91YmxlIHBvc3RjYXJkICgyMDAgbW0gYnkgMTQ4IG1tKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBKYXBhbmVzZURvdWJsZVBvc3RjYXJkPTQzLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTdGFuZGFyZCBwYXBlciAoOSBpbi4gYnkgMTEgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBTdGFuZGFyZDk9NDQsIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTdGFuZGFyZCBwYXBlciAoMTAgaW4uIGJ5IDExIGluLikKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgU3RhbmRhcmQxMD00NSwgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFN0YW5kYXJkIHBhcGVyICgxNSBpbi4gYnkgMTEgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBTdGFuZGFyZDE1PTQ2LCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW52aXRlIGVudmVsb3BlICgyMjAgbW0gYnkgMjIwIG1tKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBJbnZpdGVFbnZlbG9wZSA9IDQ3LCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTGV0dGVyIGV4dHJhIHBhcGVyICg5LjI3NSBpbi4gYnkgMTIgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBMZXR0ZXJFeHRyYT01MCwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTGVnYWwgZXh0cmEgcGFwZXIgKDkuMjc1IGluLiBieSAxNSBpbi4pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIExlZ2FsRXh0cmE9NTEsIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUYWJsb2lkIGV4dHJhIHBhcGVyICgxMS42OSBpbi4gYnkgMTggaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBUYWJsb2lkRXh0cmE9NTIsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEE0IGV4dHJhIHBhcGVyICgyMzYgbW0gYnkgMzIyIG1tKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBBNEV4dHJhPTUzLCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTGV0dGVyIHRyYW5zdmVyc2UgcGFwZXIgKDguMjc1IGluLiBieSAxMSBpbi4pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIExldHRlclRyYW5zdmVyc2U9NTQsIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBNCB0cmFuc3ZlcnNlIHBhcGVyICgyMTAgbW0gYnkgMjk3IG1tKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBBNFRyYW5zdmVyc2U9NTUsIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMZXR0ZXIgZXh0cmEgdHJhbnN2ZXJzZSBwYXBlciAoOS4yNzUgaW4uIGJ5IDEyIGluLikKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgTGV0dGVyRXh0cmFUcmFuc3ZlcnNlPTU2LCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3VwZXJBL1N1cGVyQS9BNCBwYXBlciAoMjI3IG1tIGJ5IDM1NiBtbSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgU3VwZXJBPTU3LCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3VwZXJCL1N1cGVyQi9BMyBwYXBlciAoMzA1IG1tIGJ5IDQ4NyBtbSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgU3VwZXJCPTU4LCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTGV0dGVyIHBsdXMgcGFwZXIgKDguNSBpbi4gYnkgMTIuNjkgaW4uKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBMZXR0ZXJQbHVzPTU5LCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQTQgcGx1cyBwYXBlciAoMjEwIG1tIGJ5IDMzMCBtbSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQTRQbHVzPTYwLCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQTUgdHJhbnN2ZXJzZSBwYXBlciAoMTQ4IG1tIGJ5IDIxMCBtbSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQTVUcmFuc3ZlcnNlPTYxLCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSklTIEI1IHRyYW5zdmVyc2UgcGFwZXIgKDE4MiBtbSBieSAyNTcgbW0pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEpJU0I1VHJhbnN2ZXJzZT02MiwgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEzIGV4dHJhIHBhcGVyICgzMjIgbW0gYnkgNDQ1IG1tKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBBM0V4dHJhPTYzLCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQTUgZXh0cmEgcGFwZXIgKDE3NCBtbSBieSAyMzUgbW0pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEE1RXh0cmE9NjQsIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJU08gQjUgZXh0cmEgcGFwZXIgKDIwMSBtbSBieSAyNzYgbW0pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIElTT0I1PTY1LCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQTIgcGFwZXIgKDQyMCBtbSBieSA1OTQgbW0pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEEyPTY2LCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQTMgdHJhbnN2ZXJzZSBwYXBlciAoMjk3IG1tIGJ5IDQyMCBtbSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQTNUcmFuc3ZlcnNlPTY3LCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQTMgZXh0cmEgdHJhbnN2ZXJzZSBwYXBlciAoMzIyIG1tIGJ5IDQ0NSBtbSovCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEEzRXh0cmFUcmFuc3ZlcnNlID0gNjgKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9yaWdodE1hcmdpblBhdGggPSAiZDpwYWdlTWFyZ2lucy9AcmlnaHQiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJpZ2h0IG1hcmdpbiBpbiBpbmNoZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGRlY2ltYWwgUmlnaHRNYXJnaW4geworICAgIGdldCA9PiBHZXRYbWxOb2RlRGVjaW1hbChfcmlnaHRNYXJnaW5QYXRoKTsKKyAgICBzZXQgeworICAgICAgQ3JlYXRlTWFyZ2lucygpOworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfcmlnaHRNYXJnaW5QYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CiAgICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gU3BlY2lmaWVzIHByaW50ZWQgcGFnZSBvcmRlcgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZVBhZ2VPcmRlcgotICAgIHsKKyAgfQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE9yZGVyIHBhZ2VzIHZlcnRpY2FsbHkgZmlyc3QsIHRoZW4gbW92ZSBob3Jpem9udGFsbHkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIERvd25UaGVuT3ZlciwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gT3JkZXIgcGFnZXMgaG9yaXpvbnRhbGx5IGZpcnN0LCB0aGVuIG1vdmUgdmVydGljYWxseQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBPdmVyVGhlbkRvd24KKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3RvcE1hcmdpblBhdGggPSAiZDpwYWdlTWFyZ2lucy9AdG9wIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUb3AgbWFyZ2luIGluIGluY2hlcworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZGVjaW1hbCBUb3BNYXJnaW4geworICAgIGdldCA9PiBHZXRYbWxOb2RlRGVjaW1hbChfdG9wTWFyZ2luUGF0aCk7CisgICAgc2V0IHsKKyAgICAgIENyZWF0ZU1hcmdpbnMoKTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3RvcE1hcmdpblBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKICAgICB9Ci0gICAgI2VuZHJlZ2lvbgotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUHJpbnRlciBzZXR0aW5ncwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbFByaW50ZXJTZXR0aW5ncyA6IFhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgRXhjZWxXb3Jrc2hlZXQgX3dzOwotICAgICAgICBib29sIF9tYXJnaW5zQ3JlYXRlZCA9IGZhbHNlOworICB9CiAKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxQcmludGVyU2V0dGluZ3MoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLEV4Y2VsV29ya3NoZWV0IHdzKSA6Ci0gICAgICAgICAgICBiYXNlKG5zLCB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd3MgPSB3czsKLSAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IHdzLlNjaGVtYU5vZGVPcmRlcjsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgX2xlZnRNYXJnaW5QYXRoID0gImQ6cGFnZU1hcmdpbnMvQGxlZnQiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMZWZ0IG1hcmdpbiBpbiBpbmNoZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRlY2ltYWwgTGVmdE1hcmdpbiAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKF9sZWZ0TWFyZ2luUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIENyZWF0ZU1hcmdpbnMoKTsKLSAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2xlZnRNYXJnaW5QYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9yaWdodE1hcmdpblBhdGggPSAiZDpwYWdlTWFyZ2lucy9AcmlnaHQiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSaWdodCBtYXJnaW4gaW4gaW5jaGVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkZWNpbWFsIFJpZ2h0TWFyZ2luIAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZURlY2ltYWwoX3JpZ2h0TWFyZ2luUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDcmVhdGVNYXJnaW5zKCk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfcmlnaHRNYXJnaW5QYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF90b3BNYXJnaW5QYXRoID0gImQ6cGFnZU1hcmdpbnMvQHRvcCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRvcCBtYXJnaW4gaW4gaW5jaGVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkZWNpbWFsIFRvcE1hcmdpbiAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKF90b3BNYXJnaW5QYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZU1hcmdpbnMoKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF90b3BNYXJnaW5QYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9ib3R0b21NYXJnaW5QYXRoID0gImQ6cGFnZU1hcmdpbnMvQGJvdHRvbSI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEJvdHRvbSBtYXJnaW4gaW4gaW5jaGVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkZWNpbWFsIEJvdHRvbU1hcmdpbiAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKF9ib3R0b21NYXJnaW5QYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZU1hcmdpbnMoKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9ib3R0b21NYXJnaW5QYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9oZWFkZXJNYXJnaW5QYXRoID0gImQ6cGFnZU1hcmdpbnMvQGhlYWRlciI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEhlYWRlciBtYXJnaW4gaW4gaW5jaGVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkZWNpbWFsIEhlYWRlck1hcmdpbiAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKF9oZWFkZXJNYXJnaW5QYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZU1hcmdpbnMoKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9oZWFkZXJNYXJnaW5QYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9mb290ZXJNYXJnaW5QYXRoID0gImQ6cGFnZU1hcmdpbnMvQGZvb3RlciI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvb3RlciBtYXJnaW4gaW4gaW5jaGVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkZWNpbWFsIEZvb3Rlck1hcmdpbiAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVEZWNpbWFsKF9mb290ZXJNYXJnaW5QYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZU1hcmdpbnMoKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9mb290ZXJNYXJnaW5QYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9vcmllbnRhdGlvblBhdGggPSAiZDpwYWdlU2V0dXAvQG9yaWVudGF0aW9uIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gT3JpZW50YXRpb24gCi0gICAgICAgIC8vLyBQb3J0cmFpdCBvciBMYW5kc2NhcGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGVPcmllbnRhdGlvbiBPcmllbnRhdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGVPcmllbnRhdGlvbilFbnVtLlBhcnNlKHR5cGVvZihlT3JpZW50YXRpb24pLCBHZXRYbWxOb2RlU3RyaW5nKF9vcmllbnRhdGlvblBhdGgpLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX29yaWVudGF0aW9uUGF0aCwgdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgX2ZpdFRvV2lkdGhQYXRoID0gImQ6cGFnZVNldHVwL0BmaXRUb1dpZHRoIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRml0IHRvIFdpZHRoIGluIHBhZ2VzLiAKLSAgICAgICAgLy8vIFNldCBGaXRUb1BhZ2UgdG8gdHJ1ZSB3aGVuIHVzaW5nIHRoaXMgb25lLiAKLSAgICAgICAgLy8vIDAgaXMgYXV0b21hdGljCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgRml0VG9XaWR0aAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChfZml0VG9XaWR0aFBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfZml0VG9XaWR0aFBhdGgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBfZml0VG9IZWlnaHRQYXRoID0gImQ6cGFnZVNldHVwL0BmaXRUb0hlaWdodCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZpdCB0byBoZWlnaHQgaW4gcGFnZXMuIAotICAgICAgICAvLy8gU2V0IEZpdFRvUGFnZSB0byB0cnVlIHdoZW4gdXNpbmcgdGhpcyBvbmUuIAotICAgICAgICAvLy8gMCBpcyBhdXRvbWF0aWMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBGaXRUb0hlaWdodAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChfZml0VG9IZWlnaHRQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2ZpdFRvSGVpZ2h0UGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9zY2FsZVBhdGggPSAiZDpwYWdlU2V0dXAvQHNjYWxlIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUHJpbnQgc2NhbGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBTY2FsZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChfc2NhbGVQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3NjYWxlUGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9maXRUb1BhZ2VQYXRoID0gImQ6c2hlZXRQci9kOnBhZ2VTZXRVcFByL0BmaXRUb1BhZ2UiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGaXQgVG8gUGFnZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgRml0VG9QYWdlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChfZml0VG9QYWdlUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9maXRUb1BhZ2VQYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9oZWFkZXJzUGF0aCA9ICJkOnByaW50T3B0aW9ucy9AaGVhZGluZ3MiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQcmludCBoZWFkaW5ncyAoY29sdW1uIGxldHRlciBhbmQgcm93IG51bWJlcnMpCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFNob3dIZWFkZXJzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChfaGVhZGVyc1BhdGgsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKF9oZWFkZXJzUGF0aCwgdmFsdWUsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQcmludCB0aXRsZXMKLSAgICAgICAgLy8vIFJvd3MgdG8gYmUgcmVwZWF0ZWQgYWZ0ZXIgZWFjaCBwYWdlYnJlYWsuCi0gICAgICAgIC8vLyBUaGUgYWRkcmVzcyBtdXN0IGJlIGEgZnVsbCByb3cgYWRkcmVzcyAoZXguIDE6MSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQWRkcmVzcyBSZXBlYXRSb3dzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfd3MuTmFtZXMuQ29udGFpbnNLZXkoIl94bG5tLlByaW50X1RpdGxlcyIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRXhjZWxSYW5nZUJhc2UgciA9IF93cy5OYW1lc1siX3hsbm0uUHJpbnRfVGl0bGVzIl0gYXMgRXhjZWxSYW5nZUJhc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyLlN0YXJ0LkNvbHVtbiA9PSAxICYmIHIuRW5kLkNvbHVtbiA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3Moci5GaXJzdEFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHIuX2FkZHJlc3NlcyAhPSBudWxsICYmIHIuQWRkcmVzc2VzWzBdLlN0YXJ0LkNvbHVtbiA9PSAxICYmIHIuQWRkcmVzc2VzWzBdLkVuZC5Db2x1bW4gPT0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLl9hZGRyZXNzZXNbMF07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2JvdHRvbU1hcmdpblBhdGggPSAiZDpwYWdlTWFyZ2lucy9AYm90dG9tIjsKIAotICAgICAgICAgICAgICAgIC8vTXVzdCBzcGFuIGVudGlyZSBjb2x1bW5zCi0gICAgICAgICAgICAgICAgaWYgKCEodmFsdWUuU3RhcnQuQ29sdW1uID09IDEgJiYgdmFsdWUuRW5kLkNvbHVtbiA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQWRkcmVzcyBtdXN0IHNwYW4gZnVsbCBjb2x1bW5zIG9ubHkgKGZvciBleC4gQWRkcmVzcz1cIkE6QVwiIGZvciB0aGUgZmlyc3QgY29sdW1uKS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB2YXIgdmVydEFkZHIgPSBSZXBlYXRDb2x1bW5zOwotICAgICAgICAgICAgICAgIHN0cmluZyBhZGRyOwotICAgICAgICAgICAgICAgIGlmICh2ZXJ0QWRkciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkciA9IHZhbHVlLkFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHIgPSB2ZXJ0QWRkci5BZGRyZXNzICsgIiwiICsgdmFsdWUuQWRkcmVzczsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoX3dzLk5hbWVzLkNvbnRhaW5zS2V5KCJfeGxubS5QcmludF9UaXRsZXMiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF93cy5OYW1lc1siX3hsbm0uUHJpbnRfVGl0bGVzIl0uQWRkcmVzcyA9IGFkZHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF93cy5OYW1lcy5BZGQoIl94bG5tLlByaW50X1RpdGxlcyIsIG5ldyBFeGNlbFJhbmdlQmFzZShfd3MsIGFkZHIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUHJpbnQgdGl0bGVzCi0gICAgICAgIC8vLyBDb2x1bW5zIHRvIGJlIHJlcGVhdGVkIGFmdGVyIGVhY2ggcGFnZWJyZWFrLgotICAgICAgICAvLy8gVGhlIGFkZHJlc3MgbXVzdCBiZSBhIGZ1bGwgY29sdW1uIGFkZHJlc3MgKGV4LiBBOkEpCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEFkZHJlc3MgUmVwZWF0Q29sdW1ucwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3dzLk5hbWVzLkNvbnRhaW5zS2V5KCJfeGxubS5QcmludF9UaXRsZXMiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEV4Y2VsUmFuZ2VCYXNlIHIgPSBfd3MuTmFtZXNbIl94bG5tLlByaW50X1RpdGxlcyJdIGFzIEV4Y2VsUmFuZ2VCYXNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoci5TdGFydC5Sb3cgPT0gMSAmJiByLkVuZC5Sb3cgPT0gRXhjZWxQYWNrYWdlLk1heFJvd3MpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxBZGRyZXNzKHIuRmlyc3RBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyLl9hZGRyZXNzZXMgIT0gbnVsbCAmJiAoci5fYWRkcmVzc2VzWzBdLlN0YXJ0LlJvdyA9PSAxICYmIHIuX2FkZHJlc3Nlc1swXS5FbmQuUm93ID09IEV4Y2VsUGFja2FnZS5NYXhSb3dzKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuX2FkZHJlc3Nlc1swXTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vTXVzdCBzcGFuIGVudGlyZSByb3dzCi0gICAgICAgICAgICAgICAgaWYgKCEodmFsdWUuU3RhcnQuUm93ID09IDEgJiYgdmFsdWUuRW5kLlJvdz09IEV4Y2VsUGFja2FnZS5NYXhSb3dzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJBZGRyZXNzIG11c3Qgc3BhbiByb3dzIG9ubHkgKGZvciBleC4gQWRkcmVzcz1cIjE6MVwiIGZvciB0aGUgZmlyc3Qgcm93KS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB2YXIgaG9yQWRkciA9IFJlcGVhdFJvd3M7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGFkZHI7Ci0gICAgICAgICAgICAgICAgaWYgKGhvckFkZHIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHIgPSB2YWx1ZS5BZGRyZXNzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZGRyID0gdmFsdWUuQWRkcmVzcyArICIsIiArIGhvckFkZHIuQWRkcmVzczsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoX3dzLk5hbWVzLkNvbnRhaW5zS2V5KCJfeGxubS5QcmludF9UaXRsZXMiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF93cy5OYW1lc1siX3hsbm0uUHJpbnRfVGl0bGVzIl0uQWRkcmVzcyA9IGFkZHI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF93cy5OYW1lcy5BZGQoIl94bG5tLlByaW50X1RpdGxlcyIsIG5ldyBFeGNlbFJhbmdlQmFzZShfd3MsIGFkZHIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHByaW50YXJlYS4KLSAgICAgICAgLy8vIE51bGwgaWYgbm8gcHJpbnQgYXJlYSBpcyBzZXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFJhbmdlQmFzZSBQcmludEFyZWEgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfd3MuTmFtZXMuQ29udGFpbnNLZXkoIl94bG5tLlByaW50X0FyZWEiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfd3MuTmFtZXNbIl94bG5tLlByaW50X0FyZWEiXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfd3MuTmFtZXMuUmVtb3ZlKCJfeGxubS5QcmludF9BcmVhIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKF93cy5OYW1lcy5Db250YWluc0tleSgiX3hsbm0uUHJpbnRfQXJlYSIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3dzLk5hbWVzWyJfeGxubS5QcmludF9BcmVhIl0uQWRkcmVzcyA9IHZhbHVlLkFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF93cy5OYW1lcy5BZGQoIl94bG5tLlByaW50X0FyZWEiLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBfZ3JpZExpbmVzUGF0aCA9ICJkOnByaW50T3B0aW9ucy9AZ3JpZExpbmVzIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUHJpbnQgZ3JpZGxpbmVzIAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93R3JpZExpbmVzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChfZ3JpZExpbmVzUGF0aCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2dyaWRMaW5lc1BhdGgsIHZhbHVlLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9ob3Jpem9udGFsQ2VudGVyZWRQYXRoID0gImQ6cHJpbnRPcHRpb25zL0Bob3Jpem9udGFsQ2VudGVyZWQiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBIb3Jpem9udGFsIGNlbnRlcmVkIHdoZW4gcHJpbnRpbmcgCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+dwotICAgICAgICBwdWJsaWMgYm9vbCBIb3Jpem9udGFsQ2VudGVyZWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKF9ob3Jpem9udGFsQ2VudGVyZWRQYXRoLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfaG9yaXpvbnRhbENlbnRlcmVkUGF0aCwgdmFsdWUsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgX3ZlcnRpY2FsQ2VudGVyZWRQYXRoID0gImQ6cHJpbnRPcHRpb25zL0B2ZXJ0aWNhbENlbnRlcmVkIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVmVydGljYWwgY2VudGVyZWQgd2hlbiBwcmludGluZyAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgVmVydGljYWxDZW50ZXJlZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woX3ZlcnRpY2FsQ2VudGVyZWRQYXRoLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfdmVydGljYWxDZW50ZXJlZFBhdGgsIHZhbHVlLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9wYWdlT3JkZXJQYXRoID0gImQ6cGFnZVNldHVwL0BwYWdlT3JkZXIiOyAgICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNwZWNpZmllcyBwcmludGVkIHBhZ2Ugb3JkZXIKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGVQYWdlT3JkZXIgUGFnZU9yZGVyCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChHZXRYbWxOb2RlU3RyaW5nKF9wYWdlT3JkZXJQYXRoKSA9PSAib3ZlclRoZW5Eb3duIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlUGFnZU9yZGVyLk92ZXJUaGVuRG93bjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVQYWdlT3JkZXIuRG93blRoZW5PdmVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBlUGFnZU9yZGVyLk92ZXJUaGVuRG93bikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3BhZ2VPcmRlclBhdGgsICJvdmVyVGhlbkRvd24iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShfcGFnZU9yZGVyUGF0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBfYmxhY2tBbmRXaGl0ZVBhdGggPSAiZDpwYWdlU2V0dXAvQGJsYWNrQW5kV2hpdGUiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQcmludCBibGFjayBhbmQgd2hpdGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgQmxhY2tBbmRXaGl0ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woX2JsYWNrQW5kV2hpdGVQYXRoLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfYmxhY2tBbmRXaGl0ZVBhdGgsIHZhbHVlLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9kcmFmdFBhdGggPSAiZDpwYWdlU2V0dXAvQGRyYWZ0IjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUHJpbnQgYSBkcmFmdAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBEcmFmdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woX2RyYWZ0UGF0aCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2RyYWZ0UGF0aCwgdmFsdWUsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgX3BhcGVyU2l6ZVBhdGggPSAiZDpwYWdlU2V0dXAvQHBhcGVyU2l6ZSI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBhcGVyIHNpemUgCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlUGFwZXJTaXplIFBhcGVyU2l6ZSAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHMgPSBHZXRYbWxOb2RlU3RyaW5nKF9wYXBlclNpemVQYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAocyAhPSAiIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoZVBhcGVyU2l6ZSlpbnQuUGFyc2Uocyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlUGFwZXJTaXplLkxldHRlcjsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfcGFwZXJTaXplUGF0aCwgKChpbnQpdmFsdWUpLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFsbCBvciBub25lIG9mIHRoZSBtYXJnaW4gYXR0cmlidXRlcyBtdXN0IGV4aXN0LiBDcmVhdGUgYWxsIGF0dCBvbmVzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHZvaWQgQ3JlYXRlTWFyZ2lucygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfbWFyZ2luc0NyZWF0ZWQ9PWZhbHNlICYmIFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfbGVmdE1hcmdpblBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpID09IG51bGwpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9tYXJnaW5zQ3JlYXRlZD10cnVlOwotICAgICAgICAgICAgICAgIExlZnRNYXJnaW4gPSAwLjcwODdNOwotICAgICAgICAgICAgICAgIFJpZ2h0TWFyZ2luID0gMC43MDg3TTsKLSAgICAgICAgICAgICAgICBUb3BNYXJnaW4gPSAwLjc0ODBNOwotICAgICAgICAgICAgICAgIEJvdHRvbU1hcmdpbiA9IDAuNzQ4ME07Ci0gICAgICAgICAgICAgICAgSGVhZGVyTWFyZ2luID0gMC4zMTVNOwotICAgICAgICAgICAgICAgIEZvb3Rlck1hcmdpbiA9IDAuMzE1TTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBCb3R0b20gbWFyZ2luIGluIGluY2hlcworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZGVjaW1hbCBCb3R0b21NYXJnaW4geworICAgIGdldCA9PiBHZXRYbWxOb2RlRGVjaW1hbChfYm90dG9tTWFyZ2luUGF0aCk7CisgICAgc2V0IHsKKyAgICAgIENyZWF0ZU1hcmdpbnMoKTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2JvdHRvbU1hcmdpblBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKICAgICB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfaGVhZGVyTWFyZ2luUGF0aCA9ICJkOnBhZ2VNYXJnaW5zL0BoZWFkZXIiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEhlYWRlciBtYXJnaW4gaW4gaW5jaGVzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBkZWNpbWFsIEhlYWRlck1hcmdpbiB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVEZWNpbWFsKF9oZWFkZXJNYXJnaW5QYXRoKTsKKyAgICBzZXQgeworICAgICAgQ3JlYXRlTWFyZ2lucygpOworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfaGVhZGVyTWFyZ2luUGF0aCwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9mb290ZXJNYXJnaW5QYXRoID0gImQ6cGFnZU1hcmdpbnMvQGZvb3RlciI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRm9vdGVyIG1hcmdpbiBpbiBpbmNoZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGRlY2ltYWwgRm9vdGVyTWFyZ2luIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZURlY2ltYWwoX2Zvb3Rlck1hcmdpblBhdGgpOworICAgIHNldCB7CisgICAgICBDcmVhdGVNYXJnaW5zKCk7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9mb290ZXJNYXJnaW5QYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX29yaWVudGF0aW9uUGF0aCA9ICJkOnBhZ2VTZXR1cC9Ab3JpZW50YXRpb24iOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE9yaWVudGF0aW9uCisgIC8vLyBQb3J0cmFpdCBvciBMYW5kc2NhcGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGVPcmllbnRhdGlvbiBPcmllbnRhdGlvbiB7CisgICAgZ2V0ID0+IChlT3JpZW50YXRpb24pRW51bS5QYXJzZSh0eXBlb2YoZU9yaWVudGF0aW9uKSwgR2V0WG1sTm9kZVN0cmluZyhfb3JpZW50YXRpb25QYXRoKSwgdHJ1ZSk7CisgICAgc2V0ID0+CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9vcmllbnRhdGlvblBhdGgsIHZhbHVlLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZml0VG9XaWR0aFBhdGggPSAiZDpwYWdlU2V0dXAvQGZpdFRvV2lkdGgiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEZpdCB0byBXaWR0aCBpbiBwYWdlcy4KKyAgLy8vIFNldCBGaXRUb1BhZ2UgdG8gdHJ1ZSB3aGVuIHVzaW5nIHRoaXMgb25lLgorICAvLy8gMCBpcyBhdXRvbWF0aWMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBGaXRUb1dpZHRoIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUludChfZml0VG9XaWR0aFBhdGgpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKF9maXRUb1dpZHRoUGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZml0VG9IZWlnaHRQYXRoID0gImQ6cGFnZVNldHVwL0BmaXRUb0hlaWdodCI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRml0IHRvIGhlaWdodCBpbiBwYWdlcy4KKyAgLy8vIFNldCBGaXRUb1BhZ2UgdG8gdHJ1ZSB3aGVuIHVzaW5nIHRoaXMgb25lLgorICAvLy8gMCBpcyBhdXRvbWF0aWMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBGaXRUb0hlaWdodCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVJbnQoX2ZpdFRvSGVpZ2h0UGF0aCk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoX2ZpdFRvSGVpZ2h0UGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfc2NhbGVQYXRoID0gImQ6cGFnZVNldHVwL0BzY2FsZSI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUHJpbnQgc2NhbGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBTY2FsZSB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVJbnQoX3NjYWxlUGF0aCk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoX3NjYWxlUGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZml0VG9QYWdlUGF0aCA9ICJkOnNoZWV0UHIvZDpwYWdlU2V0VXBQci9AZml0VG9QYWdlIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBGaXQgVG8gUGFnZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgRml0VG9QYWdlIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2woX2ZpdFRvUGFnZVBhdGgpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKF9maXRUb1BhZ2VQYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfaGVhZGVyc1BhdGggPSAiZDpwcmludE9wdGlvbnMvQGhlYWRpbmdzIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQcmludCBoZWFkaW5ncyAoY29sdW1uIGxldHRlciBhbmQgcm93IG51bWJlcnMpCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIFNob3dIZWFkZXJzIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2woX2hlYWRlcnNQYXRoLCBmYWxzZSk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKF9oZWFkZXJzUGF0aCwgdmFsdWUsIGZhbHNlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFByaW50IHRpdGxlcworICAvLy8gUm93cyB0byBiZSByZXBlYXRlZCBhZnRlciBlYWNoIHBhZ2VicmVhay4KKyAgLy8vIFRoZSBhZGRyZXNzIG11c3QgYmUgYSBmdWxsIHJvdyBhZGRyZXNzIChleC4gMToxKQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxBZGRyZXNzIFJlcGVhdFJvd3MgeworICAgIGdldCB7CisgICAgICBpZiAoX3dzLk5hbWVzLkNvbnRhaW5zS2V5KCJfeGxubS5QcmludF9UaXRsZXMiKSkgeworICAgICAgICBFeGNlbFJhbmdlQmFzZSByID0gX3dzLk5hbWVzWyJfeGxubS5QcmludF9UaXRsZXMiXTsKKyAgICAgICAgaWYgKHIuU3RhcnQuQ29sdW1uID09IDEgJiYgci5FbmQuQ29sdW1uID09IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSB7CisgICAgICAgICAgcmV0dXJuIG5ldyhyLkZpcnN0QWRkcmVzcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHIuX2FkZHJlc3NlcyAhPSBudWxsCisgICAgICAgICAgICAmJiByLkFkZHJlc3Nlc1swXS5TdGFydC5Db2x1bW4gPT0gMQorICAgICAgICAgICAgJiYgci5BZGRyZXNzZXNbMF0uRW5kLkNvbHVtbiA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgeworICAgICAgICAgIHJldHVybiByLl9hZGRyZXNzZXNbMF07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIC8vTXVzdCBzcGFuIGVudGlyZSBjb2x1bW5zCisgICAgICBpZiAoISh2YWx1ZS5TdGFydC5Db2x1bW4gPT0gMSAmJiB2YWx1ZS5FbmQuQ29sdW1uID09IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSkgeworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICJBZGRyZXNzIG11c3Qgc3BhbiBmdWxsIGNvbHVtbnMgb25seSAoZm9yIGV4LiBBZGRyZXNzPVwiQTpBXCIgZm9yIHRoZSBmaXJzdCBjb2x1bW4pLiIpOworICAgICAgfQorCisgICAgICB2YXIgdmVydEFkZHIgPSBSZXBlYXRDb2x1bW5zOworICAgICAgc3RyaW5nIGFkZHI7CisgICAgICBpZiAodmVydEFkZHIgPT0gbnVsbCkgeworICAgICAgICBhZGRyID0gdmFsdWUuQWRkcmVzczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFkZHIgPSB2ZXJ0QWRkci5BZGRyZXNzICsgIiwiICsgdmFsdWUuQWRkcmVzczsKKyAgICAgIH0KKworICAgICAgaWYgKF93cy5OYW1lcy5Db250YWluc0tleSgiX3hsbm0uUHJpbnRfVGl0bGVzIikpIHsKKyAgICAgICAgX3dzLk5hbWVzWyJfeGxubS5QcmludF9UaXRsZXMiXS5BZGRyZXNzID0gYWRkcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF93cy5OYW1lcy5BZGQoIl94bG5tLlByaW50X1RpdGxlcyIsIG5ldyhfd3MsIGFkZHIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQcmludCB0aXRsZXMKKyAgLy8vIENvbHVtbnMgdG8gYmUgcmVwZWF0ZWQgYWZ0ZXIgZWFjaCBwYWdlYnJlYWsuCisgIC8vLyBUaGUgYWRkcmVzcyBtdXN0IGJlIGEgZnVsbCBjb2x1bW4gYWRkcmVzcyAoZXguIEE6QSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsQWRkcmVzcyBSZXBlYXRDb2x1bW5zIHsKKyAgICBnZXQgeworICAgICAgaWYgKF93cy5OYW1lcy5Db250YWluc0tleSgiX3hsbm0uUHJpbnRfVGl0bGVzIikpIHsKKyAgICAgICAgRXhjZWxSYW5nZUJhc2UgciA9IF93cy5OYW1lc1siX3hsbm0uUHJpbnRfVGl0bGVzIl07CisgICAgICAgIGlmIChyLlN0YXJ0LlJvdyA9PSAxICYmIHIuRW5kLlJvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cykgeworICAgICAgICAgIHJldHVybiBuZXcoci5GaXJzdEFkZHJlc3MpOworICAgICAgICB9CisgICAgICAgIGlmIChyLl9hZGRyZXNzZXMgIT0gbnVsbAorICAgICAgICAgICAgJiYgKHIuX2FkZHJlc3Nlc1swXS5TdGFydC5Sb3cgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiByLl9hZGRyZXNzZXNbMF0uRW5kLlJvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cykpIHsKKyAgICAgICAgICByZXR1cm4gci5fYWRkcmVzc2VzWzBdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHNldCB7CisgICAgICAvL011c3Qgc3BhbiBlbnRpcmUgcm93cworICAgICAgaWYgKCEodmFsdWUuU3RhcnQuUm93ID09IDEgJiYgdmFsdWUuRW5kLlJvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cykpIHsKKyAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAiQWRkcmVzcyBtdXN0IHNwYW4gcm93cyBvbmx5IChmb3IgZXguIEFkZHJlc3M9XCIxOjFcIiBmb3IgdGhlIGZpcnN0IHJvdykuIik7CisgICAgICB9CisKKyAgICAgIHZhciBob3JBZGRyID0gUmVwZWF0Um93czsKKyAgICAgIHN0cmluZyBhZGRyOworICAgICAgaWYgKGhvckFkZHIgPT0gbnVsbCkgeworICAgICAgICBhZGRyID0gdmFsdWUuQWRkcmVzczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFkZHIgPSB2YWx1ZS5BZGRyZXNzICsgIiwiICsgaG9yQWRkci5BZGRyZXNzOworICAgICAgfQorCisgICAgICBpZiAoX3dzLk5hbWVzLkNvbnRhaW5zS2V5KCJfeGxubS5QcmludF9UaXRsZXMiKSkgeworICAgICAgICBfd3MuTmFtZXNbIl94bG5tLlByaW50X1RpdGxlcyJdLkFkZHJlc3MgPSBhZGRyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3dzLk5hbWVzLkFkZCgiX3hsbm0uUHJpbnRfVGl0bGVzIiwgbmV3KF93cywgYWRkcikpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBwcmludGFyZWEuCisgIC8vLyBOdWxsIGlmIG5vIHByaW50IGFyZWEgaXMgc2V0LgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxSYW5nZUJhc2UgUHJpbnRBcmVhIHsKKyAgICBnZXQgeworICAgICAgaWYgKF93cy5OYW1lcy5Db250YWluc0tleSgiX3hsbm0uUHJpbnRfQXJlYSIpKSB7CisgICAgICAgIHJldHVybiBfd3MuTmFtZXNbIl94bG5tLlByaW50X0FyZWEiXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBzZXQgeworICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgX3dzLk5hbWVzLlJlbW92ZSgiX3hsbm0uUHJpbnRfQXJlYSIpOworICAgICAgfSBlbHNlIGlmIChfd3MuTmFtZXMuQ29udGFpbnNLZXkoIl94bG5tLlByaW50X0FyZWEiKSkgeworICAgICAgICBfd3MuTmFtZXNbIl94bG5tLlByaW50X0FyZWEiXS5BZGRyZXNzID0gdmFsdWUuQWRkcmVzczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF93cy5OYW1lcy5BZGQoIl94bG5tLlByaW50X0FyZWEiLCB2YWx1ZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2dyaWRMaW5lc1BhdGggPSAiZDpwcmludE9wdGlvbnMvQGdyaWRMaW5lcyI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUHJpbnQgZ3JpZGxpbmVzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIFNob3dHcmlkTGluZXMgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbChfZ3JpZExpbmVzUGF0aCwgZmFsc2UpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbChfZ3JpZExpbmVzUGF0aCwgdmFsdWUsIGZhbHNlKTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9ob3Jpem9udGFsQ2VudGVyZWRQYXRoID0gImQ6cHJpbnRPcHRpb25zL0Bob3Jpem9udGFsQ2VudGVyZWQiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEhvcml6b250YWwgY2VudGVyZWQgd2hlbiBwcmludGluZworICAvLy8gPC9zdW1tYXJ5PncKKyAgcHVibGljIGJvb2wgSG9yaXpvbnRhbENlbnRlcmVkIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2woX2hvcml6b250YWxDZW50ZXJlZFBhdGgsIGZhbHNlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX2hvcml6b250YWxDZW50ZXJlZFBhdGgsIHZhbHVlLCBmYWxzZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfdmVydGljYWxDZW50ZXJlZFBhdGggPSAiZDpwcmludE9wdGlvbnMvQHZlcnRpY2FsQ2VudGVyZWQiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFZlcnRpY2FsIGNlbnRlcmVkIHdoZW4gcHJpbnRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgVmVydGljYWxDZW50ZXJlZCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKF92ZXJ0aWNhbENlbnRlcmVkUGF0aCwgZmFsc2UpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbChfdmVydGljYWxDZW50ZXJlZFBhdGgsIHZhbHVlLCBmYWxzZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfcGFnZU9yZGVyUGF0aCA9ICJkOnBhZ2VTZXR1cC9AcGFnZU9yZGVyIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTcGVjaWZpZXMgcHJpbnRlZCBwYWdlIG9yZGVyCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBlUGFnZU9yZGVyIFBhZ2VPcmRlciB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChHZXRYbWxOb2RlU3RyaW5nKF9wYWdlT3JkZXJQYXRoKSA9PSAib3ZlclRoZW5Eb3duIikgeworICAgICAgICByZXR1cm4gZVBhZ2VPcmRlci5PdmVyVGhlbkRvd247CisgICAgICB9CisgICAgICByZXR1cm4gZVBhZ2VPcmRlci5Eb3duVGhlbk92ZXI7CisgICAgfQorICAgIHNldCB7CisgICAgICBpZiAodmFsdWUgPT0gZVBhZ2VPcmRlci5PdmVyVGhlbkRvd24pIHsKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfcGFnZU9yZGVyUGF0aCwgIm92ZXJUaGVuRG93biIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRGVsZXRlTm9kZShfcGFnZU9yZGVyUGF0aCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2JsYWNrQW5kV2hpdGVQYXRoID0gImQ6cGFnZVNldHVwL0BibGFja0FuZFdoaXRlIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQcmludCBibGFjayBhbmQgd2hpdGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQmxhY2tBbmRXaGl0ZSB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKF9ibGFja0FuZFdoaXRlUGF0aCwgZmFsc2UpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbChfYmxhY2tBbmRXaGl0ZVBhdGgsIHZhbHVlLCBmYWxzZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZHJhZnRQYXRoID0gImQ6cGFnZVNldHVwL0BkcmFmdCI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUHJpbnQgYSBkcmFmdAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBEcmFmdCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKF9kcmFmdFBhdGgsIGZhbHNlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX2RyYWZ0UGF0aCwgdmFsdWUsIGZhbHNlKTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9wYXBlclNpemVQYXRoID0gImQ6cGFnZVNldHVwL0BwYXBlclNpemUiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFBhcGVyIHNpemUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGVQYXBlclNpemUgUGFwZXJTaXplIHsKKyAgICBnZXQgeworICAgICAgc3RyaW5nIHMgPSBHZXRYbWxOb2RlU3RyaW5nKF9wYXBlclNpemVQYXRoKTsKKyAgICAgIGlmIChzICE9ICIiKSB7CisgICAgICAgIHJldHVybiAoZVBhcGVyU2l6ZSlpbnQuUGFyc2Uocyk7CisgICAgICB9CisgICAgICByZXR1cm4gZVBhcGVyU2l6ZS5MZXR0ZXI7CisgICAgfQorICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKF9wYXBlclNpemVQYXRoLCAoKGludCl2YWx1ZSkuVG9TdHJpbmcoKSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBbGwgb3Igbm9uZSBvZiB0aGUgbWFyZ2luIGF0dHJpYnV0ZXMgbXVzdCBleGlzdC4gQ3JlYXRlIGFsbCBhdHQgb25lcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHJpdmF0ZSB2b2lkIENyZWF0ZU1hcmdpbnMoKSB7CisgICAgaWYgKF9tYXJnaW5zQ3JlYXRlZCA9PSBmYWxzZQorICAgICAgICAmJiBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2xlZnRNYXJnaW5QYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSA9PSBudWxsKSB7CisgICAgICBfbWFyZ2luc0NyZWF0ZWQgPSB0cnVlOworICAgICAgTGVmdE1hcmdpbiA9IDAuNzA4N007CisgICAgICBSaWdodE1hcmdpbiA9IDAuNzA4N007CisgICAgICBUb3BNYXJnaW4gPSAwLjc0ODBNOworICAgICAgQm90dG9tTWFyZ2luID0gMC43NDgwTTsKKyAgICAgIEhlYWRlck1hcmdpbiA9IDAuMzE1TTsKKyAgICAgIEZvb3Rlck1hcmdpbiA9IDAuMzE1TTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFByb3RlY3RlZFJhbmdlLmNzIGIvRVBQbHVzL0V4Y2VsUHJvdGVjdGVkUmFuZ2UuY3MKaW5kZXggYmI2Njk0NS4uZWYwZGEzOSAxMDA2NDQKLS0tIGEvRVBQbHVzL0V4Y2VsUHJvdGVjdGVkUmFuZ2UuY3MKKysrIGIvRVBQbHVzL0V4Y2VsUHJvdGVjdGVkUmFuZ2UuY3MKQEAgLTEsNDQgKzEsMzUgQEAKLe+7v3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiB1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxQcm90ZWN0ZWRSYW5nZSA6IFhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJAbmFtZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQG5hbWUiLHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbEFkZHJlc3MgX2FkZHJlc3M9bnVsbDsKLSAgICAgICAgcHVibGljIEV4Y2VsQWRkcmVzcyBBZGRyZXNzIAotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoX2FkZHJlc3M9PW51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfYWRkcmVzcz1uZXcgRXhjZWxBZGRyZXNzKEdldFhtbE5vZGVTdHJpbmcoIkBzcXJlZiIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9hZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHNxcmVmIiwgU3FSZWZVdGlsaXR5LlRvU3FSZWZBZGRyZXNzKHZhbHVlLkFkZHJlc3MpKTsKLSAgICAgICAgICAgICAgICBfYWRkcmVzcz12YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWw7CiAKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxQcm90ZWN0ZWRSYW5nZShzdHJpbmcgbmFtZSwgRXhjZWxBZGRyZXNzIGFkZHJlc3MsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgdG9wTm9kZSkgOgotICAgICAgICAgICAgYmFzZShucyx0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBOYW1lID0gbmFtZTsKLSAgICAgICAgICAgIEFkZHJlc3MgPSBhZGRyZXNzOwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgRXhjZWxQcm90ZWN0ZWRSYW5nZSA6IFhtbEhlbHBlciB7CisgIHB1YmxpYyBzdHJpbmcgTmFtZSB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVTdHJpbmcoIkBuYW1lIik7CisgICAgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoIkBuYW1lIiwgdmFsdWUpOworICB9CisKKyAgcHJpdmF0ZSBFeGNlbEFkZHJlc3MgX2FkZHJlc3M7CisgIHB1YmxpYyBFeGNlbEFkZHJlc3MgQWRkcmVzcyB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfYWRkcmVzcyA9PSBudWxsKSB7CisgICAgICAgIF9hZGRyZXNzID0gbmV3KEdldFhtbE5vZGVTdHJpbmcoIkBzcXJlZiIpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfYWRkcmVzczsKICAgICB9CisgICAgc2V0IHsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBzcXJlZiIsIFNxUmVmVXRpbGl0eS5Ub1NxUmVmQWRkcmVzcyh2YWx1ZS5BZGRyZXNzKSk7CisgICAgICBfYWRkcmVzcyA9IHZhbHVlOworICAgIH0KKyAgfQorCisgIGludGVybmFsIEV4Y2VsUHJvdGVjdGVkUmFuZ2UoCisgICAgICBzdHJpbmcgbmFtZSwKKyAgICAgIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBucywKKyAgICAgIFhtbE5vZGUgdG9wTm9kZSkKKyAgICAgIDogYmFzZShucywgdG9wTm9kZSkgeworICAgIE5hbWUgPSBuYW1lOworICAgIEFkZHJlc3MgPSBhZGRyZXNzOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxQcm90ZWN0ZWRSYW5nZUNvbGxlY3Rpb24uY3MgYi9FUFBsdXMvRXhjZWxQcm90ZWN0ZWRSYW5nZUNvbGxlY3Rpb24uY3MKaW5kZXggOTI4NTk3NS4uNzJhZmNjMyAxMDA2NDQKLS0tIGEvRVBQbHVzL0V4Y2VsUHJvdGVjdGVkUmFuZ2VDb2xsZWN0aW9uLmNzCisrKyBiL0VQUGx1cy9FeGNlbFByb3RlY3RlZFJhbmdlQ29sbGVjdGlvbi5jcwpAQCAtMSw5NCArMSw4OSBAQAot77u/dXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKLXVzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAotewotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFByb3RlY3RlZFJhbmdlQ29sbGVjdGlvbiA6IFhtbEhlbHBlciwgSUVudW1lcmFibGU8RXhjZWxQcm90ZWN0ZWRSYW5nZT4KLSAgICB7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsUHJvdGVjdGVkUmFuZ2VDb2xsZWN0aW9uKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnNtLCBYbWxOb2RlIHRvcE5vZGUsIEV4Y2VsV29ya3NoZWV0IHdzKQotICAgICAgICAgICAgOiBiYXNlKG5zbSwgdG9wTm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBwcm90ZWN0ZWRSYW5nZU5vZGUgaW4gdG9wTm9kZS5TZWxlY3ROb2RlcygiZDpwcm90ZWN0ZWRSYW5nZXMvZDpwcm90ZWN0ZWRSYW5nZSIsIG5zbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCEocHJvdGVjdGVkUmFuZ2VOb2RlIGlzIFhtbEVsZW1lbnQpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBfYmFzZUxpc3QuQWRkKG5ldyBFeGNlbFByb3RlY3RlZFJhbmdlKHByb3RlY3RlZFJhbmdlTm9kZS5BdHRyaWJ1dGVzWyJuYW1lIl0uVmFsdWUsIG5ldyBFeGNlbEFkZHJlc3MoU3FSZWZVdGlsaXR5LkZyb21TcVJlZkFkZHJlc3MocHJvdGVjdGVkUmFuZ2VOb2RlLkF0dHJpYnV0ZXNbInNxcmVmIl0uVmFsdWUpKSwgbnNtLCB0b3BOb2RlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOwogCi0gICAgICAgIHByaXZhdGUgTGlzdDxFeGNlbFByb3RlY3RlZFJhbmdlPiBfYmFzZUxpc3QgPSBuZXcgTGlzdDxFeGNlbFByb3RlY3RlZFJhbmdlPigpOwotCi0gICAgICAgIHB1YmxpYyBFeGNlbFByb3RlY3RlZFJhbmdlIEFkZChzdHJpbmcgbmFtZSwgRXhjZWxBZGRyZXNzIGFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghRXhpc3ROb2RlKCJkOnByb3RlY3RlZFJhbmdlcyIpKQotICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoImQ6cHJvdGVjdGVkUmFuZ2VzIik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHZhciBuZXdOb2RlID0gQ3JlYXRlTm9kZSgiZDpwcm90ZWN0ZWRSYW5nZXMvZDpwcm90ZWN0ZWRSYW5nZSIpOwotICAgICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgRXhjZWxQcm90ZWN0ZWRSYW5nZShuYW1lLCBhZGRyZXNzLCBiYXNlLk5hbWVTcGFjZU1hbmFnZXIsIG5ld05vZGUpOwotICAgICAgICAgICAgX2Jhc2VMaXN0LkFkZChpdGVtKTsKLSAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZWxldGVOb2RlKCJkOnByb3RlY3RlZFJhbmdlcyIpOwotICAgICAgICAgICAgX2Jhc2VMaXN0LkNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbCBDb250YWlucyhFeGNlbFByb3RlY3RlZFJhbmdlIGl0ZW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfYmFzZUxpc3QuQ29udGFpbnMoaXRlbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG8oRXhjZWxQcm90ZWN0ZWRSYW5nZVtdIGFycmF5LCBpbnQgYXJyYXlJbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgX2Jhc2VMaXN0LkNvcHlUbyhhcnJheSwgYXJyYXlJbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IENvdW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfYmFzZUxpc3QuQ291bnQ7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIFJlbW92ZShFeGNlbFByb3RlY3RlZFJhbmdlIGl0ZW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlbGV0ZUFsbE5vZGUoImQ6cHJvdGVjdGVkUmFuZ2VzL2Q6cHJvdGVjdGVkUmFuZ2VbQG5hbWU9JyIgKyBpdGVtLk5hbWUgKyAiJyBhbmQgQHNxcmVmPSciICsgaXRlbS5BZGRyZXNzLkFkZHJlc3MgKyAiJ10iKTsKLSAgICAgICAgICAgIGlmIChfYmFzZUxpc3QuQ291bnQgPT0gMCkKLSAgICAgICAgICAgICAgICBEZWxldGVOb2RlKCJkOnByb3RlY3RlZFJhbmdlcyIpOwotICAgICAgICAgICAgcmV0dXJuIF9iYXNlTGlzdC5SZW1vdmUoaXRlbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IEluZGV4T2YoRXhjZWxQcm90ZWN0ZWRSYW5nZSBpdGVtKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2Jhc2VMaXN0LkluZGV4T2YoaXRlbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmVBdChpbnQgaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9iYXNlTGlzdC5SZW1vdmVBdChpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRXhjZWxQcm90ZWN0ZWRSYW5nZSB0aGlzW2ludCBpbmRleF0KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9iYXNlTGlzdFtpbmRleF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBJRW51bWVyYXRvcjxFeGNlbFByb3RlY3RlZFJhbmdlPiBJRW51bWVyYWJsZTxFeGNlbFByb3RlY3RlZFJhbmdlPi5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9iYXNlTGlzdC5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2Jhc2VMaXN0LkdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIEV4Y2VsUHJvdGVjdGVkUmFuZ2VDb2xsZWN0aW9uIDogWG1sSGVscGVyLCBJRW51bWVyYWJsZTxFeGNlbFByb3RlY3RlZFJhbmdlPiB7CisgIGludGVybmFsIEV4Y2VsUHJvdGVjdGVkUmFuZ2VDb2xsZWN0aW9uKAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuc20sCisgICAgICBYbWxOb2RlIHRvcE5vZGUsCisgICAgICBFeGNlbFdvcmtzaGVldCB3cykKKyAgICAgIDogYmFzZShuc20sIHRvcE5vZGUpIHsKKyAgICBmb3JlYWNoIChYbWxOb2RlIHByb3RlY3RlZFJhbmdlTm9kZSBpbiB0b3BOb2RlLlNlbGVjdE5vZGVzKAorICAgICAgICAiZDpwcm90ZWN0ZWRSYW5nZXMvZDpwcm90ZWN0ZWRSYW5nZSIsCisgICAgICAgIG5zbSkpIHsKKyAgICAgIGlmICghKHByb3RlY3RlZFJhbmdlTm9kZSBpcyBYbWxFbGVtZW50KSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIF9iYXNlTGlzdC5BZGQoCisgICAgICAgICAgbmV3KAorICAgICAgICAgICAgICBwcm90ZWN0ZWRSYW5nZU5vZGUuQXR0cmlidXRlc1sibmFtZSJdLlZhbHVlLAorICAgICAgICAgICAgICBuZXcoU3FSZWZVdGlsaXR5LkZyb21TcVJlZkFkZHJlc3MocHJvdGVjdGVkUmFuZ2VOb2RlLkF0dHJpYnV0ZXNbInNxcmVmIl0uVmFsdWUpKSwKKyAgICAgICAgICAgICAgbnNtLAorICAgICAgICAgICAgICB0b3BOb2RlKSk7CiAgICAgfQorICB9CisKKyAgcHJpdmF0ZSBMaXN0PEV4Y2VsUHJvdGVjdGVkUmFuZ2U+IF9iYXNlTGlzdCA9IG5ldygpOworCisgIHB1YmxpYyBFeGNlbFByb3RlY3RlZFJhbmdlIEFkZChzdHJpbmcgbmFtZSwgRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICBpZiAoIUV4aXN0Tm9kZSgiZDpwcm90ZWN0ZWRSYW5nZXMiKSkgeworICAgICAgQ3JlYXRlTm9kZSgiZDpwcm90ZWN0ZWRSYW5nZXMiKTsKKyAgICB9CisKKyAgICB2YXIgbmV3Tm9kZSA9IENyZWF0ZU5vZGUoImQ6cHJvdGVjdGVkUmFuZ2VzL2Q6cHJvdGVjdGVkUmFuZ2UiKTsKKyAgICB2YXIgaXRlbSA9IG5ldyBFeGNlbFByb3RlY3RlZFJhbmdlKG5hbWUsIGFkZHJlc3MsIE5hbWVTcGFjZU1hbmFnZXIsIG5ld05vZGUpOworICAgIF9iYXNlTGlzdC5BZGQoaXRlbSk7CisgICAgcmV0dXJuIGl0ZW07CisgIH0KKworICBwdWJsaWMgdm9pZCBDbGVhcigpIHsKKyAgICBEZWxldGVOb2RlKCJkOnByb3RlY3RlZFJhbmdlcyIpOworICAgIF9iYXNlTGlzdC5DbGVhcigpOworICB9CisKKyAgcHVibGljIGJvb2wgQ29udGFpbnMoRXhjZWxQcm90ZWN0ZWRSYW5nZSBpdGVtKSB7CisgICAgcmV0dXJuIF9iYXNlTGlzdC5Db250YWlucyhpdGVtKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIENvcHlUbyhFeGNlbFByb3RlY3RlZFJhbmdlW10gYXJyYXksIGludCBhcnJheUluZGV4KSB7CisgICAgX2Jhc2VMaXN0LkNvcHlUbyhhcnJheSwgYXJyYXlJbmRleCk7CisgIH0KKworICBwdWJsaWMgaW50IENvdW50ID0+IF9iYXNlTGlzdC5Db3VudDsKKworICBwdWJsaWMgYm9vbCBSZW1vdmUoRXhjZWxQcm90ZWN0ZWRSYW5nZSBpdGVtKSB7CisgICAgRGVsZXRlQWxsTm9kZSgKKyAgICAgICAgImQ6cHJvdGVjdGVkUmFuZ2VzL2Q6cHJvdGVjdGVkUmFuZ2VbQG5hbWU9JyIKKyAgICAgICAgICAgICsgaXRlbS5OYW1lCisgICAgICAgICAgICArICInIGFuZCBAc3FyZWY9JyIKKyAgICAgICAgICAgICsgaXRlbS5BZGRyZXNzLkFkZHJlc3MKKyAgICAgICAgICAgICsgIiddIik7CisgICAgaWYgKF9iYXNlTGlzdC5Db3VudCA9PSAwKSB7CisgICAgICBEZWxldGVOb2RlKCJkOnByb3RlY3RlZFJhbmdlcyIpOworICAgIH0KKyAgICByZXR1cm4gX2Jhc2VMaXN0LlJlbW92ZShpdGVtKTsKKyAgfQorCisgIHB1YmxpYyBpbnQgSW5kZXhPZihFeGNlbFByb3RlY3RlZFJhbmdlIGl0ZW0pIHsKKyAgICByZXR1cm4gX2Jhc2VMaXN0LkluZGV4T2YoaXRlbSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBSZW1vdmVBdChpbnQgaW5kZXgpIHsKKyAgICBfYmFzZUxpc3QuUmVtb3ZlQXQoaW5kZXgpOworICB9CisKKyAgcHVibGljIEV4Y2VsUHJvdGVjdGVkUmFuZ2UgdGhpc1tpbnQgaW5kZXhdIHsKKyAgICBnZXQgeyByZXR1cm4gX2Jhc2VMaXN0W2luZGV4XTsgfQorICB9CisKKyAgSUVudW1lcmF0b3I8RXhjZWxQcm90ZWN0ZWRSYW5nZT4gSUVudW1lcmFibGU8RXhjZWxQcm90ZWN0ZWRSYW5nZT4uR2V0RW51bWVyYXRvcigpIHsKKyAgICByZXR1cm4gX2Jhc2VMaXN0LkdldEVudW1lcmF0b3IoKTsKKyAgfQorCisgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKSB7CisgICAgcmV0dXJuIF9iYXNlTGlzdC5HZXRFbnVtZXJhdG9yKCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFByb3RlY3Rpb24uY3MgYi9FUFBsdXMvRXhjZWxQcm90ZWN0aW9uLmNzCmluZGV4IDZlMzA3YTMuLmJmMTA2MTIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9FeGNlbFByb3RlY3Rpb24uY3MKKysrIGIvRVBQbHVzL0V4Y2VsUHJvdGVjdGlvbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsODIgKzEzLDY1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJICAgIEFkZGVkCQkxMC1BVUctMjAxMAogICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW0uWG1sOwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFNldHMgcHJvdGVjdGlvbiBvbiB0aGUgd29ya2Jvb2sgbGV2ZWwKLSAgICAvLy88c2VlYWxzbyBjcmVmPSJFeGNlbEVuY3J5cHRpb24iLz4gCi0gICAgLy8vPHNlZWFsc28gY3JlZj0iRXhjZWxTaGVldFByb3RlY3Rpb24iLz4gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxQcm90ZWN0aW9uIDogWG1sSGVscGVyCi0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbFByb3RlY3Rpb24oWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFdvcmtib29rIHdiKSA6Ci0gICAgICAgICAgICBiYXNlKG5zLCB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSB3Yi5TY2hlbWFOb2RlT3JkZXI7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIGxvY2tTdHJ1Y3R1cmVQYXRoID0gImQ6d29ya2Jvb2tQcm90ZWN0aW9uL0Bsb2NrU3RydWN0dXJlIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTG9ja3MgdGhlIHN0cnVjdHVyZSx3aGljaCBwcmV2ZW50cyB1c2VycyBmcm9tIGFkZGluZyBvciBkZWxldGluZyB3b3Jrc2hlZXRzIG9yIGZyb20gZGlzcGxheWluZyBoaWRkZW4gd29ya3NoZWV0cy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgTG9ja1N0cnVjdHVyZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2wobG9ja1N0cnVjdHVyZVBhdGgsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKGxvY2tTdHJ1Y3R1cmVQYXRoLCB2YWx1ZSwgIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgbG9ja1dpbmRvd3NQYXRoID0gImQ6d29ya2Jvb2tQcm90ZWN0aW9uL0Bsb2NrV2luZG93cyI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIExvY2tzIHRoZSBwb3NpdGlvbiBvZiB0aGUgd29ya2Jvb2sgd2luZG93LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBMb2NrV2luZG93cwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2wobG9ja1dpbmRvd3NQYXRoLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChsb2NrV2luZG93c1BhdGgsIHZhbHVlLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIGxvY2tSZXZpc2lvblBhdGggPSAiZDp3b3JrYm9va1Byb3RlY3Rpb24vQGxvY2tSZXZpc2lvbiI7CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTG9jayB0aGUgd29ya2Jvb2sgZm9yIHJldmlzaW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIExvY2tSZXZpc2lvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2wobG9ja1JldmlzaW9uUGF0aCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2wobG9ja1JldmlzaW9uUGF0aCwgdmFsdWUsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KK3VzaW5nIFN5c3RlbS5YbWw7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOworCisvLy8gPHN1bW1hcnk+CisvLy8gU2V0cyBwcm90ZWN0aW9uIG9uIHRoZSB3b3JrYm9vayBsZXZlbAorLy8vPHNlZWFsc28gY3JlZj0iRXhjZWxFbmNyeXB0aW9uIi8+CisvLy88c2VlYWxzbyBjcmVmPSJFeGNlbFNoZWV0UHJvdGVjdGlvbiIvPgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbFByb3RlY3Rpb24gOiBYbWxIZWxwZXIgeworICBpbnRlcm5hbCBFeGNlbFByb3RlY3Rpb24oWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFdvcmtib29rIHdiKQorICAgICAgOiBiYXNlKG5zLCB0b3BOb2RlKSB7CisgICAgU2NoZW1hTm9kZU9yZGVyID0gd2IuU2NoZW1hTm9kZU9yZGVyOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2xvY2tTdHJ1Y3R1cmVQYXRoID0gImQ6d29ya2Jvb2tQcm90ZWN0aW9uL0Bsb2NrU3RydWN0dXJlIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMb2NrcyB0aGUgc3RydWN0dXJlLHdoaWNoIHByZXZlbnRzIHVzZXJzIGZyb20gYWRkaW5nIG9yIGRlbGV0aW5nIHdvcmtzaGVldHMgb3IgZnJvbSBkaXNwbGF5aW5nIGhpZGRlbiB3b3Jrc2hlZXRzLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBMb2NrU3RydWN0dXJlIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2woX2xvY2tTdHJ1Y3R1cmVQYXRoLCBmYWxzZSk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKF9sb2NrU3RydWN0dXJlUGF0aCwgdmFsdWUsIGZhbHNlKTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9sb2NrV2luZG93c1BhdGggPSAiZDp3b3JrYm9va1Byb3RlY3Rpb24vQGxvY2tXaW5kb3dzIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMb2NrcyB0aGUgcG9zaXRpb24gb2YgdGhlIHdvcmtib29rIHdpbmRvdy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgTG9ja1dpbmRvd3MgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbChfbG9ja1dpbmRvd3NQYXRoLCBmYWxzZSk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKF9sb2NrV2luZG93c1BhdGgsIHZhbHVlLCBmYWxzZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfbG9ja1JldmlzaW9uUGF0aCA9ICJkOndvcmtib29rUHJvdGVjdGlvbi9AbG9ja1JldmlzaW9uIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMb2NrIHRoZSB3b3JrYm9vayBmb3IgcmV2aXNpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgTG9ja1JldmlzaW9uIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2woX2xvY2tSZXZpc2lvblBhdGgsIGZhbHNlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX2xvY2tSZXZpc2lvblBhdGgsIHZhbHVlLCBmYWxzZSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFJhbmdlLmNzIGIvRVBQbHVzL0V4Y2VsUmFuZ2UuY3MKaW5kZXggODM5NmM5ZC4uOTIzNTJmYyAxMDA2NDQKLS0tIGEvRVBQbHVzL0V4Y2VsUmFuZ2UuY3MKKysrIGIvRVBQbHVzL0V4Y2VsUmFuZ2UuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDE1NSArMTMsMTExIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCiAgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Ci11c2luZyBTeXN0ZW0uRGF0YTsKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIHJhbmdlIG9mIGNlbGxzLiAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFJhbmdlIDogRXhjZWxSYW5nZUJhc2UKLSAgICB7Ci0gICAgICAgICNyZWdpb24gIkNvbnN0cnVjdG9ycyIKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxSYW5nZShFeGNlbFdvcmtzaGVldCBzaGVldCkgOiAKLSAgICAgICAgICAgIGJhc2Uoc2hlZXQpCi0gICAgICAgIHsKIAotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsUmFuZ2UoRXhjZWxXb3Jrc2hlZXQgc2hlZXQsIHN0cmluZyBhZGRyZXNzKQotICAgICAgICAgICAgOiBiYXNlKHNoZWV0LCBhZGRyZXNzKQotICAgICAgICB7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbDsKIAotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsUmFuZ2UoRXhjZWxXb3Jrc2hlZXQgc2hlZXQsIGludCBmcm9tUm93LCBpbnQgZnJvbUNvbCwgaW50IHRvUm93LCBpbnQgdG9Db2wpCi0gICAgICAgICAgICA6IGJhc2Uoc2hlZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9mcm9tUm93ID0gZnJvbVJvdzsKLSAgICAgICAgICAgIF9mcm9tQ29sID0gZnJvbUNvbDsKLSAgICAgICAgICAgIF90b1JvdyA9IHRvUm93OwotICAgICAgICAgICAgX3RvQ29sID0gdG9Db2w7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAjcmVnaW9uICJJbmRleGVycyIKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWNjZXNzIHRoZSByYW5nZSB1c2luZyBhbiBhZGRyZXNzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQWRkcmVzcyI+VGhlIGFkZHJlc3M8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+QSByYW5nZSBvYmplY3Q8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFJhbmdlIHRoaXNbc3RyaW5nIEFkZHJlc3NdCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfd29ya3NoZWV0Lk5hbWVzLkNvbnRhaW5zS2V5KEFkZHJlc3MpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXQuTmFtZXNbQWRkcmVzc10uSXNOYW1lKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UuQWRkcmVzcyA9IF93b3Jrc2hlZXQuTmFtZXNbQWRkcmVzc10uQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiYXNlLkFkZHJlc3MgPSBBZGRyZXNzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIEEgcmFuZ2Ugb2YgY2VsbHMuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsUmFuZ2UgOiBFeGNlbFJhbmdlQmFzZSB7CisgIGludGVybmFsIEV4Y2VsUmFuZ2UoRXhjZWxXb3Jrc2hlZXQgc2hlZXQpCisgICAgICA6IGJhc2Uoc2hlZXQpIHt9CiAKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFJhbmdlIEdldFRhYmxlQWRkZXNzKEV4Y2VsV29ya3NoZWV0IF93b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaXhTdGFydCA9IGFkZHJlc3MuSW5kZXhPZignWycpOwotICAgICAgICAgICAgaWYgKGl4U3RhcnQgPT0gMCkgLy9FeHRlcm5hbCBBZGRyZXNzCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGl4RW5kID0gYWRkcmVzcy5JbmRleE9mKCddJyxpeFN0YXJ0KzEpOwotICAgICAgICAgICAgICAgIGlmIChpeFN0YXJ0ID49IDAgJiBpeEVuZCA+PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGV4dGVybmFsID0gYWRkcmVzcy5TdWJzdHJpbmcoaXhTdGFydCArIDEsIGl4RW5kIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vaWYgKFdvcmtzaGVldC5Xb3JrYm9vay5fZXh0ZXJuYWxSZWZlcmVuY2VzLkNvdW50IDwgZXh0ZXJuYWwpCi0gICAgICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgICAgICAvL2ZvcmVhY2godmFyIAotICAgICAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBY2Nlc3MgYSBzaW5nbGUgY2VsbAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJvdyI+VGhlIHJvdzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQ29sIj5UaGUgY29sdW1uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgcmFuZ2Ugb2JqZWN0PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgRXhjZWxSYW5nZSB0aGlzW2ludCBSb3csIGludCBDb2xdCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbGlkYXRlUm93Q29sKFJvdywgQ29sKTsKKyAgaW50ZXJuYWwgRXhjZWxSYW5nZShFeGNlbFdvcmtzaGVldCBzaGVldCwgc3RyaW5nIGFkZHJlc3MpCisgICAgICA6IGJhc2Uoc2hlZXQsIGFkZHJlc3MpIHt9CiAKLSAgICAgICAgICAgICAgICBfZnJvbUNvbCA9IENvbDsKLSAgICAgICAgICAgICAgICBfZnJvbVJvdyA9IFJvdzsKLSAgICAgICAgICAgICAgICBfdG9Db2wgPSBDb2w7Ci0gICAgICAgICAgICAgICAgX3RvUm93ID0gUm93OwotICAgICAgICAgICAgICAgIGJhc2UuQWRkcmVzcyA9IEdldEFkZHJlc3MoX2Zyb21Sb3csIF9mcm9tQ29sKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBY2Nlc3MgYSByYW5nZSBvZiBjZWxscwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkZyb21Sb3ciPlN0YXJ0IHJvdzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRnJvbUNvbCI+U3RhcnQgY29sdW1uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJUb1JvdyI+RW5kIFJvdzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iVG9Db2wiPkVuZCBDb2x1bW48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgRXhjZWxSYW5nZSB0aGlzW2ludCBGcm9tUm93LCBpbnQgRnJvbUNvbCwgaW50IFRvUm93LCBpbnQgVG9Db2xdCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbGlkYXRlUm93Q29sKEZyb21Sb3csIEZyb21Db2wpOwotICAgICAgICAgICAgICAgIFZhbGlkYXRlUm93Q29sKFRvUm93LCBUb0NvbCk7CisgIGludGVybmFsIEV4Y2VsUmFuZ2UoRXhjZWxXb3Jrc2hlZXQgc2hlZXQsIGludCBmcm9tUm93LCBpbnQgZnJvbUNvbCwgaW50IHRvUm93LCBpbnQgdG9Db2wpCisgICAgICA6IGJhc2Uoc2hlZXQpIHsKKyAgICBfZnJvbVJvdyA9IGZyb21Sb3c7CisgICAgX2Zyb21Db2wgPSBmcm9tQ29sOworICAgIF90b1JvdyA9IHRvUm93OworICAgIF90b0NvbCA9IHRvQ29sOworICB9CiAKLSAgICAgICAgICAgICAgICBfZnJvbUNvbCA9IEZyb21Db2w7Ci0gICAgICAgICAgICAgICAgX2Zyb21Sb3cgPSBGcm9tUm93OwotICAgICAgICAgICAgICAgIF90b0NvbCA9IFRvQ29sOwotICAgICAgICAgICAgICAgIF90b1JvdyA9IFRvUm93OwotICAgICAgICAgICAgICAgIGJhc2UuQWRkcmVzcyA9IEdldEFkZHJlc3MoX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFjY2VzcyB0aGUgcmFuZ2UgdXNpbmcgYW4gYWRkcmVzcworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBhZGRyZXNzPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPkEgcmFuZ2Ugb2JqZWN0PC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxSYW5nZSB0aGlzW3N0cmluZyBhZGRyZXNzXSB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfd29ya3NoZWV0Lk5hbWVzLkNvbnRhaW5zS2V5KGFkZHJlc3MpKSB7CisgICAgICAgIGlmIChfd29ya3NoZWV0Lk5hbWVzW2FkZHJlc3NdLklzTmFtZSkgeworICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBWYWxpZGF0ZVJvd0NvbChpbnQgUm93LCBpbnQgQ29sKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUm93IDwgMSB8fCBSb3cgPiBFeGNlbFBhY2thZ2UuTWF4Um93cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJSb3cgb3V0IG9mIHJhbmdlIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKENvbCA8IDEgfHwgQ29sID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ29sdW1uIG91dCBvZiByYW5nZSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCisgICAgICAgIEFkZHJlc3MgPSBfd29ya3NoZWV0Lk5hbWVzW2FkZHJlc3NdLkFkZHJlc3M7CisgICAgICB9IGVsc2UgeworICAgICAgICBBZGRyZXNzID0gYWRkcmVzczsKKyAgICAgIH0KKyAgICAgIHJldHVybiB0aGlzOwogICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFjY2VzcyBhIHNpbmdsZSBjZWxsCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij5UaGUgcm93PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2wiPlRoZSBjb2x1bW48L3BhcmFtPgorICAvLy8gPHJldHVybnM+QSByYW5nZSBvYmplY3Q8L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFJhbmdlIHRoaXNbaW50IHJvdywgaW50IGNvbF0geworICAgIGdldCB7CisgICAgICBWYWxpZGF0ZVJvd0NvbChyb3csIGNvbCk7CisKKyAgICAgIF9mcm9tQ29sID0gY29sOworICAgICAgX2Zyb21Sb3cgPSByb3c7CisgICAgICBfdG9Db2wgPSBjb2w7CisgICAgICBfdG9Sb3cgPSByb3c7CisgICAgICBBZGRyZXNzID0gR2V0QWRkcmVzcyhfZnJvbVJvdywgX2Zyb21Db2wpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWNjZXNzIGEgcmFuZ2Ugb2YgY2VsbHMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmcm9tUm93Ij5TdGFydCByb3c8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImZyb21Db2wiPlN0YXJ0IGNvbHVtbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idG9Sb3ciPkVuZCBSb3c8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InRvQ29sIj5FbmQgQ29sdW1uPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIEV4Y2VsUmFuZ2UgdGhpc1tpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCB0b1JvdywgaW50IHRvQ29sXSB7CisgICAgZ2V0IHsKKyAgICAgIFZhbGlkYXRlUm93Q29sKGZyb21Sb3csIGZyb21Db2wpOworICAgICAgVmFsaWRhdGVSb3dDb2wodG9Sb3csIHRvQ29sKTsKKworICAgICAgX2Zyb21Db2wgPSBmcm9tQ29sOworICAgICAgX2Zyb21Sb3cgPSBmcm9tUm93OworICAgICAgX3RvQ29sID0gdG9Db2w7CisgICAgICBfdG9Sb3cgPSB0b1JvdzsKKyAgICAgIEFkZHJlc3MgPSBHZXRBZGRyZXNzKF9mcm9tUm93LCBfZnJvbUNvbCwgX3RvUm93LCBfdG9Db2wpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBWYWxpZGF0ZVJvd0NvbChpbnQgcm93LCBpbnQgY29sKSB7CisgICAgaWYgKHJvdyA8IDEgfHwgcm93ID4gRXhjZWxQYWNrYWdlLk1heFJvd3MpIHsKKyAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIlJvdyBvdXQgb2YgcmFuZ2UiKSk7CisgICAgfQorICAgIGlmIChjb2wgPCAxIHx8IGNvbCA+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSB7CisgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJDb2x1bW4gb3V0IG9mIHJhbmdlIikpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsUmFuZ2VCYXNlLmNzIGIvRVBQbHVzL0V4Y2VsUmFuZ2VCYXNlLmNzCmluZGV4IGE0Y2YxOTguLmZkNzUzZDYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9FeGNlbFJhbmdlQmFzZS5jcworKysgYi9FUFBsdXMvRXhjZWxSYW5nZUJhc2UuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDI3NTAgKzEzLDI0MDkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMTAtMDEtMjgKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKiBFeWFsIFNlYWd1bGwJCSAgICBDb25kaXRpb25hbCBGb3JtYXR0aW5nICAgICAgMjAxMi0wNC0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkNvbXBvbmVudE1vZGVsOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uRGF0YTsKLXVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBTeXN0ZW0uRHJhd2luZzsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZTsKLXVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKIHVzaW5nIFN5c3RlbS5JTzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb24uQ29udHJhY3RzOwogdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKIHVzaW5nIFN5c3RlbS5TZWN1cml0eTsKK3VzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwordXNpbmcgU3lzdGVtLlRocmVhZGluZzsKK3VzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkNvbmRpdGlvbmFsRm9ybWF0dGluZzsKLXVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nLkNvbnRyYWN0czsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRGF0YVZhbGlkYXRpb247CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCi17CQotICAgIC8vLyA8c3VtbWFyeT4KLQkvLy8gQSByYW5nZSBvZiBjZWxscyAKLQkvLy8gPC9zdW1tYXJ5PgotCXB1YmxpYyBjbGFzcyBFeGNlbFJhbmdlQmFzZSA6IEV4Y2VsQWRkcmVzcywgSUV4Y2VsQ2VsbCwgSURpc3Bvc2FibGUsIElFbnVtZXJhYmxlPEV4Y2VsUmFuZ2VCYXNlPiwgSUVudW1lcmF0b3I8RXhjZWxSYW5nZUJhc2U+Ci0JewotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBSZWZlcmVuY2UgdG8gdGhlIHdvcmtzaGVldAotCQkvLy8gPC9zdW1tYXJ5PgotCQlwcm90ZWN0ZWQgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKLQkJaW50ZXJuYWwgRXhjZWxXb3JrYm9vayBfd29ya2Jvb2sgPSBudWxsOwotCQlwcml2YXRlIGRlbGVnYXRlIHZvaWQgX2NoYW5nZVByb3AoX3NldFZhbHVlIG1ldGhvZCwgb2JqZWN0IHZhbHVlKTsKLQkJcHJpdmF0ZSBkZWxlZ2F0ZSB2b2lkIF9zZXRWYWx1ZShvYmplY3QgdmFsdWUsIGludCByb3csIGludCBjb2wpOwotCQlwcml2YXRlIF9jaGFuZ2VQcm9wIF9jaGFuZ2VQcm9wTWV0aG9kOwotCQlwcml2YXRlIGludCBfc3R5bGVJRDsKLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBDb3BpZWRDZWxsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludGVybmFsIGludCBSb3cgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgaW50ZXJuYWwgaW50IENvbHVtbiB7IGdldDsgc2V0OyB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBvYmplY3QgVmFsdWUgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFR5cGUgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgaW50ZXJuYWwgb2JqZWN0IEZvcm11bGEgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgaW50ZXJuYWwgaW50PyBTdHlsZUlEIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgICAgIGludGVybmFsIFVyaSBIeXBlckxpbmsgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgaW50ZXJuYWwgRXhjZWxDb21tZW50IENvbW1lbnQgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgaW50ZXJuYWwgQnl0ZSBGbGFnIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgfQotICAgICAgICAvL3ByaXZhdGUgY2xhc3MgQ29waWVkRmxhZwotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgaW50ZXJuYWwgaW50IFJvdyB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vICAgIGludGVybmFsIGludCBDb2x1bW4geyBnZXQ7IHNldDsgfQotICAgICAgICAvLyAgICBpbnRlcm5hbCBCeXRlIEZsYWcgeyBnZXQ7IHNldDsgfQotICAgICAgICAvL30KLSAgICAgICAgI3JlZ2lvbiBDb25zdHJ1Y3RvcnMKLQkJaW50ZXJuYWwgRXhjZWxSYW5nZUJhc2UoRXhjZWxXb3Jrc2hlZXQgeGxXb3Jrc2hlZXQpCi0JCXsKLQkJCV93b3Jrc2hlZXQgPSB4bFdvcmtzaGVldDsKLQkJCV93cyA9IF93b3Jrc2hlZXQuTmFtZTsKLSAgICAgICAgICAgIF93b3JrYm9vayA9IF93b3Jrc2hlZXQuV29ya2Jvb2s7Ci0gICAgICAgICAgICB0aGlzLkFkZHJlc3NDaGFuZ2UgKz0gbmV3IEV2ZW50SGFuZGxlcihFeGNlbFJhbmdlQmFzZV9BZGRyZXNzQ2hhbmdlKTsKLQkJCVNldERlbGVnYXRlKCk7Ci0JCX0KK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVGFibGU7CiAKLSAgICAgICAgdm9pZCBFeGNlbFJhbmdlQmFzZV9BZGRyZXNzQ2hhbmdlKG9iamVjdCBzZW5kZXIsIEV2ZW50QXJncyBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoVGFibGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRSQ0Zyb21UYWJsZShfd29ya2Jvb2suX3BhY2thZ2UsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2V0RGVsZWdhdGUoKTsKLSAgICAgICAgfQotCQlpbnRlcm5hbCBFeGNlbFJhbmdlQmFzZShFeGNlbFdvcmtzaGVldCB4bFdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MpIDoKLQkJCWJhc2UoeGxXb3Jrc2hlZXQgPT0gbnVsbCA/ICIiIDogeGxXb3Jrc2hlZXQuTmFtZSwgYWRkcmVzcykKLQkJewotCQkJX3dvcmtzaGVldCA9IHhsV29ya3NoZWV0OwotICAgICAgICAgICAgX3dvcmtib29rID0gX3dvcmtzaGVldC5Xb3JrYm9vazsKLSAgICAgICAgICAgIGJhc2UuU2V0UkNGcm9tVGFibGUoX3dvcmtzaGVldC5fcGFja2FnZSwgbnVsbCk7Ci0JCQlpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoX3dzKSkgX3dzID0gX3dvcmtzaGVldCA9PSBudWxsID8gIiIgOiBfd29ya3NoZWV0Lk5hbWU7Ci0gICAgICAgICAgICB0aGlzLkFkZHJlc3NDaGFuZ2UgKz0gbmV3IEV2ZW50SGFuZGxlcihFeGNlbFJhbmdlQmFzZV9BZGRyZXNzQ2hhbmdlKTsKLSAgICAgICAgICAgIFNldERlbGVnYXRlKCk7Ci0JCX0KLQkJaW50ZXJuYWwgRXhjZWxSYW5nZUJhc2UoRXhjZWxXb3JrYm9vayB3YiwgRXhjZWxXb3Jrc2hlZXQgeGxXb3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzLCBib29sIGlzTmFtZSkgOgotCQkJYmFzZSh4bFdvcmtzaGVldCA9PSBudWxsID8gIiIgOiB4bFdvcmtzaGVldC5OYW1lLCBhZGRyZXNzLCBpc05hbWUpCi0JCXsKLSAgICAgICAgICAgIFNldFJDRnJvbVRhYmxlKHdiLl9wYWNrYWdlLCBudWxsKTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQgPSB4bFdvcmtzaGVldDsKLQkJCV93b3JrYm9vayA9IHdiOwotCQkJaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KF93cykpIF93cyA9ICh4bFdvcmtzaGVldCA9PSBudWxsID8gbnVsbCA6IHhsV29ya3NoZWV0Lk5hbWUpOwotICAgICAgICAgICAgdGhpcy5BZGRyZXNzQ2hhbmdlICs9IG5ldyBFdmVudEhhbmRsZXIoRXhjZWxSYW5nZUJhc2VfQWRkcmVzc0NoYW5nZSk7Ci0gICAgICAgICAgICBTZXREZWxlZ2F0ZSgpOwotCQl9Ci0gICAgICAgIH5FeGNlbFJhbmdlQmFzZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vdGhpcy5BZGRyZXNzQ2hhbmdlIC09IG5ldyBFdmVudEhhbmRsZXIoRXhjZWxSYW5nZUJhc2VfQWRkcmVzc0NoYW5nZSk7Ci0gICAgICAgIH0KLQkJI2VuZHJlZ2lvbgotCQkjcmVnaW9uIFNldCBWYWx1ZSBEZWxlZ2F0ZXMKLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldERlbGVnYXRlKCkKLQkJewotCQkJaWYgKF9mcm9tUm93ID09IC0xKQotCQkJewotCQkJCV9jaGFuZ2VQcm9wTWV0aG9kID0gU2V0VW5rbm93bjsKLQkJCX0KLQkJCS8vU2luZ2xlIGNlbGwKLQkJCWVsc2UgaWYgKF9mcm9tUm93ID09IF90b1JvdyAmJiBfZnJvbUNvbCA9PSBfdG9Db2wgJiYgQWRkcmVzc2VzID09IG51bGwpCi0JCQl7Ci0JCQkJX2NoYW5nZVByb3BNZXRob2QgPSBTZXRTaW5nbGU7Ci0JCQl9Ci0JCQkvL1JhbmdlIChleCBBMTpBMikKLQkJCWVsc2UgaWYgKEFkZHJlc3NlcyA9PSBudWxsKQotCQkJewotCQkJCV9jaGFuZ2VQcm9wTWV0aG9kID0gU2V0UmFuZ2U7Ci0JCQl9Ci0JCQkvL011bHRpIFJhbmdlIChleCBBMTpBMixDMTpDMikKLQkJCWVsc2UKLQkJCXsKLQkJCQlfY2hhbmdlUHJvcE1ldGhvZCA9IFNldE11bHRpUmFuZ2U7Ci0JCQl9Ci0JCX0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotCQkvLy8gV2UgZG9udCBrbm93IHRoZSBhZGRyZXNzIHlldC4gU2V0IHRoZSBkZWxlZ2F0ZSBmaXJzdCB0aW1lIGEgcHJvcGVydHkgaXMgc2V0LgotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InZhbHVlTWV0aG9kIj48L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgotCQlwcml2YXRlIHZvaWQgU2V0VW5rbm93bihfc2V0VmFsdWUgdmFsdWVNZXRob2QsIG9iamVjdCB2YWx1ZSkKLQkJewotCQkJLy9BZGRyZXNzIGlzIG5vdCBzZXQgdXNlLCBzZWxlY3RlZCByYW5nZQotCQkJaWYgKF9mcm9tUm93ID09IC0xKQotCQkJewotCQkJCVNldFRvU2VsZWN0ZWRSYW5nZSgpOwotCQkJfQotCQkJU2V0RGVsZWdhdGUoKTsKLQkJCV9jaGFuZ2VQcm9wTWV0aG9kKHZhbHVlTWV0aG9kLCB2YWx1ZSk7Ci0JCX0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gU2V0IGEgc2luZ2xlIGNlbGwKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZU1ldGhvZCI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KLQkJcHJpdmF0ZSB2b2lkIFNldFNpbmdsZShfc2V0VmFsdWUgdmFsdWVNZXRob2QsIG9iamVjdCB2YWx1ZSkKLQkJewotCQkJdmFsdWVNZXRob2QodmFsdWUsIF9mcm9tUm93LCBfZnJvbUNvbCk7Ci0JCX0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gU2V0IGEgcmFuZ2UKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZU1ldGhvZCI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KLQkJcHJpdmF0ZSB2b2lkIFNldFJhbmdlKF9zZXRWYWx1ZSB2YWx1ZU1ldGhvZCwgb2JqZWN0IHZhbHVlKQotCQl7Ci0JCQlTZXRWYWx1ZUFkZHJlc3ModGhpcywgdmFsdWVNZXRob2QsIHZhbHVlKTsKLQkJfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBTZXQgYSBtdWx0aXJhbmdlIChBMTpBMixDMTpDMikKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZU1ldGhvZCI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KLQkJcHJpdmF0ZSB2b2lkIFNldE11bHRpUmFuZ2UoX3NldFZhbHVlIHZhbHVlTWV0aG9kLCBvYmplY3QgdmFsdWUpCi0JCXsKLQkJCVNldFZhbHVlQWRkcmVzcyh0aGlzLCB2YWx1ZU1ldGhvZCwgdmFsdWUpOwotCQkJZm9yZWFjaCAodmFyIGFkZHJlc3MgaW4gQWRkcmVzc2VzKQotCQkJewotCQkJCVNldFZhbHVlQWRkcmVzcyhhZGRyZXNzLCB2YWx1ZU1ldGhvZCwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFNldCB0aGUgcHJvcGVydHkgZm9yIGFuIGFkZHJlc3MKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9InZhbHVlTWV0aG9kIj48L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgotCQlwcml2YXRlIHZvaWQgU2V0VmFsdWVBZGRyZXNzKEV4Y2VsQWRkcmVzcyBhZGRyZXNzLCBfc2V0VmFsdWUgdmFsdWVNZXRob2QsIG9iamVjdCB2YWx1ZSkKLQkJewotCQkJSXNSYW5nZVZhbGlkKCIiKTsKLQkJCWlmIChfZnJvbVJvdyA9PSAxICYmIF9mcm9tQ29sID09IDEgJiYgX3RvUm93ID09IEV4Y2VsUGFja2FnZS5NYXhSb3dzICYmIF90b0NvbCA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgIC8vRnVsbCBzaGVldCAoZXggd3MuQ2VsbHMuVmFsdWU9MCkuIFNldCB2YWx1ZSBmb3IgQTEgb25seSB0byBhdm9pZCBoYW5naW5nIAotCQkJewotCQkJCXRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IHJlZmVyZW5jZSBhbGwgY2VsbHMuIFBsZWFzZSB1c2UgdGhlIGluZGV4ZXIgdG8gc2V0IHRoZSByYW5nZSIpKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlmb3IgKGludCBjb2wgPSBhZGRyZXNzLlN0YXJ0LkNvbHVtbjsgY29sIDw9IGFkZHJlc3MuRW5kLkNvbHVtbjsgY29sKyspCi0JCQkJewotCQkJCQlmb3IgKGludCByb3cgPSBhZGRyZXNzLlN0YXJ0LlJvdzsgcm93IDw9IGFkZHJlc3MuRW5kLlJvdzsgcm93KyspCi0JCQkJCXsKLQkJCQkJCXZhbHVlTWV0aG9kKHZhbHVlLCByb3csIGNvbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJI2VuZHJlZ2lvbgotCQkjcmVnaW9uIFNldCBwcm9wZXJ0eSBtZXRob2RzCi0JCXByaXZhdGUgdm9pZCBTZXRfU3R5bGVJRChvYmplY3QgdmFsdWUsIGludCByb3csIGludCBjb2wpCi0JCXsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuX3N0eWxlcy5TZXRWYWx1ZShyb3csIGNvbCwgKGludCl2YWx1ZSk7Ci0JCX0KLQkJcHJpdmF0ZSB2b2lkIFNldF9TdHlsZU5hbWUob2JqZWN0IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKQotCQl7Ci0JCQkvL193b3Jrc2hlZXQuQ2VsbChyb3csIGNvbCkuU2V0TmV3U3R5bGVOYW1lKHZhbHVlLlRvU3RyaW5nKCksIF9zdHlsZUlEKTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuX3N0eWxlcy5TZXRWYWx1ZShyb3csIGNvbCwgX3N0eWxlSUQpOwotCQl9Ci0JCXByaXZhdGUgdm9pZCBTZXRfVmFsdWUob2JqZWN0IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKQotCQl7Ci0JCQkvL0V4Y2VsQ2VsbCBjID0gX3dvcmtzaGVldC5DZWxsKHJvdywgY29sKTsKLSAgICAgICAgICAgIHZhciBzZmkgPSBfd29ya3NoZWV0Ll9mb3JtdWxhcy5HZXRWYWx1ZShyb3csIGNvbCk7Ci0gICAgICAgICAgICBpZiAoc2ZpIGlzIGludCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTcGxpdEZvcm11bGFzKF93b3Jrc2hlZXQuQ2VsbHNbcm93LCBjb2xdKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2ZpICE9IG51bGwpIF93b3Jrc2hlZXQuX2Zvcm11bGFzLlNldFZhbHVlKHJvdywgY29sLCBzdHJpbmcuRW1wdHkpOwotCQkJX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCB2YWx1ZSk7Ci0JCX0KLQkJcHJpdmF0ZSB2b2lkIFNldF9Gb3JtdWxhKG9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkKLQkJewotCQkJLy9FeGNlbENlbGwgYyA9IF93b3Jrc2hlZXQuQ2VsbChyb3csIGNvbCk7Ci0gICAgICAgICAgICB2YXIgZiA9IF93b3Jrc2hlZXQuX2Zvcm11bGFzLkdldFZhbHVlKHJvdywgY29sKTsKLSAgICAgICAgICAgIGlmIChmIGlzIGludCAmJiAoaW50KWYgPj0gMCkgU3BsaXRGb3JtdWxhcyhfd29ya3NoZWV0LkNlbGxzW3JvdywgY29sXSk7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbDsKIAotCQkJc3RyaW5nIGZvcm11bGEgPSAodmFsdWUgPT0gbnVsbCA/IHN0cmluZy5FbXB0eSA6IHZhbHVlLlRvU3RyaW5nKCkpOwotCQkJaWYgKGZvcm11bGEgPT0gc3RyaW5nLkVtcHR5KQotCQkJewotICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX2Zvcm11bGFzLlNldFZhbHVlKHJvdywgY29sLCBzdHJpbmcuRW1wdHkpOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChmb3JtdWxhWzBdID09ICc9JykgdmFsdWUgPSBmb3JtdWxhLlN1YnN0cmluZygxLCBmb3JtdWxhLkxlbmd0aCAtIDEpOyAvLyByZW1vdmUgYW55IHN0YXJ0aW5nIGVxdWFsc2lnbi4KLSAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll9mb3JtdWxhcy5TZXRWYWx1ZShyb3csIGNvbCwgZm9ybXVsYSk7Ci0gICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCBudWxsKTsKLSAgICAgICAgICAgIH0KLQkJfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBIYW5kbGVzIHNoYXJlZCBmb3JtdWxhcwotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgIGZvcm11bGE8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBhZGRyZXNzIG9mIHRoZSBmb3JtdWxhPC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJJc0FycmF5Ij5JZiB0aGUgZm9ydW1sYSBpcyBhbiBhcnJheSBmb3JtdWxhLjwvcGFyYW0+Ci0JCXByaXZhdGUgdm9pZCBTZXRfU2hhcmVkRm9ybXVsYShzdHJpbmcgdmFsdWUsIEV4Y2VsQWRkcmVzcyBhZGRyZXNzLCBib29sIElzQXJyYXkpCi0JCXsKLQkJCWlmIChfZnJvbVJvdyA9PSAxICYmIF9mcm9tQ29sID09IDEgJiYgX3RvUm93ID09IEV4Y2VsUGFja2FnZS5NYXhSb3dzICYmIF90b0NvbCA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgIC8vRnVsbCBzaGVldCAoZXggd3MuQ2VsbHMuVmFsdWU9MCkuIFNldCB2YWx1ZSBmb3IgQTEgb25seSB0byBhdm9pZCBoYW5naW5nIAotCQkJewotCQkJCXRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IGEgZm9ybXVsYSBmb3IgdGhlIGVudGlyZSB3b3Jrc2hlZXQiKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhZGRyZXNzLlN0YXJ0LlJvdyA9PSBhZGRyZXNzLkVuZC5Sb3cgJiYgYWRkcmVzcy5TdGFydC5Db2x1bW4gPT0gYWRkcmVzcy5FbmQuQ29sdW1uICYmICFJc0FycmF5KSAgICAgICAgICAgICAvL2lzIGl0IHJlYWxseSBhIHNoYXJlZCBmb3JtdWxhPyBBcnJheWZvcm11bGFzIGNhbiBiZSBvbmUgY2VsbCBvbmx5Ci0JCQl7Ci0JCQkJLy9Ob3BlLCBzaW5nbGUgY2VsbC4gU2V0IHRoZSBmb3JtdWxhCi0JCQkJU2V0X0Zvcm11bGEodmFsdWUsIGFkZHJlc3MuU3RhcnQuUm93LCBhZGRyZXNzLlN0YXJ0LkNvbHVtbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy9SZW1vdmVGb3JtdWxzKGFkZHJlc3MpOwotCQkJQ2hlY2tBbmRTcGxpdFNoYXJlZEZvcm11bGEoYWRkcmVzcyk7Ci0JCQlFeGNlbFdvcmtzaGVldC5Gb3JtdWxhcyBmID0gbmV3IEV4Y2VsV29ya3NoZWV0LkZvcm11bGFzKFNvdXJjZUNvZGVUb2tlbml6ZXIuRGVmYXVsdCk7Ci0JCQlmLkZvcm11bGEgPSB2YWx1ZTsKLQkJCWYuSW5kZXggPSBfd29ya3NoZWV0LkdldE1heFNoYXJlRnVuY3Rpb25JbmRleChJc0FycmF5KTsKLQkJCWYuQWRkcmVzcyA9IGFkZHJlc3MuRmlyc3RBZGRyZXNzOwotCQkJZi5TdGFydENvbCA9IGFkZHJlc3MuU3RhcnQuQ29sdW1uOwotCQkJZi5TdGFydFJvdyA9IGFkZHJlc3MuU3RhcnQuUm93OwotCQkJZi5Jc0FycmF5ID0gSXNBcnJheTsKKy8vLyA8c3VtbWFyeT4KKy8vLyBBIHJhbmdlIG9mIGNlbGxzCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsUmFuZ2VCYXNlCisgICAgOiBFeGNlbEFkZHJlc3MsCisgICAgICBJRXhjZWxDZWxsLAorICAgICAgSURpc3Bvc2FibGUsCisgICAgICBJRW51bWVyYWJsZTxFeGNlbFJhbmdlQmFzZT4sCisgICAgICBJRW51bWVyYXRvcjxFeGNlbFJhbmdlQmFzZT4geworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZWZlcmVuY2UgdG8gdGhlIHdvcmtzaGVldAorICAvLy8gPC9zdW1tYXJ5PgorICBwcm90ZWN0ZWQgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKKyAgaW50ZXJuYWwgRXhjZWxXb3JrYm9vayBfd29ya2Jvb2s7CiAKLQkJCV93b3Jrc2hlZXQuX3NoYXJlZEZvcm11bGFzLkFkZChmLkluZGV4LCBmKTsKLSAgICAgICAgICAgIC8vX3dvcmtzaGVldC5DZWxsKGFkZHJlc3MuU3RhcnQuUm93LCBhZGRyZXNzLlN0YXJ0LkNvbHVtbikuU2hhcmVkRm9ybXVsYUlEID0gZi5JbmRleDsKLSAgICAgICAgICAgIC8vX3dvcmtzaGVldC5DZWxsKGFkZHJlc3MuU3RhcnQuUm93LCBhZGRyZXNzLlN0YXJ0LkNvbHVtbikuRm9ybXVsYSA9IHZhbHVlOworICBwcml2YXRlIGRlbGVnYXRlIHZvaWQgQ2hhbmdlUHJvcEhhbmRsZXIoU2V0VmFsdWVIYW5kbGVyIG1ldGhvZCwgb2JqZWN0IHZhbHVlKTsKIAotCQkJZm9yIChpbnQgY29sID0gYWRkcmVzcy5TdGFydC5Db2x1bW47IGNvbCA8PSBhZGRyZXNzLkVuZC5Db2x1bW47IGNvbCsrKQotCQkJewotCQkJCWZvciAoaW50IHJvdyA9IGFkZHJlc3MuU3RhcnQuUm93OyByb3cgPD0gYWRkcmVzcy5FbmQuUm93OyByb3crKykKLQkJCQl7Ci0JCQkJCS8vX3dvcmtzaGVldC5DZWxsKHJvdywgY29sKS5TaGFyZWRGb3JtdWxhSUQgPSBmLkluZGV4OwotICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll9mb3JtdWxhcy5TZXRWYWx1ZShyb3csIGNvbCwgZi5JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXByaXZhdGUgdm9pZCBTZXRfSHlwZXJMaW5rKG9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkKLQkJewotCQkJLy9fd29ya3NoZWV0LkNlbGwocm93LCBjb2wpLkh5cGVybGluayA9IHZhbHVlIGFzIFVyaTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSBpcyBVcmkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3dvcmtzaGVldC5faHlwZXJMaW5rcy5TZXRWYWx1ZShyb3csIGNvbCwgKFVyaSl2YWx1ZSk7CisgIHByaXZhdGUgZGVsZWdhdGUgdm9pZCBTZXRWYWx1ZUhhbmRsZXIob2JqZWN0IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKTsKIAotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpcyBFeGNlbEh5cGVyTGluaykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgKChFeGNlbEh5cGVyTGluayl2YWx1ZSkuRGlzcGxheSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCAoKFVyaSl2YWx1ZSkuT3JpZ2luYWxTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX2h5cGVyTGlua3MuU2V0VmFsdWUocm93LCBjb2wsIChVcmkpbnVsbCk7Ci0gICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCAoVXJpKW51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBTZXRfSXNBcnJheUZvcm11bGEob2JqZWN0IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKQotICAgICAgICB7Ci0gICAgICAgICAgICBfd29ya3NoZWV0Ll9mbGFncy5TZXRGbGFnVmFsdWUocm93LCBjb2wsIChib29sKXZhbHVlLCBDZWxsRmxhZ3MuQXJyYXlGb3JtdWxhKTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgU2V0X0lzUmljaFRleHQob2JqZWN0IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKQotCQl7Ci0JCQkvL193b3Jrc2hlZXQuQ2VsbChyb3csIGNvbCkuSXNSaWNoVGV4dCA9IChib29sKXZhbHVlOwotICAgICAgICAgICAgX3dvcmtzaGVldC5fZmxhZ3MuU2V0RmxhZ1ZhbHVlKHJvdywgY29sLCAoYm9vbCl2YWx1ZSwgQ2VsbEZsYWdzLlJpY2hUZXh0KTsKLQkJfQotCQlwcml2YXRlIHZvaWQgRXhpc3RzX0NvbW1lbnQob2JqZWN0IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKQotCQl7Ci0JCQl1bG9uZyBjZWxsSUQgPSBHZXRDZWxsSUQoX3dvcmtzaGVldC5TaGVldElELCByb3csIGNvbCk7Ci0JCQlpZiAoX3dvcmtzaGVldC5Db21tZW50cy5fY29tbWVudHMuQ29udGFpbnNLZXkoY2VsbElEKSkKLQkJCXsKLQkJCQl0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiQ2VsbCB7MH0gYWxyZWFkeSBjb250YWluIGEgY29tbWVudC4iLCBuZXcgRXhjZWxDZWxsQWRkcmVzcyhyb3csIGNvbCkuQWRkcmVzcykpKTsKLQkJCX0KKyAgcHJpdmF0ZSBDaGFuZ2VQcm9wSGFuZGxlciBfY2hhbmdlUHJvcE1ldGhvZDsKKyAgcHJpdmF0ZSBpbnQgX3N0eWxlSUQ7CiAKLQkJfQotCQlwcml2YXRlIHZvaWQgU2V0X0NvbW1lbnQob2JqZWN0IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKQotCQl7Ci0JCQlzdHJpbmdbXSB2ID0gKHN0cmluZ1tdKXZhbHVlOwotCQkJV29ya3NoZWV0LkNvbW1lbnRzLkFkZChuZXcgRXhjZWxSYW5nZUJhc2UoX3dvcmtzaGVldCwgR2V0QWRkcmVzcyhfZnJvbVJvdywgX2Zyb21Db2wpKSwgdlswXSwgdlsxXSk7Ci0JCQkvLyAgIF93b3Jrc2hlZXQuQ2VsbChyb3csIGNvbCkuQ29tbWVudCA9IGNvbW1lbnQ7Ci0JCX0KLQkJI2VuZHJlZ2lvbgotCQlwcml2YXRlIHZvaWQgU2V0VG9TZWxlY3RlZFJhbmdlKCkKLQkJewotCQkJaWYgKF93b3Jrc2hlZXQuVmlldy5TZWxlY3RlZFJhbmdlID09ICIiKQotCQkJewotCQkJCUFkZHJlc3MgPSAiQTEiOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCUFkZHJlc3MgPSBfd29ya3NoZWV0LlZpZXcuU2VsZWN0ZWRSYW5nZTsKLQkJCX0KLQkJfQotCQlwcml2YXRlIHZvaWQgSXNSYW5nZVZhbGlkKHN0cmluZyB0eXBlKQotCQl7Ci0JCQlpZiAoX2Zyb21Sb3cgPD0gMCkKLQkJCXsKLQkJCQlpZiAoX2FkZHJlc3MgPT0gIiIpCi0JCQkJewotCQkJCQlTZXRUb1NlbGVjdGVkUmFuZ2UoKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJaWYgKHR5cGUgPT0gIiIpCi0JCQkJCXsKLQkJCQkJCXRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJSYW5nZSBpcyBub3QgdmFsaWQgZm9yIHRoaXMgb3BlcmF0aW9uOiB7MH0iLCBfYWRkcmVzcykpKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJSYW5nZSBpcyBub3QgdmFsaWQgZm9yIHswfSA6IHsxfSIsIHR5cGUsIF9hZGRyZXNzKSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCSNyZWdpb24gUHVibGljIFByb3BlcnRpZXMKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVGhlIHN0eWxlb2JqZWN0IGZvciB0aGUgcmFuZ2UuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBFeGNlbFN0eWxlIFN0eWxlCi0JCXsKLQkJCWdldAotCQkJewotCQkJCUlzUmFuZ2VWYWxpZCgic3R5bGluZyIpOwotICAgICAgICAgICAgICAgIGludCBzPTA7Ci0gICAgICAgICAgICAgICAgaWYoIV93b3Jrc2hlZXQuX3N0eWxlcy5FeGlzdHMoX2Zyb21Sb3csX2Zyb21Db2wsIHJlZiBzKSkgLy9DZWxsIGV4aXN0cwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoIV93b3Jrc2hlZXQuX3N0eWxlcy5FeGlzdHMoX2Zyb21Sb3csMCwgcmVmIHMpKSAvL05vLCBjaGVjayBSb3cgc3R5bGUKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBXb3Jrc2hlZXQuR2V0Q29sdW1uKF9mcm9tQ29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGMuU3R5bGVJRDsgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQkJCQlyZXR1cm4gX3dvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXMuR2V0U3R5bGVPYmplY3QocywgX3dvcmtzaGVldC5Qb3NpdGlvbklELCBBZGRyZXNzKTsKLQkJCX0KLQkJfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBUaGUgbmFtZWQgc3R5bGUKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIHN0cmluZyBTdHlsZU5hbWUKLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJSXNSYW5nZVZhbGlkKCJzdHlsaW5nIik7Ci0JCQkJaW50ICB4ZklkOwotICAgICAgICAgICAgICAgIGlmIChfZnJvbVJvdyA9PSAxICYmIF90b1JvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhmSWQ9R2V0Q29sdW1uU3R5bGUoX2Zyb21Db2wpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChfZnJvbUNvbCA9PSAxICYmIF90b0NvbCA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhmSWQgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAoIV93b3Jrc2hlZXQuX3N0eWxlcy5FeGlzdHMoX2Zyb21Sb3csIDAsIHJlZiB4ZklkKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeGZJZCA9IEdldENvbHVtblN0eWxlKF9mcm9tQ29sKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4ZklkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYoIV93b3Jrc2hlZXQuX3N0eWxlcy5FeGlzdHMoX2Zyb21Sb3csIF9mcm9tQ29sLCByZWYgeGZJZCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghX3dvcmtzaGVldC5fc3R5bGVzLkV4aXN0cyhfZnJvbVJvdywgMCwgcmVmIHhmSWQpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhmSWQgPSBHZXRDb2x1bW5TdHlsZShfZnJvbUNvbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW50IG5zSUQ7Ci0gICAgICAgICAgICAgICAgaWYgKHhmSWQgPD0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5zSUQ9U3R5bGUuU3R5bGVzLkNlbGxYZnNbMF0uWGZJZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbnNJRD1TdHlsZS5TdHlsZXMuQ2VsbFhmc1t4ZklkXS5YZklkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgbnMgaW4gU3R5bGUuU3R5bGVzLk5hbWVkU3R5bGVzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5zLlN0eWxlWGZJZCA9PSBuc0lEKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnMuTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0JCQl9Ci0JCQlzZXQKLQkJCXsKLQkJCQlfc3R5bGVJRCA9IF93b3Jrc2hlZXQuV29ya2Jvb2suU3R5bGVzLkdldFN0eWxlSWRGcm9tTmFtZSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgaW50IGNvbCA9IF9mcm9tQ29sOwotICAgICAgICAgICAgICAgIGlmIChfZnJvbVJvdyA9PSAxICYmIF90b1JvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cykgICAgLy9GdWxsIGNvbHVtbgotCQkJCXsKLQkJCQkJRXhjZWxDb2x1bW4gY29sdW1uOwotCQkJCQkvL0dldCB0aGUgc3RhcnRjb2x1bW4KLQkJCQkJLy91bG9uZyBjb2xJRCA9IEV4Y2VsQ29sdW1uLkdldENvbHVtbklEKF93b3Jrc2hlZXQuU2hlZXRJRCwgY29sdW1uKTsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBfd29ya3NoZWV0LkdldFZhbHVlKDAsIF9mcm9tQ29sKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGM9PW51bGwpCi0JCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IF93b3Jrc2hlZXQuQ29sdW1uKF9mcm9tQ29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKF93b3Jrc2hlZXQuX3ZhbHVlcy5QcmV2Q2VsbChyZWYgcm93LCByZWYgY29sKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdmFyIHByZXZDb2wgPSAoRXhjZWxDb2x1bW4pX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKHJvdywgY29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGNvbHVtbiA9IHByZXZDb2wuQ2xvbmUoX3dvcmtzaGVldCwgY29sdW1uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIHByZXZDb2wuQ29sdW1uTWF4ID0gY29sdW1uIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vfQotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gKEV4Y2VsQ29sdW1uKWM7Ci0JCQkJCX0KKyAgcHJpdmF0ZSBjbGFzcyBDb3BpZWRDZWxsIHsKKyAgICBpbnRlcm5hbCBpbnQgUm93IHsgZ2V0OyBzZXQ7IH0KIAotICAgICAgICAgICAgICAgICAgICBjb2x1bW4uU3R5bGVOYW1lID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5TdHlsZUlEID0gX3N0eWxlSUQ7CisgICAgaW50ZXJuYWwgaW50IENvbHVtbiB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgICAgICAgICAgICAgLy92YXIgaW5kZXggPSBfd29ya3NoZWV0Ll9jb2x1bW5zLkluZGV4T2YoY29sSUQpOwotICAgICAgICAgICAgICAgICAgICB2YXIgY29scyA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF93b3Jrc2hlZXQuX3ZhbHVlcywgMCwgX2Zyb21Db2wgKyAxLCAwLCBfdG9Db2wpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29scy5OZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IF9mcm9tQ29sOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvbHVtbi5Db2x1bW5NaW4gPD0gX3RvQ29sKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uQ29sdW1uTWF4ID4gX3RvQ29sKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld0NvbCA9IF93b3Jrc2hlZXQuQ29weUNvbHVtbihjb2x1bW4sIF90b0NvbCArIDEsIGNvbHVtbi5Db2x1bW5NYXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uQ29sdW1uTWF4ID0gX3RvQ29sOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBpbnRlcm5hbCBvYmplY3QgVmFsdWUgeyBnZXQ7IHNldDsgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uLl9zdHlsZU5hbWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uU3R5bGVJRCA9IF9zdHlsZUlEOworICAgIGludGVybmFsIHN0cmluZyBUeXBlIHsgZ2V0OyBzZXQ7IH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xzLlZhbHVlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRDb2wgPSAoRXhjZWxDb2x1bW4pY29scy5WYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY29sdW1uLkNvbHVtbk1heCA8IG5leHRDb2wuQ29sdW1uTWF4LTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5Db2x1bW5NYXggPSBuZXh0Q29sLkNvbHVtbk1heCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gbmV4dENvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scy5OZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uQ29sdW1uTWF4IDwgX3RvQ29sKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uQ29sdW1uTWF4ID0gX3RvQ29sOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vaWYgKGNvbHVtbi5Db2x1bW5NaW4gPT0gY29sdW1uKQotICAgICAgICAgICAgICAgICAgICAvL3sKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgY29sdW1uLkNvbHVtbk1heCA9IF90b0NvbDsKLSAgICAgICAgICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAgICAgICAgIC8vZWxzZSBpZiAoY29sdW1uLl9jb2x1bW5NYXggPCBfdG9Db2wpCi0gICAgICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgICAgICAvLyAgICB2YXIgbmV3Q29sID0gX3dvcmtzaGVldC5Db2x1bW4oY29sdW1uLl9jb2x1bW5NYXggKyAxKSBhcyBFeGNlbENvbHVtbjsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgbmV3Q29sLl9jb2x1bW5NYXggPSBfdG9Db2w7CisgICAgaW50ZXJuYWwgb2JqZWN0IEZvcm11bGEgeyBnZXQ7IHNldDsgfQogCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIG5ld0NvbC5fc3R5bGVJRCA9IF9zdHlsZUlEOwotICAgICAgICAgICAgICAgICAgICAvLyAgICBuZXdDb2wuX3N0eWxlTmFtZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICAgICAgaWYgKF9mcm9tQ29sID09IDEgJiYgX3RvQ29sID09IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSAvL0Z1bGxSb3cKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvd3MgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0Pihfd29ya3NoZWV0Ll92YWx1ZXMsIDEsIDAsIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvd3MuTmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUocm93cy5WYWx1ZSE9bnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll9zdHlsZXMuU2V0VmFsdWUocm93cy5Sb3csIDAsIF9zdHlsZUlEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJvd3MuTmV4dCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0JCQkJfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9mcm9tQ29sID09IDEgJiYgX3RvQ29sID09IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSAvL0Z1bGxSb3cKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHIgPSBfZnJvbVJvdzsgciA8PSBfdG9Sb3c7IHIrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5Sb3cocikuX3N0eWxlTmFtZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5Sb3cocikuU3R5bGVJRCA9IF9zdHlsZUlEOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgIGludGVybmFsIGludD8gU3R5bGVJRCB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgICAgICAgICBpZiAoISgoX2Zyb21Sb3cgPT0gMSAmJiBfdG9Sb3cgPT0gRXhjZWxQYWNrYWdlLk1heFJvd3MpIHx8IChfZnJvbUNvbCA9PSAxICYmIF90b0NvbCA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykpKSAvL0NlbGwgc3BlY2lmaWMKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGMgPSBfZnJvbUNvbDsgYyA8PSBfdG9Db2w7IGMrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IF9mcm9tUm93OyByIDw9IF90b1JvdzsgcisrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX3N0eWxlcy5TZXRWYWx1ZShyLCBjLCBfc3R5bGVJRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvL09ubHkgc2V0IG5hbWUgb24gY3JlYXRlZCBjZWxscy4gKHVuY3JlYXRlZCBjZWxscyBpcyBzZXQgb24gZnVsbCByb3cgb3IgZnVsbCBjb2x1bW4pLgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGxzID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX3dvcmtzaGVldC5fdmFsdWVzLCBfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sKTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNlbGxzLk5leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5fc3R5bGVzLlNldFZhbHVlKGNlbGxzLlJvdywgY2VsbHMuQ29sdW1uLCBfc3R5bGVJRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9fY2hhbmdlUHJvcE1ldGhvZChTZXRfU3R5bGVOYW1lLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KKyAgICBpbnRlcm5hbCBVcmkgSHlwZXJMaW5rIHsgZ2V0OyBzZXQ7IH0KIAotICAgICAgICBwcml2YXRlIGludCBHZXRDb2x1bW5TdHlsZShpbnQgY29sKQotICAgICAgICB7Ci0gICAgICAgICAgICBvYmplY3QgYz1udWxsOwotICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXQuX3ZhbHVlcy5FeGlzdHMoMCwgY29sLCByZWYgYykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChjIGFzIEV4Y2VsQ29sdW1uKS5TdHlsZUlEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCByb3cgPSAwOwotICAgICAgICAgICAgICAgIGlmIChfd29ya3NoZWV0Ll92YWx1ZXMuUHJldkNlbGwocmVmIHJvdywgcmVmIGNvbCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uPV93b3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShyb3csY29sKSBhcyBFeGNlbENvbHVtbjsKLSAgICAgICAgICAgICAgICAgICAgaWYoY29sdW1uLkNvbHVtbk1heD49Y29sKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5fc3R5bGVzLkdldFZhbHVlKHJvdywgY29sKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFRoZSBzdHlsZSBJRC4gCi0JCS8vLyBJdCBpcyBub3QgcmVjb21lbmRlZCB0byB1c2UgdGhpcyBvbmUuIFVzZSBOYW1lZCBzdHlsZXMgYXMgYW4gYWx0ZXJuYXRpdmUuCi0JCS8vLyBJZiB5b3UgZG8sIG1ha2Ugc3VyZSB0aGF0IHlvdSB1c2UgdGhlIFN0eWxlLlVwZGF0ZVhtbCgpIG1ldGhvZCB0byB1cGRhdGUgYW55IG5ldyBzdHlsZXMgYWRkZWQgdG8gdGhlIHdvcmtib29rLgotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgaW50IFN0eWxlSUQKLQkJewotCQkJZ2V0Ci0JCQl7Ci0gICAgICAgICAgICAgICAgaW50IHM9MDsKLSAgICAgICAgICAgICAgICBpZighX3dvcmtzaGVldC5fc3R5bGVzLkV4aXN0cyhfZnJvbVJvdywgX2Zyb21Db2wsIHJlZiBzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghX3dvcmtzaGVldC5fc3R5bGVzLkV4aXN0cyhfZnJvbVJvdywgMCwgcmVmIHMpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gX3dvcmtzaGVldC5fc3R5bGVzLkdldFZhbHVlKDAsIF9mcm9tQ29sKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gczsKLQkJCX0KLQkJCXNldAotCQkJewotCQkJCV9jaGFuZ2VQcm9wTWV0aG9kKFNldF9TdHlsZUlELCB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gU2V0IHRoZSByYW5nZSB0byBhIHNwZWNpZmljIHZhbHVlCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBvYmplY3QgVmFsdWUKLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJaWYgKElzTmFtZSkKLQkJCQl7Ci0JCQkJCWlmIChfd29ya3NoZWV0ID09IG51bGwpCi0JCQkJCXsKLQkJCQkJCXJldHVybiBfd29ya2Jvb2suX25hbWVzW19hZGRyZXNzXS5OYW1lVmFsdWU7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlyZXR1cm4gX3dvcmtzaGVldC5OYW1lc1tfYWRkcmVzc10uTmFtZVZhbHVlOyAKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZiAoX2Zyb21Sb3cgPT0gX3RvUm93ICYmIF9mcm9tQ29sID09IF90b0NvbCkKLQkJCQkJewotCQkJCQkJcmV0dXJuIF93b3Jrc2hlZXQuR2V0VmFsdWUoX2Zyb21Sb3csIF9mcm9tQ29sKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCXJldHVybiBHZXRWYWx1ZUFycmF5KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlzZXQKLQkJCXsKLQkJCQlpZiAoSXNOYW1lKQotCQkJCXsKLQkJCQkJaWYgKF93b3Jrc2hlZXQgPT0gbnVsbCkKLQkJCQkJewotCQkJCQkJX3dvcmtib29rLl9uYW1lc1tfYWRkcmVzc10uTmFtZVZhbHVlID0gdmFsdWU7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlfd29ya3NoZWV0Lk5hbWVzW19hZGRyZXNzXS5OYW1lVmFsdWUgPSB2YWx1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlfY2hhbmdlUHJvcE1ldGhvZChTZXRfVmFsdWUsIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KKyAgICBpbnRlcm5hbCBFeGNlbENvbW1lbnQgQ29tbWVudCB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgcHJpdmF0ZSBib29sIElzSW5maW5pdHlWYWx1ZShvYmplY3QgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZT8gdmFsdWVBc0RvdWJsZSA9IHZhbHVlIGFzIGRvdWJsZT87CisgICAgaW50ZXJuYWwgQnl0ZSBGbGFnIHsgZ2V0OyBzZXQ7IH0KKyAgfQogCi0gICAgICAgICAgICBpZih2YWx1ZUFzRG91YmxlLkhhc1ZhbHVlICYmIAotICAgICAgICAgICAgICAgIChkb3VibGUuSXNOZWdhdGl2ZUluZmluaXR5KHZhbHVlQXNEb3VibGUuVmFsdWUpIHx8IGRvdWJsZS5Jc1Bvc2l0aXZlSW5maW5pdHkodmFsdWVBc0RvdWJsZS5WYWx1ZSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQorICAvL3ByaXZhdGUgY2xhc3MgQ29waWVkRmxhZworICAvL3sKKyAgLy8gICAgaW50ZXJuYWwgaW50IFJvdyB7IGdldDsgc2V0OyB9CisgIC8vICAgIGludGVybmFsIGludCBDb2x1bW4geyBnZXQ7IHNldDsgfQorICAvLyAgICBpbnRlcm5hbCBCeXRlIEZsYWcgeyBnZXQ7IHNldDsgfQorICAvL30KIAotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CiAKLQkJcHJpdmF0ZSBvYmplY3QgR2V0VmFsdWVBcnJheSgpCi0JCXsKLQkJCUV4Y2VsQWRkcmVzc0Jhc2UgYWRkcjsKLQkJCWlmIChfZnJvbVJvdyA9PSAxICYmIF9mcm9tQ29sID09IDEgJiYgX3RvUm93ID09IEV4Y2VsUGFja2FnZS5NYXhSb3dzICYmIF90b0NvbCA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKLQkJCXsKLQkJCQlhZGRyID0gX3dvcmtzaGVldC5EaW1lbnNpb247Ci0JCQkJaWYgKGFkZHIgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJYWRkciA9IHRoaXM7Ci0JCQl9Ci0JCQlvYmplY3RbLF0gdiA9IG5ldyBvYmplY3RbYWRkci5fdG9Sb3cgLSBhZGRyLl9mcm9tUm93ICsgMSwgYWRkci5fdG9Db2wgLSBhZGRyLl9mcm9tQ29sICsgMV07CisgIGludGVybmFsIEV4Y2VsUmFuZ2VCYXNlKEV4Y2VsV29ya3NoZWV0IHhsV29ya3NoZWV0KSB7CisgICAgX3dvcmtzaGVldCA9IHhsV29ya3NoZWV0OworICAgIF93cyA9IF93b3Jrc2hlZXQuTmFtZTsKKyAgICBfd29ya2Jvb2sgPSBfd29ya3NoZWV0Lldvcmtib29rOworICAgIEFkZHJlc3NDaGFuZ2UgKz0gRXhjZWxSYW5nZUJhc2VfQWRkcmVzc0NoYW5nZTsKKyAgICBTZXREZWxlZ2F0ZSgpOworICB9CiAKLQkJCWZvciAoaW50IGNvbCA9IGFkZHIuX2Zyb21Db2w7IGNvbCA8PSBhZGRyLl90b0NvbDsgY29sKyspCi0JCQl7Ci0JCQkJZm9yIChpbnQgcm93ID0gYWRkci5fZnJvbVJvdzsgcm93IDw9IGFkZHIuX3RvUm93OyByb3crKykKLQkJCQl7Ci0JCQkJCWlmIChfd29ya3NoZWV0Ll92YWx1ZXMuRXhpc3RzKHJvdyxjb2wpKQotCQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3dvcmtzaGVldC5fZmxhZ3MuR2V0RmxhZ1ZhbHVlKHJvdywgY29sLCBDZWxsRmxhZ3MuUmljaFRleHQpKQotCQkJCQkJewotCQkJCQkJCXZbcm93IC0gYWRkci5fZnJvbVJvdywgY29sIC0gYWRkci5fZnJvbUNvbF0gPSBHZXRSaWNoVGV4dChyb3csIGNvbCkuVGV4dDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQl2W3JvdyAtIGFkZHIuX2Zyb21Sb3csIGNvbCAtIGFkZHIuX2Zyb21Db2xdID0gX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKHJvdywgY29sKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB2OwotCQl9Ci0JCXByaXZhdGUgRXhjZWxBZGRyZXNzQmFzZSBHZXRBZGRyZXNzRGltKEV4Y2VsUmFuZ2VCYXNlIGFkZHIpCi0JCXsKLQkJCWludCBmcm9tUm93LCBmcm9tQ29sLCB0b1JvdywgdG9Db2w7Ci0JCQl2YXIgZCA9IF93b3Jrc2hlZXQuRGltZW5zaW9uOwotCQkJZnJvbVJvdyA9IGFkZHIuX2Zyb21Sb3cgPCBkLl9mcm9tUm93ID8gZC5fZnJvbVJvdyA6IGFkZHIuX2Zyb21Sb3c7Ci0JCQlmcm9tQ29sID0gYWRkci5fZnJvbUNvbCA8IGQuX2Zyb21Db2wgPyBkLl9mcm9tQ29sIDogYWRkci5fZnJvbUNvbDsKLQotCQkJdG9Sb3cgPSBhZGRyLl90b1JvdyA+IGQuX3RvUm93ID8gZC5fdG9Sb3cgOiBhZGRyLl90b1JvdzsKLQkJCXRvQ29sID0gYWRkci5fdG9Db2wgPiBkLl90b0NvbCA/IGQuX3RvQ29sIDogYWRkci5fdG9Db2w7Ci0KLQkJCWlmIChhZGRyLl9mcm9tQ29sID09IGZyb21Sb3cgJiYgYWRkci5fdG9Sb3cgPT0gdG9Sb3cgJiYgYWRkci5fdG9Db2wgPT0gX3RvQ29sKQotCQkJewotCQkJCXJldHVybiBhZGRyOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmIChfZnJvbVJvdyA+IF90b1JvdyB8fCBfZnJvbUNvbCA+IF90b0NvbCkKLQkJCQl7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlyZXR1cm4gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoZnJvbVJvdywgZnJvbUNvbCwgdG9Sb3csIHRvQ29sKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIG9iamVjdCBHZXRTaW5nbGVWYWx1ZSgpCi0JCXsKLQkJCWlmIChJc1JpY2hUZXh0KQotCQkJewotCQkJCXJldHVybiBSaWNoVGV4dC5UZXh0OwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJldHVybiBfd29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoX2Zyb21Sb3csIF9mcm9tQ29sKTsKLQkJCX0KLQkJfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBSZXR1cm5zIHRoZSBmb3JtYXR0ZWQgdmFsdWUuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBzdHJpbmcgVGV4dAotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlyZXR1cm4gR2V0Rm9ybWF0dGVkVGV4dChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotICAgICAgICBwcml2YXRlIHZvaWQgU2V0TWluV2lkdGgoZG91YmxlIG1pbmltdW1XaWR0aCwgaW50IGZyb21Db2wsIGludCB0b0NvbCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGl0ZXJhdG9yID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX3dvcmtzaGVldC5fdmFsdWVzLCAwLCBmcm9tQ29sLCAwLCB0b0NvbCk7Ci0gICAgICAgICAgICB2YXIgcHJldkNvbCA9IGZyb21Db2w7Ci0gICAgICAgICAgICBmb3JlYWNoIChFeGNlbENvbHVtbiBjb2wgaW4gaXRlcmF0b3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29sLldpZHRoID0gbWluaW11bVdpZHRoOwotICAgICAgICAgICAgICAgIGlmIChfd29ya3NoZWV0LkRlZmF1bHRDb2xXaWR0aCA+IG1pbmltdW1XaWR0aCAmJiBjb2wuQ29sdW1uTWluID4gcHJldkNvbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBuZXdDb2wgPSBfd29ya3NoZWV0LkNvbHVtbihwcmV2Q29sKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3Q29sLkNvbHVtbk1heCA9IGNvbC5Db2x1bW5NaW4gLSAxOwotICAgICAgICAgICAgICAgICAgICBuZXdDb2wuV2lkdGggPSBtaW5pbXVtV2lkdGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByZXZDb2wgPSBjb2wuQ29sdW1uTWF4ICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChfd29ya3NoZWV0LkRlZmF1bHRDb2xXaWR0aCA+IG1pbmltdW1XaWR0aCAmJiBwcmV2Q29sPHRvQ29sKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBuZXdDb2wgPSBfd29ya3NoZWV0LkNvbHVtbihwcmV2Q29sKTsKLSAgICAgICAgICAgICAgICBuZXdDb2wuQ29sdW1uTWF4ID0gdG9Db2w7Ci0gICAgICAgICAgICAgICAgbmV3Q29sLldpZHRoID0gbWluaW11bVdpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFRleHRGb3JXaWR0aAotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlyZXR1cm4gR2V0Rm9ybWF0dGVkVGV4dCh0cnVlKTsKLQkJCX0KLQkJfQotCQlwcml2YXRlIHN0cmluZyBHZXRGb3JtYXR0ZWRUZXh0KGJvb2wgZm9yV2lkdGhDYWxjKQotCQl7Ci0JCQlvYmplY3QgdiA9IFZhbHVlOwotCQkJaWYgKHYgPT0gbnVsbCkgcmV0dXJuICIiOwotCQkJdmFyIHN0eWxlcyA9IFdvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXM7Ci0JCQl2YXIgbmZJRCA9IHN0eWxlcy5DZWxsWGZzW1N0eWxlSURdLk51bWJlckZvcm1hdElkOwotCQkJRXhjZWxOdW1iZXJGb3JtYXRYbWwuRXhjZWxGb3JtYXRUcmFuc2xhdG9yIG5mID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3R5bGVzLk51bWJlckZvcm1hdHMuQ291bnQ7IGkrKykKLQkJCXsKLQkJCQlpZiAobmZJRCA9PSBzdHlsZXMuTnVtYmVyRm9ybWF0c1tpXS5OdW1GbXRJZCkKLQkJCQl7Ci0JCQkJCW5mID0gc3R5bGVzLk51bWJlckZvcm1hdHNbaV0uRm9ybWF0VHJhbnNsYXRvcjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQlzdHJpbmcgZm9ybWF0LCB0ZXh0Rm9ybWF0OwotCQkJaWYgKGZvcldpZHRoQ2FsYykKLQkJCXsKLQkJCQlmb3JtYXQgPSBuZi5OZXRGb3JtYXRGb3JXaWR0aDsKLQkJCQl0ZXh0Rm9ybWF0ID0gbmYuTmV0VGV4dEZvcm1hdEZvcldpZHRoOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWZvcm1hdCA9IG5mLk5ldEZvcm1hdDsKLQkJCQl0ZXh0Rm9ybWF0ID0gbmYuTmV0VGV4dEZvcm1hdDsKLQkJCX0KLQotICAgICAgICAgICAgcmV0dXJuIEZvcm1hdFZhbHVlKHYsIG5mLCBmb3JtYXQsIHRleHRGb3JtYXQpOwotCQl9Ci0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBGb3JtYXRWYWx1ZShvYmplY3QgdiwgRXhjZWxOdW1iZXJGb3JtYXRYbWwuRXhjZWxGb3JtYXRUcmFuc2xhdG9yIG5mLCBzdHJpbmcgZm9ybWF0LCBzdHJpbmcgdGV4dEZvcm1hdCkKLSAgICAgICAgewotCQkJaWYgKHYgaXMgZGVjaW1hbCB8fCB2LkdldFR5cGUoKS5Jc1ByaW1pdGl2ZSkKLQkJCXsKLQkJCQlkb3VibGUgZDsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCWQgPSBDb252ZXJ0LlRvRG91YmxlKHYpOwotCQkJCX0KLQkJCQljYXRjaAotCQkJCXsKLQkJCQkJcmV0dXJuICIiOwotCQkJCX0KLQotCQkJCWlmIChuZi5EYXRhVHlwZSA9PSBFeGNlbE51bWJlckZvcm1hdFhtbC5lRm9ybWF0VHlwZS5OdW1iZXIpCi0JCQkJewotCQkJCQlpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkobmYuRnJhY3Rpb25Gb3JtYXQpKQotCQkJCQl7Ci0JCQkJCQlyZXR1cm4gZC5Ub1N0cmluZyhmb3JtYXQsIG5mLkN1bHR1cmUpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcmV0dXJuIG5mLkZvcm1hdEZyYWN0aW9uKGQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5mLkRhdGFUeXBlID09IEV4Y2VsTnVtYmVyRm9ybWF0WG1sLmVGb3JtYXRUeXBlLkRhdGVUaW1lKQotCQkJCXsKLQkJCQkJdmFyIGRhdGUgPSBEYXRlVGltZS5Gcm9tT0FEYXRlKGQpOwotCQkJCQlyZXR1cm4gZGF0ZS5Ub1N0cmluZyhmb3JtYXQsIG5mLkN1bHR1cmUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHYgaXMgRGF0ZVRpbWUpCi0JCQl7Ci0JCQkJaWYgKG5mLkRhdGFUeXBlID09IEV4Y2VsTnVtYmVyRm9ybWF0WG1sLmVGb3JtYXRUeXBlLkRhdGVUaW1lKQotCQkJCXsKLQkJCQkJcmV0dXJuICgoRGF0ZVRpbWUpdikuVG9TdHJpbmcoZm9ybWF0LCBuZi5DdWx0dXJlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZG91YmxlIGQgPSAoKERhdGVUaW1lKXYpLlRvT0FEYXRlKCk7Ci0JCQkJCWlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShuZi5GcmFjdGlvbkZvcm1hdCkpCi0JCQkJCXsKLQkJCQkJCXJldHVybiBkLlRvU3RyaW5nKGZvcm1hdCwgbmYuQ3VsdHVyZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlyZXR1cm4gbmYuRm9ybWF0RnJhY3Rpb24oZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh2IGlzIFRpbWVTcGFuKQotCQkJewotCQkJCWlmIChuZi5EYXRhVHlwZSA9PSBFeGNlbE51bWJlckZvcm1hdFhtbC5lRm9ybWF0VHlwZS5EYXRlVGltZSkKLQkJCQl7Ci0JCQkJCXJldHVybiBuZXcgRGF0ZVRpbWUoKChUaW1lU3Bhbil2KS5UaWNrcykuVG9TdHJpbmcoZm9ybWF0LCBuZi5DdWx0dXJlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJZG91YmxlIGQgPSAobmV3IERhdGVUaW1lKCgoVGltZVNwYW4pdikuVGlja3MpKS5Ub09BRGF0ZSgpOwotCQkJCQlpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkobmYuRnJhY3Rpb25Gb3JtYXQpKQotCQkJCQl7Ci0JCQkJCQlyZXR1cm4gZC5Ub1N0cmluZyhmb3JtYXQsIG5mLkN1bHR1cmUpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcmV0dXJuIG5mLkZvcm1hdEZyYWN0aW9uKGQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWlmICh0ZXh0Rm9ybWF0ID09ICIiKQotCQkJCXsKLQkJCQkJcmV0dXJuIHYuVG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcmV0dXJuIHN0cmluZy5Gb3JtYXQodGV4dEZvcm1hdCwgdik7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHYuVG9TdHJpbmcoKTsKLX0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gR2V0cyBvciBzZXRzIGEgZm9ybXVsYSBmb3IgYSByYW5nZS4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIHN0cmluZyBGb3JtdWxhCi0JCXsKLQkJCWdldAotCQkJewotCQkJCWlmIChJc05hbWUpCi0JCQkJewotCQkJCQlpZiAoX3dvcmtzaGVldCA9PSBudWxsKQotCQkJCQl7Ci0JCQkJCQlyZXR1cm4gX3dvcmtib29rLl9uYW1lc1tfYWRkcmVzc10uTmFtZUZvcm11bGE7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlyZXR1cm4gX3dvcmtzaGVldC5OYW1lc1tfYWRkcmVzc10uTmFtZUZvcm11bGE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcmV0dXJuIF93b3Jrc2hlZXQuR2V0Rm9ybXVsYShfZnJvbVJvdywgX2Zyb21Db2wpOyAgICAgICAgICAgICAgICAgICAgCi0JCQkJfQotCQkJfQotCQkJc2V0Ci0JCQl7Ci0JCQkJaWYgKElzTmFtZSkKLQkJCQl7Ci0JCQkJCWlmIChfd29ya3NoZWV0ID09IG51bGwpCi0JCQkJCXsKLQkJCQkJCV93b3JrYm9vay5fbmFtZXNbX2FkZHJlc3NdLk5hbWVGb3JtdWxhID0gdmFsdWU7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlfd29ya3NoZWV0Lk5hbWVzW19hZGRyZXNzXS5OYW1lRm9ybXVsYSA9IHZhbHVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWlmKHZhbHVlPT1udWxsIHx8IHZhbHVlLlRyaW0oKT09IiIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vU2V0IHRoZSBjZWxscyB0byBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfZnJvbVJvdyA9PSBfdG9Sb3cgJiYgX2Zyb21Db2wgPT0gX3RvQ29sKQotCQkJCQl7Ci0JCQkJCQlTZXRfRm9ybXVsYSh2YWx1ZSwgX2Zyb21Sb3csIF9mcm9tQ29sKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCVNldF9TaGFyZWRGb3JtdWxhKHZhbHVlLCB0aGlzLCBmYWxzZSk7Ci0JCQkJCQlpZiAoQWRkcmVzc2VzICE9IG51bGwpCi0JCQkJCQl7Ci0JCQkJCQkJZm9yZWFjaCAodmFyIGFkZHJlc3MgaW4gQWRkcmVzc2VzKQotCQkJCQkJCXsKLQkJCQkJCQkJU2V0X1NoYXJlZEZvcm11bGEodmFsdWUsIGFkZHJlc3MsIGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gR2V0cyBvciBTZXQgYSBmb3JtdWxhIGluIFIxQzEgZm9ybWF0LgotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgc3RyaW5nIEZvcm11bGFSMUMxCi0JCXsKLQkJCWdldAotCQkJewotCQkJCUlzUmFuZ2VWYWxpZCgiRm9ybXVsYVIxQzEiKTsKLQkJCQlyZXR1cm4gX3dvcmtzaGVldC5HZXRGb3JtdWxhUjFDMShfZnJvbVJvdywgX2Zyb21Db2wpOwotCQkJfQotCQkJc2V0Ci0JCQl7Ci0JCQkJSXNSYW5nZVZhbGlkKCJGb3JtdWxhUjFDMSIpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5MZW5ndGggPiAwICYmIHZhbHVlWzBdID09ICc9JykgdmFsdWUgPSB2YWx1ZS5TdWJzdHJpbmcoMSwgdmFsdWUuTGVuZ3RoIC0gMSk7IC8vIHJlbW92ZSBhbnkgc3RhcnRpbmcgZXF1YWxzaWduLgotCi0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuVHJpbSgpID09ICIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9TZXQgdGhlIGNlbGxzIHRvIG51bGwKLSAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1tFeGNlbENlbGxCYXNlLlRyYW5zbGF0ZUZyb21SMUMxKHZhbHVlLCBfZnJvbVJvdywgX2Zyb21Db2wpXS5WYWx1ZSA9IG51bGw7ICAgIAotICAgICAgICAgICAgICAgIH0KLQkJCQllbHNlIGlmIChBZGRyZXNzZXMgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCVNldF9TaGFyZWRGb3JtdWxhKEV4Y2VsQ2VsbEJhc2UuVHJhbnNsYXRlRnJvbVIxQzEodmFsdWUsIF9mcm9tUm93LCBfZnJvbUNvbCksIHRoaXMsIGZhbHNlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJU2V0X1NoYXJlZEZvcm11bGEoRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVGcm9tUjFDMSh2YWx1ZSwgX2Zyb21Sb3csIF9mcm9tQ29sKSwgbmV3IEV4Y2VsQWRkcmVzcyhXb3JrU2hlZXQsIEZpcnN0QWRkcmVzcyksIGZhbHNlKTsKLQkJCQkJZm9yZWFjaCAodmFyIGFkZHJlc3MgaW4gQWRkcmVzc2VzKQotCQkJCQl7Ci0JCQkJCQlTZXRfU2hhcmVkRm9ybXVsYShFeGNlbENlbGxCYXNlLlRyYW5zbGF0ZUZyb21SMUMxKHZhbHVlLCBhZGRyZXNzLlN0YXJ0LlJvdywgYWRkcmVzcy5TdGFydC5Db2x1bW4pLCBhZGRyZXNzLCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0JCS8vLyBHZXRzIG9yIFNldCBhIGZvcm11bGEgaW4gUjFDMSBmb3JtYXQuCi0JCS8vLyAKLSAgICAgICAgcHVibGljIHN0cmluZyBGb3JtdWxhUjFDMV9WMQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJc1JhbmdlVmFsaWQoIkZvcm11bGFSMUMxIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuR2V0Rm9ybXVsYVIxQzFfVjEoX2Zyb21Sb3csIF9mcm9tQ29sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdHJpbmcgQXJyYXlGb3JtdWxhQWRkcmVzcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJc1JhbmdlVmFsaWQoIkZvcm11bGFSMUMxIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuR2V0QXJyYXlGb3JtdWxhQWRkcmVzcyhfZnJvbVJvdywgX2Zyb21Db2wpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNldCB0aGUgaHlwZXJsaW5rIHByb3BlcnR5IGZvciBhIHJhbmdlIG9mIGNlbGxzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBVcmkgSHlwZXJsaW5rCi0JCXsKLQkJCWdldAotCQkJewotCQkJCUlzUmFuZ2VWYWxpZCgiZm9ybXVsYVIxQzEiKTsKLQkJCQlyZXR1cm4gX3dvcmtzaGVldC5faHlwZXJMaW5rcy5HZXRWYWx1ZShfZnJvbVJvdywgX2Zyb21Db2wpOwotCQkJfQotCQkJc2V0Ci0JCQl7Ci0JCQkJX2NoYW5nZVByb3BNZXRob2QoU2V0X0h5cGVyTGluaywgdmFsdWUpOwotCQkJfQotCQl9Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIElmIHRoZSBjZWxscyBpbiB0aGUgcmFuZ2UgYXJlIG1lcmdlZC4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIGJvb2wgTWVyZ2UKLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJSXNSYW5nZVZhbGlkKCJtZXJnaW5nIik7Ci0JCQkJZm9yIChpbnQgY29sID0gX2Zyb21Db2w7IGNvbCA8PSBfdG9Db2w7IGNvbCsrKQotCQkJCXsKLQkJCQkJZm9yIChpbnQgcm93ID0gX2Zyb21Sb3c7IHJvdyA8PSBfdG9Sb3c7IHJvdysrKQotCQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihfd29ya3NoZWV0Lk1lcmdlZENlbGxzW3JvdywgY29sXT09bnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2lmICghX3dvcmtzaGVldC5fZmxhZ3MuR2V0RmxhZ1ZhbHVlKHJvdywgY29sLCBDZWxsRmxhZ3MuTWVyZ2VkKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgLy99Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlzZXQKLQkJCXsKLQkJCQlJc1JhbmdlVmFsaWQoIm1lcmdpbmciKTsKLQkJCQkvL1NldE1lcmdlKHZhbHVlLCBGaXJzdEFkZHJlc3MpOwotCQkJICAgIGlmICh2YWx1ZSkKLQkJCSAgICB7Ci0JCQkgICAgICAgIF93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuQWRkKG5ldyBFeGNlbEFkZHJlc3NCYXNlKEZpcnN0QWRkcmVzcyksIHRydWUpOwotCQkJICAgICAgICBpZiAoQWRkcmVzc2VzICE9IG51bGwpCi0JCQkgICAgICAgIHsKLQkJCSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhZGRyZXNzIGluIEFkZHJlc3NlcykKLQkJCSAgICAgICAgICAgIHsKLQkJCSAgICAgICAgICAgICAgICBfd29ya3NoZWV0Lk1lcmdlZENlbGxzLkFkZChhZGRyZXNzLCB0cnVlKTsKLQkJCSAgICAgICAgICAgICAgICAvL1NldE1lcmdlKHZhbHVlLCBhZGRyZXNzLl9hZGRyZXNzKTsKLQkJCSAgICAgICAgICAgIH0KLQkJCSAgICAgICAgfQotCQkJICAgIH0KLQkJCSAgICBlbHNlCi0JCQkgICAgewotCQkJICAgICAgICBfd29ya3NoZWV0Lk1lcmdlZENlbGxzLkNsZWFyKHRoaXMpOwotICAgICAgICAgICAgICAgICAgICBpZiAoQWRkcmVzc2VzICE9IG51bGwpCi0JCQkgICAgICAgIHsKLQkJCSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhZGRyZXNzIGluIEFkZHJlc3NlcykKLQkJCSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0Lk1lcmdlZENlbGxzLkNsZWFyKGFkZHJlc3MpOyA7Ci0JCQkgICAgICAgICAgICB9Ci0JCQkgICAgICAgIH0KLQkJCSAgICAgICAgCi0JCQkgICAgfQotCQkJfQotCQl9Ci0KLSAgICAgICAgLy9wcml2YXRlIHZvaWQgU2V0TWVyZ2UoYm9vbCB2YWx1ZSwgc3RyaW5nIGFkZHJlc3MpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBpZiAoIXZhbHVlKQotICAgICAgICAvLyAgICB7Ci0gICAgICAgIC8vICAgICAgICBpZiAoX3dvcmtzaGVldC5NZXJnZWRDZWxscy5MaXN0LkNvbnRhaW5zKGFkZHJlc3MpKQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIFNldENlbGxNZXJnZShmYWxzZSwgYWRkcmVzcyk7Ci0gICAgICAgIC8vICAgICAgICAgICAgX3dvcmtzaGVldC5NZXJnZWRDZWxscy5MaXN0LlJlbW92ZShhZGRyZXNzKTsKLSAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgLy8gICAgICAgIGVsc2UgaWYgKCFDaGVja01lcmdlRGlmZihmYWxzZSwgYWRkcmVzcykpCi0gICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIlJhbmdlIGlzIG5vdCBmdWxseSBtZXJnZWQuU3BlY2lmeSB0aGUgZXhhY3QgcmFuZ2UiKSk7Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy8gICAgZWxzZQotICAgICAgICAvLyAgICB7Ci0gICAgICAgIC8vICAgICAgICBpZiAoQ2hlY2tNZXJnZURpZmYoZmFsc2UsIGFkZHJlc3MpKQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIFNldENlbGxNZXJnZSh0cnVlLCBhZGRyZXNzKTsKLSAgICAgICAgLy8gICAgICAgICAgICBfd29ya3NoZWV0Lk1lcmdlZENlbGxzLkxpc3QuQWRkKGFkZHJlc3MpOwotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAvLyAgICAgICAgZWxzZQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIGlmICghX3dvcmtzaGVldC5NZXJnZWRDZWxscy5MaXN0LkNvbnRhaW5zKGFkZHJlc3MpKQotICAgICAgICAvLyAgICAgICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIkNlbGxzIGFyZSBhbHJlYWR5IG1lcmdlZCIpKTsKLSAgICAgICAgLy8gICAgICAgICAgICB9Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy99Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFNldCBhbiBhdXRvZmlsdGVyIGZvciB0aGUgcmFuZ2UKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIGJvb2wgQXV0b0ZpbHRlcgotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlJc1JhbmdlVmFsaWQoImF1dG9maWx0ZXIiKTsKLQkJCQlFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MgPSBfd29ya3NoZWV0LkF1dG9GaWx0ZXJBZGRyZXNzOwotCQkJCWlmIChhZGRyZXNzID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkJCQlpZiAoX2Zyb21Sb3cgPj0gYWRkcmVzcy5TdGFydC5Sb3cKLQkJCQkJCSYmCi0JCQkJCQlfdG9Sb3cgPD0gYWRkcmVzcy5FbmQuUm93Ci0JCQkJCQkmJgotCQkJCQkJX2Zyb21Db2wgPj0gYWRkcmVzcy5TdGFydC5Db2x1bW4KLQkJCQkJCSYmCi0JCQkJCQlfdG9Db2wgPD0gYWRkcmVzcy5FbmQuQ29sdW1uKQotCQkJCXsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXNldAotCQkJewotCQkJCUlzUmFuZ2VWYWxpZCgiYXV0b2ZpbHRlciIpOwotCQkJCV93b3Jrc2hlZXQuQXV0b0ZpbHRlckFkZHJlc3MgPSB0aGlzOwotCQkJCWlmIChfd29ya3NoZWV0Lk5hbWVzLkNvbnRhaW5zS2V5KCJfeGxubS5fRmlsdGVyRGF0YWJhc2UiKSkKLQkJCQl7Ci0JCQkJCV93b3Jrc2hlZXQuTmFtZXMuUmVtb3ZlKCJfeGxubS5fRmlsdGVyRGF0YWJhc2UiKTsKLQkJCQl9Ci0JCQkJdmFyIHJlc3VsdCA9IF93b3Jrc2hlZXQuTmFtZXMuQWRkKCJfeGxubS5fRmlsdGVyRGF0YWJhc2UiLCB0aGlzKTsKLQkJCQlyZXN1bHQuSXNOYW1lSGlkZGVuID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBJZiB0aGUgdmFsdWUgaXMgaW4gcmljaHRleHQgZm9ybWF0LgotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgYm9vbCBJc1JpY2hUZXh0Ci0JCXsKLQkJCWdldAotCQkJewotCQkJCUlzUmFuZ2VWYWxpZCgicmljaHRleHQiKTsKLQkJCQlyZXR1cm4gX3dvcmtzaGVldC5fZmxhZ3MuR2V0RmxhZ1ZhbHVlKF9mcm9tUm93LCBfZnJvbUNvbCxDZWxsRmxhZ3MuUmljaFRleHQpOwotCQkJfQotCQkJc2V0Ci0JCQl7Ci0JCQkJX2NoYW5nZVByb3BNZXRob2QoU2V0X0lzUmljaFRleHQsIHZhbHVlKTsKLQkJCX0KLQkJfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBJcyB0aGUgcmFuZ2UgYSBwYXJ0IG9mIGFuIEFycmF5Zm9ybXVsYQotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgYm9vbCBJc0FycmF5Rm9ybXVsYQotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlJc1JhbmdlVmFsaWQoImFycmF5Zm9ybXVsYXMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5fZmxhZ3MuR2V0RmxhZ1ZhbHVlKF9mcm9tUm93LCBfZnJvbUNvbCwgQ2VsbEZsYWdzLkFycmF5Rm9ybXVsYSk7Ci0JCQl9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY2hhbmdlUHJvcE1ldGhvZChTZXRfSXNBcnJheUZvcm11bGEsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCQlFeGNlbFJpY2hUZXh0Q29sbGVjdGlvbiBfcnRjID0gbnVsbDsKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQ2VsbCB2YWx1ZSBpcyByaWNodGV4dCBmb3JtYXR0ZWQuIAotCQkvLy8gUmljaHRleHQtcHJvcGVydHkgb25seSBhcHBseSB0byB0aGUgbGVmdC10b3AgY2VsbCBvZiB0aGUgcmFuZ2UuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBFeGNlbFJpY2hUZXh0Q29sbGVjdGlvbiBSaWNoVGV4dAotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlJc1JhbmdlVmFsaWQoInJpY2h0ZXh0Iik7Ci0JCQkJaWYgKF9ydGMgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCV9ydGMgPSBHZXRSaWNoVGV4dChfZnJvbVJvdywgX2Zyb21Db2wpOwotCQkJCX0KLQkJCQlyZXR1cm4gX3J0YzsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgRXhjZWxSaWNoVGV4dENvbGxlY3Rpb24gR2V0UmljaFRleHQoaW50IHJvdywgaW50IGNvbCkKLQkJewotCQkJWG1sRG9jdW1lbnQgeG1sID0gbmV3IFhtbERvY3VtZW50KCk7Ci0gICAgICAgICAgICB2YXIgdiA9IF93b3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShyb3csIGNvbCk7Ci0gICAgICAgICAgICB2YXIgaXNSdCA9IF93b3Jrc2hlZXQuX2ZsYWdzLkdldEZsYWdWYWx1ZShyb3csIGNvbCwgQ2VsbEZsYWdzLlJpY2hUZXh0KTsKLSAgICAgICAgICAgIGlmICh2ICE9IG51bGwpCi0JCQl7Ci0JCQkJaWYgKGlzUnQpCi0JCQkJewotICAgICAgICAgICAgICAgICAgICBYbWxIZWxwZXIuTG9hZFhtbFNhZmUoeG1sLCAiPGQ6c2kgeG1sbnM6ZD1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiID4iICsgdi5Ub1N0cmluZygpICsgIjwvZDpzaT4iLCBFbmNvZGluZy5VVEY4KTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJeG1sLkxvYWRYbWwoIjxkOnNpIHhtbG5zOmQ9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW5cIiA+PGQ6cj48ZDp0PiIgKyBTZWN1cml0eUVsZW1lbnQuRXNjYXBlKHYuVG9TdHJpbmcoKSkgKyAiPC9kOnQ+PC9kOnI+PC9kOnNpPiIpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQl4bWwuTG9hZFhtbCgiPGQ6c2kgeG1sbnM6ZD1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiIC8+Iik7Ci0JCQl9Ci0JCQl2YXIgcnRjID0gbmV3IEV4Y2VsUmljaFRleHRDb2xsZWN0aW9uKF93b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciwgeG1sLlNlbGVjdFNpbmdsZU5vZGUoImQ6c2kiLCBfd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpLCB0aGlzKTsKLQkJCXJldHVybiBydGM7Ci0JCX0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gcmV0dXJucyB0aGUgY29tbWVudCBvYmplY3Qgb2YgdGhlIGZpcnN0IGNlbGwgaW4gdGhlIHJhbmdlCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBFeGNlbENvbW1lbnQgQ29tbWVudAotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlJc1JhbmdlVmFsaWQoImNvbW1lbnRzIik7Ci0JCQkJdWxvbmcgY2VsbElEID0gR2V0Q2VsbElEKF93b3Jrc2hlZXQuU2hlZXRJRCwgX2Zyb21Sb3csIF9mcm9tQ29sKTsKLQkJCQlpZiAoX3dvcmtzaGVldC5Db21tZW50cy5fY29tbWVudHMuQ29udGFpbnNLZXkoY2VsbElEKSkKLQkJCQl7Ci0JCQkJCXJldHVybiBfd29ya3NoZWV0Ll9jb21tZW50cy5fY29tbWVudHNbY2VsbElEXSBhcyBFeGNlbENvbW1lbnQ7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFdvcmtTaGVldCBvYmplY3QgCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBFeGNlbFdvcmtzaGVldCBXb3Jrc2hlZXQKLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJcmV0dXJuIF93b3Jrc2hlZXQ7Ci0JCQl9Ci0JCX0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQWRkcmVzcyBpbmNsdWRpbmcgc2hlZXRuYW1lCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBzdHJpbmcgRnVsbEFkZHJlc3MKLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJc3RyaW5nIGZ1bGxBZGRyZXNzID0gR2V0RnVsbEFkZHJlc3MoX3dvcmtzaGVldC5OYW1lLCBfYWRkcmVzcyk7Ci0JCQkJaWYgKEFkZHJlc3NlcyAhPSBudWxsKQotCQkJCXsKLQkJCQkJZm9yZWFjaCAodmFyIGEgaW4gQWRkcmVzc2VzKQotCQkJCQl7Ci0JCQkJCQlmdWxsQWRkcmVzcyArPSAiLCIgKyBHZXRGdWxsQWRkcmVzcyhfd29ya3NoZWV0Lk5hbWUsIGEuQWRkcmVzcyk7IDsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZnVsbEFkZHJlc3M7Ci0JCQl9Ci0JCX0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQWRkcmVzcyBpbmNsdWRpbmcgc2hlZXRuYW1lCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBzdHJpbmcgRnVsbEFkZHJlc3NBYnNvbHV0ZQotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlzdHJpbmcgd2J3c1JlZiA9IHN0cmluZy5Jc051bGxPckVtcHR5KGJhc2UuX3diKSA/IGJhc2UuX3dzIDogIlsiICsgYmFzZS5fd2IuUmVwbGFjZSgiJyIsICInJyIpICsgIl0iICsgX3dzOwotCQkJCXN0cmluZyBmdWxsQWRkcmVzcyA9IEdldEZ1bGxBZGRyZXNzKHdid3NSZWYsIEdldEFkZHJlc3MoX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCwgdHJ1ZSkpOwotCQkJCWlmIChBZGRyZXNzZXMgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWZvcmVhY2ggKHZhciBhIGluIEFkZHJlc3NlcykKLQkJCQkJewotCQkJCQkJZnVsbEFkZHJlc3MgKz0gIiwiICsgR2V0RnVsbEFkZHJlc3Mod2J3c1JlZiwgR2V0QWRkcmVzcyhhLlN0YXJ0LlJvdywgYS5TdGFydC5Db2x1bW4sIGEuRW5kLlJvdywgYS5FbmQuQ29sdW1uLCB0cnVlKSk7IDsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZnVsbEFkZHJlc3M7Ci0JCQl9Ci0JCX0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcmVzcyBpbmNsdWRpbmcgc2hlZXRuYW1lCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIHN0cmluZyBGdWxsQWRkcmVzc0Fic29sdXRlTm9GdWxsUm93Q29sCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyB3YndzUmVmID0gc3RyaW5nLklzTnVsbE9yRW1wdHkoYmFzZS5fd2IpID8gYmFzZS5fd3MgOiAiWyIgKyBiYXNlLl93Yi5SZXBsYWNlKCInIiwgIicnIikgKyAiXSIgKyBfd3M7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGZ1bGxBZGRyZXNzID0gR2V0RnVsbEFkZHJlc3Mod2J3c1JlZiwgR2V0QWRkcmVzcyhfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sLCB0cnVlKSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmIChBZGRyZXNzZXMgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhIGluIEFkZHJlc3NlcykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZnVsbEFkZHJlc3MgKz0gIiwiICsgR2V0RnVsbEFkZHJlc3Mod2J3c1JlZiwgR2V0QWRkcmVzcyhhLlN0YXJ0LlJvdywgYS5TdGFydC5Db2x1bW4sIGEuRW5kLlJvdywgYS5FbmQuQ29sdW1uLCB0cnVlKSxmYWxzZSk7IDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZnVsbEFkZHJlc3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJI2VuZHJlZ2lvbgotCQkjcmVnaW9uIFByaXZhdGUgTWV0aG9kcwotICAgICAgICAvLy8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vLy8gQ2hlY2sgaWYgdGhlIHJhbmdlIGlzIHBhcnRseSBtZXJnZWQKLSAgICAgICAgLy8vLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8vLyA8cGFyYW0gbmFtZT0ic3RhcnRWYWx1ZSI+dGhlIHN0YXJ0aW5nIHZhbHVlPC9wYXJhbT4KLSAgICAgICAgLy8vLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPnRoZSBhZGRyZXNzPC9wYXJhbT4KLSAgICAgICAgLy8vLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICAvL3ByaXZhdGUgYm9vbCBDaGVja01lcmdlRGlmZihib29sIHN0YXJ0VmFsdWUsIHN0cmluZyBhZGRyZXNzKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgRXhjZWxBZGRyZXNzIGEgPSBuZXcgRXhjZWxBZGRyZXNzKGFkZHJlc3MpOwotICAgICAgICAvLyAgICBmb3IgKGludCBjb2wgPSBhLmNvbHVtbjsgY29sIDw9IGEuX3RvQ29sOyBjb2wrKykKLSAgICAgICAgLy8gICAgewotICAgICAgICAvLyAgICAgICAgZm9yIChpbnQgcm93ID0gYS5fZnJvbVJvdzsgcm93IDw9IGEuX3RvUm93OyByb3crKykKLSAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICBpZiAoX3dvcmtzaGVldC5fZmxhZ3MuR2V0RmxhZ1ZhbHVlKHJvdywgY29sLCBDZWxsRmxhZ3MuTWVyZ2VkKSAhPSBzdGFydFZhbHVlKQotICAgICAgICAvLyAgICAgICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAvLyAgICAgICAgICAgIH0KLSAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgLy8gICAgfQotICAgICAgICAvLyAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgLy99Ci0gICAgICAgIC8vLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8vLyBTZXQgdGhlIG1lcmdlIGZsYWcgZm9yIHRoZSByYW5nZQotICAgICAgICAvLy8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+Ci0gICAgICAgIC8vaW50ZXJuYWwgdm9pZCBTZXRDZWxsTWVyZ2UoYm9vbCB2YWx1ZSwgc3RyaW5nIGFkZHJlc3MpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBFeGNlbEFkZHJlc3MgYSA9IG5ldyBFeGNlbEFkZHJlc3MoYWRkcmVzcyk7Ci0gICAgICAgIC8vICAgIGZvciAoaW50IGNvbCA9IGEuY29sdW1uOyBjb2wgPD0gYS5fdG9Db2w7IGNvbCsrKQotICAgICAgICAvLyAgICB7Ci0gICAgICAgIC8vICAgICAgICBmb3IgKGludCByb3cgPSBhLl9mcm9tUm93OyByb3cgPD0gYS5fdG9Sb3c7IHJvdysrKQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIF93b3Jrc2hlZXQuX2ZsYWdzLlNldEZsYWdWYWx1ZShyb3csIGNvbCx2YWx1ZSxDZWxsRmxhZ3MuTWVyZ2VkKTsKLSAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgLy8gICAgfQotICAgICAgICAvL30KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gU2V0IHRoZSB2YWx1ZSB3aXRob3V0IGFsdGVyaW5nIHRoZSByaWNodGV4dCBwcm9wZXJ0eQotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj50aGUgdmFsdWU8L3BhcmFtPgotCQlpbnRlcm5hbCB2b2lkIFNldFZhbHVlUmljaFRleHQob2JqZWN0IHZhbHVlKQotCQl7Ci0JCQlpZiAoX2Zyb21Sb3cgPT0gMSAmJiBfZnJvbUNvbCA9PSAxICYmIF90b1JvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cyAmJiBfdG9Db2wgPT0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpICAvL0Z1bGwgc2hlZXQgKGV4IHdzLkNlbGxzLlZhbHVlPTApLiBTZXQgdmFsdWUgZm9yIEExIG9ubHkgdG8gYXZvaWQgaGFuZ2luZyAKLQkJCXsKLQkJCQkvL193b3Jrc2hlZXQuQ2VsbCgxLCAxKS5TZXRWYWx1ZVJpY2hUZXh0KHZhbHVlKTsKLSAgICAgICAgICAgICAgICBTZXRWYWx1ZSh2YWx1ZSwgMSwgMSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0gICAgICAgICAgICAgICAgLy9mb3IgKGludCBjb2wgPSBfZnJvbUNvbDsgY29sIDw9IF90b0NvbDsgY29sKyspCi0gICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgLy8gICAgZm9yIChpbnQgcm93ID0gX2Zyb21Sb3c7IHJvdyA8PSBfdG9Sb3c7IHJvdysrKQotICAgICAgICAgICAgICAgIC8vICAgIHsKLQkJCQkJCS8vX3dvcmtzaGVldC5DZWxsKHJvdywgY29sKS5TZXRWYWx1ZVJpY2hUZXh0KHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFZhbHVlKHZhbHVlLCBfZnJvbVJvdyxfZnJvbUNvbCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vfQotCQkJCS8vfQotCQkJfQotCQl9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldFZhbHVlKG9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkKLSAgICAgICAgewotICAgICAgICAgICAgX3dvcmtzaGVldC5TZXRWYWx1ZShyb3csIGNvbCwgdmFsdWUpOwotICAgICAgICAgICAvLyBpZiAodmFsdWUgaXMgc3RyaW5nKSBfd29ya3NoZWV0Ll90eXBlcy5TZXRWYWx1ZShyb3csIGNvbCwgIlMiKTsgZWxzZSBfd29ya3NoZWV0Ll90eXBlcy5TZXRWYWx1ZShyb3csIGNvbCwgIiIpOwotICAgICAgICAgICAgX3dvcmtzaGVldC5fZm9ybXVsYXMuU2V0VmFsdWUocm93LCBjb2wsICIiKTsKLSAgICAgICAgfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBSZW1vdmVzIGEgc2hhcmVkIGZvcm11bGEKLQkJLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy9wcml2YXRlIHZvaWQgUmVtb3ZlRm9ybXVscyhFeGNlbEFkZHJlc3MgYWRkcmVzcykKLSAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIExpc3Q8aW50PiByZW1vdmVkID0gbmV3IExpc3Q8aW50PigpOwotICAgICAgICAvLyAgICBpbnQgZkZyb21Sb3csIGZGcm9tQ29sLCBmVG9Sb3csIGZUb0NvbDsKLSAgICAgICAgLy8gICAgZm9yZWFjaCAoaW50IGluZGV4IGluIF93b3Jrc2hlZXQuX3NoYXJlZEZvcm11bGFzLktleXMpCi0gICAgICAgIC8vICAgIHsKLSAgICAgICAgLy8gICAgICAgIEV4Y2VsV29ya3NoZWV0LkZvcm11bGFzIGYgPSBfd29ya3NoZWV0Ll9zaGFyZWRGb3JtdWxhc1tpbmRleF07Ci0gICAgICAgIC8vICAgICAgICBFeGNlbENlbGxCYXNlLkdldFJvd0NvbEZyb21BZGRyZXNzKGYuQWRkcmVzcywgb3V0IGZGcm9tUm93LCBvdXQgZkZyb21Db2wsIG91dCBmVG9Sb3csIG91dCBmVG9Db2wpOwotICAgICAgICAvLyAgICAgICAgaWYgKCgoZkZyb21Db2wgPj0gYWRkcmVzcy5TdGFydC5Db2x1bW4gJiYgZkZyb21Db2wgPD0gYWRkcmVzcy5FbmQuQ29sdW1uKSB8fAotICAgICAgICAvLyAgICAgICAgICAgICAoZlRvQ29sID49IGFkZHJlc3MuU3RhcnQuQ29sdW1uICYmIGZUb0NvbCA8PSBhZGRyZXNzLkVuZC5Db2x1bW4pKSAmJgotICAgICAgICAvLyAgICAgICAgICAgICAoKGZGcm9tUm93ID49IGFkZHJlc3MuU3RhcnQuUm93ICYmIGZGcm9tUm93IDw9IGFkZHJlc3MuRW5kLlJvdykgfHwKLSAgICAgICAgLy8gICAgICAgICAgICAgKGZUb1JvdyA+PSBhZGRyZXNzLlN0YXJ0LlJvdyAmJiBmVG9Sb3cgPD0gYWRkcmVzcy5FbmQuUm93KSkpCi0gICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgZm9yIChpbnQgY29sID0gZkZyb21Db2w7IGNvbCA8PSBmVG9Db2w7IGNvbCsrKQotICAgICAgICAvLyAgICAgICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gZkZyb21Sb3c7IHJvdyA8PSBmVG9Sb3c7IHJvdysrKQotICAgICAgICAvLyAgICAgICAgICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll9mb3JtdWxhcy5TZXRWYWx1ZShyb3csIGNvbCwgaW50Lk1pblZhbHVlKTsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgfQotICAgICAgICAvLyAgICAgICAgICAgIH0KLSAgICAgICAgLy8gICAgICAgICAgICByZW1vdmVkLkFkZChpbmRleCk7Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy8gICAgZm9yZWFjaCAoaW50IGluZGV4IGluIHJlbW92ZWQpCi0gICAgICAgIC8vICAgIHsKLSAgICAgICAgLy8gICAgICAgIF93b3Jrc2hlZXQuX3NoYXJlZEZvcm11bGFzLlJlbW92ZShpbmRleCk7Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy99Ci0JCWludGVybmFsIHZvaWQgU2V0U2hhcmVkRm9ybXVsYUlEKGludCBpZCkKLQkJewotCQkJZm9yIChpbnQgY29sID0gX2Zyb21Db2w7IGNvbCA8PSBfdG9Db2w7IGNvbCsrKQotCQkJewotCQkJCWZvciAoaW50IHJvdyA9IF9mcm9tUm93OyByb3cgPD0gX3RvUm93OyByb3crKykKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX2Zvcm11bGFzLlNldFZhbHVlKHJvdywgY29sLCBpZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXByaXZhdGUgdm9pZCBDaGVja0FuZFNwbGl0U2hhcmVkRm9ybXVsYShFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MpCi0JCXsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGFkZHJlc3MuX2Zyb21Db2w7IGNvbCA8PSBhZGRyZXNzLl90b0NvbDsgY29sKyspCi0JCQl7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gYWRkcmVzcy5fZnJvbVJvdzsgcm93IDw9IGFkZHJlc3MuX3RvUm93OyByb3crKykKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBmID0gX3dvcmtzaGVldC5fZm9ybXVsYXMuR2V0VmFsdWUocm93LCBjb2wpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZiBpcyBpbnQgJiYgKGludClmID49IDApCi0JCQkJCXsKLQkJCQkJCVNwbGl0Rm9ybXVsYXMoYWRkcmVzcyk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgU3BsaXRGb3JtdWxhcyhFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MpCi0JCXsKLQkJCUxpc3Q8aW50PiBmb3JtdWxhcyA9IG5ldyBMaXN0PGludD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGFkZHJlc3MuX2Zyb21Db2w7IGNvbCA8PSBhZGRyZXNzLl90b0NvbDsgY29sKyspCi0JCQl7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gYWRkcmVzcy5fZnJvbVJvdzsgcm93IDw9IGFkZHJlc3MuX3RvUm93OyByb3crKykKLQkJCQl7Ci0JCQkJCXZhciBmID0gX3dvcmtzaGVldC5fZm9ybXVsYXMuR2V0VmFsdWUocm93LCBjb2wpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZiBpcyBpbnQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCA9IChpbnQpZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCA+PSAwICYmICFmb3JtdWxhcy5Db250YWlucyhpZCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXQuX3NoYXJlZEZvcm11bGFzW2lkXS5Jc0FycmF5ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsaWRlKF93b3Jrc2hlZXQuQ2VsbHNbX3dvcmtzaGVldC5fc2hhcmVkRm9ybXVsYXNbaWRdLkFkZHJlc3NdKSA9PSBlQWRkcmVzc0NvbGxpdGlvbi5QYXJ0bHkpIC8vIElmIHRoZSBmb3JtdWxhIGlzIGFuIGFycmF5IGZvcm11bGEgYW5kIGl0cyBvbiB0aGUgaW5zaWRlIHRoZSBvdmVyd3JpdGluZyByYW5nZSB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuIG5vdCBvdmVyd3JpdGUgYSBwYXJ0IG9mIGFuIGFycmF5LWZvcm11bGEiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm11bGFzLkFkZChpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAotCQkJCX0KLQkJCX0KLQotCQkJZm9yZWFjaCAoaW50IGl4IGluIGZvcm11bGFzKQotCQkJewotICAgICAgICAgICAgICAgIFNwbGl0Rm9ybXVsYShhZGRyZXNzLCBpeCk7Ci0JCQl9Ci0gICAgICAgIAotICAgICAgICAgICAgLy8vL0NsZWFyIGFueSBmb3JtdWxhIHJlZmVyZW5jZXMgaW5zaWRlIHRoZSByZWZlcmVkIHJhbmdlCi0gICAgICAgICAgICAvL193b3Jrc2hlZXQuX2Zvcm11bGFzLkNsZWFyKGFkZHJlc3MuX2Zyb21Sb3csIGFkZHJlc3MuX3RvUm93LCBhZGRyZXNzLl90b1JvdyAtIGFkZHJlc3MuX2Zyb21Sb3cgKyAxLCBhZGRyZXNzLl90b0NvbCAtIGFkZHJlc3MuY29sdW1uICsgMSk7Ci0gICAgICAgIH0KLQotCQlwcml2YXRlIHZvaWQgU3BsaXRGb3JtdWxhKEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcywgaW50IGl4KQotCQl7Ci0JCQl2YXIgZiA9IF93b3Jrc2hlZXQuX3NoYXJlZEZvcm11bGFzW2l4XTsKLQkJCXZhciBmUmFuZ2UgPSBfd29ya3NoZWV0LkNlbGxzW2YuQWRkcmVzc107Ci0gICAgICAgICAgICB2YXIgY29sbGlkZSA9IGFkZHJlc3MuQ29sbGlkZShmUmFuZ2UpOwotCi0gICAgICAgICAgICAvL1RoZSBmb3JtdWxhIGlzIGluc2lkZSB0aGUgY3VycmVuY3QgcmFuZ2UsIHJlbW92ZSBpdAotCQkJaWYgKGNvbGxpZGUgPT0gZUFkZHJlc3NDb2xsaXRpb24uRXF1YWwgfHwgY29sbGlkZSA9PSBlQWRkcmVzc0NvbGxpdGlvbi5JbnNpZGUpCi0JCQl7Ci0JCQkJX3dvcmtzaGVldC5fc2hhcmVkRm9ybXVsYXMuUmVtb3ZlKGl4KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0JCQkJLy9mUmFuZ2UuU2V0U2hhcmVkRm9ybXVsYUlEKGludC5NaW5WYWx1ZSk7IAotCQkJfQotICAgICAgICAgICAgdmFyIGZpcnN0Q2VsbENvbGxpZGUgPSBhZGRyZXNzLkNvbGxpZGUobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoZlJhbmdlLl9mcm9tUm93LCBmUmFuZ2UuX2Zyb21Db2wsIGZSYW5nZS5fZnJvbVJvdywgZlJhbmdlLl9mcm9tQ29sKSk7Ci0gICAgICAgICAgICBpZiAoY29sbGlkZSA9PSBlQWRkcmVzc0NvbGxpdGlvbi5QYXJ0bHkgJiYgKGZpcnN0Q2VsbENvbGxpZGUgPT0gZUFkZHJlc3NDb2xsaXRpb24uSW5zaWRlIHx8IGZpcnN0Q2VsbENvbGxpZGUgPT0gZUFkZHJlc3NDb2xsaXRpb24uRXF1YWwpKSAvL0RvIHdlIG5lZWQgdG8gc3BsaXQ/IE9ubHkgaWYgdGhlIGZ1bmN0aW9ucyBmaXJzdCByb3cgaXMgaW5zaWRlIHRoZSBuZXcgcmFuZ2UuCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy9UaGUgZm9ybXVsYSBwYXJ0bHkgY29sbGlkZXMgd2l0aCB0aGUgY3VycmVudCByYW5nZQotICAgICAgICAgICAgICAgIGJvb2wgZklzU2V0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGZvcm11bGFSMUMxID0gZlJhbmdlLkZvcm11bGFSMUMxOwotICAgICAgICAgICAgICAgIC8vVG9wIFJhbmdlCi0gICAgICAgICAgICAgICAgaWYgKGZSYW5nZS5fZnJvbVJvdyA8IF9mcm9tUm93KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZi5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGZSYW5nZS5fZnJvbVJvdywgZlJhbmdlLl9mcm9tQ29sLCBfZnJvbVJvdyAtIDEsIGZSYW5nZS5fdG9Db2wpOwotICAgICAgICAgICAgICAgICAgICBmSXNTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL0xlZnQgUmFuZ2UKLSAgICAgICAgICAgICAgICBpZiAoZlJhbmdlLl9mcm9tQ29sIDwgYWRkcmVzcy5fZnJvbUNvbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmSXNTZXQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBuZXcgRXhjZWxXb3Jrc2hlZXQuRm9ybXVsYXMoU291cmNlQ29kZVRva2VuaXplci5EZWZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYuSW5kZXggPSBfd29ya3NoZWV0LkdldE1heFNoYXJlRnVuY3Rpb25JbmRleChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmLlN0YXJ0Q29sID0gZlJhbmdlLl9mcm9tQ29sOwotICAgICAgICAgICAgICAgICAgICAgICAgZi5Jc0FycmF5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll9zaGFyZWRGb3JtdWxhcy5BZGQoZi5JbmRleCwgZik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmSXNTZXQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmUmFuZ2UuX2Zyb21Sb3cgPCBhZGRyZXNzLl9mcm9tUm93KQotICAgICAgICAgICAgICAgICAgICAgICAgZi5TdGFydFJvdyA9IGFkZHJlc3MuX2Zyb21Sb3c7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZi5TdGFydFJvdyA9IGZSYW5nZS5fZnJvbVJvdzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoZlJhbmdlLl90b1JvdyA8IGFkZHJlc3MuX3RvUm93KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmLkFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZi5TdGFydFJvdywgZi5TdGFydENvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJhbmdlLl90b1JvdywgYWRkcmVzcy5fZnJvbUNvbCAtIDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZi5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGYuU3RhcnRSb3csIGYuU3RhcnRDb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuX3RvUm93LCBhZGRyZXNzLl9mcm9tQ29sIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZi5Gb3JtdWxhID0gVHJhbnNsYXRlRnJvbVIxQzEoZm9ybXVsYVIxQzEsIGYuU3RhcnRSb3csIGYuU3RhcnRDb2wpOwotICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzW2YuQWRkcmVzc10uU2V0U2hhcmVkRm9ybXVsYUlEKGYuSW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL1JpZ2h0IFJhbmdlCi0gICAgICAgICAgICAgICAgaWYgKGZSYW5nZS5fdG9Db2wgPiBhZGRyZXNzLl90b0NvbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmSXNTZXQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBuZXcgRXhjZWxXb3Jrc2hlZXQuRm9ybXVsYXMoU291cmNlQ29kZVRva2VuaXplci5EZWZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYuSW5kZXggPSBfd29ya3NoZWV0LkdldE1heFNoYXJlRnVuY3Rpb25JbmRleChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmLklzQXJyYXkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX3NoYXJlZEZvcm11bGFzLkFkZChmLkluZGV4LCBmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZJc1NldCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZi5TdGFydENvbCA9IGFkZHJlc3MuX3RvQ29sICsgMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MuX2Zyb21Sb3cgPCBmUmFuZ2UuX2Zyb21Sb3cpCi0gICAgICAgICAgICAgICAgICAgICAgICBmLlN0YXJ0Um93ID0gZlJhbmdlLl9mcm9tUm93OwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYuU3RhcnRSb3cgPSBhZGRyZXNzLl9mcm9tUm93OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZSYW5nZS5fdG9Sb3cgPCBhZGRyZXNzLl90b1JvdykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZi5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGYuU3RhcnRSb3csIGYuU3RhcnRDb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSYW5nZS5fdG9Sb3csIGZSYW5nZS5fdG9Db2wpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZi5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGYuU3RhcnRSb3csIGYuU3RhcnRDb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuX3RvUm93LCBmUmFuZ2UuX3RvQ29sKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmLkZvcm11bGEgPSBUcmFuc2xhdGVGcm9tUjFDMShmb3JtdWxhUjFDMSwgZi5TdGFydFJvdywgZi5TdGFydENvbCk7Ci0gICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbZi5BZGRyZXNzXS5TZXRTaGFyZWRGb3JtdWxhSUQoZi5JbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vQm90dG9tIFJhbmdlCi0gICAgICAgICAgICAgICAgaWYgKGZSYW5nZS5fdG9Sb3cgPiBhZGRyZXNzLl90b1JvdykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmSXNTZXQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBuZXcgRXhjZWxXb3Jrc2hlZXQuRm9ybXVsYXMoU291cmNlQ29kZVRva2VuaXplci5EZWZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYuSW5kZXggPSBfd29ya3NoZWV0LkdldE1heFNoYXJlRnVuY3Rpb25JbmRleChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmLklzQXJyYXkgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX3NoYXJlZEZvcm11bGFzLkFkZChmLkluZGV4LCBmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGYuU3RhcnRDb2wgPSBmUmFuZ2UuX2Zyb21Db2w7Ci0gICAgICAgICAgICAgICAgICAgIGYuU3RhcnRSb3cgPSBfdG9Sb3cgKyAxOwotCi0gICAgICAgICAgICAgICAgICAgIGYuRm9ybXVsYSA9IFRyYW5zbGF0ZUZyb21SMUMxKGZvcm11bGFSMUMxLCBmLlN0YXJ0Um93LCBmLlN0YXJ0Q29sKTsKLQotICAgICAgICAgICAgICAgICAgICBmLkFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZi5TdGFydFJvdywgZi5TdGFydENvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmFuZ2UuX3RvUm93LCBmUmFuZ2UuX3RvQ29sKTsKLSAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1tmLkFkZHJlc3NdLlNldFNoYXJlZEZvcm11bGFJRChmLkluZGV4KTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQkJfQotCQlwcml2YXRlIG9iamVjdCBDb252ZXJ0RGF0YShFeGNlbFRleHRGb3JtYXQgRm9ybWF0LCBzdHJpbmcgdiwgaW50IGNvbCwgYm9vbCBpc1RleHQpCi0JCXsKLQkJCWlmIChpc1RleHQgJiYgKEZvcm1hdC5EYXRhVHlwZXMgPT0gbnVsbCB8fCBGb3JtYXQuRGF0YVR5cGVzLkxlbmd0aCA8IGNvbCkpIHJldHVybiB2OwotCi0JCQlkb3VibGUgZDsKLQkJCURhdGVUaW1lIGR0OwotCQkJaWYgKEZvcm1hdC5EYXRhVHlwZXMgPT0gbnVsbCB8fCBGb3JtYXQuRGF0YVR5cGVzLkxlbmd0aCA8PSBjb2wgfHwgRm9ybWF0LkRhdGFUeXBlc1tjb2xdID09IGVEYXRhVHlwZXMuVW5rbm93bikKLQkJCXsKLQkJCQlzdHJpbmcgdjIgPSB2LkVuZHNXaXRoKCIlIikgPyB2LlN1YnN0cmluZygwLCB2Lkxlbmd0aCAtIDEpIDogdjsKLQkJCQlpZiAoZG91YmxlLlRyeVBhcnNlKHYyLCBOdW1iZXJTdHlsZXMuQW55LCBGb3JtYXQuQ3VsdHVyZSwgb3V0IGQpKQotCQkJCXsKLQkJCQkJaWYgKHYyID09IHYpCi0JCQkJCXsKLQkJCQkJCXJldHVybiBkOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJcmV0dXJuIGQgLyAxMDA7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKERhdGVUaW1lLlRyeVBhcnNlKHYsIEZvcm1hdC5DdWx0dXJlLCBEYXRlVGltZVN0eWxlcy5Ob25lLCBvdXQgZHQpKQotCQkJCXsKLQkJCQkJcmV0dXJuIGR0OwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlyZXR1cm4gdjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJc3dpdGNoIChGb3JtYXQuRGF0YVR5cGVzW2NvbF0pCi0JCQkJewotCQkJCQljYXNlIGVEYXRhVHlwZXMuTnVtYmVyOgotCQkJCQkJaWYgKGRvdWJsZS5UcnlQYXJzZSh2LCBOdW1iZXJTdHlsZXMuQW55LCBGb3JtYXQuQ3VsdHVyZSwgb3V0IGQpKQotCQkJCQkJewotCQkJCQkJCXJldHVybiBkOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXJldHVybiB2OwotCQkJCQkJfQotCQkJCQljYXNlIGVEYXRhVHlwZXMuRGF0ZVRpbWU6Ci0JCQkJCQlpZiAoRGF0ZVRpbWUuVHJ5UGFyc2UodiwgRm9ybWF0LkN1bHR1cmUsIERhdGVUaW1lU3R5bGVzLk5vbmUsIG91dCBkdCkpCi0JCQkJCQl7Ci0JCQkJCQkJcmV0dXJuIGR0OwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXJldHVybiB2OwotCQkJCQkJfQotCQkJCQljYXNlIGVEYXRhVHlwZXMuUGVyY2VudDoKLQkJCQkJCXN0cmluZyB2MiA9IHYuRW5kc1dpdGgoIiUiKSA/IHYuU3Vic3RyaW5nKDAsIHYuTGVuZ3RoIC0gMSkgOiB2OwotCQkJCQkJaWYgKGRvdWJsZS5UcnlQYXJzZSh2MiwgTnVtYmVyU3R5bGVzLkFueSwgRm9ybWF0LkN1bHR1cmUsIG91dCBkKSkKLQkJCQkJCXsKLQkJCQkJCQlyZXR1cm4gZCAvIDEwMDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlyZXR1cm4gdjsKLQkJCQkJCX0KLQotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuIHY7Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJI2VuZHJlZ2lvbgotCQkjcmVnaW9uIFB1YmxpYyBNZXRob2RzCi0JCSNyZWdpb24gQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIENvbmRpdGlvbmFsIEZvcm1hdHRpbmcgZm9yIHRoaXMgcmFuZ2UuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBJUmFuZ2VDb25kaXRpb25hbEZvcm1hdHRpbmcgQ29uZGl0aW9uYWxGb3JtYXR0aW5nCi0JCXsKLQkJCWdldAotCQkJewotCQkJCXJldHVybiBuZXcgUmFuZ2VDb25kaXRpb25hbEZvcm1hdHRpbmcoX3dvcmtzaGVldCwgbmV3IEV4Y2VsQWRkcmVzcyhBZGRyZXNzKSk7Ci0JCQl9Ci0JCX0KLQkJI2VuZHJlZ2lvbgotCQkjcmVnaW9uIERhdGFWYWxpZGF0aW9uCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIERhdGEgdmFsaWRhdGlvbiBmb3IgdGhpcyByYW5nZS4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIElSYW5nZURhdGFWYWxpZGF0aW9uIERhdGFWYWxpZGF0aW9uCi0JCXsKLQkJCWdldAotCQkJewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2VEYXRhVmFsaWRhdGlvbihfd29ya3NoZWV0LCBBZGRyZXNzKTsKLQkJCX0KLQkJfQotCQkjZW5kcmVnaW9uCi0gICAgICAgICNyZWdpb24gTG9hZEZyb21EYXRhUmVhZGVyCi0JICAgIC8vLyA8c3VtbWFyeT4KLQkgICAgLy8vIExvYWQgdGhlIGRhdGEgZnJvbSB0aGUgZGF0YXJlYWRlciBzdGFydGluZyBmcm9tIHRoZSB0b3AgbGVmdCBjZWxsIG9mIHRoZSByYW5nZQotCSAgICAvLy8gPC9zdW1tYXJ5PgotCSAgICAvLy8gPHBhcmFtIG5hbWU9IlJlYWRlciI+VGhlIGRhdGFyZWFkZXIgdG8gbG9hZGZyb208L3BhcmFtPgotCSAgICAvLy8gPHBhcmFtIG5hbWU9IlByaW50SGVhZGVycyI+UHJpbnQgdGhlIGNvbHVtbiBjYXB0aW9uIHByb3BlcnR5IChpZiBzZXQpIG9yIHRoZSBjb2x1bW5uYW1lIHByb3BlcnR5IGlmIG5vdCwgb24gZmlyc3Qgcm93PC9wYXJhbT4KLQkgICAgLy8vIDxwYXJhbSBuYW1lPSJUYWJsZU5hbWUiPlRoZSBuYW1lIG9mIHRoZSB0YWJsZTwvcGFyYW0+Ci0JICAgIC8vLyA8cGFyYW0gbmFtZT0iVGFibGVTdHlsZSI+VGhlIHRhYmxlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSBkYXRhPC9wYXJhbT4KLQkgICAgLy8vIDxyZXR1cm5zPlRoZSBmaWxsZWQgcmFuZ2U8L3JldHVybnM+Ci0JICAgIHB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbURhdGFSZWFkZXIoSURhdGFSZWFkZXIgUmVhZGVyLCBib29sIFByaW50SGVhZGVycywgc3RyaW5nIFRhYmxlTmFtZSwgVGFibGVTdHlsZXMgVGFibGVTdHlsZSA9IFRhYmxlU3R5bGVzLk5vbmUpCi0JICAgIHsKLQkgICAgICAgIHZhciByID0gTG9hZEZyb21EYXRhUmVhZGVyKFJlYWRlciwgUHJpbnRIZWFkZXJzKTsKLQotICAgICAgICAgICAgaW50IHJvd3MgPSByLlJvd3MgLSAxOwotCSAgICAgICAgaWYgKHJvd3MgPj0gMCAmJiByLkNvbHVtbnMgPiAwKQotCSAgICAgICAgewotCSAgICAgICAgICAgIHZhciB0YmwgPSBfd29ya3NoZWV0LlRhYmxlcy5BZGQobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoX2Zyb21Sb3csIF9mcm9tQ29sLCBfZnJvbVJvdyArIChyb3dzIDw9IDAgPyAxIDogcm93cyksIF9mcm9tQ29sICsgci5Db2x1bW5zIC0gMSksIFRhYmxlTmFtZSk7Ci0JICAgICAgICAgICAgdGJsLlNob3dIZWFkZXIgPSBQcmludEhlYWRlcnM7Ci0JICAgICAgICAgICAgdGJsLlRhYmxlU3R5bGUgPSBUYWJsZVN0eWxlOwotCSAgICAgICAgfQotCSAgICAgICAgcmV0dXJuIHI7Ci0JICAgIH0KLQotCSAgICAvLy8gPHN1bW1hcnk+Ci0JICAgIC8vLyBMb2FkIHRoZSBkYXRhIGZyb20gdGhlIGRhdGFyZWFkZXIgc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgY2VsbCBvZiB0aGUgcmFuZ2UKLQkgICAgLy8vIDwvc3VtbWFyeT4KLQkgICAgLy8vIDxwYXJhbSBuYW1lPSJSZWFkZXIiPlRoZSBkYXRhcmVhZGVyIHRvIGxvYWQgZnJvbTwvcGFyYW0+Ci0JICAgIC8vLyA8cGFyYW0gbmFtZT0iUHJpbnRIZWFkZXJzIj5QcmludCB0aGUgY2FwdGlvbiBwcm9wZXJ0eSAoaWYgc2V0KSBvciB0aGUgY29sdW1ubmFtZSBwcm9wZXJ0eSBpZiBub3QsIG9uIGZpcnN0IHJvdzwvcGFyYW0+Ci0JICAgIC8vLyA8cmV0dXJucz5UaGUgZmlsbGVkIHJhbmdlPC9yZXR1cm5zPgotCSAgICBwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21EYXRhUmVhZGVyKElEYXRhUmVhZGVyIFJlYWRlciwgYm9vbCBQcmludEhlYWRlcnMpCi0JICAgIHsKLQkgICAgICAgIGlmIChSZWFkZXIgPT0gbnVsbCkKLQkgICAgICAgIHsKLQkgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiUmVhZGVyIiwgIlJlYWRlciBjYW4ndCBiZSBudWxsIikpOwotCSAgICAgICAgfQotCSAgICAgICAgaW50IGZpZWxkQ291bnQgPSBSZWFkZXIuRmllbGRDb3VudDsKLQkgIAotCSAgICAgICAgaW50IGNvbCA9IF9mcm9tQ29sLCByb3cgPSBfZnJvbVJvdzsKLQkgICAgICAgIGlmIChQcmludEhlYWRlcnMpCi0JICAgICAgICB7Ci0JICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZENvdW50OyBpKyspCi0JICAgICAgICAgICAgewotCSAgICAgICAgICAgICAgICAvLyBJZiBubyBjYXB0aW9uIGlzIHNldCwgdGhlIENvbHVtbk5hbWUgcHJvcGVydHkgaXMgY2FsbGVkIGltcGxpY2l0bHkuCi0JICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCsrLCBSZWFkZXIuR2V0TmFtZShpKSk7Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIHJvdysrOwotCSAgICAgICAgICAgIGNvbCA9IF9mcm9tQ29sOwotCSAgICAgICAgfQotCSAgICAgICAgd2hpbGUoUmVhZGVyLlJlYWQoKSkKLQkgICAgICAgIHsKLQkgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkQ291bnQ7IGkrKykKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCsrLCBSZWFkZXIuR2V0VmFsdWUoaSkpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICByb3crKzsKLQkgICAgICAgICAgICBjb2wgPSBfZnJvbUNvbDsKLQkgICAgICAgIH0KLQkgICAgICAgIHJldHVybiBfd29ya3NoZWV0LkNlbGxzW19mcm9tUm93LCBfZnJvbUNvbCwgcm93IC0gMSwgX2Zyb21Db2wgKyBmaWVsZENvdW50IC0gMV07Ci0JICAgIH0KLQkgICAgI2VuZHJlZ2lvbgotCQkjcmVnaW9uIExvYWRGcm9tRGF0YVRhYmxlCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIExvYWQgdGhlIGRhdGEgZnJvbSB0aGUgZGF0YXRhYmxlIHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBsZWZ0IGNlbGwgb2YgdGhlIHJhbmdlCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iVGFibGUiPlRoZSBkYXRhdGFibGUgdG8gbG9hZDwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iUHJpbnRIZWFkZXJzIj5QcmludCB0aGUgY29sdW1uIGNhcHRpb24gcHJvcGVydHkgKGlmIHNldCkgb3IgdGhlIGNvbHVtbm5hbWUgcHJvcGVydHkgaWYgbm90LCBvbiBmaXJzdCByb3c8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9IlRhYmxlU3R5bGUiPlRoZSB0YWJsZSBzdHlsZSB0byBhcHBseSB0byB0aGUgZGF0YTwvcGFyYW0+Ci0JCS8vLyA8cmV0dXJucz5UaGUgZmlsbGVkIHJhbmdlPC9yZXR1cm5zPgotCQlwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21EYXRhVGFibGUoRGF0YVRhYmxlIFRhYmxlLCBib29sIFByaW50SGVhZGVycywgVGFibGVTdHlsZXMgVGFibGVTdHlsZSkKLQkJewotCQkJdmFyIHIgPSBMb2FkRnJvbURhdGFUYWJsZShUYWJsZSwgUHJpbnRIZWFkZXJzKTsKLQotICAgICAgICAgICAgaW50IHJvd3MgPSAoVGFibGUuUm93cy5Db3VudCA9PSAwID8gMSA6IFRhYmxlLlJvd3MuQ291bnQpICsgKFByaW50SGVhZGVycyA/IDEgOiAwKTsKLSAgICAgICAgICAgIGlmIChyb3dzID49IDAgJiYgVGFibGUuQ29sdW1ucy5Db3VudD4wKQotCQkJewotICAgICAgICAgICAgICAgIHZhciB0YmwgPSBfd29ya3NoZWV0LlRhYmxlcy5BZGQobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoX2Zyb21Sb3csIF9mcm9tQ29sLCBfZnJvbVJvdyArIHJvd3MgLSAxLCBfZnJvbUNvbCArIFRhYmxlLkNvbHVtbnMuQ291bnQtMSksIFRhYmxlLlRhYmxlTmFtZSk7Ci0JCQkJdGJsLlNob3dIZWFkZXIgPSBQcmludEhlYWRlcnM7Ci0JCQkJdGJsLlRhYmxlU3R5bGUgPSBUYWJsZVN0eWxlOwotCQkJfQotCQkgICAgcmV0dXJuIHI7Ci0JCX0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gTG9hZCB0aGUgZGF0YSBmcm9tIHRoZSBkYXRhdGFibGUgc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgY2VsbCBvZiB0aGUgcmFuZ2UKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJUYWJsZSI+VGhlIGRhdGF0YWJsZSB0byBsb2FkPC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJQcmludEhlYWRlcnMiPlByaW50IHRoZSBjYXB0aW9uIHByb3BlcnR5IChpZiBzZXQpIG9yIHRoZSBjb2x1bW5uYW1lIHByb3BlcnR5IGlmIG5vdCwgb24gZmlyc3Qgcm93PC9wYXJhbT4KLQkJLy8vIDxyZXR1cm5zPlRoZSBmaWxsZWQgcmFuZ2U8L3JldHVybnM+Ci0JCXB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbURhdGFUYWJsZShEYXRhVGFibGUgVGFibGUsIGJvb2wgUHJpbnRIZWFkZXJzKQotCQl7Ci0JCQlpZiAoVGFibGUgPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyAobmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiVGFibGUgY2FuJ3QgYmUgbnVsbCIpKTsKLQkJCX0KLQotCQkJaW50IGNvbCA9IF9mcm9tQ29sLCByb3cgPSBfZnJvbVJvdzsKLQkJCWlmIChQcmludEhlYWRlcnMpCi0JCQl7Ci0JCQkJZm9yZWFjaCAoRGF0YUNvbHVtbiBkYyBpbiBUYWJsZS5Db2x1bW5zKQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm8gY2FwdGlvbiBpcyBzZXQsIHRoZSBDb2x1bW5OYW1lIHByb3BlcnR5IGlzIGNhbGxlZCBpbXBsaWNpdGx5LgotCQkJCQlfd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wrKywgZGMuQ2FwdGlvbik7Ci0JCQkJfQotCQkJCXJvdysrOwotCQkJCWNvbCA9IF9mcm9tQ29sOwotCQkJfQotICAgICAgICAgICAgZWxzZSBpZiAoVGFibGUuUm93cy5Db3VudCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCQkJZm9yZWFjaCAoRGF0YVJvdyBkciBpbiBUYWJsZS5Sb3dzKQotCQkJewotCQkJCWZvcmVhY2ggKG9iamVjdCB2YWx1ZSBpbiBkci5JdGVtQXJyYXkpCi0JCQkJewotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSAhPSBEQk51bGwuVmFsdWUgJiYgIXN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlLlRvU3RyaW5nKCkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wrKywgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29sKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JCQkJcm93Kys7Ci0JCQkJY29sID0gX2Zyb21Db2w7Ci0JCQl9Ci0gICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5DZWxsc1tfZnJvbVJvdywgX2Zyb21Db2wsIChyb3cgPT0gX2Zyb21Sb3cgPyBfZnJvbVJvdyA6IHJvdyAtIDEpLCBfZnJvbUNvbCArIFRhYmxlLkNvbHVtbnMuQ291bnQgLSAxXTsKLQkJfQotCQkjZW5kcmVnaW9uCi0JCSNyZWdpb24gTG9hZEZyb21BcnJheXMKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gTG9hZHMgZGF0YSBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGFycmF5cyBvZiBvYmplY3RzIGludG8gdGhlIHJhbmdlLCBzdGFydGluZyBmcm9tCi0JCS8vLyB0aGUgdG9wLWxlZnQgY2VsbC4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJEYXRhIj5UaGUgZGF0YS48L3BhcmFtPgotCQlwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21BcnJheXMoSUVudW1lcmFibGU8b2JqZWN0W10+IERhdGEpCi0JCXsKLQkJCS8vdGhhbnggdG8gQWJkdWxsaW4gZm9yIHRoZSBjb2RlIGNvbnRyaWJ1dGlvbgotCQkJaWYgKERhdGEgPT0gbnVsbCkgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiZGF0YSIpOwotCi0JCQlpbnQgY29sdW1uID0gX2Zyb21Db2wsIHJvdyA9IF9mcm9tUm93OwotCi0JCQlmb3JlYWNoICh2YXIgcm93RGF0YSBpbiBEYXRhKQotCQkJewotCQkJCWNvbHVtbiA9IF9mcm9tQ29sOwotCQkJCWZvcmVhY2ggKHZhciBjZWxsRGF0YSBpbiByb3dEYXRhKQotCQkJCXsKLQkJCQkJX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sdW1uLCBjZWxsRGF0YSk7Ci0JCQkJCWNvbHVtbiArPSAxOwotCQkJCX0KLQkJCQlyb3cgKz0gMTsKLQkJCX0KLQkJCXJldHVybiBfd29ya3NoZWV0LkNlbGxzW19mcm9tUm93LCBfZnJvbUNvbCwgcm93IC0gMSwgY29sdW1uIC0gMV07Ci0JCX0KLQkJI2VuZHJlZ2lvbgotCQkjcmVnaW9uIExvYWRGcm9tQ29sbGVjdGlvbgotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBMb2FkIGEgY29sbGVjdGlvbiBpbnRvIGEgdGhlIHdvcmtzaGVldCBzdGFydGluZyBmcm9tIHRoZSB0b3AgbGVmdCByb3cgb2YgdGhlIHJhbmdlLgotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgZGF0YXR5cGUgaW4gdGhlIGNvbGxlY3Rpb248L3R5cGVwYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJDb2xsZWN0aW9uIj5UaGUgY29sbGVjdGlvbiB0byBsb2FkPC9wYXJhbT4KLQkJLy8vIDxyZXR1cm5zPlRoZSBmaWxsZWQgcmFuZ2U8L3JldHVybnM+Ci0JCXB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbUNvbGxlY3Rpb248VD4oSUVudW1lcmFibGU8VD4gQ29sbGVjdGlvbikKLQkJewotCQkJcmV0dXJuIExvYWRGcm9tQ29sbGVjdGlvbjxUPihDb2xsZWN0aW9uLCBmYWxzZSwgVGFibGVTdHlsZXMuTm9uZSwgQmluZGluZ0ZsYWdzLlB1YmxpYyB8IEJpbmRpbmdGbGFncy5JbnN0YW5jZSwgbnVsbCk7Ci0JCX0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gTG9hZCBhIGNvbGxlY3Rpb24gb2YgVCBpbnRvIHRoZSB3b3Jrc2hlZXQgc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgcm93IG9mIHRoZSByYW5nZS4KLQkJLy8vIERlZmF1bHQgb3B0aW9uIHdpbGwgbG9hZCBhbGwgcHVibGljIGluc3RhbmNlIHByb3BlcnRpZXMgb2YgVAotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgZGF0YXR5cGUgaW4gdGhlIGNvbGxlY3Rpb248L3R5cGVwYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJDb2xsZWN0aW9uIj5UaGUgY29sbGVjdGlvbiB0byBsb2FkPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQcmludEhlYWRlcnMiPlByaW50IHRoZSBwcm9wZXJ0eSBuYW1lcyBvbiB0aGUgZmlyc3Qgcm93LiBJZiB0aGUgcHJvcGVydHkgaXMgZGVjb3JhdGVkIHdpdGggYSA8c2VlIGNyZWY9IkRpc3BsYXlOYW1lQXR0cmlidXRlIi8+IG9yIGEgPHNlZSBjcmVmPSJEZXNjcmlwdGlvbkF0dHJpYnV0ZSIvPiB0aGF0IGF0dHJpYnV0ZSB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgcmVmbGVjdGVkIG1lbWJlciBuYW1lLjwvcGFyYW0+Ci0JCS8vLyA8cmV0dXJucz5UaGUgZmlsbGVkIHJhbmdlPC9yZXR1cm5zPgotCQlwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21Db2xsZWN0aW9uPFQ+KElFbnVtZXJhYmxlPFQ+IENvbGxlY3Rpb24sIGJvb2wgUHJpbnRIZWFkZXJzKQotCQl7Ci0JCQlyZXR1cm4gTG9hZEZyb21Db2xsZWN0aW9uPFQ+KENvbGxlY3Rpb24sIFByaW50SGVhZGVycywgVGFibGVTdHlsZXMuTm9uZSwgQmluZGluZ0ZsYWdzLlB1YmxpYyB8IEJpbmRpbmdGbGFncy5JbnN0YW5jZSwgbnVsbCk7Ci0JCX0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gTG9hZCBhIGNvbGxlY3Rpb24gb2YgVCBpbnRvIHRoZSB3b3Jrc2hlZXQgc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgcm93IG9mIHRoZSByYW5nZS4KLQkJLy8vIERlZmF1bHQgb3B0aW9uIHdpbGwgbG9hZCBhbGwgcHVibGljIGluc3RhbmNlIHByb3BlcnRpZXMgb2YgVAotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgZGF0YXR5cGUgaW4gdGhlIGNvbGxlY3Rpb248L3R5cGVwYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJDb2xsZWN0aW9uIj5UaGUgY29sbGVjdGlvbiB0byBsb2FkPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJQcmludEhlYWRlcnMiPlByaW50IHRoZSBwcm9wZXJ0eSBuYW1lcyBvbiB0aGUgZmlyc3Qgcm93LiBJZiB0aGUgcHJvcGVydHkgaXMgZGVjb3JhdGVkIHdpdGggYSA8c2VlIGNyZWY9IkRpc3BsYXlOYW1lQXR0cmlidXRlIi8+IG9yIGEgPHNlZSBjcmVmPSJEZXNjcmlwdGlvbkF0dHJpYnV0ZSIvPiB0aGF0IGF0dHJpYnV0ZSB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgcmVmbGVjdGVkIG1lbWJlciBuYW1lLjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iVGFibGVTdHlsZSI+V2lsbCBjcmVhdGUgYSB0YWJsZSB3aXRoIHRoaXMgc3R5bGUuIElmIHNldCB0byBUYWJsZVN0eWxlcy5Ob25lIG5vIHRhYmxlIHdpbGwgYmUgY3JlYXRlZDwvcGFyYW0+Ci0JCS8vLyA8cmV0dXJucz5UaGUgZmlsbGVkIHJhbmdlPC9yZXR1cm5zPgotCQlwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21Db2xsZWN0aW9uPFQ+KElFbnVtZXJhYmxlPFQ+IENvbGxlY3Rpb24sIGJvb2wgUHJpbnRIZWFkZXJzLCBUYWJsZVN0eWxlcyBUYWJsZVN0eWxlKQotCQl7Ci0JCQlyZXR1cm4gTG9hZEZyb21Db2xsZWN0aW9uPFQ+KENvbGxlY3Rpb24sIFByaW50SGVhZGVycywgVGFibGVTdHlsZSwgQmluZGluZ0ZsYWdzLlB1YmxpYyB8IEJpbmRpbmdGbGFncy5JbnN0YW5jZSwgbnVsbCk7Ci0JCX0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gTG9hZCBhIGNvbGxlY3Rpb24gaW50byB0aGUgd29ya3NoZWV0IHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBsZWZ0IHJvdyBvZiB0aGUgcmFuZ2UuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSBkYXRhdHlwZSBpbiB0aGUgY29sbGVjdGlvbjwvdHlwZXBhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9IkNvbGxlY3Rpb24iPlRoZSBjb2xsZWN0aW9uIHRvIGxvYWQ8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9IlByaW50SGVhZGVycyI+UHJpbnQgdGhlIHByb3BlcnR5IG5hbWVzIG9uIHRoZSBmaXJzdCByb3cuIEFueSB1bmRlcnNjb3JlIGluIHRoZSBwcm9wZXJ0eSBuYW1lIHdpbGwgYmUgY29udmVydGVkIHRvIGEgc3BhY2UuIElmIHRoZSBwcm9wZXJ0eSBpcyBkZWNvcmF0ZWQgd2l0aCBhIDxzZWUgY3JlZj0iRGlzcGxheU5hbWVBdHRyaWJ1dGUiLz4gb3IgYSA8c2VlIGNyZWY9IkRlc2NyaXB0aW9uQXR0cmlidXRlIi8+IHRoYXQgYXR0cmlidXRlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSByZWZsZWN0ZWQgbWVtYmVyIG5hbWUuPC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJUYWJsZVN0eWxlIj5XaWxsIGNyZWF0ZSBhIHRhYmxlIHdpdGggdGhpcyBzdHlsZS4gSWYgc2V0IHRvIFRhYmxlU3R5bGVzLk5vbmUgbm8gdGFibGUgd2lsbCBiZSBjcmVhdGVkPC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJtZW1iZXJGbGFncyI+UHJvcGVydHkgZmxhZ3MgdG8gdXNlPC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJNZW1iZXJzIj5UaGUgcHJvcGVydGllcyB0byBvdXRwdXQuIE11c3QgYmUgb2YgdHlwZSBUPC9wYXJhbT4KLQkJLy8vIDxyZXR1cm5zPlRoZSBmaWxsZWQgcmFuZ2U8L3JldHVybnM+Ci0JCXB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbUNvbGxlY3Rpb248VD4oSUVudW1lcmFibGU8VD4gQ29sbGVjdGlvbiwgYm9vbCBQcmludEhlYWRlcnMsIFRhYmxlU3R5bGVzIFRhYmxlU3R5bGUsIEJpbmRpbmdGbGFncyBtZW1iZXJGbGFncywgTWVtYmVySW5mb1tdIE1lbWJlcnMpCi0JCXsKLQkJCXZhciB0eXBlID0gdHlwZW9mKFQpOwotCQkJaWYgKE1lbWJlcnMgPT0gbnVsbCkKLQkJCXsKLQkJCQlNZW1iZXJzID0gdHlwZS5HZXRQcm9wZXJ0aWVzKG1lbWJlckZsYWdzKTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlmb3JlYWNoICh2YXIgdCBpbiBNZW1iZXJzKQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQuRGVjbGFyaW5nVHlwZSE9bnVsbCAmJiB0LkRlY2xhcmluZ1R5cGUgIT0gdHlwZSAmJiAhdC5EZWNsYXJpbmdUeXBlLklzU3ViY2xhc3NPZih0eXBlKSkKLQkJCQkJewotCQkJCQkJdGhyb3cgbmV3IEludmFsaWRDYXN0RXhjZXB0aW9uKCJTdXBwbGllZCBwcm9wZXJ0aWVzIGluIHBhcmFtZXRlciBQcm9wZXJ0aWVzIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcyBUIChvciBhbiBhc3NpZ25hYmxlIHR5cGUgZnJvbSBUIik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWludCBjb2wgPSBfZnJvbUNvbCwgcm93ID0gX2Zyb21Sb3c7Ci0JCQlpZiAoTWVtYmVycy5MZW5ndGggPiAwICYmIFByaW50SGVhZGVycykKLQkJCXsKLQkJCQlmb3JlYWNoICh2YXIgdCBpbiBNZW1iZXJzKQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGRlc2NyaXB0aW9uQXR0cmlidXRlID0gdC5HZXRDdXN0b21BdHRyaWJ1dGVzKHR5cGVvZihEZXNjcmlwdGlvbkF0dHJpYnV0ZSksIGZhbHNlKS5GaXJzdE9yRGVmYXVsdCgpIGFzIERlc2NyaXB0aW9uQXR0cmlidXRlOwotCQkJCSAgICB2YXIgaGVhZGVyID0gc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRpb25BdHRyaWJ1dGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gZGVzY3JpcHRpb25BdHRyaWJ1dGUuRGVzY3JpcHRpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlzcGxheU5hbWVBdHRyaWJ1dGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQuR2V0Q3VzdG9tQXR0cmlidXRlcyh0eXBlb2YgKERpc3BsYXlOYW1lQXR0cmlidXRlKSwgZmFsc2UpLkZpcnN0T3JEZWZhdWx0KCkgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZUF0dHJpYnV0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5TmFtZUF0dHJpYnV0ZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IGRpc3BsYXlOYW1lQXR0cmlidXRlLkRpc3BsYXlOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IHQuTmFtZS5SZXBsYWNlKCdfJywgJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wrKywgaGVhZGVyKTsKLQkJCQl9Ci0JCQkJcm93Kys7Ci0JCQl9Ci0KLQkJICAgIGlmICghQ29sbGVjdGlvbi5BbnkoKSAmJiAoTWVtYmVycy5MZW5ndGggPT0gMCB8fCBQcmludEhlYWRlcnMgPT0gZmFsc2UpKQotCQkgICAgewotCQkgICAgICAgIHJldHVybiBudWxsOwotCQkgICAgfQotCi0JCQlpZiAoTWVtYmVycy5MZW5ndGggPT0gMCkKLQkJCXsKLQkJCQlmb3JlYWNoICh2YXIgaXRlbSBpbiBDb2xsZWN0aW9uKQotCQkJCXsKLQkJCQkJX3dvcmtzaGVldC5DZWxsc1tyb3crKywgY29sXS5WYWx1ZSA9IGl0ZW07Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWZvcmVhY2ggKHZhciBpdGVtIGluIENvbGxlY3Rpb24pCi0JCQkJewotCQkJCQljb2wgPSBfZnJvbUNvbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gaXMgc3RyaW5nIHx8IGl0ZW0gaXMgZGVjaW1hbCB8fCBpdGVtIGlzIERhdGVUaW1lIHx8IGl0ZW0uR2V0VHlwZSgpLklzUHJpbWl0aXZlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfd29ya3NoZWV0LkNlbGxzW3JvdywgY29sKytdLlZhbHVlID0gaXRlbTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIE1lbWJlcnMpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgaXMgUHJvcGVydHlJbmZvKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1tyb3csIGNvbCsrXS5WYWx1ZSA9ICgoUHJvcGVydHlJbmZvKXQpLkdldFZhbHVlKGl0ZW0sIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0IGlzIEZpZWxkSW5mbykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbcm93LCBjb2wrK10uVmFsdWUgPSAoKEZpZWxkSW5mbyl0KS5HZXRWYWx1ZShpdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodCBpcyBNZXRob2RJbmZvKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1tyb3csIGNvbCsrXS5WYWx1ZSA9ICgoTWV0aG9kSW5mbyl0KS5JbnZva2UoaXRlbSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0JCQkJCXJvdysrOwotCQkJCX0KLQkJCX0KLQotICAgICAgICAgICAgaWYgKF9mcm9tUm93ID09IHJvdy0xICYmIFByaW50SGVhZGVycykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByb3crKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdmFyIHIgPSBfd29ya3NoZWV0LkNlbGxzW19mcm9tUm93LCBfZnJvbUNvbCwgcm93IC0gMSwgTWVtYmVycy5MZW5ndGg9PTAgPyBjb2wgOiBjb2wgLSAxXTsKLQotCQkJaWYgKFRhYmxlU3R5bGUgIT0gVGFibGVTdHlsZXMuTm9uZSkKLQkJCXsKLQkJCQl2YXIgdGJsID0gX3dvcmtzaGVldC5UYWJsZXMuQWRkKHIsICIiKTsKLQkJCQl0YmwuU2hvd0hlYWRlciA9IFByaW50SGVhZGVyczsKLQkJCQl0YmwuVGFibGVTdHlsZSA9IFRhYmxlU3R5bGU7Ci0JCQl9Ci0JCQlyZXR1cm4gcjsKLQkJfQotCQkjZW5kcmVnaW9uCi0JCSNyZWdpb24gTG9hZEZyb21UZXh0Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIExvYWRzIGEgQ1NWIHRleHQgaW50byBhIHJhbmdlIHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBsZWZ0IGNlbGwuCi0JCS8vLyBEZWZhdWx0IHNldHRpbmdzIGlzIENvbW1hIHNlcGFyYXRpb24KLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJUZXh0Ij5UaGUgVGV4dDwvcGFyYW0+Ci0JCS8vLyA8cmV0dXJucz5UaGUgcmFuZ2UgY29udGFpbmluZyB0aGUgZGF0YTwvcmV0dXJucz4KLQkJcHVibGljIEV4Y2VsUmFuZ2VCYXNlIExvYWRGcm9tVGV4dChzdHJpbmcgVGV4dCkKLQkJewotCQkJcmV0dXJuIExvYWRGcm9tVGV4dChUZXh0LCBuZXcgRXhjZWxUZXh0Rm9ybWF0KCkpOwotCQl9Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIExvYWRzIGEgQ1NWIHRleHQgaW50byBhIHJhbmdlIHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBsZWZ0IGNlbGwuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iVGV4dCI+VGhlIFRleHQ8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9IkZvcm1hdCI+SW5mb3JtYXRpb24gaG93IHRvIGxvYWQgdGhlIHRleHQ8L3BhcmFtPgotCQkvLy8gPHJldHVybnM+VGhlIHJhbmdlIGNvbnRhaW5pbmcgdGhlIGRhdGE8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbVRleHQoc3RyaW5nIFRleHQsIEV4Y2VsVGV4dEZvcm1hdCBGb3JtYXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShUZXh0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgciA9IF93b3Jrc2hlZXQuQ2VsbHNbX2Zyb21Sb3csIF9mcm9tQ29sXTsKLSAgICAgICAgICAgICAgICByLlZhbHVlID0gIiI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChGb3JtYXQgPT0gbnVsbCkgRm9ybWF0ID0gbmV3IEV4Y2VsVGV4dEZvcm1hdCgpOwotCi0gICAgICAgICAgICBzdHJpbmcgc3BsaXRSZWdleCA9IFN0cmluZy5Gb3JtYXQoInswfSg/PSg/OlteezF9XSp7MX1bXnsxfV0qezF9KSpbXnsxfV0qJCkiLCBGb3JtYXQuRU9MLCBGb3JtYXQuVGV4dFF1YWxpZmllcik7Ci0gICAgICAgICAgICBzdHJpbmdbXSBsaW5lcyA9IFJlZ2V4LlNwbGl0KFRleHQsIHNwbGl0UmVnZXgpOwotICAgICAgICAgICAgaW50IHJvdyA9IF9mcm9tUm93OwotICAgICAgICAgICAgaW50IGNvbCA9IF9mcm9tQ29sOwotICAgICAgICAgICAgaW50IG1heENvbCA9IGNvbDsKLSAgICAgICAgICAgIGludCBsaW5lTm8gPSAxOwotICAgICAgICAgICAgZm9yZWFjaCAoc3RyaW5nIGxpbmUgaW4gbGluZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmVObyA+IEZvcm1hdC5Ta2lwTGluZXNCZWdpbm5pbmcgJiYgbGluZU5vIDw9IGxpbmVzLkxlbmd0aCAtIEZvcm1hdC5Ta2lwTGluZXNFbmQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb2wgPSBfZnJvbUNvbDsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHYgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RleHQgPSBmYWxzZSwgaXNRdWFsaWZpZXIgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IFFDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGludCBsaW5lUUNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoY2hhciBjIGluIGxpbmUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGb3JtYXQuVGV4dFF1YWxpZmllciAhPSAwICYmIGMgPT0gRm9ybWF0LlRleHRRdWFsaWZpZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RleHQgJiYgdiAhPSAiIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIkludmFsaWQgVGV4dCBRdWFsaWZpZXIgaW4gbGluZSA6IHswfSIsIGxpbmUpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUXVhbGlmaWVyID0gIWlzUXVhbGlmaWVyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDb3VudCArPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVRQ291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RleHQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChRQ291bnQgPiAxICYmICFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gbmV3IHN0cmluZyhGb3JtYXQuVGV4dFF1YWxpZmllciwgUUNvdW50IC8gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFFDb3VudCA+IDIgJiYgc3RyaW5nLklzTnVsbE9yRW1wdHkodikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IG5ldyBzdHJpbmcoRm9ybWF0LlRleHRRdWFsaWZpZXIsIChRQ291bnQgLSAxKSAvIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1F1YWxpZmllcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gRm9ybWF0LkRlbGltaXRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5TZXRWYWx1ZShyb3csIGNvbCwgQ29udmVydERhdGEoRm9ybWF0LCB2LCBjb2wgLSBfZnJvbUNvbCwgaXNUZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1RleHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFFDb3VudCAlIDIgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJUZXh0IGRlbGltaXRlciBpcyBub3QgY2xvc2VkIGluIGxpbmUgOiB7MH0iLCBsaW5lKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSBjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKFFDb3VudCA+IDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gbmV3IHN0cmluZyhGb3JtYXQuVGV4dFF1YWxpZmllciwgUUNvdW50IC8gMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVRQ291bnQgJSAyID09IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJUZXh0IGRlbGltaXRlciBpcyBub3QgY2xvc2VkIGluIGxpbmUgOiB7MH0iLCBsaW5lKSkpOwotCi0gICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgQ29udmVydERhdGEoRm9ybWF0LCB2LCBjb2wgLSBfZnJvbUNvbCwgaXNUZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2wgPiBtYXhDb2wpIG1heENvbCA9IGNvbDsKLSAgICAgICAgICAgICAgICAgICAgcm93Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxpbmVObysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ2VsbHNbX2Zyb21Sb3csIF9mcm9tQ29sLCByb3cgLSAxLCBtYXhDb2xdOwotICAgICAgICB9Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIExvYWRzIGEgQ1NWIHRleHQgaW50byBhIHJhbmdlIHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBsZWZ0IGNlbGwuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iVGV4dCI+VGhlIFRleHQ8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9IkZvcm1hdCI+SW5mb3JtYXRpb24gaG93IHRvIGxvYWQgdGhlIHRleHQ8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9IlRhYmxlU3R5bGUiPkNyZWF0ZSBhIHRhYmxlIHdpdGggdGhpcyBzdHlsZTwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iRmlyc3RSb3dJc0hlYWRlciI+VXNlIHRoZSBmaXJzdCByb3cgYXMgaGVhZGVyPC9wYXJhbT4KLQkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLQkJcHVibGljIEV4Y2VsUmFuZ2VCYXNlIExvYWRGcm9tVGV4dChzdHJpbmcgVGV4dCwgRXhjZWxUZXh0Rm9ybWF0IEZvcm1hdCwgVGFibGVTdHlsZXMgVGFibGVTdHlsZSwgYm9vbCBGaXJzdFJvd0lzSGVhZGVyKQotCQl7Ci0JCQl2YXIgciA9IExvYWRGcm9tVGV4dChUZXh0LCBGb3JtYXQpOwotCi0JCQl2YXIgdGJsID0gX3dvcmtzaGVldC5UYWJsZXMuQWRkKHIsICIiKTsKLQkJCXRibC5TaG93SGVhZGVyID0gRmlyc3RSb3dJc0hlYWRlcjsKLQkJCXRibC5UYWJsZVN0eWxlID0gVGFibGVTdHlsZTsKLQotCQkJcmV0dXJuIHI7Ci0JCX0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gTG9hZHMgYSBDU1YgZmlsZSBpbnRvIGEgcmFuZ2Ugc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgY2VsbC4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJUZXh0RmlsZSI+VGhlIFRleHRmaWxlPC9wYXJhbT4KLQkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLQkJcHVibGljIEV4Y2VsUmFuZ2VCYXNlIExvYWRGcm9tVGV4dChGaWxlSW5mbyBUZXh0RmlsZSkKLQkJewotCQkJcmV0dXJuIExvYWRGcm9tVGV4dChGaWxlLlJlYWRBbGxUZXh0KFRleHRGaWxlLkZ1bGxOYW1lLCBFbmNvZGluZy5BU0NJSSkpOwotCQl9Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIExvYWRzIGEgQ1NWIGZpbGUgaW50byBhIHJhbmdlIHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBsZWZ0IGNlbGwuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iVGV4dEZpbGUiPlRoZSBUZXh0ZmlsZTwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iRm9ybWF0Ij5JbmZvcm1hdGlvbiBob3cgdG8gbG9hZCB0aGUgdGV4dDwvcGFyYW0+Ci0JCS8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0JCXB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbVRleHQoRmlsZUluZm8gVGV4dEZpbGUsIEV4Y2VsVGV4dEZvcm1hdCBGb3JtYXQpCi0JCXsKLQkJCXJldHVybiBMb2FkRnJvbVRleHQoRmlsZS5SZWFkQWxsVGV4dChUZXh0RmlsZS5GdWxsTmFtZSwgRm9ybWF0LkVuY29kaW5nKSwgRm9ybWF0KTsKLQkJfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBMb2FkcyBhIENTViBmaWxlIGludG8gYSByYW5nZSBzdGFydGluZyBmcm9tIHRoZSB0b3AgbGVmdCBjZWxsLgotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9IlRleHRGaWxlIj5UaGUgVGV4dGZpbGU8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9IkZvcm1hdCI+SW5mb3JtYXRpb24gaG93IHRvIGxvYWQgdGhlIHRleHQ8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9IlRhYmxlU3R5bGUiPkNyZWF0ZSBhIHRhYmxlIHdpdGggdGhpcyBzdHlsZTwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iRmlyc3RSb3dJc0hlYWRlciI+VXNlIHRoZSBmaXJzdCByb3cgYXMgaGVhZGVyPC9wYXJhbT4KLQkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLQkJcHVibGljIEV4Y2VsUmFuZ2VCYXNlIExvYWRGcm9tVGV4dChGaWxlSW5mbyBUZXh0RmlsZSwgRXhjZWxUZXh0Rm9ybWF0IEZvcm1hdCwgVGFibGVTdHlsZXMgVGFibGVTdHlsZSwgYm9vbCBGaXJzdFJvd0lzSGVhZGVyKQotCQl7Ci0JCQlyZXR1cm4gTG9hZEZyb21UZXh0KEZpbGUuUmVhZEFsbFRleHQoVGV4dEZpbGUuRnVsbE5hbWUsIEZvcm1hdC5FbmNvZGluZyksIEZvcm1hdCwgVGFibGVTdHlsZSwgRmlyc3RSb3dJc0hlYWRlcik7Ci0JCX0KLQkJI2VuZHJlZ2lvbgotCQkjcmVnaW9uIEdldFZhbHVlCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIEdldCB0aGUgc3Ryb25nbHkgdHlwZWQgdmFsdWUgb2YgdGhlIGNlbGwuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSB0eXBlPC90eXBlcGFyYW0+Ci0JCS8vLyA8cmV0dXJucz5UaGUgdmFsdWUuIElmIHRoZSB2YWx1ZSBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHNwZWNpZmllZCB0eXBlLCB0aGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkPC9yZXR1cm5zPgotCQlwdWJsaWMgVCBHZXRWYWx1ZTxUPigpCi0JCXsKLQkJCXJldHVybiBfd29ya3NoZWV0LkdldFR5cGVkVmFsdWU8VD4oVmFsdWUpOwotCQl9Ci0JCSNlbmRyZWdpb24KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gR2V0IGEgcmFuZ2Ugd2l0aCBhbiBvZmZzZXQgZnJvbSB0aGUgdG9wIGxlZnQgY2VsbC4KLQkJLy8vIFRoZSBuZXcgcmFuZ2UgaGFzIHRoZSBzYW1lIGRpbWVuc2lvbnMgYXMgdGhlIGN1cnJlbnQgcmFuZ2UKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJSb3dPZmZzZXQiPlJvdyBPZmZzZXQ8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9IkNvbHVtbk9mZnNldCI+Q29sdW1uIE9mZnNldDwvcGFyYW0+Ci0JCS8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0JCXB1YmxpYyBFeGNlbFJhbmdlQmFzZSBPZmZzZXQoaW50IFJvd09mZnNldCwgaW50IENvbHVtbk9mZnNldCkKLQkJewotCQkJaWYgKF9mcm9tUm93ICsgUm93T2Zmc2V0IDwgMSB8fCBfZnJvbUNvbCArIENvbHVtbk9mZnNldCA8IDEgfHwgX2Zyb21Sb3cgKyBSb3dPZmZzZXQgPiBFeGNlbFBhY2thZ2UuTWF4Um93cyB8fCBfZnJvbUNvbCArIENvbHVtbk9mZnNldCA+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKQotCQkJewotCQkJCXRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJPZmZzZXQgdmFsdWUgb3V0IG9mIHJhbmdlIikpOwotCQkJfQotCQkJc3RyaW5nIGFkZHJlc3MgPSBHZXRBZGRyZXNzKF9mcm9tUm93ICsgUm93T2Zmc2V0LCBfZnJvbUNvbCArIENvbHVtbk9mZnNldCwgX3RvUm93ICsgUm93T2Zmc2V0LCBfdG9Db2wgKyBDb2x1bW5PZmZzZXQpOwotCQkJcmV0dXJuIG5ldyBFeGNlbFJhbmdlQmFzZShfd29ya3NoZWV0LCBhZGRyZXNzKTsKLQkJfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBHZXQgYSByYW5nZSB3aXRoIGFuIG9mZnNldCBmcm9tIHRoZSB0b3AgbGVmdCBjZWxsLgotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9IlJvd09mZnNldCI+Um93IE9mZnNldDwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iQ29sdW1uT2Zmc2V0Ij5Db2x1bW4gT2Zmc2V0PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJOdW1iZXJPZlJvd3MiPk51bWJlciBvZiByb3dzLiBNaW5pbXVtIDE8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9Ik51bWJlck9mQ29sdW1ucyI+TnVtYmVyIG9mIGNvbHVtcy4gTWluaW11bSAxPC9wYXJhbT4KLQkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLQkJcHVibGljIEV4Y2VsUmFuZ2VCYXNlIE9mZnNldChpbnQgUm93T2Zmc2V0LCBpbnQgQ29sdW1uT2Zmc2V0LCBpbnQgTnVtYmVyT2ZSb3dzLCBpbnQgTnVtYmVyT2ZDb2x1bW5zKQotCQl7Ci0JCQlpZiAoTnVtYmVyT2ZSb3dzIDwgMSB8fCBOdW1iZXJPZkNvbHVtbnMgPCAxKQotCQkJewotCQkJCXRocm93IChuZXcgRXhjZXB0aW9uKCJOdW1iZXIgb2Ygcm93cy9jb2x1bW5zIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiKSk7Ci0JCQl9Ci0JCQlOdW1iZXJPZlJvd3MtLTsKLQkJCU51bWJlck9mQ29sdW1ucy0tOwotCQkJaWYgKF9mcm9tUm93ICsgUm93T2Zmc2V0IDwgMSB8fCBfZnJvbUNvbCArIENvbHVtbk9mZnNldCA8IDEgfHwgX2Zyb21Sb3cgKyBSb3dPZmZzZXQgPiBFeGNlbFBhY2thZ2UuTWF4Um93cyB8fCBfZnJvbUNvbCArIENvbHVtbk9mZnNldCA+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zIHx8Ci0JCQkJIF9mcm9tUm93ICsgUm93T2Zmc2V0ICsgTnVtYmVyT2ZSb3dzIDwgMSB8fCBfZnJvbUNvbCArIENvbHVtbk9mZnNldCArIE51bWJlck9mQ29sdW1ucyA8IDEgfHwgX2Zyb21Sb3cgKyBSb3dPZmZzZXQgKyBOdW1iZXJPZlJvd3MgPiBFeGNlbFBhY2thZ2UuTWF4Um93cyB8fCBfZnJvbUNvbCArIENvbHVtbk9mZnNldCArIE51bWJlck9mQ29sdW1ucyA+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKQotCQkJewotCQkJCXRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJPZmZzZXQgdmFsdWUgb3V0IG9mIHJhbmdlIikpOwotCQkJfQotCQkJc3RyaW5nIGFkZHJlc3MgPSBHZXRBZGRyZXNzKF9mcm9tUm93ICsgUm93T2Zmc2V0LCBfZnJvbUNvbCArIENvbHVtbk9mZnNldCwgX2Zyb21Sb3cgKyBSb3dPZmZzZXQgKyBOdW1iZXJPZlJvd3MsIF9mcm9tQ29sICsgQ29sdW1uT2Zmc2V0ICsgTnVtYmVyT2ZDb2x1bW5zKTsKLQkJCXJldHVybiBuZXcgRXhjZWxSYW5nZUJhc2UoX3dvcmtzaGVldCwgYWRkcmVzcyk7Ci0JCX0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQWRkcyBhIG5ldyBjb21tZW50IGZvciB0aGUgcmFuZ2UuCi0JCS8vLyBJZiB0aGlzIHJhbmdlIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgY2VsbCwgdGhlIHRvcCBsZWZ0IGNvbW1lbnQgaXMgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJUZXh0Ij48L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9IkF1dGhvciI+PC9wYXJhbT4KLQkJLy8vIDxyZXR1cm5zPkEgcmVmZXJlbmNlIGNvbW1lbnQgb2YgdGhlIHRvcCBsZWZ0IGNlbGw8L3JldHVybnM+Ci0JCXB1YmxpYyBFeGNlbENvbW1lbnQgQWRkQ29tbWVudChzdHJpbmcgVGV4dCwgc3RyaW5nIEF1dGhvcikKLQkJewotCQkgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KEF1dGhvcikpCi0JCSAgICB7Ci0JCSAgICAgICAgQXV0aG9yID0gVGhyZWFkLkN1cnJlbnRQcmluY2lwYWwuSWRlbnRpdHkuTmFtZTsKLQkJICAgIH0KLSAgICAgICAgICAgIC8vQ2hlY2sgaWYgYW55IGNvbW1lbnRzIGV4aXN0cyBpbiB0aGUgcmFuZ2UgYW5kIHRocm93IGFuIGV4Y2VwdGlvbgotCQkJX2NoYW5nZVByb3BNZXRob2QoRXhpc3RzX0NvbW1lbnQsIG51bGwpOwotCQkJLy9DcmVhdGUgdGhlIGNvbW1lbnRzCi0JCQlfY2hhbmdlUHJvcE1ldGhvZChTZXRfQ29tbWVudCwgbmV3IHN0cmluZ1tdIHsgVGV4dCwgQXV0aG9yIH0pOwotCi0JCQlyZXR1cm4gX3dvcmtzaGVldC5Db21tZW50c1tuZXcgRXhjZWxDZWxsQWRkcmVzcyhfZnJvbVJvdywgX2Zyb21Db2wpXTsKLQkJfQotCi0gICAgICAgIC8vLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8vLyBDb3BpZXMgdGhlIHJhbmdlIG9mIGNlbGxzIHRvIGFuIG90aGVyIHJhbmdlCi0gICAgICAgIC8vLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vLy8gPHBhcmFtIG5hbWU9IkRlc3RpbmF0aW9uIj5UaGUgc3RhcnQgY2VsbCB3aGVyZSB0aGUgcmFuZ2Ugd2lsbCBiZSBjb3BpZWQuPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgQ29weShFeGNlbFJhbmdlQmFzZSBEZXN0aW5hdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbCBzYW1lV29ya2Jvb2sgPSBEZXN0aW5hdGlvbi5fd29ya3NoZWV0Lldvcmtib29rID09IF93b3Jrc2hlZXQuV29ya2Jvb2s7Ci0gICAgICAgICAgICBFeGNlbFN0eWxlcyBzb3VyY2VTdHlsZXMgPSBfd29ya3NoZWV0Lldvcmtib29rLlN0eWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcyA9IERlc3RpbmF0aW9uLl93b3Jrc2hlZXQuV29ya2Jvb2suU3R5bGVzOwotICAgICAgICAgICAgRGljdGlvbmFyeTxpbnQsIGludD4gc3R5bGVDYXNoZSA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOwotCi0gICAgICAgICAgICAvL0NsZWFyIGFsbCBleGlzdGluZyBjZWxsczsgCi0gICAgICAgICAgICBpbnQgdG9Sb3cgPSBfdG9Sb3cgLSBfZnJvbVJvdyArIDEsCi0gICAgICAgICAgICAgICAgdG9Db2wgPSBfdG9Db2wgLSBfZnJvbUNvbCArIDE7Ci0KLSAgICAgICAgICAgIHN0cmluZyBzID0gIiI7Ci0gICAgICAgICAgICBpbnQgaT0wOwotICAgICAgICAgICAgb2JqZWN0IG8gPSBudWxsOwotICAgICAgICAgICAgYnl0ZSBmbGFnPTA7Ci0gICAgICAgICAgICBVcmkgaGwgPSBudWxsOwotICAgICAgICAgICAgRXhjZWxDb21tZW50IGNvbW1lbnQ9bnVsbDsKLQotICAgICAgICAgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF93b3Jrc2hlZXQuX3ZhbHVlcywgX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCk7Ci0gICAgICAgICAgICB2YXIgY29waWVkVmFsdWUgPSBuZXcgTGlzdDxDb3BpZWRDZWxsPigpOwotICAgICAgICAgICAgd2hpbGUgKGNzZS5OZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJvdz1jc2UuUm93OwotICAgICAgICAgICAgICAgIHZhciBjb2wgPSBjc2UuQ29sdW1uOyAgICAgICAvL0lzc3VlIDE1MDcwCi0gICAgICAgICAgICAgICAgdmFyIGNlbGwgPSBuZXcgQ29waWVkQ2VsbAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUm93ID0gRGVzdGluYXRpb24uX2Zyb21Sb3cgKyAocm93IC0gX2Zyb21Sb3cpLAotICAgICAgICAgICAgICAgICAgICBDb2x1bW4gPSBEZXN0aW5hdGlvbi5fZnJvbUNvbCArIChjb2wgLSBfZnJvbUNvbCksCi0gICAgICAgICAgICAgICAgICAgIFZhbHVlPWNzZS5WYWx1ZQotICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICAgICAvL0Rlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgY3NlLlZhbHVlKTsKLQotICAgICAgICAgICAgICAgIGlmIChfd29ya3NoZWV0Ll90eXBlcy5FeGlzdHMocm93LCBjb2wsIHJlZiBzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vRGVzdGluYXRpb24uX3dvcmtzaGVldC5fdHlwZXMuU2V0VmFsdWUocm93LCBjb2wscyk7Ci0gICAgICAgICAgICAgICAgICAgIGNlbGwuVHlwZT1zOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChfd29ya3NoZWV0Ll9mb3JtdWxhcy5FeGlzdHMocm93LCBjb2wsIHJlZiBvKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvIGlzIGludCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9mb3JtdWxhcy5TZXRWYWx1ZShyb3csIGNvbCwgX3dvcmtzaGVldC5HZXRGb3JtdWxhKGNzZS5Sb3csIGNzZS5Db2x1bW4pKTsgICAgLy9TaGFyZWQgZm9ybXVsYXMsIHNldCB0aGUgZm9ybXVsYSBwZXIgY2VsbCB0byBzaW1wbGlmeQotICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5Gb3JtdWxhPV93b3Jrc2hlZXQuR2V0Rm9ybXVsYShjc2UuUm93LCBjc2UuQ29sdW1uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vRGVzdGluYXRpb24uX3dvcmtzaGVldC5fZm9ybXVsYXMuU2V0VmFsdWUocm93LCBjb2wsIG8pOwotICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5Gb3JtdWxhPW87Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoX3dvcmtzaGVldC5fc3R5bGVzLkV4aXN0cyhyb3csIGNvbCwgcmVmIGkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNhbWVXb3JrYm9vaykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9EZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9zdHlsZXMuU2V0VmFsdWUocm93LCBjb2wsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5TdHlsZUlEPWk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVDYXNoZS5Db250YWluc0tleShpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gc3R5bGVDYXNoZVtpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2xkU3R5bGVJRCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHN0eWxlcy5DbG9uZVN0eWxlKHNvdXJjZVN0eWxlcywgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDYXNoZS5BZGQob2xkU3R5bGVJRCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0Rlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX3N0eWxlcy5TZXRWYWx1ZShyb3csIGNvbCwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjZWxsLlN0eWxlSUQ9aTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoX3dvcmtzaGVldC5faHlwZXJMaW5rcy5FeGlzdHMocm93LCBjb2wsIHJlZiBobCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL0Rlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX2h5cGVyTGlua3MuU2V0VmFsdWUocm93LCBjb2wsIGhsKTsKLSAgICAgICAgICAgICAgICAgICAgY2VsbC5IeXBlckxpbms9aGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoX3dvcmtzaGVldC5fY29tbWVudHNTdG9yZS5FeGlzdHMocm93LCBjb2wsIHJlZiBjb21tZW50KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNlbGwuQ29tbWVudD1jb21tZW50OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChfd29ya3NoZWV0Ll9mbGFncy5FeGlzdHMocm93LCBjb2wsIHJlZiBmbGFnKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNlbGwuRmxhZyA9IGZsYWc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvcGllZFZhbHVlLkFkZChjZWxsKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9Db3B5IHN0eWxlcyB3aXRoIG5vIGNlbGwgdmFsdWUKLSAgICAgICAgICAgIHZhciBjc2VzID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPGludD4oX3dvcmtzaGVldC5fc3R5bGVzLCBfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sKTsKLSAgICAgICAgICAgIHdoaWxlIChjc2VzLk5leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIV93b3Jrc2hlZXQuX3ZhbHVlcy5FeGlzdHMoY3Nlcy5Sb3csIGNzZXMuQ29sdW1uKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciByb3cgPSBEZXN0aW5hdGlvbi5fZnJvbVJvdyArIChjc2VzLlJvdyAtIF9mcm9tUm93KTsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGNvbCA9IERlc3RpbmF0aW9uLl9mcm9tQ29sICsgKGNzZXMuQ29sdW1uIC0gX2Zyb21Db2wpOwotICAgICAgICAgICAgICAgICAgICB2YXIgY2VsbCA9IG5ldyBDb3BpZWRDZWxsCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJvdyA9IHJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbiA9IGNvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0gbnVsbAotICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAgICAgICAgIGkgPSBjc2VzLlZhbHVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2FtZVdvcmtib29rKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjZWxsLlN0eWxlSUQgPSBpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlQ2FzaGUuQ29udGFpbnNLZXkoaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHN0eWxlQ2FzaGVbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9sZFN0eWxlSUQgPSBpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBzdHlsZXMuQ2xvbmVTdHlsZShzb3VyY2VTdHlsZXMsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2FzaGUuQWRkKG9sZFN0eWxlSUQsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy9EZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9zdHlsZXMuU2V0VmFsdWUocm93LCBjb2wsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY2VsbC5TdHlsZUlEID0gaTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb3BpZWRWYWx1ZS5BZGQoY2VsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIGNvcGllZE1lcmdlZENlbGxzID0gbmV3IERpY3Rpb25hcnk8aW50LCBFeGNlbEFkZHJlc3M+KCk7Ci0gICAgICAgICAgICAvL01lcmdlZCBjZWxscwotICAgICAgICAgICAgdmFyIGNzZW0gPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50Pihfd29ya3NoZWV0Lk1lcmdlZENlbGxzLl9jZWxscywgX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCk7Ci0gICAgICAgICAgICB3aGlsZSAoY3NlbS5OZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoIWNvcGllZE1lcmdlZENlbGxzLkNvbnRhaW5zS2V5KGNzZW0uVmFsdWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGFkciA9IG5ldyBFeGNlbEFkZHJlc3MoX3dvcmtzaGVldC5OYW1lLCBfd29ya3NoZWV0Lk1lcmdlZENlbGxzLkxpc3RbY3NlbS5WYWx1ZV0pOwotICAgICAgICAgICAgICAgICAgICBpZih0aGlzLkNvbGxpZGUoYWRyKT09ZUFkZHJlc3NDb2xsaXRpb24uSW5zaWRlKQotICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRNZXJnZWRDZWxscy5BZGQoY3NlbS5WYWx1ZSwgbmV3IEV4Y2VsQWRkcmVzcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbi5fZnJvbVJvdyArIChhZHIuU3RhcnQuUm93IC0gX2Zyb21Sb3cpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uLl9mcm9tQ29sICsgKGFkci5TdGFydC5Db2x1bW4gLSBfZnJvbUNvbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24uX2Zyb21Sb3cgKyAoYWRyLkVuZC5Sb3cgLSBfZnJvbVJvdyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24uX2Zyb21Db2wgKyAoYWRyLkVuZC5Db2x1bW4gLSBfZnJvbUNvbCkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vUGFydGlhbCBtZXJnZSBvZiB0aGUgYWRkcmVzcyBpZ25vcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWRNZXJnZWRDZWxscy5BZGQoY3NlbS5WYWx1ZSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERlc3RpbmF0aW9uLl93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuQ2xlYXIobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoRGVzdGluYXRpb24uX2Zyb21Sb3csIERlc3RpbmF0aW9uLl9mcm9tQ29sLCBEZXN0aW5hdGlvbi5fZnJvbVJvdyt0b1Jvdy0xLCBEZXN0aW5hdGlvbi5fZnJvbUNvbCt0b0NvbC0xKSk7Ci0KLSAgICAgICAgICAgIERlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX3ZhbHVlcy5DbGVhcihEZXN0aW5hdGlvbi5fZnJvbVJvdywgRGVzdGluYXRpb24uX2Zyb21Db2wsIHRvUm93LCB0b0NvbCk7Ci0gICAgICAgICAgICBEZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9mb3JtdWxhcy5DbGVhcihEZXN0aW5hdGlvbi5fZnJvbVJvdywgRGVzdGluYXRpb24uX2Zyb21Db2wsIHRvUm93LCB0b0NvbCk7Ci0gICAgICAgICAgICBEZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9zdHlsZXMuQ2xlYXIoRGVzdGluYXRpb24uX2Zyb21Sb3csIERlc3RpbmF0aW9uLl9mcm9tQ29sLCB0b1JvdywgdG9Db2wpOwotICAgICAgICAgICAgRGVzdGluYXRpb24uX3dvcmtzaGVldC5fdHlwZXMuQ2xlYXIoRGVzdGluYXRpb24uX2Zyb21Sb3csIERlc3RpbmF0aW9uLl9mcm9tQ29sLCB0b1JvdywgdG9Db2wpOwotICAgICAgICAgICAgRGVzdGluYXRpb24uX3dvcmtzaGVldC5faHlwZXJMaW5rcy5DbGVhcihEZXN0aW5hdGlvbi5fZnJvbVJvdywgRGVzdGluYXRpb24uX2Zyb21Db2wsIHRvUm93LCB0b0NvbCk7Ci0gICAgICAgICAgICBEZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9mbGFncy5DbGVhcihEZXN0aW5hdGlvbi5fZnJvbVJvdywgRGVzdGluYXRpb24uX2Zyb21Db2wsIHRvUm93LCB0b0NvbCk7Ci0gICAgICAgICAgICBEZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9jb21tZW50c1N0b3JlLkNsZWFyKERlc3RpbmF0aW9uLl9mcm9tUm93LCBEZXN0aW5hdGlvbi5fZnJvbUNvbCwgdG9Sb3csIHRvQ29sKTsKLSAgICAgICAgICAgCi0gICAgICAgICAgICBmb3JlYWNoKHZhciBjZWxsIGluIGNvcGllZFZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShjZWxsLlJvdywgY2VsbC5Db2x1bW4sIGNlbGwuVmFsdWUpOwotCi0gICAgICAgICAgICAgICAgaWYoY2VsbC5UeXBlIT1udWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24uX3dvcmtzaGVldC5fdHlwZXMuU2V0VmFsdWUoY2VsbC5Sb3csIGNlbGwuQ29sdW1uLCBjZWxsLlR5cGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGNlbGwuU3R5bGVJRCE9bnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX3N0eWxlcy5TZXRWYWx1ZShjZWxsLlJvdywgY2VsbC5Db2x1bW4sIGNlbGwuU3R5bGVJRC5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoY2VsbC5Gb3JtdWxhIT1udWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2VsbC5Gb3JtdWxhID0gVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoY2VsbC5Gb3JtdWxhLlRvU3RyaW5nKCksIERlc3RpbmF0aW9uLl9mcm9tUm93IC0gX2Zyb21Sb3csIERlc3RpbmF0aW9uLl9mcm9tQ29sIC0gX2Zyb21Db2wsIDAsIDAsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9mb3JtdWxhcy5TZXRWYWx1ZShjZWxsLlJvdywgY2VsbC5Db2x1bW4sIGNlbGwuRm9ybXVsYSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGNlbGwuSHlwZXJMaW5rIT1udWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVzdGluYXRpb24uX3dvcmtzaGVldC5faHlwZXJMaW5rcy5TZXRWYWx1ZShjZWxsLlJvdywgY2VsbC5Db2x1bW4sIGNlbGwuSHlwZXJMaW5rKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2VsbC5Db21tZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL0Rlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX2NvbW1lbnRzU3RvcmUuU2V0VmFsdWUoY2VsbC5Sb3csIGNlbGwuQ29sdW1uLCBjZWxsLkNvbW1lbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2VsbC5GbGFnICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9mbGFncy5TZXRWYWx1ZShjZWxsLlJvdywgY2VsbC5Db2x1bW4sIGNlbGwuRmxhZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL0FkZCBtZXJnZWQgY2VsbHMKLSAgICAgICAgICAgIGZvcmVhY2godmFyIG0gaW4gY29waWVkTWVyZ2VkQ2VsbHMuVmFsdWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKG0hPW51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEZXN0aW5hdGlvbi5fd29ya3NoZWV0Lk1lcmdlZENlbGxzLkFkZChtLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgLy9DbG9uZSB0aGUgY2VsbAotICAgICAgICAgICAgICAgIC8vdmFyIGNvcGllZENlbGwgPSAoX3dvcmtzaGVldC5fY2VsbHNbR2V0Q2VsbElEKF93b3Jrc2hlZXQuU2hlZXRJRCwgY2VsbC5fZnJvbVJvdywgY2VsbC5jb2x1bW4pXSBhcyBFeGNlbENlbGwpOwotCi0gICAgICAgICAgICAgICAgLy92YXIgbmV3Q2VsbCA9IGNvcGllZENlbGwuQ2xvbmUoRGVzdGluYXRpb24uX3dvcmtzaGVldCwKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgRGVzdGluYXRpb24uX2Zyb21Sb3cgKyAoY29waWVkQ2VsbC5Sb3cgLSBfZnJvbVJvdyksCi0gICAgICAgICAgICAgICAgLy8gICAgICAgIERlc3RpbmF0aW9uLmNvbHVtbiArIChjb3BpZWRDZWxsLkNvbHVtbiAtIGNvbHVtbikpOwotCi0gICAgICAgIC8vICAgICAgICBuZXdDZWxsLk1lcmdlSWQgPSBfd29ya3NoZWV0LkdldE1lcmdlQ2VsbElkKGNvcGllZENlbGwuUm93LCBjb3BpZWRDZWxsLkNvbHVtbik7Ci0KLQotICAgICAgICAvLyAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShuZXdDZWxsLkZvcm11bGEpKQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIG5ld0NlbGwuRm9ybXVsYSA9IEV4Y2VsQ2VsbC5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhuZXdDZWxsLkZvcm11bGEsIG5ld0NlbGwuUm93IC0gY29waWVkQ2VsbC5Sb3csIChuZXdDZWxsLkNvbHVtbiAtIGNvcGllZENlbGwuQ29sdW1uKSwgMSwgMSk7Ci0gICAgICAgIC8vICAgICAgICB9Ci0KLSAgICAgICAgLy8gICAgICAgIC8vSWYgaXRzIG5vdCB0aGUgc2FtZSB3b3JrYm9vayB3ZSBtdXN0IGNvcHkgdGhlIHN0eWxlcyB0byB0aGUgbmV3IHdvcmtib29rLgotICAgICAgICAvLyAgICAgICAgaWYgKCFzYW1lV29ya2Jvb2spCi0gICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgaWYgKHN0eWxlQ2FzaGUuQ29udGFpbnNLZXkoY2VsbC5TdHlsZUlEKSkKLSAgICAgICAgLy8gICAgICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgIG5ld0NlbGwuU3R5bGVJRCA9IHN0eWxlQ2FzaGVbY2VsbC5TdHlsZUlEXTsKLSAgICAgICAgLy8gICAgICAgICAgICB9Ci0gICAgICAgIC8vICAgICAgICAgICAgZWxzZQotICAgICAgICAvLyAgICAgICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgbmV3Q2VsbC5TdHlsZUlEID0gc3R5bGVzLkNsb25lU3R5bGUoc291cmNlU3R5bGVzLCBjZWxsLlN0eWxlSUQpOwotICAgICAgICAvLyAgICAgICAgICAgICAgICBzdHlsZUNhc2hlLkFkZChjZWxsLlN0eWxlSUQsIG5ld0NlbGwuU3R5bGVJRCk7Ci0gICAgICAgIC8vICAgICAgICAgICAgfQotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAvLyAgICAgICAgbmV3Q2VsbHMuQWRkKG5ld0NlbGwpOwotICAgICAgICAvLyAgICAgICAgaWYgKG5ld0NlbGwuTWVyZ2UpIG1lcmdlZENlbGxzLkFkZChuZXdDZWxsLkNlbGxJRCwgbmV3Q2VsbCk7Ci0gICAgICAgIC8vICAgIH0KLQotICAgICAgICAvLyAgICAvL05vdyBjbGVhciB0aGUgZGVzdGluYXRpb24uCi0gICAgICAgIC8vICAgIERlc3RpbmF0aW9uLk9mZnNldCgwLCAwLCAoX3RvUm93IC0gX2Zyb21Sb3cpICsgMSwgKF90b0NvbCAtIGNvbHVtbikgKyAxKS5DbGVhcigpOwotCi0gICAgICAgIC8vICAgIC8vQW5kIGxhc3QgYWRkIHRoZSBuZXcgY2VsbHMgdG8gdGhlIHdvcmtzaGVldAotICAgICAgICAvLyAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiBuZXdDZWxscykKLSAgICAgICAgLy8gICAgewotICAgICAgICAvLyAgICAgICAgRGVzdGluYXRpb24uV29ya3NoZWV0Ll9jZWxscy5BZGQoY2VsbCk7Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy8gICAgLy9BZGQgbWVyZ2VkIGNlbGxzCi0gICAgICAgIC8vICAgIGlmIChtZXJnZWRDZWxscy5Db3VudCA+IDApCi0gICAgICAgIC8vICAgIHsKLSAgICAgICAgLy8gICAgICAgIExpc3Q8RXhjZWxBZGRyZXNzQmFzZT4gbWVyZ2VkQWRkcmVzc2VzID0gbmV3IExpc3Q8RXhjZWxBZGRyZXNzQmFzZT4oKTsKLSAgICAgICAgLy8gICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIG1lcmdlZENlbGxzLlZhbHVlcykKLSAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICBpZiAoIUlzQWRkZWQoY2VsbCwgbWVyZ2VkQWRkcmVzc2VzKSkKLSAgICAgICAgLy8gICAgICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgIGludCBzdGFydFJvdyA9IGNlbGwuUm93LCBzdGFydENvbCA9IGNlbGwuQ29sdW1uLCBlbmRSb3cgPSBjZWxsLlJvdywgZW5kQ29sID0gY2VsbC5Db2x1bW4gKyAxOwotICAgICAgICAvLyAgICAgICAgICAgICAgICB3aGlsZSAobWVyZ2VkQ2VsbHMuQ29udGFpbnNLZXkoRXhjZWxDZWxsLkdldENlbGxJRChEZXN0aW5hdGlvbi5Xb3Jrc2hlZXQuU2hlZXRJRCwgZW5kUm93LCBlbmRDb2wpKSkKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgRXhjZWxDZWxsIG5leHQgPSBtZXJnZWRDZWxsc1tFeGNlbENlbGwuR2V0Q2VsbElEKERlc3RpbmF0aW9uLldvcmtzaGVldC5TaGVldElELCBlbmRSb3csIGVuZENvbCldOwotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGwuTWVyZ2VJZCAhPSBuZXh0Lk1lcmdlSWQpCi0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBlbmRDb2wrKzsKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgfQotCi0gICAgICAgIC8vICAgICAgICAgICAgICAgIHdoaWxlIChJc01lcmdlZChtZXJnZWRDZWxscywgRGVzdGluYXRpb24uV29ya3NoZWV0LCBlbmRSb3csIHN0YXJ0Q29sLCBlbmRDb2wgLSAxLCBjZWxsKSkKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgZW5kUm93Kys7Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAvLyAgICAgICAgICAgICAgICBtZXJnZWRBZGRyZXNzZXMuQWRkKG5ldyBFeGNlbEFkZHJlc3NCYXNlKHN0YXJ0Um93LCBzdGFydENvbCwgZW5kUm93IC0gMSwgZW5kQ29sIC0gMSkpOwotICAgICAgICAvLyAgICAgICAgICAgIH0KLSAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgLy8gICAgICAgIERlc3RpbmF0aW9uLldvcmtzaGVldC5NZXJnZWRDZWxscy5MaXN0LkFkZFJhbmdlKChmcm9tIHIgaW4gbWVyZ2VkQWRkcmVzc2VzIHNlbGVjdCByLkFkZHJlc3MpKTsKLSAgICAgICAgLy8gICAgfQotICAgICAgICAvL30KLQotICAgICAgICAvL3ByaXZhdGUgYm9vbCBJc0FkZGVkKEV4Y2VsQ2VsbCBjZWxsLCBMaXN0PEV4Y2VsQWRkcmVzc0Jhc2U+IG1lcmdlZEFkZHJlc3NlcykKLSAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIGZvcmVhY2ggKHZhciBhZGRyZXNzIGluIG1lcmdlZEFkZHJlc3NlcykKLSAgICAgICAgLy8gICAgewotICAgICAgICAvLyAgICAgICAgaWYgKGFkZHJlc3MuQ29sbGlkZShuZXcgRXhjZWxBZGRyZXNzQmFzZShjZWxsLkNlbGxBZGRyZXNzKSkgPT0gZUFkZHJlc3NDb2xsaXRpb24uSW5zaWRlKQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAvLyAgICB9Ci0gICAgICAgIC8vICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgLy99Ci0KLSAgICAgICAgLy9wcml2YXRlIGJvb2wgSXNNZXJnZWQoRGljdGlvbmFyeTx1bG9uZywgRXhjZWxDZWxsPiBtZXJnZWRDZWxscywgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBpbnQgcm93LCBpbnQgc3RhcnRDb2wsIGludCBlbmRDb2wsIEV4Y2VsQ2VsbCBjZWxsKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgZm9yIChpbnQgY29sID0gc3RhcnRDb2w7IGNvbCA8PSBlbmRDb2w7IGNvbCsrKQotICAgICAgICAvLyAgICB7Ci0gICAgICAgIC8vICAgICAgICBpZiAoIW1lcmdlZENlbGxzLkNvbnRhaW5zS2V5KEV4Y2VsQ2VsbC5HZXRDZWxsSUQod29ya3NoZWV0LlNoZWV0SUQsIHJvdywgY29sKSkpCi0gICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAvLyAgICAgICAgZWxzZQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIEV4Y2VsQ2VsbCBuZXh0ID0gbWVyZ2VkQ2VsbHNbRXhjZWxDZWxsLkdldENlbGxJRCh3b3Jrc2hlZXQuU2hlZXRJRCwgcm93LCBjb2wpXTsKLSAgICAgICAgLy8gICAgICAgICAgICBpZiAoY2VsbC5NZXJnZUlkICE9IG5leHQuTWVyZ2VJZCkKLSAgICAgICAgLy8gICAgICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgLy8gICAgICAgICAgICB9Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy8gICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBDbGVhciBhbGwgY2VsbHMKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIHZvaWQgQ2xlYXIoKQotCQl7Ci0JCQlEZWxldGUodGhpcywgZmFsc2UpOwotCQl9Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIENyZWF0ZXMgYW4gYXJyYXktZm9ybXVsYS4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJBcnJheUZvcm11bGEiPlRoZSBmb3JtdWxhPC9wYXJhbT4KLQkJcHVibGljIHZvaWQgQ3JlYXRlQXJyYXlGb3JtdWxhKHN0cmluZyBBcnJheUZvcm11bGEpCi0JCXsKLQkJCWlmIChBZGRyZXNzZXMgIT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyAobmV3IEV4Y2VwdGlvbigiQW4gQXJyYXlmb3JtdWxhIGNhbiBub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGFkZHJlc3MiKSk7Ci0JCQl9Ci0JCQlTZXRfU2hhcmVkRm9ybXVsYShBcnJheUZvcm11bGEsIHRoaXMsIHRydWUpOwotCQl9Ci0gICAgICAgIC8vcHJpdmF0ZSB2b2lkIENsZWFyKEV4Y2VsQWRkcmVzc0Jhc2UgUmFuZ2UpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBDbGVhcihSYW5nZSwgdHJ1ZSk7Ci0gICAgICAgIC8vfQotICAgICAgICBpbnRlcm5hbCB2b2lkIERlbGV0ZShFeGNlbEFkZHJlc3NCYXNlIFJhbmdlLCBib29sIHNoaWZ0KQotCQl7Ci0gICAgICAgICAgICAvL0RlbGV0ZUNoZWNrTWVyZ2VkQ2VsbHMoUmFuZ2UpOwotICAgICAgICAgICAgX3dvcmtzaGVldC5NZXJnZWRDZWxscy5DbGVhcihSYW5nZSk7Ci0JCQkvL0ZpcnN0IGZpbmQgdGhlIHN0YXJ0IGNlbGwKLSAgICAgICAgICAgIGludCBmcm9tUm93LCBmcm9tQ29sOwotICAgICAgICAgICAgdmFyIGQgPSBXb3Jrc2hlZXQuRGltZW5zaW9uOwotICAgICAgICAgICAgaWYgKGQgIT0gbnVsbCAmJiBSYW5nZS5fZnJvbVJvdyA8PSBkLl9mcm9tUm93ICYmIFJhbmdlLl90b1JvdyA+PSBkLl90b1JvdykgLy9FbnRpcmVSb3c/Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJvbVJvdyA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnJvbVJvdyA9IFJhbmdlLl9mcm9tUm93OyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkICE9IG51bGwgJiYgUmFuZ2UuX2Zyb21Db2wgPD0gZC5fZnJvbUNvbCAmJiBSYW5nZS5fdG9Db2wgPj0gZC5fdG9Db2wpIC8vRW50aXJlUm93PwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyb21Db2wgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZyb21Db2wgPSBSYW5nZS5fZnJvbUNvbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdmFyIHJvd3MgPSBSYW5nZS5fdG9Sb3cgLSBmcm9tUm93ICsgMTsKLSAgICAgICAgICAgIHZhciBjb2xzID0gUmFuZ2UuX3RvQ29sIC0gZnJvbUNvbCArIDE7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5EZWxldGUoZnJvbVJvdywgZnJvbUNvbCwgcm93cywgY29scywgc2hpZnQpOwotICAgICAgICAgICAgX3dvcmtzaGVldC5fdHlwZXMuRGVsZXRlKGZyb21Sb3csIGZyb21Db2wsIHJvd3MsIGNvbHMsIHNoaWZ0KTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuX3N0eWxlcy5EZWxldGUoZnJvbVJvdywgZnJvbUNvbCwgcm93cywgY29scywgc2hpZnQpOwotICAgICAgICAgICAgX3dvcmtzaGVldC5fZm9ybXVsYXMuRGVsZXRlKGZyb21Sb3csIGZyb21Db2wsIHJvd3MsIGNvbHMsIHNoaWZ0KTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuX2h5cGVyTGlua3MuRGVsZXRlKGZyb21Sb3csIGZyb21Db2wsIHJvd3MsIGNvbHMsIHNoaWZ0KTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQuX2ZsYWdzLkRlbGV0ZShmcm9tUm93LCBmcm9tQ29sLCByb3dzLCBjb2xzLCBzaGlmdCk7Ci0gICAgICAgICAgICBfd29ya3NoZWV0Ll9jb21tZW50c1N0b3JlLkRlbGV0ZShmcm9tUm93LCBmcm9tQ29sLCByb3dzLCBjb2xzLCBzaGlmdCk7Ci0KLSAgICAgICAgICAgIC8vaWYoc2hpZnQpCi0gICAgICAgICAgICAvL3sKLSAgICAgICAgICAgIC8vICAgIF93b3Jrc2hlZXQuQWRqdXN0Rm9ybXVsYXNSb3coZnJvbVJvdywgcm93cyk7Ci0gICAgICAgICAgICAvL30KLQotCQkJLy9DbGVhciBtdWx0aSBhZGRyZXNzZXMgYXMgd2VsbAotCQkJaWYgKEFkZHJlc3NlcyAhPSBudWxsKQotCQkJewotCQkJCWZvcmVhY2ggKHZhciBzdWIgaW4gQWRkcmVzc2VzKQotCQkJCXsKLQkJCQkJRGVsZXRlKHN1Yiwgc2hpZnQpOwotCQkJCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBEZWxldGVDaGVja01lcmdlZENlbGxzKEV4Y2VsQWRkcmVzc0Jhc2UgUmFuZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZW1vdmVJdGVtcyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhZGRyIGluIFdvcmtzaGVldC5NZXJnZWRDZWxscykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgYWRkckNvbCA9IFJhbmdlLkNvbGxpZGUobmV3IEV4Y2VsQWRkcmVzcyhSYW5nZS5Xb3JrU2hlZXQsIGFkZHIpKTsKLSAgICAgICAgICAgICAgICBpZiAoYWRkckNvbCAhPSBlQWRkcmVzc0NvbGxpdGlvbi5ObykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhZGRyQ29sID09IGVBZGRyZXNzQ29sbGl0aW9uLkluc2lkZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSXRlbXMuQWRkKGFkZHIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4ndCByZW1vdmUvb3ZlcndyaXRlIGEgcGFydCBvZiBjZWxscyB0aGF0IGFyZSBtZXJnZWQiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiByZW1vdmVJdGVtcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXb3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuUmVtb3ZlKGl0ZW0pOwotCQkJfQotCQl9Ci0JCSNlbmRyZWdpb24KLQkJI3JlZ2lvbiBJRGlzcG9zYWJsZSBNZW1iZXJzCi0KLQkJcHVibGljIHZvaWQgRGlzcG9zZSgpCi0JCXsKLQkJfQotCi0JCSNlbmRyZWdpb24KLQkJI3JlZ2lvbiAiRW51bWVyYXRvciIKLSAgICAgICAgLy9pbnQgX2luZGV4OwotICAgICAgICAvL3Vsb25nIF90b0NlbGxJZDsKLSAgICAgICAgLy9pbnQgX2VudW1BZGRyZXNzSXg7Ci0gICAgICAgIENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4gY2VsbEVudW07Ci0JCXB1YmxpYyBJRW51bWVyYXRvcjxFeGNlbFJhbmdlQmFzZT4gR2V0RW51bWVyYXRvcigpCi0JCXsKLQkJCVJlc2V0KCk7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCUlFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQotCQl7Ci0JCQlSZXNldCgpOwotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBUaGUgY3VycmVudCByYW5nZSB3aGVuIGVudW1lcmF0aW5nCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBFeGNlbFJhbmdlQmFzZSBDdXJyZW50Ci0JCXsKLQkJCWdldAotCQkJewotCQkJCXJldHVybiBuZXcgRXhjZWxSYW5nZUJhc2UoX3dvcmtzaGVldCwgRXhjZWxBZGRyZXNzQmFzZS5HZXRBZGRyZXNzKGNlbGxFbnVtLlJvdywgY2VsbEVudW0uQ29sdW1uKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBUaGUgY3VycmVudCByYW5nZSB3aGVuIGVudW1lcmF0aW5nCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCW9iamVjdCBJRW51bWVyYXRvci5DdXJyZW50Ci0JCXsKLQkJCWdldAotCQkJewotCQkJCXJldHVybiAoKG9iamVjdCkobmV3IEV4Y2VsUmFuZ2VCYXNlKF93b3Jrc2hlZXQsIEV4Y2VsQWRkcmVzc0Jhc2UuR2V0QWRkcmVzcyhjZWxsRW51bS5Sb3csIGNlbGxFbnVtLkNvbHVtbikpKSk7Ci0JCQl9Ci0JCX0KLQotCQlpbnQgX2VudW1BZGRyZXNzSXggPSAtMTsKLSAgICAgICAgcHVibGljIGJvb2wgTW92ZU5leHQoKQotCQl7Ci0gICAgICAgICAgICBpZiAoY2VsbEVudW0uTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoX2FkZHJlc3NlcyE9bnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZW51bUFkZHJlc3NJeCsrOwotICAgICAgICAgICAgICAgIGlmIChfZW51bUFkZHJlc3NJeCA8IF9hZGRyZXNzZXMuQ291bnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjZWxsRW51bSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF93b3Jrc2hlZXQuX3ZhbHVlcywgCi0gICAgICAgICAgICAgICAgICAgICAgICBfYWRkcmVzc2VzW19lbnVtQWRkcmVzc0l4XS5fZnJvbVJvdywgCi0gICAgICAgICAgICAgICAgICAgICAgICBfYWRkcmVzc2VzW19lbnVtQWRkcmVzc0l4XS5fZnJvbUNvbCwgCi0gICAgICAgICAgICAgICAgICAgICAgICBfYWRkcmVzc2VzW19lbnVtQWRkcmVzc0l4XS5fdG9Sb3csIAotICAgICAgICAgICAgICAgICAgICAgICAgX2FkZHJlc3Nlc1tfZW51bUFkZHJlc3NJeF0uX3RvQ29sKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1vdmVOZXh0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBSZXNldCgpCi0JCXsKLSAgICAgICAgICAgIF9lbnVtQWRkcmVzc0l4ID0gLTE7Ci0gICAgICAgICAgICBjZWxsRW51bSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF93b3Jrc2hlZXQuX3ZhbHVlcywgX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3ByaXZhdGUgdm9pZCBHZXROZXh0SW5kZXhFbnVtKGludCBmcm9tUm93LCBpbnQgZnJvbUNvbCwgaW50IHRvUm93LCBpbnQgdG9Db2wpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBpZiAoX2luZGV4ID49IF93b3Jrc2hlZXQuX2NlbGxzLkNvdW50KSByZXR1cm47Ci0gICAgICAgIC8vICAgIEV4Y2VsQ2VsbCBjZWxsID0gX3dvcmtzaGVldC5fY2VsbHNbX2luZGV4XSBhcyBFeGNlbENlbGw7Ci0gICAgICAgIC8vICAgIHdoaWxlIChjZWxsLkNvbHVtbiA+IHRvQ29sIHx8IGNlbGwuQ29sdW1uIDwgZnJvbUNvbCkKLSAgICAgICAgLy8gICAgewotICAgICAgICAvLyAgICAgICAgaWYgKGNlbGwuQ29sdW1uIDwgZnJvbUNvbCkKLSAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICBfaW5kZXggPSBfd29ya3NoZWV0Ll9jZWxscy5JbmRleE9mKEV4Y2VsQWRkcmVzcy5HZXRDZWxsSUQoX3dvcmtzaGVldC5TaGVldElELCBjZWxsLlJvdywgZnJvbUNvbCkpOwotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAvLyAgICAgICAgZWxzZQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIF9pbmRleCA9IF93b3Jrc2hlZXQuX2NlbGxzLkluZGV4T2YoRXhjZWxBZGRyZXNzLkdldENlbGxJRChfd29ya3NoZWV0LlNoZWV0SUQsIGNlbGwuUm93ICsgMSwgZnJvbUNvbCkpOwotICAgICAgICAvLyAgICAgICAgfQotCi0gICAgICAgIC8vICAgICAgICBpZiAoX2luZGV4IDwgMCkKLSAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgLy8gICAgICAgICAgICBfaW5kZXggPSB+X2luZGV4OwotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAvLyAgICAgICAgaWYgKF9pbmRleCA+PSBfd29ya3NoZWV0Ll9jZWxscy5Db3VudCB8fCBfd29ya3NoZWV0Ll9jZWxsc1tfaW5kZXhdLlJhbmdlSUQgPiBfdG9DZWxsSWQpCi0gICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8vICAgICAgICBjZWxsID0gX3dvcmtzaGVldC5fY2VsbHNbX2luZGV4XSBhcyBFeGNlbENlbGw7Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy99Ci0KLSAgICAgICAgLy9wcml2YXRlIHZvaWQgR2V0U3RhcnRJbmRleEVudW0oaW50IGZyb21Sb3csIGludCBmcm9tQ29sLCBpbnQgdG9Sb3csIGludCB0b0NvbCkKLSAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIF9pbmRleCA9IF93b3Jrc2hlZXQuX2NlbGxzLkluZGV4T2YoRXhjZWxDZWxsQmFzZS5HZXRDZWxsSUQoX3dvcmtzaGVldC5TaGVldElELCBmcm9tUm93LCBmcm9tQ29sKSk7Ci0gICAgICAgIC8vICAgIF90b0NlbGxJZCA9IEV4Y2VsQ2VsbEJhc2UuR2V0Q2VsbElEKF93b3Jrc2hlZXQuU2hlZXRJRCwgdG9Sb3csIHRvQ29sKTsKLSAgICAgICAgLy8gICAgaWYgKF9pbmRleCA8IDApCi0gICAgICAgIC8vICAgIHsKLSAgICAgICAgLy8gICAgICAgIF9pbmRleCA9IH5faW5kZXg7Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy8gICAgX2luZGV4LS07Ci0gICAgICAgIC8vfQotICAgICNlbmRyZWdpb24KKyAgcHJpdmF0ZSB2b2lkIEV4Y2VsUmFuZ2VCYXNlX0FkZHJlc3NDaGFuZ2Uob2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGUpIHsKKyAgICBpZiAoVGFibGUgIT0gbnVsbCkgeworICAgICAgU2V0UmNGcm9tVGFibGUoX3dvcmtib29rLl9wYWNrYWdlLCBudWxsKTsKICAgICB9CisgICAgU2V0RGVsZWdhdGUoKTsKKyAgfQorCisgIGludGVybmFsIEV4Y2VsUmFuZ2VCYXNlKEV4Y2VsV29ya3NoZWV0IHhsV29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcykKKyAgICAgIDogYmFzZSh4bFdvcmtzaGVldCA9PSBudWxsID8gIiIgOiB4bFdvcmtzaGVldC5OYW1lLCBhZGRyZXNzKSB7CisgICAgX3dvcmtzaGVldCA9IHhsV29ya3NoZWV0OworICAgIF93b3JrYm9vayA9IF93b3Jrc2hlZXQuV29ya2Jvb2s7CisgICAgU2V0UmNGcm9tVGFibGUoX3dvcmtzaGVldC5fcGFja2FnZSwgbnVsbCk7CisgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KF93cykpIHsKKyAgICAgIF93cyA9IF93b3Jrc2hlZXQgPT0gbnVsbCA/ICIiIDogX3dvcmtzaGVldC5OYW1lOworICAgIH0KKyAgICBBZGRyZXNzQ2hhbmdlICs9IEV4Y2VsUmFuZ2VCYXNlX0FkZHJlc3NDaGFuZ2U7CisgICAgU2V0RGVsZWdhdGUoKTsKKyAgfQorCisgIGludGVybmFsIEV4Y2VsUmFuZ2VCYXNlKEV4Y2VsV29ya2Jvb2sgd2IsIEV4Y2VsV29ya3NoZWV0IHhsV29ya3NoZWV0LCBzdHJpbmcgYWRkcmVzcywgYm9vbCBpc05hbWUpCisgICAgICA6IGJhc2UoeGxXb3Jrc2hlZXQgPT0gbnVsbCA/ICIiIDogeGxXb3Jrc2hlZXQuTmFtZSwgYWRkcmVzcywgaXNOYW1lKSB7CisgICAgU2V0UmNGcm9tVGFibGUod2IuX3BhY2thZ2UsIG51bGwpOworICAgIF93b3Jrc2hlZXQgPSB4bFdvcmtzaGVldDsKKyAgICBfd29ya2Jvb2sgPSB3YjsKKyAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoX3dzKSkgeworICAgICAgX3dzID0gKHhsV29ya3NoZWV0ID09IG51bGwgPyBudWxsIDogeGxXb3Jrc2hlZXQuTmFtZSk7CisgICAgfQorICAgIEFkZHJlc3NDaGFuZ2UgKz0gRXhjZWxSYW5nZUJhc2VfQWRkcmVzc0NoYW5nZTsKKyAgICBTZXREZWxlZ2F0ZSgpOworICB9CisKKyAgfkV4Y2VsUmFuZ2VCYXNlKCkgeworICAgIC8vdGhpcy5BZGRyZXNzQ2hhbmdlIC09IG5ldyBFdmVudEhhbmRsZXIoRXhjZWxSYW5nZUJhc2VfQWRkcmVzc0NoYW5nZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgU2V0RGVsZWdhdGUoKSB7CisgICAgaWYgKF9mcm9tUm93ID09IC0xKSB7CisgICAgICBfY2hhbmdlUHJvcE1ldGhvZCA9IFNldFVua25vd247CisgICAgfQorICAgIC8vU2luZ2xlIGNlbGwKKyAgICBlbHNlIGlmIChfZnJvbVJvdyA9PSBfdG9Sb3cgJiYgX2Zyb21Db2wgPT0gX3RvQ29sICYmIEFkZHJlc3NlcyA9PSBudWxsKSB7CisgICAgICBfY2hhbmdlUHJvcE1ldGhvZCA9IFNldFNpbmdsZTsKKyAgICB9CisgICAgLy9SYW5nZSAoZXggQTE6QTIpCisgICAgZWxzZSBpZiAoQWRkcmVzc2VzID09IG51bGwpIHsKKyAgICAgIF9jaGFuZ2VQcm9wTWV0aG9kID0gU2V0UmFuZ2U7CisgICAgfQorICAgIC8vTXVsdGkgUmFuZ2UgKGV4IEExOkEyLEMxOkMyKQorICAgIGVsc2UgeworICAgICAgX2NoYW5nZVByb3BNZXRob2QgPSBTZXRNdWx0aVJhbmdlOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFdlIGRvbnQga25vdyB0aGUgYWRkcmVzcyB5ZXQuIFNldCB0aGUgZGVsZWdhdGUgZmlyc3QgdGltZSBhIHByb3BlcnR5IGlzIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZU1ldGhvZCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgcHJpdmF0ZSB2b2lkIFNldFVua25vd24oU2V0VmFsdWVIYW5kbGVyIHZhbHVlTWV0aG9kLCBvYmplY3QgdmFsdWUpIHsKKyAgICAvL0FkZHJlc3MgaXMgbm90IHNldCB1c2UsIHNlbGVjdGVkIHJhbmdlCisgICAgaWYgKF9mcm9tUm93ID09IC0xKSB7CisgICAgICBTZXRUb1NlbGVjdGVkUmFuZ2UoKTsKKyAgICB9CisgICAgU2V0RGVsZWdhdGUoKTsKKyAgICBfY2hhbmdlUHJvcE1ldGhvZCh2YWx1ZU1ldGhvZCwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2V0IGEgc2luZ2xlIGNlbGwKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZU1ldGhvZCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgcHJpdmF0ZSB2b2lkIFNldFNpbmdsZShTZXRWYWx1ZUhhbmRsZXIgdmFsdWVNZXRob2QsIG9iamVjdCB2YWx1ZSkgeworICAgIHZhbHVlTWV0aG9kKHZhbHVlLCBfZnJvbVJvdywgX2Zyb21Db2wpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2V0IGEgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZU1ldGhvZCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgcHJpdmF0ZSB2b2lkIFNldFJhbmdlKFNldFZhbHVlSGFuZGxlciB2YWx1ZU1ldGhvZCwgb2JqZWN0IHZhbHVlKSB7CisgICAgU2V0VmFsdWVBZGRyZXNzKHRoaXMsIHZhbHVlTWV0aG9kLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTZXQgYSBtdWx0aXJhbmdlIChBMTpBMixDMTpDMikKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZU1ldGhvZCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+PC9wYXJhbT4KKyAgcHJpdmF0ZSB2b2lkIFNldE11bHRpUmFuZ2UoU2V0VmFsdWVIYW5kbGVyIHZhbHVlTWV0aG9kLCBvYmplY3QgdmFsdWUpIHsKKyAgICBTZXRWYWx1ZUFkZHJlc3ModGhpcywgdmFsdWVNZXRob2QsIHZhbHVlKTsKKyAgICBmb3JlYWNoICh2YXIgYWRkcmVzcyBpbiBBZGRyZXNzZXMpIHsKKyAgICAgIFNldFZhbHVlQWRkcmVzcyhhZGRyZXNzLCB2YWx1ZU1ldGhvZCwgdmFsdWUpOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNldCB0aGUgcHJvcGVydHkgZm9yIGFuIGFkZHJlc3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlTWV0aG9kIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgorICBwcml2YXRlIHZvaWQgU2V0VmFsdWVBZGRyZXNzKEV4Y2VsQWRkcmVzcyBhZGRyZXNzLCBTZXRWYWx1ZUhhbmRsZXIgdmFsdWVNZXRob2QsIG9iamVjdCB2YWx1ZSkgeworICAgIElzUmFuZ2VWYWxpZCgiIik7CisgICAgaWYgKF9mcm9tUm93ID09IDEKKyAgICAgICAgJiYgX2Zyb21Db2wgPT0gMQorICAgICAgICAmJiBfdG9Sb3cgPT0gRXhjZWxQYWNrYWdlLk1heFJvd3MKKyAgICAgICAgJiYgX3RvQ29sCisgICAgICAgICAgICA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgLy9GdWxsIHNoZWV0IChleCB3cy5DZWxscy5WYWx1ZT0wKS4gU2V0IHZhbHVlIGZvciBBMSBvbmx5IHRvIGF2b2lkIGhhbmdpbmcKKyAgICB7CisgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAiQ2FuJ3QgcmVmZXJlbmNlIGFsbCBjZWxscy4gUGxlYXNlIHVzZSB0aGUgaW5kZXhlciB0byBzZXQgdGhlIHJhbmdlIikpOworICAgIH0KKyAgICBmb3IgKGludCBjb2wgPSBhZGRyZXNzLlN0YXJ0LkNvbHVtbjsgY29sIDw9IGFkZHJlc3MuRW5kLkNvbHVtbjsgY29sKyspIHsKKyAgICAgIGZvciAoaW50IHJvdyA9IGFkZHJlc3MuU3RhcnQuUm93OyByb3cgPD0gYWRkcmVzcy5FbmQuUm93OyByb3crKykgeworICAgICAgICB2YWx1ZU1ldGhvZCh2YWx1ZSwgcm93LCBjb2wpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBTZXRfU3R5bGVJRChvYmplY3QgdmFsdWUsIGludCByb3csIGludCBjb2wpIHsKKyAgICBfd29ya3NoZWV0Ll9zdHlsZXMuU2V0VmFsdWUocm93LCBjb2wsIChpbnQpdmFsdWUpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIFNldF9TdHlsZU5hbWUob2JqZWN0IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKSB7CisgICAgLy9fd29ya3NoZWV0LkNlbGwocm93LCBjb2wpLlNldE5ld1N0eWxlTmFtZSh2YWx1ZS5Ub1N0cmluZygpLCBfc3R5bGVJRCk7CisgICAgX3dvcmtzaGVldC5fc3R5bGVzLlNldFZhbHVlKHJvdywgY29sLCBfc3R5bGVJRCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgU2V0X1ZhbHVlKG9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkgeworICAgIC8vRXhjZWxDZWxsIGMgPSBfd29ya3NoZWV0LkNlbGwocm93LCBjb2wpOworICAgIHZhciBzZmkgPSBfd29ya3NoZWV0Ll9mb3JtdWxhcy5HZXRWYWx1ZShyb3csIGNvbCk7CisgICAgaWYgKHNmaSBpcyBpbnQpIHsKKyAgICAgIFNwbGl0Rm9ybXVsYXMoX3dvcmtzaGVldC5DZWxsc1tyb3csIGNvbF0pOworICAgIH0KKyAgICBpZiAoc2ZpICE9IG51bGwpIHsKKyAgICAgIF93b3Jrc2hlZXQuX2Zvcm11bGFzLlNldFZhbHVlKHJvdywgY29sLCBzdHJpbmcuRW1wdHkpOworICAgIH0KKyAgICBfd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIHZhbHVlKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBTZXRfRm9ybXVsYShvYmplY3QgdmFsdWUsIGludCByb3csIGludCBjb2wpIHsKKyAgICAvL0V4Y2VsQ2VsbCBjID0gX3dvcmtzaGVldC5DZWxsKHJvdywgY29sKTsKKyAgICB2YXIgZiA9IF93b3Jrc2hlZXQuX2Zvcm11bGFzLkdldFZhbHVlKHJvdywgY29sKTsKKyAgICBpZiAoZiBpcyBpbnQgJiYgKGludClmID49IDApIHsKKyAgICAgIFNwbGl0Rm9ybXVsYXMoX3dvcmtzaGVldC5DZWxsc1tyb3csIGNvbF0pOworICAgIH0KKworICAgIHN0cmluZyBmb3JtdWxhID0gKHZhbHVlID09IG51bGwgPyBzdHJpbmcuRW1wdHkgOiB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgICBpZiAoZm9ybXVsYSA9PSBzdHJpbmcuRW1wdHkpIHsKKyAgICAgIF93b3Jrc2hlZXQuX2Zvcm11bGFzLlNldFZhbHVlKHJvdywgY29sLCBzdHJpbmcuRW1wdHkpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoZm9ybXVsYVswXSA9PSAnPScpIHsKKyAgICAgICAgdmFsdWUgPSBmb3JtdWxhLlN1YnN0cmluZygxLCBmb3JtdWxhLkxlbmd0aCAtIDEpOyAvLyByZW1vdmUgYW55IHN0YXJ0aW5nIGVxdWFsc2lnbi4KKyAgICAgIH0KKyAgICAgIF93b3Jrc2hlZXQuX2Zvcm11bGFzLlNldFZhbHVlKHJvdywgY29sLCBmb3JtdWxhKTsKKyAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgbnVsbCk7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSGFuZGxlcyBzaGFyZWQgZm9ybXVsYXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlICBmb3JtdWxhPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5UaGUgYWRkcmVzcyBvZiB0aGUgZm9ybXVsYTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXNBcnJheSI+SWYgdGhlIGZvcnVtbGEgaXMgYW4gYXJyYXkgZm9ybXVsYS48L3BhcmFtPgorICBwcml2YXRlIHZvaWQgU2V0X1NoYXJlZEZvcm11bGEoc3RyaW5nIHZhbHVlLCBFeGNlbEFkZHJlc3MgYWRkcmVzcywgYm9vbCBpc0FycmF5KSB7CisgICAgaWYgKF9mcm9tUm93ID09IDEKKyAgICAgICAgJiYgX2Zyb21Db2wgPT0gMQorICAgICAgICAmJiBfdG9Sb3cgPT0gRXhjZWxQYWNrYWdlLk1heFJvd3MKKyAgICAgICAgJiYgX3RvQ29sCisgICAgICAgICAgICA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgLy9GdWxsIHNoZWV0IChleCB3cy5DZWxscy5WYWx1ZT0wKS4gU2V0IHZhbHVlIGZvciBBMSBvbmx5IHRvIGF2b2lkIGhhbmdpbmcKKyAgICB7CisgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbid0IHNldCBhIGZvcm11bGEgZm9yIHRoZSBlbnRpcmUgd29ya3NoZWV0IikpOworICAgIH0KKyAgICBpZiAoYWRkcmVzcy5TdGFydC5Sb3cgPT0gYWRkcmVzcy5FbmQuUm93CisgICAgICAgICYmIGFkZHJlc3MuU3RhcnQuQ29sdW1uID09IGFkZHJlc3MuRW5kLkNvbHVtbgorICAgICAgICAmJiAhaXNBcnJheSkgLy9pcyBpdCByZWFsbHkgYSBzaGFyZWQgZm9ybXVsYT8gQXJyYXlmb3JtdWxhcyBjYW4gYmUgb25lIGNlbGwgb25seQorICAgIHsKKyAgICAgIC8vTm9wZSwgc2luZ2xlIGNlbGwuIFNldCB0aGUgZm9ybXVsYQorICAgICAgU2V0X0Zvcm11bGEodmFsdWUsIGFkZHJlc3MuU3RhcnQuUm93LCBhZGRyZXNzLlN0YXJ0LkNvbHVtbik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vUmVtb3ZlRm9ybXVscyhhZGRyZXNzKTsKKyAgICBDaGVja0FuZFNwbGl0U2hhcmVkRm9ybXVsYShhZGRyZXNzKTsKKyAgICBFeGNlbFdvcmtzaGVldC5Gb3JtdWxhcyBmID0gbmV3IEV4Y2VsV29ya3NoZWV0LkZvcm11bGFzKFNvdXJjZUNvZGVUb2tlbml6ZXIuRGVmYXVsdCk7CisgICAgZi5Gb3JtdWxhID0gdmFsdWU7CisgICAgZi5JbmRleCA9IF93b3Jrc2hlZXQuR2V0TWF4U2hhcmVGdW5jdGlvbkluZGV4KGlzQXJyYXkpOworICAgIGYuQWRkcmVzcyA9IGFkZHJlc3MuRmlyc3RBZGRyZXNzOworICAgIGYuU3RhcnRDb2wgPSBhZGRyZXNzLlN0YXJ0LkNvbHVtbjsKKyAgICBmLlN0YXJ0Um93ID0gYWRkcmVzcy5TdGFydC5Sb3c7CisgICAgZi5Jc0FycmF5ID0gaXNBcnJheTsKKworICAgIF93b3Jrc2hlZXQuX3NoYXJlZEZvcm11bGFzLkFkZChmLkluZGV4LCBmKTsKKyAgICAvL193b3Jrc2hlZXQuQ2VsbChhZGRyZXNzLlN0YXJ0LlJvdywgYWRkcmVzcy5TdGFydC5Db2x1bW4pLlNoYXJlZEZvcm11bGFJRCA9IGYuSW5kZXg7CisgICAgLy9fd29ya3NoZWV0LkNlbGwoYWRkcmVzcy5TdGFydC5Sb3csIGFkZHJlc3MuU3RhcnQuQ29sdW1uKS5Gb3JtdWxhID0gdmFsdWU7CisKKyAgICBmb3IgKGludCBjb2wgPSBhZGRyZXNzLlN0YXJ0LkNvbHVtbjsgY29sIDw9IGFkZHJlc3MuRW5kLkNvbHVtbjsgY29sKyspIHsKKyAgICAgIGZvciAoaW50IHJvdyA9IGFkZHJlc3MuU3RhcnQuUm93OyByb3cgPD0gYWRkcmVzcy5FbmQuUm93OyByb3crKykgeworICAgICAgICAvL193b3Jrc2hlZXQuQ2VsbChyb3csIGNvbCkuU2hhcmVkRm9ybXVsYUlEID0gZi5JbmRleDsKKyAgICAgICAgX3dvcmtzaGVldC5fZm9ybXVsYXMuU2V0VmFsdWUocm93LCBjb2wsIGYuSW5kZXgpOworICAgICAgICBfd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIG51bGwpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBTZXRfSHlwZXJMaW5rKG9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkgeworICAgIC8vX3dvcmtzaGVldC5DZWxsKHJvdywgY29sKS5IeXBlcmxpbmsgPSB2YWx1ZSBhcyBVcmk7CisgICAgaWYgKHZhbHVlIGlzIFVyaSkgeworICAgICAgX3dvcmtzaGVldC5faHlwZXJMaW5rcy5TZXRWYWx1ZShyb3csIGNvbCwgKFVyaSl2YWx1ZSk7CisKKyAgICAgIGlmICh2YWx1ZSBpcyBFeGNlbEh5cGVyTGluaykgeworICAgICAgICBfd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsICgoRXhjZWxIeXBlckxpbmspdmFsdWUpLkRpc3BsYXkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCAoKFVyaSl2YWx1ZSkuT3JpZ2luYWxTdHJpbmcpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBfd29ya3NoZWV0Ll9oeXBlckxpbmtzLlNldFZhbHVlKHJvdywgY29sLCBudWxsKTsKKyAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgbnVsbCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIFNldF9Jc0FycmF5Rm9ybXVsYShvYmplY3QgdmFsdWUsIGludCByb3csIGludCBjb2wpIHsKKyAgICBfd29ya3NoZWV0Ll9mbGFncy5TZXRGbGFnVmFsdWUocm93LCBjb2wsIChib29sKXZhbHVlLCBDZWxsRmxhZ3MuQXJyYXlGb3JtdWxhKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBTZXRfSXNSaWNoVGV4dChvYmplY3QgdmFsdWUsIGludCByb3csIGludCBjb2wpIHsKKyAgICAvL193b3Jrc2hlZXQuQ2VsbChyb3csIGNvbCkuSXNSaWNoVGV4dCA9IChib29sKXZhbHVlOworICAgIF93b3Jrc2hlZXQuX2ZsYWdzLlNldEZsYWdWYWx1ZShyb3csIGNvbCwgKGJvb2wpdmFsdWUsIENlbGxGbGFncy5SaWNoVGV4dCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgRXhpc3RzX0NvbW1lbnQob2JqZWN0IHZhbHVlLCBpbnQgcm93LCBpbnQgY29sKSB7CisgICAgdWxvbmcgY2VsbElkID0gR2V0Q2VsbElkKF93b3Jrc2hlZXQuU2hlZXRJRCwgcm93LCBjb2wpOworICAgIGlmIChfd29ya3NoZWV0LkNvbW1lbnRzLl9jb21tZW50cy5Db250YWluc0tleShjZWxsSWQpKSB7CisgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICAgICAiQ2VsbCB7MH0gYWxyZWFkeSBjb250YWluIGEgY29tbWVudC4iLAorICAgICAgICAgICAgICAgICAgbmV3IEV4Y2VsQ2VsbEFkZHJlc3Mocm93LCBjb2wpLkFkZHJlc3MpKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIFNldF9Db21tZW50KG9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkgeworICAgIHN0cmluZ1tdIHYgPSAoc3RyaW5nW10pdmFsdWU7CisgICAgV29ya3NoZWV0LkNvbW1lbnRzLkFkZChuZXcoX3dvcmtzaGVldCwgR2V0QWRkcmVzcyhfZnJvbVJvdywgX2Zyb21Db2wpKSwgdlswXSwgdlsxXSk7CisgICAgLy8gICBfd29ya3NoZWV0LkNlbGwocm93LCBjb2wpLkNvbW1lbnQgPSBjb21tZW50OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIFNldFRvU2VsZWN0ZWRSYW5nZSgpIHsKKyAgICBpZiAoX3dvcmtzaGVldC5WaWV3LlNlbGVjdGVkUmFuZ2UgPT0gIiIpIHsKKyAgICAgIEFkZHJlc3MgPSAiQTEiOworICAgIH0gZWxzZSB7CisgICAgICBBZGRyZXNzID0gX3dvcmtzaGVldC5WaWV3LlNlbGVjdGVkUmFuZ2U7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIElzUmFuZ2VWYWxpZChzdHJpbmcgdHlwZSkgeworICAgIGlmIChfZnJvbVJvdyA8PSAwKSB7CisgICAgICBpZiAoX2FkZHJlc3MgPT0gIiIpIHsKKyAgICAgICAgU2V0VG9TZWxlY3RlZFJhbmdlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAodHlwZSA9PSAiIikgeworICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoIlJhbmdlIGlzIG5vdCB2YWxpZCBmb3IgdGhpcyBvcGVyYXRpb246IHswfSIsIF9hZGRyZXNzKSkpOworICAgICAgICB9CisgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KCJSYW5nZSBpcyBub3QgdmFsaWQgZm9yIHswfSA6IHsxfSIsIHR5cGUsIF9hZGRyZXNzKSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBzdHlsZW9iamVjdCBmb3IgdGhlIHJhbmdlLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxTdHlsZSBTdHlsZSB7CisgICAgZ2V0IHsKKyAgICAgIElzUmFuZ2VWYWxpZCgic3R5bGluZyIpOworICAgICAgaW50IHMgPSAwOworICAgICAgaWYgKCFfd29ya3NoZWV0Ll9zdHlsZXMuRXhpc3RzKAorICAgICAgICAgIF9mcm9tUm93LAorICAgICAgICAgIF9mcm9tQ29sLAorICAgICAgICAgIHJlZiBzKSkgLy9DZWxsIGV4aXN0cworICAgICAgeworICAgICAgICBpZiAoIV93b3Jrc2hlZXQuX3N0eWxlcy5FeGlzdHMoCisgICAgICAgICAgICBfZnJvbVJvdywKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICByZWYgcykpIC8vTm8sIGNoZWNrIFJvdyBzdHlsZQorICAgICAgICB7CisgICAgICAgICAgdmFyIGMgPSBXb3Jrc2hlZXQuR2V0Q29sdW1uKF9mcm9tQ29sKTsKKyAgICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICBzID0gMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcyA9IGMuU3R5bGVJRDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBfd29ya3NoZWV0Lldvcmtib29rLlN0eWxlcy5HZXRTdHlsZU9iamVjdChzLCBfd29ya3NoZWV0LlBvc2l0aW9uSUQsIEFkZHJlc3MpOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBuYW1lZCBzdHlsZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIFN0eWxlTmFtZSB7CisgICAgZ2V0IHsKKyAgICAgIElzUmFuZ2VWYWxpZCgic3R5bGluZyIpOworICAgICAgaW50IHhmSWQ7CisgICAgICBpZiAoX2Zyb21Sb3cgPT0gMSAmJiBfdG9Sb3cgPT0gRXhjZWxQYWNrYWdlLk1heFJvd3MpIHsKKyAgICAgICAgeGZJZCA9IEdldENvbHVtblN0eWxlKF9mcm9tQ29sKTsKKyAgICAgIH0gZWxzZSBpZiAoX2Zyb21Db2wgPT0gMSAmJiBfdG9Db2wgPT0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpIHsKKyAgICAgICAgeGZJZCA9IDA7CisgICAgICAgIGlmICghX3dvcmtzaGVldC5fc3R5bGVzLkV4aXN0cyhfZnJvbVJvdywgMCwgcmVmIHhmSWQpKSB7CisgICAgICAgICAgeGZJZCA9IEdldENvbHVtblN0eWxlKF9mcm9tQ29sKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgeGZJZCA9IDA7CisgICAgICAgIGlmICghX3dvcmtzaGVldC5fc3R5bGVzLkV4aXN0cyhfZnJvbVJvdywgX2Zyb21Db2wsIHJlZiB4ZklkKSkgeworICAgICAgICAgIGlmICghX3dvcmtzaGVldC5fc3R5bGVzLkV4aXN0cyhfZnJvbVJvdywgMCwgcmVmIHhmSWQpKSB7CisgICAgICAgICAgICB4ZklkID0gR2V0Q29sdW1uU3R5bGUoX2Zyb21Db2wpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaW50IG5zSWQ7CisgICAgICBpZiAoeGZJZCA8PSAwKSB7CisgICAgICAgIG5zSWQgPSBTdHlsZS5TdHlsZXMuQ2VsbFhmc1swXS5YZklkOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbnNJZCA9IFN0eWxlLlN0eWxlcy5DZWxsWGZzW3hmSWRdLlhmSWQ7CisgICAgICB9CisgICAgICBmb3JlYWNoICh2YXIgbnMgaW4gU3R5bGUuU3R5bGVzLk5hbWVkU3R5bGVzKSB7CisgICAgICAgIGlmIChucy5TdHlsZVhmSWQgPT0gbnNJZCkgeworICAgICAgICAgIHJldHVybiBucy5OYW1lOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIF9zdHlsZUlEID0gX3dvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXMuR2V0U3R5bGVJZEZyb21OYW1lKHZhbHVlKTsKKyAgICAgIGludCBjb2wgPSBfZnJvbUNvbDsKKyAgICAgIGlmIChfZnJvbVJvdyA9PSAxCisgICAgICAgICAgJiYgX3RvUm93CisgICAgICAgICAgICAgID09IEV4Y2VsUGFja2FnZS5NYXhSb3dzKSAvL0Z1bGwgY29sdW1uCisgICAgICB7CisgICAgICAgIEV4Y2VsQ29sdW1uIGNvbHVtbjsKKyAgICAgICAgLy9HZXQgdGhlIHN0YXJ0Y29sdW1uCisgICAgICAgIC8vdWxvbmcgY29sSUQgPSBFeGNlbENvbHVtbi5HZXRDb2x1bW5JRChfd29ya3NoZWV0LlNoZWV0SUQsIGNvbHVtbik7CisgICAgICAgIHZhciBjID0gX3dvcmtzaGVldC5HZXRWYWx1ZSgwLCBfZnJvbUNvbCk7CisgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICBjb2x1bW4gPSBfd29ya3NoZWV0LkNvbHVtbihfZnJvbUNvbCk7CisgICAgICAgICAgLy9pZiAoX3dvcmtzaGVldC5fdmFsdWVzLlByZXZDZWxsKHJlZiByb3csIHJlZiBjb2wpKQorICAgICAgICAgIC8veworICAgICAgICAgIC8vICAgIHZhciBwcmV2Q29sID0gKEV4Y2VsQ29sdW1uKV93b3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShyb3csIGNvbCk7CisgICAgICAgICAgLy8gICAgY29sdW1uID0gcHJldkNvbC5DbG9uZShfd29ya3NoZWV0LCBjb2x1bW4pOworICAgICAgICAgIC8vICAgIHByZXZDb2wuQ29sdW1uTWF4ID0gY29sdW1uIC0gMTsKKyAgICAgICAgICAvL30KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb2x1bW4gPSAoRXhjZWxDb2x1bW4pYzsKKyAgICAgICAgfQorCisgICAgICAgIGNvbHVtbi5TdHlsZU5hbWUgPSB2YWx1ZTsKKyAgICAgICAgY29sdW1uLlN0eWxlSUQgPSBfc3R5bGVJRDsKKworICAgICAgICAvL3ZhciBpbmRleCA9IF93b3Jrc2hlZXQuX2NvbHVtbnMuSW5kZXhPZihjb2xJRCk7CisgICAgICAgIHZhciBjb2xzID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX3dvcmtzaGVldC5fdmFsdWVzLCAwLCBfZnJvbUNvbCArIDEsIDAsIF90b0NvbCk7CisgICAgICAgIGlmIChjb2xzLk5leHQoKSkgeworICAgICAgICAgIGNvbCA9IF9mcm9tQ29sOworICAgICAgICAgIHdoaWxlIChjb2x1bW4uQ29sdW1uTWluIDw9IF90b0NvbCkgeworICAgICAgICAgICAgaWYgKGNvbHVtbi5Db2x1bW5NYXggPiBfdG9Db2wpIHsKKyAgICAgICAgICAgICAgdmFyIG5ld0NvbCA9IF93b3Jrc2hlZXQuQ29weUNvbHVtbihjb2x1bW4sIF90b0NvbCArIDEsIGNvbHVtbi5Db2x1bW5NYXgpOworICAgICAgICAgICAgICBjb2x1bW4uQ29sdW1uTWF4ID0gX3RvQ29sOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb2x1bW4uX3N0eWxlTmFtZSA9IHZhbHVlOworICAgICAgICAgICAgY29sdW1uLlN0eWxlSUQgPSBfc3R5bGVJRDsKKworICAgICAgICAgICAgaWYgKGNvbHMuVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhciBuZXh0Q29sID0gKEV4Y2VsQ29sdW1uKWNvbHMuVmFsdWU7CisgICAgICAgICAgICBpZiAoY29sdW1uLkNvbHVtbk1heCA8IG5leHRDb2wuQ29sdW1uTWF4IC0gMSkgeworICAgICAgICAgICAgICBjb2x1bW4uQ29sdW1uTWF4ID0gbmV4dENvbC5Db2x1bW5NYXggLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29sdW1uID0gbmV4dENvbDsKKyAgICAgICAgICAgIGNvbHMuTmV4dCgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29sdW1uLkNvbHVtbk1heCA8IF90b0NvbCkgeworICAgICAgICAgIGNvbHVtbi5Db2x1bW5NYXggPSBfdG9Db2w7CisgICAgICAgIH0KKyAgICAgICAgLy9pZiAoY29sdW1uLkNvbHVtbk1pbiA9PSBjb2x1bW4pCisgICAgICAgIC8veworICAgICAgICAvLyAgICBjb2x1bW4uQ29sdW1uTWF4ID0gX3RvQ29sOworICAgICAgICAvL30KKyAgICAgICAgLy9lbHNlIGlmIChjb2x1bW4uX2NvbHVtbk1heCA8IF90b0NvbCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHZhciBuZXdDb2wgPSBfd29ya3NoZWV0LkNvbHVtbihjb2x1bW4uX2NvbHVtbk1heCArIDEpIGFzIEV4Y2VsQ29sdW1uOworICAgICAgICAvLyAgICBuZXdDb2wuX2NvbHVtbk1heCA9IF90b0NvbDsKKworICAgICAgICAvLyAgICBuZXdDb2wuX3N0eWxlSUQgPSBfc3R5bGVJRDsKKyAgICAgICAgLy8gICAgbmV3Q29sLl9zdHlsZU5hbWUgPSB2YWx1ZTsKKyAgICAgICAgLy99CisgICAgICAgIGlmIChfZnJvbUNvbCA9PSAxCisgICAgICAgICAgICAmJiBfdG9Db2wKKyAgICAgICAgICAgICAgICA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgLy9GdWxsUm93CisgICAgICAgIHsKKyAgICAgICAgICB2YXIgcm93cyA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KAorICAgICAgICAgICAgICBfd29ya3NoZWV0Ll92YWx1ZXMsCisgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5NYXhSb3dzLAorICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICByb3dzLk5leHQoKTsKKyAgICAgICAgICB3aGlsZSAocm93cy5WYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBfd29ya3NoZWV0Ll9zdHlsZXMuU2V0VmFsdWUocm93cy5Sb3csIDAsIF9zdHlsZUlEKTsKKyAgICAgICAgICAgIGlmICghcm93cy5OZXh0KCkpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKF9mcm9tQ29sID09IDEKKyAgICAgICAgICAmJiBfdG9Db2wKKyAgICAgICAgICAgICAgPT0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpIC8vRnVsbFJvdworICAgICAgeworICAgICAgICBmb3IgKGludCByID0gX2Zyb21Sb3c7IHIgPD0gX3RvUm93OyByKyspIHsKKyAgICAgICAgICBfd29ya3NoZWV0LlJvdyhyKS5fc3R5bGVOYW1lID0gdmFsdWU7CisgICAgICAgICAgX3dvcmtzaGVldC5Sb3cocikuU3R5bGVJRCA9IF9zdHlsZUlEOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghKChfZnJvbVJvdyA9PSAxICYmIF90b1JvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cykKKyAgICAgICAgICAgICAgICAgIHx8IChfZnJvbUNvbCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICYmIF90b0NvbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpKSkgLy9DZWxsIHNwZWNpZmljCisgICAgICB7CisgICAgICAgIGZvciAoaW50IGMgPSBfZnJvbUNvbDsgYyA8PSBfdG9Db2w7IGMrKykgeworICAgICAgICAgIGZvciAoaW50IHIgPSBfZnJvbVJvdzsgciA8PSBfdG9Sb3c7IHIrKykgeworICAgICAgICAgICAgX3dvcmtzaGVldC5fc3R5bGVzLlNldFZhbHVlKHIsIGMsIF9zdHlsZUlEKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSAvL09ubHkgc2V0IG5hbWUgb24gY3JlYXRlZCBjZWxscy4gKHVuY3JlYXRlZCBjZWxscyBpcyBzZXQgb24gZnVsbCByb3cgb3IgZnVsbCBjb2x1bW4pLgorICAgICAgeworICAgICAgICB2YXIgY2VsbHMgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PigKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcywKKyAgICAgICAgICAgIF9mcm9tUm93LAorICAgICAgICAgICAgX2Zyb21Db2wsCisgICAgICAgICAgICBfdG9Sb3csCisgICAgICAgICAgICBfdG9Db2wpOworICAgICAgICB3aGlsZSAoY2VsbHMuTmV4dCgpKSB7CisgICAgICAgICAgX3dvcmtzaGVldC5fc3R5bGVzLlNldFZhbHVlKGNlbGxzLlJvdywgY2VsbHMuQ29sdW1uLCBfc3R5bGVJRCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vX2NoYW5nZVByb3BNZXRob2QoU2V0X1N0eWxlTmFtZSwgdmFsdWUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgaW50IEdldENvbHVtblN0eWxlKGludCBjb2wpIHsKKyAgICBvYmplY3QgYyA9IG51bGw7CisgICAgaWYgKF93b3Jrc2hlZXQuX3ZhbHVlcy5FeGlzdHMoMCwgY29sLCByZWYgYykpIHsKKyAgICAgIHJldHVybiAoYyBhcyBFeGNlbENvbHVtbikuU3R5bGVJRDsKKyAgICB9CisgICAgaW50IHJvdyA9IDA7CisgICAgaWYgKF93b3Jrc2hlZXQuX3ZhbHVlcy5QcmV2Q2VsbChyZWYgcm93LCByZWYgY29sKSkgeworICAgICAgdmFyIGNvbHVtbiA9IF93b3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShyb3csIGNvbCkgYXMgRXhjZWxDb2x1bW47CisgICAgICBpZiAoY29sdW1uLkNvbHVtbk1heCA+PSBjb2wpIHsKKyAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuX3N0eWxlcy5HZXRWYWx1ZShyb3csIGNvbCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIHN0eWxlIElELgorICAvLy8gSXQgaXMgbm90IHJlY29tZW5kZWQgdG8gdXNlIHRoaXMgb25lLiBVc2UgTmFtZWQgc3R5bGVzIGFzIGFuIGFsdGVybmF0aXZlLgorICAvLy8gSWYgeW91IGRvLCBtYWtlIHN1cmUgdGhhdCB5b3UgdXNlIHRoZSBTdHlsZS5VcGRhdGVYbWwoKSBtZXRob2QgdG8gdXBkYXRlIGFueSBuZXcgc3R5bGVzIGFkZGVkIHRvIHRoZSB3b3JrYm9vay4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBTdHlsZUlEIHsKKyAgICBnZXQgeworICAgICAgaW50IHMgPSAwOworICAgICAgaWYgKCFfd29ya3NoZWV0Ll9zdHlsZXMuRXhpc3RzKF9mcm9tUm93LCBfZnJvbUNvbCwgcmVmIHMpKSB7CisgICAgICAgIGlmICghX3dvcmtzaGVldC5fc3R5bGVzLkV4aXN0cyhfZnJvbVJvdywgMCwgcmVmIHMpKSB7CisgICAgICAgICAgcyA9IF93b3Jrc2hlZXQuX3N0eWxlcy5HZXRWYWx1ZSgwLCBfZnJvbUNvbCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBzOworICAgIH0KKyAgICBzZXQgPT4gX2NoYW5nZVByb3BNZXRob2QoU2V0X1N0eWxlSUQsIHZhbHVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNldCB0aGUgcmFuZ2UgdG8gYSBzcGVjaWZpYyB2YWx1ZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgb2JqZWN0IFZhbHVlIHsKKyAgICBnZXQgeworICAgICAgaWYgKElzTmFtZSkgeworICAgICAgICBpZiAoX3dvcmtzaGVldCA9PSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuIF93b3JrYm9vay5fbmFtZXNbX2FkZHJlc3NdLk5hbWVWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5OYW1lc1tfYWRkcmVzc10uTmFtZVZhbHVlOworICAgICAgfQorICAgICAgaWYgKF9mcm9tUm93ID09IF90b1JvdyAmJiBfZnJvbUNvbCA9PSBfdG9Db2wpIHsKKyAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuR2V0VmFsdWUoX2Zyb21Sb3csIF9mcm9tQ29sKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBHZXRWYWx1ZUFycmF5KCk7CisgICAgfQorICAgIHNldCB7CisgICAgICBpZiAoSXNOYW1lKSB7CisgICAgICAgIGlmIChfd29ya3NoZWV0ID09IG51bGwpIHsKKyAgICAgICAgICBfd29ya2Jvb2suX25hbWVzW19hZGRyZXNzXS5OYW1lVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBfd29ya3NoZWV0Lk5hbWVzW19hZGRyZXNzXS5OYW1lVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgX2NoYW5nZVByb3BNZXRob2QoU2V0X1ZhbHVlLCB2YWx1ZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBib29sIElzSW5maW5pdHlWYWx1ZShvYmplY3QgdmFsdWUpIHsKKyAgICBkb3VibGU/IHZhbHVlQXNEb3VibGUgPSB2YWx1ZSBhcyBkb3VibGU/OworCisgICAgaWYgKHZhbHVlQXNEb3VibGUuSGFzVmFsdWUKKyAgICAgICAgJiYgKGRvdWJsZS5Jc05lZ2F0aXZlSW5maW5pdHkodmFsdWVBc0RvdWJsZS5WYWx1ZSkKKyAgICAgICAgICAgICAgICB8fCBkb3VibGUuSXNQb3NpdGl2ZUluZmluaXR5KHZhbHVlQXNEb3VibGUuVmFsdWUpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHJpdmF0ZSBvYmplY3QgR2V0VmFsdWVBcnJheSgpIHsKKyAgICBFeGNlbEFkZHJlc3NCYXNlIGFkZHI7CisgICAgaWYgKF9mcm9tUm93ID09IDEKKyAgICAgICAgJiYgX2Zyb21Db2wgPT0gMQorICAgICAgICAmJiBfdG9Sb3cgPT0gRXhjZWxQYWNrYWdlLk1heFJvd3MKKyAgICAgICAgJiYgX3RvQ29sID09IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSB7CisgICAgICBhZGRyID0gX3dvcmtzaGVldC5EaW1lbnNpb247CisgICAgICBpZiAoYWRkciA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBhZGRyID0gdGhpczsKKyAgICB9CisgICAgb2JqZWN0WyxdIHYgPSBuZXcgb2JqZWN0W2FkZHIuX3RvUm93IC0gYWRkci5fZnJvbVJvdyArIDEsIGFkZHIuX3RvQ29sIC0gYWRkci5fZnJvbUNvbCArIDFdOworCisgICAgZm9yIChpbnQgY29sID0gYWRkci5fZnJvbUNvbDsgY29sIDw9IGFkZHIuX3RvQ29sOyBjb2wrKykgeworICAgICAgZm9yIChpbnQgcm93ID0gYWRkci5fZnJvbVJvdzsgcm93IDw9IGFkZHIuX3RvUm93OyByb3crKykgeworICAgICAgICBpZiAoX3dvcmtzaGVldC5fdmFsdWVzLkV4aXN0cyhyb3csIGNvbCkpIHsKKyAgICAgICAgICBpZiAoX3dvcmtzaGVldC5fZmxhZ3MuR2V0RmxhZ1ZhbHVlKHJvdywgY29sLCBDZWxsRmxhZ3MuUmljaFRleHQpKSB7CisgICAgICAgICAgICB2W3JvdyAtIGFkZHIuX2Zyb21Sb3csIGNvbCAtIGFkZHIuX2Zyb21Db2xdID0gR2V0UmljaFRleHQocm93LCBjb2wpLlRleHQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZbcm93IC0gYWRkci5fZnJvbVJvdywgY29sIC0gYWRkci5fZnJvbUNvbF0gPSBfd29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUocm93LCBjb2wpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdjsKKyAgfQorCisgIHByaXZhdGUgRXhjZWxBZGRyZXNzQmFzZSBHZXRBZGRyZXNzRGltKEV4Y2VsUmFuZ2VCYXNlIGFkZHIpIHsKKyAgICBpbnQgZnJvbVJvdywKKyAgICAgICAgZnJvbUNvbCwKKyAgICAgICAgdG9Sb3csCisgICAgICAgIHRvQ29sOworICAgIHZhciBkID0gX3dvcmtzaGVldC5EaW1lbnNpb247CisgICAgZnJvbVJvdyA9IGFkZHIuX2Zyb21Sb3cgPCBkLl9mcm9tUm93ID8gZC5fZnJvbVJvdyA6IGFkZHIuX2Zyb21Sb3c7CisgICAgZnJvbUNvbCA9IGFkZHIuX2Zyb21Db2wgPCBkLl9mcm9tQ29sID8gZC5fZnJvbUNvbCA6IGFkZHIuX2Zyb21Db2w7CisKKyAgICB0b1JvdyA9IGFkZHIuX3RvUm93ID4gZC5fdG9Sb3cgPyBkLl90b1JvdyA6IGFkZHIuX3RvUm93OworICAgIHRvQ29sID0gYWRkci5fdG9Db2wgPiBkLl90b0NvbCA/IGQuX3RvQ29sIDogYWRkci5fdG9Db2w7CisKKyAgICBpZiAoYWRkci5fZnJvbUNvbCA9PSBmcm9tUm93ICYmIGFkZHIuX3RvUm93ID09IHRvUm93ICYmIGFkZHIuX3RvQ29sID09IF90b0NvbCkgeworICAgICAgcmV0dXJuIGFkZHI7CisgICAgfQorICAgIGlmIChfZnJvbVJvdyA+IF90b1JvdyB8fCBfZnJvbUNvbCA+IF90b0NvbCkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIHJldHVybiBuZXcoZnJvbVJvdywgZnJvbUNvbCwgdG9Sb3csIHRvQ29sKTsKKyAgfQorCisgIHByaXZhdGUgb2JqZWN0IEdldFNpbmdsZVZhbHVlKCkgeworICAgIGlmIChJc1JpY2hUZXh0KSB7CisgICAgICByZXR1cm4gUmljaFRleHQuVGV4dDsKKyAgICB9CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShfZnJvbVJvdywgX2Zyb21Db2wpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyB0aGUgZm9ybWF0dGVkIHZhbHVlLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIFRleHQgPT4gR2V0Rm9ybWF0dGVkVGV4dChmYWxzZSk7CisKKyAgcHJpdmF0ZSB2b2lkIFNldE1pbldpZHRoKGRvdWJsZSBtaW5pbXVtV2lkdGgsIGludCBmcm9tQ29sLCBpbnQgdG9Db2wpIHsKKyAgICB2YXIgaXRlcmF0b3IgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0Pihfd29ya3NoZWV0Ll92YWx1ZXMsIDAsIGZyb21Db2wsIDAsIHRvQ29sKTsKKyAgICB2YXIgcHJldkNvbCA9IGZyb21Db2w7CisgICAgZm9yZWFjaCAoRXhjZWxDb2x1bW4gY29sIGluIGl0ZXJhdG9yKSB7CisgICAgICBjb2wuV2lkdGggPSBtaW5pbXVtV2lkdGg7CisgICAgICBpZiAoX3dvcmtzaGVldC5EZWZhdWx0Q29sV2lkdGggPiBtaW5pbXVtV2lkdGggJiYgY29sLkNvbHVtbk1pbiA+IHByZXZDb2wpIHsKKyAgICAgICAgdmFyIG5ld0NvbCA9IF93b3Jrc2hlZXQuQ29sdW1uKHByZXZDb2wpOworICAgICAgICBuZXdDb2wuQ29sdW1uTWF4ID0gY29sLkNvbHVtbk1pbiAtIDE7CisgICAgICAgIG5ld0NvbC5XaWR0aCA9IG1pbmltdW1XaWR0aDsKKyAgICAgIH0KKyAgICAgIHByZXZDb2wgPSBjb2wuQ29sdW1uTWF4ICsgMTsKKyAgICB9CisgICAgaWYgKF93b3Jrc2hlZXQuRGVmYXVsdENvbFdpZHRoID4gbWluaW11bVdpZHRoICYmIHByZXZDb2wgPCB0b0NvbCkgeworICAgICAgdmFyIG5ld0NvbCA9IF93b3Jrc2hlZXQuQ29sdW1uKHByZXZDb2wpOworICAgICAgbmV3Q29sLkNvbHVtbk1heCA9IHRvQ29sOworICAgICAgbmV3Q29sLldpZHRoID0gbWluaW11bVdpZHRoOworICAgIH0KKyAgfQorCisgIGludGVybmFsIHN0cmluZyBUZXh0Rm9yV2lkdGggPT4gR2V0Rm9ybWF0dGVkVGV4dCh0cnVlKTsKKworICBwcml2YXRlIHN0cmluZyBHZXRGb3JtYXR0ZWRUZXh0KGJvb2wgZm9yV2lkdGhDYWxjKSB7CisgICAgb2JqZWN0IHYgPSBWYWx1ZTsKKyAgICBpZiAodiA9PSBudWxsKSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIHZhciBzdHlsZXMgPSBXb3Jrc2hlZXQuV29ya2Jvb2suU3R5bGVzOworICAgIHZhciBuZklkID0gc3R5bGVzLkNlbGxYZnNbU3R5bGVJRF0uTnVtYmVyRm9ybWF0SWQ7CisgICAgRXhjZWxOdW1iZXJGb3JtYXRYbWwuRXhjZWxGb3JtYXRUcmFuc2xhdG9yIG5mID0gbnVsbDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0eWxlcy5OdW1iZXJGb3JtYXRzLkNvdW50OyBpKyspIHsKKyAgICAgIGlmIChuZklkID09IHN0eWxlcy5OdW1iZXJGb3JtYXRzW2ldLk51bUZtdElkKSB7CisgICAgICAgIG5mID0gc3R5bGVzLk51bWJlckZvcm1hdHNbaV0uRm9ybWF0VHJhbnNsYXRvcjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgc3RyaW5nIGZvcm1hdCwKKyAgICAgICAgdGV4dEZvcm1hdDsKKyAgICBpZiAoZm9yV2lkdGhDYWxjKSB7CisgICAgICBmb3JtYXQgPSBuZi5OZXRGb3JtYXRGb3JXaWR0aDsKKyAgICAgIHRleHRGb3JtYXQgPSBuZi5OZXRUZXh0Rm9ybWF0Rm9yV2lkdGg7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvcm1hdCA9IG5mLk5ldEZvcm1hdDsKKyAgICAgIHRleHRGb3JtYXQgPSBuZi5OZXRUZXh0Rm9ybWF0OworICAgIH0KKworICAgIHJldHVybiBGb3JtYXRWYWx1ZSh2LCBuZiwgZm9ybWF0LCB0ZXh0Rm9ybWF0KTsKKyAgfQorCisgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgRm9ybWF0VmFsdWUoCisgICAgICBvYmplY3QgdiwKKyAgICAgIEV4Y2VsTnVtYmVyRm9ybWF0WG1sLkV4Y2VsRm9ybWF0VHJhbnNsYXRvciBuZiwKKyAgICAgIHN0cmluZyBmb3JtYXQsCisgICAgICBzdHJpbmcgdGV4dEZvcm1hdCkgeworICAgIGlmICh2IGlzIGRlY2ltYWwgfHwgdi5HZXRUeXBlKCkuSXNQcmltaXRpdmUpIHsKKyAgICAgIGRvdWJsZSBkOworICAgICAgdHJ5IHsKKyAgICAgICAgZCA9IENvbnZlcnQuVG9Eb3VibGUodik7CisgICAgICB9IGNhdGNoIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgICAgfQorCisgICAgICBpZiAobmYuRGF0YVR5cGUgPT0gRXhjZWxOdW1iZXJGb3JtYXRYbWwuZUZvcm1hdFR5cGUuTnVtYmVyKSB7CisgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShuZi5GcmFjdGlvbkZvcm1hdCkpIHsKKyAgICAgICAgICByZXR1cm4gZC5Ub1N0cmluZyhmb3JtYXQsIG5mLkN1bHR1cmUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZi5Gb3JtYXRGcmFjdGlvbihkKTsKKyAgICAgIH0KKyAgICAgIGlmIChuZi5EYXRhVHlwZSA9PSBFeGNlbE51bWJlckZvcm1hdFhtbC5lRm9ybWF0VHlwZS5EYXRlVGltZSkgeworICAgICAgICB2YXIgZGF0ZSA9IERhdGVUaW1lLkZyb21PQURhdGUoZCk7CisgICAgICAgIHJldHVybiBkYXRlLlRvU3RyaW5nKGZvcm1hdCwgbmYuQ3VsdHVyZSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmICh2IGlzIERhdGVUaW1lKSB7CisgICAgICBpZiAobmYuRGF0YVR5cGUgPT0gRXhjZWxOdW1iZXJGb3JtYXRYbWwuZUZvcm1hdFR5cGUuRGF0ZVRpbWUpIHsKKyAgICAgICAgcmV0dXJuICgoRGF0ZVRpbWUpdikuVG9TdHJpbmcoZm9ybWF0LCBuZi5DdWx0dXJlKTsKKyAgICAgIH0KKyAgICAgIGRvdWJsZSBkID0gKChEYXRlVGltZSl2KS5Ub09BRGF0ZSgpOworICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KG5mLkZyYWN0aW9uRm9ybWF0KSkgeworICAgICAgICByZXR1cm4gZC5Ub1N0cmluZyhmb3JtYXQsIG5mLkN1bHR1cmUpOworICAgICAgfQorICAgICAgcmV0dXJuIG5mLkZvcm1hdEZyYWN0aW9uKGQpOworICAgIH0gZWxzZSBpZiAodiBpcyBUaW1lU3BhbikgeworICAgICAgaWYgKG5mLkRhdGFUeXBlID09IEV4Y2VsTnVtYmVyRm9ybWF0WG1sLmVGb3JtYXRUeXBlLkRhdGVUaW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgRGF0ZVRpbWUoKChUaW1lU3Bhbil2KS5UaWNrcykuVG9TdHJpbmcoZm9ybWF0LCBuZi5DdWx0dXJlKTsKKyAgICAgIH0KKyAgICAgIGRvdWJsZSBkID0gKG5ldyBEYXRlVGltZSgoKFRpbWVTcGFuKXYpLlRpY2tzKSkuVG9PQURhdGUoKTsKKyAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShuZi5GcmFjdGlvbkZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuIGQuVG9TdHJpbmcoZm9ybWF0LCBuZi5DdWx0dXJlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBuZi5Gb3JtYXRGcmFjdGlvbihkKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHRleHRGb3JtYXQgPT0gIiIpIHsKKyAgICAgICAgcmV0dXJuIHYuVG9TdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KHRleHRGb3JtYXQsIHYpOworICAgIH0KKyAgICByZXR1cm4gdi5Ub1N0cmluZygpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0cyBvciBzZXRzIGEgZm9ybXVsYSBmb3IgYSByYW5nZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBGb3JtdWxhIHsKKyAgICBnZXQgeworICAgICAgaWYgKElzTmFtZSkgeworICAgICAgICBpZiAoX3dvcmtzaGVldCA9PSBudWxsKSB7CisgICAgICAgICAgcmV0dXJuIF93b3JrYm9vay5fbmFtZXNbX2FkZHJlc3NdLk5hbWVGb3JtdWxhOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfd29ya3NoZWV0Lk5hbWVzW19hZGRyZXNzXS5OYW1lRm9ybXVsYTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkdldEZvcm11bGEoX2Zyb21Sb3csIF9mcm9tQ29sKTsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIGlmIChJc05hbWUpIHsKKyAgICAgICAgaWYgKF93b3Jrc2hlZXQgPT0gbnVsbCkgeworICAgICAgICAgIF93b3JrYm9vay5fbmFtZXNbX2FkZHJlc3NdLk5hbWVGb3JtdWxhID0gdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgX3dvcmtzaGVldC5OYW1lc1tfYWRkcmVzc10uTmFtZUZvcm11bGEgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuVHJpbSgpID09ICIiKSB7CisgICAgICAgICAgLy9TZXQgdGhlIGNlbGxzIHRvIG51bGwKKyAgICAgICAgICBWYWx1ZSA9IG51bGw7CisgICAgICAgIH0gZWxzZSBpZiAoX2Zyb21Sb3cgPT0gX3RvUm93ICYmIF9mcm9tQ29sID09IF90b0NvbCkgeworICAgICAgICAgIFNldF9Gb3JtdWxhKHZhbHVlLCBfZnJvbVJvdywgX2Zyb21Db2wpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFNldF9TaGFyZWRGb3JtdWxhKHZhbHVlLCB0aGlzLCBmYWxzZSk7CisgICAgICAgICAgaWYgKEFkZHJlc3NlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgYWRkcmVzcyBpbiBBZGRyZXNzZXMpIHsKKyAgICAgICAgICAgICAgU2V0X1NoYXJlZEZvcm11bGEodmFsdWUsIGFkZHJlc3MsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXRzIG9yIFNldCBhIGZvcm11bGEgaW4gUjFDMSBmb3JtYXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgRm9ybXVsYVIxQzEgeworICAgIGdldCB7CisgICAgICBJc1JhbmdlVmFsaWQoIkZvcm11bGFSMUMxIik7CisgICAgICByZXR1cm4gX3dvcmtzaGVldC5HZXRGb3JtdWxhUjFDMShfZnJvbVJvdywgX2Zyb21Db2wpOworICAgIH0KKyAgICBzZXQgeworICAgICAgSXNSYW5nZVZhbGlkKCJGb3JtdWxhUjFDMSIpOworICAgICAgaWYgKHZhbHVlLkxlbmd0aCA+IDAgJiYgdmFsdWVbMF0gPT0gJz0nKSB7CisgICAgICAgIHZhbHVlID0gdmFsdWUuU3Vic3RyaW5nKDEsIHZhbHVlLkxlbmd0aCAtIDEpOyAvLyByZW1vdmUgYW55IHN0YXJ0aW5nIGVxdWFsc2lnbi4KKyAgICAgIH0KKworICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuVHJpbSgpID09ICIiKSB7CisgICAgICAgIC8vU2V0IHRoZSBjZWxscyB0byBudWxsCisgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbVHJhbnNsYXRlRnJvbVIxQzEodmFsdWUsIF9mcm9tUm93LCBfZnJvbUNvbCldLlZhbHVlID0gbnVsbDsKKyAgICAgIH0gZWxzZSBpZiAoQWRkcmVzc2VzID09IG51bGwpIHsKKyAgICAgICAgU2V0X1NoYXJlZEZvcm11bGEoVHJhbnNsYXRlRnJvbVIxQzEodmFsdWUsIF9mcm9tUm93LCBfZnJvbUNvbCksIHRoaXMsIGZhbHNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFNldF9TaGFyZWRGb3JtdWxhKAorICAgICAgICAgICAgVHJhbnNsYXRlRnJvbVIxQzEodmFsdWUsIF9mcm9tUm93LCBfZnJvbUNvbCksCisgICAgICAgICAgICBuZXcoV29ya1NoZWV0LCBGaXJzdEFkZHJlc3MpLAorICAgICAgICAgICAgZmFsc2UpOworICAgICAgICBmb3JlYWNoICh2YXIgYWRkcmVzcyBpbiBBZGRyZXNzZXMpIHsKKyAgICAgICAgICBTZXRfU2hhcmVkRm9ybXVsYSgKKyAgICAgICAgICAgICAgVHJhbnNsYXRlRnJvbVIxQzEodmFsdWUsIGFkZHJlc3MuU3RhcnQuUm93LCBhZGRyZXNzLlN0YXJ0LkNvbHVtbiksCisgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldHMgb3IgU2V0IGEgZm9ybXVsYSBpbiBSMUMxIGZvcm1hdC4KKyAgLy8vCisgIHB1YmxpYyBzdHJpbmcgRm9ybXVsYVIxQzFfVjEgeworICAgIGdldCB7CisgICAgICBJc1JhbmdlVmFsaWQoIkZvcm11bGFSMUMxIik7CisgICAgICByZXR1cm4gX3dvcmtzaGVldC5HZXRGb3JtdWxhUjFDMV9WMShfZnJvbVJvdywgX2Zyb21Db2wpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdHJpbmcgQXJyYXlGb3JtdWxhQWRkcmVzcyB7CisgICAgZ2V0IHsKKyAgICAgIElzUmFuZ2VWYWxpZCgiRm9ybXVsYVIxQzEiKTsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0LkdldEFycmF5Rm9ybXVsYUFkZHJlc3MoX2Zyb21Sb3csIF9mcm9tQ29sKTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTZXQgdGhlIGh5cGVybGluayBwcm9wZXJ0eSBmb3IgYSByYW5nZSBvZiBjZWxscworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgVXJpIEh5cGVybGluayB7CisgICAgZ2V0IHsKKyAgICAgIElzUmFuZ2VWYWxpZCgiZm9ybXVsYVIxQzEiKTsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0Ll9oeXBlckxpbmtzLkdldFZhbHVlKF9mcm9tUm93LCBfZnJvbUNvbCk7CisgICAgfQorICAgIHNldCA9PiBfY2hhbmdlUHJvcE1ldGhvZChTZXRfSHlwZXJMaW5rLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgY2VsbHMgaW4gdGhlIHJhbmdlIGFyZSBtZXJnZWQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIE1lcmdlIHsKKyAgICBnZXQgeworICAgICAgSXNSYW5nZVZhbGlkKCJtZXJnaW5nIik7CisgICAgICBmb3IgKGludCBjb2wgPSBfZnJvbUNvbDsgY29sIDw9IF90b0NvbDsgY29sKyspIHsKKyAgICAgICAgZm9yIChpbnQgcm93ID0gX2Zyb21Sb3c7IHJvdyA8PSBfdG9Sb3c7IHJvdysrKSB7CisgICAgICAgICAgaWYgKF93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHNbcm93LCBjb2xdID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy9pZiAoIV93b3Jrc2hlZXQuX2ZsYWdzLkdldEZsYWdWYWx1ZShyb3csIGNvbCwgQ2VsbEZsYWdzLk1lcmdlZCkpCisgICAgICAgICAgLy97CisgICAgICAgICAgLy8gICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIC8vfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIElzUmFuZ2VWYWxpZCgibWVyZ2luZyIpOworICAgICAgLy9TZXRNZXJnZSh2YWx1ZSwgRmlyc3RBZGRyZXNzKTsKKyAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICBfd29ya3NoZWV0Lk1lcmdlZENlbGxzLkFkZChuZXcoRmlyc3RBZGRyZXNzKSwgdHJ1ZSk7CisgICAgICAgIGlmIChBZGRyZXNzZXMgIT0gbnVsbCkgeworICAgICAgICAgIGZvcmVhY2ggKHZhciBhZGRyZXNzIGluIEFkZHJlc3NlcykgeworICAgICAgICAgICAgX3dvcmtzaGVldC5NZXJnZWRDZWxscy5BZGQoYWRkcmVzcywgdHJ1ZSk7CisgICAgICAgICAgICAvL1NldE1lcmdlKHZhbHVlLCBhZGRyZXNzLl9hZGRyZXNzKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuQ2xlYXIodGhpcyk7CisgICAgICAgIGlmIChBZGRyZXNzZXMgIT0gbnVsbCkgeworICAgICAgICAgIGZvcmVhY2ggKHZhciBhZGRyZXNzIGluIEFkZHJlc3NlcykgeworICAgICAgICAgICAgX3dvcmtzaGVldC5NZXJnZWRDZWxscy5DbGVhcihhZGRyZXNzKTsKKyAgICAgICAgICAgIDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvL3ByaXZhdGUgdm9pZCBTZXRNZXJnZShib29sIHZhbHVlLCBzdHJpbmcgYWRkcmVzcykKKyAgLy97CisgIC8vICAgIGlmICghdmFsdWUpCisgIC8vICAgIHsKKyAgLy8gICAgICAgIGlmIChfd29ya3NoZWV0Lk1lcmdlZENlbGxzLkxpc3QuQ29udGFpbnMoYWRkcmVzcykpCisgIC8vICAgICAgICB7CisgIC8vICAgICAgICAgICAgU2V0Q2VsbE1lcmdlKGZhbHNlLCBhZGRyZXNzKTsKKyAgLy8gICAgICAgICAgICBfd29ya3NoZWV0Lk1lcmdlZENlbGxzLkxpc3QuUmVtb3ZlKGFkZHJlc3MpOworICAvLyAgICAgICAgfQorICAvLyAgICAgICAgZWxzZSBpZiAoIUNoZWNrTWVyZ2VEaWZmKGZhbHNlLCBhZGRyZXNzKSkKKyAgLy8gICAgICAgIHsKKyAgLy8gICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiUmFuZ2UgaXMgbm90IGZ1bGx5IG1lcmdlZC5TcGVjaWZ5IHRoZSBleGFjdCByYW5nZSIpKTsKKyAgLy8gICAgICAgIH0KKyAgLy8gICAgfQorICAvLyAgICBlbHNlCisgIC8vICAgIHsKKyAgLy8gICAgICAgIGlmIChDaGVja01lcmdlRGlmZihmYWxzZSwgYWRkcmVzcykpCisgIC8vICAgICAgICB7CisgIC8vICAgICAgICAgICAgU2V0Q2VsbE1lcmdlKHRydWUsIGFkZHJlc3MpOworICAvLyAgICAgICAgICAgIF93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuTGlzdC5BZGQoYWRkcmVzcyk7CisgIC8vICAgICAgICB9CisgIC8vICAgICAgICBlbHNlCisgIC8vICAgICAgICB7CisgIC8vICAgICAgICAgICAgaWYgKCFfd29ya3NoZWV0Lk1lcmdlZENlbGxzLkxpc3QuQ29udGFpbnMoYWRkcmVzcykpCisgIC8vICAgICAgICAgICAgeworICAvLyAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiQ2VsbHMgYXJlIGFscmVhZHkgbWVyZ2VkIikpOworICAvLyAgICAgICAgICAgIH0KKyAgLy8gICAgICAgIH0KKyAgLy8gICAgfQorICAvL30KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2V0IGFuIGF1dG9maWx0ZXIgZm9yIHRoZSByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBBdXRvRmlsdGVyIHsKKyAgICBnZXQgeworICAgICAgSXNSYW5nZVZhbGlkKCJhdXRvZmlsdGVyIik7CisgICAgICBFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MgPSBfd29ya3NoZWV0LkF1dG9GaWx0ZXJBZGRyZXNzOworICAgICAgaWYgKGFkZHJlc3MgPT0gbnVsbCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoX2Zyb21Sb3cgPj0gYWRkcmVzcy5TdGFydC5Sb3cKKyAgICAgICAgICAmJiBfdG9Sb3cgPD0gYWRkcmVzcy5FbmQuUm93CisgICAgICAgICAgJiYgX2Zyb21Db2wgPj0gYWRkcmVzcy5TdGFydC5Db2x1bW4KKyAgICAgICAgICAmJiBfdG9Db2wgPD0gYWRkcmVzcy5FbmQuQ29sdW1uKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzZXQgeworICAgICAgSXNSYW5nZVZhbGlkKCJhdXRvZmlsdGVyIik7CisgICAgICBfd29ya3NoZWV0LkF1dG9GaWx0ZXJBZGRyZXNzID0gdGhpczsKKyAgICAgIGlmIChfd29ya3NoZWV0Lk5hbWVzLkNvbnRhaW5zS2V5KCJfeGxubS5fRmlsdGVyRGF0YWJhc2UiKSkgeworICAgICAgICBfd29ya3NoZWV0Lk5hbWVzLlJlbW92ZSgiX3hsbm0uX0ZpbHRlckRhdGFiYXNlIik7CisgICAgICB9CisgICAgICB2YXIgcmVzdWx0ID0gX3dvcmtzaGVldC5OYW1lcy5BZGQoIl94bG5tLl9GaWx0ZXJEYXRhYmFzZSIsIHRoaXMpOworICAgICAgcmVzdWx0LklzTmFtZUhpZGRlbiA9IHRydWU7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhlIHZhbHVlIGlzIGluIHJpY2h0ZXh0IGZvcm1hdC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgSXNSaWNoVGV4dCB7CisgICAgZ2V0IHsKKyAgICAgIElzUmFuZ2VWYWxpZCgicmljaHRleHQiKTsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0Ll9mbGFncy5HZXRGbGFnVmFsdWUoX2Zyb21Sb3csIF9mcm9tQ29sLCBDZWxsRmxhZ3MuUmljaFRleHQpOworICAgIH0KKyAgICBzZXQgPT4gX2NoYW5nZVByb3BNZXRob2QoU2V0X0lzUmljaFRleHQsIHZhbHVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElzIHRoZSByYW5nZSBhIHBhcnQgb2YgYW4gQXJyYXlmb3JtdWxhCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIElzQXJyYXlGb3JtdWxhIHsKKyAgICBnZXQgeworICAgICAgSXNSYW5nZVZhbGlkKCJhcnJheWZvcm11bGFzIik7CisgICAgICByZXR1cm4gX3dvcmtzaGVldC5fZmxhZ3MuR2V0RmxhZ1ZhbHVlKF9mcm9tUm93LCBfZnJvbUNvbCwgQ2VsbEZsYWdzLkFycmF5Rm9ybXVsYSk7CisgICAgfQorICAgIHNldCA9PiBfY2hhbmdlUHJvcE1ldGhvZChTZXRfSXNBcnJheUZvcm11bGEsIHZhbHVlKTsKKyAgfQorCisgIHByaXZhdGUgRXhjZWxSaWNoVGV4dENvbGxlY3Rpb24gX3J0YzsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDZWxsIHZhbHVlIGlzIHJpY2h0ZXh0IGZvcm1hdHRlZC4KKyAgLy8vIFJpY2h0ZXh0LXByb3BlcnR5IG9ubHkgYXBwbHkgdG8gdGhlIGxlZnQtdG9wIGNlbGwgb2YgdGhlIHJhbmdlLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxSaWNoVGV4dENvbGxlY3Rpb24gUmljaFRleHQgeworICAgIGdldCB7CisgICAgICBJc1JhbmdlVmFsaWQoInJpY2h0ZXh0Iik7CisgICAgICBpZiAoX3J0YyA9PSBudWxsKSB7CisgICAgICAgIF9ydGMgPSBHZXRSaWNoVGV4dChfZnJvbVJvdywgX2Zyb21Db2wpOworICAgICAgfQorICAgICAgcmV0dXJuIF9ydGM7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBFeGNlbFJpY2hUZXh0Q29sbGVjdGlvbiBHZXRSaWNoVGV4dChpbnQgcm93LCBpbnQgY29sKSB7CisgICAgWG1sRG9jdW1lbnQgeG1sID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgdmFyIHYgPSBfd29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUocm93LCBjb2wpOworICAgIHZhciBpc1J0ID0gX3dvcmtzaGVldC5fZmxhZ3MuR2V0RmxhZ1ZhbHVlKHJvdywgY29sLCBDZWxsRmxhZ3MuUmljaFRleHQpOworICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgIGlmIChpc1J0KSB7CisgICAgICAgIFhtbEhlbHBlci5Mb2FkWG1sU2FmZSgKKyAgICAgICAgICAgIHhtbCwKKyAgICAgICAgICAgICI8ZDpzaSB4bWxuczpkPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCIgPiIKKyAgICAgICAgICAgICAgICArIHYKKyAgICAgICAgICAgICAgICArICI8L2Q6c2k+IiwKKyAgICAgICAgICAgIEVuY29kaW5nLlVURjgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgeG1sLkxvYWRYbWwoCisgICAgICAgICAgICAiPGQ6c2kgeG1sbnM6ZD1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiID48ZDpyPjxkOnQ+IgorICAgICAgICAgICAgICAgICsgU2VjdXJpdHlFbGVtZW50LkVzY2FwZSh2LlRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgKyAiPC9kOnQ+PC9kOnI+PC9kOnNpPiIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB4bWwuTG9hZFhtbCgiPGQ6c2kgeG1sbnM6ZD1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiIC8+Iik7CisgICAgfQorICAgIHZhciBydGMgPSBuZXcgRXhjZWxSaWNoVGV4dENvbGxlY3Rpb24oCisgICAgICAgIF93b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlciwKKyAgICAgICAgeG1sLlNlbGVjdFNpbmdsZU5vZGUoImQ6c2kiLCBfd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpLAorICAgICAgICB0aGlzKTsKKyAgICByZXR1cm4gcnRjOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gcmV0dXJucyB0aGUgY29tbWVudCBvYmplY3Qgb2YgdGhlIGZpcnN0IGNlbGwgaW4gdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbENvbW1lbnQgQ29tbWVudCB7CisgICAgZ2V0IHsKKyAgICAgIElzUmFuZ2VWYWxpZCgiY29tbWVudHMiKTsKKyAgICAgIHVsb25nIGNlbGxJZCA9IEdldENlbGxJZChfd29ya3NoZWV0LlNoZWV0SUQsIF9mcm9tUm93LCBfZnJvbUNvbCk7CisgICAgICBpZiAoX3dvcmtzaGVldC5Db21tZW50cy5fY29tbWVudHMuQ29udGFpbnNLZXkoY2VsbElkKSkgeworICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5fY29tbWVudHMuX2NvbW1lbnRzW2NlbGxJZF0gYXMgRXhjZWxDb21tZW50OworICAgICAgfQorICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gV29ya1NoZWV0IG9iamVjdAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxXb3Jrc2hlZXQgV29ya3NoZWV0ID0+IF93b3Jrc2hlZXQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcmVzcyBpbmNsdWRpbmcgc2hlZXRuYW1lCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgRnVsbEFkZHJlc3MgeworICAgIGdldCB7CisgICAgICBzdHJpbmcgZnVsbEFkZHJlc3MgPSBHZXRGdWxsQWRkcmVzcyhfd29ya3NoZWV0Lk5hbWUsIF9hZGRyZXNzKTsKKyAgICAgIGlmIChBZGRyZXNzZXMgIT0gbnVsbCkgeworICAgICAgICBmb3JlYWNoICh2YXIgYSBpbiBBZGRyZXNzZXMpIHsKKyAgICAgICAgICBmdWxsQWRkcmVzcyArPSAiLCIgKyBHZXRGdWxsQWRkcmVzcyhfd29ya3NoZWV0Lk5hbWUsIGEuQWRkcmVzcyk7CisgICAgICAgICAgOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gZnVsbEFkZHJlc3M7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcmVzcyBpbmNsdWRpbmcgc2hlZXRuYW1lCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgRnVsbEFkZHJlc3NBYnNvbHV0ZSB7CisgICAgZ2V0IHsKKyAgICAgIHN0cmluZyB3YndzUmVmID0gc3RyaW5nLklzTnVsbE9yRW1wdHkoX3diKSA/IF93cyA6ICJbIiArIF93Yi5SZXBsYWNlKCInIiwgIicnIikgKyAiXSIgKyBfd3M7CisgICAgICBzdHJpbmcgZnVsbEFkZHJlc3MgPSBHZXRGdWxsQWRkcmVzcygKKyAgICAgICAgICB3YndzUmVmLAorICAgICAgICAgIEdldEFkZHJlc3MoX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCwgdHJ1ZSkpOworICAgICAgaWYgKEFkZHJlc3NlcyAhPSBudWxsKSB7CisgICAgICAgIGZvcmVhY2ggKHZhciBhIGluIEFkZHJlc3NlcykgeworICAgICAgICAgIGZ1bGxBZGRyZXNzICs9CisgICAgICAgICAgICAgICIsIgorICAgICAgICAgICAgICAgICAgKyBHZXRGdWxsQWRkcmVzcygKKyAgICAgICAgICAgICAgICAgICAgICB3YndzUmVmLAorICAgICAgICAgICAgICAgICAgICAgIEdldEFkZHJlc3MoYS5TdGFydC5Sb3csIGEuU3RhcnQuQ29sdW1uLCBhLkVuZC5Sb3csIGEuRW5kLkNvbHVtbiwgdHJ1ZSkpOworICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGZ1bGxBZGRyZXNzOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHJlc3MgaW5jbHVkaW5nIHNoZWV0bmFtZQorICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCBzdHJpbmcgRnVsbEFkZHJlc3NBYnNvbHV0ZU5vRnVsbFJvd0NvbCB7CisgICAgZ2V0IHsKKyAgICAgIHN0cmluZyB3YndzUmVmID0gc3RyaW5nLklzTnVsbE9yRW1wdHkoX3diKSA/IF93cyA6ICJbIiArIF93Yi5SZXBsYWNlKCInIiwgIicnIikgKyAiXSIgKyBfd3M7CisgICAgICBzdHJpbmcgZnVsbEFkZHJlc3MgPSBHZXRGdWxsQWRkcmVzcygKKyAgICAgICAgICB3YndzUmVmLAorICAgICAgICAgIEdldEFkZHJlc3MoX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCwgdHJ1ZSksCisgICAgICAgICAgZmFsc2UpOworICAgICAgaWYgKEFkZHJlc3NlcyAhPSBudWxsKSB7CisgICAgICAgIGZvcmVhY2ggKHZhciBhIGluIEFkZHJlc3NlcykgeworICAgICAgICAgIGZ1bGxBZGRyZXNzICs9CisgICAgICAgICAgICAgICIsIgorICAgICAgICAgICAgICAgICAgKyBHZXRGdWxsQWRkcmVzcygKKyAgICAgICAgICAgICAgICAgICAgICB3YndzUmVmLAorICAgICAgICAgICAgICAgICAgICAgIEdldEFkZHJlc3MoYS5TdGFydC5Sb3csIGEuU3RhcnQuQ29sdW1uLCBhLkVuZC5Sb3csIGEuRW5kLkNvbHVtbiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgIDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGZ1bGxBZGRyZXNzOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNldCB0aGUgdmFsdWUgd2l0aG91dCBhbHRlcmluZyB0aGUgcmljaHRleHQgcHJvcGVydHkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+dGhlIHZhbHVlPC9wYXJhbT4KKyAgaW50ZXJuYWwgdm9pZCBTZXRWYWx1ZVJpY2hUZXh0KG9iamVjdCB2YWx1ZSkgeworICAgIGlmIChfZnJvbVJvdyA9PSAxCisgICAgICAgICYmIF9mcm9tQ29sID09IDEKKyAgICAgICAgJiYgX3RvUm93ID09IEV4Y2VsUGFja2FnZS5NYXhSb3dzCisgICAgICAgICYmIF90b0NvbAorICAgICAgICAgICAgPT0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpIC8vRnVsbCBzaGVldCAoZXggd3MuQ2VsbHMuVmFsdWU9MCkuIFNldCB2YWx1ZSBmb3IgQTEgb25seSB0byBhdm9pZCBoYW5naW5nCisgICAgeworICAgICAgLy9fd29ya3NoZWV0LkNlbGwoMSwgMSkuU2V0VmFsdWVSaWNoVGV4dCh2YWx1ZSk7CisgICAgICBTZXRWYWx1ZSh2YWx1ZSwgMSwgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vZm9yIChpbnQgY29sID0gX2Zyb21Db2w7IGNvbCA8PSBfdG9Db2w7IGNvbCsrKQorICAgICAgLy97CisgICAgICAvLyAgICBmb3IgKGludCByb3cgPSBfZnJvbVJvdzsgcm93IDw9IF90b1Jvdzsgcm93KyspCisgICAgICAvLyAgICB7CisgICAgICAvL193b3Jrc2hlZXQuQ2VsbChyb3csIGNvbCkuU2V0VmFsdWVSaWNoVGV4dCh2YWx1ZSk7CisgICAgICBTZXRWYWx1ZSh2YWx1ZSwgX2Zyb21Sb3csIF9mcm9tQ29sKTsKKyAgICAgIC8vfQorICAgICAgLy99CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIFNldFZhbHVlKG9iamVjdCB2YWx1ZSwgaW50IHJvdywgaW50IGNvbCkgeworICAgIF93b3Jrc2hlZXQuU2V0VmFsdWUocm93LCBjb2wsIHZhbHVlKTsKKyAgICAvLyBpZiAodmFsdWUgaXMgc3RyaW5nKSBfd29ya3NoZWV0Ll90eXBlcy5TZXRWYWx1ZShyb3csIGNvbCwgIlMiKTsgZWxzZSBfd29ya3NoZWV0Ll90eXBlcy5TZXRWYWx1ZShyb3csIGNvbCwgIiIpOworICAgIF93b3Jrc2hlZXQuX2Zvcm11bGFzLlNldFZhbHVlKHJvdywgY29sLCAiIik7CisgIH0KKworICBpbnRlcm5hbCB2b2lkIFNldFNoYXJlZEZvcm11bGFJZChpbnQgaWQpIHsKKyAgICBmb3IgKGludCBjb2wgPSBfZnJvbUNvbDsgY29sIDw9IF90b0NvbDsgY29sKyspIHsKKyAgICAgIGZvciAoaW50IHJvdyA9IF9mcm9tUm93OyByb3cgPD0gX3RvUm93OyByb3crKykgeworICAgICAgICBfd29ya3NoZWV0Ll9mb3JtdWxhcy5TZXRWYWx1ZShyb3csIGNvbCwgaWQpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBDaGVja0FuZFNwbGl0U2hhcmVkRm9ybXVsYShFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MpIHsKKyAgICBmb3IgKGludCBjb2wgPSBhZGRyZXNzLl9mcm9tQ29sOyBjb2wgPD0gYWRkcmVzcy5fdG9Db2w7IGNvbCsrKSB7CisgICAgICBmb3IgKGludCByb3cgPSBhZGRyZXNzLl9mcm9tUm93OyByb3cgPD0gYWRkcmVzcy5fdG9Sb3c7IHJvdysrKSB7CisgICAgICAgIHZhciBmID0gX3dvcmtzaGVldC5fZm9ybXVsYXMuR2V0VmFsdWUocm93LCBjb2wpOworICAgICAgICBpZiAoZiBpcyBpbnQgJiYgKGludClmID49IDApIHsKKyAgICAgICAgICBTcGxpdEZvcm11bGFzKGFkZHJlc3MpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBTcGxpdEZvcm11bGFzKEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcykgeworICAgIExpc3Q8aW50PiBmb3JtdWxhcyA9IG5ldyBMaXN0PGludD4oKTsKKyAgICBmb3IgKGludCBjb2wgPSBhZGRyZXNzLl9mcm9tQ29sOyBjb2wgPD0gYWRkcmVzcy5fdG9Db2w7IGNvbCsrKSB7CisgICAgICBmb3IgKGludCByb3cgPSBhZGRyZXNzLl9mcm9tUm93OyByb3cgPD0gYWRkcmVzcy5fdG9Sb3c7IHJvdysrKSB7CisgICAgICAgIHZhciBmID0gX3dvcmtzaGVldC5fZm9ybXVsYXMuR2V0VmFsdWUocm93LCBjb2wpOworICAgICAgICBpZiAoZiBpcyBpbnQpIHsKKyAgICAgICAgICBpbnQgaWQgPSAoaW50KWY7CisgICAgICAgICAgaWYgKGlkID49IDAgJiYgIWZvcm11bGFzLkNvbnRhaW5zKGlkKSkgeworICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXQuX3NoYXJlZEZvcm11bGFzW2lkXS5Jc0FycmF5CisgICAgICAgICAgICAgICAgJiYgQ29sbGlkZShfd29ya3NoZWV0LkNlbGxzW193b3Jrc2hlZXQuX3NoYXJlZEZvcm11bGFzW2lkXS5BZGRyZXNzXSkKKyAgICAgICAgICAgICAgICAgICAgPT0gZUFkZHJlc3NDb2xsaXRpb24uUGFydGx5KSAvLyBJZiB0aGUgZm9ybXVsYSBpcyBhbiBhcnJheSBmb3JtdWxhIGFuZCBpdHMgb24gdGhlIGluc2lkZSB0aGUgb3ZlcndyaXRpbmcgcmFuZ2UgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuIG5vdCBvdmVyd3JpdGUgYSBwYXJ0IG9mIGFuIGFycmF5LWZvcm11bGEiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JtdWxhcy5BZGQoaWQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGZvcmVhY2ggKGludCBpeCBpbiBmb3JtdWxhcykgeworICAgICAgU3BsaXRGb3JtdWxhKGFkZHJlc3MsIGl4KTsKKyAgICB9CisKKyAgICAvLy8vQ2xlYXIgYW55IGZvcm11bGEgcmVmZXJlbmNlcyBpbnNpZGUgdGhlIHJlZmVyZWQgcmFuZ2UKKyAgICAvL193b3Jrc2hlZXQuX2Zvcm11bGFzLkNsZWFyKGFkZHJlc3MuX2Zyb21Sb3csIGFkZHJlc3MuX3RvUm93LCBhZGRyZXNzLl90b1JvdyAtIGFkZHJlc3MuX2Zyb21Sb3cgKyAxLCBhZGRyZXNzLl90b0NvbCAtIGFkZHJlc3MuY29sdW1uICsgMSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgU3BsaXRGb3JtdWxhKEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcywgaW50IGl4KSB7CisgICAgdmFyIGYgPSBfd29ya3NoZWV0Ll9zaGFyZWRGb3JtdWxhc1tpeF07CisgICAgdmFyIGZSYW5nZSA9IF93b3Jrc2hlZXQuQ2VsbHNbZi5BZGRyZXNzXTsKKyAgICB2YXIgY29sbGlkZSA9IGFkZHJlc3MuQ29sbGlkZShmUmFuZ2UpOworCisgICAgLy9UaGUgZm9ybXVsYSBpcyBpbnNpZGUgdGhlIGN1cnJlbmN0IHJhbmdlLCByZW1vdmUgaXQKKyAgICBpZiAoY29sbGlkZSA9PSBlQWRkcmVzc0NvbGxpdGlvbi5FcXVhbCB8fCBjb2xsaWRlID09IGVBZGRyZXNzQ29sbGl0aW9uLkluc2lkZSkgeworICAgICAgX3dvcmtzaGVldC5fc2hhcmVkRm9ybXVsYXMuUmVtb3ZlKGl4KTsKKyAgICAgIHJldHVybjsKKyAgICAgIC8vZlJhbmdlLlNldFNoYXJlZEZvcm11bGFJRChpbnQuTWluVmFsdWUpOworICAgIH0KKyAgICB2YXIgZmlyc3RDZWxsQ29sbGlkZSA9IGFkZHJlc3MuQ29sbGlkZSgKKyAgICAgICAgbmV3KGZSYW5nZS5fZnJvbVJvdywgZlJhbmdlLl9mcm9tQ29sLCBmUmFuZ2UuX2Zyb21Sb3csIGZSYW5nZS5fZnJvbUNvbCkpOworICAgIGlmIChjb2xsaWRlID09IGVBZGRyZXNzQ29sbGl0aW9uLlBhcnRseQorICAgICAgICAmJiAoZmlyc3RDZWxsQ29sbGlkZSA9PSBlQWRkcmVzc0NvbGxpdGlvbi5JbnNpZGUKKyAgICAgICAgICAgICAgICB8fCBmaXJzdENlbGxDb2xsaWRlCisgICAgICAgICAgICAgICAgICAgID09IGVBZGRyZXNzQ29sbGl0aW9uLkVxdWFsKSkgLy9EbyB3ZSBuZWVkIHRvIHNwbGl0PyBPbmx5IGlmIHRoZSBmdW5jdGlvbnMgZmlyc3Qgcm93IGlzIGluc2lkZSB0aGUgbmV3IHJhbmdlLgorICAgIHsKKyAgICAgIC8vVGhlIGZvcm11bGEgcGFydGx5IGNvbGxpZGVzIHdpdGggdGhlIGN1cnJlbnQgcmFuZ2UKKyAgICAgIGJvb2wgZklzU2V0ID0gZmFsc2U7CisgICAgICBzdHJpbmcgZm9ybXVsYVIxQzEgPSBmUmFuZ2UuRm9ybXVsYVIxQzE7CisgICAgICAvL1RvcCBSYW5nZQorICAgICAgaWYgKGZSYW5nZS5fZnJvbVJvdyA8IF9mcm9tUm93KSB7CisgICAgICAgIGYuQWRkcmVzcyA9IEdldEFkZHJlc3MoZlJhbmdlLl9mcm9tUm93LCBmUmFuZ2UuX2Zyb21Db2wsIF9mcm9tUm93IC0gMSwgZlJhbmdlLl90b0NvbCk7CisgICAgICAgIGZJc1NldCA9IHRydWU7CisgICAgICB9CisgICAgICAvL0xlZnQgUmFuZ2UKKyAgICAgIGlmIChmUmFuZ2UuX2Zyb21Db2wgPCBhZGRyZXNzLl9mcm9tQ29sKSB7CisgICAgICAgIGlmIChmSXNTZXQpIHsKKyAgICAgICAgICBmID0gbmV3KFNvdXJjZUNvZGVUb2tlbml6ZXIuRGVmYXVsdCk7CisgICAgICAgICAgZi5JbmRleCA9IF93b3Jrc2hlZXQuR2V0TWF4U2hhcmVGdW5jdGlvbkluZGV4KGZhbHNlKTsKKyAgICAgICAgICBmLlN0YXJ0Q29sID0gZlJhbmdlLl9mcm9tQ29sOworICAgICAgICAgIGYuSXNBcnJheSA9IGZhbHNlOworICAgICAgICAgIF93b3Jrc2hlZXQuX3NoYXJlZEZvcm11bGFzLkFkZChmLkluZGV4LCBmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmSXNTZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChmUmFuZ2UuX2Zyb21Sb3cgPCBhZGRyZXNzLl9mcm9tUm93KSB7CisgICAgICAgICAgZi5TdGFydFJvdyA9IGFkZHJlc3MuX2Zyb21Sb3c7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZi5TdGFydFJvdyA9IGZSYW5nZS5fZnJvbVJvdzsKKyAgICAgICAgfQorICAgICAgICBpZiAoZlJhbmdlLl90b1JvdyA8IGFkZHJlc3MuX3RvUm93KSB7CisgICAgICAgICAgZi5BZGRyZXNzID0gR2V0QWRkcmVzcyhmLlN0YXJ0Um93LCBmLlN0YXJ0Q29sLCBmUmFuZ2UuX3RvUm93LCBhZGRyZXNzLl9mcm9tQ29sIC0gMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZi5BZGRyZXNzID0gR2V0QWRkcmVzcyhmLlN0YXJ0Um93LCBmLlN0YXJ0Q29sLCBhZGRyZXNzLl90b1JvdywgYWRkcmVzcy5fZnJvbUNvbCAtIDEpOworICAgICAgICB9CisgICAgICAgIGYuRm9ybXVsYSA9IFRyYW5zbGF0ZUZyb21SMUMxKGZvcm11bGFSMUMxLCBmLlN0YXJ0Um93LCBmLlN0YXJ0Q29sKTsKKyAgICAgICAgX3dvcmtzaGVldC5DZWxsc1tmLkFkZHJlc3NdLlNldFNoYXJlZEZvcm11bGFJZChmLkluZGV4KTsKKyAgICAgIH0KKyAgICAgIC8vUmlnaHQgUmFuZ2UKKyAgICAgIGlmIChmUmFuZ2UuX3RvQ29sID4gYWRkcmVzcy5fdG9Db2wpIHsKKyAgICAgICAgaWYgKGZJc1NldCkgeworICAgICAgICAgIGYgPSBuZXcoU291cmNlQ29kZVRva2VuaXplci5EZWZhdWx0KTsKKyAgICAgICAgICBmLkluZGV4ID0gX3dvcmtzaGVldC5HZXRNYXhTaGFyZUZ1bmN0aW9uSW5kZXgoZmFsc2UpOworICAgICAgICAgIGYuSXNBcnJheSA9IGZhbHNlOworICAgICAgICAgIF93b3Jrc2hlZXQuX3NoYXJlZEZvcm11bGFzLkFkZChmLkluZGV4LCBmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmSXNTZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGYuU3RhcnRDb2wgPSBhZGRyZXNzLl90b0NvbCArIDE7CisgICAgICAgIGlmIChhZGRyZXNzLl9mcm9tUm93IDwgZlJhbmdlLl9mcm9tUm93KSB7CisgICAgICAgICAgZi5TdGFydFJvdyA9IGZSYW5nZS5fZnJvbVJvdzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmLlN0YXJ0Um93ID0gYWRkcmVzcy5fZnJvbVJvdzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmUmFuZ2UuX3RvUm93IDwgYWRkcmVzcy5fdG9Sb3cpIHsKKyAgICAgICAgICBmLkFkZHJlc3MgPSBHZXRBZGRyZXNzKGYuU3RhcnRSb3csIGYuU3RhcnRDb2wsIGZSYW5nZS5fdG9Sb3csIGZSYW5nZS5fdG9Db2wpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGYuQWRkcmVzcyA9IEdldEFkZHJlc3MoZi5TdGFydFJvdywgZi5TdGFydENvbCwgYWRkcmVzcy5fdG9Sb3csIGZSYW5nZS5fdG9Db2wpOworICAgICAgICB9CisgICAgICAgIGYuRm9ybXVsYSA9IFRyYW5zbGF0ZUZyb21SMUMxKGZvcm11bGFSMUMxLCBmLlN0YXJ0Um93LCBmLlN0YXJ0Q29sKTsKKyAgICAgICAgX3dvcmtzaGVldC5DZWxsc1tmLkFkZHJlc3NdLlNldFNoYXJlZEZvcm11bGFJZChmLkluZGV4KTsKKyAgICAgIH0KKyAgICAgIC8vQm90dG9tIFJhbmdlCisgICAgICBpZiAoZlJhbmdlLl90b1JvdyA+IGFkZHJlc3MuX3RvUm93KSB7CisgICAgICAgIGlmIChmSXNTZXQpIHsKKyAgICAgICAgICBmID0gbmV3KFNvdXJjZUNvZGVUb2tlbml6ZXIuRGVmYXVsdCk7CisgICAgICAgICAgZi5JbmRleCA9IF93b3Jrc2hlZXQuR2V0TWF4U2hhcmVGdW5jdGlvbkluZGV4KGZhbHNlKTsKKyAgICAgICAgICBmLklzQXJyYXkgPSBmYWxzZTsKKyAgICAgICAgICBfd29ya3NoZWV0Ll9zaGFyZWRGb3JtdWxhcy5BZGQoZi5JbmRleCwgZik7CisgICAgICAgIH0KKworICAgICAgICBmLlN0YXJ0Q29sID0gZlJhbmdlLl9mcm9tQ29sOworICAgICAgICBmLlN0YXJ0Um93ID0gX3RvUm93ICsgMTsKKworICAgICAgICBmLkZvcm11bGEgPSBUcmFuc2xhdGVGcm9tUjFDMShmb3JtdWxhUjFDMSwgZi5TdGFydFJvdywgZi5TdGFydENvbCk7CisKKyAgICAgICAgZi5BZGRyZXNzID0gR2V0QWRkcmVzcyhmLlN0YXJ0Um93LCBmLlN0YXJ0Q29sLCBmUmFuZ2UuX3RvUm93LCBmUmFuZ2UuX3RvQ29sKTsKKyAgICAgICAgX3dvcmtzaGVldC5DZWxsc1tmLkFkZHJlc3NdLlNldFNoYXJlZEZvcm11bGFJZChmLkluZGV4KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIG9iamVjdCBDb252ZXJ0RGF0YShFeGNlbFRleHRGb3JtYXQgZm9ybWF0LCBzdHJpbmcgdiwgaW50IGNvbCwgYm9vbCBpc1RleHQpIHsKKyAgICBpZiAoaXNUZXh0ICYmIChmb3JtYXQuRGF0YVR5cGVzID09IG51bGwgfHwgZm9ybWF0LkRhdGFUeXBlcy5MZW5ndGggPCBjb2wpKSB7CisgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICBkb3VibGUgZDsKKyAgICBEYXRlVGltZSBkdDsKKyAgICBpZiAoZm9ybWF0LkRhdGFUeXBlcyA9PSBudWxsCisgICAgICAgIHx8IGZvcm1hdC5EYXRhVHlwZXMuTGVuZ3RoIDw9IGNvbAorICAgICAgICB8fCBmb3JtYXQuRGF0YVR5cGVzW2NvbF0gPT0gZURhdGFUeXBlcy5Vbmtub3duKSB7CisgICAgICBzdHJpbmcgdjIgPSB2LkVuZHNXaXRoKCIlIikgPyB2LlN1YnN0cmluZygwLCB2Lkxlbmd0aCAtIDEpIDogdjsKKyAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2UodjIsIE51bWJlclN0eWxlcy5BbnksIGZvcm1hdC5DdWx0dXJlLCBvdXQgZCkpIHsKKyAgICAgICAgaWYgKHYyID09IHYpIHsKKyAgICAgICAgICByZXR1cm4gZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZCAvIDEwMDsKKyAgICAgIH0KKyAgICAgIGlmIChEYXRlVGltZS5UcnlQYXJzZSh2LCBmb3JtYXQuQ3VsdHVyZSwgRGF0ZVRpbWVTdHlsZXMuTm9uZSwgb3V0IGR0KSkgeworICAgICAgICByZXR1cm4gZHQ7CisgICAgICB9CisgICAgICByZXR1cm4gdjsKKyAgICB9CisgICAgc3dpdGNoIChmb3JtYXQuRGF0YVR5cGVzW2NvbF0pIHsKKyAgICAgIGNhc2UgZURhdGFUeXBlcy5OdW1iZXI6CisgICAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2UodiwgTnVtYmVyU3R5bGVzLkFueSwgZm9ybWF0LkN1bHR1cmUsIG91dCBkKSkgeworICAgICAgICAgIHJldHVybiBkOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2OworICAgICAgY2FzZSBlRGF0YVR5cGVzLkRhdGVUaW1lOgorICAgICAgICBpZiAoRGF0ZVRpbWUuVHJ5UGFyc2UodiwgZm9ybWF0LkN1bHR1cmUsIERhdGVUaW1lU3R5bGVzLk5vbmUsIG91dCBkdCkpIHsKKyAgICAgICAgICByZXR1cm4gZHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHY7CisgICAgICBjYXNlIGVEYXRhVHlwZXMuUGVyY2VudDoKKyAgICAgICAgc3RyaW5nIHYyID0gdi5FbmRzV2l0aCgiJSIpID8gdi5TdWJzdHJpbmcoMCwgdi5MZW5ndGggLSAxKSA6IHY7CisgICAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2UodjIsIE51bWJlclN0eWxlcy5BbnksIGZvcm1hdC5DdWx0dXJlLCBvdXQgZCkpIHsKKyAgICAgICAgICByZXR1cm4gZCAvIDEwMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdjsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29uZGl0aW9uYWwgRm9ybWF0dGluZyBmb3IgdGhpcyByYW5nZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIElSYW5nZUNvbmRpdGlvbmFsRm9ybWF0dGluZyBDb25kaXRpb25hbEZvcm1hdHRpbmcgPT4KKyAgICBuZXcgUmFuZ2VDb25kaXRpb25hbEZvcm1hdHRpbmcoX3dvcmtzaGVldCwgbmV3KEFkZHJlc3MpKTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBEYXRhIHZhbGlkYXRpb24gZm9yIHRoaXMgcmFuZ2UuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBJUmFuZ2VEYXRhVmFsaWRhdGlvbiBEYXRhVmFsaWRhdGlvbiA9PiBuZXcgUmFuZ2VEYXRhVmFsaWRhdGlvbihfd29ya3NoZWV0LCBBZGRyZXNzKTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMb2FkIHRoZSBkYXRhIGZyb20gdGhlIGRhdGFyZWFkZXIgc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgY2VsbCBvZiB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyZWFkZXIiPlRoZSBkYXRhcmVhZGVyIHRvIGxvYWRmcm9tPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmludEhlYWRlcnMiPlByaW50IHRoZSBjb2x1bW4gY2FwdGlvbiBwcm9wZXJ0eSAoaWYgc2V0KSBvciB0aGUgY29sdW1ubmFtZSBwcm9wZXJ0eSBpZiBub3QsIG9uIGZpcnN0IHJvdzwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idGFibGVOYW1lIj5UaGUgbmFtZSBvZiB0aGUgdGFibGU8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InRhYmxlU3R5bGUiPlRoZSB0YWJsZSBzdHlsZSB0byBhcHBseSB0byB0aGUgZGF0YTwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UaGUgZmlsbGVkIHJhbmdlPC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21EYXRhUmVhZGVyKAorICAgICAgSURhdGFSZWFkZXIgcmVhZGVyLAorICAgICAgYm9vbCBwcmludEhlYWRlcnMsCisgICAgICBzdHJpbmcgdGFibGVOYW1lLAorICAgICAgVGFibGVTdHlsZXMgdGFibGVTdHlsZSA9IFRhYmxlU3R5bGVzLk5vbmUpIHsKKyAgICB2YXIgciA9IExvYWRGcm9tRGF0YVJlYWRlcihyZWFkZXIsIHByaW50SGVhZGVycyk7CisKKyAgICBpbnQgcm93cyA9IHIuUm93cyAtIDE7CisgICAgaWYgKHJvd3MgPj0gMCAmJiByLkNvbHVtbnMgPiAwKSB7CisgICAgICB2YXIgdGJsID0gX3dvcmtzaGVldC5UYWJsZXMuQWRkKAorICAgICAgICAgIG5ldyhfZnJvbVJvdywgX2Zyb21Db2wsIF9mcm9tUm93ICsgKHJvd3MgPD0gMCA/IDEgOiByb3dzKSwgX2Zyb21Db2wgKyByLkNvbHVtbnMgLSAxKSwKKyAgICAgICAgICB0YWJsZU5hbWUpOworICAgICAgdGJsLlNob3dIZWFkZXIgPSBwcmludEhlYWRlcnM7CisgICAgICB0YmwuVGFibGVTdHlsZSA9IHRhYmxlU3R5bGU7CisgICAgfQorICAgIHJldHVybiByOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTG9hZCB0aGUgZGF0YSBmcm9tIHRoZSBkYXRhcmVhZGVyIHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBsZWZ0IGNlbGwgb2YgdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icmVhZGVyIj5UaGUgZGF0YXJlYWRlciB0byBsb2FkIGZyb208L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW50SGVhZGVycyI+UHJpbnQgdGhlIGNhcHRpb24gcHJvcGVydHkgKGlmIHNldCkgb3IgdGhlIGNvbHVtbm5hbWUgcHJvcGVydHkgaWYgbm90LCBvbiBmaXJzdCByb3c8L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIGZpbGxlZCByYW5nZTwvcmV0dXJucz4KKyAgcHVibGljIEV4Y2VsUmFuZ2VCYXNlIExvYWRGcm9tRGF0YVJlYWRlcihJRGF0YVJlYWRlciByZWFkZXIsIGJvb2wgcHJpbnRIZWFkZXJzKSB7CisgICAgaWYgKHJlYWRlciA9PSBudWxsKSB7CisgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigicmVhZGVyIiwgIlJlYWRlciBjYW4ndCBiZSBudWxsIikpOworICAgIH0KKyAgICBpbnQgZmllbGRDb3VudCA9IHJlYWRlci5GaWVsZENvdW50OworCisgICAgaW50IGNvbCA9IF9mcm9tQ29sLAorICAgICAgICByb3cgPSBfZnJvbVJvdzsKKyAgICBpZiAocHJpbnRIZWFkZXJzKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkQ291bnQ7IGkrKykgeworICAgICAgICAvLyBJZiBubyBjYXB0aW9uIGlzIHNldCwgdGhlIENvbHVtbk5hbWUgcHJvcGVydHkgaXMgY2FsbGVkIGltcGxpY2l0bHkuCisgICAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCsrLCByZWFkZXIuR2V0TmFtZShpKSk7CisgICAgICB9CisgICAgICByb3crKzsKKyAgICAgIGNvbCA9IF9mcm9tQ29sOworICAgIH0KKyAgICB3aGlsZSAocmVhZGVyLlJlYWQoKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZENvdW50OyBpKyspIHsKKyAgICAgICAgX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sKyssIHJlYWRlci5HZXRWYWx1ZShpKSk7CisgICAgICB9CisgICAgICByb3crKzsKKyAgICAgIGNvbCA9IF9mcm9tQ29sOworICAgIH0KKyAgICByZXR1cm4gX3dvcmtzaGVldC5DZWxsc1tfZnJvbVJvdywgX2Zyb21Db2wsIHJvdyAtIDEsIF9mcm9tQ29sICsgZmllbGRDb3VudCAtIDFdOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTG9hZCB0aGUgZGF0YSBmcm9tIHRoZSBkYXRhdGFibGUgc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgY2VsbCBvZiB0aGUgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0YWJsZSI+VGhlIGRhdGF0YWJsZSB0byBsb2FkPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmludEhlYWRlcnMiPlByaW50IHRoZSBjb2x1bW4gY2FwdGlvbiBwcm9wZXJ0eSAoaWYgc2V0KSBvciB0aGUgY29sdW1ubmFtZSBwcm9wZXJ0eSBpZiBub3QsIG9uIGZpcnN0IHJvdzwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idGFibGVTdHlsZSI+VGhlIHRhYmxlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSBkYXRhPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPlRoZSBmaWxsZWQgcmFuZ2U8L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbURhdGFUYWJsZSgKKyAgICAgIERhdGFUYWJsZSB0YWJsZSwKKyAgICAgIGJvb2wgcHJpbnRIZWFkZXJzLAorICAgICAgVGFibGVTdHlsZXMgdGFibGVTdHlsZSkgeworICAgIHZhciByID0gTG9hZEZyb21EYXRhVGFibGUodGFibGUsIHByaW50SGVhZGVycyk7CisKKyAgICBpbnQgcm93cyA9ICh0YWJsZS5Sb3dzLkNvdW50ID09IDAgPyAxIDogdGFibGUuUm93cy5Db3VudCkgKyAocHJpbnRIZWFkZXJzID8gMSA6IDApOworICAgIGlmIChyb3dzID49IDAgJiYgdGFibGUuQ29sdW1ucy5Db3VudCA+IDApIHsKKyAgICAgIHZhciB0YmwgPSBfd29ya3NoZWV0LlRhYmxlcy5BZGQoCisgICAgICAgICAgbmV3KF9mcm9tUm93LCBfZnJvbUNvbCwgX2Zyb21Sb3cgKyByb3dzIC0gMSwgX2Zyb21Db2wgKyB0YWJsZS5Db2x1bW5zLkNvdW50IC0gMSksCisgICAgICAgICAgdGFibGUuVGFibGVOYW1lKTsKKyAgICAgIHRibC5TaG93SGVhZGVyID0gcHJpbnRIZWFkZXJzOworICAgICAgdGJsLlRhYmxlU3R5bGUgPSB0YWJsZVN0eWxlOworICAgIH0KKyAgICByZXR1cm4gcjsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIExvYWQgdGhlIGRhdGEgZnJvbSB0aGUgZGF0YXRhYmxlIHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBsZWZ0IGNlbGwgb2YgdGhlIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idGFibGUiPlRoZSBkYXRhdGFibGUgdG8gbG9hZDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpbnRIZWFkZXJzIj5QcmludCB0aGUgY2FwdGlvbiBwcm9wZXJ0eSAoaWYgc2V0KSBvciB0aGUgY29sdW1ubmFtZSBwcm9wZXJ0eSBpZiBub3QsIG9uIGZpcnN0IHJvdzwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UaGUgZmlsbGVkIHJhbmdlPC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21EYXRhVGFibGUoRGF0YVRhYmxlIHRhYmxlLCBib29sIHByaW50SGVhZGVycykgeworICAgIGlmICh0YWJsZSA9PSBudWxsKSB7CisgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiVGFibGUgY2FuJ3QgYmUgbnVsbCIpKTsKKyAgICB9CisKKyAgICBpbnQgY29sID0gX2Zyb21Db2wsCisgICAgICAgIHJvdyA9IF9mcm9tUm93OworICAgIGlmIChwcmludEhlYWRlcnMpIHsKKyAgICAgIGZvcmVhY2ggKERhdGFDb2x1bW4gZGMgaW4gdGFibGUuQ29sdW1ucykgeworICAgICAgICAvLyBJZiBubyBjYXB0aW9uIGlzIHNldCwgdGhlIENvbHVtbk5hbWUgcHJvcGVydHkgaXMgY2FsbGVkIGltcGxpY2l0bHkuCisgICAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCsrLCBkYy5DYXB0aW9uKTsKKyAgICAgIH0KKyAgICAgIHJvdysrOworICAgICAgY29sID0gX2Zyb21Db2w7CisgICAgfSBlbHNlIGlmICh0YWJsZS5Sb3dzLkNvdW50ID09IDApIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBmb3JlYWNoIChEYXRhUm93IGRyIGluIHRhYmxlLlJvd3MpIHsKKyAgICAgIGZvcmVhY2ggKG9iamVjdCB2YWx1ZSBpbiBkci5JdGVtQXJyYXkpIHsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgIT0gREJOdWxsLlZhbHVlICYmICFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZS5Ub1N0cmluZygpKSkgeworICAgICAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCsrLCB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29sKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJvdysrOworICAgICAgY29sID0gX2Zyb21Db2w7CisgICAgfQorICAgIHJldHVybiBfd29ya3NoZWV0LkNlbGxzW19mcm9tUm93LAorICAgICAgX2Zyb21Db2wsCisgICAgICAocm93ID09IF9mcm9tUm93ID8gX2Zyb21Sb3cgOiByb3cgLSAxKSwKKyAgICAgIF9mcm9tQ29sICsgdGFibGUuQ29sdW1ucy5Db3VudCAtIDFdOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTG9hZHMgZGF0YSBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIGFycmF5cyBvZiBvYmplY3RzIGludG8gdGhlIHJhbmdlLCBzdGFydGluZyBmcm9tCisgIC8vLyB0aGUgdG9wLWxlZnQgY2VsbC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgZGF0YS48L3BhcmFtPgorICBwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21BcnJheXMoSUVudW1lcmFibGU8b2JqZWN0W10+IGRhdGEpIHsKKyAgICAvL3RoYW54IHRvIEFiZHVsbGluIGZvciB0aGUgY29kZSBjb250cmlidXRpb24KKyAgICBpZiAoZGF0YSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJkYXRhIik7CisgICAgfQorCisgICAgaW50IGNvbHVtbiA9IF9mcm9tQ29sLAorICAgICAgICByb3cgPSBfZnJvbVJvdzsKKworICAgIGZvcmVhY2ggKHZhciByb3dEYXRhIGluIGRhdGEpIHsKKyAgICAgIGNvbHVtbiA9IF9mcm9tQ29sOworICAgICAgZm9yZWFjaCAodmFyIGNlbGxEYXRhIGluIHJvd0RhdGEpIHsKKyAgICAgICAgX3dvcmtzaGVldC5fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sdW1uLCBjZWxsRGF0YSk7CisgICAgICAgIGNvbHVtbiArPSAxOworICAgICAgfQorICAgICAgcm93ICs9IDE7CisgICAgfQorICAgIHJldHVybiBfd29ya3NoZWV0LkNlbGxzW19mcm9tUm93LCBfZnJvbUNvbCwgcm93IC0gMSwgY29sdW1uIC0gMV07CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMb2FkIGEgY29sbGVjdGlvbiBpbnRvIGEgdGhlIHdvcmtzaGVldCBzdGFydGluZyBmcm9tIHRoZSB0b3AgbGVmdCByb3cgb2YgdGhlIHJhbmdlLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgZGF0YXR5cGUgaW4gdGhlIGNvbGxlY3Rpb248L3R5cGVwYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5UaGUgY29sbGVjdGlvbiB0byBsb2FkPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPlRoZSBmaWxsZWQgcmFuZ2U8L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbUNvbGxlY3Rpb248VD4oSUVudW1lcmFibGU8VD4gY29sbGVjdGlvbikgeworICAgIHJldHVybiBMb2FkRnJvbUNvbGxlY3Rpb24oCisgICAgICAgIGNvbGxlY3Rpb24sCisgICAgICAgIGZhbHNlLAorICAgICAgICBUYWJsZVN0eWxlcy5Ob25lLAorICAgICAgICBCaW5kaW5nRmxhZ3MuUHVibGljIHwgQmluZGluZ0ZsYWdzLkluc3RhbmNlLAorICAgICAgICBudWxsKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIExvYWQgYSBjb2xsZWN0aW9uIG9mIFQgaW50byB0aGUgd29ya3NoZWV0IHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBsZWZ0IHJvdyBvZiB0aGUgcmFuZ2UuCisgIC8vLyBEZWZhdWx0IG9wdGlvbiB3aWxsIGxvYWQgYWxsIHB1YmxpYyBpbnN0YW5jZSBwcm9wZXJ0aWVzIG9mIFQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIGRhdGF0eXBlIGluIHRoZSBjb2xsZWN0aW9uPC90eXBlcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+VGhlIGNvbGxlY3Rpb24gdG8gbG9hZDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJpbnRIZWFkZXJzIj5QcmludCB0aGUgcHJvcGVydHkgbmFtZXMgb24gdGhlIGZpcnN0IHJvdy4gSWYgdGhlIHByb3BlcnR5IGlzIGRlY29yYXRlZCB3aXRoIGEgPHNlZSBjcmVmPSJEaXNwbGF5TmFtZUF0dHJpYnV0ZSIvPiBvciBhIDxzZWUgY3JlZj0iRGVzY3JpcHRpb25BdHRyaWJ1dGUiLz4gdGhhdCBhdHRyaWJ1dGUgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHJlZmxlY3RlZCBtZW1iZXIgbmFtZS48L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIGZpbGxlZCByYW5nZTwvcmV0dXJucz4KKyAgcHVibGljIEV4Y2VsUmFuZ2VCYXNlIExvYWRGcm9tQ29sbGVjdGlvbjxUPihJRW51bWVyYWJsZTxUPiBjb2xsZWN0aW9uLCBib29sIHByaW50SGVhZGVycykgeworICAgIHJldHVybiBMb2FkRnJvbUNvbGxlY3Rpb24oCisgICAgICAgIGNvbGxlY3Rpb24sCisgICAgICAgIHByaW50SGVhZGVycywKKyAgICAgICAgVGFibGVTdHlsZXMuTm9uZSwKKyAgICAgICAgQmluZGluZ0ZsYWdzLlB1YmxpYyB8IEJpbmRpbmdGbGFncy5JbnN0YW5jZSwKKyAgICAgICAgbnVsbCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMb2FkIGEgY29sbGVjdGlvbiBvZiBUIGludG8gdGhlIHdvcmtzaGVldCBzdGFydGluZyBmcm9tIHRoZSB0b3AgbGVmdCByb3cgb2YgdGhlIHJhbmdlLgorICAvLy8gRGVmYXVsdCBvcHRpb24gd2lsbCBsb2FkIGFsbCBwdWJsaWMgaW5zdGFuY2UgcHJvcGVydGllcyBvZiBUCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSBkYXRhdHlwZSBpbiB0aGUgY29sbGVjdGlvbjwvdHlwZXBhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbGxlY3Rpb24iPlRoZSBjb2xsZWN0aW9uIHRvIGxvYWQ8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InByaW50SGVhZGVycyI+UHJpbnQgdGhlIHByb3BlcnR5IG5hbWVzIG9uIHRoZSBmaXJzdCByb3cuIElmIHRoZSBwcm9wZXJ0eSBpcyBkZWNvcmF0ZWQgd2l0aCBhIDxzZWUgY3JlZj0iRGlzcGxheU5hbWVBdHRyaWJ1dGUiLz4gb3IgYSA8c2VlIGNyZWY9IkRlc2NyaXB0aW9uQXR0cmlidXRlIi8+IHRoYXQgYXR0cmlidXRlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSByZWZsZWN0ZWQgbWVtYmVyIG5hbWUuPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0YWJsZVN0eWxlIj5XaWxsIGNyZWF0ZSBhIHRhYmxlIHdpdGggdGhpcyBzdHlsZS4gSWYgc2V0IHRvIFRhYmxlU3R5bGVzLk5vbmUgbm8gdGFibGUgd2lsbCBiZSBjcmVhdGVkPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPlRoZSBmaWxsZWQgcmFuZ2U8L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbUNvbGxlY3Rpb248VD4oCisgICAgICBJRW51bWVyYWJsZTxUPiBjb2xsZWN0aW9uLAorICAgICAgYm9vbCBwcmludEhlYWRlcnMsCisgICAgICBUYWJsZVN0eWxlcyB0YWJsZVN0eWxlKSB7CisgICAgcmV0dXJuIExvYWRGcm9tQ29sbGVjdGlvbigKKyAgICAgICAgY29sbGVjdGlvbiwKKyAgICAgICAgcHJpbnRIZWFkZXJzLAorICAgICAgICB0YWJsZVN0eWxlLAorICAgICAgICBCaW5kaW5nRmxhZ3MuUHVibGljIHwgQmluZGluZ0ZsYWdzLkluc3RhbmNlLAorICAgICAgICBudWxsKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIExvYWQgYSBjb2xsZWN0aW9uIGludG8gdGhlIHdvcmtzaGVldCBzdGFydGluZyBmcm9tIHRoZSB0b3AgbGVmdCByb3cgb2YgdGhlIHJhbmdlLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgZGF0YXR5cGUgaW4gdGhlIGNvbGxlY3Rpb248L3R5cGVwYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj5UaGUgY29sbGVjdGlvbiB0byBsb2FkPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwcmludEhlYWRlcnMiPlByaW50IHRoZSBwcm9wZXJ0eSBuYW1lcyBvbiB0aGUgZmlyc3Qgcm93LiBBbnkgdW5kZXJzY29yZSBpbiB0aGUgcHJvcGVydHkgbmFtZSB3aWxsIGJlIGNvbnZlcnRlZCB0byBhIHNwYWNlLiBJZiB0aGUgcHJvcGVydHkgaXMgZGVjb3JhdGVkIHdpdGggYSA8c2VlIGNyZWY9IkRpc3BsYXlOYW1lQXR0cmlidXRlIi8+IG9yIGEgPHNlZSBjcmVmPSJEZXNjcmlwdGlvbkF0dHJpYnV0ZSIvPiB0aGF0IGF0dHJpYnV0ZSB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgcmVmbGVjdGVkIG1lbWJlciBuYW1lLjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idGFibGVTdHlsZSI+V2lsbCBjcmVhdGUgYSB0YWJsZSB3aXRoIHRoaXMgc3R5bGUuIElmIHNldCB0byBUYWJsZVN0eWxlcy5Ob25lIG5vIHRhYmxlIHdpbGwgYmUgY3JlYXRlZDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibWVtYmVyRmxhZ3MiPlByb3BlcnR5IGZsYWdzIHRvIHVzZTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibWVtYmVycyI+VGhlIHByb3BlcnRpZXMgdG8gb3V0cHV0LiBNdXN0IGJlIG9mIHR5cGUgVDwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UaGUgZmlsbGVkIHJhbmdlPC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21Db2xsZWN0aW9uPFQ+KAorICAgICAgSUVudW1lcmFibGU8VD4gY29sbGVjdGlvbiwKKyAgICAgIGJvb2wgcHJpbnRIZWFkZXJzLAorICAgICAgVGFibGVTdHlsZXMgdGFibGVTdHlsZSwKKyAgICAgIEJpbmRpbmdGbGFncyBtZW1iZXJGbGFncywKKyAgICAgIE1lbWJlckluZm9bXSBtZW1iZXJzKSB7CisgICAgdmFyIHR5cGUgPSB0eXBlb2YoVCk7CisgICAgaWYgKG1lbWJlcnMgPT0gbnVsbCkgeworICAgICAgbWVtYmVycyA9IHR5cGUuR2V0UHJvcGVydGllcyhtZW1iZXJGbGFncyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvcmVhY2ggKHZhciB0IGluIG1lbWJlcnMpIHsKKyAgICAgICAgaWYgKHQuRGVjbGFyaW5nVHlwZSAhPSBudWxsCisgICAgICAgICAgICAmJiB0LkRlY2xhcmluZ1R5cGUgIT0gdHlwZQorICAgICAgICAgICAgJiYgIXQuRGVjbGFyaW5nVHlwZS5Jc1N1YmNsYXNzT2YodHlwZSkpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENhc3RFeGNlcHRpb24oCisgICAgICAgICAgICAgICJTdXBwbGllZCBwcm9wZXJ0aWVzIGluIHBhcmFtZXRlciBQcm9wZXJ0aWVzIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcyBUIChvciBhbiBhc3NpZ25hYmxlIHR5cGUgZnJvbSBUIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgY29sID0gX2Zyb21Db2wsCisgICAgICAgIHJvdyA9IF9mcm9tUm93OworICAgIGlmIChtZW1iZXJzLkxlbmd0aCA+IDAgJiYgcHJpbnRIZWFkZXJzKSB7CisgICAgICBmb3JlYWNoICh2YXIgdCBpbiBtZW1iZXJzKSB7CisgICAgICAgIHZhciBkZXNjcmlwdGlvbkF0dHJpYnV0ZSA9CisgICAgICAgICAgICB0LkdldEN1c3RvbUF0dHJpYnV0ZXModHlwZW9mKERlc2NyaXB0aW9uQXR0cmlidXRlKSwgZmFsc2UpLkZpcnN0T3JEZWZhdWx0KCkKKyAgICAgICAgICAgICAgICBhcyBEZXNjcmlwdGlvbkF0dHJpYnV0ZTsKKyAgICAgICAgdmFyIGhlYWRlciA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgaWYgKGRlc2NyaXB0aW9uQXR0cmlidXRlICE9IG51bGwpIHsKKyAgICAgICAgICBoZWFkZXIgPSBkZXNjcmlwdGlvbkF0dHJpYnV0ZS5EZXNjcmlwdGlvbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgZGlzcGxheU5hbWVBdHRyaWJ1dGUgPQorICAgICAgICAgICAgICB0LkdldEN1c3RvbUF0dHJpYnV0ZXModHlwZW9mKERpc3BsYXlOYW1lQXR0cmlidXRlKSwgZmFsc2UpLkZpcnN0T3JEZWZhdWx0KCkKKyAgICAgICAgICAgICAgICAgIGFzIERpc3BsYXlOYW1lQXR0cmlidXRlOworICAgICAgICAgIGlmIChkaXNwbGF5TmFtZUF0dHJpYnV0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBoZWFkZXIgPSBkaXNwbGF5TmFtZUF0dHJpYnV0ZS5EaXNwbGF5TmFtZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGVhZGVyID0gdC5OYW1lLlJlcGxhY2UoJ18nLCAnICcpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wrKywgaGVhZGVyKTsKKyAgICAgIH0KKyAgICAgIHJvdysrOworICAgIH0KKworICAgIGlmICghY29sbGVjdGlvbi5BbnkoKSAmJiAobWVtYmVycy5MZW5ndGggPT0gMCB8fCBwcmludEhlYWRlcnMgPT0gZmFsc2UpKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBpZiAobWVtYmVycy5MZW5ndGggPT0gMCkgeworICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gY29sbGVjdGlvbikgeworICAgICAgICBfd29ya3NoZWV0LkNlbGxzW3JvdysrLCBjb2xdLlZhbHVlID0gaXRlbTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gY29sbGVjdGlvbikgeworICAgICAgICBjb2wgPSBfZnJvbUNvbDsKKyAgICAgICAgaWYgKGl0ZW0gaXMgc3RyaW5nIHx8IGl0ZW0gaXMgZGVjaW1hbCB8fCBpdGVtIGlzIERhdGVUaW1lIHx8IGl0ZW0uR2V0VHlwZSgpLklzUHJpbWl0aXZlKSB7CisgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1tyb3csIGNvbCsrXS5WYWx1ZSA9IGl0ZW07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yZWFjaCAodmFyIHQgaW4gbWVtYmVycykgeworICAgICAgICAgICAgaWYgKHQgaXMgUHJvcGVydHlJbmZvKSB7CisgICAgICAgICAgICAgIF93b3Jrc2hlZXQuQ2VsbHNbcm93LCBjb2wrK10uVmFsdWUgPSAoKFByb3BlcnR5SW5mbyl0KS5HZXRWYWx1ZShpdGVtLCBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodCBpcyBGaWVsZEluZm8pIHsKKyAgICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1tyb3csIGNvbCsrXS5WYWx1ZSA9ICgoRmllbGRJbmZvKXQpLkdldFZhbHVlKGl0ZW0pOworICAgICAgICAgICAgfSBlbHNlIGlmICh0IGlzIE1ldGhvZEluZm8pIHsKKyAgICAgICAgICAgICAgX3dvcmtzaGVldC5DZWxsc1tyb3csIGNvbCsrXS5WYWx1ZSA9ICgoTWV0aG9kSW5mbyl0KS5JbnZva2UoaXRlbSwgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJvdysrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChfZnJvbVJvdyA9PSByb3cgLSAxICYmIHByaW50SGVhZGVycykgeworICAgICAgcm93Kys7CisgICAgfQorCisgICAgdmFyIHIgPSBfd29ya3NoZWV0LkNlbGxzW19mcm9tUm93LCBfZnJvbUNvbCwgcm93IC0gMSwgbWVtYmVycy5MZW5ndGggPT0gMCA/IGNvbCA6IGNvbCAtIDFdOworCisgICAgaWYgKHRhYmxlU3R5bGUgIT0gVGFibGVTdHlsZXMuTm9uZSkgeworICAgICAgdmFyIHRibCA9IF93b3Jrc2hlZXQuVGFibGVzLkFkZChyLCAiIik7CisgICAgICB0YmwuU2hvd0hlYWRlciA9IHByaW50SGVhZGVyczsKKyAgICAgIHRibC5UYWJsZVN0eWxlID0gdGFibGVTdHlsZTsKKyAgICB9CisgICAgcmV0dXJuIHI7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMb2FkcyBhIENTViB0ZXh0IGludG8gYSByYW5nZSBzdGFydGluZyBmcm9tIHRoZSB0b3AgbGVmdCBjZWxsLgorICAvLy8gRGVmYXVsdCBzZXR0aW5ncyBpcyBDb21tYSBzZXBhcmF0aW9uCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idGV4dCI+VGhlIFRleHQ8L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIHJhbmdlIGNvbnRhaW5pbmcgdGhlIGRhdGE8L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbVRleHQoc3RyaW5nIHRleHQpIHsKKyAgICByZXR1cm4gTG9hZEZyb21UZXh0KHRleHQsIG5ldygpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIExvYWRzIGEgQ1NWIHRleHQgaW50byBhIHJhbmdlIHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBsZWZ0IGNlbGwuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idGV4dCI+VGhlIFRleHQ8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImZvcm1hdCI+SW5mb3JtYXRpb24gaG93IHRvIGxvYWQgdGhlIHRleHQ8L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIHJhbmdlIGNvbnRhaW5pbmcgdGhlIGRhdGE8L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFJhbmdlQmFzZSBMb2FkRnJvbVRleHQoc3RyaW5nIHRleHQsIEV4Y2VsVGV4dEZvcm1hdCBmb3JtYXQpIHsKKyAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkodGV4dCkpIHsKKyAgICAgIHZhciByID0gX3dvcmtzaGVldC5DZWxsc1tfZnJvbVJvdywgX2Zyb21Db2xdOworICAgICAgci5WYWx1ZSA9ICIiOworICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgaWYgKGZvcm1hdCA9PSBudWxsKSB7CisgICAgICBmb3JtYXQgPSBuZXcoKTsKKyAgICB9CisKKyAgICBzdHJpbmcgc3BsaXRSZWdleCA9IFN0cmluZy5Gb3JtYXQoCisgICAgICAgICJ7MH0oPz0oPzpbXnsxfV0qezF9W157MX1dKnsxfSkqW157MX1dKiQpIiwKKyAgICAgICAgZm9ybWF0LkVPTCwKKyAgICAgICAgZm9ybWF0LlRleHRRdWFsaWZpZXIpOworICAgIHN0cmluZ1tdIGxpbmVzID0gUmVnZXguU3BsaXQodGV4dCwgc3BsaXRSZWdleCk7CisgICAgaW50IHJvdyA9IF9mcm9tUm93OworICAgIGludCBjb2wgPSBfZnJvbUNvbDsKKyAgICBpbnQgbWF4Q29sID0gY29sOworICAgIGludCBsaW5lTm8gPSAxOworICAgIGZvcmVhY2ggKHN0cmluZyBsaW5lIGluIGxpbmVzKSB7CisgICAgICBpZiAobGluZU5vID4gZm9ybWF0LlNraXBMaW5lc0JlZ2lubmluZyAmJiBsaW5lTm8gPD0gbGluZXMuTGVuZ3RoIC0gZm9ybWF0LlNraXBMaW5lc0VuZCkgeworICAgICAgICBjb2wgPSBfZnJvbUNvbDsKKyAgICAgICAgc3RyaW5nIHYgPSAiIjsKKyAgICAgICAgYm9vbCBpc1RleHQgPSBmYWxzZSwKKyAgICAgICAgICAgIGlzUXVhbGlmaWVyID0gZmFsc2U7CisgICAgICAgIGludCBxQ291bnQgPSAwOworICAgICAgICBpbnQgbGluZVFDb3VudCA9IDA7CisgICAgICAgIGZvcmVhY2ggKGNoYXIgYyBpbiBsaW5lKSB7CisgICAgICAgICAgaWYgKGZvcm1hdC5UZXh0UXVhbGlmaWVyICE9IDAgJiYgYyA9PSBmb3JtYXQuVGV4dFF1YWxpZmllcikgeworICAgICAgICAgICAgaWYgKCFpc1RleHQgJiYgdiAhPSAiIikgeworICAgICAgICAgICAgICB0aHJvdyAobmV3KHN0cmluZy5Gb3JtYXQoIkludmFsaWQgVGV4dCBRdWFsaWZpZXIgaW4gbGluZSA6IHswfSIsIGxpbmUpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpc1F1YWxpZmllciA9ICFpc1F1YWxpZmllcjsKKyAgICAgICAgICAgIHFDb3VudCArPSAxOworICAgICAgICAgICAgbGluZVFDb3VudCsrOworICAgICAgICAgICAgaXNUZXh0ID0gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHFDb3VudCA+IDEgJiYgIXN0cmluZy5Jc051bGxPckVtcHR5KHYpKSB7CisgICAgICAgICAgICAgIHYgKz0gbmV3IHN0cmluZyhmb3JtYXQuVGV4dFF1YWxpZmllciwgcUNvdW50IC8gMik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHFDb3VudCA+IDIgJiYgc3RyaW5nLklzTnVsbE9yRW1wdHkodikpIHsKKyAgICAgICAgICAgICAgdiArPSBuZXcgc3RyaW5nKGZvcm1hdC5UZXh0UXVhbGlmaWVyLCAocUNvdW50IC0gMSkgLyAyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzUXVhbGlmaWVyKSB7CisgICAgICAgICAgICAgIHYgKz0gYzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmIChjID09IGZvcm1hdC5EZWxpbWl0ZXIpIHsKKyAgICAgICAgICAgICAgICBfd29ya3NoZWV0LlNldFZhbHVlKHJvdywgY29sLCBDb252ZXJ0RGF0YShmb3JtYXQsIHYsIGNvbCAtIF9mcm9tQ29sLCBpc1RleHQpKTsKKyAgICAgICAgICAgICAgICB2ID0gIiI7CisgICAgICAgICAgICAgICAgaXNUZXh0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29sKys7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHFDb3VudCAlIDIgPT0gMSkgeworICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyhzdHJpbmcuRm9ybWF0KCJUZXh0IGRlbGltaXRlciBpcyBub3QgY2xvc2VkIGluIGxpbmUgOiB7MH0iLCBsaW5lKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2ICs9IGM7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHFDb3VudCA9IDA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChxQ291bnQgPiAxKSB7CisgICAgICAgICAgdiArPSBuZXcgc3RyaW5nKGZvcm1hdC5UZXh0UXVhbGlmaWVyLCBxQ291bnQgLyAyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGluZVFDb3VudCAlIDIgPT0gMSkgeworICAgICAgICAgIHRocm93IChuZXcoc3RyaW5nLkZvcm1hdCgiVGV4dCBkZWxpbWl0ZXIgaXMgbm90IGNsb3NlZCBpbiBsaW5lIDogezB9IiwgbGluZSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgQ29udmVydERhdGEoZm9ybWF0LCB2LCBjb2wgLSBfZnJvbUNvbCwgaXNUZXh0KSk7CisgICAgICAgIGlmIChjb2wgPiBtYXhDb2wpIHsKKyAgICAgICAgICBtYXhDb2wgPSBjb2w7CisgICAgICAgIH0KKyAgICAgICAgcm93Kys7CisgICAgICB9CisgICAgICBsaW5lTm8rKzsKKyAgICB9CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ2VsbHNbX2Zyb21Sb3csIF9mcm9tQ29sLCByb3cgLSAxLCBtYXhDb2xdOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTG9hZHMgYSBDU1YgdGV4dCBpbnRvIGEgcmFuZ2Ugc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgY2VsbC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0ZXh0Ij5UaGUgVGV4dDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZm9ybWF0Ij5JbmZvcm1hdGlvbiBob3cgdG8gbG9hZCB0aGUgdGV4dDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idGFibGVTdHlsZSI+Q3JlYXRlIGEgdGFibGUgd2l0aCB0aGlzIHN0eWxlPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmaXJzdFJvd0lzSGVhZGVyIj5Vc2UgdGhlIGZpcnN0IHJvdyBhcyBoZWFkZXI8L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21UZXh0KAorICAgICAgc3RyaW5nIHRleHQsCisgICAgICBFeGNlbFRleHRGb3JtYXQgZm9ybWF0LAorICAgICAgVGFibGVTdHlsZXMgdGFibGVTdHlsZSwKKyAgICAgIGJvb2wgZmlyc3RSb3dJc0hlYWRlcikgeworICAgIHZhciByID0gTG9hZEZyb21UZXh0KHRleHQsIGZvcm1hdCk7CisKKyAgICB2YXIgdGJsID0gX3dvcmtzaGVldC5UYWJsZXMuQWRkKHIsICIiKTsKKyAgICB0YmwuU2hvd0hlYWRlciA9IGZpcnN0Um93SXNIZWFkZXI7CisgICAgdGJsLlRhYmxlU3R5bGUgPSB0YWJsZVN0eWxlOworCisgICAgcmV0dXJuIHI7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMb2FkcyBhIENTViBmaWxlIGludG8gYSByYW5nZSBzdGFydGluZyBmcm9tIHRoZSB0b3AgbGVmdCBjZWxsLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InRleHRGaWxlIj5UaGUgVGV4dGZpbGU8L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21UZXh0KEZpbGVJbmZvIHRleHRGaWxlKSB7CisgICAgcmV0dXJuIExvYWRGcm9tVGV4dChGaWxlLlJlYWRBbGxUZXh0KHRleHRGaWxlLkZ1bGxOYW1lLCBFbmNvZGluZy5BU0NJSSkpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTG9hZHMgYSBDU1YgZmlsZSBpbnRvIGEgcmFuZ2Ugc3RhcnRpbmcgZnJvbSB0aGUgdG9wIGxlZnQgY2VsbC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0ZXh0RmlsZSI+VGhlIFRleHRmaWxlPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmb3JtYXQiPkluZm9ybWF0aW9uIGhvdyB0byBsb2FkIHRoZSB0ZXh0PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIEV4Y2VsUmFuZ2VCYXNlIExvYWRGcm9tVGV4dChGaWxlSW5mbyB0ZXh0RmlsZSwgRXhjZWxUZXh0Rm9ybWF0IGZvcm1hdCkgeworICAgIHJldHVybiBMb2FkRnJvbVRleHQoRmlsZS5SZWFkQWxsVGV4dCh0ZXh0RmlsZS5GdWxsTmFtZSwgZm9ybWF0LkVuY29kaW5nKSwgZm9ybWF0KTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIExvYWRzIGEgQ1NWIGZpbGUgaW50byBhIHJhbmdlIHN0YXJ0aW5nIGZyb20gdGhlIHRvcCBsZWZ0IGNlbGwuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idGV4dEZpbGUiPlRoZSBUZXh0ZmlsZTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZm9ybWF0Ij5JbmZvcm1hdGlvbiBob3cgdG8gbG9hZCB0aGUgdGV4dDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idGFibGVTdHlsZSI+Q3JlYXRlIGEgdGFibGUgd2l0aCB0aGlzIHN0eWxlPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmaXJzdFJvd0lzSGVhZGVyIj5Vc2UgdGhlIGZpcnN0IHJvdyBhcyBoZWFkZXI8L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxSYW5nZUJhc2UgTG9hZEZyb21UZXh0KAorICAgICAgRmlsZUluZm8gdGV4dEZpbGUsCisgICAgICBFeGNlbFRleHRGb3JtYXQgZm9ybWF0LAorICAgICAgVGFibGVTdHlsZXMgdGFibGVTdHlsZSwKKyAgICAgIGJvb2wgZmlyc3RSb3dJc0hlYWRlcikgeworICAgIHJldHVybiBMb2FkRnJvbVRleHQoCisgICAgICAgIEZpbGUuUmVhZEFsbFRleHQodGV4dEZpbGUuRnVsbE5hbWUsIGZvcm1hdC5FbmNvZGluZyksCisgICAgICAgIGZvcm1hdCwKKyAgICAgICAgdGFibGVTdHlsZSwKKyAgICAgICAgZmlyc3RSb3dJc0hlYWRlcik7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXQgdGhlIHN0cm9uZ2x5IHR5cGVkIHZhbHVlIG9mIHRoZSBjZWxsLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgdHlwZTwvdHlwZXBhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIHZhbHVlLiBJZiB0aGUgdmFsdWUgY2FuJ3QgYmUgY29udmVydGVkIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSByZXR1cm5lZDwvcmV0dXJucz4KKyAgcHVibGljIFQgR2V0VmFsdWU8VD4oKSB7CisgICAgcmV0dXJuIF93b3Jrc2hlZXQuR2V0VHlwZWRWYWx1ZTxUPihWYWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXQgYSByYW5nZSB3aXRoIGFuIG9mZnNldCBmcm9tIHRoZSB0b3AgbGVmdCBjZWxsLgorICAvLy8gVGhlIG5ldyByYW5nZSBoYXMgdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGUgY3VycmVudCByYW5nZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InJvd09mZnNldCI+Um93IE9mZnNldDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1uT2Zmc2V0Ij5Db2x1bW4gT2Zmc2V0PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIEV4Y2VsUmFuZ2VCYXNlIE9mZnNldChpbnQgcm93T2Zmc2V0LCBpbnQgY29sdW1uT2Zmc2V0KSB7CisgICAgaWYgKF9mcm9tUm93ICsgcm93T2Zmc2V0IDwgMQorICAgICAgICB8fCBfZnJvbUNvbCArIGNvbHVtbk9mZnNldCA8IDEKKyAgICAgICAgfHwgX2Zyb21Sb3cgKyByb3dPZmZzZXQgPiBFeGNlbFBhY2thZ2UuTWF4Um93cworICAgICAgICB8fCBfZnJvbUNvbCArIGNvbHVtbk9mZnNldCA+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSB7CisgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiT2Zmc2V0IHZhbHVlIG91dCBvZiByYW5nZSIpKTsKKyAgICB9CisgICAgc3RyaW5nIGFkZHJlc3MgPSBHZXRBZGRyZXNzKAorICAgICAgICBfZnJvbVJvdyArIHJvd09mZnNldCwKKyAgICAgICAgX2Zyb21Db2wgKyBjb2x1bW5PZmZzZXQsCisgICAgICAgIF90b1JvdyArIHJvd09mZnNldCwKKyAgICAgICAgX3RvQ29sICsgY29sdW1uT2Zmc2V0KTsKKyAgICByZXR1cm4gbmV3KF93b3Jrc2hlZXQsIGFkZHJlc3MpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0IGEgcmFuZ2Ugd2l0aCBhbiBvZmZzZXQgZnJvbSB0aGUgdG9wIGxlZnQgY2VsbC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3dPZmZzZXQiPlJvdyBPZmZzZXQ8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbk9mZnNldCI+Q29sdW1uIE9mZnNldDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibnVtYmVyT2ZSb3dzIj5OdW1iZXIgb2Ygcm93cy4gTWluaW11bSAxPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJudW1iZXJPZkNvbHVtbnMiPk51bWJlciBvZiBjb2x1bXMuIE1pbmltdW0gMTwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFJhbmdlQmFzZSBPZmZzZXQoCisgICAgICBpbnQgcm93T2Zmc2V0LAorICAgICAgaW50IGNvbHVtbk9mZnNldCwKKyAgICAgIGludCBudW1iZXJPZlJvd3MsCisgICAgICBpbnQgbnVtYmVyT2ZDb2x1bW5zKSB7CisgICAgaWYgKG51bWJlck9mUm93cyA8IDEgfHwgbnVtYmVyT2ZDb2x1bW5zIDwgMSkgeworICAgICAgdGhyb3cgKG5ldygiTnVtYmVyIG9mIHJvd3MvY29sdW1ucyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIikpOworICAgIH0KKyAgICBudW1iZXJPZlJvd3MtLTsKKyAgICBudW1iZXJPZkNvbHVtbnMtLTsKKyAgICBpZiAoX2Zyb21Sb3cgKyByb3dPZmZzZXQgPCAxCisgICAgICAgIHx8IF9mcm9tQ29sICsgY29sdW1uT2Zmc2V0IDwgMQorICAgICAgICB8fCBfZnJvbVJvdyArIHJvd09mZnNldCA+IEV4Y2VsUGFja2FnZS5NYXhSb3dzCisgICAgICAgIHx8IF9mcm9tQ29sICsgY29sdW1uT2Zmc2V0ID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMKKyAgICAgICAgfHwgX2Zyb21Sb3cgKyByb3dPZmZzZXQgKyBudW1iZXJPZlJvd3MgPCAxCisgICAgICAgIHx8IF9mcm9tQ29sICsgY29sdW1uT2Zmc2V0ICsgbnVtYmVyT2ZDb2x1bW5zIDwgMQorICAgICAgICB8fCBfZnJvbVJvdyArIHJvd09mZnNldCArIG51bWJlck9mUm93cyA+IEV4Y2VsUGFja2FnZS5NYXhSb3dzCisgICAgICAgIHx8IF9mcm9tQ29sICsgY29sdW1uT2Zmc2V0ICsgbnVtYmVyT2ZDb2x1bW5zID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpIHsKKyAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJPZmZzZXQgdmFsdWUgb3V0IG9mIHJhbmdlIikpOworICAgIH0KKyAgICBzdHJpbmcgYWRkcmVzcyA9IEdldEFkZHJlc3MoCisgICAgICAgIF9mcm9tUm93ICsgcm93T2Zmc2V0LAorICAgICAgICBfZnJvbUNvbCArIGNvbHVtbk9mZnNldCwKKyAgICAgICAgX2Zyb21Sb3cgKyByb3dPZmZzZXQgKyBudW1iZXJPZlJvd3MsCisgICAgICAgIF9mcm9tQ29sICsgY29sdW1uT2Zmc2V0ICsgbnVtYmVyT2ZDb2x1bW5zKTsKKyAgICByZXR1cm4gbmV3KF93b3Jrc2hlZXQsIGFkZHJlc3MpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIG5ldyBjb21tZW50IGZvciB0aGUgcmFuZ2UuCisgIC8vLyBJZiB0aGlzIHJhbmdlIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgY2VsbCwgdGhlIHRvcCBsZWZ0IGNvbW1lbnQgaXMgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0ZXh0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImF1dGhvciI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPkEgcmVmZXJlbmNlIGNvbW1lbnQgb2YgdGhlIHRvcCBsZWZ0IGNlbGw8L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbENvbW1lbnQgQWRkQ29tbWVudChzdHJpbmcgdGV4dCwgc3RyaW5nIGF1dGhvcikgeworICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShhdXRob3IpKSB7CisgICAgICBhdXRob3IgPSBUaHJlYWQuQ3VycmVudFByaW5jaXBhbC5JZGVudGl0eS5OYW1lOworICAgIH0KKyAgICAvL0NoZWNrIGlmIGFueSBjb21tZW50cyBleGlzdHMgaW4gdGhlIHJhbmdlIGFuZCB0aHJvdyBhbiBleGNlcHRpb24KKyAgICBfY2hhbmdlUHJvcE1ldGhvZChFeGlzdHNfQ29tbWVudCwgbnVsbCk7CisgICAgLy9DcmVhdGUgdGhlIGNvbW1lbnRzCisgICAgX2NoYW5nZVByb3BNZXRob2QoU2V0X0NvbW1lbnQsIG5ld1tdIHsgdGV4dCwgYXV0aG9yIH0pOworCisgICAgcmV0dXJuIF93b3Jrc2hlZXQuQ29tbWVudHNbbmV3IEV4Y2VsQ2VsbEFkZHJlc3MoX2Zyb21Sb3csIF9mcm9tQ29sKV07CisgIH0KKworICAvLy8vLyA8c3VtbWFyeT4KKyAgLy8vLy8gQ29waWVzIHRoZSByYW5nZSBvZiBjZWxscyB0byBhbiBvdGhlciByYW5nZQorICAvLy8vLyA8L3N1bW1hcnk+CisgIC8vLy8vIDxwYXJhbSBuYW1lPSJEZXN0aW5hdGlvbiI+VGhlIHN0YXJ0IGNlbGwgd2hlcmUgdGhlIHJhbmdlIHdpbGwgYmUgY29waWVkLjwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIENvcHkoRXhjZWxSYW5nZUJhc2UgZGVzdGluYXRpb24pIHsKKyAgICBib29sIHNhbWVXb3JrYm9vayA9IGRlc3RpbmF0aW9uLl93b3Jrc2hlZXQuV29ya2Jvb2sgPT0gX3dvcmtzaGVldC5Xb3JrYm9vazsKKyAgICBFeGNlbFN0eWxlcyBzb3VyY2VTdHlsZXMgPSBfd29ya3NoZWV0Lldvcmtib29rLlN0eWxlcywKKyAgICAgICAgc3R5bGVzID0gZGVzdGluYXRpb24uX3dvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXM7CisgICAgRGljdGlvbmFyeTxpbnQsIGludD4gc3R5bGVDYXNoZSA9IG5ldyBEaWN0aW9uYXJ5PGludCwgaW50PigpOworCisgICAgLy9DbGVhciBhbGwgZXhpc3RpbmcgY2VsbHM7CisgICAgaW50IHRvUm93ID0gX3RvUm93IC0gX2Zyb21Sb3cgKyAxLAorICAgICAgICB0b0NvbCA9IF90b0NvbCAtIF9mcm9tQ29sICsgMTsKKworICAgIHN0cmluZyBzID0gIiI7CisgICAgaW50IGkgPSAwOworICAgIG9iamVjdCBvID0gbnVsbDsKKyAgICBieXRlIGZsYWcgPSAwOworICAgIFVyaSBobCA9IG51bGw7CisgICAgRXhjZWxDb21tZW50IGNvbW1lbnQgPSBudWxsOworCisgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KAorICAgICAgICBfd29ya3NoZWV0Ll92YWx1ZXMsCisgICAgICAgIF9mcm9tUm93LAorICAgICAgICBfZnJvbUNvbCwKKyAgICAgICAgX3RvUm93LAorICAgICAgICBfdG9Db2wpOworICAgIHZhciBjb3BpZWRWYWx1ZSA9IG5ldyBMaXN0PENvcGllZENlbGw+KCk7CisgICAgd2hpbGUgKGNzZS5OZXh0KCkpIHsKKyAgICAgIHZhciByb3cgPSBjc2UuUm93OworICAgICAgdmFyIGNvbCA9IGNzZS5Db2x1bW47IC8vSXNzdWUgMTUwNzAKKyAgICAgIHZhciBjZWxsID0gbmV3IENvcGllZENlbGwgeworICAgICAgICBSb3cgPSBkZXN0aW5hdGlvbi5fZnJvbVJvdyArIChyb3cgLSBfZnJvbVJvdyksCisgICAgICAgIENvbHVtbiA9IGRlc3RpbmF0aW9uLl9mcm9tQ29sICsgKGNvbCAtIF9mcm9tQ29sKSwKKyAgICAgICAgVmFsdWUgPSBjc2UuVmFsdWUsCisgICAgICB9OworCisgICAgICAvL0Rlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgY3NlLlZhbHVlKTsKKworICAgICAgaWYgKF93b3Jrc2hlZXQuX3R5cGVzLkV4aXN0cyhyb3csIGNvbCwgcmVmIHMpKSB7CisgICAgICAgIC8vRGVzdGluYXRpb24uX3dvcmtzaGVldC5fdHlwZXMuU2V0VmFsdWUocm93LCBjb2wscyk7CisgICAgICAgIGNlbGwuVHlwZSA9IHM7CisgICAgICB9CisKKyAgICAgIGlmIChfd29ya3NoZWV0Ll9mb3JtdWxhcy5FeGlzdHMocm93LCBjb2wsIHJlZiBvKSkgeworICAgICAgICBpZiAobyBpcyBpbnQpIHsKKyAgICAgICAgICAvLyBEZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9mb3JtdWxhcy5TZXRWYWx1ZShyb3csIGNvbCwgX3dvcmtzaGVldC5HZXRGb3JtdWxhKGNzZS5Sb3csIGNzZS5Db2x1bW4pKTsgICAgLy9TaGFyZWQgZm9ybXVsYXMsIHNldCB0aGUgZm9ybXVsYSBwZXIgY2VsbCB0byBzaW1wbGlmeQorICAgICAgICAgIGNlbGwuRm9ybXVsYSA9IF93b3Jrc2hlZXQuR2V0Rm9ybXVsYShjc2UuUm93LCBjc2UuQ29sdW1uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvL0Rlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX2Zvcm11bGFzLlNldFZhbHVlKHJvdywgY29sLCBvKTsKKyAgICAgICAgICBjZWxsLkZvcm11bGEgPSBvOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoX3dvcmtzaGVldC5fc3R5bGVzLkV4aXN0cyhyb3csIGNvbCwgcmVmIGkpKSB7CisgICAgICAgIGlmIChzYW1lV29ya2Jvb2spIHsKKyAgICAgICAgICAvL0Rlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX3N0eWxlcy5TZXRWYWx1ZShyb3csIGNvbCwgaSk7CisgICAgICAgICAgY2VsbC5TdHlsZUlEID0gaTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoc3R5bGVDYXNoZS5Db250YWluc0tleShpKSkgeworICAgICAgICAgICAgaSA9IHN0eWxlQ2FzaGVbaV07CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciBvbGRTdHlsZUlkID0gaTsKKyAgICAgICAgICAgIGkgPSBzdHlsZXMuQ2xvbmVTdHlsZShzb3VyY2VTdHlsZXMsIGkpOworICAgICAgICAgICAgc3R5bGVDYXNoZS5BZGQob2xkU3R5bGVJZCwgaSk7CisgICAgICAgICAgfQorICAgICAgICAgIC8vRGVzdGluYXRpb24uX3dvcmtzaGVldC5fc3R5bGVzLlNldFZhbHVlKHJvdywgY29sLCBpKTsKKyAgICAgICAgICBjZWxsLlN0eWxlSUQgPSBpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChfd29ya3NoZWV0Ll9oeXBlckxpbmtzLkV4aXN0cyhyb3csIGNvbCwgcmVmIGhsKSkgeworICAgICAgICAvL0Rlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX2h5cGVyTGlua3MuU2V0VmFsdWUocm93LCBjb2wsIGhsKTsKKyAgICAgICAgY2VsbC5IeXBlckxpbmsgPSBobDsKKyAgICAgIH0KKworICAgICAgaWYgKF93b3Jrc2hlZXQuX2NvbW1lbnRzU3RvcmUuRXhpc3RzKHJvdywgY29sLCByZWYgY29tbWVudCkpIHsKKyAgICAgICAgY2VsbC5Db21tZW50ID0gY29tbWVudDsKKyAgICAgIH0KKworICAgICAgaWYgKF93b3Jrc2hlZXQuX2ZsYWdzLkV4aXN0cyhyb3csIGNvbCwgcmVmIGZsYWcpKSB7CisgICAgICAgIGNlbGwuRmxhZyA9IGZsYWc7CisgICAgICB9CisgICAgICBjb3BpZWRWYWx1ZS5BZGQoY2VsbCk7CisgICAgfQorCisgICAgLy9Db3B5IHN0eWxlcyB3aXRoIG5vIGNlbGwgdmFsdWUKKyAgICB2YXIgY3NlcyA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxpbnQ+KAorICAgICAgICBfd29ya3NoZWV0Ll9zdHlsZXMsCisgICAgICAgIF9mcm9tUm93LAorICAgICAgICBfZnJvbUNvbCwKKyAgICAgICAgX3RvUm93LAorICAgICAgICBfdG9Db2wpOworICAgIHdoaWxlIChjc2VzLk5leHQoKSkgeworICAgICAgaWYgKCFfd29ya3NoZWV0Ll92YWx1ZXMuRXhpc3RzKGNzZXMuUm93LCBjc2VzLkNvbHVtbikpIHsKKyAgICAgICAgdmFyIHJvdyA9IGRlc3RpbmF0aW9uLl9mcm9tUm93ICsgKGNzZXMuUm93IC0gX2Zyb21Sb3cpOworICAgICAgICB2YXIgY29sID0gZGVzdGluYXRpb24uX2Zyb21Db2wgKyAoY3Nlcy5Db2x1bW4gLSBfZnJvbUNvbCk7CisgICAgICAgIHZhciBjZWxsID0gbmV3IENvcGllZENlbGwgeworICAgICAgICAgIFJvdyA9IHJvdywKKyAgICAgICAgICBDb2x1bW4gPSBjb2wsCisgICAgICAgICAgVmFsdWUgPSBudWxsLAorICAgICAgICB9OworCisgICAgICAgIGkgPSBjc2VzLlZhbHVlOworICAgICAgICBpZiAoc2FtZVdvcmtib29rKSB7CisgICAgICAgICAgY2VsbC5TdHlsZUlEID0gaTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoc3R5bGVDYXNoZS5Db250YWluc0tleShpKSkgeworICAgICAgICAgICAgaSA9IHN0eWxlQ2FzaGVbaV07CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciBvbGRTdHlsZUlkID0gaTsKKyAgICAgICAgICAgIGkgPSBzdHlsZXMuQ2xvbmVTdHlsZShzb3VyY2VTdHlsZXMsIGkpOworICAgICAgICAgICAgc3R5bGVDYXNoZS5BZGQob2xkU3R5bGVJZCwgaSk7CisgICAgICAgICAgfQorICAgICAgICAgIC8vRGVzdGluYXRpb24uX3dvcmtzaGVldC5fc3R5bGVzLlNldFZhbHVlKHJvdywgY29sLCBpKTsKKyAgICAgICAgICBjZWxsLlN0eWxlSUQgPSBpOworICAgICAgICB9CisgICAgICAgIGNvcGllZFZhbHVlLkFkZChjZWxsKTsKKyAgICAgIH0KKyAgICB9CisgICAgdmFyIGNvcGllZE1lcmdlZENlbGxzID0gbmV3IERpY3Rpb25hcnk8aW50LCBFeGNlbEFkZHJlc3M+KCk7CisgICAgLy9NZXJnZWQgY2VsbHMKKyAgICB2YXIgY3NlbSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxpbnQ+KAorICAgICAgICBfd29ya3NoZWV0Lk1lcmdlZENlbGxzLl9jZWxscywKKyAgICAgICAgX2Zyb21Sb3csCisgICAgICAgIF9mcm9tQ29sLAorICAgICAgICBfdG9Sb3csCisgICAgICAgIF90b0NvbCk7CisgICAgd2hpbGUgKGNzZW0uTmV4dCgpKSB7CisgICAgICBpZiAoIWNvcGllZE1lcmdlZENlbGxzLkNvbnRhaW5zS2V5KGNzZW0uVmFsdWUpKSB7CisgICAgICAgIHZhciBhZHIgPSBuZXcgRXhjZWxBZGRyZXNzKF93b3Jrc2hlZXQuTmFtZSwgX3dvcmtzaGVldC5NZXJnZWRDZWxscy5MaXN0W2NzZW0uVmFsdWVdKTsKKyAgICAgICAgaWYgKENvbGxpZGUoYWRyKSA9PSBlQWRkcmVzc0NvbGxpdGlvbi5JbnNpZGUpIHsKKyAgICAgICAgICBjb3BpZWRNZXJnZWRDZWxscy5BZGQoCisgICAgICAgICAgICAgIGNzZW0uVmFsdWUsCisgICAgICAgICAgICAgIG5ldygKKyAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLl9mcm9tUm93ICsgKGFkci5TdGFydC5Sb3cgLSBfZnJvbVJvdyksCisgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5fZnJvbUNvbCArIChhZHIuU3RhcnQuQ29sdW1uIC0gX2Zyb21Db2wpLAorICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24uX2Zyb21Sb3cgKyAoYWRyLkVuZC5Sb3cgLSBfZnJvbVJvdyksCisgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5fZnJvbUNvbCArIChhZHIuRW5kLkNvbHVtbiAtIF9mcm9tQ29sKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vUGFydGlhbCBtZXJnZSBvZiB0aGUgYWRkcmVzcyBpZ25vcmUuCisgICAgICAgICAgY29waWVkTWVyZ2VkQ2VsbHMuQWRkKGNzZW0uVmFsdWUsIG51bGwpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgZGVzdGluYXRpb24uX3dvcmtzaGVldC5NZXJnZWRDZWxscy5DbGVhcigKKyAgICAgICAgbmV3KAorICAgICAgICAgICAgZGVzdGluYXRpb24uX2Zyb21Sb3csCisgICAgICAgICAgICBkZXN0aW5hdGlvbi5fZnJvbUNvbCwKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLl9mcm9tUm93ICsgdG9Sb3cgLSAxLAorICAgICAgICAgICAgZGVzdGluYXRpb24uX2Zyb21Db2wgKyB0b0NvbCAtIDEpKTsKKworICAgIGRlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX3ZhbHVlcy5DbGVhcihkZXN0aW5hdGlvbi5fZnJvbVJvdywgZGVzdGluYXRpb24uX2Zyb21Db2wsIHRvUm93LCB0b0NvbCk7CisgICAgZGVzdGluYXRpb24uX3dvcmtzaGVldC5fZm9ybXVsYXMuQ2xlYXIoCisgICAgICAgIGRlc3RpbmF0aW9uLl9mcm9tUm93LAorICAgICAgICBkZXN0aW5hdGlvbi5fZnJvbUNvbCwKKyAgICAgICAgdG9Sb3csCisgICAgICAgIHRvQ29sKTsKKyAgICBkZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9zdHlsZXMuQ2xlYXIoZGVzdGluYXRpb24uX2Zyb21Sb3csIGRlc3RpbmF0aW9uLl9mcm9tQ29sLCB0b1JvdywgdG9Db2wpOworICAgIGRlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX3R5cGVzLkNsZWFyKGRlc3RpbmF0aW9uLl9mcm9tUm93LCBkZXN0aW5hdGlvbi5fZnJvbUNvbCwgdG9Sb3csIHRvQ29sKTsKKyAgICBkZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9oeXBlckxpbmtzLkNsZWFyKAorICAgICAgICBkZXN0aW5hdGlvbi5fZnJvbVJvdywKKyAgICAgICAgZGVzdGluYXRpb24uX2Zyb21Db2wsCisgICAgICAgIHRvUm93LAorICAgICAgICB0b0NvbCk7CisgICAgZGVzdGluYXRpb24uX3dvcmtzaGVldC5fZmxhZ3MuQ2xlYXIoZGVzdGluYXRpb24uX2Zyb21Sb3csIGRlc3RpbmF0aW9uLl9mcm9tQ29sLCB0b1JvdywgdG9Db2wpOworICAgIGRlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX2NvbW1lbnRzU3RvcmUuQ2xlYXIoCisgICAgICAgIGRlc3RpbmF0aW9uLl9mcm9tUm93LAorICAgICAgICBkZXN0aW5hdGlvbi5fZnJvbUNvbCwKKyAgICAgICAgdG9Sb3csCisgICAgICAgIHRvQ29sKTsKKworICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIGNvcGllZFZhbHVlKSB7CisgICAgICBkZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUoY2VsbC5Sb3csIGNlbGwuQ29sdW1uLCBjZWxsLlZhbHVlKTsKKworICAgICAgaWYgKGNlbGwuVHlwZSAhPSBudWxsKSB7CisgICAgICAgIGRlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX3R5cGVzLlNldFZhbHVlKGNlbGwuUm93LCBjZWxsLkNvbHVtbiwgY2VsbC5UeXBlKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNlbGwuU3R5bGVJRCAhPSBudWxsKSB7CisgICAgICAgIGRlc3RpbmF0aW9uLl93b3Jrc2hlZXQuX3N0eWxlcy5TZXRWYWx1ZShjZWxsLlJvdywgY2VsbC5Db2x1bW4sIGNlbGwuU3R5bGVJRC5WYWx1ZSk7CisgICAgICB9CisKKyAgICAgIGlmIChjZWxsLkZvcm11bGEgIT0gbnVsbCkgeworICAgICAgICBjZWxsLkZvcm11bGEgPSBVcGRhdGVGb3JtdWxhUmVmZXJlbmNlcygKKyAgICAgICAgICAgIGNlbGwuRm9ybXVsYS5Ub1N0cmluZygpLAorICAgICAgICAgICAgZGVzdGluYXRpb24uX2Zyb21Sb3cgLSBfZnJvbVJvdywKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLl9mcm9tQ29sIC0gX2Zyb21Db2wsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIHRydWUpOworICAgICAgICBkZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9mb3JtdWxhcy5TZXRWYWx1ZShjZWxsLlJvdywgY2VsbC5Db2x1bW4sIGNlbGwuRm9ybXVsYSk7CisgICAgICB9CisgICAgICBpZiAoY2VsbC5IeXBlckxpbmsgIT0gbnVsbCkgeworICAgICAgICBkZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9oeXBlckxpbmtzLlNldFZhbHVlKGNlbGwuUm93LCBjZWxsLkNvbHVtbiwgY2VsbC5IeXBlckxpbmspOworICAgICAgfQorCisgICAgICBpZiAoY2VsbC5Db21tZW50ICE9IG51bGwpIHsKKyAgICAgICAgLy9EZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9jb21tZW50c1N0b3JlLlNldFZhbHVlKGNlbGwuUm93LCBjZWxsLkNvbHVtbiwgY2VsbC5Db21tZW50KTsKKyAgICAgIH0KKyAgICAgIGlmIChjZWxsLkZsYWcgIT0gMCkgeworICAgICAgICBkZXN0aW5hdGlvbi5fd29ya3NoZWV0Ll9mbGFncy5TZXRWYWx1ZShjZWxsLlJvdywgY2VsbC5Db2x1bW4sIGNlbGwuRmxhZyk7CisgICAgICB9CisgICAgfQorCisgICAgLy9BZGQgbWVyZ2VkIGNlbGxzCisgICAgZm9yZWFjaCAodmFyIG0gaW4gY29waWVkTWVyZ2VkQ2VsbHMuVmFsdWVzKSB7CisgICAgICBpZiAobSAhPSBudWxsKSB7CisgICAgICAgIGRlc3RpbmF0aW9uLl93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuQWRkKG0sIHRydWUpOworICAgICAgfQorICAgIH0KKworICAgIC8vQ2xvbmUgdGhlIGNlbGwKKyAgICAvL3ZhciBjb3BpZWRDZWxsID0gKF93b3Jrc2hlZXQuX2NlbGxzW0dldENlbGxJRChfd29ya3NoZWV0LlNoZWV0SUQsIGNlbGwuX2Zyb21Sb3csIGNlbGwuY29sdW1uKV0gYXMgRXhjZWxDZWxsKTsKKworICAgIC8vdmFyIG5ld0NlbGwgPSBjb3BpZWRDZWxsLkNsb25lKERlc3RpbmF0aW9uLl93b3Jrc2hlZXQsCisgICAgLy8gICAgICAgIERlc3RpbmF0aW9uLl9mcm9tUm93ICsgKGNvcGllZENlbGwuUm93IC0gX2Zyb21Sb3cpLAorICAgIC8vICAgICAgICBEZXN0aW5hdGlvbi5jb2x1bW4gKyAoY29waWVkQ2VsbC5Db2x1bW4gLSBjb2x1bW4pKTsKKworICAgIC8vICAgICAgICBuZXdDZWxsLk1lcmdlSWQgPSBfd29ya3NoZWV0LkdldE1lcmdlQ2VsbElkKGNvcGllZENlbGwuUm93LCBjb3BpZWRDZWxsLkNvbHVtbik7CisKKyAgICAvLyAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShuZXdDZWxsLkZvcm11bGEpKQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICBuZXdDZWxsLkZvcm11bGEgPSBFeGNlbENlbGwuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMobmV3Q2VsbC5Gb3JtdWxhLCBuZXdDZWxsLlJvdyAtIGNvcGllZENlbGwuUm93LCAobmV3Q2VsbC5Db2x1bW4gLSBjb3BpZWRDZWxsLkNvbHVtbiksIDEsIDEpOworICAgIC8vICAgICAgICB9CisKKyAgICAvLyAgICAgICAgLy9JZiBpdHMgbm90IHRoZSBzYW1lIHdvcmtib29rIHdlIG11c3QgY29weSB0aGUgc3R5bGVzIHRvIHRoZSBuZXcgd29ya2Jvb2suCisgICAgLy8gICAgICAgIGlmICghc2FtZVdvcmtib29rKQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICBpZiAoc3R5bGVDYXNoZS5Db250YWluc0tleShjZWxsLlN0eWxlSUQpKQorICAgIC8vICAgICAgICAgICAgeworICAgIC8vICAgICAgICAgICAgICAgIG5ld0NlbGwuU3R5bGVJRCA9IHN0eWxlQ2FzaGVbY2VsbC5TdHlsZUlEXTsKKyAgICAvLyAgICAgICAgICAgIH0KKyAgICAvLyAgICAgICAgICAgIGVsc2UKKyAgICAvLyAgICAgICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgICAgICBuZXdDZWxsLlN0eWxlSUQgPSBzdHlsZXMuQ2xvbmVTdHlsZShzb3VyY2VTdHlsZXMsIGNlbGwuU3R5bGVJRCk7CisgICAgLy8gICAgICAgICAgICAgICAgc3R5bGVDYXNoZS5BZGQoY2VsbC5TdHlsZUlELCBuZXdDZWxsLlN0eWxlSUQpOworICAgIC8vICAgICAgICAgICAgfQorICAgIC8vICAgICAgICB9CisgICAgLy8gICAgICAgIG5ld0NlbGxzLkFkZChuZXdDZWxsKTsKKyAgICAvLyAgICAgICAgaWYgKG5ld0NlbGwuTWVyZ2UpIG1lcmdlZENlbGxzLkFkZChuZXdDZWxsLkNlbGxJRCwgbmV3Q2VsbCk7CisgICAgLy8gICAgfQorCisgICAgLy8gICAgLy9Ob3cgY2xlYXIgdGhlIGRlc3RpbmF0aW9uLgorICAgIC8vICAgIERlc3RpbmF0aW9uLk9mZnNldCgwLCAwLCAoX3RvUm93IC0gX2Zyb21Sb3cpICsgMSwgKF90b0NvbCAtIGNvbHVtbikgKyAxKS5DbGVhcigpOworCisgICAgLy8gICAgLy9BbmQgbGFzdCBhZGQgdGhlIG5ldyBjZWxscyB0byB0aGUgd29ya3NoZWV0CisgICAgLy8gICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gbmV3Q2VsbHMpCisgICAgLy8gICAgeworICAgIC8vICAgICAgICBEZXN0aW5hdGlvbi5Xb3Jrc2hlZXQuX2NlbGxzLkFkZChjZWxsKTsKKyAgICAvLyAgICB9CisgICAgLy8gICAgLy9BZGQgbWVyZ2VkIGNlbGxzCisgICAgLy8gICAgaWYgKG1lcmdlZENlbGxzLkNvdW50ID4gMCkKKyAgICAvLyAgICB7CisgICAgLy8gICAgICAgIExpc3Q8RXhjZWxBZGRyZXNzQmFzZT4gbWVyZ2VkQWRkcmVzc2VzID0gbmV3IExpc3Q8RXhjZWxBZGRyZXNzQmFzZT4oKTsKKyAgICAvLyAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gbWVyZ2VkQ2VsbHMuVmFsdWVzKQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICBpZiAoIUlzQWRkZWQoY2VsbCwgbWVyZ2VkQWRkcmVzc2VzKSkKKyAgICAvLyAgICAgICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgICAgICBpbnQgc3RhcnRSb3cgPSBjZWxsLlJvdywgc3RhcnRDb2wgPSBjZWxsLkNvbHVtbiwgZW5kUm93ID0gY2VsbC5Sb3csIGVuZENvbCA9IGNlbGwuQ29sdW1uICsgMTsKKyAgICAvLyAgICAgICAgICAgICAgICB3aGlsZSAobWVyZ2VkQ2VsbHMuQ29udGFpbnNLZXkoRXhjZWxDZWxsLkdldENlbGxJRChEZXN0aW5hdGlvbi5Xb3Jrc2hlZXQuU2hlZXRJRCwgZW5kUm93LCBlbmRDb2wpKSkKKyAgICAvLyAgICAgICAgICAgICAgICB7CisgICAgLy8gICAgICAgICAgICAgICAgICAgIEV4Y2VsQ2VsbCBuZXh0ID0gbWVyZ2VkQ2VsbHNbRXhjZWxDZWxsLkdldENlbGxJRChEZXN0aW5hdGlvbi5Xb3Jrc2hlZXQuU2hlZXRJRCwgZW5kUm93LCBlbmRDb2wpXTsKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGwuTWVyZ2VJZCAhPSBuZXh0Lk1lcmdlSWQpCisgICAgLy8gICAgICAgICAgICAgICAgICAgIHsKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIC8vICAgICAgICAgICAgICAgICAgICB9CisgICAgLy8gICAgICAgICAgICAgICAgICAgIGVuZENvbCsrOworICAgIC8vICAgICAgICAgICAgICAgIH0KKworICAgIC8vICAgICAgICAgICAgICAgIHdoaWxlIChJc01lcmdlZChtZXJnZWRDZWxscywgRGVzdGluYXRpb24uV29ya3NoZWV0LCBlbmRSb3csIHN0YXJ0Q29sLCBlbmRDb2wgLSAxLCBjZWxsKSkKKyAgICAvLyAgICAgICAgICAgICAgICB7CisgICAgLy8gICAgICAgICAgICAgICAgICAgIGVuZFJvdysrOworICAgIC8vICAgICAgICAgICAgICAgIH0KKworICAgIC8vICAgICAgICAgICAgICAgIG1lcmdlZEFkZHJlc3Nlcy5BZGQobmV3IEV4Y2VsQWRkcmVzc0Jhc2Uoc3RhcnRSb3csIHN0YXJ0Q29sLCBlbmRSb3cgLSAxLCBlbmRDb2wgLSAxKSk7CisgICAgLy8gICAgICAgICAgICB9CisgICAgLy8gICAgICAgIH0KKyAgICAvLyAgICAgICAgRGVzdGluYXRpb24uV29ya3NoZWV0Lk1lcmdlZENlbGxzLkxpc3QuQWRkUmFuZ2UoKGZyb20gciBpbiBtZXJnZWRBZGRyZXNzZXMgc2VsZWN0IHIuQWRkcmVzcykpOworICAgIC8vICAgIH0KKyAgICAvL30KKworICAgIC8vcHJpdmF0ZSBib29sIElzQWRkZWQoRXhjZWxDZWxsIGNlbGwsIExpc3Q8RXhjZWxBZGRyZXNzQmFzZT4gbWVyZ2VkQWRkcmVzc2VzKQorICAgIC8veworICAgIC8vICAgIGZvcmVhY2ggKHZhciBhZGRyZXNzIGluIG1lcmdlZEFkZHJlc3NlcykKKyAgICAvLyAgICB7CisgICAgLy8gICAgICAgIGlmIChhZGRyZXNzLkNvbGxpZGUobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoY2VsbC5DZWxsQWRkcmVzcykpID09IGVBZGRyZXNzQ29sbGl0aW9uLkluc2lkZSkKKyAgICAvLyAgICAgICAgeworICAgIC8vICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gICAgICAgIH0KKyAgICAvLyAgICB9CisgICAgLy8gICAgcmV0dXJuIGZhbHNlOworICAgIC8vfQorCisgICAgLy9wcml2YXRlIGJvb2wgSXNNZXJnZWQoRGljdGlvbmFyeTx1bG9uZywgRXhjZWxDZWxsPiBtZXJnZWRDZWxscywgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBpbnQgcm93LCBpbnQgc3RhcnRDb2wsIGludCBlbmRDb2wsIEV4Y2VsQ2VsbCBjZWxsKQorICAgIC8veworICAgIC8vICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0Q29sOyBjb2wgPD0gZW5kQ29sOyBjb2wrKykKKyAgICAvLyAgICB7CisgICAgLy8gICAgICAgIGlmICghbWVyZ2VkQ2VsbHMuQ29udGFpbnNLZXkoRXhjZWxDZWxsLkdldENlbGxJRCh3b3Jrc2hlZXQuU2hlZXRJRCwgcm93LCBjb2wpKSkKKyAgICAvLyAgICAgICAgeworICAgIC8vICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vICAgICAgICB9CisgICAgLy8gICAgICAgIGVsc2UKKyAgICAvLyAgICAgICAgeworICAgIC8vICAgICAgICAgICAgRXhjZWxDZWxsIG5leHQgPSBtZXJnZWRDZWxsc1tFeGNlbENlbGwuR2V0Q2VsbElEKHdvcmtzaGVldC5TaGVldElELCByb3csIGNvbCldOworICAgIC8vICAgICAgICAgICAgaWYgKGNlbGwuTWVyZ2VJZCAhPSBuZXh0Lk1lcmdlSWQpCisgICAgLy8gICAgICAgICAgICB7CisgICAgLy8gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vICAgICAgICAgICAgfQorICAgIC8vICAgICAgICB9CisgICAgLy8gICAgfQorICAgIC8vICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ2xlYXIgYWxsIGNlbGxzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyB2b2lkIENsZWFyKCkgeworICAgIERlbGV0ZSh0aGlzLCBmYWxzZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDcmVhdGVzIGFuIGFycmF5LWZvcm11bGEuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYXJyYXlGb3JtdWxhIj5UaGUgZm9ybXVsYTwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIENyZWF0ZUFycmF5Rm9ybXVsYShzdHJpbmcgYXJyYXlGb3JtdWxhKSB7CisgICAgaWYgKEFkZHJlc3NlcyAhPSBudWxsKSB7CisgICAgICB0aHJvdyAobmV3KCJBbiBBcnJheWZvcm11bGEgY2FuIG5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgYWRkcmVzcyIpKTsKKyAgICB9CisgICAgU2V0X1NoYXJlZEZvcm11bGEoYXJyYXlGb3JtdWxhLCB0aGlzLCB0cnVlKTsKKyAgfQorCisgIC8vcHJpdmF0ZSB2b2lkIENsZWFyKEV4Y2VsQWRkcmVzc0Jhc2UgUmFuZ2UpCisgIC8veworICAvLyAgICBDbGVhcihSYW5nZSwgdHJ1ZSk7CisgIC8vfQorICBpbnRlcm5hbCB2b2lkIERlbGV0ZShFeGNlbEFkZHJlc3NCYXNlIHJhbmdlLCBib29sIHNoaWZ0KSB7CisgICAgLy9EZWxldGVDaGVja01lcmdlZENlbGxzKFJhbmdlKTsKKyAgICBfd29ya3NoZWV0Lk1lcmdlZENlbGxzLkNsZWFyKHJhbmdlKTsKKyAgICAvL0ZpcnN0IGZpbmQgdGhlIHN0YXJ0IGNlbGwKKyAgICBpbnQgZnJvbVJvdywKKyAgICAgICAgZnJvbUNvbDsKKyAgICB2YXIgZCA9IFdvcmtzaGVldC5EaW1lbnNpb247CisgICAgaWYgKGQgIT0gbnVsbAorICAgICAgICAmJiByYW5nZS5fZnJvbVJvdyA8PSBkLl9mcm9tUm93CisgICAgICAgICYmIHJhbmdlLl90b1JvdworICAgICAgICAgICAgPj0gZC5fdG9Sb3cpIC8vRW50aXJlUm93PworICAgIHsKKyAgICAgIGZyb21Sb3cgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBmcm9tUm93ID0gcmFuZ2UuX2Zyb21Sb3c7CisgICAgfQorICAgIGlmIChkICE9IG51bGwKKyAgICAgICAgJiYgcmFuZ2UuX2Zyb21Db2wgPD0gZC5fZnJvbUNvbAorICAgICAgICAmJiByYW5nZS5fdG9Db2wKKyAgICAgICAgICAgID49IGQuX3RvQ29sKSAvL0VudGlyZVJvdz8KKyAgICB7CisgICAgICBmcm9tQ29sID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgZnJvbUNvbCA9IHJhbmdlLl9mcm9tQ29sOworICAgIH0KKworICAgIHZhciByb3dzID0gcmFuZ2UuX3RvUm93IC0gZnJvbVJvdyArIDE7CisgICAgdmFyIGNvbHMgPSByYW5nZS5fdG9Db2wgLSBmcm9tQ29sICsgMTsKKworICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5EZWxldGUoZnJvbVJvdywgZnJvbUNvbCwgcm93cywgY29scywgc2hpZnQpOworICAgIF93b3Jrc2hlZXQuX3R5cGVzLkRlbGV0ZShmcm9tUm93LCBmcm9tQ29sLCByb3dzLCBjb2xzLCBzaGlmdCk7CisgICAgX3dvcmtzaGVldC5fc3R5bGVzLkRlbGV0ZShmcm9tUm93LCBmcm9tQ29sLCByb3dzLCBjb2xzLCBzaGlmdCk7CisgICAgX3dvcmtzaGVldC5fZm9ybXVsYXMuRGVsZXRlKGZyb21Sb3csIGZyb21Db2wsIHJvd3MsIGNvbHMsIHNoaWZ0KTsKKyAgICBfd29ya3NoZWV0Ll9oeXBlckxpbmtzLkRlbGV0ZShmcm9tUm93LCBmcm9tQ29sLCByb3dzLCBjb2xzLCBzaGlmdCk7CisgICAgX3dvcmtzaGVldC5fZmxhZ3MuRGVsZXRlKGZyb21Sb3csIGZyb21Db2wsIHJvd3MsIGNvbHMsIHNoaWZ0KTsKKyAgICBfd29ya3NoZWV0Ll9jb21tZW50c1N0b3JlLkRlbGV0ZShmcm9tUm93LCBmcm9tQ29sLCByb3dzLCBjb2xzLCBzaGlmdCk7CisKKyAgICAvL2lmKHNoaWZ0KQorICAgIC8veworICAgIC8vICAgIF93b3Jrc2hlZXQuQWRqdXN0Rm9ybXVsYXNSb3coZnJvbVJvdywgcm93cyk7CisgICAgLy99CisKKyAgICAvL0NsZWFyIG11bHRpIGFkZHJlc3NlcyBhcyB3ZWxsCisgICAgaWYgKEFkZHJlc3NlcyAhPSBudWxsKSB7CisgICAgICBmb3JlYWNoICh2YXIgc3ViIGluIEFkZHJlc3NlcykgeworICAgICAgICBEZWxldGUoc3ViLCBzaGlmdCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIERlbGV0ZUNoZWNrTWVyZ2VkQ2VsbHMoRXhjZWxBZGRyZXNzQmFzZSByYW5nZSkgeworICAgIHZhciByZW1vdmVJdGVtcyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICBmb3JlYWNoICh2YXIgYWRkciBpbiBXb3Jrc2hlZXQuTWVyZ2VkQ2VsbHMpIHsKKyAgICAgIHZhciBhZGRyQ29sID0gcmFuZ2UuQ29sbGlkZShuZXcgRXhjZWxBZGRyZXNzKHJhbmdlLldvcmtTaGVldCwgYWRkcikpOworICAgICAgaWYgKGFkZHJDb2wgIT0gZUFkZHJlc3NDb2xsaXRpb24uTm8pIHsKKyAgICAgICAgaWYgKGFkZHJDb2wgPT0gZUFkZHJlc3NDb2xsaXRpb24uSW5zaWRlKSB7CisgICAgICAgICAgcmVtb3ZlSXRlbXMuQWRkKGFkZHIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICJDYW4ndCByZW1vdmUvb3ZlcndyaXRlIGEgcGFydCBvZiBjZWxscyB0aGF0IGFyZSBtZXJnZWQiKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gcmVtb3ZlSXRlbXMpIHsKKyAgICAgIFdvcmtzaGVldC5NZXJnZWRDZWxscy5SZW1vdmUoaXRlbSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgRGlzcG9zZSgpIHt9CisKKyAgLy9pbnQgX2luZGV4OworICAvL3Vsb25nIF90b0NlbGxJZDsKKyAgLy9pbnQgX2VudW1BZGRyZXNzSXg7CisgIHByaXZhdGUgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PiBjZWxsRW51bTsKKworICBwdWJsaWMgSUVudW1lcmF0b3I8RXhjZWxSYW5nZUJhc2U+IEdldEVudW1lcmF0b3IoKSB7CisgICAgUmVzZXQoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKSB7CisgICAgUmVzZXQoKTsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBjdXJyZW50IHJhbmdlIHdoZW4gZW51bWVyYXRpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsUmFuZ2VCYXNlIEN1cnJlbnQgPT4gbmV3KF93b3Jrc2hlZXQsIEdldEFkZHJlc3MoY2VsbEVudW0uUm93LCBjZWxsRW51bS5Db2x1bW4pKTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgY3VycmVudCByYW5nZSB3aGVuIGVudW1lcmF0aW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIG9iamVjdCBJRW51bWVyYXRvci5DdXJyZW50ID0+CisgICAgbmV3IEV4Y2VsUmFuZ2VCYXNlKF93b3Jrc2hlZXQsIEdldEFkZHJlc3MoY2VsbEVudW0uUm93LCBjZWxsRW51bS5Db2x1bW4pKTsKKworICBwcml2YXRlIGludCBfZW51bUFkZHJlc3NJeCA9IC0xOworCisgIHB1YmxpYyBib29sIE1vdmVOZXh0KCkgeworICAgIGlmIChjZWxsRW51bS5OZXh0KCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoX2FkZHJlc3NlcyAhPSBudWxsKSB7CisgICAgICBfZW51bUFkZHJlc3NJeCsrOworICAgICAgaWYgKF9lbnVtQWRkcmVzc0l4IDwgX2FkZHJlc3Nlcy5Db3VudCkgeworICAgICAgICBjZWxsRW51bSA9IG5ldygKKyAgICAgICAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcywKKyAgICAgICAgICAgIF9hZGRyZXNzZXNbX2VudW1BZGRyZXNzSXhdLl9mcm9tUm93LAorICAgICAgICAgICAgX2FkZHJlc3Nlc1tfZW51bUFkZHJlc3NJeF0uX2Zyb21Db2wsCisgICAgICAgICAgICBfYWRkcmVzc2VzW19lbnVtQWRkcmVzc0l4XS5fdG9Sb3csCisgICAgICAgICAgICBfYWRkcmVzc2VzW19lbnVtQWRkcmVzc0l4XS5fdG9Db2wpOworICAgICAgICByZXR1cm4gTW92ZU5leHQoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIHZvaWQgUmVzZXQoKSB7CisgICAgX2VudW1BZGRyZXNzSXggPSAtMTsKKyAgICBjZWxsRW51bSA9IG5ldyhfd29ya3NoZWV0Ll92YWx1ZXMsIF9mcm9tUm93LCBfZnJvbUNvbCwgX3RvUm93LCBfdG9Db2wpOworICB9CisKKyAgLy9wcml2YXRlIHZvaWQgR2V0TmV4dEluZGV4RW51bShpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCB0b1JvdywgaW50IHRvQ29sKQorICAvL3sKKyAgLy8gICAgaWYgKF9pbmRleCA+PSBfd29ya3NoZWV0Ll9jZWxscy5Db3VudCkgcmV0dXJuOworICAvLyAgICBFeGNlbENlbGwgY2VsbCA9IF93b3Jrc2hlZXQuX2NlbGxzW19pbmRleF0gYXMgRXhjZWxDZWxsOworICAvLyAgICB3aGlsZSAoY2VsbC5Db2x1bW4gPiB0b0NvbCB8fCBjZWxsLkNvbHVtbiA8IGZyb21Db2wpCisgIC8vICAgIHsKKyAgLy8gICAgICAgIGlmIChjZWxsLkNvbHVtbiA8IGZyb21Db2wpCisgIC8vICAgICAgICB7CisgIC8vICAgICAgICAgICAgX2luZGV4ID0gX3dvcmtzaGVldC5fY2VsbHMuSW5kZXhPZihFeGNlbEFkZHJlc3MuR2V0Q2VsbElEKF93b3Jrc2hlZXQuU2hlZXRJRCwgY2VsbC5Sb3csIGZyb21Db2wpKTsKKyAgLy8gICAgICAgIH0KKyAgLy8gICAgICAgIGVsc2UKKyAgLy8gICAgICAgIHsKKyAgLy8gICAgICAgICAgICBfaW5kZXggPSBfd29ya3NoZWV0Ll9jZWxscy5JbmRleE9mKEV4Y2VsQWRkcmVzcy5HZXRDZWxsSUQoX3dvcmtzaGVldC5TaGVldElELCBjZWxsLlJvdyArIDEsIGZyb21Db2wpKTsKKyAgLy8gICAgICAgIH0KKworICAvLyAgICAgICAgaWYgKF9pbmRleCA8IDApCisgIC8vICAgICAgICB7CisgIC8vICAgICAgICAgICAgX2luZGV4ID0gfl9pbmRleDsKKyAgLy8gICAgICAgIH0KKyAgLy8gICAgICAgIGlmIChfaW5kZXggPj0gX3dvcmtzaGVldC5fY2VsbHMuQ291bnQgfHwgX3dvcmtzaGVldC5fY2VsbHNbX2luZGV4XS5SYW5nZUlEID4gX3RvQ2VsbElkKQorICAvLyAgICAgICAgeworICAvLyAgICAgICAgICAgIGJyZWFrOworICAvLyAgICAgICAgfQorICAvLyAgICAgICAgY2VsbCA9IF93b3Jrc2hlZXQuX2NlbGxzW19pbmRleF0gYXMgRXhjZWxDZWxsOworICAvLyAgICB9CisgIC8vfQorCisgIC8vcHJpdmF0ZSB2b2lkIEdldFN0YXJ0SW5kZXhFbnVtKGludCBmcm9tUm93LCBpbnQgZnJvbUNvbCwgaW50IHRvUm93LCBpbnQgdG9Db2wpCisgIC8veworICAvLyAgICBfaW5kZXggPSBfd29ya3NoZWV0Ll9jZWxscy5JbmRleE9mKEV4Y2VsQ2VsbEJhc2UuR2V0Q2VsbElEKF93b3Jrc2hlZXQuU2hlZXRJRCwgZnJvbVJvdywgZnJvbUNvbCkpOworICAvLyAgICBfdG9DZWxsSWQgPSBFeGNlbENlbGxCYXNlLkdldENlbGxJRChfd29ya3NoZWV0LlNoZWV0SUQsIHRvUm93LCB0b0NvbCk7CisgIC8vICAgIGlmIChfaW5kZXggPCAwKQorICAvLyAgICB7CisgIC8vICAgICAgICBfaW5kZXggPSB+X2luZGV4OworICAvLyAgICB9CisgIC8vICAgIF9pbmRleC0tOworICAvL30KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFJhbmdlQ29weU9wdGlvbkZsYWdzLmNzIGIvRVBQbHVzL0V4Y2VsUmFuZ2VDb3B5T3B0aW9uRmxhZ3MuY3MKaW5kZXggMzk4NTNjYS4uNjg0YTQ5YyAxMDA2NDQKLS0tIGEvRVBQbHVzL0V4Y2VsUmFuZ2VDb3B5T3B0aW9uRmxhZ3MuY3MKKysrIGIvRVBQbHVzL0V4Y2VsUmFuZ2VDb3B5T3B0aW9uRmxhZ3MuY3MKQEAgLTEsMTYgKzEsMTQgQEAKIO+7v3VzaW5nIFN5c3RlbTsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEZsYWcgZW51bSwgc3BlY2lmeSBhbGwgZmxhZ3MgdGhhdCB5b3Ugd2FudCB0byBleGNsdWRlIGZyb20gdGhlIGNvcHkuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBbRmxhZ3NdICAgIAotICAgIHB1YmxpYyBlbnVtIEV4Y2VsUmFuZ2VDb3B5T3B0aW9uRmxhZ3MgOiBpbnQKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEV4Y2x1ZGUgZm9ybXVsYXMgZnJvbSBiZWluZyBjb3BpZWQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgRXhjbHVkZUZvcm11bGFzID0gMHgxLAotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOworCisvLy8gPHN1bW1hcnk+CisvLy8gRmxhZyBlbnVtLCBzcGVjaWZ5IGFsbCBmbGFncyB0aGF0IHlvdSB3YW50IHRvIGV4Y2x1ZGUgZnJvbSB0aGUgY29weS4KKy8vLyA8L3N1bW1hcnk+CitbRmxhZ3NdCitwdWJsaWMgZW51bSBFeGNlbFJhbmdlQ29weU9wdGlvbkZsYWdzIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRXhjbHVkZSBmb3JtdWxhcyBmcm9tIGJlaW5nIGNvcGllZAorICAvLy8gPC9zdW1tYXJ5PgorICBFeGNsdWRlRm9ybXVsYXMgPSAweDEsCiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxSb3cuY3MgYi9FUFBsdXMvRXhjZWxSb3cuY3MKaW5kZXggMThlYWYzNC4uZmJiMGRiMyAxMDA2NDQKLS0tIGEvRVBQbHVzL0V4Y2VsUm93LmNzCisrKyBiL0VQUGx1cy9FeGNlbFJvdy5jcwpAQCAtMTMsMTcgKzEzLDE3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBL77+9bGxtYW4JCSAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQpAQCAtMzMsMzUyICszMywyNjQgQEAKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKLQlpbnRlcm5hbCBjbGFzcyBSb3dJbnRlcm5hbAotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgZG91YmxlIEhlaWdodD0tMTsKLSAgICAgICAgaW50ZXJuYWwgYm9vbCBIaWRkZW47Ci0gICAgICAgIGludGVybmFsIGJvb2wgQ29sbGFwc2VkOyAgICAgICAgCi0gICAgICAgIGludGVybmFsIHNob3J0IE91dGxpbmVMZXZlbDsKLSAgICAgICAgaW50ZXJuYWwgYm9vbCBQYWdlQnJlYWs7Ci0gICAgICAgIGludGVybmFsIGJvb2wgUGhvbmV0aWM7Ci0gICAgICAgIGludGVybmFsIGJvb2wgQ3VzdG9tSGVpZ2h0OwotICAgICAgICBpbnRlcm5hbCBpbnQgTWVyZ2VJRDsKLSAgICAgICAgaW50ZXJuYWwgUm93SW50ZXJuYWwgQ2xvbmUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJvd0ludGVybmFsKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBIZWlnaHQ9SGVpZ2h0LAotICAgICAgICAgICAgICAgIEhpZGRlbj1IaWRkZW4sCi0gICAgICAgICAgICAgICAgQ29sbGFwc2VkPUNvbGxhcHNlZCwKLSAgICAgICAgICAgICAgICBPdXRsaW5lTGV2ZWw9T3V0bGluZUxldmVsLAotICAgICAgICAgICAgICAgIFBhZ2VCcmVhaz1QYWdlQnJlYWssCi0gICAgICAgICAgICAgICAgUGhvbmV0aWM9UGhvbmV0aWMsCi0gICAgICAgICAgICAgICAgQ3VzdG9tSGVpZ2h0PUN1c3RvbUhlaWdodCwKLSAgICAgICAgICAgICAgICBNZXJnZUlEPU1lcmdlSUQKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWw7CisKK2ludGVybmFsIGNsYXNzIFJvd0ludGVybmFsIHsKKyAgaW50ZXJuYWwgZG91YmxlIEhlaWdodCA9IC0xOworICBpbnRlcm5hbCBib29sIEhpZGRlbjsKKyAgaW50ZXJuYWwgYm9vbCBDb2xsYXBzZWQ7CisgIGludGVybmFsIHNob3J0IE91dGxpbmVMZXZlbDsKKyAgaW50ZXJuYWwgYm9vbCBQYWdlQnJlYWs7CisgIGludGVybmFsIGJvb2wgUGhvbmV0aWM7CisgIGludGVybmFsIGJvb2wgQ3VzdG9tSGVpZ2h0OworICBpbnRlcm5hbCBpbnQgTWVyZ2VJRDsKKworICBpbnRlcm5hbCBSb3dJbnRlcm5hbCBDbG9uZSgpIHsKKyAgICByZXR1cm4gbmV3KCkgeworICAgICAgSGVpZ2h0ID0gSGVpZ2h0LAorICAgICAgSGlkZGVuID0gSGlkZGVuLAorICAgICAgQ29sbGFwc2VkID0gQ29sbGFwc2VkLAorICAgICAgT3V0bGluZUxldmVsID0gT3V0bGluZUxldmVsLAorICAgICAgUGFnZUJyZWFrID0gUGFnZUJyZWFrLAorICAgICAgUGhvbmV0aWMgPSBQaG9uZXRpYywKKyAgICAgIEN1c3RvbUhlaWdodCA9IEN1c3RvbUhlaWdodCwKKyAgICAgIE1lcmdlSUQgPSBNZXJnZUlELAorICAgIH07CisgIH0KK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIFJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCByb3cgaW4gdGhlIHNwcmVhZHNoZWV0LgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbFJvdyA6IElSYW5nZUlkIHsKKyAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OworICBwcml2YXRlIFhtbEVsZW1lbnQgX3Jvd0VsZW1lbnQgPSBudWxsOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEludGVybmFsIFJvd0lELgorICAvLy8gPC9zdW1tYXJ5PgorICBbT2Jzb2xldGVdCisgIHB1YmxpYyB1bG9uZyBSb3dJRCA9PiBHZXRSb3dJZChfd29ya3NoZWV0LlNoZWV0SUQsIFJvdyk7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRXhjZWxSb3cgY2xhc3MuCisgIC8vLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkhCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij5UaGUgcGFyZW50IHdvcmtzaGVldDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij5UaGUgcm93IG51bWJlcjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsUm93KEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgaW50IHJvdykgeworICAgIF93b3Jrc2hlZXQgPSB3b3Jrc2hlZXQ7CisgICAgUm93ID0gcm93OworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBub2RlIHJlcHJlc2VudGluZyB0aGUgcm93LgorICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCBYbWxOb2RlIE5vZGUgeworICAgIGdldCB7IHJldHVybiAoX3Jvd0VsZW1lbnQpOyB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBbGxvd3MgdGhlIHJvdyB0byBiZSBoaWRkZW4gaW4gdGhlIHdvcmtzaGVldAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBIaWRkZW4geworICAgIGdldCB7CisgICAgICB2YXIgciA9IChSb3dJbnRlcm5hbClfd29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoUm93LCAwKTsKKyAgICAgIGlmIChyID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgcmV0dXJuIHIuSGlkZGVuOwogICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0JLy8vIFJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCByb3cgaW4gdGhlIHNwcmVhZHNoZWV0LgotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGNsYXNzIEV4Y2VsUm93IDogSVJhbmdlSUQKLQl7Ci0JCXByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKLQkJcHJpdmF0ZSBYbWxFbGVtZW50IF9yb3dFbGVtZW50ID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW50ZXJuYWwgUm93SUQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtPYnNvbGV0ZV0KLSAgICAgICAgcHVibGljIHVsb25nIFJvd0lEIAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0Um93SUQoX3dvcmtzaGVldC5TaGVldElELCBSb3cpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JCSNyZWdpb24gRXhjZWxSb3cgQ29uc3RydWN0b3IKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRXhjZWxSb3cgY2xhc3MuIAotCQkvLy8gRm9yIGludGVybmFsIHVzZSBvbmx5IQotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9IldvcmtzaGVldCI+VGhlIHBhcmVudCB3b3Jrc2hlZXQ8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9InJvdyI+VGhlIHJvdyBudW1iZXI8L3BhcmFtPgotCQlpbnRlcm5hbCBFeGNlbFJvdyhFeGNlbFdvcmtzaGVldCBXb3Jrc2hlZXQsIGludCByb3cpCi0JCXsKLQkJCV93b3Jrc2hlZXQgPSBXb3Jrc2hlZXQ7Ci0gICAgICAgICAgICBSb3cgPSByb3c7Ci0JCX0KLQkJI2VuZHJlZ2lvbgotCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbm9kZSByZXByZXNlbnRpbmcgdGhlIHJvdy4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJaW50ZXJuYWwgWG1sTm9kZSBOb2RlIHsgZ2V0IHsgcmV0dXJuIChfcm93RWxlbWVudCk7IH0gfQotCi0JCSNyZWdpb24gRXhjZWxSb3cgSGlkZGVuCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLQkJLy8vIEFsbG93cyB0aGUgcm93IHRvIGJlIGhpZGRlbiBpbiB0aGUgd29ya3NoZWV0Ci0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBib29sIEhpZGRlbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgcj0oUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuSGlkZGVuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByID0gR2V0Um93SW50ZXJuYWwoKTsKLSAgICAgICAgICAgICAgICByLkhpZGRlbj12YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0JCSNlbmRyZWdpb24KLQotCQkjcmVnaW9uIEV4Y2VsUm93IEhlaWdodAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0JCS8vLyBTZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHJvdwotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgZG91YmxlIEhlaWdodAotICAgICAgICB7Ci0JCQlnZXQKLQkJCXsKLSAgICAgICAgICAgICAgICB2YXIgciA9IChSb3dJbnRlcm5hbClfd29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoUm93LCAwKTsKLSAgICAgICAgICAgICAgICBpZiAociA9PSBudWxsIHx8IHIuSGVpZ2h0PDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5EZWZhdWx0Um93SGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHIgPSBHZXRSb3dJbnRlcm5hbCgpOwotICAgICAgICAgICAgICAgIHIuSGVpZ2h0ID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHIuSGlkZGVuICYmIHZhbHVlICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBIaWRkZW4gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgci5DdXN0b21IZWlnaHQgPSAodmFsdWUgIT0gX3dvcmtzaGVldC5EZWZhdWx0Um93SGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXQgdG8gdHJ1ZSBpZiBZb3UgZG9uJ3Qgd2FudCB0aGUgcm93IHRvIEF1dG9zaXplCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEN1c3RvbUhlaWdodCAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHIgPSAoUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuQ3VzdG9tSGVpZ2h0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByID0gR2V0Um93SW50ZXJuYWwoKTsKLSAgICAgICAgICAgICAgICByLkN1c3RvbUhlaWdodCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JCSNlbmRyZWdpb24KLQotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgX3N0eWxlTmFtZSA9ICIiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXRzIHRoZSBzdHlsZSBmb3IgdGhlIGVudGlyZSBjb2x1bW4gdXNpbmcgYSBzdHlsZSBuYW1lLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIFN0eWxlTmFtZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlTmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0eWxlSUQgPSBfd29ya3NoZWV0Lldvcmtib29rLlN0eWxlcy5HZXRTdHlsZUlkRnJvbU5hbWUodmFsdWUpOwotICAgICAgICAgICAgICAgIF9zdHlsZU5hbWUgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXRzIHRoZSBzdHlsZSBmb3IgdGhlIGVudGlyZSByb3cgdXNpbmcgdGhlIHN0eWxlIElELiAgCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgU3R5bGVJRAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5fc3R5bGVzLkdldFZhbHVlKFJvdywgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll9zdHlsZXMuU2V0VmFsdWUoUm93LCAwLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSb3dudW1iZXIKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBSb3cKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgc2V0OwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIG91dGxpbmUgbGV2ZWwgaXMgc2V0IHRoaXMgdGVsbHMgdGhhdCB0aGUgcm93IGlzIGNvbGxhcHNlZAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBDb2xsYXBzZWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHI9KFJvd0ludGVybmFsKV93b3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShSb3csIDApOwotICAgICAgICAgICAgICAgIGlmIChyID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByLkNvbGxhcHNlZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgciA9IEdldFJvd0ludGVybmFsKCk7Ci0gICAgICAgICAgICAgICAgci5Db2xsYXBzZWQgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBPdXRsaW5lIGxldmVsLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IE91dGxpbmVMZXZlbAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgcj0oUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gci5PdXRsaW5lTGV2ZWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHIgPSBHZXRSb3dJbnRlcm5hbCgpOwotICAgICAgICAgICAgICAgIHIuT3V0bGluZUxldmVsPShzaG9ydCl2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgIFJvd0ludGVybmFsIEdldFJvd0ludGVybmFsKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHIgPSAoUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7Ci0gICAgICAgICAgICBpZiAociA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHIgPSBuZXcgUm93SW50ZXJuYWwoKTsKLSAgICAgICAgICAgICAgICBfd29ya3NoZWV0Ll92YWx1ZXMuU2V0VmFsdWUoUm93LCAwLCByKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2hvdyBwaG9uZXRpYyBJbmZvcm1hdGlvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBQaG9uZXRpYyAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHIgPSAoUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuUGhvbmV0aWM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHIgPSBHZXRSb3dJbnRlcm5hbCgpOwotICAgICAgICAgICAgICAgIHIuUGhvbmV0aWMgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgU3R5bGUgYXBwbGllZCB0byB0aGUgd2hvbGUgcm93LiBPbmx5IGVmZmVrdCBjZWxscyB3aXRoIG5vIGluZGl2aWR1YWwgc3R5bGUgc2V0LiAKLSAgICAgICAgLy8vIFVzZSBFeGNlbFJhbmdlIG9iamVjdCBpZiB5b3Ugd2FudCB0byBzZXQgc3BlY2lmaWMgc3R5bGVzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxTdHlsZSBTdHlsZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXMuR2V0U3R5bGVPYmplY3QoU3R5bGVJRCxfd29ya3NoZWV0LlBvc2l0aW9uSUQgLFJvdy5Ub1N0cmluZygpICsgIjoiICsgUm93LlRvU3RyaW5nKCkpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIGEgbWFudWFsIHBhZ2UgYnJlYWsgYWZ0ZXIgdGhlIHJvdy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgUGFnZUJyZWFrCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByID0gKFJvd0ludGVybmFsKV93b3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShSb3csIDApOwotICAgICAgICAgICAgICAgIGlmIChyID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByLlBhZ2VCcmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgciA9IEdldFJvd0ludGVybmFsKCk7Ci0gICAgICAgICAgICAgICAgci5QYWdlQnJlYWsgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbCBNZXJnZWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHNbUm93LCAwXSAhPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3dvcmtzaGVldC5NZXJnZWRDZWxscy5BZGQobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoUm93LCAxLCBSb3csIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHVsb25nIEdldFJvd0lEKGludCBzaGVldElELCBpbnQgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKCh1bG9uZylzaGVldElEKSArICgoKHVsb25nKXJvdykgPDwgMjkpOwotCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgICNyZWdpb24gSVJhbmdlSUQgTWVtYmVycwotCi0gICAgICAgIFtPYnNvbGV0ZV0KLSAgICAgICAgdWxvbmcgSVJhbmdlSUQuUmFuZ2VJRAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUm93SUQ7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUm93ID0gKChpbnQpKHZhbHVlID4+IDI5KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvcGllcyB0aGUgY3VycmVudCByb3cgdG8gYSBuZXcgd29ya3NoZWV0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkZWQiPlRoZSB3b3Jrc2hlZXQgd2hlcmUgdGhlIGNvcHkgd2lsbCBiZSBjcmVhdGVkPC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBDbG9uZShFeGNlbFdvcmtzaGVldCBhZGRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxSb3cgbmV3Um93ID0gYWRkZWQuUm93KFJvdyk7Ci0gICAgICAgICAgICBuZXdSb3cuQ29sbGFwc2VkID0gQ29sbGFwc2VkOwotICAgICAgICAgICAgbmV3Um93LkhlaWdodCA9IEhlaWdodDsKLSAgICAgICAgICAgIG5ld1Jvdy5IaWRkZW4gPSBIaWRkZW47Ci0gICAgICAgICAgICBuZXdSb3cuT3V0bGluZUxldmVsID0gT3V0bGluZUxldmVsOwotICAgICAgICAgICAgbmV3Um93LlBhZ2VCcmVhayA9IFBhZ2VCcmVhazsKLSAgICAgICAgICAgIG5ld1Jvdy5QaG9uZXRpYyA9IFBob25ldGljOwotICAgICAgICAgICAgbmV3Um93Ll9zdHlsZU5hbWUgPSBfc3R5bGVOYW1lOwotICAgICAgICAgICAgbmV3Um93LlN0eWxlSUQgPSBTdHlsZUlEOwotICAgICAgICB9CisgICAgc2V0IHsKKyAgICAgIHZhciByID0gR2V0Um93SW50ZXJuYWwoKTsKKyAgICAgIHIuSGlkZGVuID0gdmFsdWU7CiAgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSByb3cKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGRvdWJsZSBIZWlnaHQgeworICAgIGdldCB7CisgICAgICB2YXIgciA9IChSb3dJbnRlcm5hbClfd29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoUm93LCAwKTsKKyAgICAgIGlmIChyID09IG51bGwgfHwgci5IZWlnaHQgPCAwKSB7CisgICAgICAgIHJldHVybiBfd29ya3NoZWV0LkRlZmF1bHRSb3dIZWlnaHQ7CisgICAgICB9CisgICAgICByZXR1cm4gci5IZWlnaHQ7CisgICAgfQorICAgIHNldCB7CisgICAgICB2YXIgciA9IEdldFJvd0ludGVybmFsKCk7CisgICAgICByLkhlaWdodCA9IHZhbHVlOworCisgICAgICBpZiAoci5IaWRkZW4gJiYgdmFsdWUgIT0gMCkgeworICAgICAgICBIaWRkZW4gPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHIuQ3VzdG9tSGVpZ2h0ID0gKHZhbHVlICE9IF93b3Jrc2hlZXQuRGVmYXVsdFJvd0hlaWdodCk7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2V0IHRvIHRydWUgaWYgWW91IGRvbid0IHdhbnQgdGhlIHJvdyB0byBBdXRvc2l6ZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBDdXN0b21IZWlnaHQgeworICAgIGdldCB7CisgICAgICB2YXIgciA9IChSb3dJbnRlcm5hbClfd29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoUm93LCAwKTsKKyAgICAgIGlmIChyID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgcmV0dXJuIHIuQ3VzdG9tSGVpZ2h0OworICAgIH0KKyAgICBzZXQgeworICAgICAgdmFyIHIgPSBHZXRSb3dJbnRlcm5hbCgpOworICAgICAgci5DdXN0b21IZWlnaHQgPSB2YWx1ZTsKKyAgICB9CisgIH0KKworICBpbnRlcm5hbCBzdHJpbmcgX3N0eWxlTmFtZSA9ICIiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNldHMgdGhlIHN0eWxlIGZvciB0aGUgZW50aXJlIGNvbHVtbiB1c2luZyBhIHN0eWxlIG5hbWUuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgU3R5bGVOYW1lIHsKKyAgICBnZXQgeyByZXR1cm4gX3N0eWxlTmFtZTsgfQorICAgIHNldCB7CisgICAgICBTdHlsZUlEID0gX3dvcmtzaGVldC5Xb3JrYm9vay5TdHlsZXMuR2V0U3R5bGVJZEZyb21OYW1lKHZhbHVlKTsKKyAgICAgIF9zdHlsZU5hbWUgPSB2YWx1ZTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTZXRzIHRoZSBzdHlsZSBmb3IgdGhlIGVudGlyZSByb3cgdXNpbmcgdGhlIHN0eWxlIElELgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IFN0eWxlSUQgeworICAgIGdldCB7IHJldHVybiBfd29ya3NoZWV0Ll9zdHlsZXMuR2V0VmFsdWUoUm93LCAwKTsgfQorICAgIHNldCB7IF93b3Jrc2hlZXQuX3N0eWxlcy5TZXRWYWx1ZShSb3csIDAsIHZhbHVlKTsgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUm93bnVtYmVyCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgUm93IHsgZ2V0OyBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiBvdXRsaW5lIGxldmVsIGlzIHNldCB0aGlzIHRlbGxzIHRoYXQgdGhlIHJvdyBpcyBjb2xsYXBzZWQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQ29sbGFwc2VkIHsKKyAgICBnZXQgeworICAgICAgdmFyIHIgPSAoUm93SW50ZXJuYWwpX3dvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKFJvdywgMCk7CisgICAgICBpZiAociA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByLkNvbGxhcHNlZDsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHZhciByID0gR2V0Um93SW50ZXJuYWwoKTsKKyAgICAgIHIuQ29sbGFwc2VkID0gdmFsdWU7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gT3V0bGluZSBsZXZlbC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBPdXRsaW5lTGV2ZWwgeworICAgIGdldCB7CisgICAgICB2YXIgciA9IChSb3dJbnRlcm5hbClfd29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoUm93LCAwKTsKKyAgICAgIGlmIChyID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByZXR1cm4gci5PdXRsaW5lTGV2ZWw7CisgICAgfQorICAgIHNldCB7CisgICAgICB2YXIgciA9IEdldFJvd0ludGVybmFsKCk7CisgICAgICByLk91dGxpbmVMZXZlbCA9IChzaG9ydCl2YWx1ZTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIFJvd0ludGVybmFsIEdldFJvd0ludGVybmFsKCkgeworICAgIHZhciByID0gKFJvd0ludGVybmFsKV93b3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShSb3csIDApOworICAgIGlmIChyID09IG51bGwpIHsKKyAgICAgIHIgPSBuZXcoKTsKKyAgICAgIF93b3Jrc2hlZXQuX3ZhbHVlcy5TZXRWYWx1ZShSb3csIDAsIHIpOworICAgIH0KKyAgICByZXR1cm4gcjsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNob3cgcGhvbmV0aWMgSW5mb3JtYXRpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgUGhvbmV0aWMgeworICAgIGdldCB7CisgICAgICB2YXIgciA9IChSb3dJbnRlcm5hbClfd29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoUm93LCAwKTsKKyAgICAgIGlmIChyID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgcmV0dXJuIHIuUGhvbmV0aWM7CisgICAgfQorICAgIHNldCB7CisgICAgICB2YXIgciA9IEdldFJvd0ludGVybmFsKCk7CisgICAgICByLlBob25ldGljID0gdmFsdWU7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIFN0eWxlIGFwcGxpZWQgdG8gdGhlIHdob2xlIHJvdy4gT25seSBlZmZla3QgY2VsbHMgd2l0aCBubyBpbmRpdmlkdWFsIHN0eWxlIHNldC4KKyAgLy8vIFVzZSBFeGNlbFJhbmdlIG9iamVjdCBpZiB5b3Ugd2FudCB0byBzZXQgc3BlY2lmaWMgc3R5bGVzLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxTdHlsZSBTdHlsZSB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBfd29ya3NoZWV0Lldvcmtib29rLlN0eWxlcy5HZXRTdHlsZU9iamVjdCgKKyAgICAgICAgICBTdHlsZUlELAorICAgICAgICAgIF93b3Jrc2hlZXQuUG9zaXRpb25JRCwKKyAgICAgICAgICBSb3cgKyAiOiIgKyBSb3cpOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSBtYW51YWwgcGFnZSBicmVhayBhZnRlciB0aGUgcm93LgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBQYWdlQnJlYWsgeworICAgIGdldCB7CisgICAgICB2YXIgciA9IChSb3dJbnRlcm5hbClfd29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoUm93LCAwKTsKKyAgICAgIGlmIChyID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgcmV0dXJuIHIuUGFnZUJyZWFrOworICAgIH0KKyAgICBzZXQgeworICAgICAgdmFyIHIgPSBHZXRSb3dJbnRlcm5hbCgpOworICAgICAgci5QYWdlQnJlYWsgPSB2YWx1ZTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbCBNZXJnZWQgeworICAgIGdldCB7IHJldHVybiBfd29ya3NoZWV0Lk1lcmdlZENlbGxzW1JvdywgMF0gIT0gbnVsbDsgfQorICAgIHNldCB7IF93b3Jrc2hlZXQuTWVyZ2VkQ2VsbHMuQWRkKG5ldyhSb3csIDEsIFJvdywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpLCB0cnVlKTsgfQorICB9CisKKyAgaW50ZXJuYWwgc3RhdGljIHVsb25nIEdldFJvd0lkKGludCBzaGVldElkLCBpbnQgcm93KSB7CisgICAgcmV0dXJuICgodWxvbmcpc2hlZXRJZCkgKyAoKCh1bG9uZylyb3cpIDw8IDI5KTsKKyAgfQorCisgIFtPYnNvbGV0ZV0KKyAgdWxvbmcgSVJhbmdlSWQuUmFuZ2VJRCB7CisgICAgZ2V0IHsgcmV0dXJuIFJvd0lEOyB9CisgICAgc2V0IHsgUm93ID0gKChpbnQpKHZhbHVlID4+IDI5KSk7IH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENvcGllcyB0aGUgY3VycmVudCByb3cgdG8gYSBuZXcgd29ya3NoZWV0CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkZWQiPlRoZSB3b3Jrc2hlZXQgd2hlcmUgdGhlIGNvcHkgd2lsbCBiZSBjcmVhdGVkPC9wYXJhbT4KKyAgaW50ZXJuYWwgdm9pZCBDbG9uZShFeGNlbFdvcmtzaGVldCBhZGRlZCkgeworICAgIEV4Y2VsUm93IG5ld1JvdyA9IGFkZGVkLlJvdyhSb3cpOworICAgIG5ld1Jvdy5Db2xsYXBzZWQgPSBDb2xsYXBzZWQ7CisgICAgbmV3Um93LkhlaWdodCA9IEhlaWdodDsKKyAgICBuZXdSb3cuSGlkZGVuID0gSGlkZGVuOworICAgIG5ld1Jvdy5PdXRsaW5lTGV2ZWwgPSBPdXRsaW5lTGV2ZWw7CisgICAgbmV3Um93LlBhZ2VCcmVhayA9IFBhZ2VCcmVhazsKKyAgICBuZXdSb3cuUGhvbmV0aWMgPSBQaG9uZXRpYzsKKyAgICBuZXdSb3cuX3N0eWxlTmFtZSA9IF9zdHlsZU5hbWU7CisgICAgbmV3Um93LlN0eWxlSUQgPSBTdHlsZUlEOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxTaGVldFByb3RlY3Rpb24uY3MgYi9FUFBsdXMvRXhjZWxTaGVldFByb3RlY3Rpb24uY3MKaW5kZXggMmNhYTdiOS4uYmM3OTk2ZCAxMDA2NDQKLS0tIGEvRVBQbHVzL0V4Y2VsU2hlZXRQcm90ZWN0aW9uLmNzCisrKyBiL0VQUGx1cy9FeGNlbFNoZWV0UHJvdGVjdGlvbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMjkwICsxMywyMDMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMTAtMDMtMTQKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW0uWG1sOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gU2hlZXQgcHJvdGVjdGlvbgotICAgIC8vLzxzZWVhbHNvIGNyZWY9IkV4Y2VsRW5jcnlwdGlvbiIvPiAKLSAgICAvLy88c2VlYWxzbyBjcmVmPSJFeGNlbFByb3RlY3Rpb24iLz4gCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsU2hlZXRQcm90ZWN0aW9uIDogWG1sSGVscGVyCi0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbFNoZWV0UHJvdGVjdGlvbiAoWG1sTmFtZXNwYWNlTWFuYWdlciBuc20sIFhtbE5vZGUgdG9wTm9kZSxFeGNlbFdvcmtzaGVldCB3cykgOgotICAgICAgICAgICAgYmFzZShuc20sIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IHdzLlNjaGVtYU5vZGVPcmRlcjsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9pc1Byb3RlY3RlZFBhdGg9ImQ6c2hlZXRQcm90ZWN0aW9uL0BzaGVldCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSB3b3Jrc2hlZXQgaXMgcHJvdGVjdGVkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBJc1Byb3RlY3RlZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woX2lzUHJvdGVjdGVkUGF0aCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2lzUHJvdGVjdGVkUGF0aCwgdmFsdWUsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBbGxvd0VkaXRPYmplY3QgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBBbGxvd0VkaXRTY2VuYXJpb3MgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEZWxldGVBbGxOb2RlKF9pc1Byb3RlY3RlZFBhdGgpOyAvL2RlbGV0ZSB0aGUgd2hvbGUgc2hlZXRwcm90ZWN0aW9uIG5vZGUKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2FsbG93U2VsZWN0TG9ja2VkQ2VsbHNQYXRoID0gImQ6c2hlZXRQcm90ZWN0aW9uL0BzZWxlY3RMb2NrZWRDZWxscyI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFsbG93IHVzZXJzIHRvIHNlbGVjdCBsb2NrZWQgY2VsbHMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgQWxsb3dTZWxlY3RMb2NrZWRDZWxscwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIUdldFhtbE5vZGVCb29sKF9hbGxvd1NlbGVjdExvY2tlZENlbGxzUGF0aCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93U2VsZWN0TG9ja2VkQ2VsbHNQYXRoLCAhdmFsdWUsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dTZWxlY3RVbmxvY2tlZENlbGxzUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9Ac2VsZWN0VW5sb2NrZWRDZWxscyI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFsbG93IHVzZXJzIHRvIHNlbGVjdCB1bmxvY2tlZCBjZWxscwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBBbGxvd1NlbGVjdFVubG9ja2VkQ2VsbHMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFHZXRYbWxOb2RlQm9vbChfYWxsb3dTZWxlY3RVbmxvY2tlZENlbGxzUGF0aCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93U2VsZWN0VW5sb2NrZWRDZWxsc1BhdGgsICF2YWx1ZSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2FsbG93T2JqZWN0UGF0aD0iZDpzaGVldFByb3RlY3Rpb24vQG9iamVjdHMiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBbGxvdyB1c2VycyB0byBlZGl0IG9iamVjdHMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgQWxsb3dFZGl0T2JqZWN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAhR2V0WG1sTm9kZUJvb2woX2FsbG93T2JqZWN0UGF0aCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93T2JqZWN0UGF0aCwgIXZhbHVlLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2FsbG93U2NlbmFyaW9zUGF0aD0iZDpzaGVldFByb3RlY3Rpb24vQHNjZW5hcmlvcyI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFsbG93IHVzZXJzIHRvIGVkaXQgc2VuYXJpb3MKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgQWxsb3dFZGl0U2NlbmFyaW9zCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAhR2V0WG1sTm9kZUJvb2woX2FsbG93U2NlbmFyaW9zUGF0aCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93U2NlbmFyaW9zUGF0aCwgIXZhbHVlLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2FsbG93Rm9ybWF0Q2VsbHNQYXRoPSJkOnNoZWV0UHJvdGVjdGlvbi9AZm9ybWF0Q2VsbHMiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBbGxvdyB1c2VycyB0byBmb3JtYXQgY2VsbHMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgQWxsb3dGb3JtYXRDZWxscyAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFHZXRYbWxOb2RlQm9vbChfYWxsb3dGb3JtYXRDZWxsc1BhdGgsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93Rm9ybWF0Q2VsbHNQYXRoLCAhdmFsdWUsIHRydWUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dGb3JtYXRDb2x1bW5zUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AZm9ybWF0Q29sdW1ucyI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFsbG93IHVzZXJzIHRvIEZvcm1hdCBjb2x1bW5zCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEFsbG93Rm9ybWF0Q29sdW1ucwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0Zvcm1hdENvbHVtbnNQYXRoLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKF9hbGxvd0Zvcm1hdENvbHVtbnNQYXRoLCAhdmFsdWUsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9hbGxvd0Zvcm1hdFJvd3NQYXRoID0gImQ6c2hlZXRQcm90ZWN0aW9uL0Bmb3JtYXRSb3dzIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWxsb3cgdXNlcnMgdG8gRm9ybWF0IHJvd3MKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgQWxsb3dGb3JtYXRSb3dzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAhR2V0WG1sTm9kZUJvb2woX2FsbG93Rm9ybWF0Um93c1BhdGgsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93Rm9ybWF0Um93c1BhdGgsICF2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOwogCi0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9hbGxvd0luc2VydENvbHVtbnNQYXRoID0gImQ6c2hlZXRQcm90ZWN0aW9uL0BpbnNlcnRDb2x1bW5zIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWxsb3cgdXNlcnMgdG8gaW5zZXJ0IGNvbHVtbnMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgQWxsb3dJbnNlcnRDb2x1bW5zCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAhR2V0WG1sTm9kZUJvb2woX2FsbG93SW5zZXJ0Q29sdW1uc1BhdGgsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93SW5zZXJ0Q29sdW1uc1BhdGgsICF2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBTaGVldCBwcm90ZWN0aW9uCisvLy88c2VlYWxzbyBjcmVmPSJFeGNlbEVuY3J5cHRpb24iLz4KKy8vLzxzZWVhbHNvIGNyZWY9IkV4Y2VsUHJvdGVjdGlvbiIvPgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxTaGVldFByb3RlY3Rpb24gOiBYbWxIZWxwZXIgeworICBpbnRlcm5hbCBFeGNlbFNoZWV0UHJvdGVjdGlvbihYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbSwgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFdvcmtzaGVldCB3cykKKyAgICAgIDogYmFzZShuc20sIHRvcE5vZGUpIHsKKyAgICBTY2hlbWFOb2RlT3JkZXIgPSB3cy5TY2hlbWFOb2RlT3JkZXI7CisgIH0KIAotICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dJbnNlcnRSb3dzUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AaW5zZXJ0Um93cyI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFsbG93IHVzZXJzIHRvIEZvcm1hdCByb3dzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEFsbG93SW5zZXJ0Um93cwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0luc2VydFJvd3NQYXRoLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKF9hbGxvd0luc2VydFJvd3NQYXRoLCAhdmFsdWUsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9hbGxvd0luc2VydEh5cGVybGlua3NQYXRoID0gImQ6c2hlZXRQcm90ZWN0aW9uL0BpbnNlcnRIeXBlcmxpbmtzIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWxsb3cgdXNlcnMgdG8gaW5zZXJ0IGh5cGVybGlua3MKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgQWxsb3dJbnNlcnRIeXBlcmxpbmtzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAhR2V0WG1sTm9kZUJvb2woX2FsbG93SW5zZXJ0SHlwZXJsaW5rc1BhdGgsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93SW5zZXJ0SHlwZXJsaW5rc1BhdGgsICF2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2FsbG93RGVsZXRlQ29sdW1ucyA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AZGVsZXRlQ29sdW1ucyI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFsbG93IHVzZXJzIHRvIGRlbGV0ZSBjb2x1bW5zCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEFsbG93RGVsZXRlQ29sdW1ucwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0RlbGV0ZUNvbHVtbnMsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woX2FsbG93RGVsZXRlQ29sdW1ucywgIXZhbHVlLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dEZWxldGVSb3dzUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AZGVsZXRlUm93cyI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFsbG93IHVzZXJzIHRvIGRlbGV0ZSByb3dzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEFsbG93RGVsZXRlUm93cwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0RlbGV0ZVJvd3NQYXRoLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKF9hbGxvd0RlbGV0ZVJvd3NQYXRoLCAhdmFsdWUsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9pc1Byb3RlY3RlZFBhdGggPSAiZDpzaGVldFByb3RlY3Rpb24vQHNoZWV0IjsKIAotICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dTb3J0UGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9Ac29ydCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFsbG93IHVzZXJzIHRvIHNvcnQgYSByYW5nZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBBbGxvd1NvcnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICFHZXRYbWxOb2RlQm9vbChfYWxsb3dTb3J0UGF0aCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfYWxsb3dTb3J0UGF0aCwgIXZhbHVlLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9hbGxvd0F1dG9GaWx0ZXJQYXRoID0gImQ6c2hlZXRQcm90ZWN0aW9uL0BhdXRvRmlsdGVyIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWxsb3cgdXNlcnMgdG8gdXNlIGF1dG9maWx0ZXJzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEFsbG93QXV0b0ZpbHRlcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0F1dG9GaWx0ZXJQYXRoLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKF9hbGxvd0F1dG9GaWx0ZXJQYXRoLCAhdmFsdWUsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9hbGxvd1Bpdm90VGFibGVzUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AcGl2b3RUYWJsZXMiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBbGxvdyB1c2VycyB0byB1c2UgcGl2b3R0YWJsZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgQWxsb3dQaXZvdFRhYmxlcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIUdldFhtbE5vZGVCb29sKF9hbGxvd1Bpdm90VGFibGVzUGF0aCwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChfYWxsb3dQaXZvdFRhYmxlc1BhdGgsICF2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhlIHdvcmtzaGVldCBpcyBwcm90ZWN0ZWQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIElzUHJvdGVjdGVkIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2woX2lzUHJvdGVjdGVkUGF0aCwgZmFsc2UpOworICAgIHNldCB7CisgICAgICBTZXRYbWxOb2RlQm9vbChfaXNQcm90ZWN0ZWRQYXRoLCB2YWx1ZSwgZmFsc2UpOworICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIEFsbG93RWRpdE9iamVjdCA9IHRydWU7CisgICAgICAgIEFsbG93RWRpdFNjZW5hcmlvcyA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBEZWxldGVBbGxOb2RlKF9pc1Byb3RlY3RlZFBhdGgpOyAvL2RlbGV0ZSB0aGUgd2hvbGUgc2hlZXRwcm90ZWN0aW9uIG5vZGUKKyAgICAgIH0KICAgICB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dTZWxlY3RMb2NrZWRDZWxsc1BhdGggPSAiZDpzaGVldFByb3RlY3Rpb24vQHNlbGVjdExvY2tlZENlbGxzIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBbGxvdyB1c2VycyB0byBzZWxlY3QgbG9ja2VkIGNlbGxzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIEFsbG93U2VsZWN0TG9ja2VkQ2VsbHMgeworICAgIGdldCA9PiAhR2V0WG1sTm9kZUJvb2woX2FsbG93U2VsZWN0TG9ja2VkQ2VsbHNQYXRoLCBmYWxzZSk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKF9hbGxvd1NlbGVjdExvY2tlZENlbGxzUGF0aCwgIXZhbHVlLCBmYWxzZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dTZWxlY3RVbmxvY2tlZENlbGxzUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9Ac2VsZWN0VW5sb2NrZWRDZWxscyI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWxsb3cgdXNlcnMgdG8gc2VsZWN0IHVubG9ja2VkIGNlbGxzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIEFsbG93U2VsZWN0VW5sb2NrZWRDZWxscyB7CisgICAgZ2V0ID0+ICFHZXRYbWxOb2RlQm9vbChfYWxsb3dTZWxlY3RVbmxvY2tlZENlbGxzUGF0aCwgZmFsc2UpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbChfYWxsb3dTZWxlY3RVbmxvY2tlZENlbGxzUGF0aCwgIXZhbHVlLCBmYWxzZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dPYmplY3RQYXRoID0gImQ6c2hlZXRQcm90ZWN0aW9uL0BvYmplY3RzIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBbGxvdyB1c2VycyB0byBlZGl0IG9iamVjdHMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQWxsb3dFZGl0T2JqZWN0IHsKKyAgICBnZXQgPT4gIUdldFhtbE5vZGVCb29sKF9hbGxvd09iamVjdFBhdGgsIGZhbHNlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX2FsbG93T2JqZWN0UGF0aCwgIXZhbHVlLCBmYWxzZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dTY2VuYXJpb3NQYXRoID0gImQ6c2hlZXRQcm90ZWN0aW9uL0BzY2VuYXJpb3MiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFsbG93IHVzZXJzIHRvIGVkaXQgc2VuYXJpb3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQWxsb3dFZGl0U2NlbmFyaW9zIHsKKyAgICBnZXQgPT4gIUdldFhtbE5vZGVCb29sKF9hbGxvd1NjZW5hcmlvc1BhdGgsIGZhbHNlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX2FsbG93U2NlbmFyaW9zUGF0aCwgIXZhbHVlLCBmYWxzZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dGb3JtYXRDZWxsc1BhdGggPSAiZDpzaGVldFByb3RlY3Rpb24vQGZvcm1hdENlbGxzIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBbGxvdyB1c2VycyB0byBmb3JtYXQgY2VsbHMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQWxsb3dGb3JtYXRDZWxscyB7CisgICAgZ2V0ID0+ICFHZXRYbWxOb2RlQm9vbChfYWxsb3dGb3JtYXRDZWxsc1BhdGgsIHRydWUpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbChfYWxsb3dGb3JtYXRDZWxsc1BhdGgsICF2YWx1ZSwgdHJ1ZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dGb3JtYXRDb2x1bW5zUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AZm9ybWF0Q29sdW1ucyI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWxsb3cgdXNlcnMgdG8gRm9ybWF0IGNvbHVtbnMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQWxsb3dGb3JtYXRDb2x1bW5zIHsKKyAgICBnZXQgPT4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0Zvcm1hdENvbHVtbnNQYXRoLCB0cnVlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX2FsbG93Rm9ybWF0Q29sdW1uc1BhdGgsICF2YWx1ZSwgdHJ1ZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dGb3JtYXRSb3dzUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AZm9ybWF0Um93cyI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWxsb3cgdXNlcnMgdG8gRm9ybWF0IHJvd3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQWxsb3dGb3JtYXRSb3dzIHsKKyAgICBnZXQgPT4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0Zvcm1hdFJvd3NQYXRoLCB0cnVlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX2FsbG93Rm9ybWF0Um93c1BhdGgsICF2YWx1ZSwgdHJ1ZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dJbnNlcnRDb2x1bW5zUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AaW5zZXJ0Q29sdW1ucyI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWxsb3cgdXNlcnMgdG8gaW5zZXJ0IGNvbHVtbnMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQWxsb3dJbnNlcnRDb2x1bW5zIHsKKyAgICBnZXQgPT4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0luc2VydENvbHVtbnNQYXRoLCB0cnVlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX2FsbG93SW5zZXJ0Q29sdW1uc1BhdGgsICF2YWx1ZSwgdHJ1ZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dJbnNlcnRSb3dzUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AaW5zZXJ0Um93cyI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWxsb3cgdXNlcnMgdG8gRm9ybWF0IHJvd3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQWxsb3dJbnNlcnRSb3dzIHsKKyAgICBnZXQgPT4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0luc2VydFJvd3NQYXRoLCB0cnVlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX2FsbG93SW5zZXJ0Um93c1BhdGgsICF2YWx1ZSwgdHJ1ZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dJbnNlcnRIeXBlcmxpbmtzUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AaW5zZXJ0SHlwZXJsaW5rcyI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWxsb3cgdXNlcnMgdG8gaW5zZXJ0IGh5cGVybGlua3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQWxsb3dJbnNlcnRIeXBlcmxpbmtzIHsKKyAgICBnZXQgPT4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0luc2VydEh5cGVybGlua3NQYXRoLCB0cnVlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX2FsbG93SW5zZXJ0SHlwZXJsaW5rc1BhdGgsICF2YWx1ZSwgdHJ1ZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dEZWxldGVDb2x1bW5zID0gImQ6c2hlZXRQcm90ZWN0aW9uL0BkZWxldGVDb2x1bW5zIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBbGxvdyB1c2VycyB0byBkZWxldGUgY29sdW1ucworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBBbGxvd0RlbGV0ZUNvbHVtbnMgeworICAgIGdldCA9PiAhR2V0WG1sTm9kZUJvb2woX2FsbG93RGVsZXRlQ29sdW1ucywgdHJ1ZSk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKF9hbGxvd0RlbGV0ZUNvbHVtbnMsICF2YWx1ZSwgdHJ1ZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dEZWxldGVSb3dzUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AZGVsZXRlUm93cyI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWxsb3cgdXNlcnMgdG8gZGVsZXRlIHJvd3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQWxsb3dEZWxldGVSb3dzIHsKKyAgICBnZXQgPT4gIUdldFhtbE5vZGVCb29sKF9hbGxvd0RlbGV0ZVJvd3NQYXRoLCB0cnVlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX2FsbG93RGVsZXRlUm93c1BhdGgsICF2YWx1ZSwgdHJ1ZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWxsb3dTb3J0UGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9Ac29ydCI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWxsb3cgdXNlcnMgdG8gc29ydCBhIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIEFsbG93U29ydCB7CisgICAgZ2V0ID0+ICFHZXRYbWxOb2RlQm9vbChfYWxsb3dTb3J0UGF0aCwgdHJ1ZSk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKF9hbGxvd1NvcnRQYXRoLCAhdmFsdWUsIHRydWUpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2FsbG93QXV0b0ZpbHRlclBhdGggPSAiZDpzaGVldFByb3RlY3Rpb24vQGF1dG9GaWx0ZXIiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFsbG93IHVzZXJzIHRvIHVzZSBhdXRvZmlsdGVycworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBBbGxvd0F1dG9GaWx0ZXIgeworICAgIGdldCA9PiAhR2V0WG1sTm9kZUJvb2woX2FsbG93QXV0b0ZpbHRlclBhdGgsIHRydWUpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbChfYWxsb3dBdXRvRmlsdGVyUGF0aCwgIXZhbHVlLCB0cnVlKTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9hbGxvd1Bpdm90VGFibGVzUGF0aCA9ICJkOnNoZWV0UHJvdGVjdGlvbi9AcGl2b3RUYWJsZXMiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFsbG93IHVzZXJzIHRvIHVzZSBwaXZvdHRhYmxlcworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBBbGxvd1Bpdm90VGFibGVzIHsKKyAgICBnZXQgPT4gIUdldFhtbE5vZGVCb29sKF9hbGxvd1Bpdm90VGFibGVzUGF0aCwgdHJ1ZSk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKF9hbGxvd1Bpdm90VGFibGVzUGF0aCwgIXZhbHVlLCB0cnVlKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsU3R5bGVDb2xsZWN0aW9uLmNzIGIvRVBQbHVzL0V4Y2VsU3R5bGVDb2xsZWN0aW9uLmNzCmluZGV4IGRhNDA4ZmUuLjZjYTc2ZjkgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9FeGNlbFN0eWxlQ29sbGVjdGlvbi5jcworKysgYi9FUFBsdXMvRXhjZWxTdHlsZUNvbGxlY3Rpb24uY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDEzMiArMTMsMTE0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCiAgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIFN5c3RlbS5MaW5xOwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEJhc2UgY29sbGVjdGlvbiBjbGFzcyBmb3Igc3R5bGVzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIHN0eWxlIHR5cGU8L3R5cGVwYXJhbT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxTdHlsZUNvbGxlY3Rpb248VD4gOiBJRW51bWVyYWJsZTxUPgotICAgIHsKLSAgICAgICAgcHVibGljIEV4Y2VsU3R5bGVDb2xsZWN0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3NldE5leHRJZE1hbnVhbCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgX3NldE5leHRJZE1hbnVhbDsKLSAgICAgICAgcHVibGljIEV4Y2VsU3R5bGVDb2xsZWN0aW9uKGJvb2wgU2V0TmV4dElkTWFudWFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc2V0TmV4dElkTWFudWFsID0gU2V0TmV4dElkTWFudWFsOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBYbWxOb2RlIFRvcE5vZGUgeyBnZXQ7IHNldDsgfQotICAgICAgICBpbnRlcm5hbCBMaXN0PFQ+IF9saXN0ID0gbmV3IExpc3Q8VD4oKTsKLSAgICAgICAgRGljdGlvbmFyeTxzdHJpbmcsIGludD4gX2RpYyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgaW50PihTdHJpbmdDb21wYXJlci5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSk7Ci0gICAgICAgIGludGVybmFsIGludCBOZXh0SWQ9MDsKLSAgICAgICAgI3JlZ2lvbiBJRW51bWVyYWJsZTxUPiBNZW1iZXJzCiAKLSAgICAgICAgcHVibGljIElFbnVtZXJhdG9yPFQ+IEdldEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbDsKIAotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgICNyZWdpb24gSUVudW1lcmFibGUgTWVtYmVycworLy8vIDxzdW1tYXJ5PgorLy8vIEJhc2UgY29sbGVjdGlvbiBjbGFzcyBmb3Igc3R5bGVzLgorLy8vIDwvc3VtbWFyeT4KKy8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSBzdHlsZSB0eXBlPC90eXBlcGFyYW0+CitwdWJsaWMgY2xhc3MgRXhjZWxTdHlsZUNvbGxlY3Rpb248VD4gOiBJRW51bWVyYWJsZTxUPiB7CisgIHB1YmxpYyBFeGNlbFN0eWxlQ29sbGVjdGlvbigpIHsKKyAgICBfc2V0TmV4dElkTWFudWFsID0gZmFsc2U7CisgIH0KIAotICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgcHVibGljIFQgdGhpc1tpbnQgUG9zaXRpb25JRF0KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9saXN0W1Bvc2l0aW9uSURdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBpbnQgQ291bnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9saXN0LkNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vaW50ZXJuYWwgaW50IEFkZChUIGl0ZW0pCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBfbGlzdC5BZGQoaXRlbSk7Ci0gICAgICAgIC8vICAgIGlmIChfc2V0TmV4dElkTWFudWFsKSBOZXh0SWQrKzsKLSAgICAgICAgLy8gICAgcmV0dXJuIF9saXN0LkNvdW50LTE7Ci0gICAgICAgIC8vfQotICAgICAgICBpbnRlcm5hbCBpbnQgQWRkKHN0cmluZyBrZXksIFQgaXRlbSkKLSAgICAgICAgewotICAgICAgICAgICAgX2xpc3QuQWRkKGl0ZW0pOwotICAgICAgICAgICAgaWYgKCFfZGljLkNvbnRhaW5zS2V5KGtleS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKSkgX2RpYy5BZGQoa2V5LlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSksIF9saXN0LkNvdW50IC0gMSk7Ci0gICAgICAgICAgICBpZiAoX3NldE5leHRJZE1hbnVhbCkgTmV4dElkKys7Ci0gICAgICAgICAgICByZXR1cm4gX2xpc3QuQ291bnQtMTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGaW5kcyB0aGUga2V5IAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImtleSI+dGhlIGtleSB0byBiZSBmb3VuZDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2JqIj5UaGUgZm91bmQgb2JqZWN0LjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UcnVlIGlmIGZvdW5kPC9yZXR1cm5zPgotICAgICAgICBpbnRlcm5hbCBib29sIEZpbmRCeUlEKHN0cmluZyBrZXksIHJlZiBUIG9iaikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9kaWMuQ29udGFpbnNLZXkoa2V5KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvYmogPSBfbGlzdFtfZGljW2tleS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpXV07Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZpbmQgSW5kZXgKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJrZXkiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIGludGVybmFsIGludCBGaW5kSW5kZXhCeUlEKHN0cmluZyBrZXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfZGljLkNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9kaWNba2V5XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaW50Lk1pblZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGJvb2wgRXhpc3RzS2V5KHN0cmluZyBrZXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfZGljLkNvbnRhaW5zS2V5KGtleSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBTb3J0KENvbXBhcmlzb248VD4gYykKLSAgICAgICAgewotICAgICAgICAgICAgX2xpc3QuU29ydChjKTsKLSAgICAgICAgfQorICBwcml2YXRlIGJvb2wgX3NldE5leHRJZE1hbnVhbDsKKworICBwdWJsaWMgRXhjZWxTdHlsZUNvbGxlY3Rpb24oYm9vbCBzZXROZXh0SWRNYW51YWwpIHsKKyAgICBfc2V0TmV4dElkTWFudWFsID0gc2V0TmV4dElkTWFudWFsOworICB9CisKKyAgcHVibGljIFhtbE5vZGUgVG9wTm9kZSB7IGdldDsgc2V0OyB9CisKKyAgaW50ZXJuYWwgTGlzdDxUPiBfbGlzdCA9IG5ldygpOworICBwcml2YXRlIERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+IF9kaWMgPSBuZXcoU3RyaW5nQ29tcGFyZXIuSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpOworICBpbnRlcm5hbCBpbnQgTmV4dElkOworCisgIHB1YmxpYyBJRW51bWVyYXRvcjxUPiBHZXRFbnVtZXJhdG9yKCkgeworICAgIHJldHVybiBfbGlzdC5HZXRFbnVtZXJhdG9yKCk7CisgIH0KKworICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkgeworICAgIHJldHVybiBfbGlzdC5HZXRFbnVtZXJhdG9yKCk7CisgIH0KKworICBwdWJsaWMgVCB0aGlzW2ludCBwb3NpdGlvbklkXSA9PiBfbGlzdFtwb3NpdGlvbklkXTsKKworICBwdWJsaWMgaW50IENvdW50IHsKKyAgICBnZXQgeyByZXR1cm4gX2xpc3QuQ291bnQ7IH0KKyAgfQorCisgIC8vaW50ZXJuYWwgaW50IEFkZChUIGl0ZW0pCisgIC8veworICAvLyAgICBfbGlzdC5BZGQoaXRlbSk7CisgIC8vICAgIGlmIChfc2V0TmV4dElkTWFudWFsKSBOZXh0SWQrKzsKKyAgLy8gICAgcmV0dXJuIF9saXN0LkNvdW50LTE7CisgIC8vfQorICBpbnRlcm5hbCBpbnQgQWRkKHN0cmluZyBrZXksIFQgaXRlbSkgeworICAgIF9saXN0LkFkZChpdGVtKTsKKyAgICBpZiAoIV9kaWMuQ29udGFpbnNLZXkoa2V5LlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpKSB7CisgICAgICBfZGljLkFkZChrZXkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSwgX2xpc3QuQ291bnQgLSAxKTsKICAgICB9CisgICAgaWYgKF9zZXROZXh0SWRNYW51YWwpIHsKKyAgICAgIE5leHRJZCsrOworICAgIH0KKyAgICByZXR1cm4gX2xpc3QuQ291bnQgLSAxOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRmluZHMgdGhlIGtleQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImtleSI+dGhlIGtleSB0byBiZSBmb3VuZDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ib2JqIj5UaGUgZm91bmQgb2JqZWN0LjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UcnVlIGlmIGZvdW5kPC9yZXR1cm5zPgorICBpbnRlcm5hbCBib29sIEZpbmRCeUlkKHN0cmluZyBrZXksIHJlZiBUIG9iaikgeworICAgIGlmIChfZGljLkNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgIG9iaiA9IF9saXN0W19kaWNba2V5LlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSldXTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBGaW5kIEluZGV4CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ia2V5Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBpbnRlcm5hbCBpbnQgRmluZEluZGV4QnlJZChzdHJpbmcga2V5KSB7CisgICAgaWYgKF9kaWMuQ29udGFpbnNLZXkoa2V5KSkgeworICAgICAgcmV0dXJuIF9kaWNba2V5XTsKKyAgICB9CisgICAgcmV0dXJuIGludC5NaW5WYWx1ZTsKKyAgfQorCisgIGludGVybmFsIGJvb2wgRXhpc3RzS2V5KHN0cmluZyBrZXkpIHsKKyAgICByZXR1cm4gX2RpYy5Db250YWluc0tleShrZXkpOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBTb3J0KENvbXBhcmlzb248VD4gYykgeworICAgIF9saXN0LlNvcnQoYyk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFN0eWxlcy5jcyBiL0VQUGx1cy9FeGNlbFN0eWxlcy5jcwppbmRleCBjZmFlZDRkLi4wODYxODlkIDEwMDY0NAotLS0gYS9FUFBsdXMvRXhjZWxTdHlsZXMuY3MKKysrIGIvRVBQbHVzL0V4Y2VsU3R5bGVzLmNzCkBAIC0xMyw5OTMgKzEzLDg3NyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS++/vWxsbWFuCQkgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBL77+9bGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIFN5c3RlbS5MaW5xOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLkR4ZjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuQ29uZGl0aW9uYWxGb3JtYXR0aW5nOwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIENvbnRhaW50cyBhbGwgc2hhcmVkIGNlbGwgc3R5bGVzIGZvciBhIHdvcmtib29rCi0JLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsU3R5bGVzIDogWG1sSGVscGVyCi0gICAgewotICAgICAgICBjb25zdCBzdHJpbmcgTnVtYmVyRm9ybWF0c1BhdGggPSAiZDpzdHlsZVNoZWV0L2Q6bnVtRm10cyI7Ci0gICAgICAgIGNvbnN0IHN0cmluZyBGb250c1BhdGggPSAiZDpzdHlsZVNoZWV0L2Q6Zm9udHMiOwotICAgICAgICBjb25zdCBzdHJpbmcgRmlsbHNQYXRoID0gImQ6c3R5bGVTaGVldC9kOmZpbGxzIjsKLSAgICAgICAgY29uc3Qgc3RyaW5nIEJvcmRlcnNQYXRoID0gImQ6c3R5bGVTaGVldC9kOmJvcmRlcnMiOwotICAgICAgICBjb25zdCBzdHJpbmcgQ2VsbFN0eWxlWGZzUGF0aCA9ICJkOnN0eWxlU2hlZXQvZDpjZWxsU3R5bGVYZnMiOwotICAgICAgICBjb25zdCBzdHJpbmcgQ2VsbFhmc1BhdGggPSAiZDpzdHlsZVNoZWV0L2Q6Y2VsbFhmcyI7Ci0gICAgICAgIGNvbnN0IHN0cmluZyBDZWxsU3R5bGVzUGF0aCA9ICJkOnN0eWxlU2hlZXQvZDpjZWxsU3R5bGVzIjsKLSAgICAgICAgY29uc3Qgc3RyaW5nIGR4ZnNQYXRoID0gImQ6c3R5bGVTaGVldC9kOmR4ZnMiOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGUuRHhmOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7CiAKLSAgICAgICAgLy9pbnRlcm5hbCBEaWN0aW9uYXJ5PGludCwgRXhjZWxYZnM+IFN0eWxlcyA9IG5ldyBEaWN0aW9uYXJ5PGludCwgRXhjZWxYZnM+KCk7Ci0gICAgICAgIFhtbERvY3VtZW50IF9zdHlsZVhtbDsKLSAgICAgICAgRXhjZWxXb3JrYm9vayBfd2I7Ci0gICAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgX25hbWVTcGFjZU1hbmFnZXI7Ci0gICAgICAgIGludGVybmFsIGludCBfbmV4dERmeE51bUZtdElEID0gMTY0OwotICAgICAgICBpbnRlcm5hbCBFeGNlbFN0eWxlcyhYbWxOYW1lc3BhY2VNYW5hZ2VyIE5hbWVTcGFjZU1hbmFnZXIsIFhtbERvY3VtZW50IHhtbCwgRXhjZWxXb3JrYm9vayB3YikgOgotICAgICAgICAgICAgYmFzZShOYW1lU3BhY2VNYW5hZ2VyLCB4bWwpCi0gICAgICAgIHsgICAgICAgCi0gICAgICAgICAgICBfc3R5bGVYbWw9eG1sOwotICAgICAgICAgICAgX3diID0gd2I7Ci0gICAgICAgICAgICBfbmFtZVNwYWNlTWFuYWdlciA9IE5hbWVTcGFjZU1hbmFnZXI7Ci0gICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAibnVtRm10cyIsICJmb250cyIsICJmaWxscyIsICJib3JkZXJzIiwgImNlbGxTdHlsZVhmcyIsICJjZWxsWGZzIiwgImNlbGxTdHlsZXMiLCAiZHhmcyIgfTsKLSAgICAgICAgICAgIExvYWRGcm9tRG9jdW1lbnQoKTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOworCisvLy8gPHN1bW1hcnk+CisvLy8gQ29udGFpbnRzIGFsbCBzaGFyZWQgY2VsbCBzdHlsZXMgZm9yIGEgd29ya2Jvb2sKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsU3R5bGVzIDogWG1sSGVscGVyIHsKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX251bWJlckZvcm1hdHNQYXRoID0gImQ6c3R5bGVTaGVldC9kOm51bUZtdHMiOworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZm9udHNQYXRoID0gImQ6c3R5bGVTaGVldC9kOmZvbnRzIjsKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2ZpbGxzUGF0aCA9ICJkOnN0eWxlU2hlZXQvZDpmaWxscyI7CisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9ib3JkZXJzUGF0aCA9ICJkOnN0eWxlU2hlZXQvZDpib3JkZXJzIjsKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2NlbGxTdHlsZVhmc1BhdGggPSAiZDpzdHlsZVNoZWV0L2Q6Y2VsbFN0eWxlWGZzIjsKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2NlbGxYZnNQYXRoID0gImQ6c3R5bGVTaGVldC9kOmNlbGxYZnMiOworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfY2VsbFN0eWxlc1BhdGggPSAiZDpzdHlsZVNoZWV0L2Q6Y2VsbFN0eWxlcyI7CisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9keGZzUGF0aCA9ICJkOnN0eWxlU2hlZXQvZDpkeGZzIjsKKworICAvL2ludGVybmFsIERpY3Rpb25hcnk8aW50LCBFeGNlbFhmcz4gU3R5bGVzID0gbmV3IERpY3Rpb25hcnk8aW50LCBFeGNlbFhmcz4oKTsKKyAgcHJpdmF0ZSBYbWxEb2N1bWVudCBfc3R5bGVYbWw7CisgIHByaXZhdGUgRXhjZWxXb3JrYm9vayBfd2I7CisgIHByaXZhdGUgWG1sTmFtZXNwYWNlTWFuYWdlciBfbmFtZVNwYWNlTWFuYWdlcjsKKyAgaW50ZXJuYWwgaW50IF9uZXh0RGZ4TnVtRm10SUQgPSAxNjQ7CisKKyAgaW50ZXJuYWwgRXhjZWxTdHlsZXMoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLCBYbWxEb2N1bWVudCB4bWwsIEV4Y2VsV29ya2Jvb2sgd2IpCisgICAgICA6IGJhc2UobmFtZVNwYWNlTWFuYWdlciwgeG1sKSB7CisgICAgX3N0eWxlWG1sID0geG1sOworICAgIF93YiA9IHdiOworICAgIF9uYW1lU3BhY2VNYW5hZ2VyID0gbmFtZVNwYWNlTWFuYWdlcjsKKyAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXdbXSB7CisgICAgICAibnVtRm10cyIsCisgICAgICAiZm9udHMiLAorICAgICAgImZpbGxzIiwKKyAgICAgICJib3JkZXJzIiwKKyAgICAgICJjZWxsU3R5bGVYZnMiLAorICAgICAgImNlbGxYZnMiLAorICAgICAgImNlbGxTdHlsZXMiLAorICAgICAgImR4ZnMiLAorICAgIH07CisgICAgTG9hZEZyb21Eb2N1bWVudCgpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTG9hZHMgdGhlIHN0eWxlIFhNTCB0byBtZW1vcnkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHJpdmF0ZSB2b2lkIExvYWRGcm9tRG9jdW1lbnQoKSB7CisgICAgLy9OdW1iZXJGb3JtYXRzCisgICAgRXhjZWxOdW1iZXJGb3JtYXRYbWwuQWRkQnVpbGRJbihOYW1lU3BhY2VNYW5hZ2VyLCBOdW1iZXJGb3JtYXRzKTsKKyAgICBYbWxOb2RlIG51bU5vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShfbnVtYmVyRm9ybWF0c1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBpZiAobnVtTm9kZSAhPSBudWxsKSB7CisgICAgICBmb3JlYWNoIChYbWxOb2RlIG4gaW4gbnVtTm9kZSkgeworICAgICAgICBFeGNlbE51bWJlckZvcm1hdFhtbCBuZiA9IG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChfbmFtZVNwYWNlTWFuYWdlciwgbik7CisgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKG5mLklkLCBuZik7CisgICAgICAgIGlmIChuZi5OdW1GbXRJZCA+PSBOdW1iZXJGb3JtYXRzLk5leHRJZCkgeworICAgICAgICAgIE51bWJlckZvcm1hdHMuTmV4dElkID0gbmYuTnVtRm10SWQgKyAxOwogICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIExvYWRzIHRoZSBzdHlsZSBYTUwgdG8gbWVtb3J5Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBMb2FkRnJvbURvY3VtZW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9OdW1iZXJGb3JtYXRzCi0gICAgICAgICAgICBFeGNlbE51bWJlckZvcm1hdFhtbC5BZGRCdWlsZEluKE5hbWVTcGFjZU1hbmFnZXIsIE51bWJlckZvcm1hdHMpOwotICAgICAgICAgICAgWG1sTm9kZSBudW1Ob2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoTnVtYmVyRm9ybWF0c1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGlmIChudW1Ob2RlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBuIGluIG51bU5vZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFeGNlbE51bWJlckZvcm1hdFhtbCBuZiA9IG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChfbmFtZVNwYWNlTWFuYWdlciwgbik7Ci0gICAgICAgICAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKG5mLklkLCBuZik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZi5OdW1GbXRJZCA+PSBOdW1iZXJGb3JtYXRzLk5leHRJZCkgTnVtYmVyRm9ybWF0cy5OZXh0SWQ9bmYuTnVtRm10SWQrMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vRm9udHMKLSAgICAgICAgICAgIFhtbE5vZGUgZm9udE5vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShGb250c1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbiBpbiBmb250Tm9kZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeGNlbEZvbnRYbWwgZiA9IG5ldyBFeGNlbEZvbnRYbWwoX25hbWVTcGFjZU1hbmFnZXIsIG4pOwotICAgICAgICAgICAgICAgIEZvbnRzLkFkZChmLklkLCBmKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9GaWxscwotICAgICAgICAgICAgWG1sTm9kZSBmaWxsTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKEZpbGxzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBuIGluIGZpbGxOb2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEV4Y2VsRmlsbFhtbCBmOwotICAgICAgICAgICAgICAgIGlmIChuLkZpcnN0Q2hpbGQgIT0gbnVsbCAmJiBuLkZpcnN0Q2hpbGQuTG9jYWxOYW1lID09ICJncmFkaWVudEZpbGwiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZiA9IG5ldyBFeGNlbEdyYWRpZW50RmlsbFhtbChfbmFtZVNwYWNlTWFuYWdlciwgbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGYgPSBuZXcgRXhjZWxGaWxsWG1sKF9uYW1lU3BhY2VNYW5hZ2VyLCBuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRmlsbHMuQWRkKGYuSWQsIGYpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL0JvcmRlcnMKLSAgICAgICAgICAgIFhtbE5vZGUgYm9yZGVyTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKEJvcmRlcnNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICBmb3JlYWNoIChYbWxOb2RlIG4gaW4gYm9yZGVyTm9kZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeGNlbEJvcmRlclhtbCBiID0gbmV3IEV4Y2VsQm9yZGVyWG1sKF9uYW1lU3BhY2VNYW5hZ2VyLCBuKTsKLSAgICAgICAgICAgICAgICBCb3JkZXJzLkFkZChiLklkLCBiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9jZWxsU3R5bGVYZnMKLSAgICAgICAgICAgIFhtbE5vZGUgc3R5bGVYZnNOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoQ2VsbFN0eWxlWGZzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgaWYgKHN0eWxlWGZzTm9kZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbiBpbiBzdHlsZVhmc05vZGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFeGNlbFhmcyBpdGVtID0gbmV3IEV4Y2VsWGZzKF9uYW1lU3BhY2VNYW5hZ2VyLCBuLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgQ2VsbFN0eWxlWGZzLkFkZChpdGVtLklkLCBpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFhtbE5vZGUgc3R5bGVOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoQ2VsbFhmc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3R5bGVOb2RlLkNoaWxkTm9kZXMuQ291bnQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxOb2RlIG4gPSBzdHlsZU5vZGUuQ2hpbGROb2Rlc1tpXTsKLSAgICAgICAgICAgICAgICBFeGNlbFhmcyBpdGVtID0gbmV3IEV4Y2VsWGZzKF9uYW1lU3BhY2VNYW5hZ2VyLCBuLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBDZWxsWGZzLkFkZChpdGVtLklkLCBpdGVtKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9jZWxsU3R5bGUKLSAgICAgICAgICAgIFhtbE5vZGUgbmFtZWRTdHlsZU5vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShDZWxsU3R5bGVzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgaWYgKG5hbWVkU3R5bGVOb2RlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBuIGluIG5hbWVkU3R5bGVOb2RlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRXhjZWxOYW1lZFN0eWxlWG1sIGl0ZW0gPSBuZXcgRXhjZWxOYW1lZFN0eWxlWG1sKF9uYW1lU3BhY2VNYW5hZ2VyLCBuLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgTmFtZWRTdHlsZXMuQWRkKGl0ZW0uTmFtZSwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL2R4ZnNQYXRoCi0gICAgICAgICAgICBYbWxOb2RlIGR4ZnNOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoZHhmc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGlmIChkeGZzTm9kZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgeCBpbiBkeGZzTm9kZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEV4Y2VsRHhmU3R5bGVDb25kaXRpb25hbEZvcm1hdHRpbmcgaXRlbSA9IG5ldyBFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nKF9uYW1lU3BhY2VNYW5hZ2VyLCB4LCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgRHhmcy5BZGQoaXRlbS5JZCwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsU3R5bGUgR2V0U3R5bGVPYmplY3QoaW50IElkLGludCBQb3NpdGlvbklELCBzdHJpbmcgQWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKElkIDwgMCkgSWQgPSAwOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFN0eWxlKHRoaXMsIFByb3BlcnR5Q2hhbmdlLCBQb3NpdGlvbklELCBBZGRyZXNzLCBJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSGFuZGVscyBjaGFuZ2VzIG9mIHByb3BlcnRpZXMgb24gdGhlIHN0eWxlIG9iamVjdHMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZW5kZXIiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgaW50IFByb3BlcnR5Q2hhbmdlKFN0eWxlQmFzZSBzZW5kZXIsIFN0eWxlLlN0eWxlQ2hhbmdlRXZlbnRBcmdzIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoZS5BZGRyZXNzKTsKLSAgICAgICAgICAgIHZhciB3cyA9IF93Yi5Xb3Jrc2hlZXRzW2UuUG9zaXRpb25JRF07Ci0gICAgICAgICAgICBEaWN0aW9uYXJ5PGludCwgaW50PiBzdHlsZUNhc2hlID0gbmV3IERpY3Rpb25hcnk8aW50LCBpbnQ+KCk7Ci0gICAgICAgICAgICAvL1NldCBzaW5nbGUgYWRkcmVzcwotICAgICAgICAgICAgbG9jayAod3MuX3N0eWxlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRTdHlsZUFkZHJlc3Moc2VuZGVyLCBlLCBhZGRyZXNzLCB3cywgcmVmIHN0eWxlQ2FzaGUpOwotICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLkFkZHJlc3NlcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9IYW5kbGUgbXVsdGlhZGRyZXNzZXMKLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGlubmVyQWRkcmVzcyBpbiBhZGRyZXNzLkFkZHJlc3NlcykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgU2V0U3R5bGVBZGRyZXNzKHNlbmRlciwgZSwgaW5uZXJBZGRyZXNzLCB3cywgcmVmIHN0eWxlQ2FzaGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgU2V0U3R5bGVBZGRyZXNzKFN0eWxlQmFzZSBzZW5kZXIsIFN0eWxlLlN0eWxlQ2hhbmdlRXZlbnRBcmdzIGUsIEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcywgRXhjZWxXb3Jrc2hlZXQgd3MsIHJlZiBEaWN0aW9uYXJ5PGludCwgaW50PiBzdHlsZUNhc2hlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYWRkcmVzcy5TdGFydC5Db2x1bW4gPT0gMCB8fCBhZGRyZXNzLlN0YXJ0LlJvdyA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJlcnJvciBhZGRyZXNzIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9Db2x1bW5zCi0gICAgICAgICAgICBlbHNlIGlmIChhZGRyZXNzLlN0YXJ0LlJvdyA9PSAxICYmIGFkZHJlc3MuRW5kLlJvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeGNlbENvbHVtbiBjb2x1bW47Ci0gICAgICAgICAgICAgICAgaW50IGNvbCA9IGFkZHJlc3MuU3RhcnQuQ29sdW1uLCByb3cgPSAwOwotICAgICAgICAgICAgICAgIC8vR2V0IHRoZSBzdGFydGNvbHVtbgotICAgICAgICAgICAgICAgIGlmICghd3MuX3ZhbHVlcy5FeGlzdHMoMCwgYWRkcmVzcy5TdGFydC5Db2x1bW4pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gd3MuQ29sdW1uKGFkZHJlc3MuU3RhcnQuQ29sdW1uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gKEV4Y2VsQ29sdW1uKXdzLl92YWx1ZXMuR2V0VmFsdWUoMCwgYWRkcmVzcy5TdGFydC5Db2x1bW4pOwotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGNvbHVtbi5Db2x1bW5NaW4gPD0gYWRkcmVzcy5FbmQuQ29sdW1uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbHVtbi5Db2x1bW5NYXggPiBhZGRyZXNzLkVuZC5Db2x1bW4pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdDb2wgPSB3cy5Db3B5Q29sdW1uKGNvbHVtbiwgYWRkcmVzcy5FbmQuQ29sdW1uICsgMSwgY29sdW1uLkNvbHVtbk1heCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uQ29sdW1uTWF4ID0gYWRkcmVzcy5FbmQuQ29sdW1uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZhciBzID0gd3MuX3N0eWxlcy5HZXRWYWx1ZSgwLCBjb2x1bW4uQ29sdW1uTWluKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlQ2FzaGUuQ29udGFpbnNLZXkocykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzLlNldFN0eWxlKDAsIGNvbHVtbi5Db2x1bW5NaW4sIHN0eWxlQ2FzaGVbc10pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxYZnMgc3QgPSBDZWxsWGZzW3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld0lkID0gc3QuR2V0TmV3SUQoQ2VsbFhmcywgc2VuZGVyLCBlLlN0eWxlQ2xhc3MsIGUuU3R5bGVQcm9wZXJ0eSwgZS5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNhc2hlLkFkZChzLCBuZXdJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cy5TZXRTdHlsZSgwLCBjb2x1bW4uQ29sdW1uTWluLCBuZXdJZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvL2luZGV4Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCF3cy5fdmFsdWVzLk5leHRDZWxsKHJlZiByb3csIHJlZiBjb2wpIHx8IHJvdyA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbi5fY29sdW1uTWF4ID0gYWRkcmVzcy5FbmQuQ29sdW1uOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAod3MuX3ZhbHVlcy5HZXRWYWx1ZSgwLCBjb2wpIGFzIEV4Y2VsQ29sdW1uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uX2NvbHVtbk1heCA8IGFkZHJlc3MuRW5kLkNvbHVtbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBuZXdDb2wgPSB3cy5Db2x1bW4oY29sdW1uLl9jb2x1bW5NYXggKyAxKSBhcyBFeGNlbENvbHVtbjsKLSAgICAgICAgICAgICAgICAgICAgbmV3Q29sLl9jb2x1bW5NYXggPSBhZGRyZXNzLkVuZC5Db2x1bW47Ci0KLSAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB3cy5fc3R5bGVzLkdldFZhbHVlKDAsIGNvbHVtbi5Db2x1bW5NaW4pOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVDYXNoZS5Db250YWluc0tleShzKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgd3MuU2V0U3R5bGUoMCwgY29sdW1uLkNvbHVtbk1pbiwgc3R5bGVDYXNoZVtzXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFeGNlbFhmcyBzdCA9IENlbGxYZnNbc107Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3SWQgPSBzdC5HZXROZXdJRChDZWxsWGZzLCBzZW5kZXIsIGUuU3R5bGVDbGFzcywgZS5TdHlsZVByb3BlcnR5LCBlLlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2FzaGUuQWRkKHMsIG5ld0lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzLlNldFN0eWxlKDAsIGNvbHVtbi5Db2x1bW5NaW4sIG5ld0lkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5fY29sdW1uTWF4ID0gYWRkcmVzcy5FbmQuQ29sdW1uOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vU2V0IGZvciBpbmRpdmlkdWFsIGNlbGxzIGluIHRoZSBzcGFuLiBXZSBsb29wIGFsbCBjZWxscyBoZXJlIHNpbmNlIHRoZSBjZWxscyBhcmUgc29ydGVkIHdpdGggY29sdW1ucyBmaXJzdC4KLSAgICAgICAgICAgICAgICB2YXIgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPGludD4od3MuX3N0eWxlcywgMSwgYWRkcmVzcy5fZnJvbUNvbCwgYWRkcmVzcy5fdG9Sb3csIGFkZHJlc3MuX3RvQ29sKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoY3NlLk5leHQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjc2UuQ29sdW1uID49IGFkZHJlc3MuU3RhcnQuQ29sdW1uICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBjc2UuQ29sdW1uIDw9IGFkZHJlc3MuRW5kLkNvbHVtbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlQ2FzaGUuQ29udGFpbnNLZXkoY3NlLlZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cy5TZXRTdHlsZShjc2UuUm93LCBjc2UuQ29sdW1uLCBzdHlsZUNhc2hlW2NzZS5WYWx1ZV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsWGZzIHN0ID0gQ2VsbFhmc1tjc2UuVmFsdWVdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdJZCA9IHN0LkdldE5ld0lEKENlbGxYZnMsIHNlbmRlciwgZS5TdHlsZUNsYXNzLCBlLlN0eWxlUHJvcGVydHksIGUuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2FzaGUuQWRkKGNzZS5WYWx1ZSwgbmV3SWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzZS5WYWx1ZSA9IG5ld0lkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vd3MuU2V0U3R5bGUoY3NlLlJvdywgY3NlLkNvbHVtbiwgbmV3SWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9VcGRhdGUgY2VsbHMgd2l0aCBzdHlsZWQgY29sdW1ucwotICAgICAgICAgICAgICAgIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxpbnQ+KHdzLl9zdHlsZXMsIDEsIDAsIGFkZHJlc3MuX3RvUm93LCAwKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoY3NlLk5leHQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGMgPSBhZGRyZXNzLl9mcm9tUm93OyBjIDw9IGFkZHJlc3MuX3RvQ29sOyBjKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd3MuX3N0eWxlcy5FeGlzdHMoY3NlLlJvdywgYykpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlQ2FzaGUuQ29udGFpbnNLZXkoY3NlLlZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzLlNldFN0eWxlKGNzZS5Sb3csIGMsIHN0eWxlQ2FzaGVbY3NlLlZhbHVlXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsWGZzIHN0ID0gQ2VsbFhmc1tjc2UuVmFsdWVdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3SWQgPSBzdC5HZXROZXdJRChDZWxsWGZzLCBzZW5kZXIsIGUuU3R5bGVDbGFzcywgZS5TdHlsZVByb3BlcnR5LCBlLlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDYXNoZS5BZGQoY3NlLlZhbHVlLCBuZXdJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzLlNldFN0eWxlKGNzZS5Sb3csIGMsIG5ld0lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vUm93cwotICAgICAgICAgICAgZWxzZSBpZiAoYWRkcmVzcy5TdGFydC5Db2x1bW4gPT0gMSAmJiBhZGRyZXNzLkVuZC5Db2x1bW4gPT0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgcm93TnVtID0gYWRkcmVzcy5TdGFydC5Sb3c7IHJvd051bSA8PSBhZGRyZXNzLkVuZC5Sb3c7IHJvd051bSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSB3cy5fc3R5bGVzLkdldFZhbHVlKHJvd051bSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzID09IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaXRlcmF0ZSBhbGwgY29sdW1ucyBhbmQgc2V0IHRoZSByb3cgdG8gdGhlIHN0eWxlIG9mIHRoZSBsYXN0IGNvbHVtbgotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxpbnQ+KHdzLl9zdHlsZXMsIDAsIDEsIDAsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjc2UuTmV4dCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBjc2UuVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSB3cy5fdmFsdWVzLkdldFZhbHVlKGNzZS5Sb3csIGNzZS5Db2x1bW4pIGFzIEV4Y2VsQ29sdW1uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5Db2x1bW5NYXggPCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGMuQ29sdW1uTWluOyBjb2wgPCBjLkNvbHVtbk1heDsgY29sKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghd3MuX3N0eWxlcy5FeGlzdHMocm93TnVtLCBjb2wpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzLl9zdHlsZXMuU2V0VmFsdWUocm93TnVtLCBjb2wsIHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgd3MuU2V0U3R5bGUocm93TnVtLCAwLCBzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVDYXNoZS5Db250YWluc0tleShzKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgd3MuU2V0U3R5bGUocm93TnVtLCAwLCBzdHlsZUNhc2hlW3NdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsWGZzIHN0ID0gQ2VsbFhmc1tzXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdJZCA9IHN0LkdldE5ld0lEKENlbGxYZnMsIHNlbmRlciwgZS5TdHlsZUNsYXNzLCBlLlN0eWxlUHJvcGVydHksIGUuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDYXNoZS5BZGQocywgbmV3SWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgd3MuX3N0eWxlcy5TZXRWYWx1ZShyb3dOdW0sIDAsIG5ld0lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzLlNldFN0eWxlKHJvd051bSwgMCwgbmV3SWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9VcGRhdGUgaW5kaXZpZHVhbCBjZWxscyAKLSAgICAgICAgICAgICAgICB2YXIgY3NlMiA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxpbnQ+KHdzLl9zdHlsZXMsIGFkZHJlc3MuX2Zyb21Sb3csIGFkZHJlc3MuX2Zyb21Db2wsIGFkZHJlc3MuX3RvUm93LCBhZGRyZXNzLl90b0NvbCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGNzZTIuTmV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBjc2UyLlZhbHVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVDYXNoZS5Db250YWluc0tleShzKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgd3MuU2V0U3R5bGUoY3NlMi5Sb3csIGNzZTIuQ29sdW1uLCBzdHlsZUNhc2hlW3NdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsWGZzIHN0ID0gQ2VsbFhmc1tzXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdJZCA9IHN0LkdldE5ld0lEKENlbGxYZnMsIHNlbmRlciwgZS5TdHlsZUNsYXNzLCBlLlN0eWxlUHJvcGVydHksIGUuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVDYXNoZS5BZGQocywgbmV3SWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3NlMi5WYWx1ZSA9IG5ld0lkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9VcGRhdGUgY2VsbHMgd2l0aCBzdHlsZWQgcm93cwotICAgICAgICAgICAgICAgIGNzZTIgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50Pih3cy5fc3R5bGVzLCAwLCAxLCAwLCBhZGRyZXNzLl90b0NvbCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGNzZTIuTmV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgciA9IGFkZHJlc3MuX2Zyb21Sb3c7IHIgPD0gYWRkcmVzcy5fdG9Sb3c7IHIrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF3cy5fc3R5bGVzLkV4aXN0cyhyLCBjc2UyLkNvbHVtbikpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBjc2UyLlZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZUNhc2hlLkNvbnRhaW5zS2V5KHMpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3MuU2V0U3R5bGUociwgY3NlMi5Db2x1bW4sIHN0eWxlQ2FzaGVbc10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbFhmcyBzdCA9IENlbGxYZnNbc107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdJZCA9IHN0LkdldE5ld0lEKENlbGxYZnMsIHNlbmRlciwgZS5TdHlsZUNsYXNzLCBlLlN0eWxlUHJvcGVydHksIGUuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUNhc2hlLkFkZChzLCBuZXdJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzLlNldFN0eWxlKHIsIGNzZTIuQ29sdW1uLCBuZXdJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAvL0NlbGxyYW5nZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGFkZHJlc3MuU3RhcnQuQ29sdW1uOyBjb2wgPD0gYWRkcmVzcy5FbmQuQ29sdW1uOyBjb2wrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IGFkZHJlc3MuU3RhcnQuUm93OyByb3cgPD0gYWRkcmVzcy5FbmQuUm93OyByb3crKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBHZXRTdHlsZUlkKHdzLCByb3csIGNvbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVDYXNoZS5Db250YWluc0tleShzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cy5TZXRTdHlsZShyb3csIGNvbCwgc3R5bGVDYXNoZVtzXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxYZnMgc3QgPSBDZWxsWGZzW3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdJZCA9IHN0LkdldE5ld0lEKENlbGxYZnMsIHNlbmRlciwgZS5TdHlsZUNsYXNzLCBlLlN0eWxlUHJvcGVydHksIGUuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2FzaGUuQWRkKHMsIG5ld0lkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cy5TZXRTdHlsZShyb3csIGNvbCwgbmV3SWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgaW50IEdldFN0eWxlSWQoRXhjZWxXb3Jrc2hlZXQgd3MsIGludCByb3csIGludCBjb2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCB2PTA7Ci0gICAgICAgICAgICBpZiAod3MuX3N0eWxlcy5FeGlzdHMocm93LCBjb2wsIHJlZiB2KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAod3MuX3N0eWxlcy5FeGlzdHMocm93LCAwLCByZWYgdikpIC8vRmlyc3QgUm93Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAvLyB0aGVuIGNvbHVtbgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdzLl9zdHlsZXMuRXhpc3RzKDAsIGNvbCwgcmVmIHYpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHI9MCxjPWNvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdzLl92YWx1ZXMuUHJldkNlbGwocmVmIHIscmVmIGMpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW49d3MuX3ZhbHVlcy5HZXRWYWx1ZSgwLGMpIGFzIEV4Y2VsQ29sdW1uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW4gIT0gbnVsbCAmJiBjb2x1bW4uQ29sdW1uTWF4ID49IGNvbCkgLy9GaXhlcyBpc3N1ZSAxNTE3NAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdzLl9zdHlsZXMuR2V0VmFsdWUoMCwgYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSGFuZGxlcyBwcm9wZXJ0eSBjaGFuZ2VzIG9uIE5hbWVkIHN0eWxlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZW5kZXIiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgaW50IE5hbWVkU3R5bGVQcm9wZXJ0eUNoYW5nZShTdHlsZUJhc2Ugc2VuZGVyLCBTdHlsZS5TdHlsZUNoYW5nZUV2ZW50QXJncyBlKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGludCBpbmRleCA9IE5hbWVkU3R5bGVzLkZpbmRJbmRleEJ5SUQoZS5BZGRyZXNzKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBuZXdJZCA9IENlbGxTdHlsZVhmc1tOYW1lZFN0eWxlc1tpbmRleF0uU3R5bGVYZklkXS5HZXROZXdJRChDZWxsU3R5bGVYZnMsIHNlbmRlciwgZS5TdHlsZUNsYXNzLCBlLlN0eWxlUHJvcGVydHksIGUuVmFsdWUpOwotICAgICAgICAgICAgICAgIGludCBwcmV2SXg9TmFtZWRTdHlsZXNbaW5kZXhdLlN0eWxlWGZJZDsKLSAgICAgICAgICAgICAgICBOYW1lZFN0eWxlc1tpbmRleF0uU3R5bGVYZklkID0gbmV3SWQ7Ci0gICAgICAgICAgICAgICAgTmFtZWRTdHlsZXNbaW5kZXhdLlN0eWxlLkluZGV4ID0gbmV3SWQ7Ci0KLSAgICAgICAgICAgICAgICBOYW1lZFN0eWxlc1tpbmRleF0uWGZJZCA9IGludC5NaW5WYWx1ZTsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgc3R5bGUgaW4gQ2VsbFhmcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZS5YZklkID09IHByZXZJeCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuWGZJZCA9IG5ld0lkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsTnVtYmVyRm9ybWF0WG1sPiBOdW1iZXJGb3JtYXRzID0gbmV3IEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsTnVtYmVyRm9ybWF0WG1sPigpOwotICAgICAgICBwdWJsaWMgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxGb250WG1sPiBGb250cyA9IG5ldyBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbEZvbnRYbWw+KCk7Ci0gICAgICAgIHB1YmxpYyBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbEZpbGxYbWw+IEZpbGxzID0gbmV3IEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsRmlsbFhtbD4oKTsKLSAgICAgICAgcHVibGljIEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsQm9yZGVyWG1sPiBCb3JkZXJzID0gbmV3IEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsQm9yZGVyWG1sPigpOwotICAgICAgICBwdWJsaWMgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxYZnM+IENlbGxTdHlsZVhmcyA9IG5ldyBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbFhmcz4oKTsKLSAgICAgICAgcHVibGljIEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsWGZzPiBDZWxsWGZzID0gbmV3IEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsWGZzPigpOwotICAgICAgICBwdWJsaWMgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxOYW1lZFN0eWxlWG1sPiBOYW1lZFN0eWxlcyA9IG5ldyBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbE5hbWVkU3R5bGVYbWw+KCk7Ci0gICAgICAgIHB1YmxpYyBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nPiBEeGZzID0gbmV3IEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsRHhmU3R5bGVDb25kaXRpb25hbEZvcm1hdHRpbmc+KCk7Ci0gICAgICAgIAotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgSWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuICIiOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRXhjZWxOYW1lZFN0eWxlWG1sIENyZWF0ZU5hbWVkU3R5bGUoc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVOYW1lZFN0eWxlKG5hbWUsIG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBFeGNlbE5hbWVkU3R5bGVYbWwgQ3JlYXRlTmFtZWRTdHlsZShzdHJpbmcgbmFtZSwgRXhjZWxTdHlsZSBUZW1wbGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF93Yi5TdHlsZXMuTmFtZWRTdHlsZXMuRXhpc3RzS2V5KG5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiS2V5IHswfSBhbHJlYWR5IGV4aXN0cyBpbiBjb2xsZWN0aW9uIiwgbmFtZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBFeGNlbE5hbWVkU3R5bGVYbWwgc3R5bGU7Ci0gICAgICAgICAgICBzdHlsZSA9IG5ldyBFeGNlbE5hbWVkU3R5bGVYbWwoTmFtZVNwYWNlTWFuYWdlciwgdGhpcyk7Ci0gICAgICAgICAgICBpbnQgeGZJZENvcHksIHBvc2l0aW9uSUQ7Ci0gICAgICAgICAgICBFeGNlbFN0eWxlcyBzdHlsZXM7Ci0gICAgICAgICAgICBpZiAoVGVtcGxhdGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgIHN0eWxlLlN0eWxlID0gbmV3IEV4Y2VsU3R5bGUodGhpcywgTmFtZWRTdHlsZVByb3BlcnR5Q2hhbmdlLCAtMSwgbmFtZSwgMCk7Ci0gICAgICAgICAgICAgICAgeGZJZENvcHkgPSAwOwotICAgICAgICAgICAgICAgIHBvc2l0aW9uSUQgPSAtMTsKLSAgICAgICAgICAgICAgICBzdHlsZXMgPSB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChUZW1wbGF0ZS5Qb3NpdGlvbklEIDwgMCAmJiBUZW1wbGF0ZS5TdHlsZXM9PXRoaXMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4ZklkQ29weSA9IFRlbXBsYXRlLkluZGV4OwotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbklEPVRlbXBsYXRlLlBvc2l0aW9uSUQ7Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlcyA9IHRoaXM7Ci0gICAgICAgICAgICAgICAgICAgIC8vc3R5bGUuU3R5bGUgPSBuZXcgRXhjZWxTdHlsZSh0aGlzLCBOYW1lZFN0eWxlUHJvcGVydHlDaGFuZ2UsIFRlbXBsYXRlLlBvc2l0aW9uSUQsIG5hbWUsIFRlbXBsYXRlLkluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgLy9zdHlsZS5TdHlsZVhmSWQgPSBUZW1wbGF0ZS5JbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeGZJZENvcHkgPSBUZW1wbGF0ZS5YZklkOwotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbklEID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlcyA9IFRlbXBsYXRlLlN0eWxlczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0Nsb25lIG5hbWVkc3R5bGUKLSAgICAgICAgICAgIGludCBzdHlsZVhmSWQgPSBDbG9uZVN0eWxlKHN0eWxlcywgeGZJZENvcHksIHRydWUpOwotICAgICAgICAgICAgLy9DbG9zZSBjZWxscyBzdHlsZQotICAgICAgICAgICAgQ2VsbFN0eWxlWGZzW3N0eWxlWGZJZF0uWGZJZCA9IENlbGxTdHlsZVhmcy5Db3VudC0xOwotICAgICAgICAgICAgaW50IHhmaWQgPSBDbG9uZVN0eWxlKHN0eWxlcywgeGZJZENvcHksIGZhbHNlLCB0cnVlKTsgLy9BbHdheXMgYWRkIGEgbmV3IHN0eWxlIChXZSBjcmVhdGUgYSBuZXcgbmFtZWQgc3R5bGUgaGVyZSkKLSAgICAgICAgICAgIENlbGxYZnNbeGZpZF0uWGZJZCA9IHN0eWxlWGZJZDsKLSAgICAgICAgICAgIHN0eWxlLlN0eWxlID0gbmV3IEV4Y2VsU3R5bGUodGhpcywgTmFtZWRTdHlsZVByb3BlcnR5Q2hhbmdlLCBwb3NpdGlvbklELCBuYW1lLCBzdHlsZVhmSWQpOwotICAgICAgICAgICAgc3R5bGUuU3R5bGVYZklkID0gc3R5bGVYZklkOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzdHlsZS5OYW1lID0gbmFtZTsKLSAgICAgICAgICAgIGludCBpeCA9X3diLlN0eWxlcy5OYW1lZFN0eWxlcy5BZGQoc3R5bGUuTmFtZSwgc3R5bGUpOwotICAgICAgICAgICAgc3R5bGUuU3R5bGUuU2V0SW5kZXgoaXgpOwotICAgICAgICAgICAgLy9zdHlsZS5TdHlsZS5YZklkID0gaXg7Ci0gICAgICAgICAgICByZXR1cm4gc3R5bGU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgVXBkYXRlWG1sKCkKLSAgICAgICAgewotICAgICAgICAgICAgUmVtb3ZlVW51c2VkU3R5bGVzKCk7Ci0KLSAgICAgICAgICAgIC8vTnVtYmVyRm9ybWF0Ci0gICAgICAgICAgICBYbWxOb2RlIG5mTm9kZT1fc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShOdW1iZXJGb3JtYXRzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgaWYgKG5mTm9kZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoTnVtYmVyRm9ybWF0c1BhdGgsIHRydWUpOwotICAgICAgICAgICAgICAgIG5mTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKE51bWJlckZvcm1hdHNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmZOb2RlLlJlbW92ZUFsbCgpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIGludCBub3JtYWxJeCA9IE5hbWVkU3R5bGVzLkZpbmRJbmRleEJ5SUQoIk5vcm1hbCIpOwotICAgICAgICAgICAgaWYgKE5hbWVkU3R5bGVzLkNvdW50ID4gMCAmJiBub3JtYWxJeD49MCAmJiBOYW1lZFN0eWxlc1tub3JtYWxJeF0uU3R5bGUuTnVtYmVyZm9ybWF0Lk51bUZtdElEID49IDE2NCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeGNlbE51bWJlckZvcm1hdFhtbCBuZiA9IE51bWJlckZvcm1hdHNbTnVtYmVyRm9ybWF0cy5GaW5kSW5kZXhCeUlEKE5hbWVkU3R5bGVzW25vcm1hbEl4XS5TdHlsZS5OdW1iZXJmb3JtYXQuSWQpXTsKLSAgICAgICAgICAgICAgICBuZk5vZGUuQXBwZW5kQ2hpbGQobmYuQ3JlYXRlWG1sTm9kZShfc3R5bGVYbWwuQ3JlYXRlRWxlbWVudCgibnVtRm10IiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pKSk7Ci0gICAgICAgICAgICAgICAgbmYubmV3SUQgPSBjb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxOdW1iZXJGb3JtYXRYbWwgbmYgaW4gTnVtYmVyRm9ybWF0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZighbmYuQnVpbGRJbiAvKiYmIG5mLm5ld0lEPDAqLykgLy9CdWlsZGluIGZvcm1hdHMgYXJlIG5vdCB1cGRhdGVkLgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmZOb2RlLkFwcGVuZENoaWxkKG5mLkNyZWF0ZVhtbE5vZGUoX3N0eWxlWG1sLkNyZWF0ZUVsZW1lbnQoIm51bUZtdCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKSkpOwotICAgICAgICAgICAgICAgICAgICBuZi5uZXdJRCA9IGNvdW50OwotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIChuZk5vZGUgYXMgWG1sRWxlbWVudCkuU2V0QXR0cmlidXRlKCJjb3VudCIsIGNvdW50LlRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAvL0ZvbnQKLSAgICAgICAgICAgIGNvdW50PTA7Ci0gICAgICAgICAgICBYbWxOb2RlIGZudE5vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShGb250c1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGZudE5vZGUuUmVtb3ZlQWxsKCk7Ci0KLSAgICAgICAgICAgIC8vTm9ybWFsIHNob3VsZCBiZSBmaXJzdCBpbiB0aGUgY29sbGVjdGlvbgotICAgICAgICAgICAgaWYgKE5hbWVkU3R5bGVzLkNvdW50ID4gMCAmJiBub3JtYWxJeCA+PSAwICYmIE5hbWVkU3R5bGVzW25vcm1hbEl4XS5TdHlsZS5Gb250LkluZGV4ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeGNlbEZvbnRYbWwgZm50ID0gRm9udHNbTmFtZWRTdHlsZXNbbm9ybWFsSXhdLlN0eWxlLkZvbnQuSW5kZXhdOwotICAgICAgICAgICAgICAgIGZudE5vZGUuQXBwZW5kQ2hpbGQoZm50LkNyZWF0ZVhtbE5vZGUoX3N0eWxlWG1sLkNyZWF0ZUVsZW1lbnQoImZvbnQiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbikpKTsKLSAgICAgICAgICAgICAgICBmbnQubmV3SUQgPSBjb3VudCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3JlYWNoIChFeGNlbEZvbnRYbWwgZm50IGluIEZvbnRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmbnQudXNlQ250ID4gMC8qICYmIGZudC5uZXdJRDwwKi8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmbnROb2RlLkFwcGVuZENoaWxkKGZudC5DcmVhdGVYbWxOb2RlKF9zdHlsZVhtbC5DcmVhdGVFbGVtZW50KCJmb250IiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZudC5uZXdJRCA9IGNvdW50OwotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIChmbnROb2RlIGFzIFhtbEVsZW1lbnQpLlNldEF0dHJpYnV0ZSgiY291bnQiLCBjb3VudC5Ub1N0cmluZygpKTsKLQotCi0gICAgICAgICAgICAvL0ZpbGxzCi0gICAgICAgICAgICBjb3VudCA9IDA7Ci0gICAgICAgICAgICBYbWxOb2RlIGZpbGxzTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKEZpbGxzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgZmlsbHNOb2RlLlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgRmlsbHNbMF0udXNlQ250ID0gMTsgICAgLy9NdXN0IGV4aXN0IChub25lKTsgIAotICAgICAgICAgICAgRmlsbHNbMV0udXNlQ250ID0gMTsgICAgLy9NdXN0IGV4aXN0IChncmF5MTI1KTsKLSAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsRmlsbFhtbCBmaWxsIGluIEZpbGxzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmaWxsLnVzZUNudCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaWxsc05vZGUuQXBwZW5kQ2hpbGQoZmlsbC5DcmVhdGVYbWxOb2RlKF9zdHlsZVhtbC5DcmVhdGVFbGVtZW50KCJmaWxsIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGwubmV3SUQgPSBjb3VudDsKLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIChmaWxsc05vZGUgYXMgWG1sRWxlbWVudCkuU2V0QXR0cmlidXRlKCJjb3VudCIsIGNvdW50LlRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAvL0JvcmRlcnMKLSAgICAgICAgICAgIGNvdW50ID0gMDsKLSAgICAgICAgICAgIFhtbE5vZGUgYm9yZGVyc05vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShCb3JkZXJzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgYm9yZGVyc05vZGUuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICBCb3JkZXJzWzBdLnVzZUNudCA9IDE7ICAgIC8vTXVzdCBleGlzdCBibGFuazsKLSAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsQm9yZGVyWG1sIGJvcmRlciBpbiBCb3JkZXJzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChib3JkZXIudXNlQ250ID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJvcmRlcnNOb2RlLkFwcGVuZENoaWxkKGJvcmRlci5DcmVhdGVYbWxOb2RlKF9zdHlsZVhtbC5DcmVhdGVFbGVtZW50KCJib3JkZXIiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbikpKTsKLSAgICAgICAgICAgICAgICAgICAgYm9yZGVyLm5ld0lEID0gY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgKGJvcmRlcnNOb2RlIGFzIFhtbEVsZW1lbnQpLlNldEF0dHJpYnV0ZSgiY291bnQiLCBjb3VudC5Ub1N0cmluZygpKTsKLQotICAgICAgICAgICAgWG1sTm9kZSBzdHlsZVhmc05vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShDZWxsU3R5bGVYZnNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICBpZiAoc3R5bGVYZnNOb2RlID09IG51bGwgJiYgTmFtZWRTdHlsZXMuQ291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoQ2VsbFN0eWxlWGZzUGF0aCk7Ci0gICAgICAgICAgICAgICAgc3R5bGVYZnNOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoQ2VsbFN0eWxlWGZzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE5hbWVkU3R5bGVzLkNvdW50ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHlsZVhmc05vZGUuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL05hbWVkU3R5bGVzCi0gICAgICAgICAgICBjb3VudCA9IG5vcm1hbEl4ID4gLTEgPyAxIDogMDsgIC8vSWYgd2UgaGF2ZSBhIG5vcm1hbCBzdHlsZSwgd2UgbWFrZSBzdXJlIGl0J3MgYWRkZWQgZmlyc3QuCi0KLSAgICAgICAgICAgIFhtbE5vZGUgY2VsbFN0eWxlTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKENlbGxTdHlsZXNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICBpZihjZWxsU3R5bGVOb2RlIT1udWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNlbGxTdHlsZU5vZGUuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBYbWxOb2RlIGNlbGxYZnNOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoQ2VsbFhmc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGNlbGxYZnNOb2RlLlJlbW92ZUFsbCgpOwotCi0gICAgICAgICAgICBpZiAoTmFtZWRTdHlsZXMuQ291bnQgPiAwICYmIG5vcm1hbEl4ID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTmFtZWRTdHlsZXNbbm9ybWFsSXhdLm5ld0lEID0gMDsKLSAgICAgICAgICAgICAgICBBZGROYW1lZFN0eWxlKDAsIHN0eWxlWGZzTm9kZSwgY2VsbFhmc05vZGUsIE5hbWVkU3R5bGVzW25vcm1hbEl4XSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3JlYWNoIChFeGNlbE5hbWVkU3R5bGVYbWwgc3R5bGUgaW4gTmFtZWRTdHlsZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHlsZS5OYW1lLkVxdWFscygibm9ybWFsIiwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBZGROYW1lZFN0eWxlKGNvdW50KyssIHN0eWxlWGZzTm9kZSwgY2VsbFhmc05vZGUsIHN0eWxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3R5bGUubmV3SUQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjZWxsU3R5bGVOb2RlLkFwcGVuZENoaWxkKHN0eWxlLkNyZWF0ZVhtbE5vZGUoX3N0eWxlWG1sLkNyZWF0ZUVsZW1lbnQoImNlbGxTdHlsZSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNlbGxTdHlsZU5vZGUhPW51bGwpIChjZWxsU3R5bGVOb2RlIGFzIFhtbEVsZW1lbnQpLlNldEF0dHJpYnV0ZSgiY291bnQiLCBjb3VudC5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIGlmIChzdHlsZVhmc05vZGUgIT0gbnVsbCkgKHN0eWxlWGZzTm9kZSBhcyBYbWxFbGVtZW50KS5TZXRBdHRyaWJ1dGUoImNvdW50IiwgY291bnQuVG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIC8vQ2VsbFN0eWxlCi0gICAgICAgICAgICBpbnQgeGZpeCA9IDA7Ci0gICAgICAgICAgICBmb3JlYWNoIChFeGNlbFhmcyB4ZiBpbiBDZWxsWGZzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh4Zi51c2VDbnQgPiAwICYmICEobm9ybWFsSXggPj0gMCAmJiBOYW1lZFN0eWxlc1tub3JtYWxJeF0uWGZJZCA9PSB4Zml4KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNlbGxYZnNOb2RlLkFwcGVuZENoaWxkKHhmLkNyZWF0ZVhtbE5vZGUoX3N0eWxlWG1sLkNyZWF0ZUVsZW1lbnQoInhmIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pKSk7Ci0gICAgICAgICAgICAgICAgICAgIHhmLm5ld0lEID0gY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhmaXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIChjZWxsWGZzTm9kZSBhcyBYbWxFbGVtZW50KS5TZXRBdHRyaWJ1dGUoImNvdW50IiwgY291bnQuVG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIC8vU2V0IGR4ZiBzdHlsaW5nIGZvciBjb25kaXRpb25hbCBGb3JtYXR0aW5nCi0gICAgICAgICAgICBYbWxOb2RlIGR4ZnNOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoZHhmc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciB3cyBpbiBfd2IuV29ya3NoZWV0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAod3MgaXMgRXhjZWxDaGFydHNoZWV0KSBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2YgaW4gd3MuQ29uZGl0aW9uYWxGb3JtYXR0aW5nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNmLlN0eWxlLkhhc1ZhbHVlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXggPSBEeGZzLkZpbmRJbmRleEJ5SUQoY2YuU3R5bGUuSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl4IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSljZikuRHhmSWQgPSBEeGZzLkNvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIER4ZnMuQWRkKGNmLlN0eWxlLklkLCBjZi5TdHlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW0gPSAoKFhtbERvY3VtZW50KVRvcE5vZGUpLkNyZWF0ZUVsZW1lbnQoImQiLCAiZHhmIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLlN0eWxlLkNyZWF0ZU5vZGVzKG5ldyBYbWxIZWxwZXJJbnN0YW5jZShOYW1lU3BhY2VNYW5hZ2VyLCBlbGVtKSwgIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR4ZnNOb2RlLkFwcGVuZENoaWxkKGVsZW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdSdWxlKWNmKS5EeGZJZCA9IGl4OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGR4ZnNOb2RlICE9IG51bGwpIChkeGZzTm9kZSBhcyBYbWxFbGVtZW50KS5TZXRBdHRyaWJ1dGUoImNvdW50IiwgRHhmcy5Db3VudC5Ub1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBBZGROYW1lZFN0eWxlKGludCBpZCwgWG1sTm9kZSBzdHlsZVhmc05vZGUsWG1sTm9kZSBjZWxsWGZzTm9kZSwgRXhjZWxOYW1lZFN0eWxlWG1sIHN0eWxlKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc3R5bGVYZnMgPSBDZWxsU3R5bGVYZnNbc3R5bGUuU3R5bGVYZklkXTsKLSAgICAgICAgICAgIHN0eWxlWGZzTm9kZS5BcHBlbmRDaGlsZChzdHlsZVhmcy5DcmVhdGVYbWxOb2RlKF9zdHlsZVhtbC5DcmVhdGVFbGVtZW50KCJ4ZiIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKSwgdHJ1ZSkpOwotICAgICAgICAgICAgc3R5bGVYZnMubmV3SUQgPSBpZDsKLSAgICAgICAgICAgIHN0eWxlWGZzLlhmSWQgPSBzdHlsZS5TdHlsZVhmSWQ7Ci0KLSAgICAgICAgICAgIHZhciBpeCA9IENlbGxYZnMuRmluZEluZGV4QnlJRChzdHlsZVhmcy5JZCk7Ci0gICAgICAgICAgICBpZiAoaXggPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNlbGxYZnNOb2RlLkFwcGVuZENoaWxkKHN0eWxlWGZzLkNyZWF0ZVhtbE5vZGUoX3N0eWxlWG1sLkNyZWF0ZUVsZW1lbnQoInhmIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoaWQ8MCkgQ2VsbFhmc1tpeF0uWGZJZCA9IGlkOwotICAgICAgICAgICAgICAgIGNlbGxYZnNOb2RlLkFwcGVuZENoaWxkKENlbGxYZnNbaXhdLkNyZWF0ZVhtbE5vZGUoX3N0eWxlWG1sLkNyZWF0ZUVsZW1lbnQoInhmIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pKSk7Ci0gICAgICAgICAgICAgICAgQ2VsbFhmc1tpeF0udXNlQ250ID0gMDsKLSAgICAgICAgICAgICAgICBDZWxsWGZzW2l4XS5uZXdJRCA9IGlkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3R5bGUuWGZJZCA+PSAwKQotICAgICAgICAgICAgICAgIHN0eWxlLlhmSWQgPSBDZWxsWGZzW3N0eWxlLlhmSWRdLm5ld0lEOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHN0eWxlLlhmSWQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFJlbW92ZVVudXNlZFN0eWxlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENlbGxYZnNbMF0udXNlQ250ID0gMTsgLy9GaXJzdCBpdGVtIGlzIGFsbHdheXMgdXNlZC4KLSAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsV29ya3NoZWV0IHNoZWV0IGluIF93Yi5Xb3Jrc2hlZXRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50PihzaGVldC5fc3R5bGVzKTsKLSAgICAgICAgICAgICAgICB3aGlsZShjc2UuTmV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBjc2UuVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2ID49IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENlbGxYZnNbdl0udXNlQ250Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3JlYWNoIChFeGNlbE5hbWVkU3R5bGVYbWwgbnMgaW4gTmFtZWRTdHlsZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2VsbFN0eWxlWGZzW25zLlN0eWxlWGZJZF0udXNlQ250Kys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsWGZzIHhmIGluIENlbGxYZnMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHhmLnVzZUNudCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoeGYuRm9udElkID49IDApIEZvbnRzW3hmLkZvbnRJZF0udXNlQ250Kys7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4Zi5GaWxsSWQgPj0gMCkgRmlsbHNbeGYuRmlsbElkXS51c2VDbnQrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhmLkJvcmRlcklkID49IDApIEJvcmRlcnNbeGYuQm9yZGVySWRdLnVzZUNudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsWGZzIHhmIGluIENlbGxTdHlsZVhmcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoeGYudXNlQ250ID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4Zi5Gb250SWQgPj0gMCkgRm9udHNbeGYuRm9udElkXS51c2VDbnQrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhmLkZpbGxJZCA+PSAwKSBGaWxsc1t4Zi5GaWxsSWRdLnVzZUNudCsrOwotICAgICAgICAgICAgICAgICAgICBpZiAoeGYuQm9yZGVySWQgPj0gMCkgQm9yZGVyc1t4Zi5Cb3JkZXJJZF0udXNlQ250Kys7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgaW50IEdldFN0eWxlSWRGcm9tTmFtZShzdHJpbmcgTmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGkgPSBOYW1lZFN0eWxlcy5GaW5kSW5kZXhCeUlEKE5hbWUpOwotICAgICAgICAgICAgaWYgKGkgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgaWQgPSBOYW1lZFN0eWxlc1tpXS5YZklkOwotICAgICAgICAgICAgICAgIGlmIChpZCA8IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3R5bGVYZklkPU5hbWVkU3R5bGVzW2ldLlN0eWxlWGZJZDsKLSAgICAgICAgICAgICAgICAgICAgRXhjZWxYZnMgbmV3U3R5bGUgPSBDZWxsU3R5bGVYZnNbc3R5bGVYZklkXS5Db3B5KCk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1N0eWxlLlhmSWQgPSBzdHlsZVhmSWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlkID0gQ2VsbFhmcy5GaW5kSW5kZXhCeUlEKG5ld1N0eWxlLklkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlkIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBDZWxsWGZzLkFkZChuZXdTdHlsZS5JZCwgbmV3U3R5bGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIE5hbWVkU3R5bGVzW2ldLlhmSWQ9aWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBpZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAvL3Rocm93KG5ldyBFeGNlcHRpb24oIk5hbWVkIHN0eWxlIGRvZXMgbm90IGV4aXN0IikpOyAgICAgICAgCSAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAjcmVnaW9uIFhtbEhlbHBGdW5jdGlvbnMKLSAgICAgICAgcHJpdmF0ZSBpbnQgR2V0WG1sTm9kZUludChYbWxOb2RlIG5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgaWYgKGludC5UcnlQYXJzZShHZXRYbWxOb2RlKG5vZGUpLCBvdXQgaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0WG1sTm9kZShYbWxOb2RlIG5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChub2RlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5vZGUuVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5WYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotI2VuZHJlZ2lvbgotICAgICAgICBpbnRlcm5hbCBpbnQgQ2xvbmVTdHlsZShFeGNlbFN0eWxlcyBzdHlsZSwgaW50IHN0eWxlSUQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDbG9uZVN0eWxlKHN0eWxlLCBzdHlsZUlELCBmYWxzZSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGludCBDbG9uZVN0eWxlKEV4Y2VsU3R5bGVzIHN0eWxlLCBpbnQgc3R5bGVJRCwgYm9vbCBpc05hbWVkU3R5bGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDbG9uZVN0eWxlKHN0eWxlLCBzdHlsZUlELCBpc05hbWVkU3R5bGUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBpbnQgQ2xvbmVTdHlsZShFeGNlbFN0eWxlcyBzdHlsZSwgaW50IHN0eWxlSUQsIGJvb2wgaXNOYW1lZFN0eWxlLCBib29sIGFsbHdheXNBZGQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsWGZzIHhmczsKLSAgICAgICAgICAgIGxvY2sgKHN0eWxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpc05hbWVkU3R5bGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4ZnMgPSBzdHlsZS5DZWxsU3R5bGVYZnNbc3R5bGVJRF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhmcyA9IHN0eWxlLkNlbGxYZnNbc3R5bGVJRF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEV4Y2VsWGZzIG5ld1hmcyA9IHhmcy5Db3B5KHRoaXMpOwotICAgICAgICAgICAgICAgIC8vTnVtYmVyZm9ybWF0Ci0gICAgICAgICAgICAgICAgaWYgKHhmcy5OdW1iZXJGb3JtYXRJZCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL3Jha2UzNjogVHdvIHByb2JsZW1zIGhlcmUuLi4KLSAgICAgICAgICAgICAgICAgICAgLy9yYWtlMzY6ICAxLiB0aGUgZmlyc3QgdGltZSB0aHJvdWdoIHdoZW4gZm9ybWF0IHN0YXlzIGVxdWFsIHRvIFN0cmluZy5FbXB0eSwgaXQgYWRkcyBhIHN0cmluZy5lbXB0eSB0byB0aGUgbGlzdCBvZiBOdW1iZXIgRm9ybWF0cwotICAgICAgICAgICAgICAgICAgICAvL3Jha2UzNjogIDIuIHdoZW4gYWRkaW5nIGEgc2Vjb25kIHNoZWV0LCBpZiB0aGUgbnVtYmVyZm9ybWF0aWQgPT0gMTY0LCBpdCBmaW5kcyB0aGUgMTY0IGFkZGVkIGJ5IHByZXZpb3VzIHNoZWV0cyBidXQgd2FzIHVzaW5nIHRoZSBhcnJheSBpbmRleAotICAgICAgICAgICAgICAgICAgICAvL3Jha2UzNjogICAgICBmb3IgdGhlIG51bWJlcmZvcm1hdGlkCi0KLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvcm1hdCA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZtdCBpbiBzdHlsZS5OdW1iZXJGb3JtYXRzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm10Lk51bUZtdElkID09IHhmcy5OdW1iZXJGb3JtYXRJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBmbXQuRm9ybWF0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vcmFrZTM2OiBEb24ndCBhZGQgYW5vdGhlciBmb3JtYXQgaWYgaXQncyBibGFuawotICAgICAgICAgICAgICAgICAgICBpZiAoIVN0cmluZy5Jc051bGxPckVtcHR5KGZvcm1hdCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpeCA9IE51bWJlckZvcm1hdHMuRmluZEluZGV4QnlJRChmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl4IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyKSB7IEZvcm1hdCA9IGZvcm1hdCwgTnVtRm10SWQgPSBOdW1iZXJGb3JtYXRzLk5leHRJZCsrIH07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoZm9ybWF0LCBpdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Jha2UzNjogVXNlIHRoZSBqdXN0IGFkZGVkIGZvcm1hdCBpZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1hmcy5OdW1iZXJGb3JtYXRJZCA9IGl0ZW0uTnVtRm10SWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yYWtlMzY6IFVzZSB0aGUgZm9ybWF0IGlkIGRlZmluZWQgYnkgdGhlIGluZGV4Li4uIG5vdCB0aGUgaW5kZXggaXRzZWxmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3WGZzLk51bWJlckZvcm1hdElkID0gTnVtYmVyRm9ybWF0c1tpeF0uTnVtRm10SWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL0ZvbnQKLSAgICAgICAgICAgICAgICBpZiAoeGZzLkZvbnRJZCA+IC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGl4ID0gRm9udHMuRmluZEluZGV4QnlJRCh4ZnMuRm9udC5JZCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpeCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsRm9udFhtbCBpdGVtID0gc3R5bGUuRm9udHNbeGZzLkZvbnRJZF0uQ29weSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXggPSBGb250cy5BZGQoeGZzLkZvbnQuSWQsIGl0ZW0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5ld1hmcy5Gb250SWQgPSBpeDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvL0JvcmRlcgotICAgICAgICAgICAgICAgIGlmICh4ZnMuQm9yZGVySWQgPiAtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpeCA9IEJvcmRlcnMuRmluZEluZGV4QnlJRCh4ZnMuQm9yZGVyLklkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl4IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxCb3JkZXJYbWwgaXRlbSA9IHN0eWxlLkJvcmRlcnNbeGZzLkJvcmRlcklkXS5Db3B5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpeCA9IEJvcmRlcnMuQWRkKHhmcy5Cb3JkZXIuSWQsIGl0ZW0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5ld1hmcy5Cb3JkZXJJZCA9IGl4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vRmlsbAotICAgICAgICAgICAgICAgIGlmICh4ZnMuRmlsbElkID4gLTEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgaXggPSBGaWxscy5GaW5kSW5kZXhCeUlEKHhmcy5GaWxsLklkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl4IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBzdHlsZS5GaWxsc1t4ZnMuRmlsbElkXS5Db3B5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpeCA9IEZpbGxzLkFkZCh4ZnMuRmlsbC5JZCwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmV3WGZzLkZpbGxJZCA9IGl4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vTmFtZWQgc3R5bGUgcmVmZXJlbmNlCi0gICAgICAgICAgICAgICAgaWYgKHhmcy5YZklkID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHN0eWxlLkNlbGxTdHlsZVhmc1t4ZnMuWGZJZF0uSWQ7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBuZXdJZCA9IENlbGxTdHlsZVhmcy5GaW5kSW5kZXhCeUlEKGlkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0lkID49IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1hmcy5YZklkID0gbmV3SWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihzdHlsZS5fd2IhPV93YiAmJiBhbGx3YXlzQWRkPT1mYWxzZSkgLy9Ob3QgdGhlIHNhbWUgd29ya2Jvb2ssIGNvcHkgdGhlIG5hbWVkc3R5bGUgdG8gdGhlIHdvcmtib29rIG9yIG1hdGNoIHRoZSBpZAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnNGaW5kID0gc3R5bGUuTmFtZWRTdHlsZXMuVG9EaWN0aW9uYXJ5KGQgPT4gKGQuU3R5bGVYZklkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnNGaW5kLkNvbnRhaW5zS2V5KHhmcy5YZklkKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3QgPSBuc0ZpbmRbeGZzLlhmSWRdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChOYW1lZFN0eWxlcy5FeGlzdHNLZXkoc3QuTmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdYZnMuWGZJZCA9IE5hbWVkU3R5bGVzLkZpbmRJbmRleEJ5SUQoc3QuTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBucyA9IENyZWF0ZU5hbWVkU3R5bGUoc3QuTmFtZSwgc3QuU3R5bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdYZnMuWGZJZCA9IE5hbWVkU3R5bGVzLkNvdW50IC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQgaW5kZXg7Ci0gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRTdHlsZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gQ2VsbFN0eWxlWGZzLkFkZChuZXdYZnMuSWQsIG5ld1hmcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhbGx3YXlzQWRkKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IENlbGxYZnMuQWRkKG5ld1hmcy5JZCwgbmV3WGZzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gQ2VsbFhmcy5GaW5kSW5kZXhCeUlEKG5ld1hmcy5JZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gQ2VsbFhmcy5BZGQobmV3WGZzLklkLCBuZXdYZnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgfQogICAgIH0KKworICAgIC8vRm9udHMKKyAgICBYbWxOb2RlIGZvbnROb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoX2ZvbnRzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOworICAgIGZvcmVhY2ggKFhtbE5vZGUgbiBpbiBmb250Tm9kZSkgeworICAgICAgRXhjZWxGb250WG1sIGYgPSBuZXcgRXhjZWxGb250WG1sKF9uYW1lU3BhY2VNYW5hZ2VyLCBuKTsKKyAgICAgIEZvbnRzLkFkZChmLklkLCBmKTsKKyAgICB9CisKKyAgICAvL0ZpbGxzCisgICAgWG1sTm9kZSBmaWxsTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKF9maWxsc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBmb3JlYWNoIChYbWxOb2RlIG4gaW4gZmlsbE5vZGUpIHsKKyAgICAgIEV4Y2VsRmlsbFhtbCBmOworICAgICAgaWYgKG4uRmlyc3RDaGlsZCAhPSBudWxsICYmIG4uRmlyc3RDaGlsZC5Mb2NhbE5hbWUgPT0gImdyYWRpZW50RmlsbCIpIHsKKyAgICAgICAgZiA9IG5ldyBFeGNlbEdyYWRpZW50RmlsbFhtbChfbmFtZVNwYWNlTWFuYWdlciwgbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBmID0gbmV3KF9uYW1lU3BhY2VNYW5hZ2VyLCBuKTsKKyAgICAgIH0KKyAgICAgIEZpbGxzLkFkZChmLklkLCBmKTsKKyAgICB9CisKKyAgICAvL0JvcmRlcnMKKyAgICBYbWxOb2RlIGJvcmRlck5vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShfYm9yZGVyc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBmb3JlYWNoIChYbWxOb2RlIG4gaW4gYm9yZGVyTm9kZSkgeworICAgICAgRXhjZWxCb3JkZXJYbWwgYiA9IG5ldyBFeGNlbEJvcmRlclhtbChfbmFtZVNwYWNlTWFuYWdlciwgbik7CisgICAgICBCb3JkZXJzLkFkZChiLklkLCBiKTsKKyAgICB9CisKKyAgICAvL2NlbGxTdHlsZVhmcworICAgIFhtbE5vZGUgc3R5bGVYZnNOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoX2NlbGxTdHlsZVhmc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBpZiAoc3R5bGVYZnNOb2RlICE9IG51bGwpIHsKKyAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbiBpbiBzdHlsZVhmc05vZGUpIHsKKyAgICAgICAgRXhjZWxYZnMgaXRlbSA9IG5ldyBFeGNlbFhmcyhfbmFtZVNwYWNlTWFuYWdlciwgbiwgdGhpcyk7CisgICAgICAgIENlbGxTdHlsZVhmcy5BZGQoaXRlbS5JZCwgaXRlbSk7CisgICAgICB9CisgICAgfQorCisgICAgWG1sTm9kZSBzdHlsZU5vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShfY2VsbFhmc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0eWxlTm9kZS5DaGlsZE5vZGVzLkNvdW50OyBpKyspIHsKKyAgICAgIFhtbE5vZGUgbiA9IHN0eWxlTm9kZS5DaGlsZE5vZGVzW2ldOworICAgICAgRXhjZWxYZnMgaXRlbSA9IG5ldyBFeGNlbFhmcyhfbmFtZVNwYWNlTWFuYWdlciwgbiwgdGhpcyk7CisgICAgICBDZWxsWGZzLkFkZChpdGVtLklkLCBpdGVtKTsKKyAgICB9CisKKyAgICAvL2NlbGxTdHlsZQorICAgIFhtbE5vZGUgbmFtZWRTdHlsZU5vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShfY2VsbFN0eWxlc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBpZiAobmFtZWRTdHlsZU5vZGUgIT0gbnVsbCkgeworICAgICAgZm9yZWFjaCAoWG1sTm9kZSBuIGluIG5hbWVkU3R5bGVOb2RlKSB7CisgICAgICAgIEV4Y2VsTmFtZWRTdHlsZVhtbCBpdGVtID0gbmV3IEV4Y2VsTmFtZWRTdHlsZVhtbChfbmFtZVNwYWNlTWFuYWdlciwgbiwgdGhpcyk7CisgICAgICAgIE5hbWVkU3R5bGVzLkFkZChpdGVtLk5hbWUsIGl0ZW0pOworICAgICAgfQorICAgIH0KKworICAgIC8vZHhmc1BhdGgKKyAgICBYbWxOb2RlIGR4ZnNOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoX2R4ZnNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7CisgICAgaWYgKGR4ZnNOb2RlICE9IG51bGwpIHsKKyAgICAgIGZvcmVhY2ggKFhtbE5vZGUgeCBpbiBkeGZzTm9kZSkgeworICAgICAgICBFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nIGl0ZW0gPSBuZXcgRXhjZWxEeGZTdHlsZUNvbmRpdGlvbmFsRm9ybWF0dGluZygKKyAgICAgICAgICAgIF9uYW1lU3BhY2VNYW5hZ2VyLAorICAgICAgICAgICAgeCwKKyAgICAgICAgICAgIHRoaXMpOworICAgICAgICBEeGZzLkFkZChpdGVtLklkLCBpdGVtKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbnRlcm5hbCBFeGNlbFN0eWxlIEdldFN0eWxlT2JqZWN0KGludCBpZCwgaW50IHBvc2l0aW9uSWQsIHN0cmluZyBhZGRyZXNzKSB7CisgICAgaWYgKGlkIDwgMCkgeworICAgICAgaWQgPSAwOworICAgIH0KKyAgICByZXR1cm4gbmV3KHRoaXMsIFByb3BlcnR5Q2hhbmdlLCBwb3NpdGlvbklkLCBhZGRyZXNzLCBpZCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBIYW5kZWxzIGNoYW5nZXMgb2YgcHJvcGVydGllcyBvbiB0aGUgc3R5bGUgb2JqZWN0cworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InNlbmRlciI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJlIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBpbnRlcm5hbCBpbnQgUHJvcGVydHlDaGFuZ2UoU3R5bGVCYXNlIHNlbmRlciwgU3R5bGVDaGFuZ2VFdmVudEFyZ3MgZSkgeworICAgIHZhciBhZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoZS5BZGRyZXNzKTsKKyAgICB2YXIgd3MgPSBfd2IuV29ya3NoZWV0c1tlLlBvc2l0aW9uSURdOworICAgIERpY3Rpb25hcnk8aW50LCBpbnQ+IHN0eWxlQ2FzaGUgPSBuZXcgRGljdGlvbmFyeTxpbnQsIGludD4oKTsKKyAgICAvL1NldCBzaW5nbGUgYWRkcmVzcworICAgIGxvY2sgKHdzLl9zdHlsZXMpIHsKKyAgICAgIFNldFN0eWxlQWRkcmVzcyhzZW5kZXIsIGUsIGFkZHJlc3MsIHdzLCByZWYgc3R5bGVDYXNoZSk7CisgICAgICBpZiAoYWRkcmVzcy5BZGRyZXNzZXMgIT0gbnVsbCkgeworICAgICAgICAvL0hhbmRsZSBtdWx0aWFkZHJlc3NlcworICAgICAgICBmb3JlYWNoICh2YXIgaW5uZXJBZGRyZXNzIGluIGFkZHJlc3MuQWRkcmVzc2VzKSB7CisgICAgICAgICAgU2V0U3R5bGVBZGRyZXNzKHNlbmRlciwgZSwgaW5uZXJBZGRyZXNzLCB3cywgcmVmIHN0eWxlQ2FzaGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIFNldFN0eWxlQWRkcmVzcygKKyAgICAgIFN0eWxlQmFzZSBzZW5kZXIsCisgICAgICBTdHlsZUNoYW5nZUV2ZW50QXJncyBlLAorICAgICAgRXhjZWxBZGRyZXNzQmFzZSBhZGRyZXNzLAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MsCisgICAgICByZWYgRGljdGlvbmFyeTxpbnQsIGludD4gc3R5bGVDYXNoZSkgeworICAgIGlmIChhZGRyZXNzLlN0YXJ0LkNvbHVtbiA9PSAwIHx8IGFkZHJlc3MuU3RhcnQuUm93ID09IDApIHsKKyAgICAgIHRocm93IChuZXcoImVycm9yIGFkZHJlc3MiKSk7CisgICAgfQorICAgIC8vQ29sdW1ucworICAgIGlmIChhZGRyZXNzLlN0YXJ0LlJvdyA9PSAxICYmIGFkZHJlc3MuRW5kLlJvdyA9PSBFeGNlbFBhY2thZ2UuTWF4Um93cykgeworICAgICAgRXhjZWxDb2x1bW4gY29sdW1uOworICAgICAgaW50IGNvbCA9IGFkZHJlc3MuU3RhcnQuQ29sdW1uLAorICAgICAgICAgIHJvdyA9IDA7CisgICAgICAvL0dldCB0aGUgc3RhcnRjb2x1bW4KKyAgICAgIGlmICghd3MuX3ZhbHVlcy5FeGlzdHMoMCwgYWRkcmVzcy5TdGFydC5Db2x1bW4pKSB7CisgICAgICAgIGNvbHVtbiA9IHdzLkNvbHVtbihhZGRyZXNzLlN0YXJ0LkNvbHVtbik7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb2x1bW4gPSAoRXhjZWxDb2x1bW4pd3MuX3ZhbHVlcy5HZXRWYWx1ZSgwLCBhZGRyZXNzLlN0YXJ0LkNvbHVtbik7CisgICAgICB9CisKKyAgICAgIHdoaWxlIChjb2x1bW4uQ29sdW1uTWluIDw9IGFkZHJlc3MuRW5kLkNvbHVtbikgeworICAgICAgICBpZiAoY29sdW1uLkNvbHVtbk1heCA+IGFkZHJlc3MuRW5kLkNvbHVtbikgeworICAgICAgICAgIHZhciBuZXdDb2wgPSB3cy5Db3B5Q29sdW1uKGNvbHVtbiwgYWRkcmVzcy5FbmQuQ29sdW1uICsgMSwgY29sdW1uLkNvbHVtbk1heCk7CisgICAgICAgICAgY29sdW1uLkNvbHVtbk1heCA9IGFkZHJlc3MuRW5kLkNvbHVtbjsKKyAgICAgICAgfQorICAgICAgICB2YXIgcyA9IHdzLl9zdHlsZXMuR2V0VmFsdWUoMCwgY29sdW1uLkNvbHVtbk1pbik7CisgICAgICAgIGlmIChzdHlsZUNhc2hlLkNvbnRhaW5zS2V5KHMpKSB7CisgICAgICAgICAgd3MuU2V0U3R5bGUoMCwgY29sdW1uLkNvbHVtbk1pbiwgc3R5bGVDYXNoZVtzXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRXhjZWxYZnMgc3QgPSBDZWxsWGZzW3NdOworICAgICAgICAgIGludCBuZXdJZCA9IHN0LkdldE5ld0lkKENlbGxYZnMsIHNlbmRlciwgZS5TdHlsZUNsYXNzLCBlLlN0eWxlUHJvcGVydHksIGUuVmFsdWUpOworICAgICAgICAgIHN0eWxlQ2FzaGUuQWRkKHMsIG5ld0lkKTsKKyAgICAgICAgICB3cy5TZXRTdHlsZSgwLCBjb2x1bW4uQ29sdW1uTWluLCBuZXdJZCk7CisgICAgICAgIH0KKworICAgICAgICAvL2luZGV4Kys7CisKKyAgICAgICAgaWYgKCF3cy5fdmFsdWVzLk5leHRDZWxsKHJlZiByb3csIHJlZiBjb2wpIHx8IHJvdyA+IDApIHsKKyAgICAgICAgICBjb2x1bW4uX2NvbHVtbk1heCA9IGFkZHJlc3MuRW5kLkNvbHVtbjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb2x1bW4gPSAod3MuX3ZhbHVlcy5HZXRWYWx1ZSgwLCBjb2wpIGFzIEV4Y2VsQ29sdW1uKTsKKyAgICAgIH0KKworICAgICAgaWYgKGNvbHVtbi5fY29sdW1uTWF4IDwgYWRkcmVzcy5FbmQuQ29sdW1uKSB7CisgICAgICAgIHZhciBuZXdDb2wgPSB3cy5Db2x1bW4oY29sdW1uLl9jb2x1bW5NYXggKyAxKTsKKyAgICAgICAgbmV3Q29sLl9jb2x1bW5NYXggPSBhZGRyZXNzLkVuZC5Db2x1bW47CisKKyAgICAgICAgdmFyIHMgPSB3cy5fc3R5bGVzLkdldFZhbHVlKDAsIGNvbHVtbi5Db2x1bW5NaW4pOworICAgICAgICBpZiAoc3R5bGVDYXNoZS5Db250YWluc0tleShzKSkgeworICAgICAgICAgIHdzLlNldFN0eWxlKDAsIGNvbHVtbi5Db2x1bW5NaW4sIHN0eWxlQ2FzaGVbc10pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEV4Y2VsWGZzIHN0ID0gQ2VsbFhmc1tzXTsKKyAgICAgICAgICBpbnQgbmV3SWQgPSBzdC5HZXROZXdJZChDZWxsWGZzLCBzZW5kZXIsIGUuU3R5bGVDbGFzcywgZS5TdHlsZVByb3BlcnR5LCBlLlZhbHVlKTsKKyAgICAgICAgICBzdHlsZUNhc2hlLkFkZChzLCBuZXdJZCk7CisgICAgICAgICAgd3MuU2V0U3R5bGUoMCwgY29sdW1uLkNvbHVtbk1pbiwgbmV3SWQpOworICAgICAgICB9CisKKyAgICAgICAgY29sdW1uLl9jb2x1bW5NYXggPSBhZGRyZXNzLkVuZC5Db2x1bW47CisgICAgICB9CisKKyAgICAgIC8vU2V0IGZvciBpbmRpdmlkdWFsIGNlbGxzIGluIHRoZSBzcGFuLiBXZSBsb29wIGFsbCBjZWxscyBoZXJlIHNpbmNlIHRoZSBjZWxscyBhcmUgc29ydGVkIHdpdGggY29sdW1ucyBmaXJzdC4KKyAgICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50PigKKyAgICAgICAgICB3cy5fc3R5bGVzLAorICAgICAgICAgIDEsCisgICAgICAgICAgYWRkcmVzcy5fZnJvbUNvbCwKKyAgICAgICAgICBhZGRyZXNzLl90b1JvdywKKyAgICAgICAgICBhZGRyZXNzLl90b0NvbCk7CisgICAgICB3aGlsZSAoY3NlLk5leHQoKSkgeworICAgICAgICBpZiAoY3NlLkNvbHVtbiA+PSBhZGRyZXNzLlN0YXJ0LkNvbHVtbiAmJiBjc2UuQ29sdW1uIDw9IGFkZHJlc3MuRW5kLkNvbHVtbikgeworICAgICAgICAgIGlmIChzdHlsZUNhc2hlLkNvbnRhaW5zS2V5KGNzZS5WYWx1ZSkpIHsKKyAgICAgICAgICAgIHdzLlNldFN0eWxlKGNzZS5Sb3csIGNzZS5Db2x1bW4sIHN0eWxlQ2FzaGVbY3NlLlZhbHVlXSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEV4Y2VsWGZzIHN0ID0gQ2VsbFhmc1tjc2UuVmFsdWVdOworICAgICAgICAgICAgaW50IG5ld0lkID0gc3QuR2V0TmV3SWQoQ2VsbFhmcywgc2VuZGVyLCBlLlN0eWxlQ2xhc3MsIGUuU3R5bGVQcm9wZXJ0eSwgZS5WYWx1ZSk7CisgICAgICAgICAgICBzdHlsZUNhc2hlLkFkZChjc2UuVmFsdWUsIG5ld0lkKTsKKyAgICAgICAgICAgIGNzZS5WYWx1ZSA9IG5ld0lkOworICAgICAgICAgICAgLy93cy5TZXRTdHlsZShjc2UuUm93LCBjc2UuQ29sdW1uLCBuZXdJZCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8vVXBkYXRlIGNlbGxzIHdpdGggc3R5bGVkIGNvbHVtbnMKKyAgICAgIGNzZSA9IG5ldyh3cy5fc3R5bGVzLCAxLCAwLCBhZGRyZXNzLl90b1JvdywgMCk7CisgICAgICB3aGlsZSAoY3NlLk5leHQoKSkgeworICAgICAgICBmb3IgKGludCBjID0gYWRkcmVzcy5fZnJvbVJvdzsgYyA8PSBhZGRyZXNzLl90b0NvbDsgYysrKSB7CisgICAgICAgICAgaWYgKCF3cy5fc3R5bGVzLkV4aXN0cyhjc2UuUm93LCBjKSkgeworICAgICAgICAgICAgaWYgKHN0eWxlQ2FzaGUuQ29udGFpbnNLZXkoY3NlLlZhbHVlKSkgeworICAgICAgICAgICAgICB3cy5TZXRTdHlsZShjc2UuUm93LCBjLCBzdHlsZUNhc2hlW2NzZS5WYWx1ZV0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgRXhjZWxYZnMgc3QgPSBDZWxsWGZzW2NzZS5WYWx1ZV07CisgICAgICAgICAgICAgIGludCBuZXdJZCA9IHN0LkdldE5ld0lkKENlbGxYZnMsIHNlbmRlciwgZS5TdHlsZUNsYXNzLCBlLlN0eWxlUHJvcGVydHksIGUuVmFsdWUpOworICAgICAgICAgICAgICBzdHlsZUNhc2hlLkFkZChjc2UuVmFsdWUsIG5ld0lkKTsKKyAgICAgICAgICAgICAgd3MuU2V0U3R5bGUoY3NlLlJvdywgYywgbmV3SWQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICAvL1Jvd3MKKyAgICBlbHNlIGlmIChhZGRyZXNzLlN0YXJ0LkNvbHVtbiA9PSAxICYmIGFkZHJlc3MuRW5kLkNvbHVtbiA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgeworICAgICAgZm9yIChpbnQgcm93TnVtID0gYWRkcmVzcy5TdGFydC5Sb3c7IHJvd051bSA8PSBhZGRyZXNzLkVuZC5Sb3c7IHJvd051bSsrKSB7CisgICAgICAgIHZhciBzID0gd3MuX3N0eWxlcy5HZXRWYWx1ZShyb3dOdW0sIDApOworICAgICAgICBpZiAocyA9PSAwKSB7CisgICAgICAgICAgLy9pdGVyYXRlIGFsbCBjb2x1bW5zIGFuZCBzZXQgdGhlIHJvdyB0byB0aGUgc3R5bGUgb2YgdGhlIGxhc3QgY29sdW1uCisgICAgICAgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxpbnQ+KHdzLl9zdHlsZXMsIDAsIDEsIDAsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICAgICAgICB3aGlsZSAoY3NlLk5leHQoKSkgeworICAgICAgICAgICAgcyA9IGNzZS5WYWx1ZTsKKyAgICAgICAgICAgIHZhciBjID0gd3MuX3ZhbHVlcy5HZXRWYWx1ZShjc2UuUm93LCBjc2UuQ29sdW1uKSBhcyBFeGNlbENvbHVtbjsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5Db2x1bW5NYXggPCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgeworICAgICAgICAgICAgICBmb3IgKGludCBjb2wgPSBjLkNvbHVtbk1pbjsgY29sIDwgYy5Db2x1bW5NYXg7IGNvbCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCF3cy5fc3R5bGVzLkV4aXN0cyhyb3dOdW0sIGNvbCkpIHsKKyAgICAgICAgICAgICAgICAgIHdzLl9zdHlsZXMuU2V0VmFsdWUocm93TnVtLCBjb2wsIHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICB3cy5TZXRTdHlsZShyb3dOdW0sIDAsIHMpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHlsZUNhc2hlLkNvbnRhaW5zS2V5KHMpKSB7CisgICAgICAgICAgd3MuU2V0U3R5bGUocm93TnVtLCAwLCBzdHlsZUNhc2hlW3NdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFeGNlbFhmcyBzdCA9IENlbGxYZnNbc107CisgICAgICAgICAgaW50IG5ld0lkID0gc3QuR2V0TmV3SWQoQ2VsbFhmcywgc2VuZGVyLCBlLlN0eWxlQ2xhc3MsIGUuU3R5bGVQcm9wZXJ0eSwgZS5WYWx1ZSk7CisgICAgICAgICAgc3R5bGVDYXNoZS5BZGQocywgbmV3SWQpOworICAgICAgICAgIHdzLl9zdHlsZXMuU2V0VmFsdWUocm93TnVtLCAwLCBuZXdJZCk7CisgICAgICAgICAgd3MuU2V0U3R5bGUocm93TnVtLCAwLCBuZXdJZCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy9VcGRhdGUgaW5kaXZpZHVhbCBjZWxscworICAgICAgdmFyIGNzZTIgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50PigKKyAgICAgICAgICB3cy5fc3R5bGVzLAorICAgICAgICAgIGFkZHJlc3MuX2Zyb21Sb3csCisgICAgICAgICAgYWRkcmVzcy5fZnJvbUNvbCwKKyAgICAgICAgICBhZGRyZXNzLl90b1JvdywKKyAgICAgICAgICBhZGRyZXNzLl90b0NvbCk7CisgICAgICB3aGlsZSAoY3NlMi5OZXh0KCkpIHsKKyAgICAgICAgdmFyIHMgPSBjc2UyLlZhbHVlOworICAgICAgICBpZiAoc3R5bGVDYXNoZS5Db250YWluc0tleShzKSkgeworICAgICAgICAgIHdzLlNldFN0eWxlKGNzZTIuUm93LCBjc2UyLkNvbHVtbiwgc3R5bGVDYXNoZVtzXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRXhjZWxYZnMgc3QgPSBDZWxsWGZzW3NdOworICAgICAgICAgIGludCBuZXdJZCA9IHN0LkdldE5ld0lkKENlbGxYZnMsIHNlbmRlciwgZS5TdHlsZUNsYXNzLCBlLlN0eWxlUHJvcGVydHksIGUuVmFsdWUpOworICAgICAgICAgIHN0eWxlQ2FzaGUuQWRkKHMsIG5ld0lkKTsKKyAgICAgICAgICBjc2UyLlZhbHVlID0gbmV3SWQ7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy9VcGRhdGUgY2VsbHMgd2l0aCBzdHlsZWQgcm93cworICAgICAgY3NlMiA9IG5ldyh3cy5fc3R5bGVzLCAwLCAxLCAwLCBhZGRyZXNzLl90b0NvbCk7CisgICAgICB3aGlsZSAoY3NlMi5OZXh0KCkpIHsKKyAgICAgICAgZm9yIChpbnQgciA9IGFkZHJlc3MuX2Zyb21Sb3c7IHIgPD0gYWRkcmVzcy5fdG9Sb3c7IHIrKykgeworICAgICAgICAgIGlmICghd3MuX3N0eWxlcy5FeGlzdHMociwgY3NlMi5Db2x1bW4pKSB7CisgICAgICAgICAgICB2YXIgcyA9IGNzZTIuVmFsdWU7CisgICAgICAgICAgICBpZiAoc3R5bGVDYXNoZS5Db250YWluc0tleShzKSkgeworICAgICAgICAgICAgICB3cy5TZXRTdHlsZShyLCBjc2UyLkNvbHVtbiwgc3R5bGVDYXNoZVtzXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBFeGNlbFhmcyBzdCA9IENlbGxYZnNbc107CisgICAgICAgICAgICAgIGludCBuZXdJZCA9IHN0LkdldE5ld0lkKENlbGxYZnMsIHNlbmRlciwgZS5TdHlsZUNsYXNzLCBlLlN0eWxlUHJvcGVydHksIGUuVmFsdWUpOworICAgICAgICAgICAgICBzdHlsZUNhc2hlLkFkZChzLCBuZXdJZCk7CisgICAgICAgICAgICAgIHdzLlNldFN0eWxlKHIsIGNzZTIuQ29sdW1uLCBuZXdJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIC8vQ2VsbHJhbmdlCisgICAgeworICAgICAgZm9yIChpbnQgY29sID0gYWRkcmVzcy5TdGFydC5Db2x1bW47IGNvbCA8PSBhZGRyZXNzLkVuZC5Db2x1bW47IGNvbCsrKSB7CisgICAgICAgIGZvciAoaW50IHJvdyA9IGFkZHJlc3MuU3RhcnQuUm93OyByb3cgPD0gYWRkcmVzcy5FbmQuUm93OyByb3crKykgeworICAgICAgICAgIHZhciBzID0gR2V0U3R5bGVJZCh3cywgcm93LCBjb2wpOworICAgICAgICAgIGlmIChzdHlsZUNhc2hlLkNvbnRhaW5zS2V5KHMpKSB7CisgICAgICAgICAgICB3cy5TZXRTdHlsZShyb3csIGNvbCwgc3R5bGVDYXNoZVtzXSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEV4Y2VsWGZzIHN0ID0gQ2VsbFhmc1tzXTsKKyAgICAgICAgICAgIGludCBuZXdJZCA9IHN0LkdldE5ld0lkKENlbGxYZnMsIHNlbmRlciwgZS5TdHlsZUNsYXNzLCBlLlN0eWxlUHJvcGVydHksIGUuVmFsdWUpOworICAgICAgICAgICAgc3R5bGVDYXNoZS5BZGQocywgbmV3SWQpOworICAgICAgICAgICAgd3MuU2V0U3R5bGUocm93LCBjb2wsIG5ld0lkKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbnRlcm5hbCBpbnQgR2V0U3R5bGVJZChFeGNlbFdvcmtzaGVldCB3cywgaW50IHJvdywgaW50IGNvbCkgeworICAgIGludCB2ID0gMDsKKyAgICBpZiAod3MuX3N0eWxlcy5FeGlzdHMocm93LCBjb2wsIHJlZiB2KSkgeworICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIGlmICh3cy5fc3R5bGVzLkV4aXN0cygKKyAgICAgICAgcm93LAorICAgICAgICAwLAorICAgICAgICByZWYgdikpIC8vRmlyc3QgUm93CisgICAgeworICAgICAgcmV0dXJuIHY7CisgICAgfSAvLyB0aGVuIGNvbHVtbgorICAgIGlmICh3cy5fc3R5bGVzLkV4aXN0cygwLCBjb2wsIHJlZiB2KSkgeworICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIGludCByID0gMCwKKyAgICAgICAgYyA9IGNvbDsKKyAgICBpZiAod3MuX3ZhbHVlcy5QcmV2Q2VsbChyZWYgciwgcmVmIGMpKSB7CisgICAgICB2YXIgY29sdW1uID0gd3MuX3ZhbHVlcy5HZXRWYWx1ZSgwLCBjKSBhcyBFeGNlbENvbHVtbjsKKyAgICAgIGlmIChjb2x1bW4gIT0gbnVsbAorICAgICAgICAgICYmIGNvbHVtbi5Db2x1bW5NYXgKKyAgICAgICAgICAgICAgPj0gY29sKSAvL0ZpeGVzIGlzc3VlIDE1MTc0CisgICAgICB7CisgICAgICAgIHJldHVybiB3cy5fc3R5bGVzLkdldFZhbHVlKDAsIGMpOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSGFuZGxlcyBwcm9wZXJ0eSBjaGFuZ2VzIG9uIE5hbWVkIHN0eWxlcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJzZW5kZXIiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZSI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgaW50ZXJuYWwgaW50IE5hbWVkU3R5bGVQcm9wZXJ0eUNoYW5nZShTdHlsZUJhc2Ugc2VuZGVyLCBTdHlsZUNoYW5nZUV2ZW50QXJncyBlKSB7CisgICAgaW50IGluZGV4ID0gTmFtZWRTdHlsZXMuRmluZEluZGV4QnlJZChlLkFkZHJlc3MpOworICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICBpbnQgbmV3SWQgPSBDZWxsU3R5bGVYZnNbTmFtZWRTdHlsZXNbaW5kZXhdLlN0eWxlWGZJZF0KKyAgICAgICAgICAuR2V0TmV3SWQoQ2VsbFN0eWxlWGZzLCBzZW5kZXIsIGUuU3R5bGVDbGFzcywgZS5TdHlsZVByb3BlcnR5LCBlLlZhbHVlKTsKKyAgICAgIGludCBwcmV2SXggPSBOYW1lZFN0eWxlc1tpbmRleF0uU3R5bGVYZklkOworICAgICAgTmFtZWRTdHlsZXNbaW5kZXhdLlN0eWxlWGZJZCA9IG5ld0lkOworICAgICAgTmFtZWRTdHlsZXNbaW5kZXhdLlN0eWxlLkluZGV4ID0gbmV3SWQ7CisKKyAgICAgIE5hbWVkU3R5bGVzW2luZGV4XS5YZklkID0gaW50Lk1pblZhbHVlOworICAgICAgZm9yZWFjaCAodmFyIHN0eWxlIGluIENlbGxYZnMpIHsKKyAgICAgICAgaWYgKHN0eWxlLlhmSWQgPT0gcHJldkl4KSB7CisgICAgICAgICAgc3R5bGUuWGZJZCA9IG5ld0lkOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgcHVibGljIEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsTnVtYmVyRm9ybWF0WG1sPiBOdW1iZXJGb3JtYXRzID0gbmV3KCk7CisgIHB1YmxpYyBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbEZvbnRYbWw+IEZvbnRzID0gbmV3KCk7CisgIHB1YmxpYyBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbEZpbGxYbWw+IEZpbGxzID0gbmV3KCk7CisgIHB1YmxpYyBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbEJvcmRlclhtbD4gQm9yZGVycyA9IG5ldygpOworICBwdWJsaWMgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxYZnM+IENlbGxTdHlsZVhmcyA9IG5ldygpOworICBwdWJsaWMgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxYZnM+IENlbGxYZnMgPSBuZXcoKTsKKyAgcHVibGljIEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsTmFtZWRTdHlsZVhtbD4gTmFtZWRTdHlsZXMgPSBuZXcoKTsKKyAgcHVibGljIEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsRHhmU3R5bGVDb25kaXRpb25hbEZvcm1hdHRpbmc+IER4ZnMgPSBuZXcoKTsKKworICBpbnRlcm5hbCBzdHJpbmcgSWQgPT4gIiI7CisKKyAgcHVibGljIEV4Y2VsTmFtZWRTdHlsZVhtbCBDcmVhdGVOYW1lZFN0eWxlKHN0cmluZyBuYW1lKSB7CisgICAgcmV0dXJuIENyZWF0ZU5hbWVkU3R5bGUobmFtZSwgbnVsbCk7CisgIH0KKworICBwdWJsaWMgRXhjZWxOYW1lZFN0eWxlWG1sIENyZWF0ZU5hbWVkU3R5bGUoc3RyaW5nIG5hbWUsIEV4Y2VsU3R5bGUgdGVtcGxhdGUpIHsKKyAgICBpZiAoX3diLlN0eWxlcy5OYW1lZFN0eWxlcy5FeGlzdHNLZXkobmFtZSkpIHsKKyAgICAgIHRocm93IG5ldyhzdHJpbmcuRm9ybWF0KCJLZXkgezB9IGFscmVhZHkgZXhpc3RzIGluIGNvbGxlY3Rpb24iLCBuYW1lKSk7CisgICAgfQorCisgICAgRXhjZWxOYW1lZFN0eWxlWG1sIHN0eWxlOworICAgIHN0eWxlID0gbmV3KE5hbWVTcGFjZU1hbmFnZXIsIHRoaXMpOworICAgIGludCB4ZklkQ29weSwKKyAgICAgICAgcG9zaXRpb25JZDsKKyAgICBFeGNlbFN0eWxlcyBzdHlsZXM7CisgICAgaWYgKHRlbXBsYXRlID09IG51bGwpIHsKKyAgICAgIC8vICAgICAgICAgICAgICAgIHN0eWxlLlN0eWxlID0gbmV3IEV4Y2VsU3R5bGUodGhpcywgTmFtZWRTdHlsZVByb3BlcnR5Q2hhbmdlLCAtMSwgbmFtZSwgMCk7CisgICAgICB4ZklkQ29weSA9IDA7CisgICAgICBwb3NpdGlvbklkID0gLTE7CisgICAgICBzdHlsZXMgPSB0aGlzOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodGVtcGxhdGUuUG9zaXRpb25JRCA8IDAgJiYgdGVtcGxhdGUuU3R5bGVzID09IHRoaXMpIHsKKyAgICAgICAgeGZJZENvcHkgPSB0ZW1wbGF0ZS5JbmRleDsKKyAgICAgICAgcG9zaXRpb25JZCA9IHRlbXBsYXRlLlBvc2l0aW9uSUQ7CisgICAgICAgIHN0eWxlcyA9IHRoaXM7CisgICAgICAgIC8vc3R5bGUuU3R5bGUgPSBuZXcgRXhjZWxTdHlsZSh0aGlzLCBOYW1lZFN0eWxlUHJvcGVydHlDaGFuZ2UsIFRlbXBsYXRlLlBvc2l0aW9uSUQsIG5hbWUsIFRlbXBsYXRlLkluZGV4KTsKKyAgICAgICAgLy9zdHlsZS5TdHlsZVhmSWQgPSBUZW1wbGF0ZS5JbmRleDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHhmSWRDb3B5ID0gdGVtcGxhdGUuWGZJZDsKKyAgICAgICAgcG9zaXRpb25JZCA9IC0xOworICAgICAgICBzdHlsZXMgPSB0ZW1wbGF0ZS5TdHlsZXM7CisgICAgICB9CisgICAgfQorICAgIC8vQ2xvbmUgbmFtZWRzdHlsZQorICAgIGludCBzdHlsZVhmSWQgPSBDbG9uZVN0eWxlKHN0eWxlcywgeGZJZENvcHksIHRydWUpOworICAgIC8vQ2xvc2UgY2VsbHMgc3R5bGUKKyAgICBDZWxsU3R5bGVYZnNbc3R5bGVYZklkXS5YZklkID0gQ2VsbFN0eWxlWGZzLkNvdW50IC0gMTsKKyAgICBpbnQgeGZpZCA9IENsb25lU3R5bGUoc3R5bGVzLCB4ZklkQ29weSwgZmFsc2UsIHRydWUpOyAvL0Fsd2F5cyBhZGQgYSBuZXcgc3R5bGUgKFdlIGNyZWF0ZSBhIG5ldyBuYW1lZCBzdHlsZSBoZXJlKQorICAgIENlbGxYZnNbeGZpZF0uWGZJZCA9IHN0eWxlWGZJZDsKKyAgICBzdHlsZS5TdHlsZSA9IG5ldyh0aGlzLCBOYW1lZFN0eWxlUHJvcGVydHlDaGFuZ2UsIHBvc2l0aW9uSWQsIG5hbWUsIHN0eWxlWGZJZCk7CisgICAgc3R5bGUuU3R5bGVYZklkID0gc3R5bGVYZklkOworCisgICAgc3R5bGUuTmFtZSA9IG5hbWU7CisgICAgaW50IGl4ID0gX3diLlN0eWxlcy5OYW1lZFN0eWxlcy5BZGQoc3R5bGUuTmFtZSwgc3R5bGUpOworICAgIHN0eWxlLlN0eWxlLlNldEluZGV4KGl4KTsKKyAgICAvL3N0eWxlLlN0eWxlLlhmSWQgPSBpeDsKKyAgICByZXR1cm4gc3R5bGU7CisgIH0KKworICBwdWJsaWMgdm9pZCBVcGRhdGVYbWwoKSB7CisgICAgUmVtb3ZlVW51c2VkU3R5bGVzKCk7CisKKyAgICAvL051bWJlckZvcm1hdAorICAgIFhtbE5vZGUgbmZOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoX251bWJlckZvcm1hdHNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7CisgICAgaWYgKG5mTm9kZSA9PSBudWxsKSB7CisgICAgICBDcmVhdGVOb2RlKF9udW1iZXJGb3JtYXRzUGF0aCwgdHJ1ZSk7CisgICAgICBuZk5vZGUgPSBfc3R5bGVYbWwuU2VsZWN0U2luZ2xlTm9kZShfbnVtYmVyRm9ybWF0c1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICB9IGVsc2UgeworICAgICAgbmZOb2RlLlJlbW92ZUFsbCgpOworICAgIH0KKworICAgIGludCBjb3VudCA9IDA7CisgICAgaW50IG5vcm1hbEl4ID0gTmFtZWRTdHlsZXMuRmluZEluZGV4QnlJZCgiTm9ybWFsIik7CisgICAgaWYgKE5hbWVkU3R5bGVzLkNvdW50ID4gMAorICAgICAgICAmJiBub3JtYWxJeCA+PSAwCisgICAgICAgICYmIE5hbWVkU3R5bGVzW25vcm1hbEl4XS5TdHlsZS5OdW1iZXJmb3JtYXQuTnVtRm10SUQgPj0gMTY0KSB7CisgICAgICBFeGNlbE51bWJlckZvcm1hdFhtbCBuZiA9IE51bWJlckZvcm1hdHNbTnVtYmVyRm9ybWF0cy5GaW5kSW5kZXhCeUlkKAorICAgICAgICAgICAgTmFtZWRTdHlsZXNbbm9ybWFsSXhdLlN0eWxlLk51bWJlcmZvcm1hdC5JZCldOworICAgICAgbmZOb2RlLkFwcGVuZENoaWxkKAorICAgICAgICAgIG5mLkNyZWF0ZVhtbE5vZGUoX3N0eWxlWG1sLkNyZWF0ZUVsZW1lbnQoIm51bUZtdCIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbikpKTsKKyAgICAgIG5mLm5ld0lEID0gY291bnQrKzsKKyAgICB9CisgICAgZm9yZWFjaCAoRXhjZWxOdW1iZXJGb3JtYXRYbWwgbmYgaW4gTnVtYmVyRm9ybWF0cykgeworICAgICAgaWYgKCFuZi5CdWlsZEluIC8qJiYgbmYubmV3SUQ8MCovKSAvL0J1aWxkaW4gZm9ybWF0cyBhcmUgbm90IHVwZGF0ZWQuCisgICAgICB7CisgICAgICAgIG5mTm9kZS5BcHBlbmRDaGlsZCgKKyAgICAgICAgICAgIG5mLkNyZWF0ZVhtbE5vZGUoX3N0eWxlWG1sLkNyZWF0ZUVsZW1lbnQoIm51bUZtdCIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbikpKTsKKyAgICAgICAgbmYubmV3SUQgPSBjb3VudDsKKyAgICAgICAgY291bnQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgKG5mTm9kZSBhcyBYbWxFbGVtZW50KS5TZXRBdHRyaWJ1dGUoImNvdW50IiwgY291bnQuVG9TdHJpbmcoKSk7CisKKyAgICAvL0ZvbnQKKyAgICBjb3VudCA9IDA7CisgICAgWG1sTm9kZSBmbnROb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoX2ZvbnRzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOworICAgIGZudE5vZGUuUmVtb3ZlQWxsKCk7CisKKyAgICAvL05vcm1hbCBzaG91bGQgYmUgZmlyc3QgaW4gdGhlIGNvbGxlY3Rpb24KKyAgICBpZiAoTmFtZWRTdHlsZXMuQ291bnQgPiAwICYmIG5vcm1hbEl4ID49IDAgJiYgTmFtZWRTdHlsZXNbbm9ybWFsSXhdLlN0eWxlLkZvbnQuSW5kZXggPiAwKSB7CisgICAgICBFeGNlbEZvbnRYbWwgZm50ID0gRm9udHNbTmFtZWRTdHlsZXNbbm9ybWFsSXhdLlN0eWxlLkZvbnQuSW5kZXhdOworICAgICAgZm50Tm9kZS5BcHBlbmRDaGlsZCgKKyAgICAgICAgICBmbnQuQ3JlYXRlWG1sTm9kZShfc3R5bGVYbWwuQ3JlYXRlRWxlbWVudCgiZm9udCIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbikpKTsKKyAgICAgIGZudC5uZXdJRCA9IGNvdW50Kys7CisgICAgfQorCisgICAgZm9yZWFjaCAoRXhjZWxGb250WG1sIGZudCBpbiBGb250cykgeworICAgICAgaWYgKGZudC51c2VDbnQKKyAgICAgICAgICA+IDAgLyogJiYgZm50Lm5ld0lEPDAqLykgeworICAgICAgICBmbnROb2RlLkFwcGVuZENoaWxkKAorICAgICAgICAgICAgZm50LkNyZWF0ZVhtbE5vZGUoX3N0eWxlWG1sLkNyZWF0ZUVsZW1lbnQoImZvbnQiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pKSk7CisgICAgICAgIGZudC5uZXdJRCA9IGNvdW50OworICAgICAgICBjb3VudCsrOworICAgICAgfQorICAgIH0KKyAgICAoZm50Tm9kZSBhcyBYbWxFbGVtZW50KS5TZXRBdHRyaWJ1dGUoImNvdW50IiwgY291bnQuVG9TdHJpbmcoKSk7CisKKyAgICAvL0ZpbGxzCisgICAgY291bnQgPSAwOworICAgIFhtbE5vZGUgZmlsbHNOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoX2ZpbGxzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOworICAgIGZpbGxzTm9kZS5SZW1vdmVBbGwoKTsKKyAgICBGaWxsc1swXS51c2VDbnQgPSAxOyAvL011c3QgZXhpc3QgKG5vbmUpOworICAgIEZpbGxzWzFdLnVzZUNudCA9IDE7IC8vTXVzdCBleGlzdCAoZ3JheTEyNSk7CisgICAgZm9yZWFjaCAoRXhjZWxGaWxsWG1sIGZpbGwgaW4gRmlsbHMpIHsKKyAgICAgIGlmIChmaWxsLnVzZUNudCA+IDApIHsKKyAgICAgICAgZmlsbHNOb2RlLkFwcGVuZENoaWxkKAorICAgICAgICAgICAgZmlsbC5DcmVhdGVYbWxOb2RlKF9zdHlsZVhtbC5DcmVhdGVFbGVtZW50KCJmaWxsIiwgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKSkpOworICAgICAgICBmaWxsLm5ld0lEID0gY291bnQ7CisgICAgICAgIGNvdW50Kys7CisgICAgICB9CisgICAgfQorCisgICAgKGZpbGxzTm9kZSBhcyBYbWxFbGVtZW50KS5TZXRBdHRyaWJ1dGUoImNvdW50IiwgY291bnQuVG9TdHJpbmcoKSk7CisKKyAgICAvL0JvcmRlcnMKKyAgICBjb3VudCA9IDA7CisgICAgWG1sTm9kZSBib3JkZXJzTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKF9ib3JkZXJzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOworICAgIGJvcmRlcnNOb2RlLlJlbW92ZUFsbCgpOworICAgIEJvcmRlcnNbMF0udXNlQ250ID0gMTsgLy9NdXN0IGV4aXN0IGJsYW5rOworICAgIGZvcmVhY2ggKEV4Y2VsQm9yZGVyWG1sIGJvcmRlciBpbiBCb3JkZXJzKSB7CisgICAgICBpZiAoYm9yZGVyLnVzZUNudCA+IDApIHsKKyAgICAgICAgYm9yZGVyc05vZGUuQXBwZW5kQ2hpbGQoCisgICAgICAgICAgICBib3JkZXIuQ3JlYXRlWG1sTm9kZShfc3R5bGVYbWwuQ3JlYXRlRWxlbWVudCgiYm9yZGVyIiwgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKSkpOworICAgICAgICBib3JkZXIubmV3SUQgPSBjb3VudDsKKyAgICAgICAgY291bnQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgKGJvcmRlcnNOb2RlIGFzIFhtbEVsZW1lbnQpLlNldEF0dHJpYnV0ZSgiY291bnQiLCBjb3VudC5Ub1N0cmluZygpKTsKKworICAgIFhtbE5vZGUgc3R5bGVYZnNOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoX2NlbGxTdHlsZVhmc1BhdGgsIF9uYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBpZiAoc3R5bGVYZnNOb2RlID09IG51bGwgJiYgTmFtZWRTdHlsZXMuQ291bnQgPiAwKSB7CisgICAgICBDcmVhdGVOb2RlKF9jZWxsU3R5bGVYZnNQYXRoKTsKKyAgICAgIHN0eWxlWGZzTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKF9jZWxsU3R5bGVYZnNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7CisgICAgfQorICAgIGlmIChOYW1lZFN0eWxlcy5Db3VudCA+IDApIHsKKyAgICAgIHN0eWxlWGZzTm9kZS5SZW1vdmVBbGwoKTsKKyAgICB9CisgICAgLy9OYW1lZFN0eWxlcworICAgIGNvdW50ID0gbm9ybWFsSXggPiAtMSA/IDEgOiAwOyAvL0lmIHdlIGhhdmUgYSBub3JtYWwgc3R5bGUsIHdlIG1ha2Ugc3VyZSBpdCdzIGFkZGVkIGZpcnN0LgorCisgICAgWG1sTm9kZSBjZWxsU3R5bGVOb2RlID0gX3N0eWxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoX2NlbGxTdHlsZXNQYXRoLCBfbmFtZVNwYWNlTWFuYWdlcik7CisgICAgaWYgKGNlbGxTdHlsZU5vZGUgIT0gbnVsbCkgeworICAgICAgY2VsbFN0eWxlTm9kZS5SZW1vdmVBbGwoKTsKKyAgICB9CisgICAgWG1sTm9kZSBjZWxsWGZzTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKF9jZWxsWGZzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOworICAgIGNlbGxYZnNOb2RlLlJlbW92ZUFsbCgpOworCisgICAgaWYgKE5hbWVkU3R5bGVzLkNvdW50ID4gMCAmJiBub3JtYWxJeCA+PSAwKSB7CisgICAgICBOYW1lZFN0eWxlc1tub3JtYWxJeF0ubmV3SUQgPSAwOworICAgICAgQWRkTmFtZWRTdHlsZSgwLCBzdHlsZVhmc05vZGUsIGNlbGxYZnNOb2RlLCBOYW1lZFN0eWxlc1tub3JtYWxJeF0pOworICAgIH0KKyAgICBmb3JlYWNoIChFeGNlbE5hbWVkU3R5bGVYbWwgc3R5bGUgaW4gTmFtZWRTdHlsZXMpIHsKKyAgICAgIGlmICghc3R5bGUuTmFtZS5FcXVhbHMoIm5vcm1hbCIsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKSB7CisgICAgICAgIEFkZE5hbWVkU3R5bGUoY291bnQrKywgc3R5bGVYZnNOb2RlLCBjZWxsWGZzTm9kZSwgc3R5bGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3R5bGUubmV3SUQgPSAwOworICAgICAgfQorICAgICAgY2VsbFN0eWxlTm9kZS5BcHBlbmRDaGlsZCgKKyAgICAgICAgICBzdHlsZS5DcmVhdGVYbWxOb2RlKF9zdHlsZVhtbC5DcmVhdGVFbGVtZW50KCJjZWxsU3R5bGUiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pKSk7CisgICAgfQorICAgIGlmIChjZWxsU3R5bGVOb2RlICE9IG51bGwpIHsKKyAgICAgIChjZWxsU3R5bGVOb2RlIGFzIFhtbEVsZW1lbnQpLlNldEF0dHJpYnV0ZSgiY291bnQiLCBjb3VudC5Ub1N0cmluZygpKTsKKyAgICB9CisgICAgaWYgKHN0eWxlWGZzTm9kZSAhPSBudWxsKSB7CisgICAgICAoc3R5bGVYZnNOb2RlIGFzIFhtbEVsZW1lbnQpLlNldEF0dHJpYnV0ZSgiY291bnQiLCBjb3VudC5Ub1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvL0NlbGxTdHlsZQorICAgIGludCB4Zml4ID0gMDsKKyAgICBmb3JlYWNoIChFeGNlbFhmcyB4ZiBpbiBDZWxsWGZzKSB7CisgICAgICBpZiAoeGYudXNlQ250ID4gMCAmJiAhKG5vcm1hbEl4ID49IDAgJiYgTmFtZWRTdHlsZXNbbm9ybWFsSXhdLlhmSWQgPT0geGZpeCkpIHsKKyAgICAgICAgY2VsbFhmc05vZGUuQXBwZW5kQ2hpbGQoCisgICAgICAgICAgICB4Zi5DcmVhdGVYbWxOb2RlKF9zdHlsZVhtbC5DcmVhdGVFbGVtZW50KCJ4ZiIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbikpKTsKKyAgICAgICAgeGYubmV3SUQgPSBjb3VudDsKKyAgICAgICAgY291bnQrKzsKKyAgICAgIH0KKyAgICAgIHhmaXgrKzsKKyAgICB9CisgICAgKGNlbGxYZnNOb2RlIGFzIFhtbEVsZW1lbnQpLlNldEF0dHJpYnV0ZSgiY291bnQiLCBjb3VudC5Ub1N0cmluZygpKTsKKworICAgIC8vU2V0IGR4ZiBzdHlsaW5nIGZvciBjb25kaXRpb25hbCBGb3JtYXR0aW5nCisgICAgWG1sTm9kZSBkeGZzTm9kZSA9IF9zdHlsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKF9keGZzUGF0aCwgX25hbWVTcGFjZU1hbmFnZXIpOworICAgIGZvcmVhY2ggKHZhciB3cyBpbiBfd2IuV29ya3NoZWV0cykgeworICAgICAgaWYgKHdzIGlzIEV4Y2VsQ2hhcnRzaGVldCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGZvcmVhY2ggKHZhciBjZiBpbiB3cy5Db25kaXRpb25hbEZvcm1hdHRpbmcpIHsKKyAgICAgICAgaWYgKGNmLlN0eWxlLkhhc1ZhbHVlKSB7CisgICAgICAgICAgaW50IGl4ID0gRHhmcy5GaW5kSW5kZXhCeUlkKGNmLlN0eWxlLklkKTsKKyAgICAgICAgICBpZiAoaXggPCAwKSB7CisgICAgICAgICAgICAoKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSljZikuRHhmSWQgPSBEeGZzLkNvdW50OworICAgICAgICAgICAgRHhmcy5BZGQoY2YuU3R5bGUuSWQsIGNmLlN0eWxlKTsKKyAgICAgICAgICAgIHZhciBlbGVtID0gKChYbWxEb2N1bWVudClUb3BOb2RlKS5DcmVhdGVFbGVtZW50KCJkIiwgImR4ZiIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgICAgICAgICBjZi5TdHlsZS5DcmVhdGVOb2RlcyhuZXcgWG1sSGVscGVySW5zdGFuY2UoTmFtZVNwYWNlTWFuYWdlciwgZWxlbSksICIiKTsKKyAgICAgICAgICAgIGR4ZnNOb2RlLkFwcGVuZENoaWxkKGVsZW0pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAoKEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nUnVsZSljZikuRHhmSWQgPSBpeDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGR4ZnNOb2RlICE9IG51bGwpIHsKKyAgICAgIChkeGZzTm9kZSBhcyBYbWxFbGVtZW50KS5TZXRBdHRyaWJ1dGUoImNvdW50IiwgRHhmcy5Db3VudC5Ub1N0cmluZygpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgQWRkTmFtZWRTdHlsZSgKKyAgICAgIGludCBpZCwKKyAgICAgIFhtbE5vZGUgc3R5bGVYZnNOb2RlLAorICAgICAgWG1sTm9kZSBjZWxsWGZzTm9kZSwKKyAgICAgIEV4Y2VsTmFtZWRTdHlsZVhtbCBzdHlsZSkgeworICAgIHZhciBzdHlsZVhmcyA9IENlbGxTdHlsZVhmc1tzdHlsZS5TdHlsZVhmSWRdOworICAgIHN0eWxlWGZzTm9kZS5BcHBlbmRDaGlsZCgKKyAgICAgICAgc3R5bGVYZnMuQ3JlYXRlWG1sTm9kZShfc3R5bGVYbWwuQ3JlYXRlRWxlbWVudCgieGYiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pLCB0cnVlKSk7CisgICAgc3R5bGVYZnMubmV3SUQgPSBpZDsKKyAgICBzdHlsZVhmcy5YZklkID0gc3R5bGUuU3R5bGVYZklkOworCisgICAgdmFyIGl4ID0gQ2VsbFhmcy5GaW5kSW5kZXhCeUlkKHN0eWxlWGZzLklkKTsKKyAgICBpZiAoaXggPCAwKSB7CisgICAgICBjZWxsWGZzTm9kZS5BcHBlbmRDaGlsZCgKKyAgICAgICAgICBzdHlsZVhmcy5DcmVhdGVYbWxOb2RlKF9zdHlsZVhtbC5DcmVhdGVFbGVtZW50KCJ4ZiIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbikpKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGlkIDwgMCkgeworICAgICAgICBDZWxsWGZzW2l4XS5YZklkID0gaWQ7CisgICAgICB9CisgICAgICBjZWxsWGZzTm9kZS5BcHBlbmRDaGlsZCgKKyAgICAgICAgICBDZWxsWGZzW2l4XS5DcmVhdGVYbWxOb2RlKF9zdHlsZVhtbC5DcmVhdGVFbGVtZW50KCJ4ZiIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbikpKTsKKyAgICAgIENlbGxYZnNbaXhdLnVzZUNudCA9IDA7CisgICAgICBDZWxsWGZzW2l4XS5uZXdJRCA9IGlkOworICAgIH0KKworICAgIGlmIChzdHlsZS5YZklkID49IDApIHsKKyAgICAgIHN0eWxlLlhmSWQgPSBDZWxsWGZzW3N0eWxlLlhmSWRdLm5ld0lEOworICAgIH0gZWxzZSB7CisgICAgICBzdHlsZS5YZklkID0gMDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgUmVtb3ZlVW51c2VkU3R5bGVzKCkgeworICAgIENlbGxYZnNbMF0udXNlQ250ID0gMTsgLy9GaXJzdCBpdGVtIGlzIGFsbHdheXMgdXNlZC4KKyAgICBmb3JlYWNoIChFeGNlbFdvcmtzaGVldCBzaGVldCBpbiBfd2IuV29ya3NoZWV0cykgeworICAgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxpbnQ+KHNoZWV0Ll9zdHlsZXMpOworICAgICAgd2hpbGUgKGNzZS5OZXh0KCkpIHsKKyAgICAgICAgdmFyIHYgPSBjc2UuVmFsdWU7CisgICAgICAgIGlmICh2ID49IDApIHsKKyAgICAgICAgICBDZWxsWGZzW3ZdLnVzZUNudCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZvcmVhY2ggKEV4Y2VsTmFtZWRTdHlsZVhtbCBucyBpbiBOYW1lZFN0eWxlcykgeworICAgICAgQ2VsbFN0eWxlWGZzW25zLlN0eWxlWGZJZF0udXNlQ250Kys7CisgICAgfQorCisgICAgZm9yZWFjaCAoRXhjZWxYZnMgeGYgaW4gQ2VsbFhmcykgeworICAgICAgaWYgKHhmLnVzZUNudCA+IDApIHsKKyAgICAgICAgaWYgKHhmLkZvbnRJZCA+PSAwKSB7CisgICAgICAgICAgRm9udHNbeGYuRm9udElkXS51c2VDbnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoeGYuRmlsbElkID49IDApIHsKKyAgICAgICAgICBGaWxsc1t4Zi5GaWxsSWRdLnVzZUNudCsrOworICAgICAgICB9CisgICAgICAgIGlmICh4Zi5Cb3JkZXJJZCA+PSAwKSB7CisgICAgICAgICAgQm9yZGVyc1t4Zi5Cb3JkZXJJZF0udXNlQ250Kys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZm9yZWFjaCAoRXhjZWxYZnMgeGYgaW4gQ2VsbFN0eWxlWGZzKSB7CisgICAgICBpZiAoeGYudXNlQ250ID4gMCkgeworICAgICAgICBpZiAoeGYuRm9udElkID49IDApIHsKKyAgICAgICAgICBGb250c1t4Zi5Gb250SWRdLnVzZUNudCsrOworICAgICAgICB9CisgICAgICAgIGlmICh4Zi5GaWxsSWQgPj0gMCkgeworICAgICAgICAgIEZpbGxzW3hmLkZpbGxJZF0udXNlQ250Kys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHhmLkJvcmRlcklkID49IDApIHsKKyAgICAgICAgICBCb3JkZXJzW3hmLkJvcmRlcklkXS51c2VDbnQrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGludGVybmFsIGludCBHZXRTdHlsZUlkRnJvbU5hbWUoc3RyaW5nIG5hbWUpIHsKKyAgICBpbnQgaSA9IE5hbWVkU3R5bGVzLkZpbmRJbmRleEJ5SWQobmFtZSk7CisgICAgaWYgKGkgPj0gMCkgeworICAgICAgaW50IGlkID0gTmFtZWRTdHlsZXNbaV0uWGZJZDsKKyAgICAgIGlmIChpZCA8IDApIHsKKyAgICAgICAgaW50IHN0eWxlWGZJZCA9IE5hbWVkU3R5bGVzW2ldLlN0eWxlWGZJZDsKKyAgICAgICAgRXhjZWxYZnMgbmV3U3R5bGUgPSBDZWxsU3R5bGVYZnNbc3R5bGVYZklkXS5Db3B5KCk7CisgICAgICAgIG5ld1N0eWxlLlhmSWQgPSBzdHlsZVhmSWQ7CisgICAgICAgIGlkID0gQ2VsbFhmcy5GaW5kSW5kZXhCeUlkKG5ld1N0eWxlLklkKTsKKyAgICAgICAgaWYgKGlkIDwgMCkgeworICAgICAgICAgIGlkID0gQ2VsbFhmcy5BZGQobmV3U3R5bGUuSWQsIG5ld1N0eWxlKTsKKyAgICAgICAgfQorICAgICAgICBOYW1lZFN0eWxlc1tpXS5YZklkID0gaWQ7CisgICAgICB9CisgICAgICByZXR1cm4gaWQ7CisgICAgfQorICAgIHJldHVybiAwOworICAgIC8vdGhyb3cobmV3IEV4Y2VwdGlvbigiTmFtZWQgc3R5bGUgZG9lcyBub3QgZXhpc3QiKSk7CisgIH0KKworICBwcml2YXRlIGludCBHZXRYbWxOb2RlSW50KFhtbE5vZGUgbm9kZSkgeworICAgIGludCBpOworICAgIGlmIChpbnQuVHJ5UGFyc2UoR2V0WG1sTm9kZShub2RlKSwgb3V0IGkpKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcml2YXRlIHN0cmluZyBHZXRYbWxOb2RlKFhtbE5vZGUgbm9kZSkgeworICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisgICAgaWYgKG5vZGUuVmFsdWUgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIG5vZGUuVmFsdWU7CisgICAgfQorICAgIHJldHVybiAiIjsKKyAgfQorCisgIGludGVybmFsIGludCBDbG9uZVN0eWxlKEV4Y2VsU3R5bGVzIHN0eWxlLCBpbnQgc3R5bGVJZCkgeworICAgIHJldHVybiBDbG9uZVN0eWxlKHN0eWxlLCBzdHlsZUlkLCBmYWxzZSwgZmFsc2UpOworICB9CisKKyAgaW50ZXJuYWwgaW50IENsb25lU3R5bGUoRXhjZWxTdHlsZXMgc3R5bGUsIGludCBzdHlsZUlkLCBib29sIGlzTmFtZWRTdHlsZSkgeworICAgIHJldHVybiBDbG9uZVN0eWxlKHN0eWxlLCBzdHlsZUlkLCBpc05hbWVkU3R5bGUsIGZhbHNlKTsKKyAgfQorCisgIGludGVybmFsIGludCBDbG9uZVN0eWxlKEV4Y2VsU3R5bGVzIHN0eWxlLCBpbnQgc3R5bGVJZCwgYm9vbCBpc05hbWVkU3R5bGUsIGJvb2wgYWxsd2F5c0FkZCkgeworICAgIEV4Y2VsWGZzIHhmczsKKyAgICBsb2NrIChzdHlsZSkgeworICAgICAgaWYgKGlzTmFtZWRTdHlsZSkgeworICAgICAgICB4ZnMgPSBzdHlsZS5DZWxsU3R5bGVYZnNbc3R5bGVJZF07CisgICAgICB9IGVsc2UgeworICAgICAgICB4ZnMgPSBzdHlsZS5DZWxsWGZzW3N0eWxlSWRdOworICAgICAgfQorICAgICAgRXhjZWxYZnMgbmV3WGZzID0geGZzLkNvcHkodGhpcyk7CisgICAgICAvL051bWJlcmZvcm1hdAorICAgICAgaWYgKHhmcy5OdW1iZXJGb3JtYXRJZCA+IDApIHsKKyAgICAgICAgLy9yYWtlMzY6IFR3byBwcm9ibGVtcyBoZXJlLi4uCisgICAgICAgIC8vcmFrZTM2OiAgMS4gdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCB3aGVuIGZvcm1hdCBzdGF5cyBlcXVhbCB0byBTdHJpbmcuRW1wdHksIGl0IGFkZHMgYSBzdHJpbmcuZW1wdHkgdG8gdGhlIGxpc3Qgb2YgTnVtYmVyIEZvcm1hdHMKKyAgICAgICAgLy9yYWtlMzY6ICAyLiB3aGVuIGFkZGluZyBhIHNlY29uZCBzaGVldCwgaWYgdGhlIG51bWJlcmZvcm1hdGlkID09IDE2NCwgaXQgZmluZHMgdGhlIDE2NCBhZGRlZCBieSBwcmV2aW91cyBzaGVldHMgYnV0IHdhcyB1c2luZyB0aGUgYXJyYXkgaW5kZXgKKyAgICAgICAgLy9yYWtlMzY6ICAgICAgZm9yIHRoZSBudW1iZXJmb3JtYXRpZAorCisgICAgICAgIHN0cmluZyBmb3JtYXQgPSBzdHJpbmcuRW1wdHk7CisgICAgICAgIGZvcmVhY2ggKHZhciBmbXQgaW4gc3R5bGUuTnVtYmVyRm9ybWF0cykgeworICAgICAgICAgIGlmIChmbXQuTnVtRm10SWQgPT0geGZzLk51bWJlckZvcm1hdElkKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBmbXQuRm9ybWF0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vcmFrZTM2OiBEb24ndCBhZGQgYW5vdGhlciBmb3JtYXQgaWYgaXQncyBibGFuaworICAgICAgICBpZiAoIVN0cmluZy5Jc051bGxPckVtcHR5KGZvcm1hdCkpIHsKKyAgICAgICAgICBpbnQgaXggPSBOdW1iZXJGb3JtYXRzLkZpbmRJbmRleEJ5SWQoZm9ybWF0KTsKKyAgICAgICAgICBpZiAoaXggPCAwKSB7CisgICAgICAgICAgICB2YXIgaXRlbSA9IG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyKSB7CisgICAgICAgICAgICAgIEZvcm1hdCA9IGZvcm1hdCwKKyAgICAgICAgICAgICAgTnVtRm10SWQgPSBOdW1iZXJGb3JtYXRzLk5leHRJZCsrLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKGZvcm1hdCwgaXRlbSk7CisgICAgICAgICAgICAvL3Jha2UzNjogVXNlIHRoZSBqdXN0IGFkZGVkIGZvcm1hdCBpZAorICAgICAgICAgICAgbmV3WGZzLk51bWJlckZvcm1hdElkID0gaXRlbS5OdW1GbXRJZDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy9yYWtlMzY6IFVzZSB0aGUgZm9ybWF0IGlkIGRlZmluZWQgYnkgdGhlIGluZGV4Li4uIG5vdCB0aGUgaW5kZXggaXRzZWxmCisgICAgICAgICAgICBuZXdYZnMuTnVtYmVyRm9ybWF0SWQgPSBOdW1iZXJGb3JtYXRzW2l4XS5OdW1GbXRJZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy9Gb250CisgICAgICBpZiAoeGZzLkZvbnRJZCA+IC0xKSB7CisgICAgICAgIGludCBpeCA9IEZvbnRzLkZpbmRJbmRleEJ5SWQoeGZzLkZvbnQuSWQpOworICAgICAgICBpZiAoaXggPCAwKSB7CisgICAgICAgICAgRXhjZWxGb250WG1sIGl0ZW0gPSBzdHlsZS5Gb250c1t4ZnMuRm9udElkXS5Db3B5KCk7CisgICAgICAgICAgaXggPSBGb250cy5BZGQoeGZzLkZvbnQuSWQsIGl0ZW0pOworICAgICAgICB9CisgICAgICAgIG5ld1hmcy5Gb250SWQgPSBpeDsKKyAgICAgIH0KKworICAgICAgLy9Cb3JkZXIKKyAgICAgIGlmICh4ZnMuQm9yZGVySWQgPiAtMSkgeworICAgICAgICBpbnQgaXggPSBCb3JkZXJzLkZpbmRJbmRleEJ5SWQoeGZzLkJvcmRlci5JZCk7CisgICAgICAgIGlmIChpeCA8IDApIHsKKyAgICAgICAgICBFeGNlbEJvcmRlclhtbCBpdGVtID0gc3R5bGUuQm9yZGVyc1t4ZnMuQm9yZGVySWRdLkNvcHkoKTsKKyAgICAgICAgICBpeCA9IEJvcmRlcnMuQWRkKHhmcy5Cb3JkZXIuSWQsIGl0ZW0pOworICAgICAgICB9CisgICAgICAgIG5ld1hmcy5Cb3JkZXJJZCA9IGl4OworICAgICAgfQorCisgICAgICAvL0ZpbGwKKyAgICAgIGlmICh4ZnMuRmlsbElkID4gLTEpIHsKKyAgICAgICAgaW50IGl4ID0gRmlsbHMuRmluZEluZGV4QnlJZCh4ZnMuRmlsbC5JZCk7CisgICAgICAgIGlmIChpeCA8IDApIHsKKyAgICAgICAgICB2YXIgaXRlbSA9IHN0eWxlLkZpbGxzW3hmcy5GaWxsSWRdLkNvcHkoKTsKKyAgICAgICAgICBpeCA9IEZpbGxzLkFkZCh4ZnMuRmlsbC5JZCwgaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgbmV3WGZzLkZpbGxJZCA9IGl4OworICAgICAgfQorCisgICAgICAvL05hbWVkIHN0eWxlIHJlZmVyZW5jZQorICAgICAgaWYgKHhmcy5YZklkID4gMCkgeworICAgICAgICB2YXIgaWQgPSBzdHlsZS5DZWxsU3R5bGVYZnNbeGZzLlhmSWRdLklkOworICAgICAgICB2YXIgbmV3SWQgPSBDZWxsU3R5bGVYZnMuRmluZEluZGV4QnlJZChpZCk7CisgICAgICAgIGlmIChuZXdJZCA+PSAwKSB7CisgICAgICAgICAgbmV3WGZzLlhmSWQgPSBuZXdJZDsKKyAgICAgICAgfSBlbHNlIGlmIChzdHlsZS5fd2IgIT0gX3diCisgICAgICAgICAgICAmJiBhbGx3YXlzQWRkCisgICAgICAgICAgICAgICAgPT0gZmFsc2UpIC8vTm90IHRoZSBzYW1lIHdvcmtib29rLCBjb3B5IHRoZSBuYW1lZHN0eWxlIHRvIHRoZSB3b3JrYm9vayBvciBtYXRjaCB0aGUgaWQKKyAgICAgICAgeworICAgICAgICAgIHZhciBuc0ZpbmQgPSBzdHlsZS5OYW1lZFN0eWxlcy5Ub0RpY3Rpb25hcnkoZCA9PiAoZC5TdHlsZVhmSWQpKTsKKyAgICAgICAgICBpZiAobnNGaW5kLkNvbnRhaW5zS2V5KHhmcy5YZklkKSkgeworICAgICAgICAgICAgdmFyIHN0ID0gbnNGaW5kW3hmcy5YZklkXTsKKyAgICAgICAgICAgIGlmIChOYW1lZFN0eWxlcy5FeGlzdHNLZXkoc3QuTmFtZSkpIHsKKyAgICAgICAgICAgICAgbmV3WGZzLlhmSWQgPSBOYW1lZFN0eWxlcy5GaW5kSW5kZXhCeUlkKHN0Lk5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgdmFyIG5zID0gQ3JlYXRlTmFtZWRTdHlsZShzdC5OYW1lLCBzdC5TdHlsZSk7CisgICAgICAgICAgICAgIG5ld1hmcy5YZklkID0gTmFtZWRTdHlsZXMuQ291bnQgLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpbnQgaW5kZXg7CisgICAgICBpZiAoaXNOYW1lZFN0eWxlKSB7CisgICAgICAgIGluZGV4ID0gQ2VsbFN0eWxlWGZzLkFkZChuZXdYZnMuSWQsIG5ld1hmcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoYWxsd2F5c0FkZCkgeworICAgICAgICAgIGluZGV4ID0gQ2VsbFhmcy5BZGQobmV3WGZzLklkLCBuZXdYZnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZGV4ID0gQ2VsbFhmcy5GaW5kSW5kZXhCeUlkKG5ld1hmcy5JZCk7CisgICAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgaW5kZXggPSBDZWxsWGZzLkFkZChuZXdYZnMuSWQsIG5ld1hmcyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxUZXh0Rm9ybWF0LmNzIGIvRVBQbHVzL0V4Y2VsVGV4dEZvcm1hdC5jcwppbmRleCAwNDg0OTI1Li44M2IwYzU5IDEwMDY0NAotLS0gYS9FUFBsdXMvRXhjZWxUZXh0Rm9ybWF0LmNzCisrKyBiL0VQUGx1cy9FeGNlbFRleHRGb3JtYXQuY3MKQEAgLTEzLDExOSArMTMsMTI3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDExLTAxLTAxCiAgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIERpc2NyaWJlcyBhIGNvbHVtbiB3aGVuIHJlYWRpbmcgYSB0ZXh0IHVzaW5nIHRoZSBFeGNlbFJhbmdlQmFzZS5Mb2FkRnJvbVRleHQgbWV0aG9kCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlRGF0YVR5cGVzCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMZXQgdGhlIHRoZSBpbXBvcnQgZGVjaWRlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBVbmtub3duLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBbHdheXMgYSBzdHJpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFN0cmluZywKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVHJ5IHRvIGNvbnZlcnQgaXQgdG8gYSBudW1iZXIuIElmIGl0IGZhaWxzIHRoZW4gYWRkIGl0IGFzIGEgc3RyaW5nLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBOdW1iZXIsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRyeSB0byBjb252ZXJ0IGl0IHRvIGEgZGF0ZS4gSWYgaXQgZmFpbHMgdGhlbiBhZGQgaXQgYXMgYSBzdHJpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIERhdGVUaW1lLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUcnkgdG8gY29udmVydCBpdCB0byBhIG51bWJlciBhbmQgZGl2aWRlIHdpdGggMTAwLiAKLSAgICAgICAgLy8vIFJlbW92ZXMgYW55IHRhaWxpbmcgcGVyY2VudCBzaWduICglKS4gSWYgaXQgZmFpbHMgdGhlbiBhZGQgaXQgYXMgYSBzdHJpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFBlcmNlbnQKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBEZXNjcmliZXMgaG93IHRvIHNwbGl0IGEgQ1NWIHRleHQuIFVzZWQgYnkgdGhlIEV4Y2VsUmFuZ2UuTG9hZEZyb21UZXh0IG1ldGhvZAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsVGV4dEZvcm1hdAotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGVzY3JpYmVzIGhvdyB0byBzcGxpdCBhIENTViB0ZXh0Ci0gICAgICAgIC8vLyAKLSAgICAgICAgLy8vIERlZmF1bHQgdmFsdWVzCi0gICAgICAgIC8vLyA8bGlzdD4KLSAgICAgICAgLy8vIDxsaXN0aGVhZGVyPjx0ZXJtPlByb3BlcnR5PC90ZXJtPjxkZXNjcmlwdGlvbj5WYWx1ZTwvZGVzY3JpcHRpb24+PC9saXN0aGVhZGVyPgotICAgICAgICAvLy8gPGl0ZW0+PHRlcm0+RGVsaW1pdGVyPC90ZXJtPjxkZXNjcmlwdGlvbj4sPC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci0gICAgICAgIC8vLyA8aXRlbT48dGVybT5UZXh0UXVhbGlmaWVyPC90ZXJtPjxkZXNjcmlwdGlvbj5Ob25lIChcMCk8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLSAgICAgICAgLy8vIDxpdGVtPjx0ZXJtPkVPTDwvdGVybT48ZGVzY3JpcHRpb24+Q1JMRjwvZGVzY3JpcHRpb24+PC9pdGVtPgotICAgICAgICAvLy8gPGl0ZW0+PHRlcm0+Q3VsdHVyZTwvdGVybT48ZGVzY3JpcHRpb24+Q3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZTwvZGVzY3JpcHRpb24+PC9pdGVtPgotICAgICAgICAvLy8gPGl0ZW0+PHRlcm0+RGF0YVR5cGVzPC90ZXJtPjxkZXNjcmlwdGlvbj5FbmQgb2YgbGluZSBkZWZhdWx0IENSTEY8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLSAgICAgICAgLy8vIDxpdGVtPjx0ZXJtPlNraXBMaW5lc0JlZ2lubmluZzwvdGVybT48ZGVzY3JpcHRpb24+MDwvZGVzY3JpcHRpb24+PC9pdGVtPgotICAgICAgICAvLy8gPGl0ZW0+PHRlcm0+U2tpcExpbmVzRW5kPC90ZXJtPjxkZXNjcmlwdGlvbj4wPC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci0gICAgICAgIC8vLyA8aXRlbT48dGVybT5FbmNvZGluZzwvdGVybT48ZGVzY3JpcHRpb24+RW5jb2RpbmcuQVNDSUk8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLSAgICAgICAgLy8vIDwvbGlzdD4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsVGV4dEZvcm1hdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlbGltaXRlciA9ICcsJzsKLSAgICAgICAgICAgIFRleHRRdWFsaWZpZXIgPSAnXDAnOwotICAgICAgICAgICAgRU9MID0gIlxyXG4iOwotICAgICAgICAgICAgQ3VsdHVyZSA9IEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmU7Ci0gICAgICAgICAgICBEYXRhVHlwZXM9bnVsbDsKLSAgICAgICAgICAgIFNraXBMaW5lc0JlZ2lubmluZyA9IDA7Ci0gICAgICAgICAgICBTa2lwTGluZXNFbmQgPSAwOwotICAgICAgICAgICAgRW5jb2Rpbmc9RW5jb2RpbmcuQVNDSUk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGVsaW1pdGVyIGNoYXJhY3RlcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgY2hhciBEZWxpbWl0ZXIgeyBnZXQ7IHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUZXh0IHF1YWxpZmllciBjaGFyYWN0ZXIgCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjaGFyIFRleHRRdWFsaWZpZXIge2dldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEVuZCBvZiBsaW5lIGNoYXJhY3RlcnMuIERlZmF1bHQgQ1JMRgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIEVPTCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERhdGF0eXBlcyBsaXN0IGZvciBlYWNoIGNvbHVtbiAoaWYgY29sdW1uIGlzIG5vdCBwcmVzZW50IFVua25vd24gaXMgYXNzdW1lZCkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGVEYXRhVHlwZXNbXSBEYXRhVHlwZXMgeyBnZXQ7IHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDdWx0dXJlIHVzZWQgd2hlbiBwYXJzaW5nLiBEZWZhdWx0IEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEN1bHR1cmVJbmZvIEN1bHR1cmUge2dldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE51bWJlciBvZiBsaW5lcyBza2lwZWQgaW4gdGhlIGJlZ2luaW5nIG9mIHRoZSBmaWxlLiBEZWZhdWx0IDAuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgU2tpcExpbmVzQmVnaW5uaW5nIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTnVtYmVyIG9mIGxpbmVzIHNraXBlZCBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBEZWZhdWx0IDAuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgU2tpcExpbmVzRW5kIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gT25seSB1c2VkIHdoZW4gcmVhZGluZyBmaWxlcyBmcm9tIGRpc2sgdXNpbmcgYSBGaWxlSW5mbyBvYmplY3QuIERlZmF1bHQgQXNjSUkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEVuY29kaW5nIEVuY29kaW5nIHsgZ2V0OyBzZXQ7IH0KLSAgICB9Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5UZXh0OworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbDsKKworLy8vIDxzdW1tYXJ5PgorLy8vIERpc2NyaWJlcyBhIGNvbHVtbiB3aGVuIHJlYWRpbmcgYSB0ZXh0IHVzaW5nIHRoZSBFeGNlbFJhbmdlQmFzZS5Mb2FkRnJvbVRleHQgbWV0aG9kCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gZURhdGFUeXBlcyB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIExldCB0aGUgdGhlIGltcG9ydCBkZWNpZGUuCisgIC8vLyA8L3N1bW1hcnk+CisgIFVua25vd24sCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWx3YXlzIGEgc3RyaW5nLgorICAvLy8gPC9zdW1tYXJ5PgorICBTdHJpbmcsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHJ5IHRvIGNvbnZlcnQgaXQgdG8gYSBudW1iZXIuIElmIGl0IGZhaWxzIHRoZW4gYWRkIGl0IGFzIGEgc3RyaW5nLgorICAvLy8gPC9zdW1tYXJ5PgorICBOdW1iZXIsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHJ5IHRvIGNvbnZlcnQgaXQgdG8gYSBkYXRlLiBJZiBpdCBmYWlscyB0aGVuIGFkZCBpdCBhcyBhIHN0cmluZy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgRGF0ZVRpbWUsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHJ5IHRvIGNvbnZlcnQgaXQgdG8gYSBudW1iZXIgYW5kIGRpdmlkZSB3aXRoIDEwMC4KKyAgLy8vIFJlbW92ZXMgYW55IHRhaWxpbmcgcGVyY2VudCBzaWduICglKS4gSWYgaXQgZmFpbHMgdGhlbiBhZGQgaXQgYXMgYSBzdHJpbmcuCisgIC8vLyA8L3N1bW1hcnk+CisgIFBlcmNlbnQsCit9CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBEZXNjcmliZXMgaG93IHRvIHNwbGl0IGEgQ1NWIHRleHQuIFVzZWQgYnkgdGhlIEV4Y2VsUmFuZ2UuTG9hZEZyb21UZXh0IG1ldGhvZAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbFRleHRGb3JtYXQgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBEZXNjcmliZXMgaG93IHRvIHNwbGl0IGEgQ1NWIHRleHQKKyAgLy8vCisgIC8vLyBEZWZhdWx0IHZhbHVlcworICAvLy8gPGxpc3Q+CisgIC8vLyA8bGlzdGhlYWRlcj48dGVybT5Qcm9wZXJ0eTwvdGVybT48ZGVzY3JpcHRpb24+VmFsdWU8L2Rlc2NyaXB0aW9uPjwvbGlzdGhlYWRlcj4KKyAgLy8vIDxpdGVtPjx0ZXJtPkRlbGltaXRlcjwvdGVybT48ZGVzY3JpcHRpb24+LDwvZGVzY3JpcHRpb24+PC9pdGVtPgorICAvLy8gPGl0ZW0+PHRlcm0+VGV4dFF1YWxpZmllcjwvdGVybT48ZGVzY3JpcHRpb24+Tm9uZSAoXDApPC9kZXNjcmlwdGlvbj48L2l0ZW0+CisgIC8vLyA8aXRlbT48dGVybT5FT0w8L3Rlcm0+PGRlc2NyaXB0aW9uPkNSTEY8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KKyAgLy8vIDxpdGVtPjx0ZXJtPkN1bHR1cmU8L3Rlcm0+PGRlc2NyaXB0aW9uPkN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmU8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KKyAgLy8vIDxpdGVtPjx0ZXJtPkRhdGFUeXBlczwvdGVybT48ZGVzY3JpcHRpb24+RW5kIG9mIGxpbmUgZGVmYXVsdCBDUkxGPC9kZXNjcmlwdGlvbj48L2l0ZW0+CisgIC8vLyA8aXRlbT48dGVybT5Ta2lwTGluZXNCZWdpbm5pbmc8L3Rlcm0+PGRlc2NyaXB0aW9uPjA8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KKyAgLy8vIDxpdGVtPjx0ZXJtPlNraXBMaW5lc0VuZDwvdGVybT48ZGVzY3JpcHRpb24+MDwvZGVzY3JpcHRpb24+PC9pdGVtPgorICAvLy8gPGl0ZW0+PHRlcm0+RW5jb2Rpbmc8L3Rlcm0+PGRlc2NyaXB0aW9uPkVuY29kaW5nLkFTQ0lJPC9kZXNjcmlwdGlvbj48L2l0ZW0+CisgIC8vLyA8L2xpc3Q+CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFRleHRGb3JtYXQoKSB7CisgICAgRGVsaW1pdGVyID0gJywnOworICAgIFRleHRRdWFsaWZpZXIgPSAnXDAnOworICAgIEVPTCA9ICJcclxuIjsKKyAgICBDdWx0dXJlID0gQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZTsKKyAgICBEYXRhVHlwZXMgPSBudWxsOworICAgIFNraXBMaW5lc0JlZ2lubmluZyA9IDA7CisgICAgU2tpcExpbmVzRW5kID0gMDsKKyAgICBFbmNvZGluZyA9IEVuY29kaW5nLkFTQ0lJOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRGVsaW1pdGVyIGNoYXJhY3RlcgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY2hhciBEZWxpbWl0ZXIgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRleHQgcXVhbGlmaWVyIGNoYXJhY3RlcgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgY2hhciBUZXh0UXVhbGlmaWVyIHsgZ2V0OyBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFbmQgb2YgbGluZSBjaGFyYWN0ZXJzLiBEZWZhdWx0IENSTEYKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBFT0wgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIERhdGF0eXBlcyBsaXN0IGZvciBlYWNoIGNvbHVtbiAoaWYgY29sdW1uIGlzIG5vdCBwcmVzZW50IFVua25vd24gaXMgYXNzdW1lZCkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGVEYXRhVHlwZXNbXSBEYXRhVHlwZXMgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEN1bHR1cmUgdXNlZCB3aGVuIHBhcnNpbmcuIERlZmF1bHQgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgQ3VsdHVyZUluZm8gQ3VsdHVyZSB7IGdldDsgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTnVtYmVyIG9mIGxpbmVzIHNraXBlZCBpbiB0aGUgYmVnaW5pbmcgb2YgdGhlIGZpbGUuIERlZmF1bHQgMC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBTa2lwTGluZXNCZWdpbm5pbmcgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE51bWJlciBvZiBsaW5lcyBza2lwZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4gRGVmYXVsdCAwLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IFNraXBMaW5lc0VuZCB7IGdldDsgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gT25seSB1c2VkIHdoZW4gcmVhZGluZyBmaWxlcyBmcm9tIGRpc2sgdXNpbmcgYSBGaWxlSW5mbyBvYmplY3QuIERlZmF1bHQgQXNjSUkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEVuY29kaW5nIEVuY29kaW5nIHsgZ2V0OyBzZXQ7IH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFdvcmtib29rLmNzIGIvRVBQbHVzL0V4Y2VsV29ya2Jvb2suY3MKaW5kZXggZjUyOTgyNi4uYWRhMzVlYSAxMDA2NDQKLS0tIGEvRVBQbHVzL0V4Y2VsV29ya2Jvb2suY3MKKysrIGIvRVBQbHVzL0V4Y2VsV29ya2Jvb2suY3MKQEAgLTEzLDkzNiArMTMsODc2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgIDIwMTEtMDEtMDEKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKICAqIFJpY2hhcmQgVGFsbGVudAkJRml4IGVzY2FwaW5nIG9mIHF1b3RlcwkJCQkJMjAxMi0xMC0zMQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBTeXN0ZW0uSU87CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCi17Ci0JI3JlZ2lvbiBQdWJsaWMgRW51bSBFeGNlbENhbGNNb2RlCi0JLy8vIDxzdW1tYXJ5PgotCS8vLyBIb3cgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxjdWxhdGUgZm9ybXVsYXMgaW4gdGhlIHdvcmtib29rCi0JLy8vIDwvc3VtbWFyeT4KLQlwdWJsaWMgZW51bSBFeGNlbENhbGNNb2RlCi0JewotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBJbmRpY2F0ZXMgdGhhdCBjYWxjdWxhdGlvbnMgaW4gdGhlIHdvcmtib29rIGFyZSBwZXJmb3JtZWQgYXV0b21hdGljYWxseSB3aGVuIGNlbGwgdmFsdWVzIGNoYW5nZS4gCi0JCS8vLyBUaGUgYXBwbGljYXRpb24gcmVjYWxjdWxhdGVzIHRob3NlIGNlbGxzIHRoYXQgYXJlIGRlcGVuZGVudCBvbiBvdGhlciBjZWxscyB0aGF0IGNvbnRhaW4gY2hhbmdlZCB2YWx1ZXMuIAotCQkvLy8gVGhpcyBtb2RlIG9mIGNhbGN1bGF0aW9uIGhlbHBzIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGNhbGN1bGF0aW9ucy4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJQXV0b21hdGljLAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBJbmRpY2F0ZXMgdGFibGVzIGJlIGV4Y2x1ZGVkIGR1cmluZyBhdXRvbWF0aWMgY2FsY3VsYXRpb24KLQkJLy8vIDwvc3VtbWFyeT4KLQkJQXV0b21hdGljTm9UYWJsZSwKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gSW5kaWNhdGVzIHRoYXQgY2FsY3VsYXRpb25zIGluIHRoZSB3b3JrYm9vayBiZSB0cmlnZ2VyZWQgbWFudWFsbHkgYnkgdGhlIHVzZXIuIAotCQkvLy8gPC9zdW1tYXJ5PgotCQlNYW51YWwKLQl9Ci0JI2VuZHJlZ2lvbgorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWw7CiAKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIFJlcHJlc2VudHMgdGhlIEV4Y2VsIHdvcmtib29rIGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gYWxsIHRoZSAKLQkvLy8gZG9jdW1lbnQgcHJvcGVydGllcyBhbmQgd29ya3NoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rLgotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbFdvcmtib29rIDogWG1sSGVscGVyCi0JewotCQlpbnRlcm5hbCBjbGFzcyBTaGFyZWRTdHJpbmdJdGVtCi0JCXsKLQkJCWludGVybmFsIGludCBwb3M7Ci0JCQlpbnRlcm5hbCBzdHJpbmcgVGV4dDsKLQkJCWludGVybmFsIGJvb2wgaXNSaWNoVGV4dCA9IGZhbHNlOwotCQl9Ci0JCSNyZWdpb24gUHJpdmF0ZSBQcm9wZXJ0aWVzCi0JCWludGVybmFsIEV4Y2VsUGFja2FnZSBfcGFja2FnZTsKLQkJcHJpdmF0ZSBFeGNlbFdvcmtzaGVldHMgX3dvcmtzaGVldHM7Ci0JCXByaXZhdGUgT2ZmaWNlUHJvcGVydGllcyBfcHJvcGVydGllczsKKy8vLyA8c3VtbWFyeT4KKy8vLyBIb3cgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxjdWxhdGUgZm9ybXVsYXMgaW4gdGhlIHdvcmtib29rCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gRXhjZWxDYWxjTW9kZSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluZGljYXRlcyB0aGF0IGNhbGN1bGF0aW9ucyBpbiB0aGUgd29ya2Jvb2sgYXJlIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5IHdoZW4gY2VsbCB2YWx1ZXMgY2hhbmdlLgorICAvLy8gVGhlIGFwcGxpY2F0aW9uIHJlY2FsY3VsYXRlcyB0aG9zZSBjZWxscyB0aGF0IGFyZSBkZXBlbmRlbnQgb24gb3RoZXIgY2VsbHMgdGhhdCBjb250YWluIGNoYW5nZWQgdmFsdWVzLgorICAvLy8gVGhpcyBtb2RlIG9mIGNhbGN1bGF0aW9uIGhlbHBzIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGNhbGN1bGF0aW9ucy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgQXV0b21hdGljLAogCi0JCXByaXZhdGUgRXhjZWxTdHlsZXMgX3N0eWxlczsKLQkJI2VuZHJlZ2lvbgorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbmRpY2F0ZXMgdGFibGVzIGJlIGV4Y2x1ZGVkIGR1cmluZyBhdXRvbWF0aWMgY2FsY3VsYXRpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgQXV0b21hdGljTm9UYWJsZSwKIAotCQkjcmVnaW9uIEV4Y2VsV29ya2Jvb2sgQ29uc3RydWN0b3IKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRXhjZWxXb3JrYm9vayBjbGFzcy4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJwYWNrYWdlIj5UaGUgcGFyZW50IHBhY2thZ2U8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9Im5hbWVzcGFjZU1hbmFnZXIiPk5hbWVzcGFjZU1hbmFnZXI8L3BhcmFtPgotCQlpbnRlcm5hbCBFeGNlbFdvcmtib29rKEV4Y2VsUGFja2FnZSBwYWNrYWdlLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpIDoKLQkJCWJhc2UobmFtZXNwYWNlTWFuYWdlcikKLQkJewotCQkJX3BhY2thZ2UgPSBwYWNrYWdlOwotCQkJV29ya2Jvb2tVcmkgPSBuZXcgVXJpKCIveGwvd29ya2Jvb2sueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSk7Ci0JCQlTaGFyZWRTdHJpbmdzVXJpID0gbmV3IFVyaSgiL3hsL3NoYXJlZFN0cmluZ3MueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSk7Ci0JCQlTdHlsZXNVcmkgPSBuZXcgVXJpKCIveGwvc3R5bGVzLnhtbCIsIFVyaUtpbmQuUmVsYXRpdmUpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbmRpY2F0ZXMgdGhhdCBjYWxjdWxhdGlvbnMgaW4gdGhlIHdvcmtib29rIGJlIHRyaWdnZXJlZCBtYW51YWxseSBieSB0aGUgdXNlci4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgTWFudWFsLAorfQogCi0JCQlfbmFtZXMgPSBuZXcgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbih0aGlzKTsKLQkJCV9uYW1lc3BhY2VNYW5hZ2VyID0gbmFtZXNwYWNlTWFuYWdlcjsKLQkJCVRvcE5vZGUgPSBXb3JrYm9va1htbC5Eb2N1bWVudEVsZW1lbnQ7Ci0JCQlTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAiZmlsZVZlcnNpb24iLCAiZmlsZVNoYXJpbmciLCAid29ya2Jvb2tQciIsICJ3b3JrYm9va1Byb3RlY3Rpb24iLCAiYm9va1ZpZXdzIiwgInNoZWV0cyIsICJmdW5jdGlvbkdyb3VwcyIsICJmdW5jdGlvblByb3RvdHlwZXMiLCAiZXh0ZXJuYWxSZWZlcmVuY2VzIiwgImRlZmluZWROYW1lcyIsICJjYWxjUHIiLCAib2xlU2l6ZSIsICJjdXN0b21Xb3JrYm9va1ZpZXdzIiwgInBpdm90Q2FjaGVzIiwgInNtYXJ0VGFnUHIiLCAic21hcnRUYWdUeXBlcyIsICJ3ZWJQdWJsaXNoaW5nIiwgImZpbGVSZWNvdmVyeVByIiwgfTsKLQkJICAgIEZ1bGxDYWxjT25Mb2FkID0gdHJ1ZTsgIC8vRnVsbCBjYWxjdWxhdGlvbiBvbiBsb2FkIGJ5IGRlZmF1bHQsIGZvciBib3RoIG5ldyB3b3JrYm9va3MgYW5kIHRlbXBsYXRlcy4KLQkJCUdldFNoYXJlZFN0cmluZ3MoKTsKLQkJfQotCQkjZW5kcmVnaW9uCisvLy8gPHN1bW1hcnk+CisvLy8gUmVwcmVzZW50cyB0aGUgRXhjZWwgd29ya2Jvb2sgYW5kIHByb3ZpZGVzIGFjY2VzcyB0byBhbGwgdGhlCisvLy8gZG9jdW1lbnQgcHJvcGVydGllcyBhbmQgd29ya3NoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rLgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxXb3JrYm9vayA6IFhtbEhlbHBlciB7CisgIGludGVybmFsIGNsYXNzIFNoYXJlZFN0cmluZ0l0ZW0geworICAgIGludGVybmFsIGludCBwb3M7CisgICAgaW50ZXJuYWwgc3RyaW5nIFRleHQ7CisgICAgaW50ZXJuYWwgYm9vbCBpc1JpY2hUZXh0OworICB9CiAKLQkJaW50ZXJuYWwgRGljdGlvbmFyeTxzdHJpbmcsIFNoYXJlZFN0cmluZ0l0ZW0+IF9zaGFyZWRTdHJpbmdzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBTaGFyZWRTdHJpbmdJdGVtPigpOyAvL1VzZWQgd2hlbiByZWFkaW5nIGNlbGxzLgotCQlpbnRlcm5hbCBMaXN0PFNoYXJlZFN0cmluZ0l0ZW0+IF9zaGFyZWRTdHJpbmdzTGlzdCA9IG5ldyBMaXN0PFNoYXJlZFN0cmluZ0l0ZW0+KCk7IC8vVXNlZCB3aGVuIHJlYWRpbmcgY2VsbHMuCi0JCWludGVybmFsIEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24gX25hbWVzOwotCQlpbnRlcm5hbCBpbnQgX25leHREcmF3aW5nSUQgPSAwOwotCQlpbnRlcm5hbCBpbnQgX25leHRUYWJsZUlEID0gaW50Lk1pblZhbHVlOwotICAgICAgICBpbnRlcm5hbCBpbnQgX25leHRQaXZvdFRhYmxlSUQgPSBpbnQuTWluVmFsdWU7Ci0JCWludGVybmFsIFhtbE5hbWVzcGFjZU1hbmFnZXIgX25hbWVzcGFjZU1hbmFnZXI7Ci0gICAgICAgIGludGVybmFsIEZvcm11bGFQYXJzZXIgX2Zvcm11bGFQYXJzZXIgPSBudWxsOwotCSAgICBpbnRlcm5hbCBGb3JtdWxhUGFyc2VyTWFuYWdlciBfcGFyc2VyTWFuYWdlcjsKLSAgICAgICAgaW50ZXJuYWwgQ2VsbFN0b3JlPExpc3Q8VG9rZW4+PiBfZm9ybXVsYVRva2VuczsKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gUmVhZCBzaGFyZWQgc3RyaW5ncyB0byBsaXN0Ci0JCS8vLyA8L3N1bW1hcnk+Ci0JCXByaXZhdGUgdm9pZCBHZXRTaGFyZWRTdHJpbmdzKCkKLQkJewotCQkJaWYgKF9wYWNrYWdlLlBhY2thZ2UuUGFydEV4aXN0cyhTaGFyZWRTdHJpbmdzVXJpKSkKLQkJCXsKLQkJCQl2YXIgeG1sID0gX3BhY2thZ2UuR2V0WG1sRnJvbVVyaShTaGFyZWRTdHJpbmdzVXJpKTsKLQkJCQlYbWxOb2RlTGlzdCBubCA9IHhtbC5TZWxlY3ROb2RlcygiLy9kOnNzdC9kOnNpIiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0JCQkJX3NoYXJlZFN0cmluZ3NMaXN0ID0gbmV3IExpc3Q8U2hhcmVkU3RyaW5nSXRlbT4oKTsKLQkJCQlpZiAobmwgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWZvcmVhY2ggKFhtbE5vZGUgbm9kZSBpbiBubCkKLQkJCQkJewotCQkJCQkJWG1sTm9kZSBuID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOnQiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLQkJCQkJCWlmIChuICE9IG51bGwpCi0JCQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NoYXJlZFN0cmluZ3NMaXN0LkFkZChuZXcgU2hhcmVkU3RyaW5nSXRlbSgpIHsgVGV4dCA9IENvbnZlcnRVdGlsLkV4Y2VsRGVjb2RlU3RyaW5nKG4uSW5uZXJUZXh0KSB9KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlfc2hhcmVkU3RyaW5nc0xpc3QuQWRkKG5ldyBTaGFyZWRTdHJpbmdJdGVtKCkgeyBUZXh0ID0gbm9kZS5Jbm5lclhtbCwgaXNSaWNoVGV4dCA9IHRydWUgfSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0gICAgICAgICAgICAgICAgLy9EZWxldGUgdGhlIHNoYXJlZCBzdHJpbmcgcGFydCwgaXQgd2lsbCBiZSByZWNyZWF0ZWQgd2hlbiB0aGUgcGFja2FnZSBpcyBzYXZlZC4KLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcmVsIGluIFBhcnQuR2V0UmVsYXRpb25zaGlwcygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlbC5UYXJnZXRVcmkuT3JpZ2luYWxTdHJpbmcuRW5kc1dpdGgoInNoYXJlZHN0cmluZ3MueG1sIiwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcnQuRGVsZXRlUmVsYXRpb25zaGlwKHJlbC5JZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX3BhY2thZ2UuUGFja2FnZS5EZWxldGVQYXJ0KFNoYXJlZFN0cmluZ3NVcmkpOyAvL1JlbW92ZSB0aGUgcGFydCwgaXQgaXMgcmVjcmVhdGVkIHdoZW4gc2F2ZWQuCi0JCQl9Ci0JCX0KLQkJaW50ZXJuYWwgdm9pZCBHZXREZWZpbmVkTmFtZXMoKQotCQl7Ci0JCQlYbWxOb2RlTGlzdCBubCA9IFdvcmtib29rWG1sLlNlbGVjdE5vZGVzKCIvL2Q6ZGVmaW5lZE5hbWVzL2Q6ZGVmaW5lZE5hbWUiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLQkJCWlmIChubCAhPSBudWxsKQotCQkJewotCQkJCWZvcmVhY2ggKFhtbEVsZW1lbnQgZWxlbSBpbiBubCkKLQkJCQl7IAotCQkJCQlzdHJpbmcgZnVsbEFkZHJlc3MgPSBlbGVtLklubmVyVGV4dDsKKyAgaW50ZXJuYWwgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOworICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0cyBfd29ya3NoZWV0czsKKyAgcHJpdmF0ZSBPZmZpY2VQcm9wZXJ0aWVzIF9wcm9wZXJ0aWVzOwogCi0JCQkJCWludCBsb2NhbFNoZWV0SUQ7Ci0JCQkJCUV4Y2VsV29ya3NoZWV0IG5hbWVXb3Jrc2hlZXQ7Ci0JCQkJCWlmKCFpbnQuVHJ5UGFyc2UoZWxlbS5HZXRBdHRyaWJ1dGUoImxvY2FsU2hlZXRJZCIpLCBvdXQgbG9jYWxTaGVldElEKSkKLQkJCQkJewotCQkJCQkJbG9jYWxTaGVldElEID0gLTE7Ci0JCQkJCQluYW1lV29ya3NoZWV0PW51bGw7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQluYW1lV29ya3NoZWV0PVdvcmtzaGVldHNbbG9jYWxTaGVldElEICsgMV07Ci0JCQkJCX0KLQkJCQkJdmFyIGFkZHJlc3NUeXBlID0gRXhjZWxBZGRyZXNzQmFzZS5Jc1ZhbGlkKGZ1bGxBZGRyZXNzKTsKLQkJCQkJRXhjZWxSYW5nZUJhc2UgcmFuZ2U7Ci0JCQkJCUV4Y2VsTmFtZWRSYW5nZSBuYW1lZFJhbmdlOworICBwcml2YXRlIEV4Y2VsU3R5bGVzIF9zdHlsZXM7CiAKLQkJCQkJaWYgKGZ1bGxBZGRyZXNzLkluZGV4T2YoIlsiKSA9PSAwKQotCQkJCQl7Ci0JCQkJCQlpbnQgc3RhcnQgPSBmdWxsQWRkcmVzcy5JbmRleE9mKCJbIik7Ci0JCQkJCQlpbnQgZW5kID0gZnVsbEFkZHJlc3MuSW5kZXhPZigiXSIsIHN0YXJ0KTsKLQkJCQkJCWlmIChzdGFydCA+PSAwICYmIGVuZCA+PSAwKQotCQkJCQkJeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBFeGNlbFdvcmtib29rIGNsYXNzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InBhY2thZ2UiPlRoZSBwYXJlbnQgcGFja2FnZTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZXNwYWNlTWFuYWdlciI+TmFtZXNwYWNlTWFuYWdlcjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsV29ya2Jvb2soRXhjZWxQYWNrYWdlIHBhY2thZ2UsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZShuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgX3BhY2thZ2UgPSBwYWNrYWdlOworICAgIFdvcmtib29rVXJpID0gbmV3KCIveGwvd29ya2Jvb2sueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSk7CisgICAgU2hhcmVkU3RyaW5nc1VyaSA9IG5ldygiL3hsL3NoYXJlZFN0cmluZ3MueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSk7CisgICAgU3R5bGVzVXJpID0gbmV3KCIveGwvc3R5bGVzLnhtbCIsIFVyaUtpbmQuUmVsYXRpdmUpOwogCi0JCQkJCQkJc3RyaW5nIGV4dGVybmFsSW5kZXggPSBmdWxsQWRkcmVzcy5TdWJzdHJpbmcoc3RhcnQgKyAxLCBlbmQgLSBzdGFydCAtIDEpOwotCQkJCQkJCWludCBpbmRleDsKLQkJCQkJCQlpZiAoaW50LlRyeVBhcnNlKGV4dGVybmFsSW5kZXgsIG91dCBpbmRleCkpCi0JCQkJCQkJewotCQkJCQkJCQlpZiAoaW5kZXggPiAwICYmIGluZGV4IDw9IF9leHRlcm5hbFJlZmVyZW5jZXMuQ291bnQpCi0JCQkJCQkJCXsKLQkJCQkJCQkJCWZ1bGxBZGRyZXNzID0gZnVsbEFkZHJlc3MuU3Vic3RyaW5nKDAsIHN0YXJ0KSArICJbIiArIF9leHRlcm5hbFJlZmVyZW5jZXNbaW5kZXggLSAxXSArICJdIiArIGZ1bGxBZGRyZXNzLlN1YnN0cmluZyhlbmQgKyAxKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQorICAgIF9uYW1lcyA9IG5ldyh0aGlzKTsKKyAgICBfbmFtZXNwYWNlTWFuYWdlciA9IG5hbWVzcGFjZU1hbmFnZXI7CisgICAgVG9wTm9kZSA9IFdvcmtib29rWG1sLkRvY3VtZW50RWxlbWVudDsKKyAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXdbXSB7CisgICAgICAiZmlsZVZlcnNpb24iLAorICAgICAgImZpbGVTaGFyaW5nIiwKKyAgICAgICJ3b3JrYm9va1ByIiwKKyAgICAgICJ3b3JrYm9va1Byb3RlY3Rpb24iLAorICAgICAgImJvb2tWaWV3cyIsCisgICAgICAic2hlZXRzIiwKKyAgICAgICJmdW5jdGlvbkdyb3VwcyIsCisgICAgICAiZnVuY3Rpb25Qcm90b3R5cGVzIiwKKyAgICAgICJleHRlcm5hbFJlZmVyZW5jZXMiLAorICAgICAgImRlZmluZWROYW1lcyIsCisgICAgICAiY2FsY1ByIiwKKyAgICAgICJvbGVTaXplIiwKKyAgICAgICJjdXN0b21Xb3JrYm9va1ZpZXdzIiwKKyAgICAgICJwaXZvdENhY2hlcyIsCisgICAgICAic21hcnRUYWdQciIsCisgICAgICAic21hcnRUYWdUeXBlcyIsCisgICAgICAid2ViUHVibGlzaGluZyIsCisgICAgICAiZmlsZVJlY292ZXJ5UHIiLAorICAgIH07CisgICAgRnVsbENhbGNPbkxvYWQgPSB0cnVlOyAvL0Z1bGwgY2FsY3VsYXRpb24gb24gbG9hZCBieSBkZWZhdWx0LCBmb3IgYm90aCBuZXcgd29ya2Jvb2tzIGFuZCB0ZW1wbGF0ZXMuCisgICAgR2V0U2hhcmVkU3RyaW5ncygpOworICB9CiAKLQkJCQkJaWYgKGFkZHJlc3NUeXBlID09IEV4Y2VsQWRkcmVzc0Jhc2UuQWRkcmVzc1R5cGUuSW52YWxpZCB8fCBhZGRyZXNzVHlwZSA9PSBFeGNlbEFkZHJlc3NCYXNlLkFkZHJlc3NUeXBlLkludGVybmFsTmFtZSB8fCBhZGRyZXNzVHlwZSA9PSBFeGNlbEFkZHJlc3NCYXNlLkFkZHJlc3NUeXBlLkV4dGVybmFsTmFtZSB8fCBhZGRyZXNzVHlwZT09RXhjZWxBZGRyZXNzQmFzZS5BZGRyZXNzVHlwZS5Gb3JtdWxhIHx8IGFkZHJlc3NUeXBlPT1FeGNlbEFkZHJlc3NCYXNlLkFkZHJlc3NUeXBlLkV4dGVybmFsQWRkcmVzcykgICAgLy9BIHZhbHVlIG9yIGEgZm9ybXVsYQotCQkJCQl7Ci0JCQkJCQlkb3VibGUgdmFsdWU7Ci0JCQkJCQlyYW5nZSA9IG5ldyBFeGNlbFJhbmdlQmFzZSh0aGlzLCBuYW1lV29ya3NoZWV0LCBlbGVtLkdldEF0dHJpYnV0ZSgibmFtZSIpLCB0cnVlKTsKLQkJCQkJCWlmIChuYW1lV29ya3NoZWV0ID09IG51bGwpCi0JCQkJCQl7Ci0JCQkJCQkJbmFtZWRSYW5nZSA9IF9uYW1lcy5BZGQoZWxlbS5HZXRBdHRyaWJ1dGUoIm5hbWUiKSwgcmFuZ2UpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCW5hbWVkUmFuZ2UgPSBuYW1lV29ya3NoZWV0Lk5hbWVzLkFkZChlbGVtLkdldEF0dHJpYnV0ZSgibmFtZSIpLCByYW5nZSk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCWlmIChmdWxsQWRkcmVzcy5TdGFydHNXaXRoKCJcIiIpKSAvL1N0cmluZyB2YWx1ZQotCQkJCQkJewotCQkJCQkJCW5hbWVkUmFuZ2UuTmFtZVZhbHVlID0gZnVsbEFkZHJlc3MuU3Vic3RyaW5nKDEsZnVsbEFkZHJlc3MuTGVuZ3RoLTIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoZG91YmxlLlRyeVBhcnNlKGZ1bGxBZGRyZXNzLCBOdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgdmFsdWUpKQotCQkJCQkJewotCQkJCQkJCW5hbWVkUmFuZ2UuTmFtZVZhbHVlID0gdmFsdWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiAoYWRkcmVzc1R5cGUgPT0gRXhjZWxBZGRyZXNzQmFzZS5BZGRyZXNzVHlwZS5FeHRlcm5hbEFkZHJlc3MgfHwgYWRkcmVzc1R5cGUgPT0gRXhjZWxBZGRyZXNzQmFzZS5BZGRyZXNzVHlwZS5FeHRlcm5hbE5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgdmFyIHIgPSBuZXcgRXhjZWxBZGRyZXNzKGZ1bGxBZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBuYW1lZFJhbmdlLk5hbWVGb3JtdWxhID0gJ1wnWycgKyByLl93YgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZFJhbmdlLk5hbWVGb3JtdWxhID0gZnVsbEFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQlFeGNlbEFkZHJlc3MgYWRkciA9IG5ldyBFeGNlbEFkZHJlc3MoZnVsbEFkZHJlc3MsIF9wYWNrYWdlLCBudWxsKTsKLQkJCQkJCWlmIChsb2NhbFNoZWV0SUQgPiAtMSkKLQkJCQkJCXsKLQkJCQkJCQlpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoYWRkci5fd3MpKQotCQkJCQkJCXsKLQkJCQkJCQkJbmFtZWRSYW5nZSA9IFdvcmtzaGVldHNbbG9jYWxTaGVldElEICsgMV0uTmFtZXMuQWRkKGVsZW0uR2V0QXR0cmlidXRlKCJuYW1lIiksIG5ldyBFeGNlbFJhbmdlQmFzZSh0aGlzLCBXb3Jrc2hlZXRzW2xvY2FsU2hlZXRJRCArIDFdLCBmdWxsQWRkcmVzcywgZmFsc2UpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJbmFtZWRSYW5nZSA9IFdvcmtzaGVldHNbbG9jYWxTaGVldElEICsgMV0uTmFtZXMuQWRkKGVsZW0uR2V0QXR0cmlidXRlKCJuYW1lIiksIG5ldyBFeGNlbFJhbmdlQmFzZSh0aGlzLCBXb3Jrc2hlZXRzW2FkZHIuX3dzXSwgZnVsbEFkZHJlc3MsIGZhbHNlKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCXZhciB3cyA9IFdvcmtzaGVldHNbYWRkci5fd3NdOwotCQkJCQkJCW5hbWVkUmFuZ2UgPSBfbmFtZXMuQWRkKGVsZW0uR2V0QXR0cmlidXRlKCJuYW1lIiksIG5ldyBFeGNlbFJhbmdlQmFzZSh0aGlzLCB3cywgZnVsbEFkZHJlc3MsIGZhbHNlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGVsZW0uR2V0QXR0cmlidXRlKCJoaWRkZW4iKSA9PSAiMSIgJiYgbmFtZWRSYW5nZSAhPSBudWxsKSBuYW1lZFJhbmdlLklzTmFtZUhpZGRlbiA9IHRydWU7Ci0JCQkJCWlmKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShlbGVtLkdldEF0dHJpYnV0ZSgiY29tbWVudCIpKSkgbmFtZWRSYW5nZS5OYW1lQ29tbWVudD1lbGVtLkdldEF0dHJpYnV0ZSgiY29tbWVudCIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkjcmVnaW9uIFdvcmtzaGVldHMKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIGFsbCB0aGUgd29ya3NoZWV0cyBpbiB0aGUgd29ya2Jvb2suCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBFeGNlbFdvcmtzaGVldHMgV29ya3NoZWV0cwotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlpZiAoX3dvcmtzaGVldHMgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXZhciBzaGVldHNOb2RlID0gX3dvcmtib29rWG1sLkRvY3VtZW50RWxlbWVudC5TZWxlY3RTaW5nbGVOb2RlKCJkOnNoZWV0cyIsIF9uYW1lc3BhY2VNYW5hZ2VyKTsKLQkJCQkJaWYgKHNoZWV0c05vZGUgPT0gbnVsbCkKLQkJCQkJewotCQkJCQkJc2hlZXRzTm9kZSA9IENyZWF0ZU5vZGUoImQ6c2hlZXRzIik7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCV93b3Jrc2hlZXRzID0gbmV3IEV4Y2VsV29ya3NoZWV0cyhfcGFja2FnZSwgX25hbWVzcGFjZU1hbmFnZXIsIHNoZWV0c05vZGUpOwotCQkJCX0KLQkJCQlyZXR1cm4gKF93b3Jrc2hlZXRzKTsKLQkJCX0KLQkJfQotCQkjZW5kcmVnaW9uCisgIGludGVybmFsIERpY3Rpb25hcnk8c3RyaW5nLCBTaGFyZWRTdHJpbmdJdGVtPiBfc2hhcmVkU3RyaW5ncyA9IG5ldygpOyAvL1VzZWQgd2hlbiByZWFkaW5nIGNlbGxzLgorICBpbnRlcm5hbCBMaXN0PFNoYXJlZFN0cmluZ0l0ZW0+IF9zaGFyZWRTdHJpbmdzTGlzdCA9IG5ldygpOyAvL1VzZWQgd2hlbiByZWFkaW5nIGNlbGxzLgorICBpbnRlcm5hbCBFeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uIF9uYW1lczsKKyAgaW50ZXJuYWwgaW50IF9uZXh0RHJhd2luZ0lEID0gMDsKKyAgaW50ZXJuYWwgaW50IF9uZXh0VGFibGVJRCA9IGludC5NaW5WYWx1ZTsKKyAgaW50ZXJuYWwgaW50IF9uZXh0UGl2b3RUYWJsZUlEID0gaW50Lk1pblZhbHVlOworICBpbnRlcm5hbCBYbWxOYW1lc3BhY2VNYW5hZ2VyIF9uYW1lc3BhY2VNYW5hZ2VyOworICBpbnRlcm5hbCBGb3JtdWxhUGFyc2VyIF9mb3JtdWxhUGFyc2VyOworICBpbnRlcm5hbCBGb3JtdWxhUGFyc2VyTWFuYWdlciBfcGFyc2VyTWFuYWdlcjsKKyAgaW50ZXJuYWwgQ2VsbFN0b3JlPExpc3Q8VG9rZW4+PiBfZm9ybXVsYVRva2VuczsKIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gbmFtZWQgcmFuZ2VzCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBFeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uIE5hbWVzCi0JCXsKLQkJCWdldAotCQkJewotCQkJCXJldHVybiBfbmFtZXM7Ci0JCQl9Ci0JCX0KLQkJI3JlZ2lvbiBXb3JrYm9vayBQcm9wZXJ0aWVzCi0gICAgICAgIGludGVybmFsIEZvcm11bGFQYXJzZXIgRm9ybXVsYVBhcnNlcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2Zvcm11bGFQYXJzZXIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9mb3JtdWxhUGFyc2VyID0gbmV3IEZvcm11bGFQYXJzZXIobmV3IEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyKF9wYWNrYWdlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfZm9ybXVsYVBhcnNlcjsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmVhZCBzaGFyZWQgc3RyaW5ncyB0byBsaXN0CisgIC8vLyA8L3N1bW1hcnk+CisgIHByaXZhdGUgdm9pZCBHZXRTaGFyZWRTdHJpbmdzKCkgeworICAgIGlmIChfcGFja2FnZS5QYWNrYWdlLlBhcnRFeGlzdHMoU2hhcmVkU3RyaW5nc1VyaSkpIHsKKyAgICAgIHZhciB4bWwgPSBfcGFja2FnZS5HZXRYbWxGcm9tVXJpKFNoYXJlZFN0cmluZ3NVcmkpOworICAgICAgWG1sTm9kZUxpc3QgbmwgPSB4bWwuU2VsZWN0Tm9kZXMoIi8vZDpzc3QvZDpzaSIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgX3NoYXJlZFN0cmluZ3NMaXN0ID0gbmV3KCk7CisgICAgICBpZiAobmwgIT0gbnVsbCkgeworICAgICAgICBmb3JlYWNoIChYbWxOb2RlIG5vZGUgaW4gbmwpIHsKKyAgICAgICAgICBYbWxOb2RlIG4gPSBub2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6dCIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICAgIGlmIChuICE9IG51bGwpIHsKKyAgICAgICAgICAgIF9zaGFyZWRTdHJpbmdzTGlzdC5BZGQoCisgICAgICAgICAgICAgICAgbmV3KCkgeworICAgICAgICAgICAgICAgICAgVGV4dCA9IENvbnZlcnRVdGlsLkV4Y2VsRGVjb2RlU3RyaW5nKG4uSW5uZXJUZXh0KSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX3NoYXJlZFN0cmluZ3NMaXN0LkFkZCgKKyAgICAgICAgICAgICAgICBuZXcoKSB7CisgICAgICAgICAgICAgICAgICBUZXh0ID0gbm9kZS5Jbm5lclhtbCwKKyAgICAgICAgICAgICAgICAgIGlzUmljaFRleHQgPSB0cnVlLAorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy9EZWxldGUgdGhlIHNoYXJlZCBzdHJpbmcgcGFydCwgaXQgd2lsbCBiZSByZWNyZWF0ZWQgd2hlbiB0aGUgcGFja2FnZSBpcyBzYXZlZC4KKyAgICAgIGZvcmVhY2ggKHZhciByZWwgaW4gUGFydC5HZXRSZWxhdGlvbnNoaXBzKCkpIHsKKyAgICAgICAgaWYgKHJlbC5UYXJnZXRVcmkuT3JpZ2luYWxTdHJpbmcuRW5kc1dpdGgoCisgICAgICAgICAgICAic2hhcmVkc3RyaW5ncy54bWwiLAorICAgICAgICAgICAgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpIHsKKyAgICAgICAgICBQYXJ0LkRlbGV0ZVJlbGF0aW9uc2hpcChyZWwuSWQpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBfcGFja2FnZS5QYWNrYWdlLkRlbGV0ZVBhcnQoU2hhcmVkU3RyaW5nc1VyaSk7IC8vUmVtb3ZlIHRoZSBwYXJ0LCBpdCBpcyByZWNyZWF0ZWQgd2hlbiBzYXZlZC4KKyAgICB9CisgIH0KKworICBpbnRlcm5hbCB2b2lkIEdldERlZmluZWROYW1lcygpIHsKKyAgICBYbWxOb2RlTGlzdCBubCA9IFdvcmtib29rWG1sLlNlbGVjdE5vZGVzKCIvL2Q6ZGVmaW5lZE5hbWVzL2Q6ZGVmaW5lZE5hbWUiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBpZiAobmwgIT0gbnVsbCkgeworICAgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBlbGVtIGluIG5sKSB7CisgICAgICAgIHN0cmluZyBmdWxsQWRkcmVzcyA9IGVsZW0uSW5uZXJUZXh0OworCisgICAgICAgIGludCBsb2NhbFNoZWV0SWQ7CisgICAgICAgIEV4Y2VsV29ya3NoZWV0IG5hbWVXb3Jrc2hlZXQ7CisgICAgICAgIGlmICghaW50LlRyeVBhcnNlKGVsZW0uR2V0QXR0cmlidXRlKCJsb2NhbFNoZWV0SWQiKSwgb3V0IGxvY2FsU2hlZXRJZCkpIHsKKyAgICAgICAgICBsb2NhbFNoZWV0SWQgPSAtMTsKKyAgICAgICAgICBuYW1lV29ya3NoZWV0ID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuYW1lV29ya3NoZWV0ID0gV29ya3NoZWV0c1tsb2NhbFNoZWV0SWQgKyAxXTsKKyAgICAgICAgfQorICAgICAgICB2YXIgYWRkcmVzc1R5cGUgPSBFeGNlbEFkZHJlc3NCYXNlLklzVmFsaWQoZnVsbEFkZHJlc3MpOworICAgICAgICBFeGNlbFJhbmdlQmFzZSByYW5nZTsKKyAgICAgICAgRXhjZWxOYW1lZFJhbmdlIG5hbWVkUmFuZ2U7CisKKyAgICAgICAgaWYgKGZ1bGxBZGRyZXNzLkluZGV4T2YoIlsiKSA9PSAwKSB7CisgICAgICAgICAgaW50IHN0YXJ0ID0gZnVsbEFkZHJlc3MuSW5kZXhPZigiWyIpOworICAgICAgICAgIGludCBlbmQgPSBmdWxsQWRkcmVzcy5JbmRleE9mKCJdIiwgc3RhcnQpOworICAgICAgICAgIGlmIChzdGFydCA+PSAwICYmIGVuZCA+PSAwKSB7CisgICAgICAgICAgICBzdHJpbmcgZXh0ZXJuYWxJbmRleCA9IGZ1bGxBZGRyZXNzLlN1YnN0cmluZyhzdGFydCArIDEsIGVuZCAtIHN0YXJ0IC0gMSk7CisgICAgICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKGV4dGVybmFsSW5kZXgsIG91dCBpbmRleCkpIHsKKyAgICAgICAgICAgICAgaWYgKGluZGV4ID4gMCAmJiBpbmRleCA8PSBfZXh0ZXJuYWxSZWZlcmVuY2VzLkNvdW50KSB7CisgICAgICAgICAgICAgICAgZnVsbEFkZHJlc3MgPQorICAgICAgICAgICAgICAgICAgICBmdWxsQWRkcmVzcy5TdWJzdHJpbmcoMCwgc3RhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICArICJbIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBfZXh0ZXJuYWxSZWZlcmVuY2VzW2luZGV4IC0gMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl0iCisgICAgICAgICAgICAgICAgICAgICAgICArIGZ1bGxBZGRyZXNzLlN1YnN0cmluZyhlbmQgKyAxKTsKKyAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgfQogCi0JICAgIHB1YmxpYyBGb3JtdWxhUGFyc2VyTWFuYWdlciBGb3JtdWxhUGFyc2VyTWFuYWdlcgotCSAgICB7Ci0JICAgICAgICBnZXQKLQkgICAgICAgIHsKLQkgICAgICAgICAgICBpZiAoX3BhcnNlck1hbmFnZXIgPT0gbnVsbCkKLQkgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgICAgIF9wYXJzZXJNYW5hZ2VyID0gbmV3IEZvcm11bGFQYXJzZXJNYW5hZ2VyKEZvcm11bGFQYXJzZXIpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICByZXR1cm4gX3BhcnNlck1hbmFnZXI7Ci0JICAgICAgICB9Ci0JICAgIH0KKyAgICAgICAgaWYgKGFkZHJlc3NUeXBlID09IEV4Y2VsQWRkcmVzc0Jhc2UuQWRkcmVzc1R5cGUuSW52YWxpZAorICAgICAgICAgICAgfHwgYWRkcmVzc1R5cGUgPT0gRXhjZWxBZGRyZXNzQmFzZS5BZGRyZXNzVHlwZS5JbnRlcm5hbE5hbWUKKyAgICAgICAgICAgIHx8IGFkZHJlc3NUeXBlID09IEV4Y2VsQWRkcmVzc0Jhc2UuQWRkcmVzc1R5cGUuRXh0ZXJuYWxOYW1lCisgICAgICAgICAgICB8fCBhZGRyZXNzVHlwZSA9PSBFeGNlbEFkZHJlc3NCYXNlLkFkZHJlc3NUeXBlLkZvcm11bGEKKyAgICAgICAgICAgIHx8IGFkZHJlc3NUeXBlCisgICAgICAgICAgICAgICAgPT0gRXhjZWxBZGRyZXNzQmFzZQorICAgICAgICAgICAgICAgICAgICAuQWRkcmVzc1R5cGUKKyAgICAgICAgICAgICAgICAgICAgLkV4dGVybmFsQWRkcmVzcykgLy9BIHZhbHVlIG9yIGEgZm9ybXVsYQorICAgICAgICB7CisgICAgICAgICAgZG91YmxlIHZhbHVlOworICAgICAgICAgIHJhbmdlID0gbmV3KHRoaXMsIG5hbWVXb3Jrc2hlZXQsIGVsZW0uR2V0QXR0cmlidXRlKCJuYW1lIiksIHRydWUpOworICAgICAgICAgIGlmIChuYW1lV29ya3NoZWV0ID09IG51bGwpIHsKKyAgICAgICAgICAgIG5hbWVkUmFuZ2UgPSBfbmFtZXMuQWRkKGVsZW0uR2V0QXR0cmlidXRlKCJuYW1lIiksIHJhbmdlKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmFtZWRSYW5nZSA9IG5hbWVXb3Jrc2hlZXQuTmFtZXMuQWRkKGVsZW0uR2V0QXR0cmlidXRlKCJuYW1lIiksIHJhbmdlKTsKKyAgICAgICAgICB9CiAKLQkgICAgRXhjZWxQcm90ZWN0aW9uIF9wcm90ZWN0aW9uID0gbnVsbDsKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQWNjZXNzIHByb3BlcnRpZXMgdG8gcHJvdGVjdCBvciB1bnByb3RlY3QgYSB3b3JrYm9vawotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgRXhjZWxQcm90ZWN0aW9uIFByb3RlY3Rpb24KLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJaWYgKF9wcm90ZWN0aW9uID09IG51bGwpCi0JCQkJewotCQkJCQlfcHJvdGVjdGlvbiA9IG5ldyBFeGNlbFByb3RlY3Rpb24oTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgdGhpcyk7Ci0JCQkJCV9wcm90ZWN0aW9uLlNjaGVtYU5vZGVPcmRlciA9IFNjaGVtYU5vZGVPcmRlcjsKLQkJCQl9Ci0JCQkJcmV0dXJuIF9wcm90ZWN0aW9uOwotCQkJfQotCQl9ICAgICAgICAKLQkJRXhjZWxXb3JrYm9va1ZpZXcgX3ZpZXcgPSBudWxsOwotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBBY2Nlc3MgdG8gd29ya2Jvb2sgdmlldyBwcm9wZXJ0aWVzCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBFeGNlbFdvcmtib29rVmlldyBWaWV3Ci0JCXsKLQkJCWdldAotCQkJewotCQkJCWlmIChfdmlldyA9PSBudWxsKQotCQkJCXsKLQkJCQkJX3ZpZXcgPSBuZXcgRXhjZWxXb3JrYm9va1ZpZXcoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgdGhpcyk7Ci0JCQkJfQotCQkJCXJldHVybiBfdmlldzsKLQkJCX0KLQkJfQotICAgICAgICAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVVJJIHRvIHRoZSB3b3JrYm9vayBpbnNpZGUgdGhlIHBhY2thZ2UKLQkJLy8vIDwvc3VtbWFyeT4KLQkJaW50ZXJuYWwgVXJpIFdvcmtib29rVXJpIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotCQkvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBVUkkgdG8gdGhlIHN0eWxlcyBpbnNpZGUgdGhlIHBhY2thZ2UKLQkJLy8vIDwvc3VtbWFyeT4KLQkJaW50ZXJuYWwgVXJpIFN0eWxlc1VyaSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KLQkJLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVVJJIHRvIHRoZSBzaGFyZWQgc3RyaW5ncyBpbnNpZGUgdGhlIHBhY2thZ2UKLQkJLy8vIDwvc3VtbWFyeT4KLQkJaW50ZXJuYWwgVXJpIFNoYXJlZFN0cmluZ3NVcmkgeyBnZXQ7IHByaXZhdGUgc2V0OyB9Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHdvcmtib29rJ3MgcGFydCB3aXRoaW4gdGhlIHBhY2thZ2UKLQkJLy8vIDwvc3VtbWFyeT4KLQkJaW50ZXJuYWwgUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IFBhcnQgeyBnZXQgeyByZXR1cm4gKF9wYWNrYWdlLlBhY2thZ2UuR2V0UGFydChXb3JrYm9va1VyaSkpOyB9IH0KLQkJCi0JCSNyZWdpb24gV29ya2Jvb2tYbWwKLQkJcHJpdmF0ZSBYbWxEb2N1bWVudCBfd29ya2Jvb2tYbWw7Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgWE1MIGRhdGEgcmVwcmVzZW50aW5nIHRoZSB3b3JrYm9vayBpbiB0aGUgcGFja2FnZS4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIFhtbERvY3VtZW50IFdvcmtib29rWG1sCi0JCXsKLQkJCWdldAotCQkJewotCQkJCWlmIChfd29ya2Jvb2tYbWwgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCUNyZWF0ZVdvcmtib29rWG1sKF9uYW1lc3BhY2VNYW5hZ2VyKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChfd29ya2Jvb2tYbWwpOwotCQkJfQotCQl9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBjb2RlTW9kdWxlTmFtZVBhdGggPSAiZDp3b3JrYm9va1ByL0Bjb2RlTmFtZSI7Ci0gICAgICAgIGludGVybmFsIHN0cmluZyBDb2RlTW9kdWxlTmFtZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhjb2RlTW9kdWxlTmFtZVBhdGgpOworICAgICAgICAgIGlmIChmdWxsQWRkcmVzcy5TdGFydHNXaXRoKAorICAgICAgICAgICAgICAiXCIiKSkgLy9TdHJpbmcgdmFsdWUKKyAgICAgICAgICB7CisgICAgICAgICAgICBuYW1lZFJhbmdlLk5hbWVWYWx1ZSA9IGZ1bGxBZGRyZXNzLlN1YnN0cmluZygxLCBmdWxsQWRkcmVzcy5MZW5ndGggLSAyKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGRvdWJsZS5UcnlQYXJzZSgKKyAgICAgICAgICAgICAgZnVsbEFkZHJlc3MsCisgICAgICAgICAgICAgIE51bWJlclN0eWxlcy5BbnksCisgICAgICAgICAgICAgIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsCisgICAgICAgICAgICAgIG91dCB2YWx1ZSkpIHsKKyAgICAgICAgICAgIG5hbWVkUmFuZ2UuTmFtZVZhbHVlID0gdmFsdWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vaWYgKGFkZHJlc3NUeXBlID09IEV4Y2VsQWRkcmVzc0Jhc2UuQWRkcmVzc1R5cGUuRXh0ZXJuYWxBZGRyZXNzIHx8IGFkZHJlc3NUeXBlID09IEV4Y2VsQWRkcmVzc0Jhc2UuQWRkcmVzc1R5cGUuRXh0ZXJuYWxOYW1lKQorICAgICAgICAgICAgLy97CisgICAgICAgICAgICAvLyAgICB2YXIgciA9IG5ldyBFeGNlbEFkZHJlc3MoZnVsbEFkZHJlc3MpOworICAgICAgICAgICAgLy8gICAgbmFtZWRSYW5nZS5OYW1lRm9ybXVsYSA9ICdcJ1snICsgci5fd2IKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgICAgLy9lbHNlCisgICAgICAgICAgICAvL3sKKyAgICAgICAgICAgIG5hbWVkUmFuZ2UuTmFtZUZvcm11bGEgPSBmdWxsQWRkcmVzczsKKyAgICAgICAgICAgIC8vfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFeGNlbEFkZHJlc3MgYWRkciA9IG5ldyBFeGNlbEFkZHJlc3MoZnVsbEFkZHJlc3MsIF9wYWNrYWdlLCBudWxsKTsKKyAgICAgICAgICBpZiAobG9jYWxTaGVldElkID4gLTEpIHsKKyAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShhZGRyLl93cykpIHsKKyAgICAgICAgICAgICAgbmFtZWRSYW5nZSA9IFdvcmtzaGVldHNbbG9jYWxTaGVldElkICsgMV0uTmFtZXMuQWRkKAorICAgICAgICAgICAgICAgICAgZWxlbS5HZXRBdHRyaWJ1dGUoIm5hbWUiKSwKKyAgICAgICAgICAgICAgICAgIG5ldyh0aGlzLCBXb3Jrc2hlZXRzW2xvY2FsU2hlZXRJZCArIDFdLCBmdWxsQWRkcmVzcywgZmFsc2UpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIG5hbWVkUmFuZ2UgPSBXb3Jrc2hlZXRzW2xvY2FsU2hlZXRJZCArIDFdLk5hbWVzLkFkZCgKKyAgICAgICAgICAgICAgICAgIGVsZW0uR2V0QXR0cmlidXRlKCJuYW1lIiksCisgICAgICAgICAgICAgICAgICBuZXcodGhpcywgV29ya3NoZWV0c1thZGRyLl93c10sIGZ1bGxBZGRyZXNzLCBmYWxzZSkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhjb2RlTW9kdWxlTmFtZVBhdGgsdmFsdWUpOwotICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YXIgd3MgPSBXb3Jrc2hlZXRzW2FkZHIuX3dzXTsKKyAgICAgICAgICAgIG5hbWVkUmFuZ2UgPSBfbmFtZXMuQWRkKGVsZW0uR2V0QXR0cmlidXRlKCJuYW1lIiksIG5ldyh0aGlzLCB3cywgZnVsbEFkZHJlc3MsIGZhbHNlKSk7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHZvaWQgQ29kZU5hbWVDaGFuZ2Uoc3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb2RlTW9kdWxlTmFtZSA9IHZhbHVlOworICAgICAgICBpZiAoZWxlbS5HZXRBdHRyaWJ1dGUoImhpZGRlbiIpID09ICIxIiAmJiBuYW1lZFJhbmdlICE9IG51bGwpIHsKKyAgICAgICAgICBuYW1lZFJhbmdlLklzTmFtZUhpZGRlbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShlbGVtLkdldEF0dHJpYnV0ZSgiY29tbWVudCIpKSkgeworICAgICAgICAgIG5hbWVkUmFuZ2UuTmFtZUNvbW1lbnQgPSBlbGVtLkdldEF0dHJpYnV0ZSgiY29tbWVudCIpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIGFsbCB0aGUgd29ya3NoZWV0cyBpbiB0aGUgd29ya2Jvb2suCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFdvcmtzaGVldHMgV29ya3NoZWV0cyB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfd29ya3NoZWV0cyA9PSBudWxsKSB7CisgICAgICAgIHZhciBzaGVldHNOb2RlID0gX3dvcmtib29rWG1sLkRvY3VtZW50RWxlbWVudC5TZWxlY3RTaW5nbGVOb2RlKAorICAgICAgICAgICAgImQ6c2hlZXRzIiwKKyAgICAgICAgICAgIF9uYW1lc3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgaWYgKHNoZWV0c05vZGUgPT0gbnVsbCkgeworICAgICAgICAgIHNoZWV0c05vZGUgPSBDcmVhdGVOb2RlKCJkOnNoZWV0cyIpOwogICAgICAgICB9CiAKLSAgICAgICAgY29uc3Qgc3RyaW5nIGRhdGUxOTA0UGF0aCA9ICJkOndvcmtib29rUHIvQGRhdGUxOTA0IjsKLSAgICAgICAgaW50ZXJuYWwgY29uc3QgZG91YmxlIGRhdGUxOTA0T2Zmc2V0ID0gMzY1LjUgKiA0OyAgLy8gb2Zmc2V0IHRvIGZpeCAxOTAwIGFuZCAxOTA0IGRpZmZlcmVuY2VzLCA0IE9MRSB5ZWFycwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgZGF0ZSBzeXN0ZW1zIHVzZWQgYnkgTWljcm9zb2Z0IEV4Y2VsIGNhbiBiZSBiYXNlZCBvbiBvbmUgb2YgdHdvIGRpZmZlcmVudCBkYXRlcy4gQnkgZGVmYXVsdCwgYSBzZXJpYWwgbnVtYmVyIG9mIDEgaW4gTWljcm9zb2Z0IEV4Y2VsIHJlcHJlc2VudHMgSmFudWFyeSAxLCAxOTAwLgotICAgICAgICAvLy8gVGhlIGRlZmF1bHQgZm9yIHRoZSBzZXJpYWwgbnVtYmVyIDEgY2FuIGJlIGNoYW5nZWQgdG8gcmVwcmVzZW50IEphbnVhcnkgMiwgMTkwNC4KLSAgICAgICAgLy8vIFRoaXMgb3B0aW9uIHdhcyBpbmNsdWRlZCBpbiBNaWNyb3NvZnQgRXhjZWwgZm9yIFdpbmRvd3MgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggRXhjZWwgZm9yIHRoZSBNYWNpbnRvc2gsIHdoaWNoIGRlZmF1bHRzIHRvIEphbnVhcnkgMiwgMTkwNC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgRGF0ZTE5MDQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKGRhdGUxOTA0UGF0aCwgZmFsc2UpOwotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoRGF0ZTE5MDQgIT0gdmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBMaWtlIEV4Y2VsIHdoZW4gdGhlIG9wdGlvbiBpdCdzIGNoYW5nZWQgdXBkYXRlIGl0IGFsbCBjZWxscyB3aXRoIERhdGUgZm9ybWF0Ci0gICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIFdvcmtzaGVldHMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uVXBkYXRlQ2VsbHNXaXRoRGF0ZTE5MDRTZXR0aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgICAgIF93b3Jrc2hlZXRzID0gbmV3KF9wYWNrYWdlLCBfbmFtZXNwYWNlTWFuYWdlciwgc2hlZXRzTm9kZSk7CisgICAgICB9CisgICAgICByZXR1cm4gKF93b3Jrc2hlZXRzKTsKKyAgICB9CisgIH0KIAotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKGRhdGUxOTA0UGF0aCwgdmFsdWUsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIG5hbWVkIHJhbmdlcworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbiBOYW1lcyA9PiBfbmFtZXM7CisKKyAgaW50ZXJuYWwgRm9ybXVsYVBhcnNlciBGb3JtdWxhUGFyc2VyIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9mb3JtdWxhUGFyc2VyID09IG51bGwpIHsKKyAgICAgICAgX2Zvcm11bGFQYXJzZXIgPSBuZXcobmV3IEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyKF9wYWNrYWdlKSk7CisgICAgICB9CisgICAgICByZXR1cm4gX2Zvcm11bGFQYXJzZXI7CisgICAgfQorICB9CisKKyAgcHVibGljIEZvcm11bGFQYXJzZXJNYW5hZ2VyIEZvcm11bGFQYXJzZXJNYW5hZ2VyIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9wYXJzZXJNYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgX3BhcnNlck1hbmFnZXIgPSBuZXcoRm9ybXVsYVBhcnNlcik7CisgICAgICB9CisgICAgICByZXR1cm4gX3BhcnNlck1hbmFnZXI7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBFeGNlbFByb3RlY3Rpb24gX3Byb3RlY3Rpb247CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWNjZXNzIHByb3BlcnRpZXMgdG8gcHJvdGVjdCBvciB1bnByb3RlY3QgYSB3b3JrYm9vaworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxQcm90ZWN0aW9uIFByb3RlY3Rpb24geworICAgIGdldCB7CisgICAgICBpZiAoX3Byb3RlY3Rpb24gPT0gbnVsbCkgeworICAgICAgICBfcHJvdGVjdGlvbiA9IG5ldyhOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCB0aGlzKTsKKyAgICAgICAgX3Byb3RlY3Rpb24uU2NoZW1hTm9kZU9yZGVyID0gU2NoZW1hTm9kZU9yZGVyOworICAgICAgfQorICAgICAgcmV0dXJuIF9wcm90ZWN0aW9uOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgRXhjZWxXb3JrYm9va1ZpZXcgX3ZpZXc7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWNjZXNzIHRvIHdvcmtib29rIHZpZXcgcHJvcGVydGllcworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxXb3JrYm9va1ZpZXcgVmlldyB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfdmlldyA9PSBudWxsKSB7CisgICAgICAgIF92aWV3ID0gbmV3KE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIHRoaXMpOworICAgICAgfQorICAgICAgcmV0dXJuIF92aWV3OworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFVSSSB0byB0aGUgd29ya2Jvb2sgaW5zaWRlIHRoZSBwYWNrYWdlCisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIFVyaSBXb3JrYm9va1VyaSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBVUkkgdG8gdGhlIHN0eWxlcyBpbnNpZGUgdGhlIHBhY2thZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgVXJpIFN0eWxlc1VyaSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBVUkkgdG8gdGhlIHNoYXJlZCBzdHJpbmdzIGluc2lkZSB0aGUgcGFja2FnZQorICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCBVcmkgU2hhcmVkU3RyaW5nc1VyaSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB3b3JrYm9vaydzIHBhcnQgd2l0aGluIHRoZSBwYWNrYWdlCisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIFppcFBhY2thZ2VQYXJ0IFBhcnQgeworICAgIGdldCB7IHJldHVybiAoX3BhY2thZ2UuUGFja2FnZS5HZXRQYXJ0KFdvcmtib29rVXJpKSk7IH0KKyAgfQorCisgIHByaXZhdGUgWG1sRG9jdW1lbnQgX3dvcmtib29rWG1sOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgWE1MIGRhdGEgcmVwcmVzZW50aW5nIHRoZSB3b3JrYm9vayBpbiB0aGUgcGFja2FnZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIFhtbERvY3VtZW50IFdvcmtib29rWG1sIHsKKyAgICBnZXQgeworICAgICAgaWYgKF93b3JrYm9va1htbCA9PSBudWxsKSB7CisgICAgICAgIENyZWF0ZVdvcmtib29rWG1sKF9uYW1lc3BhY2VNYW5hZ2VyKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAoX3dvcmtib29rWG1sKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfY29kZU1vZHVsZU5hbWVQYXRoID0gImQ6d29ya2Jvb2tQci9AY29kZU5hbWUiOworCisgIGludGVybmFsIHN0cmluZyBDb2RlTW9kdWxlTmFtZSB7CisgICAgZ2V0IHsgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoX2NvZGVNb2R1bGVOYW1lUGF0aCk7IH0KKyAgICBzZXQgeyBTZXRYbWxOb2RlU3RyaW5nKF9jb2RlTW9kdWxlTmFtZVBhdGgsIHZhbHVlKTsgfQorICB9CisKKyAgaW50ZXJuYWwgdm9pZCBDb2RlTmFtZUNoYW5nZShzdHJpbmcgdmFsdWUpIHsKKyAgICBDb2RlTW9kdWxlTmFtZSA9IHZhbHVlOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2RhdGUxOTA0UGF0aCA9ICJkOndvcmtib29rUHIvQGRhdGUxOTA0IjsKKyAgaW50ZXJuYWwgY29uc3QgZG91YmxlIF9kYXRlMTkwNE9mZnNldCA9IDM2NS41ICogNDsgLy8gb2Zmc2V0IHRvIGZpeCAxOTAwIGFuZCAxOTA0IGRpZmZlcmVuY2VzLCA0IE9MRSB5ZWFycworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBkYXRlIHN5c3RlbXMgdXNlZCBieSBNaWNyb3NvZnQgRXhjZWwgY2FuIGJlIGJhc2VkIG9uIG9uZSBvZiB0d28gZGlmZmVyZW50IGRhdGVzLiBCeSBkZWZhdWx0LCBhIHNlcmlhbCBudW1iZXIgb2YgMSBpbiBNaWNyb3NvZnQgRXhjZWwgcmVwcmVzZW50cyBKYW51YXJ5IDEsIDE5MDAuCisgIC8vLyBUaGUgZGVmYXVsdCBmb3IgdGhlIHNlcmlhbCBudW1iZXIgMSBjYW4gYmUgY2hhbmdlZCB0byByZXByZXNlbnQgSmFudWFyeSAyLCAxOTA0LgorICAvLy8gVGhpcyBvcHRpb24gd2FzIGluY2x1ZGVkIGluIE1pY3Jvc29mdCBFeGNlbCBmb3IgV2luZG93cyB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCBFeGNlbCBmb3IgdGhlIE1hY2ludG9zaCwgd2hpY2ggZGVmYXVsdHMgdG8gSmFudWFyeSAyLCAxOTA0LgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBEYXRlMTkwNCB7CisgICAgZ2V0IHsgcmV0dXJuIEdldFhtbE5vZGVCb29sKF9kYXRlMTkwNFBhdGgsIGZhbHNlKTsgfQorICAgIHNldCB7CisgICAgICBpZiAoRGF0ZTE5MDQgIT0gdmFsdWUpIHsKKyAgICAgICAgLy8gTGlrZSBFeGNlbCB3aGVuIHRoZSBvcHRpb24gaXQncyBjaGFuZ2VkIHVwZGF0ZSBpdCBhbGwgY2VsbHMgd2l0aCBEYXRlIGZvcm1hdAorICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBXb3Jrc2hlZXRzKSB7CisgICAgICAgICAgaXRlbS5VcGRhdGVDZWxsc1dpdGhEYXRlMTkwNFNldHRpbmcoKTsKICAgICAgICAgfQotICAgICAKLSAgICAgICAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQ3JlYXRlIG9yIHJlYWQgdGhlIFhNTCBmb3IgdGhlIHdvcmtib29rLgotCQkvLy8gPC9zdW1tYXJ5PgotCQlwcml2YXRlIHZvaWQgQ3JlYXRlV29ya2Jvb2tYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQotCQl7Ci0JCQlpZiAoX3BhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKFdvcmtib29rVXJpKSkKLQkJCQlfd29ya2Jvb2tYbWwgPSBfcGFja2FnZS5HZXRYbWxGcm9tVXJpKFdvcmtib29rVXJpKTsKLQkJCWVsc2UKLQkJCXsKLQkJCQkvLyBjcmVhdGUgYSBuZXcgd29ya2Jvb2sgcGFydCBhbmQgYWRkIHRvIHRoZSBwYWNrYWdlCi0JCQkJUGFja2FnaW5nLlppcFBhY2thZ2VQYXJ0IHBhcnRXb3JrYm9vayA9IF9wYWNrYWdlLlBhY2thZ2UuQ3JlYXRlUGFydChXb3JrYm9va1VyaSwgQCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldC5tYWluK3htbCIsIF9wYWNrYWdlLkNvbXByZXNzaW9uKTsKKyAgICAgIH0KIAotCQkJCS8vIGNyZWF0ZSB0aGUgd29ya2Jvb2sKLQkJCQlfd29ya2Jvb2tYbWwgPSBuZXcgWG1sRG9jdW1lbnQobmFtZXNwYWNlTWFuYWdlci5OYW1lVGFibGUpOyAgICAgICAgICAgICAgICAKLQkJCQkKLQkJCQlfd29ya2Jvb2tYbWwuUHJlc2VydmVXaGl0ZXNwYWNlID0gRXhjZWxQYWNrYWdlLnByZXNlcnZlV2hpdGVzcGFjZTsKLQkJCQkvLyBjcmVhdGUgdGhlIHdvcmtib29rIGVsZW1lbnQKLQkJCQlYbWxFbGVtZW50IHdiRWxlbSA9IF93b3JrYm9va1htbC5DcmVhdGVFbGVtZW50KCJ3b3JrYm9vayIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKKyAgICAgIFNldFhtbE5vZGVCb29sKF9kYXRlMTkwNFBhdGgsIHZhbHVlLCBmYWxzZSk7CisgICAgfQorICB9CiAKLQkJCQkvLyBBZGQgdGhlIHJlbGF0aW9uc2hpcHMgbmFtZXNwYWNlCi0JCQkJd2JFbGVtLlNldEF0dHJpYnV0ZSgieG1sbnM6ciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ3JlYXRlIG9yIHJlYWQgdGhlIFhNTCBmb3IgdGhlIHdvcmtib29rLgorICAvLy8gPC9zdW1tYXJ5PgorICBwcml2YXRlIHZvaWQgQ3JlYXRlV29ya2Jvb2tYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgaWYgKF9wYWNrYWdlLlBhY2thZ2UuUGFydEV4aXN0cyhXb3JrYm9va1VyaSkpIHsKKyAgICAgIF93b3JrYm9va1htbCA9IF9wYWNrYWdlLkdldFhtbEZyb21VcmkoV29ya2Jvb2tVcmkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBjcmVhdGUgYSBuZXcgd29ya2Jvb2sgcGFydCBhbmQgYWRkIHRvIHRoZSBwYWNrYWdlCisgICAgICBaaXBQYWNrYWdlUGFydCBwYXJ0V29ya2Jvb2sgPSBfcGFja2FnZS5QYWNrYWdlLkNyZWF0ZVBhcnQoCisgICAgICAgICAgV29ya2Jvb2tVcmksCisgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Lm1haW4reG1sIiwKKyAgICAgICAgICBfcGFja2FnZS5Db21wcmVzc2lvbik7CiAKLQkJCQlfd29ya2Jvb2tYbWwuQXBwZW5kQ2hpbGQod2JFbGVtKTsKKyAgICAgIC8vIGNyZWF0ZSB0aGUgd29ya2Jvb2sKKyAgICAgIF93b3JrYm9va1htbCA9IG5ldyhuYW1lc3BhY2VNYW5hZ2VyLk5hbWVUYWJsZSk7CiAKLQkJCQkvLyBjcmVhdGUgdGhlIGJvb2tWaWV3cyBhbmQgd29ya2Jvb2tzIGVsZW1lbnQKLQkJCQlYbWxFbGVtZW50IGJvb2tWaWV3cyA9IF93b3JrYm9va1htbC5DcmVhdGVFbGVtZW50KCJib29rVmlld3MiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0JCQkJd2JFbGVtLkFwcGVuZENoaWxkKGJvb2tWaWV3cyk7Ci0JCQkJWG1sRWxlbWVudCB3b3JrYm9va1ZpZXcgPSBfd29ya2Jvb2tYbWwuQ3JlYXRlRWxlbWVudCgid29ya2Jvb2tWaWV3IiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotCQkJCWJvb2tWaWV3cy5BcHBlbmRDaGlsZCh3b3JrYm9va1ZpZXcpOworICAgICAgX3dvcmtib29rWG1sLlByZXNlcnZlV2hpdGVzcGFjZSA9IEV4Y2VsUGFja2FnZS5fcHJlc2VydmVXaGl0ZXNwYWNlOworICAgICAgLy8gY3JlYXRlIHRoZSB3b3JrYm9vayBlbGVtZW50CisgICAgICBYbWxFbGVtZW50IHdiRWxlbSA9IF93b3JrYm9va1htbC5DcmVhdGVFbGVtZW50KCJ3b3JrYm9vayIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CiAKLQkJCQkvLyBzYXZlIGl0IHRvIHRoZSBwYWNrYWdlCi0JCQkJU3RyZWFtV3JpdGVyIHN0cmVhbSA9IG5ldyBTdHJlYW1Xcml0ZXIocGFydFdvcmtib29rLkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKLQkJCQlfd29ya2Jvb2tYbWwuU2F2ZShzdHJlYW0pOwotCQkJCS8vc3RyZWFtLkNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJI2VuZHJlZ2lvbgotCQkjcmVnaW9uIFN0eWxlc1htbAotCQlwcml2YXRlIFhtbERvY3VtZW50IF9zdHlsZXNYbWw7Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgWE1MIGRhdGEgcmVwcmVzZW50aW5nIHRoZSBzdHlsZXMgaW4gdGhlIHBhY2thZ2UuIAotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgWG1sRG9jdW1lbnQgU3R5bGVzWG1sCi0JCXsKLQkJCWdldAotCQkJewotCQkJCWlmIChfc3R5bGVzWG1sID09IG51bGwpCi0JCQkJewotCQkJCQlpZiAoX3BhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKFN0eWxlc1VyaSkpCi0JCQkJCQlfc3R5bGVzWG1sID0gX3BhY2thZ2UuR2V0WG1sRnJvbVVyaShTdHlsZXNVcmkpOwotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCS8vIGNyZWF0ZSBhIG5ldyBzdHlsZXMgcGFydCBhbmQgYWRkIHRvIHRoZSBwYWNrYWdlCi0JCQkJCQlQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgcGFydCA9IF9wYWNrYWdlLlBhY2thZ2UuQ3JlYXRlUGFydChTdHlsZXNVcmksIEAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc3R5bGVzK3htbCIsIF9wYWNrYWdlLkNvbXByZXNzaW9uKTsKLQkJCQkJCS8vIGNyZWF0ZSB0aGUgc3R5bGUgc2hlZXQKKyAgICAgIC8vIEFkZCB0aGUgcmVsYXRpb25zaGlwcyBuYW1lc3BhY2UKKyAgICAgIHdiRWxlbS5TZXRBdHRyaWJ1dGUoInhtbG5zOnIiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYVJlbGF0aW9uc2hpcHMpOwogCi0JCQkJCQlTdHJpbmdCdWlsZGVyIHhtbCA9IG5ldyBTdHJpbmdCdWlsZGVyKCI8c3R5bGVTaGVldCB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiPiIpOwotCQkJCQkJeG1sLkFwcGVuZCgiPG51bUZtdHMgLz4iKTsKLQkJCQkJCXhtbC5BcHBlbmQoIjxmb250cyBjb3VudD1cIjFcIj48Zm9udD48c3ogdmFsPVwiMTFcIiAvPjxuYW1lIHZhbD1cIkNhbGlicmlcIiAvPjwvZm9udD48L2ZvbnRzPiIpOwotCQkJCQkJeG1sLkFwcGVuZCgiPGZpbGxzPjxmaWxsPjxwYXR0ZXJuRmlsbCBwYXR0ZXJuVHlwZT1cIm5vbmVcIiAvPjwvZmlsbD48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9XCJncmF5MTI1XCIgLz48L2ZpbGw+PC9maWxscz4iKTsKLQkJCQkJCXhtbC5BcHBlbmQoIjxib3JkZXJzPjxib3JkZXI+PGxlZnQgLz48cmlnaHQgLz48dG9wIC8+PGJvdHRvbSAvPjxkaWFnb25hbCAvPjwvYm9yZGVyPjwvYm9yZGVycz4iKTsKLQkJCQkJCXhtbC5BcHBlbmQoIjxjZWxsU3R5bGVYZnMgY291bnQ9XCIxXCI+PHhmIG51bUZtdElkPVwiMFwiIGZvbnRJZD1cIjBcIiAvPjwvY2VsbFN0eWxlWGZzPiIpOwotCQkJCQkJeG1sLkFwcGVuZCgiPGNlbGxYZnMgY291bnQ9XCIxXCI+PHhmIG51bUZtdElkPVwiMFwiIGZvbnRJZD1cIjBcIiB4ZklkPVwiMFwiIC8+PC9jZWxsWGZzPiIpOwotCQkJCQkJeG1sLkFwcGVuZCgiPGNlbGxTdHlsZXM+PGNlbGxTdHlsZSBuYW1lPVwiTm9ybWFsXCIgeGZJZD1cIjBcIiBidWlsdGluSWQ9XCIwXCIgLz48L2NlbGxTdHlsZXM+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB4bWwuQXBwZW5kKCI8ZHhmcyBjb3VudD1cIjBcIiAvPiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgeG1sLkFwcGVuZCgiPC9zdHlsZVNoZWV0PiIpOwotCQkJCQkJCi0JCQkJCQlfc3R5bGVzWG1sID0gbmV3IFhtbERvY3VtZW50KCk7Ci0JCQkJCQlfc3R5bGVzWG1sLkxvYWRYbWwoeG1sLlRvU3RyaW5nKCkpOwotCQkJCQkJCi0JCQkJCQkvL1NhdmUgaXQgdG8gdGhlIHBhY2thZ2UKLQkJCQkJCVN0cmVhbVdyaXRlciBzdHJlYW0gPSBuZXcgU3RyZWFtV3JpdGVyKHBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOworICAgICAgX3dvcmtib29rWG1sLkFwcGVuZENoaWxkKHdiRWxlbSk7CiAKLQkJCQkJCV9zdHlsZXNYbWwuU2F2ZShzdHJlYW0pOwotCQkJCQkJLy9zdHJlYW0uQ2xvc2UoKTsKKyAgICAgIC8vIGNyZWF0ZSB0aGUgYm9va1ZpZXdzIGFuZCB3b3JrYm9va3MgZWxlbWVudAorICAgICAgWG1sRWxlbWVudCBib29rVmlld3MgPSBfd29ya2Jvb2tYbWwuQ3JlYXRlRWxlbWVudCgiYm9va1ZpZXdzIiwgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKTsKKyAgICAgIHdiRWxlbS5BcHBlbmRDaGlsZChib29rVmlld3MpOworICAgICAgWG1sRWxlbWVudCB3b3JrYm9va1ZpZXcgPSBfd29ya2Jvb2tYbWwuQ3JlYXRlRWxlbWVudCgKKyAgICAgICAgICAid29ya2Jvb2tWaWV3IiwKKyAgICAgICAgICBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgYm9va1ZpZXdzLkFwcGVuZENoaWxkKHdvcmtib29rVmlldyk7CiAKLQkJCQkJCS8vIGNyZWF0ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHdvcmtib29rIGFuZCB0aGUgbmV3IHNoYXJlZCBzdHJpbmdzIHBhcnQKLQkJCQkJCV9wYWNrYWdlLldvcmtib29rLlBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShXb3JrYm9va1VyaSwgU3R5bGVzVXJpKSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9zdHlsZXMiKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gKF9zdHlsZXNYbWwpOwotCQkJfQotCQkJc2V0Ci0JCQl7Ci0JCQkJX3N0eWxlc1htbCA9IHZhbHVlOwotCQkJfQotCQl9Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFBhY2thZ2Ugc3R5bGVzIGNvbGxlY3Rpb24uIFVzZWQgaW50ZXJuYWxseSB0byBhY2Nlc3Mgc3R5bGUgZGF0YS4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIEV4Y2VsU3R5bGVzIFN0eWxlcwotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlpZiAoX3N0eWxlcyA9PSBudWxsKQotCQkJCXsKLQkJCQkJX3N0eWxlcyA9IG5ldyBFeGNlbFN0eWxlcyhOYW1lU3BhY2VNYW5hZ2VyLCBTdHlsZXNYbWwsIHRoaXMpOwotCQkJCX0KLQkJCQlyZXR1cm4gX3N0eWxlczsKLQkJCX0KLQkJfQotCQkjZW5kcmVnaW9uCisgICAgICAvLyBzYXZlIGl0IHRvIHRoZSBwYWNrYWdlCisgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtID0gbmV3IFN0cmVhbVdyaXRlcigKKyAgICAgICAgICBwYXJ0V29ya2Jvb2suR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOworICAgICAgX3dvcmtib29rWG1sLlNhdmUoc3RyZWFtKTsKKyAgICAgIC8vc3RyZWFtLkNsb3NlKCk7CisgICAgfQorICB9CiAKLQkJI3JlZ2lvbiBPZmZpY2UgRG9jdW1lbnQgUHJvcGVydGllcwotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBUaGUgb2ZmaWNlIGRvY3VtZW50IHByb3BlcnRpZXMKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIE9mZmljZVByb3BlcnRpZXMgUHJvcGVydGllcwotCQl7Ci0JCQlnZXQgCi0JCQl7Ci0JCQkJaWYgKF9wcm9wZXJ0aWVzID09IG51bGwpCi0JCQkJewotCQkJCQkvLyAgQ3JlYXRlIGEgTmFtZXNwYWNlTWFuYWdlciB0byBoYW5kbGUgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLCAKLQkJCQkJLy8gIGFuZCBjcmVhdGUgYSBwcmVmaXggZm9yIHRoZSBkZWZhdWx0IG5hbWVzcGFjZTogICAgICAgICAgICAgICAgICAgCi0JCQkJCV9wcm9wZXJ0aWVzID0gbmV3IE9mZmljZVByb3BlcnRpZXMoX3BhY2thZ2UsIE5hbWVTcGFjZU1hbmFnZXIpOwotCQkJCX0KLQkJCQlyZXR1cm4gX3Byb3BlcnRpZXM7Ci0JCQl9Ci0JCX0KLQkJI2VuZHJlZ2lvbgorICBwcml2YXRlIFhtbERvY3VtZW50IF9zdHlsZXNYbWw7CiAKLQkJI3JlZ2lvbiBDYWxjTW9kZQotCQlwcml2YXRlIHN0cmluZyBDQUxDX01PREVfUEFUSCA9ICJkOmNhbGNQci9AY2FsY01vZGUiOwotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBDYWxjdWxhdGlvbiBtb2RlIGZvciB0aGUgd29ya2Jvb2suCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBFeGNlbENhbGNNb2RlIENhbGNNb2RlCi0JCXsKLQkJCWdldAotCQkJewotCQkJCXN0cmluZyBjYWxjTW9kZSA9IEdldFhtbE5vZGVTdHJpbmcoQ0FMQ19NT0RFX1BBVEgpOwotCQkJCXN3aXRjaCAoY2FsY01vZGUpCi0JCQkJewotCQkJCQljYXNlICJhdXRvTm9UYWJsZSI6Ci0JCQkJCQlyZXR1cm4gRXhjZWxDYWxjTW9kZS5BdXRvbWF0aWNOb1RhYmxlOwotCQkJCQljYXNlICJtYW51YWwiOgotCQkJCQkJcmV0dXJuIEV4Y2VsQ2FsY01vZGUuTWFudWFsOwotCQkJCQlkZWZhdWx0OgotCQkJCQkJcmV0dXJuIEV4Y2VsQ2FsY01vZGUuQXV0b21hdGljOwotICAgICAgICAgICAgICAgICAgICAgICAgCi0JCQkJfQotCQkJfQotCQkJc2V0Ci0JCQl7Ci0JCQkJc3dpdGNoICh2YWx1ZSkKLQkJCQl7Ci0JCQkJCWNhc2UgRXhjZWxDYWxjTW9kZS5BdXRvbWF0aWNOb1RhYmxlOgotCQkJCQkJU2V0WG1sTm9kZVN0cmluZyhDQUxDX01PREVfUEFUSCwgImF1dG9Ob1RhYmxlIikgOwotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRXhjZWxDYWxjTW9kZS5NYW51YWw6Ci0JCQkJCQlTZXRYbWxOb2RlU3RyaW5nKENBTENfTU9ERV9QQVRILCAibWFudWFsIik7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCVNldFhtbE5vZGVTdHJpbmcoQ0FMQ19NT0RFX1BBVEgsICJhdXRvIik7Ci0JCQkJCQlicmVhazsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBYTUwgZGF0YSByZXByZXNlbnRpbmcgdGhlIHN0eWxlcyBpbiB0aGUgcGFja2FnZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIFhtbERvY3VtZW50IFN0eWxlc1htbCB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfc3R5bGVzWG1sID09IG51bGwpIHsKKyAgICAgICAgaWYgKF9wYWNrYWdlLlBhY2thZ2UuUGFydEV4aXN0cyhTdHlsZXNVcmkpKSB7CisgICAgICAgICAgX3N0eWxlc1htbCA9IF9wYWNrYWdlLkdldFhtbEZyb21VcmkoU3R5bGVzVXJpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgc3R5bGVzIHBhcnQgYW5kIGFkZCB0byB0aGUgcGFja2FnZQorICAgICAgICAgIFppcFBhY2thZ2VQYXJ0IHBhcnQgPSBfcGFja2FnZS5QYWNrYWdlLkNyZWF0ZVBhcnQoCisgICAgICAgICAgICAgIFN0eWxlc1VyaSwKKyAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnN0eWxlcyt4bWwiLAorICAgICAgICAgICAgICBfcGFja2FnZS5Db21wcmVzc2lvbik7CisgICAgICAgICAgLy8gY3JlYXRlIHRoZSBzdHlsZSBzaGVldAogCi0JCQkJfQotCQkJfQotCQkJI2VuZHJlZ2lvbgotCQl9CisgICAgICAgICAgU3RyaW5nQnVpbGRlciB4bWwgPSBuZXcgU3RyaW5nQnVpbGRlcigKKyAgICAgICAgICAgICAgIjxzdHlsZVNoZWV0IHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCI+Iik7CisgICAgICAgICAgeG1sLkFwcGVuZCgiPG51bUZtdHMgLz4iKTsKKyAgICAgICAgICB4bWwuQXBwZW5kKAorICAgICAgICAgICAgICAiPGZvbnRzIGNvdW50PVwiMVwiPjxmb250PjxzeiB2YWw9XCIxMVwiIC8+PG5hbWUgdmFsPVwiQ2FsaWJyaVwiIC8+PC9mb250PjwvZm9udHM+Iik7CisgICAgICAgICAgeG1sLkFwcGVuZCgKKyAgICAgICAgICAgICAgIjxmaWxscz48ZmlsbD48cGF0dGVybkZpbGwgcGF0dGVyblR5cGU9XCJub25lXCIgLz48L2ZpbGw+PGZpbGw+PHBhdHRlcm5GaWxsIHBhdHRlcm5UeXBlPVwiZ3JheTEyNVwiIC8+PC9maWxsPjwvZmlsbHM+Iik7CisgICAgICAgICAgeG1sLkFwcGVuZCgKKyAgICAgICAgICAgICAgIjxib3JkZXJzPjxib3JkZXI+PGxlZnQgLz48cmlnaHQgLz48dG9wIC8+PGJvdHRvbSAvPjxkaWFnb25hbCAvPjwvYm9yZGVyPjwvYm9yZGVycz4iKTsKKyAgICAgICAgICB4bWwuQXBwZW5kKCI8Y2VsbFN0eWxlWGZzIGNvdW50PVwiMVwiPjx4ZiBudW1GbXRJZD1cIjBcIiBmb250SWQ9XCIwXCIgLz48L2NlbGxTdHlsZVhmcz4iKTsKKyAgICAgICAgICB4bWwuQXBwZW5kKAorICAgICAgICAgICAgICAiPGNlbGxYZnMgY291bnQ9XCIxXCI+PHhmIG51bUZtdElkPVwiMFwiIGZvbnRJZD1cIjBcIiB4ZklkPVwiMFwiIC8+PC9jZWxsWGZzPiIpOworICAgICAgICAgIHhtbC5BcHBlbmQoCisgICAgICAgICAgICAgICI8Y2VsbFN0eWxlcz48Y2VsbFN0eWxlIG5hbWU9XCJOb3JtYWxcIiB4ZklkPVwiMFwiIGJ1aWx0aW5JZD1cIjBcIiAvPjwvY2VsbFN0eWxlcz4iKTsKKyAgICAgICAgICB4bWwuQXBwZW5kKCI8ZHhmcyBjb3VudD1cIjBcIiAvPiIpOworICAgICAgICAgIHhtbC5BcHBlbmQoIjwvc3R5bGVTaGVldD4iKTsKIAotICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBGVUxMX0NBTENfT05fTE9BRF9QQVRIID0gImQ6Y2FsY1ByL0BmdWxsQ2FsY09uTG9hZCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNob3VsZCBFeGNlbCBkbyBhIGZ1bGwgY2FsY3VsYXRpb24gYWZ0ZXIgdGhlIHdvcmtib29rIGhhcyBiZWVuIGxvYWRlZD8KLSAgICAgICAgLy8vIDxyZW1hcmtzPlRoaXMgcHJvcGVydHkgaXMgYWx3YXlzIHRydWUgZm9yIGJvdGggbmV3IHdvcmtib29rcyBhbmQgbG9hZGVkIHRlbXBsYXRlcyhvbiBsb2FkKS4gSWYgdGhpcyBpcyBub3QgdGhlIHdhbnRlZCBiZWhhdmlvciBzZXQgdGhpcyBwcm9wZXJ0eSB0byBmYWxzZS48L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEZ1bGxDYWxjT25Mb2FkCi0JICAgIHsKLQkgICAgICAgIGdldAotCSAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChGVUxMX0NBTENfT05fTE9BRF9QQVRIKTsgICAKLQkgICAgICAgIH0KLQkgICAgICAgIHNldAotCSAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKEZVTExfQ0FMQ19PTl9MT0FEX1BBVEgsIHZhbHVlKTsKLQkgICAgICAgIH0KLQkgICAgfQotCQkjZW5kcmVnaW9uCi0JCSNyZWdpb24gV29ya2Jvb2sgUHJpdmF0ZSBNZXRob2RzCi0JCQkKLQkJI3JlZ2lvbiBTYXZlIC8vIFdvcmtib29rIFNhdmUKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gU2F2ZXMgdGhlIHdvcmtib29rIGFuZCBhbGwgaXRzIGNvbXBvbmVudHMgdG8gdGhlIHBhY2thZ2UuCi0JCS8vLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkhCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCWludGVybmFsIHZvaWQgU2F2ZSgpICAvLyBXb3JrYm9vayBTYXZlCi0JCXsKLQkJCWlmIChXb3Jrc2hlZXRzLkNvdW50ID09IDApCi0JCQkJdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSB3b3JrYm9vayBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHdvcmtzaGVldCIpOworICAgICAgICAgIF9zdHlsZXNYbWwgPSBuZXcoKTsKKyAgICAgICAgICBfc3R5bGVzWG1sLkxvYWRYbWwoeG1sLlRvU3RyaW5nKCkpOwogCi0JCQlEZWxldGVDYWxjQ2hhaW4oKTsKKyAgICAgICAgICAvL1NhdmUgaXQgdG8gdGhlIHBhY2thZ2UKKyAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtID0gbmV3IFN0cmVhbVdyaXRlcihwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKIAotCQkJY29uc3Qgc3RyaW5nIHZiYVBhcnRVcmkgPSAiL3hsL3ZiYVByb2plY3QuYmluIjsKLSAgICAgICAgICAgIGlmICghX3BhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKG5ldyBVcmkodmJhUGFydFVyaSwgVXJpS2luZC5SZWxhdGl2ZSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChQYXJ0LkNvbnRlbnRUeXBlICE9IEV4Y2VsUGFja2FnZS5jb250ZW50VHlwZVdvcmtib29rRGVmYXVsdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFBhcnQuQ29udGVudFR5cGUgPSBFeGNlbFBhY2thZ2UuY29udGVudFR5cGVXb3JrYm9va0RlZmF1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChQYXJ0LkNvbnRlbnRUeXBlICE9IEV4Y2VsUGFja2FnZS5jb250ZW50VHlwZVdvcmtib29rTWFjcm9FbmFibGVkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUGFydC5Db250ZW50VHlwZSA9IEV4Y2VsUGFja2FnZS5jb250ZW50VHlwZVdvcmtib29rTWFjcm9FbmFibGVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQkJCQotICAgICAgICAgICAgVXBkYXRlRGVmaW5lZE5hbWVzWG1sKCk7CisgICAgICAgICAgX3N0eWxlc1htbC5TYXZlKHN0cmVhbSk7CisgICAgICAgICAgLy9zdHJlYW0uQ2xvc2UoKTsKIAotCQkJLy8gc2F2ZSB0aGUgd29ya2Jvb2sKLQkJCWlmIChfd29ya2Jvb2tYbWwgIT0gbnVsbCkKLQkJCXsKLQkJCQlfcGFja2FnZS5TYXZlUGFydChXb3JrYm9va1VyaSwgX3dvcmtib29rWG1sKTsKLQkJCX0KLQotCQkJLy8gc2F2ZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgd29ya2Jvb2sKLQkJCWlmIChfcHJvcGVydGllcyAhPSBudWxsKQotCQkJewotCQkJCV9wcm9wZXJ0aWVzLlNhdmUoKTsKLQkJCX0KLQotCQkJLy8gc2F2ZSB0aGUgc3R5bGUgc2hlZXQKLQkJCVN0eWxlcy5VcGRhdGVYbWwoKTsKLQkJCV9wYWNrYWdlLlNhdmVQYXJ0KFN0eWxlc1VyaSwgX3N0eWxlc1htbCk7Ci0KLQkJCS8vIHNhdmUgYWxsIHRoZSBvcGVuIHdvcmtzaGVldHMKLQkJCXZhciBpc1Byb3RlY3RlZCA9IFByb3RlY3Rpb24uTG9ja1dpbmRvd3MgfHwgUHJvdGVjdGlvbi5Mb2NrU3RydWN0dXJlOwotCQkJZm9yZWFjaCAoRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0IGluIFdvcmtzaGVldHMpCi0JCQl7Ci0JCQkJaWYgKGlzUHJvdGVjdGVkICYmIFByb3RlY3Rpb24uTG9ja1dpbmRvd3MpCi0JCQkJewotCQkJCQl3b3Jrc2hlZXQuVmlldy5XaW5kb3dQcm90ZWN0aW9uID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJd29ya3NoZWV0LlNhdmUoKTsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXQuUGFydC5TYXZlSGFuZGxlciA9IHdvcmtzaGVldC5TYXZlSGFuZGxlcjsKLQkJCX0KLQotICAgICAgICAgICAgdmFyIHBhcnQgPSBfcGFja2FnZS5QYWNrYWdlLkNyZWF0ZVBhcnQoU2hhcmVkU3RyaW5nc1VyaSwgRXhjZWxQYWNrYWdlLmNvbnRlbnRUeXBlU2hhcmVkU3RyaW5nLCBfcGFja2FnZS5Db21wcmVzc2lvbik7Ci0gICAgICAgICAgICBwYXJ0LlNhdmVIYW5kbGVyID0gU2F2ZVNoYXJlZFN0cmluZ0hhbmRsZXI7Ci0gICAgICAgICAgICBQYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChVcmlIZWxwZXIuR2V0UmVsYXRpdmVVcmkoV29ya2Jvb2tVcmksIFNoYXJlZFN0cmluZ3NVcmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3NoYXJlZFN0cmluZ3MiKTsKLSAgICAgICAgICAgIC8vVXBkYXRlU2hhcmVkU3RyaW5nc1htbCgpOwotCQkJCi0JCQkvLyBEYXRhIHZhbGlkYXRpb24KLQkJCVZhbGlkYXRlRGF0YVZhbGlkYXRpb25zKCk7Ci0JCX0KLQkJcHJpdmF0ZSB2b2lkIERlbGV0ZUNhbGNDaGFpbigpCi0JCXsKLQkJCS8vUmVtb3ZlIHRoZSBjYWxjIGNoYWluIGlmIGl0IGV4aXN0cy4KLQkJCVVyaSB1cmlDYWxjQ2hhaW4gPSBuZXcgVXJpKCIveGwvY2FsY0NoYWluLnhtbCIsIFVyaUtpbmQuUmVsYXRpdmUpOwotCQkJaWYgKF9wYWNrYWdlLlBhY2thZ2UuUGFydEV4aXN0cyh1cmlDYWxjQ2hhaW4pKQotCQkJewotCQkJCVVyaSBjYWxjQ2hhaW4gPSBuZXcgVXJpKCJjYWxjQ2hhaW4ueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSk7Ci0JCQkJZm9yZWFjaCAodmFyIHJlbGF0aW9uc2hpcCBpbiBfcGFja2FnZS5Xb3JrYm9vay5QYXJ0LkdldFJlbGF0aW9uc2hpcHMoKSkKLQkJCQl7Ci0JCQkJCWlmIChyZWxhdGlvbnNoaXAuVGFyZ2V0VXJpID09IGNhbGNDaGFpbikKLQkJCQkJewotCQkJCQkJX3BhY2thZ2UuV29ya2Jvb2suUGFydC5EZWxldGVSZWxhdGlvbnNoaXAocmVsYXRpb25zaGlwLklkKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGRlbGV0ZSB0aGUgY2FsY0NoYWluIHBhcnQKLQkJCQlfcGFja2FnZS5QYWNrYWdlLkRlbGV0ZVBhcnQodXJpQ2FsY0NoYWluKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBWYWxpZGF0ZURhdGFWYWxpZGF0aW9ucygpCi0JCXsKLQkJCWZvcmVhY2ggKHZhciBzaGVldCBpbiBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzKQotCQkJewotICAgICAgICAgICAgICAgIGlmICghKHNoZWV0IGlzIEV4Y2VsQ2hhcnRzaGVldCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzaGVldC5EYXRhVmFsaWRhdGlvbnMuVmFsaWRhdGVBbGwoKTsKLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCX0KLQotICAgICAgICBwcml2YXRlIHZvaWQgU2F2ZVNoYXJlZFN0cmluZ0hhbmRsZXIoU3RyZWFtV3JpdGVyIHN3KQotCQl7Ci0gICAgICAgICAgICB2YXIgY2FjaGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOyAgICAgICAgICAgIAotICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIiA/Pjxzc3QgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW5cIiBjb3VudD1cInswfVwiIHVuaXF1ZUNvdW50PVwiezB9XCI+IiwgX3NoYXJlZFN0cmluZ3MuQ291bnQpOwotCQkJZm9yZWFjaCAoc3RyaW5nIHQgaW4gX3NoYXJlZFN0cmluZ3MuS2V5cykKLQkJCXsKLQotCQkJCVNoYXJlZFN0cmluZ0l0ZW0gc3NpID0gX3NoYXJlZFN0cmluZ3NbdF07Ci0JCQkJaWYgKHNzaS5pc1JpY2hUZXh0KQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kKCI8c2k+Iik7Ci0gICAgICAgICAgICAgICAgICAgIENvbnZlcnRVdGlsLkV4Y2VsRW5jb2RlU3RyaW5nKGNhY2hlLCB0KTsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kKCI8L3NpPiIpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotICAgICAgICAgICAgICAgICAgICBpZiAodC5MZW5ndGggPiAwICYmICh0WzBdID09ICcgJyB8fCB0W3QuTGVuZ3RoIC0gMV0gPT0gJyAnIHx8IHQuQ29udGFpbnMoIiAgIikgfHwgdC5Db250YWlucygiXHQiKSB8fCB0LkNvbnRhaW5zKCJcbiIpIHx8IHQuQ29udGFpbnMoIlxuIikpKSAgIC8vRml4ZXMgaXNzdWUgMTQ4NDkKLQkJCQkJewotICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kKCI8c2k+PHQgeG1sOnNwYWNlPVwicHJlc2VydmVcIj4iKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZCgiPHNpPjx0PiIpOwotCQkJCQl9Ci0gICAgICAgICAgICAgICAgICAgIENvbnZlcnRVdGlsLkV4Y2VsRW5jb2RlU3RyaW5nKGNhY2hlLCBDb252ZXJ0VXRpbC5FeGNlbEVzY2FwZVN0cmluZyh0KSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZCgiPC90Pjwvc2k+Iik7Ci0JCQkJfQotICAgICAgICAgICAgICAgIGlmIChjYWNoZS5MZW5ndGggPiAweDYwMDAwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKGNhY2hlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotCQkJfQotICAgICAgICAgICAgY2FjaGUuQXBwZW5kKCI8L3NzdD4iKTsKLSAgICAgICAgICAgIHN3LldyaXRlKGNhY2hlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgc3cuRmx1c2goKTsKLSAgICAgICAgICAgIFBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShXb3JrYm9va1VyaSwgU2hhcmVkU3RyaW5nc1VyaSksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvc2hhcmVkU3RyaW5ncyIpOwotCQl9Ci0JCXByaXZhdGUgdm9pZCBVcGRhdGVEZWZpbmVkTmFtZXNYbWwoKQotCQl7Ci0JCQl0cnkKLQkJCXsKLSAgICAgICAgICAgICAgICBYbWxOb2RlIHRvcCA9IFdvcmtib29rWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpkZWZpbmVkTmFtZXMiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLQkJCQlpZiAoIUV4aXN0c05hbWVzKCkpCi0JCQkJewotCQkJCQlpZiAodG9wICE9IG51bGwpIFRvcE5vZGUuUmVtb3ZlQ2hpbGQodG9wKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQlpZiAodG9wID09IG51bGwpCi0JCQkJCXsKLQkJCQkJCUNyZWF0ZU5vZGUoImQ6ZGVmaW5lZE5hbWVzIik7Ci0JCQkJCQl0b3AgPSBXb3JrYm9va1htbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6ZGVmaW5lZE5hbWVzIiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQl0b3AuUmVtb3ZlQWxsKCk7Ci0JCQkJCX0KLQkJCQkJZm9yZWFjaCAoRXhjZWxOYW1lZFJhbmdlIG5hbWUgaW4gX25hbWVzKQotCQkJCQl7Ci0KLQkJCQkJCVhtbEVsZW1lbnQgZWxlbSA9IFdvcmtib29rWG1sLkNyZWF0ZUVsZW1lbnQoImRlZmluZWROYW1lIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotCQkJCQkJdG9wLkFwcGVuZENoaWxkKGVsZW0pOwotCQkJCQkJZWxlbS5TZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lLk5hbWUpOwotCQkJCQkJaWYgKG5hbWUuSXNOYW1lSGlkZGVuKSBlbGVtLlNldEF0dHJpYnV0ZSgiaGlkZGVuIiwgIjEiKTsKLQkJCQkJCWlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkobmFtZS5OYW1lQ29tbWVudCkpIGVsZW0uU2V0QXR0cmlidXRlKCJjb21tZW50IiwgbmFtZS5OYW1lQ29tbWVudCk7Ci0JCQkJCQlTZXROYW1lRWxlbWVudChuYW1lLCBlbGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmb3JlYWNoIChFeGNlbFdvcmtzaGVldCB3cyBpbiBfd29ya3NoZWV0cykKLQkJCQl7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKHdzIGlzIEV4Y2VsQ2hhcnRzaGVldCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKEV4Y2VsTmFtZWRSYW5nZSBuYW1lIGluIHdzLk5hbWVzKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZWxlbSA9IFdvcmtib29rWG1sLkNyZWF0ZUVsZW1lbnQoImRlZmluZWROYW1lIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5BcHBlbmRDaGlsZChlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLlNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUuTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5TZXRBdHRyaWJ1dGUoImxvY2FsU2hlZXRJZCIsIG5hbWUuTG9jYWxTaGVldElkLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLklzTmFtZUhpZGRlbikgZWxlbS5TZXRBdHRyaWJ1dGUoImhpZGRlbiIsICIxIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShuYW1lLk5hbWVDb21tZW50KSkgZWxlbS5TZXRBdHRyaWJ1dGUoImNvbW1lbnQiLCBuYW1lLk5hbWVDb21tZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXROYW1lRWxlbWVudChuYW1lLCBlbGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW50ZXJuYWwgZXJyb3IgdXBkYXRpbmcgbmFtZWQgcmFuZ2VzICIsZXgpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIFNldE5hbWVFbGVtZW50KEV4Y2VsTmFtZWRSYW5nZSBuYW1lLCBYbWxFbGVtZW50IGVsZW0pCi0JCXsKLQkJCWlmIChuYW1lLklzTmFtZSkKLQkJCXsKLQkJCQlpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkobmFtZS5OYW1lRm9ybXVsYSkpCi0JCQkJewotCQkJCQlpZiAoKG5hbWUuTmFtZVZhbHVlLkdldFR5cGUoKS5Jc1ByaW1pdGl2ZSB8fCBuYW1lLk5hbWVWYWx1ZSBpcyBkb3VibGUgfHwgbmFtZS5OYW1lVmFsdWUgaXMgZGVjaW1hbCkpCi0JCQkJCXsKLQkJCQkJCWVsZW0uSW5uZXJUZXh0ID0gQ29udmVydC5Ub0RvdWJsZShuYW1lLk5hbWVWYWx1ZSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkuVG9TdHJpbmcoIlIxNSIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOyAKLQkJCQkJfQotCQkJCQllbHNlIGlmIChuYW1lLk5hbWVWYWx1ZSBpcyBEYXRlVGltZSkKLQkJCQkJewotCQkJCQkJZWxlbS5Jbm5lclRleHQgPSAoKERhdGVUaW1lKW5hbWUuTmFtZVZhbHVlKS5Ub09BRGF0ZSgpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJZWxlbS5Jbm5lclRleHQgPSAiXCIiICsgbmFtZS5OYW1lVmFsdWUuVG9TdHJpbmcoKSArICJcIiI7Ci0JCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCX0KLQkJCQllbHNlCi0JCQkJewotCQkJCQllbGVtLklubmVyVGV4dCA9IG5hbWUuTmFtZUZvcm11bGE7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotICAgICAgICAgICAgICAgIGVsZW0uSW5uZXJUZXh0ID0gbmFtZS5GdWxsQWRkcmVzc0Fic29sdXRlOwotCQkJfQotCQl9Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIElzIHRoZWlyIGFueSBuYW1lcyBpbiB0aGUgd29ya2Jvb2sgb3IgaW4gdGhlIHNoZWV0cy4KLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxyZXR1cm5zPj88L3JldHVybnM+Ci0JCXByaXZhdGUgYm9vbCBFeGlzdHNOYW1lcygpCi0JCXsKLQkJCWlmIChfbmFtZXMuQ291bnQgPT0gMCkKLQkJCXsKLQkJCQlmb3JlYWNoIChFeGNlbFdvcmtzaGVldCB3cyBpbiBXb3Jrc2hlZXRzKQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdzIGlzIEV4Y2VsQ2hhcnRzaGVldCkgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHdzLk5hbWVzLkNvdW50PjApCi0JCQkJCXsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9ICAgICAgICAKLQkJI2VuZHJlZ2lvbgotCi0JCSNlbmRyZWdpb24KLQkJaW50ZXJuYWwgYm9vbCBFeGlzdHNUYWJsZU5hbWUoc3RyaW5nIE5hbWUpCi0JCXsKLQkJCWZvcmVhY2ggKHZhciB3cyBpbiBXb3Jrc2hlZXRzKQotCQkJewotCQkJCWlmKHdzLlRhYmxlcy5fdGFibGVOYW1lcy5Db250YWluc0tleShOYW1lKSkKLQkJCQl7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnRlcm5hbCBib29sIEV4aXN0c1Bpdm90VGFibGVOYW1lKHN0cmluZyBOYW1lKQotCQl7Ci0JCQlmb3JlYWNoICh2YXIgd3MgaW4gV29ya3NoZWV0cykKLQkJCXsKLQkJCQlpZiAod3MuUGl2b3RUYWJsZXMuX3Bpdm90VGFibGVOYW1lcy5Db250YWluc0tleShOYW1lKSkKLQkJCQl7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnRlcm5hbCB2b2lkIEFkZFBpdm90VGFibGUoc3RyaW5nIGNhY2hlSUQsIFVyaSBkZWZVcmkpCi0JCXsKLQkJCUNyZWF0ZU5vZGUoImQ6cGl2b3RDYWNoZXMiKTsKLQotCQkJWG1sRWxlbWVudCBpdGVtID0gV29ya2Jvb2tYbWwuQ3JlYXRlRWxlbWVudCgicGl2b3RDYWNoZSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLQkJCWl0ZW0uU2V0QXR0cmlidXRlKCJjYWNoZUlkIiwgY2FjaGVJRCk7Ci0JCQl2YXIgcmVsID0gUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKFdvcmtib29rVXJpLCBkZWZVcmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3Bpdm90Q2FjaGVEZWZpbml0aW9uIik7Ci0JCQlpdGVtLlNldEF0dHJpYnV0ZSgiaWQiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcywgcmVsLklkKTsKLQotCQkJdmFyIHBpdm90Q2FjaGVzID0gV29ya2Jvb2tYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOnBpdm90Q2FjaGVzIiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0JCQlwaXZvdENhY2hlcy5BcHBlbmRDaGlsZChpdGVtKTsKLQkJfQotCQlpbnRlcm5hbCBMaXN0PHN0cmluZz4gX2V4dGVybmFsUmVmZXJlbmNlcyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKLSAgICAgICAgLy9pbnRlcm5hbCBib29sIF9pc0NhbGN1bGF0ZWQ9ZmFsc2U7Ci0JCWludGVybmFsIHZvaWQgR2V0RXh0ZXJuYWxSZWZlcmVuY2VzKCkKLQkJewotCQkJWG1sTm9kZUxpc3QgbmwgPSBXb3JrYm9va1htbC5TZWxlY3ROb2RlcygiLy9kOmV4dGVybmFsUmVmZXJlbmNlcy9kOmV4dGVybmFsUmVmZXJlbmNlIiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0JCQlpZiAobmwgIT0gbnVsbCkKLQkJCXsKLQkJCQlmb3JlYWNoIChYbWxFbGVtZW50IGVsZW0gaW4gbmwpCi0JCQkJewotCQkJCQlzdHJpbmcgcklEID0gZWxlbS5HZXRBdHRyaWJ1dGUoInI6aWQiKTsKLQkJCQkJdmFyIHJlbCA9IFBhcnQuR2V0UmVsYXRpb25zaGlwKHJJRCk7Ci0JCQkJCXZhciBwYXJ0ID0gX3BhY2thZ2UuUGFja2FnZS5HZXRQYXJ0KFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShyZWwuU291cmNlVXJpLCByZWwuVGFyZ2V0VXJpKSk7Ci0JCQkJCVhtbERvY3VtZW50IHhtbEV4dFJlZiA9IG5ldyBYbWxEb2N1bWVudCgpOwotICAgICAgICAgICAgICAgICAgICBMb2FkWG1sU2FmZSh4bWxFeHRSZWYsIHBhcnQuR2V0U3RyZWFtKCkpOyAKLQotCQkJCQlYbWxFbGVtZW50IGJvb2s9eG1sRXh0UmVmLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpleHRlcm5hbEJvb2siLCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotCQkJCQlpZihib29rIT1udWxsKQotCQkJCQl7Ci0JCQkJCQlzdHJpbmcgcklkX0V4dFJlZiA9IGJvb2suR2V0QXR0cmlidXRlKCJyOmlkIik7Ci0JCQkJCQl2YXIgcmVsX2V4dFJlZiA9IHBhcnQuR2V0UmVsYXRpb25zaGlwKHJJZF9FeHRSZWYpOwotCQkJCQkJaWYgKHJlbF9leHRSZWYgIT0gbnVsbCkKLQkJCQkJCXsKLQkJCQkJCQlfZXh0ZXJuYWxSZWZlcmVuY2VzLkFkZChyZWxfZXh0UmVmLlRhcmdldFVyaS5PcmlnaW5hbFN0cmluZyk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLSAgICAgICAgaW50ZXJuYWwgdm9pZCBSZWFkQWxsVGFibGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9uZXh0VGFibGVJRCA+IDApIHJldHVybjsKLSAgICAgICAgICAgIF9uZXh0VGFibGVJRCA9IDE7Ci0gICAgICAgICAgICBfbmV4dFBpdm90VGFibGVJRCA9IDE7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgd3MgaW4gV29ya3NoZWV0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoISh3cyBpcyBFeGNlbENoYXJ0c2hlZXQpKSAvL0ZpeGVzIDE1MjczLiBDaGFydHNoZWV0cyBzaG91bGQgYmUgaWdub3JlZC4KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0YmwgaW4gd3MuVGFibGVzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGJsLklkID49IF9uZXh0VGFibGVJRCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbmV4dFRhYmxlSUQgPSB0YmwuSWQgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwdCBpbiB3cy5QaXZvdFRhYmxlcykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0LkNhY2hlSUQgPj0gX25leHRQaXZvdFRhYmxlSUQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX25leHRQaXZvdFRhYmxlSUQgPSBwdC5DYWNoZUlEICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICAgICAgICAvLyBjcmVhdGUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB3b3JrYm9vayBhbmQgdGhlIG5ldyBzaGFyZWQgc3RyaW5ncyBwYXJ0CisgICAgICAgICAgX3BhY2thZ2UuV29ya2Jvb2suUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgIFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShXb3JrYm9va1VyaSwgU3R5bGVzVXJpKSwKKyAgICAgICAgICAgICAgVGFyZ2V0TW9kZS5JbnRlcm5hbCwKKyAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9zdHlsZXMiKTsKICAgICAgICAgfQotICAgIH0gLy8gZW5kIFdvcmtib29rCisgICAgICB9CisgICAgICByZXR1cm4gKF9zdHlsZXNYbWwpOworICAgIH0KKyAgICBzZXQgeyBfc3R5bGVzWG1sID0gdmFsdWU7IH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFBhY2thZ2Ugc3R5bGVzIGNvbGxlY3Rpb24uIFVzZWQgaW50ZXJuYWxseSB0byBhY2Nlc3Mgc3R5bGUgZGF0YS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsU3R5bGVzIFN0eWxlcyB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfc3R5bGVzID09IG51bGwpIHsKKyAgICAgICAgX3N0eWxlcyA9IG5ldyhOYW1lU3BhY2VNYW5hZ2VyLCBTdHlsZXNYbWwsIHRoaXMpOworICAgICAgfQorICAgICAgcmV0dXJuIF9zdHlsZXM7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIG9mZmljZSBkb2N1bWVudCBwcm9wZXJ0aWVzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBPZmZpY2VQcm9wZXJ0aWVzIFByb3BlcnRpZXMgeworICAgIGdldCB7CisgICAgICBpZiAoX3Byb3BlcnRpZXMgPT0gbnVsbCkgeworICAgICAgICAvLyAgQ3JlYXRlIGEgTmFtZXNwYWNlTWFuYWdlciB0byBoYW5kbGUgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLAorICAgICAgICAvLyAgYW5kIGNyZWF0ZSBhIHByZWZpeCBmb3IgdGhlIGRlZmF1bHQgbmFtZXNwYWNlOgorICAgICAgICBfcHJvcGVydGllcyA9IG5ldyhfcGFja2FnZSwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICB9CisgICAgICByZXR1cm4gX3Byb3BlcnRpZXM7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdHJpbmcgQ0FMQ19NT0RFX1BBVEggPSAiZDpjYWxjUHIvQGNhbGNNb2RlIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDYWxjdWxhdGlvbiBtb2RlIGZvciB0aGUgd29ya2Jvb2suCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbENhbGNNb2RlIENhbGNNb2RlIHsKKyAgICBnZXQgeworICAgICAgc3RyaW5nIGNhbGNNb2RlID0gR2V0WG1sTm9kZVN0cmluZyhDQUxDX01PREVfUEFUSCk7CisgICAgICBzd2l0Y2ggKGNhbGNNb2RlKSB7CisgICAgICAgIGNhc2UgImF1dG9Ob1RhYmxlIjoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDYWxjTW9kZS5BdXRvbWF0aWNOb1RhYmxlOworICAgICAgICBjYXNlICJtYW51YWwiOgorICAgICAgICAgIHJldHVybiBFeGNlbENhbGNNb2RlLk1hbnVhbDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gRXhjZWxDYWxjTW9kZS5BdXRvbWF0aWM7CisgICAgICB9CisgICAgfQorICAgIHNldCB7CisgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgIGNhc2UgRXhjZWxDYWxjTW9kZS5BdXRvbWF0aWNOb1RhYmxlOgorICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoQ0FMQ19NT0RFX1BBVEgsICJhdXRvTm9UYWJsZSIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEV4Y2VsQ2FsY01vZGUuTWFudWFsOgorICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoQ0FMQ19NT0RFX1BBVEgsICJtYW51YWwiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKENBTENfTU9ERV9QQVRILCAiYXV0byIpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9mdWxsQ2FsY09uTG9hZFBhdGggPSAiZDpjYWxjUHIvQGZ1bGxDYWxjT25Mb2FkIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTaG91bGQgRXhjZWwgZG8gYSBmdWxsIGNhbGN1bGF0aW9uIGFmdGVyIHRoZSB3b3JrYm9vayBoYXMgYmVlbiBsb2FkZWQ/CisgIC8vLyA8cmVtYXJrcz5UaGlzIHByb3BlcnR5IGlzIGFsd2F5cyB0cnVlIGZvciBib3RoIG5ldyB3b3JrYm9va3MgYW5kIGxvYWRlZCB0ZW1wbGF0ZXMob24gbG9hZCkuIElmIHRoaXMgaXMgbm90IHRoZSB3YW50ZWQgYmVoYXZpb3Igc2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UuPC9yZW1hcmtzPgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBGdWxsQ2FsY09uTG9hZCB7CisgICAgZ2V0IHsgcmV0dXJuIEdldFhtbE5vZGVCb29sKF9mdWxsQ2FsY09uTG9hZFBhdGgpOyB9CisgICAgc2V0IHsgU2V0WG1sTm9kZUJvb2woX2Z1bGxDYWxjT25Mb2FkUGF0aCwgdmFsdWUpOyB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTYXZlcyB0aGUgd29ya2Jvb2sgYW5kIGFsbCBpdHMgY29tcG9uZW50cyB0byB0aGUgcGFja2FnZS4KKyAgLy8vIEZvciBpbnRlcm5hbCB1c2Ugb25seSEKKyAgLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgdm9pZCBTYXZlKCkgLy8gV29ya2Jvb2sgU2F2ZQorICB7CisgICAgaWYgKFdvcmtzaGVldHMuQ291bnQgPT0gMCkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSB3b3JrYm9vayBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHdvcmtzaGVldCIpOworICAgIH0KKworICAgIERlbGV0ZUNhbGNDaGFpbigpOworCisgICAgY29uc3Qgc3RyaW5nIHZiYVBhcnRVcmkgPSAiL3hsL3ZiYVByb2plY3QuYmluIjsKKyAgICBpZiAoIV9wYWNrYWdlLlBhY2thZ2UuUGFydEV4aXN0cyhuZXcodmJhUGFydFVyaSwgVXJpS2luZC5SZWxhdGl2ZSkpKSB7CisgICAgICBpZiAoUGFydC5Db250ZW50VHlwZSAhPSBFeGNlbFBhY2thZ2UuX2NvbnRlbnRUeXBlV29ya2Jvb2tEZWZhdWx0KSB7CisgICAgICAgIFBhcnQuQ29udGVudFR5cGUgPSBFeGNlbFBhY2thZ2UuX2NvbnRlbnRUeXBlV29ya2Jvb2tEZWZhdWx0OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoUGFydC5Db250ZW50VHlwZSAhPSBFeGNlbFBhY2thZ2UuX2NvbnRlbnRUeXBlV29ya2Jvb2tNYWNyb0VuYWJsZWQpIHsKKyAgICAgICAgUGFydC5Db250ZW50VHlwZSA9IEV4Y2VsUGFja2FnZS5fY29udGVudFR5cGVXb3JrYm9va01hY3JvRW5hYmxlZDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBVcGRhdGVEZWZpbmVkTmFtZXNYbWwoKTsKKworICAgIC8vIHNhdmUgdGhlIHdvcmtib29rCisgICAgaWYgKF93b3JrYm9va1htbCAhPSBudWxsKSB7CisgICAgICBfcGFja2FnZS5TYXZlUGFydChXb3JrYm9va1VyaSwgX3dvcmtib29rWG1sKTsKKyAgICB9CisKKyAgICAvLyBzYXZlIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB3b3JrYm9vaworICAgIGlmIChfcHJvcGVydGllcyAhPSBudWxsKSB7CisgICAgICBfcHJvcGVydGllcy5TYXZlKCk7CisgICAgfQorCisgICAgLy8gc2F2ZSB0aGUgc3R5bGUgc2hlZXQKKyAgICBTdHlsZXMuVXBkYXRlWG1sKCk7CisgICAgX3BhY2thZ2UuU2F2ZVBhcnQoU3R5bGVzVXJpLCBfc3R5bGVzWG1sKTsKKworICAgIC8vIHNhdmUgYWxsIHRoZSBvcGVuIHdvcmtzaGVldHMKKyAgICB2YXIgaXNQcm90ZWN0ZWQgPSBQcm90ZWN0aW9uLkxvY2tXaW5kb3dzIHx8IFByb3RlY3Rpb24uTG9ja1N0cnVjdHVyZTsKKyAgICBmb3JlYWNoIChFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQgaW4gV29ya3NoZWV0cykgeworICAgICAgaWYgKGlzUHJvdGVjdGVkICYmIFByb3RlY3Rpb24uTG9ja1dpbmRvd3MpIHsKKyAgICAgICAgd29ya3NoZWV0LlZpZXcuV2luZG93UHJvdGVjdGlvbiA9IHRydWU7CisgICAgICB9CisgICAgICB3b3Jrc2hlZXQuU2F2ZSgpOworICAgICAgd29ya3NoZWV0LlBhcnQuU2F2ZUhhbmRsZXIgPSB3b3Jrc2hlZXQuU2F2ZUhhbmRsZXI7CisgICAgfQorCisgICAgdmFyIHBhcnQgPSBfcGFja2FnZS5QYWNrYWdlLkNyZWF0ZVBhcnQoCisgICAgICAgIFNoYXJlZFN0cmluZ3NVcmksCisgICAgICAgIEV4Y2VsUGFja2FnZS5fY29udGVudFR5cGVTaGFyZWRTdHJpbmcsCisgICAgICAgIF9wYWNrYWdlLkNvbXByZXNzaW9uKTsKKyAgICBwYXJ0LlNhdmVIYW5kbGVyID0gU2F2ZVNoYXJlZFN0cmluZ0hhbmRsZXI7CisgICAgUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoCisgICAgICAgIFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShXb3JrYm9va1VyaSwgU2hhcmVkU3RyaW5nc1VyaSksCisgICAgICAgIFRhcmdldE1vZGUuSW50ZXJuYWwsCisgICAgICAgIEV4Y2VsUGFja2FnZS5fc2NoZW1hUmVsYXRpb25zaGlwcyArICIvc2hhcmVkU3RyaW5ncyIpOworICAgIC8vVXBkYXRlU2hhcmVkU3RyaW5nc1htbCgpOworCisgICAgLy8gRGF0YSB2YWxpZGF0aW9uCisgICAgVmFsaWRhdGVEYXRhVmFsaWRhdGlvbnMoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBEZWxldGVDYWxjQ2hhaW4oKSB7CisgICAgLy9SZW1vdmUgdGhlIGNhbGMgY2hhaW4gaWYgaXQgZXhpc3RzLgorICAgIFVyaSB1cmlDYWxjQ2hhaW4gPSBuZXcgVXJpKCIveGwvY2FsY0NoYWluLnhtbCIsIFVyaUtpbmQuUmVsYXRpdmUpOworICAgIGlmIChfcGFja2FnZS5QYWNrYWdlLlBhcnRFeGlzdHModXJpQ2FsY0NoYWluKSkgeworICAgICAgVXJpIGNhbGNDaGFpbiA9IG5ldyBVcmkoImNhbGNDaGFpbi54bWwiLCBVcmlLaW5kLlJlbGF0aXZlKTsKKyAgICAgIGZvcmVhY2ggKHZhciByZWxhdGlvbnNoaXAgaW4gX3BhY2thZ2UuV29ya2Jvb2suUGFydC5HZXRSZWxhdGlvbnNoaXBzKCkpIHsKKyAgICAgICAgaWYgKHJlbGF0aW9uc2hpcC5UYXJnZXRVcmkgPT0gY2FsY0NoYWluKSB7CisgICAgICAgICAgX3BhY2thZ2UuV29ya2Jvb2suUGFydC5EZWxldGVSZWxhdGlvbnNoaXAocmVsYXRpb25zaGlwLklkKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gZGVsZXRlIHRoZSBjYWxjQ2hhaW4gcGFydAorICAgICAgX3BhY2thZ2UuUGFja2FnZS5EZWxldGVQYXJ0KHVyaUNhbGNDaGFpbik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIFZhbGlkYXRlRGF0YVZhbGlkYXRpb25zKCkgeworICAgIGZvcmVhY2ggKHZhciBzaGVldCBpbiBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzKSB7CisgICAgICBpZiAoIShzaGVldCBpcyBFeGNlbENoYXJ0c2hlZXQpKSB7CisgICAgICAgIHNoZWV0LkRhdGFWYWxpZGF0aW9ucy5WYWxpZGF0ZUFsbCgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBTYXZlU2hhcmVkU3RyaW5nSGFuZGxlcihTdHJlYW1Xcml0ZXIgc3cpIHsKKyAgICB2YXIgY2FjaGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgKKyAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiID8+PHNzdCB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiIGNvdW50PVwiezB9XCIgdW5pcXVlQ291bnQ9XCJ7MH1cIj4iLAorICAgICAgICBfc2hhcmVkU3RyaW5ncy5Db3VudCk7CisgICAgZm9yZWFjaCAoc3RyaW5nIHQgaW4gX3NoYXJlZFN0cmluZ3MuS2V5cykgeworICAgICAgU2hhcmVkU3RyaW5nSXRlbSBzc2kgPSBfc2hhcmVkU3RyaW5nc1t0XTsKKyAgICAgIGlmIChzc2kuaXNSaWNoVGV4dCkgeworICAgICAgICBjYWNoZS5BcHBlbmQoIjxzaT4iKTsKKyAgICAgICAgQ29udmVydFV0aWwuRXhjZWxFbmNvZGVTdHJpbmcoY2FjaGUsIHQpOworICAgICAgICBjYWNoZS5BcHBlbmQoIjwvc2k+Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAodC5MZW5ndGggPiAwCisgICAgICAgICAgICAmJiAodFswXSA9PSAnICcKKyAgICAgICAgICAgICAgICAgICAgfHwgdFt0Lkxlbmd0aCAtIDFdID09ICcgJworICAgICAgICAgICAgICAgICAgICB8fCB0LkNvbnRhaW5zKCIgICIpCisgICAgICAgICAgICAgICAgICAgIHx8IHQuQ29udGFpbnMoIlx0IikKKyAgICAgICAgICAgICAgICAgICAgfHwgdC5Db250YWlucygiXG4iKQorICAgICAgICAgICAgICAgICAgICB8fCB0LkNvbnRhaW5zKAorICAgICAgICAgICAgICAgICAgICAgICAgIlxuIikpKSAvL0ZpeGVzIGlzc3VlIDE0ODQ5CisgICAgICAgIHsKKyAgICAgICAgICBjYWNoZS5BcHBlbmQoIjxzaT48dCB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiPiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNhY2hlLkFwcGVuZCgiPHNpPjx0PiIpOworICAgICAgICB9CisgICAgICAgIENvbnZlcnRVdGlsLkV4Y2VsRW5jb2RlU3RyaW5nKGNhY2hlLCBDb252ZXJ0VXRpbC5FeGNlbEVzY2FwZVN0cmluZyh0KSk7CisgICAgICAgIGNhY2hlLkFwcGVuZCgiPC90Pjwvc2k+Iik7CisgICAgICB9CisgICAgICBpZiAoY2FjaGUuTGVuZ3RoID4gMHg2MDAwMDApIHsKKyAgICAgICAgc3cuV3JpdGUoY2FjaGUuVG9TdHJpbmcoKSk7CisgICAgICAgIGNhY2hlID0gbmV3KCk7CisgICAgICB9CisgICAgfQorICAgIGNhY2hlLkFwcGVuZCgiPC9zc3Q+Iik7CisgICAgc3cuV3JpdGUoY2FjaGUuVG9TdHJpbmcoKSk7CisgICAgc3cuRmx1c2goKTsKKyAgICBQYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcCgKKyAgICAgICAgVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKFdvcmtib29rVXJpLCBTaGFyZWRTdHJpbmdzVXJpKSwKKyAgICAgICAgVGFyZ2V0TW9kZS5JbnRlcm5hbCwKKyAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9zaGFyZWRTdHJpbmdzIik7CisgIH0KKworICBwcml2YXRlIHZvaWQgVXBkYXRlRGVmaW5lZE5hbWVzWG1sKCkgeworICAgIHRyeSB7CisgICAgICBYbWxOb2RlIHRvcCA9IFdvcmtib29rWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpkZWZpbmVkTmFtZXMiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgIGlmICghRXhpc3RzTmFtZXMoKSkgeworICAgICAgICBpZiAodG9wICE9IG51bGwpIHsKKyAgICAgICAgICBUb3BOb2RlLlJlbW92ZUNoaWxkKHRvcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKHRvcCA9PSBudWxsKSB7CisgICAgICAgIENyZWF0ZU5vZGUoImQ6ZGVmaW5lZE5hbWVzIik7CisgICAgICAgIHRvcCA9IFdvcmtib29rWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpkZWZpbmVkTmFtZXMiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRvcC5SZW1vdmVBbGwoKTsKKyAgICAgIH0KKyAgICAgIGZvcmVhY2ggKEV4Y2VsTmFtZWRSYW5nZSBuYW1lIGluIF9uYW1lcykgeworICAgICAgICBYbWxFbGVtZW50IGVsZW0gPSBXb3JrYm9va1htbC5DcmVhdGVFbGVtZW50KCJkZWZpbmVkTmFtZSIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgICAgIHRvcC5BcHBlbmRDaGlsZChlbGVtKTsKKyAgICAgICAgZWxlbS5TZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lLk5hbWUpOworICAgICAgICBpZiAobmFtZS5Jc05hbWVIaWRkZW4pIHsKKyAgICAgICAgICBlbGVtLlNldEF0dHJpYnV0ZSgiaGlkZGVuIiwgIjEiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KG5hbWUuTmFtZUNvbW1lbnQpKSB7CisgICAgICAgICAgZWxlbS5TZXRBdHRyaWJ1dGUoImNvbW1lbnQiLCBuYW1lLk5hbWVDb21tZW50KTsKKyAgICAgICAgfQorICAgICAgICBTZXROYW1lRWxlbWVudChuYW1lLCBlbGVtKTsKKyAgICAgIH0KKyAgICAgIGZvcmVhY2ggKEV4Y2VsV29ya3NoZWV0IHdzIGluIF93b3Jrc2hlZXRzKSB7CisgICAgICAgIGlmICghKHdzIGlzIEV4Y2VsQ2hhcnRzaGVldCkpIHsKKyAgICAgICAgICBmb3JlYWNoIChFeGNlbE5hbWVkUmFuZ2UgbmFtZSBpbiB3cy5OYW1lcykgeworICAgICAgICAgICAgWG1sRWxlbWVudCBlbGVtID0gV29ya2Jvb2tYbWwuQ3JlYXRlRWxlbWVudCgiZGVmaW5lZE5hbWUiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgICAgICAgdG9wLkFwcGVuZENoaWxkKGVsZW0pOworICAgICAgICAgICAgZWxlbS5TZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lLk5hbWUpOworICAgICAgICAgICAgZWxlbS5TZXRBdHRyaWJ1dGUoImxvY2FsU2hlZXRJZCIsIG5hbWUuTG9jYWxTaGVldElkLlRvU3RyaW5nKCkpOworICAgICAgICAgICAgaWYgKG5hbWUuSXNOYW1lSGlkZGVuKSB7CisgICAgICAgICAgICAgIGVsZW0uU2V0QXR0cmlidXRlKCJoaWRkZW4iLCAiMSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShuYW1lLk5hbWVDb21tZW50KSkgeworICAgICAgICAgICAgICBlbGVtLlNldEF0dHJpYnV0ZSgiY29tbWVudCIsIG5hbWUuTmFtZUNvbW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2V0TmFtZUVsZW1lbnQobmFtZSwgZWxlbSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICB0aHJvdyBuZXcoIkludGVybmFsIGVycm9yIHVwZGF0aW5nIG5hbWVkIHJhbmdlcyAiLCBleCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIFNldE5hbWVFbGVtZW50KEV4Y2VsTmFtZWRSYW5nZSBuYW1lLCBYbWxFbGVtZW50IGVsZW0pIHsKKyAgICBpZiAobmFtZS5Jc05hbWUpIHsKKyAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShuYW1lLk5hbWVGb3JtdWxhKSkgeworICAgICAgICBpZiAoKG5hbWUuTmFtZVZhbHVlLkdldFR5cGUoKS5Jc1ByaW1pdGl2ZQorICAgICAgICAgICAgICAgICAgICB8fCBuYW1lLk5hbWVWYWx1ZSBpcyBkb3VibGUKKyAgICAgICAgICAgICAgICAgICAgfHwgbmFtZS5OYW1lVmFsdWUgaXMgZGVjaW1hbCkpIHsKKyAgICAgICAgICBlbGVtLklubmVyVGV4dCA9IENvbnZlcnQKKyAgICAgICAgICAgICAgLlRvRG91YmxlKG5hbWUuTmFtZVZhbHVlLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKQorICAgICAgICAgICAgICAuVG9TdHJpbmcoIlIxNSIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICB9IGVsc2UgaWYgKG5hbWUuTmFtZVZhbHVlIGlzIERhdGVUaW1lKSB7CisgICAgICAgICAgZWxlbS5Jbm5lclRleHQgPQorICAgICAgICAgICAgICAoKERhdGVUaW1lKW5hbWUuTmFtZVZhbHVlKS5Ub09BRGF0ZSgpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGVsZW0uSW5uZXJUZXh0ID0gIlwiIiArIG5hbWUuTmFtZVZhbHVlICsgIlwiIjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZWxlbS5Jbm5lclRleHQgPSBuYW1lLk5hbWVGb3JtdWxhOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBlbGVtLklubmVyVGV4dCA9IG5hbWUuRnVsbEFkZHJlc3NBYnNvbHV0ZTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJcyB0aGVpciBhbnkgbmFtZXMgaW4gdGhlIHdvcmtib29rIG9yIGluIHRoZSBzaGVldHMuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz4/PC9yZXR1cm5zPgorICBwcml2YXRlIGJvb2wgRXhpc3RzTmFtZXMoKSB7CisgICAgaWYgKF9uYW1lcy5Db3VudCA9PSAwKSB7CisgICAgICBmb3JlYWNoIChFeGNlbFdvcmtzaGVldCB3cyBpbiBXb3Jrc2hlZXRzKSB7CisgICAgICAgIGlmICh3cyBpcyBFeGNlbENoYXJ0c2hlZXQpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAod3MuTmFtZXMuQ291bnQgPiAwKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGludGVybmFsIGJvb2wgRXhpc3RzVGFibGVOYW1lKHN0cmluZyBuYW1lKSB7CisgICAgZm9yZWFjaCAodmFyIHdzIGluIFdvcmtzaGVldHMpIHsKKyAgICAgIGlmICh3cy5UYWJsZXMuX3RhYmxlTmFtZXMuQ29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGludGVybmFsIGJvb2wgRXhpc3RzUGl2b3RUYWJsZU5hbWUoc3RyaW5nIG5hbWUpIHsKKyAgICBmb3JlYWNoICh2YXIgd3MgaW4gV29ya3NoZWV0cykgeworICAgICAgaWYgKHdzLlBpdm90VGFibGVzLl9waXZvdFRhYmxlTmFtZXMuQ29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGludGVybmFsIHZvaWQgQWRkUGl2b3RUYWJsZShzdHJpbmcgY2FjaGVJZCwgVXJpIGRlZlVyaSkgeworICAgIENyZWF0ZU5vZGUoImQ6cGl2b3RDYWNoZXMiKTsKKworICAgIFhtbEVsZW1lbnQgaXRlbSA9IFdvcmtib29rWG1sLkNyZWF0ZUVsZW1lbnQoInBpdm90Q2FjaGUiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgIGl0ZW0uU2V0QXR0cmlidXRlKCJjYWNoZUlkIiwgY2FjaGVJZCk7CisgICAgdmFyIHJlbCA9IFBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKAorICAgICAgICBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkoV29ya2Jvb2tVcmksIGRlZlVyaSksCisgICAgICAgIFRhcmdldE1vZGUuSW50ZXJuYWwsCisgICAgICAgIEV4Y2VsUGFja2FnZS5fc2NoZW1hUmVsYXRpb25zaGlwcyArICIvcGl2b3RDYWNoZURlZmluaXRpb24iKTsKKyAgICBpdGVtLlNldEF0dHJpYnV0ZSgiaWQiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYVJlbGF0aW9uc2hpcHMsIHJlbC5JZCk7CisKKyAgICB2YXIgcGl2b3RDYWNoZXMgPSBXb3JrYm9va1htbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6cGl2b3RDYWNoZXMiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBwaXZvdENhY2hlcy5BcHBlbmRDaGlsZChpdGVtKTsKKyAgfQorCisgIGludGVybmFsIExpc3Q8c3RyaW5nPiBfZXh0ZXJuYWxSZWZlcmVuY2VzID0gbmV3KCk7CisKKyAgLy9pbnRlcm5hbCBib29sIF9pc0NhbGN1bGF0ZWQ9ZmFsc2U7CisgIGludGVybmFsIHZvaWQgR2V0RXh0ZXJuYWxSZWZlcmVuY2VzKCkgeworICAgIFhtbE5vZGVMaXN0IG5sID0gV29ya2Jvb2tYbWwuU2VsZWN0Tm9kZXMoCisgICAgICAgICIvL2Q6ZXh0ZXJuYWxSZWZlcmVuY2VzL2Q6ZXh0ZXJuYWxSZWZlcmVuY2UiLAorICAgICAgICBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBpZiAobmwgIT0gbnVsbCkgeworICAgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBlbGVtIGluIG5sKSB7CisgICAgICAgIHN0cmluZyBySWQgPSBlbGVtLkdldEF0dHJpYnV0ZSgicjppZCIpOworICAgICAgICB2YXIgcmVsID0gUGFydC5HZXRSZWxhdGlvbnNoaXAocklkKTsKKyAgICAgICAgdmFyIHBhcnQgPSBfcGFja2FnZS5QYWNrYWdlLkdldFBhcnQoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKHJlbC5Tb3VyY2VVcmksIHJlbC5UYXJnZXRVcmkpKTsKKyAgICAgICAgWG1sRG9jdW1lbnQgeG1sRXh0UmVmID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgICAgIExvYWRYbWxTYWZlKHhtbEV4dFJlZiwgcGFydC5HZXRTdHJlYW0oKSk7CisKKyAgICAgICAgWG1sRWxlbWVudCBib29rID0KKyAgICAgICAgICAgIHhtbEV4dFJlZi5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6ZXh0ZXJuYWxCb29rIiwgTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKyAgICAgICAgaWYgKGJvb2sgIT0gbnVsbCkgeworICAgICAgICAgIHN0cmluZyBySWRFeHRSZWYgPSBib29rLkdldEF0dHJpYnV0ZSgicjppZCIpOworICAgICAgICAgIHZhciByZWxFeHRSZWYgPSBwYXJ0LkdldFJlbGF0aW9uc2hpcChySWRFeHRSZWYpOworICAgICAgICAgIGlmIChyZWxFeHRSZWYgIT0gbnVsbCkgeworICAgICAgICAgICAgX2V4dGVybmFsUmVmZXJlbmNlcy5BZGQocmVsRXh0UmVmLlRhcmdldFVyaS5PcmlnaW5hbFN0cmluZyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgdm9pZCBSZWFkQWxsVGFibGVzKCkgeworICAgIGlmIChfbmV4dFRhYmxlSUQgPiAwKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIF9uZXh0VGFibGVJRCA9IDE7CisgICAgX25leHRQaXZvdFRhYmxlSUQgPSAxOworICAgIGZvcmVhY2ggKHZhciB3cyBpbiBXb3Jrc2hlZXRzKSB7CisgICAgICBpZiAoISh3cworICAgICAgICAgICAgICAgICAgaXMgRXhjZWxDaGFydHNoZWV0KSkgLy9GaXhlcyAxNTI3My4gQ2hhcnRzaGVldHMgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgICB7CisgICAgICAgIGZvcmVhY2ggKHZhciB0YmwgaW4gd3MuVGFibGVzKSB7CisgICAgICAgICAgaWYgKHRibC5JZCA+PSBfbmV4dFRhYmxlSUQpIHsKKyAgICAgICAgICAgIF9uZXh0VGFibGVJRCA9IHRibC5JZCArIDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvcmVhY2ggKHZhciBwdCBpbiB3cy5QaXZvdFRhYmxlcykgeworICAgICAgICAgIGlmIChwdC5DYWNoZUlEID49IF9uZXh0UGl2b3RUYWJsZUlEKSB7CisgICAgICAgICAgICBfbmV4dFBpdm90VGFibGVJRCA9IHB0LkNhY2hlSUQgKyAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0V4Y2VsV29ya2Jvb2tWaWV3LmNzIGIvRVBQbHVzL0V4Y2VsV29ya2Jvb2tWaWV3LmNzCmluZGV4IDY5YTE3NDkuLjY3NzI5MzYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9FeGNlbFdvcmtib29rVmlldy5jcworKysgYi9FUFBsdXMvRXhjZWxXb3JrYm9va1ZpZXcuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDIwMCArMTMsMTQ4IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgIDIwMTEtMTEtMDIKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uWG1sOwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFjY2VzcyB0byB3b3JrYm9vayB2aWV3IHByb3BlcnRpZXMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFdvcmtib29rVmlldyA6IFhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgI3JlZ2lvbiBFeGNlbFdvcmtzaGVldFZpZXcgQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyBFeGNlbFdvcmtib29rVmlldyB3aGljaCBwcm92aWRlcyBhY2Nlc3MgdG8gYWxsIHRoZSAKLSAgICAgICAgLy8vIHZpZXcgc3RhdGVzIG9mIHRoZSB3b3Jrc2hlZXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnMiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3YiI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxXb3JrYm9va1ZpZXcoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSBub2RlLCBFeGNlbFdvcmtib29rIHdiKSA6Ci0gICAgICAgICAgICBiYXNlKG5zLCBub2RlKQotCQl7Ci0gICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSB3Yi5TY2hlbWFOb2RlT3JkZXI7Ci0JCX0KLQkJI2VuZHJlZ2lvbgotICAgICAgICBjb25zdCBzdHJpbmcgTEVGVF9QQVRIPSJkOmJvb2tWaWV3cy9kOndvcmtib29rVmlldy9AeFdpbmRvdyI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBvc2l0aW9uIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgd29ya2Jvb2sgd2luZG93LiBJbiB0d2lwcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBMZWZ0Ci0gICAgICAgIHsgCi0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChMRUZUX1BBVEgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWwgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhMRUZUX1BBVEgsdmFsdWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIFRPUF9QQVRIPSJkOmJvb2tWaWV3cy9kOndvcmtib29rVmlldy9AeVdpbmRvdyI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBvc2l0aW9uIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgd29ya2Jvb2sgd2luZG93LiBJbiB0d2lwcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBUb3AKLSAgICAgICAgeyAKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KFRPUF9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVE9QX1BBVEgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBXSURUSF9QQVRIPSJkOmJvb2tWaWV3cy9kOndvcmtib29rVmlldy9Ad2luZG93V2lkdGgiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXaWR0aCBvZiB0aGUgd29ya2Jvb2sgd2luZG93LiBJbiB0d2lwcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBXaWR0aAotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoV0lEVEhfUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFdJRFRIX1BBVEgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBIRUlHSFRfUEFUSD0iZDpib29rVmlld3MvZDp3b3JrYm9va1ZpZXcvQHdpbmRvd0hlaWdodCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEhlaWdodCBvZiB0aGUgd29ya2Jvb2sgd2luZG93LiBJbiB0d2lwcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBIZWlnaHQKLSAgICAgICAgeyAKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KEhFSUdIVF9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoSEVJR0hUX1BBVEgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBNSU5JTUlaRURfUEFUSD0iZDpib29rVmlld3MvZDp3b3JrYm9va1ZpZXcvQG1pbmltaXplZCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRydWUgdGhlIHRoZSB3b3JrYm9vayB3aW5kb3cgaXMgbWluaW1pemVkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBNaW5pbWl6ZWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKE1JTklNSVpFRF9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoTUlOSU1JWkVEX1BBVEgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBTSE9XVkVSVElDQUxTQ1JPTExfUEFUSCA9ICJkOmJvb2tWaWV3cy9kOndvcmtib29rVmlldy9Ac2hvd1ZlcnRpY2FsU2Nyb2xsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2hvdyB0aGUgdmVydGljYWwgc2Nyb2xsYmFyCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFNob3dWZXJ0aWNhbFNjcm9sbEJhcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woU0hPV1ZFUlRJQ0FMU0NST0xMX1BBVEgsdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChTSE9XVkVSVElDQUxTQ1JPTExfUEFUSCwgdmFsdWUsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBTSE9XSE9SSVpPTlRBTFNDUl9QQVRIID0gImQ6Ym9va1ZpZXdzL2Q6d29ya2Jvb2tWaWV3L0BzaG93SG9yaXpvbnRhbFNjcm9sbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNob3cgdGhlIGhvcml6b250YWwgc2Nyb2xsYmFyCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFNob3dIb3Jpem9udGFsU2Nyb2xsQmFyCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChTSE9XSE9SSVpPTlRBTFNDUl9QQVRILCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKFNIT1dIT1JJWk9OVEFMU0NSX1BBVEgsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgU0hPV1NIRUVUVEFCU19QQVRIID0gImQ6Ym9va1ZpZXdzL2Q6d29ya2Jvb2tWaWV3L0BzaG93U2hlZXRUYWJzIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2hvdyB0aGUgc2hlZXQgdGFicwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93U2hlZXRUYWJzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChTSE9XU0hFRVRUQUJTX1BBVEgsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woU0hPV1NIRUVUVEFCU19QQVRILCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2V0IHRoZSB3aW5kb3cgcG9zaXRpb24gaW4gdHdpcHMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZWZ0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRvcCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3aWR0aCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJoZWlnaHQiPjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFNldFdpbmRvd1NpemUoaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCkKLSAgICAgICAgewotICAgICAgICAgICAgTGVmdCA9IGxlZnQ7Ci0gICAgICAgICAgICBUb3AgPSB0b3A7Ci0gICAgICAgICAgICBXaWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgSGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICB9CiAKLSAgICAgICAgY29uc3Qgc3RyaW5nIEFDVElWRVRBQl9QQVRIID0gImQ6Ym9va1ZpZXdzL2Q6d29ya2Jvb2tWaWV3L0BhY3RpdmVUYWIiOwotICAgICAgICBwdWJsaWMgaW50IEFjdGl2ZVRhYiAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHY9R2V0WG1sTm9kZUludChBQ1RJVkVUQUJfUEFUSCk7Ci0gICAgICAgICAgICAgICAgaWYgKHYgPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2OworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWw7CiAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoQUNUSVZFVEFCX1BBVEgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIEFjY2VzcyB0byB3b3JrYm9vayB2aWV3IHByb3BlcnRpZXMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxXb3JrYm9va1ZpZXcgOiBYbWxIZWxwZXIgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDcmVhdGVzIGEgbmV3IEV4Y2VsV29ya2Jvb2tWaWV3IHdoaWNoIHByb3ZpZGVzIGFjY2VzcyB0byBhbGwgdGhlCisgIC8vLyB2aWV3IHN0YXRlcyBvZiB0aGUgd29ya3NoZWV0LgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Im5zIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id2IiPjwvcGFyYW0+CisgIGludGVybmFsIEV4Y2VsV29ya2Jvb2tWaWV3KFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgbm9kZSwgRXhjZWxXb3JrYm9vayB3YikKKyAgICAgIDogYmFzZShucywgbm9kZSkgeworICAgIFNjaGVtYU5vZGVPcmRlciA9IHdiLlNjaGVtYU5vZGVPcmRlcjsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9sZWZ0UGF0aCA9ICJkOmJvb2tWaWV3cy9kOndvcmtib29rVmlldy9AeFdpbmRvdyI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUG9zaXRpb24gb2YgdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSB3b3JrYm9vayB3aW5kb3cuIEluIHR3aXBzLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IExlZnQgeworICAgIGdldCA9PiBHZXRYbWxOb2RlSW50KF9sZWZ0UGF0aCk7CisgICAgaW50ZXJuYWwgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoX2xlZnRQYXRoLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF90b3BQYXRoID0gImQ6Ym9va1ZpZXdzL2Q6d29ya2Jvb2tWaWV3L0B5V2luZG93IjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQb3NpdGlvbiBvZiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIHdvcmtib29rIHdpbmRvdy4gSW4gdHdpcHMuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgVG9wIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUludChfdG9wUGF0aCk7CisgICAgaW50ZXJuYWwgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoX3RvcFBhdGgsIHZhbHVlLlRvU3RyaW5nKCkpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3dpZHRoUGF0aCA9ICJkOmJvb2tWaWV3cy9kOndvcmtib29rVmlldy9Ad2luZG93V2lkdGgiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFdpZHRoIG9mIHRoZSB3b3JrYm9vayB3aW5kb3cuIEluIHR3aXBzLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IFdpZHRoIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUludChfd2lkdGhQYXRoKTsKKyAgICBpbnRlcm5hbCBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZyhfd2lkdGhQYXRoLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9oZWlnaHRQYXRoID0gImQ6Ym9va1ZpZXdzL2Q6d29ya2Jvb2tWaWV3L0B3aW5kb3dIZWlnaHQiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEhlaWdodCBvZiB0aGUgd29ya2Jvb2sgd2luZG93LiBJbiB0d2lwcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBIZWlnaHQgeworICAgIGdldCA9PiBHZXRYbWxOb2RlSW50KF9oZWlnaHRQYXRoKTsKKyAgICBpbnRlcm5hbCBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZyhfaGVpZ2h0UGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfbWluaW1pemVkUGF0aCA9ICJkOmJvb2tWaWV3cy9kOndvcmtib29rVmlldy9AbWluaW1pemVkIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0cnVlIHRoZSB0aGUgd29ya2Jvb2sgd2luZG93IGlzIG1pbmltaXplZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgTWluaW1pemVkIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2woX21pbmltaXplZFBhdGgpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKF9taW5pbWl6ZWRQYXRoLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9zaG93dmVydGljYWxzY3JvbGxQYXRoID0gImQ6Ym9va1ZpZXdzL2Q6d29ya2Jvb2tWaWV3L0BzaG93VmVydGljYWxTY3JvbGwiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNob3cgdGhlIHZlcnRpY2FsIHNjcm9sbGJhcgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBTaG93VmVydGljYWxTY3JvbGxCYXIgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbChfc2hvd3ZlcnRpY2Fsc2Nyb2xsUGF0aCwgdHJ1ZSk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKF9zaG93dmVydGljYWxzY3JvbGxQYXRoLCB2YWx1ZSwgdHJ1ZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfc2hvd2hvcml6b250YWxzY3JQYXRoID0gImQ6Ym9va1ZpZXdzL2Q6d29ya2Jvb2tWaWV3L0BzaG93SG9yaXpvbnRhbFNjcm9sbCI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2hvdyB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgU2hvd0hvcml6b250YWxTY3JvbGxCYXIgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbChfc2hvd2hvcml6b250YWxzY3JQYXRoLCB0cnVlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX3Nob3dob3Jpem9udGFsc2NyUGF0aCwgdmFsdWUsIHRydWUpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3Nob3dzaGVldHRhYnNQYXRoID0gImQ6Ym9va1ZpZXdzL2Q6d29ya2Jvb2tWaWV3L0BzaG93U2hlZXRUYWJzIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTaG93IHRoZSBzaGVldCB0YWJzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIFNob3dTaGVldFRhYnMgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbChfc2hvd3NoZWV0dGFic1BhdGgsIHRydWUpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbChfc2hvd3NoZWV0dGFic1BhdGgsIHZhbHVlLCB0cnVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNldCB0aGUgd2luZG93IHBvc2l0aW9uIGluIHR3aXBzCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibGVmdCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0b3AiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0id2lkdGgiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaGVpZ2h0Ij48L3BhcmFtPgorICBwdWJsaWMgdm9pZCBTZXRXaW5kb3dTaXplKGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICBMZWZ0ID0gbGVmdDsKKyAgICBUb3AgPSB0b3A7CisgICAgV2lkdGggPSB3aWR0aDsKKyAgICBIZWlnaHQgPSBoZWlnaHQ7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYWN0aXZldGFiUGF0aCA9ICJkOmJvb2tWaWV3cy9kOndvcmtib29rVmlldy9AYWN0aXZlVGFiIjsKKworICBwdWJsaWMgaW50IEFjdGl2ZVRhYiB7CisgICAgZ2V0IHsKKyAgICAgIHZhciB2ID0gR2V0WG1sTm9kZUludChfYWN0aXZldGFiUGF0aCk7CisgICAgICBpZiAodiA8IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByZXR1cm4gdjsKICAgICB9CisgICAgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoX2FjdGl2ZXRhYlBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgfQogfQotICAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFdvcmtzaGVldC5jcyBiL0VQUGx1cy9FeGNlbFdvcmtzaGVldC5jcwppbmRleCBjMmJmNmU3Li4yNTc5YTdlIDEwMDY0NAotLS0gYS9FUFBsdXMvRXhjZWxXb3Jrc2hlZXQuY3MKKysrIGIvRVBQbHVzL0V4Y2VsV29ya3NoZWV0LmNzCkBAIC0xLDQxNDQgKzEsMzkxMyBAQAotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKLSAqCi0gKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgotICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQorKgorKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgorKiBTZWUgaHR0cDovL3d3dy5jb2RlcGxleC5jb20vRVBQbHVzIGZvciBkZXRhaWxzLgorKgorKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorKgorKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuCQkgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMTEtMTEtMDIKLSAqIEphbiBLw6RsbG1hbiAgICAgICAgICBUb3RhbCByZXdyaXRlICAgICAgICAgICAgICAgMjAxMC0wMy0wMQotICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCisqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKKyoKKyogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KKyoKKyogQ29kZSBjaGFuZ2Ugbm90ZXM6CisqCisqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCisqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiBKYW4gS8OkbGxtYW4JCSAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAxMS0xMS0wMgorKiBKYW4gS8OkbGxtYW4gICAgICAgICAgVG90YWwgcmV3cml0ZSAgICAgICAgICAgICAgIDIwMTAtMDMtMDEKKyogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5JTzsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uU2VjdXJpdHk7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKLXVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZTsKIHVzaW5nIFN5c3RlbS5Db21wb25lbnRNb2RlbDsKLXVzaW5nIFN5c3RlbS5JTy5Db21wcmVzc2lvbjsKK3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLklPOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5OwordXNpbmcgU3lzdGVtLlRleHQ7Cit1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Db25kaXRpb25hbEZvcm1hdHRpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5EYXRhVmFsaWRhdGlvbjsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZy5WbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKLSAgCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gV29ya3NoZWV0IGhpZGRlbiBlbnVtZXJhdGlvbgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZVdvcmtTaGVldEhpZGRlbgotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHdvcmtzaGVldCBpcyB2aXNpYmxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFZpc2libGUsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB3b3Jrc2hlZXQgaXMgaGlkZGVuIGJ1dCBjYW4gYmUgc2hvd24gYnkgdGhlIHVzZXIgdmlhIHRoZSB1c2VyIGludGVyZmFjZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBIaWRkZW4sCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB3b3Jrc2hlZXQgaXMgaGlkZGVuIGFuZCBjYW5ub3QgYmUgc2hvd24gYnkgdGhlIHVzZXIgdmlhIHRoZSB1c2VyIGludGVyZmFjZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBWZXJ5SGlkZGVuCit1c2luZyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5UYWJsZTsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZTsKK3VzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOworCisvLy8gPHN1bW1hcnk+CisvLy8gV29ya3NoZWV0IGhpZGRlbiBlbnVtZXJhdGlvbgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVXb3JrU2hlZXRIaWRkZW4geworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgd29ya3NoZWV0IGlzIHZpc2libGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgVmlzaWJsZSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgd29ya3NoZWV0IGlzIGhpZGRlbiBidXQgY2FuIGJlIHNob3duIGJ5IHRoZSB1c2VyIHZpYSB0aGUgdXNlciBpbnRlcmZhY2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgSGlkZGVuLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSB3b3Jrc2hlZXQgaXMgaGlkZGVuIGFuZCBjYW5ub3QgYmUgc2hvd24gYnkgdGhlIHVzZXIgdmlhIHRoZSB1c2VyIGludGVyZmFjZQorICAvLy8gPC9zdW1tYXJ5PgorICBWZXJ5SGlkZGVuLAorfQorCitbRmxhZ3NdCitpbnRlcm5hbCBlbnVtIENlbGxGbGFncyB7CisgIC8vTWVyZ2VkID0gMHgxLAorICBSaWNoVGV4dCA9IDB4MiwKKyAgU2hhcmVkRm9ybXVsYSA9IDB4NCwKKyAgQXJyYXlGb3JtdWxhID0gMHg4LAorfQorCisvLy8gPHN1bW1hcnk+CisvLy8gUmVwcmVzZW50cyBhbiBFeGNlbCBDaGFydHNoZWV0IGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gaXRzIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxDaGFydHNoZWV0IDogRXhjZWxXb3Jrc2hlZXQgeworICBwdWJsaWMgRXhjZWxDaGFydHNoZWV0KAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBucywKKyAgICAgIEV4Y2VsUGFja2FnZSBwY2ssCisgICAgICBzdHJpbmcgcmVsSWQsCisgICAgICBVcmkgdXJpV29ya3NoZWV0LAorICAgICAgc3RyaW5nIHNoZWV0TmFtZSwKKyAgICAgIGludCBzaGVldElkLAorICAgICAgaW50IHBvc2l0aW9uSWQsCisgICAgICBlV29ya1NoZWV0SGlkZGVuIGhpZGRlbikKKyAgICAgIDogYmFzZShucywgcGNrLCByZWxJZCwgdXJpV29ya3NoZWV0LCBzaGVldE5hbWUsIHNoZWV0SWQsIHBvc2l0aW9uSWQsIGhpZGRlbikge30KK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIFJlcHJlc2VudHMgYW4gRXhjZWwgd29ya3NoZWV0IGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gaXRzIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxXb3Jrc2hlZXQgOiBYbWxIZWxwZXIsIElFcXVhbGl0eUNvbXBhcmVyPEV4Y2VsV29ya3NoZWV0PiB7CisgIGludGVybmFsIGNsYXNzIEZvcm11bGFzIHsKKyAgICBwdWJsaWMgRm9ybXVsYXMoSVNvdXJjZUNvZGVUb2tlbml6ZXIgdG9rZW5pemVyKSB7CisgICAgICBfdG9rZW5pemVyID0gdG9rZW5pemVyOwogICAgIH0KLSAgICBbRmxhZ3NdCi0gICAgaW50ZXJuYWwgZW51bSBDZWxsRmxhZ3MKLSAgICB7Ci0gICAgICAgIC8vTWVyZ2VkID0gMHgxLAotICAgICAgICBSaWNoVGV4dCA9IDB4MiwKLSAgICAgICAgU2hhcmVkRm9ybXVsYSA9IDB4NCwKLSAgICAgICAgQXJyYXlGb3JtdWxhID0gMHg4CisKKyAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBSZW1vdmVEdW1teUZ1bmN0aW9uKHN0cmluZyBmb3JtdWxhKSB7CisgICAgICBjb25zdCBzdHJpbmcgZHVtbXlGdW5jdGlvbkNvbmNhdGVuYXRlID0gIlwiJlwiIjsKKyAgICAgIGNvbnN0IHN0cmluZyBkdW1teUZ1bmN0aW9uUHJlZml4ID0gIklGRVJST1IoX194bHVkZi5EVU1NWUZVTkNUSU9OKFwiIjsKKyAgICAgIGNvbnN0IHN0cmluZyBkdW1teUZ1bmN0aW9uU3VmZml4ID0gIlwiKSwiOworCisgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZm9ybXVsYSkpIHsKKyAgICAgICAgcmV0dXJuIGZvcm11bGE7CisgICAgICB9CisKKyAgICAgIC8vIExvb2sgZm9yIFByZWZpeAorICAgICAgaWYgKCFmb3JtdWxhLlN0YXJ0c1dpdGgoZHVtbXlGdW5jdGlvblByZWZpeCkpIHsKKyAgICAgICAgcmV0dXJuIGZvcm11bGE7CisgICAgICB9CisKKyAgICAgIC8vIExvb2sgZm9yIFN1ZmZpeAorICAgICAgaW50IGluZGV4ID0gZm9ybXVsYS5MYXN0SW5kZXhPZihkdW1teUZ1bmN0aW9uU3VmZml4KTsKKyAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIGZvcm11bGE7CisgICAgICB9CisKKyAgICAgIC8vIFRyaW0gU3VmZml4CisgICAgICBmb3JtdWxhID0gZm9ybXVsYS5TdWJzdHJpbmcoMCwgaW5kZXgpOworCisgICAgICAvLyBUcmltIFByZWZpeAorICAgICAgZm9ybXVsYSA9IGZvcm11bGEuUmVwbGFjZShkdW1teUZ1bmN0aW9uUHJlZml4LCAiIik7CisKKyAgICAgIC8vIFJlbW92ZSBzdHJpbmcgY29uY2F0ZW50YXRpb25zIGZyb20gbG9uZyBmb3JtdWxhcy4KKyAgICAgIC8vIEdvb2dsZSBicmVhayB0aGUgcXVvdGVkIHN0cmluZyBpbnRvIDI1NCBjaGFyYWN0ZXIgc2VnbWVudHMgd2hpY2ggYXJlIGNvbmNhdGVuYXRlZC4KKyAgICAgIGlmIChmb3JtdWxhLkxlbmd0aCA+PSAyNTQpIHsKKyAgICAgICAgZm9ybXVsYSA9IGZvcm11bGEuUmVwbGFjZShkdW1teUZ1bmN0aW9uQ29uY2F0ZW5hdGUsICIiKTsKKyAgICAgIH0KKworICAgICAgLy8gUmVwbGFjZSBkb3VibGVkIHF1b3RlcyB3aXRoIHNpbmdsZSBxdW90ZQorICAgICAgZm9ybXVsYSA9IGZvcm11bGEuUmVwbGFjZSgiXCJcIiIsICJcIiIpOworCisgICAgICAvLyBSZXR1cm4gZm9ybXVsYQorICAgICAgcmV0dXJuIGZvcm11bGE7CiAgICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUmVwcmVzZW50cyBhbiBFeGNlbCBDaGFydHNoZWV0IGFuZCBwcm92aWRlcyBhY2Nlc3MgdG8gaXRzIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbENoYXJ0c2hlZXQgOiBFeGNlbFdvcmtzaGVldAotICAgIHsKLSAgICAgICAgcHVibGljIEV4Y2VsQ2hhcnRzaGVldChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBFeGNlbFBhY2thZ2UgcGNrLCBzdHJpbmcgcmVsSUQsIFVyaSB1cmlXb3Jrc2hlZXQsIHN0cmluZyBzaGVldE5hbWUsIGludCBzaGVldElELCBpbnQgcG9zaXRpb25JRCwgZVdvcmtTaGVldEhpZGRlbiBoaWRkZW4pIDoKLSAgICAgICAgICAgIGJhc2UobnMsIHBjaywgcmVsSUQsIHVyaVdvcmtzaGVldCwgc2hlZXROYW1lLCBzaGVldElELCBwb3NpdGlvbklELCBoaWRkZW4pCi0gICAgICAgIHsKKworICAgIHByaXZhdGUgSVNvdXJjZUNvZGVUb2tlbml6ZXIgX3Rva2VuaXplcjsKKworICAgIGludGVybmFsIGludCBJbmRleCB7IGdldDsgc2V0OyB9CisKKyAgICBpbnRlcm5hbCBzdHJpbmcgQWRkcmVzcyB7IGdldDsgc2V0OyB9CisKKyAgICBpbnRlcm5hbCBib29sIElzQXJyYXkgeyBnZXQ7IHNldDsgfQorCisgICAgcHVibGljIHN0cmluZyBGb3JtdWxhIHsgZ2V0OyBzZXQ7IH0KKworICAgIHB1YmxpYyBpbnQgU3RhcnRSb3cgeyBnZXQ7IHNldDsgfQorCisgICAgcHVibGljIGludCBTdGFydENvbCB7IGdldDsgc2V0OyB9CisKKyAgICBwcml2YXRlIElFbnVtZXJhYmxlPFRva2VuPiBUb2tlbnMgeyBnZXQ7IHNldDsgfQorCisgICAgaW50ZXJuYWwgc3RyaW5nIEdldEZvcm11bGEoaW50IHJvdywgaW50IGNvbHVtbiwgc3RyaW5nIHdvcmtzaGVldCkgeworICAgICAgaWYgKChTdGFydFJvdyA9PSByb3cgJiYgU3RhcnRDb2wgPT0gY29sdW1uKSB8fCBJc0FycmF5KSB7CisgICAgICAgIHJldHVybiBSZW1vdmVEdW1teUZ1bmN0aW9uKEZvcm11bGEpOworICAgICAgfQorCisgICAgICBpZiAoVG9rZW5zID09IG51bGwpIHsKKyAgICAgICAgVG9rZW5zID0gX3Rva2VuaXplci5Ub2tlbml6ZShSZW1vdmVEdW1teUZ1bmN0aW9uKEZvcm11bGEpLCB3b3Jrc2hlZXQpOworICAgICAgfQorCisgICAgICBzdHJpbmcgZiA9ICIiOworICAgICAgZm9yZWFjaCAodmFyIHRva2VuIGluIFRva2VucykgeworICAgICAgICBpZiAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5FeGNlbEFkZHJlc3MpIHsKKyAgICAgICAgICB2YXIgYSA9IG5ldyBFeGNlbEZvcm11bGFBZGRyZXNzKHRva2VuLlZhbHVlKTsKKyAgICAgICAgICBmICs9IGEuR2V0T2Zmc2V0KHJvdyAtIFN0YXJ0Um93LCBjb2x1bW4gLSBTdGFydENvbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZiArPSB0b2tlbi5WYWx1ZTsKICAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIGY7CiAgICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLQkvLy8gUmVwcmVzZW50cyBhbiBFeGNlbCB3b3Jrc2hlZXQgYW5kIHByb3ZpZGVzIGFjY2VzcyB0byBpdHMgcHJvcGVydGllcyBhbmQgbWV0aG9kcwotCS8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsV29ya3NoZWV0IDogWG1sSGVscGVyLCBJRXF1YWxpdHlDb21wYXJlcjxFeGNlbFdvcmtzaGVldD4KLQl7Ci0gICAgICAgIGludGVybmFsIGNsYXNzIEZvcm11bGFzCisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb2xsZWN0aW9uIGNvbnRhaW5pbmcgbWVyZ2VkIGNlbGwgYWRkcmVzc2VzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBNZXJnZUNlbGxzQ29sbGVjdGlvbiA6IElFbnVtZXJhYmxlPHN0cmluZz4geworICAgIGludGVybmFsIE1lcmdlQ2VsbHNDb2xsZWN0aW9uKCkge30KKworICAgIGludGVybmFsIENlbGxTdG9yZTxpbnQ+IF9jZWxscyA9IG5ldygpOworICAgIHByaXZhdGUgTGlzdDxzdHJpbmc+IF9saXN0ID0gbmV3KCk7CisKKyAgICBpbnRlcm5hbCBMaXN0PHN0cmluZz4gTGlzdCA9PiBfbGlzdDsKKworICAgIHB1YmxpYyBzdHJpbmcgdGhpc1tpbnQgcm93LCBpbnQgY29sdW1uXSB7CisgICAgICBnZXQgeworICAgICAgICBpbnQgaXggPSAtMTsKKyAgICAgICAgaWYgKF9jZWxscy5FeGlzdHMocm93LCBjb2x1bW4sIHJlZiBpeCkKKyAgICAgICAgICAgICYmIGl4ID49IDAKKyAgICAgICAgICAgICYmIGl4CisgICAgICAgICAgICAgICAgPCBMaXN0LkNvdW50KSAvL0ZpeGVzIGlzc3VlIDE1MDc1CiAgICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBGb3JtdWxhcyhJU291cmNlQ29kZVRva2VuaXplciB0b2tlbml6ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3Rva2VuaXplciA9IHRva2VuaXplcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBzdHJpbmcgUmVtb3ZlRHVtbXlGdW5jdGlvbihzdHJpbmcgZm9ybXVsYSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcgRHVtbXlGdW5jdGlvbkNvbmNhdGVuYXRlID0gIlwiJlwiIjsKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcgRHVtbXlGdW5jdGlvblByZWZpeCA9ICJJRkVSUk9SKF9feGx1ZGYuRFVNTVlGVU5DVElPTihcIiI7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nIER1bW15RnVuY3Rpb25TdWZmaXggPSAiXCIpLCI7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZm9ybXVsYSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3JtdWxhOwotCi0gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgUHJlZml4Ci0gICAgICAgICAgICAgICAgaWYgKCFmb3JtdWxhLlN0YXJ0c1dpdGgoRHVtbXlGdW5jdGlvblByZWZpeCkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3JtdWxhOwotCi0gICAgICAgICAgICAgICAgLy8gTG9vayBmb3IgU3VmZml4Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZm9ybXVsYS5MYXN0SW5kZXhPZihEdW1teUZ1bmN0aW9uU3VmZml4KTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9ybXVsYTsKLQotICAgICAgICAgICAgICAgIC8vIFRyaW0gU3VmZml4Ci0gICAgICAgICAgICAgICAgZm9ybXVsYSA9IGZvcm11bGEuU3Vic3RyaW5nKDAsIGluZGV4KTsKLQotICAgICAgICAgICAgICAgIC8vIFRyaW0gUHJlZml4Ci0gICAgICAgICAgICAgICAgZm9ybXVsYSA9IGZvcm11bGEuUmVwbGFjZShEdW1teUZ1bmN0aW9uUHJlZml4LCAiIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZW1vdmUgc3RyaW5nIGNvbmNhdGVudGF0aW9ucyBmcm9tIGxvbmcgZm9ybXVsYXMuCi0gICAgICAgICAgICAgICAgLy8gR29vZ2xlIGJyZWFrIHRoZSBxdW90ZWQgc3RyaW5nIGludG8gMjU0IGNoYXJhY3RlciBzZWdtZW50cyB3aGljaCBhcmUgY29uY2F0ZW5hdGVkLgotICAgICAgICAgICAgICAgIGlmIChmb3JtdWxhLkxlbmd0aCA+PSAyNTQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3JtdWxhID0gZm9ybXVsYS5SZXBsYWNlKER1bW15RnVuY3Rpb25Db25jYXRlbmF0ZSwgIiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgZG91YmxlZCBxdW90ZXMgd2l0aCBzaW5nbGUgcXVvdGUKLSAgICAgICAgICAgICAgICBmb3JtdWxhID0gZm9ybXVsYS5SZXBsYWNlKCJcIlwiIiwgIlwiIik7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZXR1cm4gZm9ybXVsYQotICAgICAgICAgICAgICAgIHJldHVybiBmb3JtdWxhOwotICAgICAgICAgICAgfQotCQkJCi0gICAgICAgICAgIHByaXZhdGUgSVNvdXJjZUNvZGVUb2tlbml6ZXIgX3Rva2VuaXplcjsKLSAgICAgICAgICAgIGludGVybmFsIGludCBJbmRleCB7IGdldDsgc2V0OyB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzdHJpbmcgQWRkcmVzcyB7IGdldDsgc2V0OyB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBib29sIElzQXJyYXkgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgcHVibGljIHN0cmluZyBGb3JtdWxhIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgU3RhcnRSb3cgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgcHVibGljIGludCBTdGFydENvbCB7IGdldDsgc2V0OyB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgSUVudW1lcmFibGU8VG9rZW4+IFRva2VucyB7Z2V0OyBzZXQ7fQotICAgICAgICAgICAKLQotICAgICAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEdldEZvcm11bGEoaW50IHJvdywgaW50IGNvbHVtbiwgc3RyaW5nIHdvcmtzaGVldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoKFN0YXJ0Um93ID09IHJvdyAmJiBTdGFydENvbCA9PSBjb2x1bW4pIHx8IElzQXJyYXkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVtb3ZlRHVtbXlGdW5jdGlvbihGb3JtdWxhKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoVG9rZW5zID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUb2tlbnMgPSBfdG9rZW5pemVyLlRva2VuaXplKFJlbW92ZUR1bW15RnVuY3Rpb24oRm9ybXVsYSksIHdvcmtzaGVldCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHN0cmluZyBmID0gIiI7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRva2VuIGluIFRva2VucykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLkV4Y2VsQWRkcmVzcykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuZXcgRXhjZWxGb3JtdWxhQWRkcmVzcyh0b2tlbi5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmICs9IGEuR2V0T2Zmc2V0KHJvdyAtIFN0YXJ0Um93LCBjb2x1bW4gLSBTdGFydENvbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmICs9IHRva2VuLlZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmOwotICAgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBMaXN0W2l4XTsKICAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb2xsZWN0aW9uIGNvbnRhaW5pbmcgbWVyZ2VkIGNlbGwgYWRkcmVzc2VzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjbGFzcyBNZXJnZUNlbGxzQ29sbGVjdGlvbiA6IElFbnVtZXJhYmxlPHN0cmluZz4KLSAgICAgICAgewotICAgICAgICAgICAgaW50ZXJuYWwgTWVyZ2VDZWxsc0NvbGxlY3Rpb24oKQotICAgICAgICAgICAgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIENlbGxTdG9yZTxpbnQ+IF9jZWxscyA9IG5ldyBDZWxsU3RvcmU8aW50PigpOwotICAgICAgICAgICAgTGlzdDxzdHJpbmc+IF9saXN0ID0gbmV3IExpc3Q8c3RyaW5nPigpOwotICAgICAgICAgICAgaW50ZXJuYWwgTGlzdDxzdHJpbmc+IExpc3QgeyBnZXQge3JldHVybiBfbGlzdDt9IH0KLSAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgdGhpc1tpbnQgcm93LCBpbnQgY29sdW1uXQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGl4PS0xOwotICAgICAgICAgICAgICAgICAgICBpZiAoX2NlbGxzLkV4aXN0cyhyb3csIGNvbHVtbiwgcmVmIGl4KSAmJiBpeCA+PSAwICYmIGl4IDwgTGlzdC5Db3VudCkgIC8vRml4ZXMgaXNzdWUgMTUwNzUKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExpc3RbaXhdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgc3RyaW5nIHRoaXNbaW50IGluZGV4XQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9saXN0W2luZGV4XTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCB2b2lkIEFkZChFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MsIGJvb2wgZG9WYWxpZGF0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgaXg9MDsKKyAgICBwdWJsaWMgc3RyaW5nIHRoaXNbaW50IGluZGV4XSA9PiBfbGlzdFtpbmRleF07CiAKLSAgICAgICAgICAgICAgICAvL1ZhbGlkYXRlCi0gICAgICAgICAgICAgICAgaWYgKGRvVmFsaWRhdGUgJiYgVmFsaWRhdGUoYWRkcmVzcykgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IG1lcmdlIGFuZCBhbHJlYWR5IG1lcmdlZCByYW5nZSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbG9jayh0aGlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXggPSBfbGlzdC5Db3VudDsKLSAgICAgICAgICAgICAgICAgICAgX2xpc3QuQWRkKGFkZHJlc3MuQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIFNldEluZGV4KGFkZHJlc3MsIGl4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgaW50ZXJuYWwgdm9pZCBBZGQoRXhjZWxBZGRyZXNzQmFzZSBhZGRyZXNzLCBib29sIGRvVmFsaWRhdGUpIHsKKyAgICAgIGludCBpeCA9IDA7CiAKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbCBWYWxpZGF0ZShFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGl4PTA7Ci0gICAgICAgICAgICAgICAgaWYoX2NlbGxzLkV4aXN0cyhhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCByZWYgaXgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl4Pj0wICYmIGl4IDwgX2xpc3QuQ291bnQgJiYgX2xpc3RbaXhdIT1udWxsICYmIGFkZHJlc3MuQWRkcmVzcyA9PSBfbGlzdFtpeF0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50PihfY2VsbHMsIGFkZHJlc3MuX2Zyb21Sb3csIGFkZHJlc3MuX2Zyb21Db2wsIGFkZHJlc3MuX3RvUm93LCBhZGRyZXNzLl90b0NvbCk7Ci0gICAgICAgICAgICAgICAgLy9jZWxscwotICAgICAgICAgICAgICAgIHdoaWxlKGNzZS5OZXh0KCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vRW50aXJlIGNvbHVtbgotICAgICAgICAgICAgICAgIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxpbnQ+KF9jZWxscywgMCwgYWRkcmVzcy5fZnJvbUNvbCwgMCwgYWRkcmVzcy5fdG9Db2wpOwotICAgICAgICAgICAgICAgIHdoaWxlIChjc2UuTmV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL0VudGlyZSByb3cKLSAgICAgICAgICAgICAgICBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50PihfY2VsbHMsIGFkZHJlc3MuX2Zyb21Sb3csIDAsIGFkZHJlc3MuX3RvUm93LCAwKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoY3NlLk5leHQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9CisgICAgICAvL1ZhbGlkYXRlCisgICAgICBpZiAoZG9WYWxpZGF0ZSAmJiBWYWxpZGF0ZShhZGRyZXNzKSA9PSBmYWxzZSkgeworICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCBtZXJnZSBhbmQgYWxyZWFkeSBtZXJnZWQgcmFuZ2UiKSk7CisgICAgICB9CisgICAgICBsb2NrICh0aGlzKSB7CisgICAgICAgIGl4ID0gX2xpc3QuQ291bnQ7CisgICAgICAgIF9saXN0LkFkZChhZGRyZXNzLkFkZHJlc3MpOworICAgICAgICBTZXRJbmRleChhZGRyZXNzLCBpeCk7CisgICAgICB9CisgICAgfQogCi0gICAgICAgICAgICBpbnRlcm5hbCB2b2lkIFNldEluZGV4KEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcywgaW50IGl4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLl9mcm9tUm93ID09IDEgJiYgYWRkcmVzcy5fdG9Sb3cgPT0gRXhjZWxQYWNrYWdlLk1heFJvd3MpIC8vRW50aXJlIHJvdwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gYWRkcmVzcy5fZnJvbUNvbDsgY29sIDw9IGFkZHJlc3MuX3RvQ29sOyBjb2wrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX2NlbGxzLlNldFZhbHVlKDAsIGNvbCwgaXgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFkZHJlc3MuX2Zyb21Db2wgPT0gMSAmJiBhZGRyZXNzLl90b0NvbCA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgLy9FbnRpcmUgcm93Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSBhZGRyZXNzLl9mcm9tUm93OyByb3cgPD0gYWRkcmVzcy5fdG9Sb3c7IHJvdysrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfY2VsbHMuU2V0VmFsdWUocm93LCAwLCBpeCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sID0gYWRkcmVzcy5fZnJvbUNvbDsgY29sIDw9IGFkZHJlc3MuX3RvQ29sOyBjb2wrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gYWRkcmVzcy5fZnJvbVJvdzsgcm93IDw9IGFkZHJlc3MuX3RvUm93OyByb3crKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2VsbHMuU2V0VmFsdWUocm93LCBjb2wsIGl4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgQ291bnQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfbGlzdC5Db3VudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCB2b2lkIFJlbW92ZShzdHJpbmcgSXRlbSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfbGlzdC5SZW1vdmUoSXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlPHN0cmluZz4gTWVtYmVycwotCi0gICAgICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3I8c3RyaW5nPiBHZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgICAgICNyZWdpb24gSUVudW1lcmFibGUgTWVtYmVycwotCi0gICAgICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfbGlzdC5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgICAgIGludGVybmFsIHZvaWQgQ2xlYXIoRXhjZWxBZGRyZXNzQmFzZSBEZXN0aW5hdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPGludD4oX2NlbGxzLCBEZXN0aW5hdGlvbi5fZnJvbVJvdywgRGVzdGluYXRpb24uX2Zyb21Db2wsIERlc3RpbmF0aW9uLl90b1JvdywgRGVzdGluYXRpb24uX3RvQ29sKTsKLSAgICAgICAgICAgICAgICB2YXIgdXNlZD1uZXcgSGFzaFNldDxpbnQ+KCk7Ci0gICAgICAgICAgICAgICAgd2hpbGUoY3NlLk5leHQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciB2PWNzZS5WYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF1c2VkLkNvbnRhaW5zKHYpICYmIF9saXN0W3ZdIT1udWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRyPW5ldyBFeGNlbEFkZHJlc3NCYXNlKF9saXN0W3ZdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKERlc3RpbmF0aW9uLkNvbGxpZGUoYWRyKSA9PSBFeGNlbEFkZHJlc3NCYXNlLmVBZGRyZXNzQ29sbGl0aW9uLkluc2lkZSB8fCBEZXN0aW5hdGlvbi5Db2xsaWRlKGFkcik9PUV4Y2VsQWRkcmVzc0Jhc2UuZUFkZHJlc3NDb2xsaXRpb24uRXF1YWwpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93KG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIkNhbid0IGRlbGV0ZSBtZXJnZWQgY2VsbHMuIEEgcmFuZ2UgaXMgcGFydGx5IG1lcmdlZCB3aXRoIHRoZSBkZWxldGVkIHJhbmdlLiB7MH0iLCBhZHIuX2FkZHJlc3MpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2VkLkFkZCh2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIF9jZWxscy5DbGVhcihEZXN0aW5hdGlvbi5fZnJvbVJvdywgRGVzdGluYXRpb24uX2Zyb21Db2wsIERlc3RpbmF0aW9uLl90b1JvdyAtIERlc3RpbmF0aW9uLl9mcm9tUm93ICsgMSwgRGVzdGluYXRpb24uX3RvQ29sIC0gRGVzdGluYXRpb24uX2Zyb21Db2wgKyAxKTsKLSAgICAgICAgICAgICAgICBmb3JlYWNoKHZhciBpIGluIHVzZWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbGlzdFtpXSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIHByaXZhdGUgYm9vbCBWYWxpZGF0ZShFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MpIHsKKyAgICAgIGludCBpeCA9IDA7CisgICAgICBpZiAoX2NlbGxzLkV4aXN0cyhhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCByZWYgaXgpKSB7CisgICAgICAgIGlmIChpeCA+PSAwICYmIGl4IDwgX2xpc3QuQ291bnQgJiYgX2xpc3RbaXhdICE9IG51bGwgJiYgYWRkcmVzcy5BZGRyZXNzID09IF9saXN0W2l4XSkgeworICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIENlbGxTdG9yZTxvYmplY3Q+IF92YWx1ZXM7Ci0gICAgICAgIGludGVybmFsIENlbGxTdG9yZTxzdHJpbmc+IF90eXBlczsKLSAgICAgICAgaW50ZXJuYWwgQ2VsbFN0b3JlPGludD4gX3N0eWxlczsKLSAgICAgICAgaW50ZXJuYWwgQ2VsbFN0b3JlPG9iamVjdD4gX2Zvcm11bGFzOwotICAgICAgICBpbnRlcm5hbCBGbGFnQ2VsbFN0b3JlIF9mbGFnczsKLSAgICAgICAgaW50ZXJuYWwgQ2VsbFN0b3JlPExpc3Q8VG9rZW4+PiBfZm9ybXVsYVRva2VuczsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQogCi0gICAgICAgIGludGVybmFsIENlbGxTdG9yZTxVcmk+IF9oeXBlckxpbmtzOwotICAgICAgICBpbnRlcm5hbCBDZWxsU3RvcmU8RXhjZWxDb21tZW50PiBfY29tbWVudHNTdG9yZTsKKyAgICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50PigKKyAgICAgICAgICBfY2VsbHMsCisgICAgICAgICAgYWRkcmVzcy5fZnJvbVJvdywKKyAgICAgICAgICBhZGRyZXNzLl9mcm9tQ29sLAorICAgICAgICAgIGFkZHJlc3MuX3RvUm93LAorICAgICAgICAgIGFkZHJlc3MuX3RvQ29sKTsKKyAgICAgIC8vY2VsbHMKKyAgICAgIHdoaWxlIChjc2UuTmV4dCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIC8vRW50aXJlIGNvbHVtbgorICAgICAgY3NlID0gbmV3KF9jZWxscywgMCwgYWRkcmVzcy5fZnJvbUNvbCwgMCwgYWRkcmVzcy5fdG9Db2wpOworICAgICAgd2hpbGUgKGNzZS5OZXh0KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLy9FbnRpcmUgcm93CisgICAgICBjc2UgPSBuZXcoX2NlbGxzLCBhZGRyZXNzLl9mcm9tUm93LCAwLCBhZGRyZXNzLl90b1JvdywgMCk7CisgICAgICB3aGlsZSAoY3NlLk5leHQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAKLSAgICAgICAgaW50ZXJuYWwgRGljdGlvbmFyeTxpbnQsIEZvcm11bGFzPiBfc2hhcmVkRm9ybXVsYXMgPSBuZXcgRGljdGlvbmFyeTxpbnQsIEZvcm11bGFzPigpOwotICAgICAgICBpbnRlcm5hbCBpbnQgX21pbkNvbCA9IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zOwotICAgICAgICBpbnRlcm5hbCBpbnQgX21heENvbCA9IDA7Ci0gICAgICAgICNyZWdpb24gV29ya3NoZWV0IFByaXZhdGUgUHJvcGVydGllcwotICAgICAgICBpbnRlcm5hbCBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7Ci0JCXByaXZhdGUgVXJpIF93b3Jrc2hlZXRVcmk7Ci0JCXByaXZhdGUgc3RyaW5nIF9uYW1lOwotCQlwcml2YXRlIGludCBfc2hlZXRJRDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgX3Bvc2l0aW9uSUQ7Ci0JCXByaXZhdGUgc3RyaW5nIF9yZWxhdGlvbnNoaXBJRDsKLQkJcHJpdmF0ZSBYbWxEb2N1bWVudCBfd29ya3NoZWV0WG1sOwotICAgICAgICBpbnRlcm5hbCBFeGNlbFdvcmtzaGVldFZpZXcgX3NoZWV0VmlldzsKLQkJaW50ZXJuYWwgRXhjZWxIZWFkZXJGb290ZXIgX2hlYWRlckZvb3RlcjsKLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAjcmVnaW9uIEV4Y2VsV29ya3NoZWV0IENvbnN0cnVjdG9yCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgd29ya3NoZWV0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnMiPk5hbWVzcGFjZW1hbmFnZXI8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImV4Y2VsUGFja2FnZSI+UGFja2FnZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVsSUQiPlJlbGF0aW9uc2hpcCBJRDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXJpV29ya3NoZWV0Ij5VUkk8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNoZWV0TmFtZSI+TmFtZSBvZiB0aGUgc2hlZXQ8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNoZWV0SUQiPlNoZWV0IGlkPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwb3NpdGlvbklEIj5Qb3NpdGlvbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaGlkZSI+aGlkZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFdvcmtzaGVldChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBFeGNlbFBhY2thZ2UgZXhjZWxQYWNrYWdlLCBzdHJpbmcgcmVsSUQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXJpIHVyaVdvcmtzaGVldCwgc3RyaW5nIHNoZWV0TmFtZSwgaW50IHNoZWV0SUQsIGludCBwb3NpdGlvbklELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVdvcmtTaGVldEhpZGRlbiBoaWRlKSA6Ci0gICAgICAgICAgICBiYXNlKG5zLCBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAic2hlZXRQciIsICJ0YWJDb2xvciIsICJvdXRsaW5lUHIiLCAicGFnZVNldFVwUHIiLCAiZGltZW5zaW9uIiwgInNoZWV0Vmlld3MiLCAic2hlZXRGb3JtYXRQciIsICJjb2xzIiwgInNoZWV0RGF0YSIsICJzaGVldFByb3RlY3Rpb24iLCAicHJvdGVjdGVkUmFuZ2VzIiwic2NlbmFyaW9zIiwgImF1dG9GaWx0ZXIiLCAic29ydFN0YXRlIiwgImRhdGFDb25zb2xpZGF0ZSIsICJjdXN0b21TaGVldFZpZXdzIiwgImN1c3RvbVNoZWV0Vmlld3MiLCAibWVyZ2VDZWxscyIsICJwaG9uZXRpY1ByIiwgImNvbmRpdGlvbmFsRm9ybWF0dGluZyIsICJkYXRhVmFsaWRhdGlvbnMiLCAiaHlwZXJsaW5rcyIsICJwcmludE9wdGlvbnMiLCAicGFnZU1hcmdpbnMiLCAicGFnZVNldHVwIiwgImhlYWRlckZvb3RlciIsICJsaW5lUHJpbnQiLCAicm93QnJlYWtzIiwgImNvbEJyZWFrcyIsICJjdXN0b21Qcm9wZXJ0aWVzIiwgImNlbGxXYXRjaGVzIiwgImlnbm9yZWRFcnJvcnMiLCAic21hcnRUYWdzIiwgImRyYXdpbmciLCAibGVnYWN5RHJhd2luZyIsICJsZWdhY3lEcmF3aW5nSEYiLCAicGljdHVyZSIsICJvbGVPYmplY3RzIiwgImFjdGl2ZVhDb250cm9scyIsICJ3ZWJQdWJsaXNoSXRlbXMiLCAidGFibGVQYXJ0cyIgLCAiZXh0THN0IiB9OwotICAgICAgICAgICAgX3BhY2thZ2UgPSBleGNlbFBhY2thZ2U7ICAgCi0gICAgICAgICAgICBfcmVsYXRpb25zaGlwSUQgPSByZWxJRDsKLSAgICAgICAgICAgIF93b3Jrc2hlZXRVcmkgPSB1cmlXb3Jrc2hlZXQ7Ci0gICAgICAgICAgICBfbmFtZSA9IHNoZWV0TmFtZTsKLSAgICAgICAgICAgIF9zaGVldElEID0gc2hlZXRJRDsKLSAgICAgICAgICAgIF9wb3NpdGlvbklEID0gcG9zaXRpb25JRDsKLSAgICAgICAgICAgIEhpZGRlbiA9IGhpZGU7Ci0gICAgICAgICAgIAotICAgICAgICAgICAgLyoqKiogQ2VsbHN0b3JlICoqKiovCi0gICAgICAgICAgICBfdmFsdWVzPW5ldyBDZWxsU3RvcmU8b2JqZWN0PigpOwotICAgICAgICAgICAgX3R5cGVzID0gbmV3IENlbGxTdG9yZTxzdHJpbmc+KCk7Ci0gICAgICAgICAgICBfc3R5bGVzID0gbmV3IENlbGxTdG9yZTxpbnQ+KCk7Ci0gICAgICAgICAgICBfZm9ybXVsYXMgPSBuZXcgQ2VsbFN0b3JlPG9iamVjdD4oKTsKLSAgICAgICAgICAgIF9mbGFncyA9IG5ldyBGbGFnQ2VsbFN0b3JlKCk7Ci0gICAgICAgICAgICBfY29tbWVudHNTdG9yZSA9IG5ldyBDZWxsU3RvcmU8RXhjZWxDb21tZW50PigpOwotICAgICAgICAgICAgX2h5cGVyTGlua3MgPSBuZXcgQ2VsbFN0b3JlPFVyaT4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgX25hbWVzID0gbmV3IEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24oV29ya2Jvb2ssdGhpcyk7CisgICAgaW50ZXJuYWwgdm9pZCBTZXRJbmRleChFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MsIGludCBpeCkgeworICAgICAgaWYgKGFkZHJlc3MuX2Zyb21Sb3cgPT0gMQorICAgICAgICAgICYmIGFkZHJlc3MuX3RvUm93CisgICAgICAgICAgICAgID09IEV4Y2VsUGFja2FnZS5NYXhSb3dzKSAvL0VudGlyZSByb3cKKyAgICAgIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gYWRkcmVzcy5fZnJvbUNvbDsgY29sIDw9IGFkZHJlc3MuX3RvQ29sOyBjb2wrKykgeworICAgICAgICAgIF9jZWxscy5TZXRWYWx1ZSgwLCBjb2wsIGl4KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChhZGRyZXNzLl9mcm9tQ29sID09IDEKKyAgICAgICAgICAmJiBhZGRyZXNzLl90b0NvbAorICAgICAgICAgICAgICA9PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgLy9FbnRpcmUgcm93CisgICAgICB7CisgICAgICAgIGZvciAoaW50IHJvdyA9IGFkZHJlc3MuX2Zyb21Sb3c7IHJvdyA8PSBhZGRyZXNzLl90b1Jvdzsgcm93KyspIHsKKyAgICAgICAgICBfY2VsbHMuU2V0VmFsdWUocm93LCAwLCBpeCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IGFkZHJlc3MuX2Zyb21Db2w7IGNvbCA8PSBhZGRyZXNzLl90b0NvbDsgY29sKyspIHsKKyAgICAgICAgICBmb3IgKGludCByb3cgPSBhZGRyZXNzLl9mcm9tUm93OyByb3cgPD0gYWRkcmVzcy5fdG9Sb3c7IHJvdysrKSB7CisgICAgICAgICAgICBfY2VsbHMuU2V0VmFsdWUocm93LCBjb2wsIGl4KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgICAgIENyZWF0ZVhtbCgpOwotICAgICAgICAgICAgVG9wTm9kZSA9IF93b3Jrc2hlZXRYbWwuRG9jdW1lbnRFbGVtZW50OworICAgIHB1YmxpYyBpbnQgQ291bnQgPT4gX2xpc3QuQ291bnQ7CisKKyAgICBpbnRlcm5hbCB2b2lkIFJlbW92ZShzdHJpbmcgaXRlbSkgeworICAgICAgX2xpc3QuUmVtb3ZlKGl0ZW0pOworICAgIH0KKworICAgIHB1YmxpYyBJRW51bWVyYXRvcjxzdHJpbmc+IEdldEVudW1lcmF0b3IoKSB7CisgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOworICAgIH0KKworICAgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKSB7CisgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOworICAgIH0KKworICAgIGludGVybmFsIHZvaWQgQ2xlYXIoRXhjZWxBZGRyZXNzQmFzZSBkZXN0aW5hdGlvbikgeworICAgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxpbnQ+KAorICAgICAgICAgIF9jZWxscywKKyAgICAgICAgICBkZXN0aW5hdGlvbi5fZnJvbVJvdywKKyAgICAgICAgICBkZXN0aW5hdGlvbi5fZnJvbUNvbCwKKyAgICAgICAgICBkZXN0aW5hdGlvbi5fdG9Sb3csCisgICAgICAgICAgZGVzdGluYXRpb24uX3RvQ29sKTsKKyAgICAgIHZhciB1c2VkID0gbmV3IEhhc2hTZXQ8aW50PigpOworICAgICAgd2hpbGUgKGNzZS5OZXh0KCkpIHsKKyAgICAgICAgdmFyIHYgPSBjc2UuVmFsdWU7CisgICAgICAgIGlmICghdXNlZC5Db250YWlucyh2KSAmJiBfbGlzdFt2XSAhPSBudWxsKSB7CisgICAgICAgICAgdmFyIGFkciA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKF9saXN0W3ZdKTsKKyAgICAgICAgICBpZiAoIShkZXN0aW5hdGlvbi5Db2xsaWRlKGFkcikgPT0gRXhjZWxBZGRyZXNzQmFzZS5lQWRkcmVzc0NvbGxpdGlvbi5JbnNpZGUKKyAgICAgICAgICAgICAgICAgICAgICB8fCBkZXN0aW5hdGlvbi5Db2xsaWRlKGFkcikgPT0gRXhjZWxBZGRyZXNzQmFzZS5lQWRkcmVzc0NvbGxpdGlvbi5FcXVhbCkpIHsKKyAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBkZWxldGUgbWVyZ2VkIGNlbGxzLiBBIHJhbmdlIGlzIHBhcnRseSBtZXJnZWQgd2l0aCB0aGUgZGVsZXRlZCByYW5nZS4gezB9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkci5fYWRkcmVzcykpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgdXNlZC5BZGQodik7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgX2NlbGxzLkNsZWFyKAorICAgICAgICAgIGRlc3RpbmF0aW9uLl9mcm9tUm93LAorICAgICAgICAgIGRlc3RpbmF0aW9uLl9mcm9tQ29sLAorICAgICAgICAgIGRlc3RpbmF0aW9uLl90b1JvdyAtIGRlc3RpbmF0aW9uLl9mcm9tUm93ICsgMSwKKyAgICAgICAgICBkZXN0aW5hdGlvbi5fdG9Db2wgLSBkZXN0aW5hdGlvbi5fZnJvbUNvbCArIDEpOworICAgICAgZm9yZWFjaCAodmFyIGkgaW4gdXNlZCkgeworICAgICAgICBfbGlzdFtpXSA9IG51bGw7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgQ2VsbFN0b3JlPG9iamVjdD4gX3ZhbHVlczsKKyAgaW50ZXJuYWwgQ2VsbFN0b3JlPHN0cmluZz4gX3R5cGVzOworICBpbnRlcm5hbCBDZWxsU3RvcmU8aW50PiBfc3R5bGVzOworICBpbnRlcm5hbCBDZWxsU3RvcmU8b2JqZWN0PiBfZm9ybXVsYXM7CisgIGludGVybmFsIEZsYWdDZWxsU3RvcmUgX2ZsYWdzOworICBpbnRlcm5hbCBDZWxsU3RvcmU8TGlzdDxUb2tlbj4+IF9mb3JtdWxhVG9rZW5zOworCisgIGludGVybmFsIENlbGxTdG9yZTxVcmk+IF9oeXBlckxpbmtzOworICBpbnRlcm5hbCBDZWxsU3RvcmU8RXhjZWxDb21tZW50PiBfY29tbWVudHNTdG9yZTsKKworICBpbnRlcm5hbCBEaWN0aW9uYXJ5PGludCwgRm9ybXVsYXM+IF9zaGFyZWRGb3JtdWxhcyA9IG5ldygpOworICBpbnRlcm5hbCBpbnQgX21pbkNvbCA9IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zOworICBpbnRlcm5hbCBpbnQgX21heENvbCA9IDA7CisKKyAgaW50ZXJuYWwgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOworICBwcml2YXRlIFVyaSBfd29ya3NoZWV0VXJpOworICBwcml2YXRlIHN0cmluZyBfbmFtZTsKKyAgcHJpdmF0ZSBpbnQgX3NoZWV0SUQ7CisgIHByaXZhdGUgaW50IF9wb3NpdGlvbklEOworICBwcml2YXRlIHN0cmluZyBfcmVsYXRpb25zaGlwSUQ7CisgIHByaXZhdGUgWG1sRG9jdW1lbnQgX3dvcmtzaGVldFhtbDsKKyAgaW50ZXJuYWwgRXhjZWxXb3Jrc2hlZXRWaWV3IF9zaGVldFZpZXc7CisgIGludGVybmFsIEV4Y2VsSGVhZGVyRm9vdGVyIF9oZWFkZXJGb290ZXI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSB3b3Jrc2hlZXQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJucyI+TmFtZXNwYWNlbWFuYWdlcjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZXhjZWxQYWNrYWdlIj5QYWNrYWdlPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyZWxJZCI+UmVsYXRpb25zaGlwIElEPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ1cmlXb3Jrc2hlZXQiPlVSSTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ic2hlZXROYW1lIj5OYW1lIG9mIHRoZSBzaGVldDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ic2hlZXRJZCI+U2hlZXQgaWQ8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InBvc2l0aW9uSWQiPlBvc2l0aW9uPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJoaWRlIj5oaWRlPC9wYXJhbT4KKyAgcHVibGljIEV4Y2VsV29ya3NoZWV0KAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBucywKKyAgICAgIEV4Y2VsUGFja2FnZSBleGNlbFBhY2thZ2UsCisgICAgICBzdHJpbmcgcmVsSWQsCisgICAgICBVcmkgdXJpV29ya3NoZWV0LAorICAgICAgc3RyaW5nIHNoZWV0TmFtZSwKKyAgICAgIGludCBzaGVldElkLAorICAgICAgaW50IHBvc2l0aW9uSWQsCisgICAgICBlV29ya1NoZWV0SGlkZGVuIGhpZGUpCisgICAgICA6IGJhc2UobnMsIG51bGwpIHsKKyAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXdbXSB7CisgICAgICAic2hlZXRQciIsCisgICAgICAidGFiQ29sb3IiLAorICAgICAgIm91dGxpbmVQciIsCisgICAgICAicGFnZVNldFVwUHIiLAorICAgICAgImRpbWVuc2lvbiIsCisgICAgICAic2hlZXRWaWV3cyIsCisgICAgICAic2hlZXRGb3JtYXRQciIsCisgICAgICAiY29scyIsCisgICAgICAic2hlZXREYXRhIiwKKyAgICAgICJzaGVldFByb3RlY3Rpb24iLAorICAgICAgInByb3RlY3RlZFJhbmdlcyIsCisgICAgICAic2NlbmFyaW9zIiwKKyAgICAgICJhdXRvRmlsdGVyIiwKKyAgICAgICJzb3J0U3RhdGUiLAorICAgICAgImRhdGFDb25zb2xpZGF0ZSIsCisgICAgICAiY3VzdG9tU2hlZXRWaWV3cyIsCisgICAgICAiY3VzdG9tU2hlZXRWaWV3cyIsCisgICAgICAibWVyZ2VDZWxscyIsCisgICAgICAicGhvbmV0aWNQciIsCisgICAgICAiY29uZGl0aW9uYWxGb3JtYXR0aW5nIiwKKyAgICAgICJkYXRhVmFsaWRhdGlvbnMiLAorICAgICAgImh5cGVybGlua3MiLAorICAgICAgInByaW50T3B0aW9ucyIsCisgICAgICAicGFnZU1hcmdpbnMiLAorICAgICAgInBhZ2VTZXR1cCIsCisgICAgICAiaGVhZGVyRm9vdGVyIiwKKyAgICAgICJsaW5lUHJpbnQiLAorICAgICAgInJvd0JyZWFrcyIsCisgICAgICAiY29sQnJlYWtzIiwKKyAgICAgICJjdXN0b21Qcm9wZXJ0aWVzIiwKKyAgICAgICJjZWxsV2F0Y2hlcyIsCisgICAgICAiaWdub3JlZEVycm9ycyIsCisgICAgICAic21hcnRUYWdzIiwKKyAgICAgICJkcmF3aW5nIiwKKyAgICAgICJsZWdhY3lEcmF3aW5nIiwKKyAgICAgICJsZWdhY3lEcmF3aW5nSEYiLAorICAgICAgInBpY3R1cmUiLAorICAgICAgIm9sZU9iamVjdHMiLAorICAgICAgImFjdGl2ZVhDb250cm9scyIsCisgICAgICAid2ViUHVibGlzaEl0ZW1zIiwKKyAgICAgICJ0YWJsZVBhcnRzIiwKKyAgICAgICJleHRMc3QiLAorICAgIH07CisgICAgX3BhY2thZ2UgPSBleGNlbFBhY2thZ2U7CisgICAgX3JlbGF0aW9uc2hpcElEID0gcmVsSWQ7CisgICAgX3dvcmtzaGVldFVyaSA9IHVyaVdvcmtzaGVldDsKKyAgICBfbmFtZSA9IHNoZWV0TmFtZTsKKyAgICBfc2hlZXRJRCA9IHNoZWV0SWQ7CisgICAgX3Bvc2l0aW9uSUQgPSBwb3NpdGlvbklkOworICAgIEhpZGRlbiA9IGhpZGU7CisKKyAgICAvKioqKiBDZWxsc3RvcmUgKioqKi8KKyAgICBfdmFsdWVzID0gbmV3KCk7CisgICAgX3R5cGVzID0gbmV3KCk7CisgICAgX3N0eWxlcyA9IG5ldygpOworICAgIF9mb3JtdWxhcyA9IG5ldygpOworICAgIF9mbGFncyA9IG5ldygpOworICAgIF9jb21tZW50c1N0b3JlID0gbmV3KCk7CisgICAgX2h5cGVyTGlua3MgPSBuZXcoKTsKKworICAgIF9uYW1lcyA9IG5ldyhXb3JrYm9vaywgdGhpcyk7CisKKyAgICBDcmVhdGVYbWwoKTsKKyAgICBUb3BOb2RlID0gX3dvcmtzaGVldFhtbC5Eb2N1bWVudEVsZW1lbnQ7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgVXJpIHRvIHRoZSB3b3Jrc2hlZXQgd2l0aGluIHRoZSBwYWNrYWdlCisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIFVyaSBXb3Jrc2hlZXRVcmkgPT4gKF93b3Jrc2hlZXRVcmkpOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBaaXAuWmlwUGFja2FnZVBhcnQgZm9yIHRoZSB3b3Jrc2hlZXQgd2l0aGluIHRoZSBwYWNrYWdlCisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIFppcFBhY2thZ2VQYXJ0IFBhcnQgPT4gKF9wYWNrYWdlLlBhY2thZ2UuR2V0UGFydChXb3Jrc2hlZXRVcmkpKTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgSUQgZm9yIHRoZSB3b3Jrc2hlZXQncyByZWxhdGlvbnNoaXAgd2l0aCB0aGUgd29ya2Jvb2sgaW4gdGhlIHBhY2thZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgc3RyaW5nIFJlbGF0aW9uc2hpcElEID0+IChfcmVsYXRpb25zaGlwSUQpOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHdvcmtzaGVldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgaW50IFNoZWV0SUQgPT4gKF9zaGVldElEKTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgcG9zaXRpb24gb2YgdGhlIHdvcmtzaGVldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgaW50IFBvc2l0aW9uSUQgeworICAgIGdldCA9PiAoX3Bvc2l0aW9uSUQpOworICAgIHNldCA9PiBfcG9zaXRpb25JRCA9IHZhbHVlOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIGluZGV4IGluIHRoZSB3b3Jrc2hlZXRzIGNvbGxlY3Rpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBJbmRleCA9PiAoX3Bvc2l0aW9uSUQpOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHJlc3MgZm9yIGF1dG9maWx0ZXIKKyAgLy8vIDxzZWVhbHNvIGNyZWY9IkV4Y2VsUmFuZ2VCYXNlLkF1dG9GaWx0ZXIiIC8+CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEFkZHJlc3NCYXNlIEF1dG9GaWx0ZXJBZGRyZXNzIHsKKyAgICBnZXQgeworICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgIHN0cmluZyBhZGRyZXNzID0gR2V0WG1sTm9kZVN0cmluZygiZDphdXRvRmlsdGVyL0ByZWYiKTsKKyAgICAgIGlmIChhZGRyZXNzID09ICIiKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyhhZGRyZXNzKTsKKyAgICB9CisgICAgaW50ZXJuYWwgc2V0IHsKKyAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJkOmF1dG9GaWx0ZXIvQHJlZiIsIHZhbHVlLkFkZHJlc3MpOworICAgIH0KKyAgfQorCisgIGludGVybmFsIHZvaWQgQ2hlY2tTaGVldFR5cGUoKSB7CisgICAgaWYgKHRoaXMgaXMgRXhjZWxDaGFydHNoZWV0KSB7CisgICAgICB0aHJvdyAobmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIlRoaXMgcHJvcGVydHkgb3IgbWV0aG9kIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGEgQ2hhcnRzaGVldCIpKTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZXR1cm5zIGEgRXhjZWxXb3Jrc2hlZXRWaWV3IG9iamVjdCB0aGF0IGFsbG93cyB5b3UgdG8gc2V0IHRoZSB2aWV3IHN0YXRlIHByb3BlcnRpZXMgb2YgdGhlIHdvcmtzaGVldAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxXb3Jrc2hlZXRWaWV3IFZpZXcgeworICAgIGdldCB7CisgICAgICBpZiAoX3NoZWV0VmlldyA9PSBudWxsKSB7CisgICAgICAgIFhtbE5vZGUgbm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpzaGVldFZpZXdzL2Q6c2hlZXRWaWV3IiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgICAgICBDcmVhdGVOb2RlKCJkOnNoZWV0Vmlld3MvZDpzaGVldFZpZXciKTsgLy90aGlzIG9uZSBzaG91bHMgYWx3YXlzIGV4aXN0LiBidXQgY2hlY2sgYW55d2F5CisgICAgICAgICAgbm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpzaGVldFZpZXdzL2Q6c2hlZXRWaWV3IiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgIH0KKyAgICAgICAgX3NoZWV0VmlldyA9IG5ldyhOYW1lU3BhY2VNYW5hZ2VyLCBub2RlLCB0aGlzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAoX3NoZWV0Vmlldyk7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIHdvcmtzaGVldCdzIGRpc3BsYXkgbmFtZSBhcyBpdCBhcHBlYXJzIG9uIHRoZSB0YWIKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBOYW1lIHsKKyAgICBnZXQgPT4gKF9uYW1lKTsKKyAgICBzZXQgeworICAgICAgaWYgKHZhbHVlID09IF9uYW1lKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHZhbHVlID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5WYWxpZGF0ZUZpeFNoZWV0TmFtZSh2YWx1ZSk7CisgICAgICBmb3JlYWNoICh2YXIgd3MgaW4gV29ya2Jvb2suV29ya3NoZWV0cykgeworICAgICAgICBpZiAod3MuUG9zaXRpb25JRCAhPSBQb3NpdGlvbklECisgICAgICAgICAgICAmJiB3cy5OYW1lLkVxdWFscyh2YWx1ZSwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpIHsKKyAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJXb3Jrc2hlZXQgbmFtZSBtdXN0IGJlIHVuaXF1ZSIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgX3BhY2thZ2UuV29ya2Jvb2suU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICBzdHJpbmcuRm9ybWF0KCJkOnNoZWV0cy9kOnNoZWV0W0BzaGVldElkPXswfV0vQG5hbWUiLCBfc2hlZXRJRCksCisgICAgICAgICAgdmFsdWUpOworICAgICAgQ2hhbmdlTmFtZXModmFsdWUpOworCisgICAgICBfbmFtZSA9IHZhbHVlOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBDaGFuZ2VOYW1lcyhzdHJpbmcgdmFsdWUpIHsKKyAgICAvL1JlbmFtZXMgbmFtZSBpbiB0aGlzIFdvcmtzaGVldDsKKyAgICBmb3JlYWNoICh2YXIgbiBpbiBXb3JrYm9vay5OYW1lcykgeworICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KG4uTmFtZUZvcm11bGEpICYmIG4uTmFtZVZhbHVlID09IG51bGwpIHsKKyAgICAgICAgbi5DaGFuZ2VXb3Jrc2hlZXQoX25hbWUsIHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yZWFjaCAodmFyIHdzIGluIFdvcmtib29rLldvcmtzaGVldHMpIHsKKyAgICAgIGlmICghKHdzIGlzIEV4Y2VsQ2hhcnRzaGVldCkpIHsKKyAgICAgICAgZm9yZWFjaCAodmFyIG4gaW4gd3MuTmFtZXMpIHsKKyAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkobi5OYW1lRm9ybXVsYSkgJiYgbi5OYW1lVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgbi5DaGFuZ2VXb3Jrc2hlZXQoX25hbWUsIHZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbnRlcm5hbCBFeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uIF9uYW1lczsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gbmFtZWQgcmFuZ2VzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uIE5hbWVzIHsKKyAgICBnZXQgeworICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgIHJldHVybiBfbmFtZXM7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW5kaWNhdGVzIGlmIHRoZSB3b3Jrc2hlZXQgaXMgaGlkZGVuIGluIHRoZSB3b3JrYm9vaworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZVdvcmtTaGVldEhpZGRlbiBIaWRkZW4geworICAgIGdldCB7CisgICAgICBzdHJpbmcgc3RhdGUgPSBfcGFja2FnZS5Xb3JrYm9vay5HZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgIHN0cmluZy5Gb3JtYXQoImQ6c2hlZXRzL2Q6c2hlZXRbQHNoZWV0SWQ9ezB9XS9Ac3RhdGUiLCBfc2hlZXRJRCkpOworICAgICAgaWYgKHN0YXRlID09ICJoaWRkZW4iKSB7CisgICAgICAgIHJldHVybiBlV29ya1NoZWV0SGlkZGVuLkhpZGRlbjsKKyAgICAgIH0KKyAgICAgIGlmIChzdGF0ZSA9PSAidmVyeUhpZGRlbiIpIHsKKyAgICAgICAgcmV0dXJuIGVXb3JrU2hlZXRIaWRkZW4uVmVyeUhpZGRlbjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBlV29ya1NoZWV0SGlkZGVuLlZpc2libGU7CisgICAgfQorICAgIHNldCB7CisgICAgICBpZiAodmFsdWUgPT0gZVdvcmtTaGVldEhpZGRlbi5WaXNpYmxlKSB7CisgICAgICAgIF9wYWNrYWdlLldvcmtib29rLkRlbGV0ZU5vZGUoCisgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KCJkOnNoZWV0cy9kOnNoZWV0W0BzaGVldElkPXswfV0vQHN0YXRlIiwgX3NoZWV0SUQpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmluZyB2OworICAgICAgICB2ID0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgICAgdiA9IHYuU3Vic3RyaW5nKDAsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyB2LlN1YnN0cmluZygxKTsKKyAgICAgICAgX3BhY2thZ2UuV29ya2Jvb2suU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoImQ6c2hlZXRzL2Q6c2hlZXRbQHNoZWV0SWQ9ezB9XS9Ac3RhdGUiLCBfc2hlZXRJRCksCisgICAgICAgICAgICB2KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIGRvdWJsZSBfZGVmYXVsdFJvd0hlaWdodCA9IGRvdWJsZS5OYU47CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0L3NldCB0aGUgZGVmYXVsdCBoZWlnaHQgb2YgYWxsIHJvd3MgaW4gdGhlIHdvcmtzaGVldAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZG91YmxlIERlZmF1bHRSb3dIZWlnaHQgeworICAgIGdldCB7CisgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgaWYgKGRvdWJsZS5Jc05hTihfZGVmYXVsdFJvd0hlaWdodCkpIHsKKyAgICAgICAgX2RlZmF1bHRSb3dIZWlnaHQgPSBHZXRYbWxOb2RlRG91YmxlKCJkOnNoZWV0Rm9ybWF0UHIvQGRlZmF1bHRSb3dIZWlnaHQiKTsKKyAgICAgICAgaWYgKGRvdWJsZS5Jc05hTihfZGVmYXVsdFJvd0hlaWdodCkpIHsKKyAgICAgICAgICBfZGVmYXVsdFJvd0hlaWdodCA9IDE1OyAvLyBFeGNlbCBkZWZhdWx0IGhlaWdodAorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gX2RlZmF1bHRSb3dIZWlnaHQ7CisgICAgfQorICAgIHNldCB7CisgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgX2RlZmF1bHRSb3dIZWlnaHQgPSB2YWx1ZTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgImQ6c2hlZXRGb3JtYXRQci9AZGVmYXVsdFJvd0hlaWdodCIsCisgICAgICAgICAgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgU2V0WG1sTm9kZUJvb2woImQ6c2hlZXRGb3JtYXRQci9AY3VzdG9tSGVpZ2h0IiwgdmFsdWUgIT0gMTUpOworCisgICAgICBpZiAoZG91YmxlLklzTmFOKEdldFhtbE5vZGVEb3VibGUoImQ6c2hlZXRGb3JtYXRQci9AZGVmYXVsdENvbFdpZHRoIikpKSB7CisgICAgICAgIERlZmF1bHRDb2xXaWR0aCA9IDkuMTQwNjI1OworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldC9zZXQgdGhlIGRlZmF1bHQgd2lkdGggb2YgYWxsIHJvd3MgaW4gdGhlIHdvcmtzaGVldAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZG91YmxlIERlZmF1bHRDb2xXaWR0aCB7CisgICAgZ2V0IHsKKyAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICBkb3VibGUgcmV0ID0gR2V0WG1sTm9kZURvdWJsZSgiZDpzaGVldEZvcm1hdFByL0BkZWZhdWx0Q29sV2lkdGgiKTsKKyAgICAgIGlmIChkb3VibGUuSXNOYU4ocmV0KSkgeworICAgICAgICByZXQgPSA5LjE0MDYyNTsgLy8gRXhjZWwncyBkZWZhdWx0IHdpZHRoCisgICAgICB9CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBzZXQgeworICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoCisgICAgICAgICAgImQ6c2hlZXRGb3JtYXRQci9AZGVmYXVsdENvbFdpZHRoIiwKKyAgICAgICAgICB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisKKyAgICAgIGlmIChkb3VibGUuSXNOYU4oR2V0WG1sTm9kZURvdWJsZSgiZDpzaGVldEZvcm1hdFByL0BkZWZhdWx0Um93SGVpZ2h0IikpKSB7CisgICAgICAgIERlZmF1bHRSb3dIZWlnaHQgPSAxNTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiogPG91dGxpbmVQciBhcHBseVN0eWxlcz0iMSIgc3VtbWFyeUJlbG93PSIwIiBzdW1tYXJ5UmlnaHQ9IjAiIC8+ICoqLworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfb3V0TGluZVN1bW1hcnlCZWxvd1BhdGggPSAiZDpzaGVldFByL2Q6b3V0bGluZVByL0BzdW1tYXJ5QmVsb3ciOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFN1bW1hcnkgcm93cyBiZWxvdyBkZXRhaWxzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIE91dExpbmVTdW1tYXJ5QmVsb3cgeworICAgIGdldCB7CisgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKF9vdXRMaW5lU3VtbWFyeUJlbG93UGF0aCk7CisgICAgfQorICAgIHNldCB7CisgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfb3V0TGluZVN1bW1hcnlCZWxvd1BhdGgsIHZhbHVlID8gIjEiIDogIjAiKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfb3V0TGluZVN1bW1hcnlSaWdodFBhdGggPSAiZDpzaGVldFByL2Q6b3V0bGluZVByL0BzdW1tYXJ5UmlnaHQiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFN1bW1hcnkgcm93cyB0byByaWdodCBvZiBkZXRhaWxzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIE91dExpbmVTdW1tYXJ5UmlnaHQgeworICAgIGdldCB7CisgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKF9vdXRMaW5lU3VtbWFyeVJpZ2h0UGF0aCk7CisgICAgfQorICAgIHNldCB7CisgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfb3V0TGluZVN1bW1hcnlSaWdodFBhdGgsIHZhbHVlID8gIjEiIDogIjAiKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfb3V0TGluZUFwcGx5U3R5bGVQYXRoID0gImQ6c2hlZXRQci9kOm91dGxpbmVQci9AYXBwbHlTdHlsZXMiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEF1dG9tYXRpYyBzdHlsZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgT3V0TGluZUFwcGx5U3R5bGUgeworICAgIGdldCB7CisgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKF9vdXRMaW5lQXBwbHlTdHlsZVBhdGgpOworICAgIH0KKyAgICBzZXQgeworICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX291dExpbmVBcHBseVN0eWxlUGF0aCwgdmFsdWUgPyAiMSIgOiAiMCIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF90YWJDb2xvclBhdGggPSAiZDpzaGVldFByL2Q6dGFiQ29sb3IvQHJnYiI7CisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9jb2RlTW9kdWxlTmFtZVBhdGggPSAiZDpzaGVldFByL0Bjb2RlTmFtZSI7CisKKyAgaW50ZXJuYWwgc3RyaW5nIENvZGVNb2R1bGVOYW1lIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZyhfY29kZU1vZHVsZU5hbWVQYXRoKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZyhfY29kZU1vZHVsZU5hbWVQYXRoLCB2YWx1ZSk7CisgIH0KKworICBpbnRlcm5hbCB2b2lkIENvZGVOYW1lQ2hhbmdlKHN0cmluZyB2YWx1ZSkgeworICAgIENvZGVNb2R1bGVOYW1lID0gdmFsdWU7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgWE1MIGRvY3VtZW50IGhvbGRpbmcgdGhlIHdvcmtzaGVldCBkYXRhLgorICAvLy8gQWxsIGNvbHVtbiwgcm93LCBjZWxsLCBwYWdlYnJlYWssIG1lcmdlZCBjZWxsIGFuZCBoeXBlcmxpbmstZGF0YSBhcmUgbG9hZGVkIGludG8gbWVtb3J5IGFuZCByZW1vdmVkIGZyb20gdGhlIGRvY3VtZW50IHdoZW4gbG9hZGluZyB0aGUgZG9jdW1lbnQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBYbWxEb2N1bWVudCBXb3Jrc2hlZXRYbWwgPT4gKF93b3Jrc2hlZXRYbWwpOworCisgIGludGVybmFsIEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnRDb2xsZWN0aW9uIF92bWxEcmF3aW5nczsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBWbWwgZHJhd2luZ3MuIHVuZGVybGF5aW5nIG9iamVjdCBmb3IgY29tbWVudHMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgRXhjZWxWbWxEcmF3aW5nQ29tbWVudENvbGxlY3Rpb24gVm1sRHJhd2luZ3NDb21tZW50cyB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfdm1sRHJhd2luZ3MgPT0gbnVsbCkgeworICAgICAgICBDcmVhdGVWbWxDb2xsZWN0aW9uKCk7CisgICAgICB9CisgICAgICByZXR1cm4gX3ZtbERyYXdpbmdzOworICAgIH0KKyAgfQorCisgIGludGVybmFsIEV4Y2VsQ29tbWVudENvbGxlY3Rpb24gX2NvbW1lbnRzOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENvbGxlY3Rpb24gb2YgY29tbWVudHMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsQ29tbWVudENvbGxlY3Rpb24gQ29tbWVudHMgeworICAgIGdldCB7CisgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgaWYgKF9jb21tZW50cyA9PSBudWxsKSB7CisgICAgICAgIENyZWF0ZVZtbENvbGxlY3Rpb24oKTsKKyAgICAgICAgX2NvbW1lbnRzID0gbmV3KF9wYWNrYWdlLCB0aGlzLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfY29tbWVudHM7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIENyZWF0ZVZtbENvbGxlY3Rpb24oKSB7CisgICAgdmFyIHZtbE5vZGUgPSBfd29ya3NoZWV0WG1sLkRvY3VtZW50RWxlbWVudC5TZWxlY3RTaW5nbGVOb2RlKAorICAgICAgICAiZDpsZWdhY3lEcmF3aW5nL0ByOmlkIiwKKyAgICAgICAgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgaWYgKHZtbE5vZGUgPT0gbnVsbCkgeworICAgICAgX3ZtbERyYXdpbmdzID0gbmV3KF9wYWNrYWdlLCB0aGlzLCBudWxsKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKFBhcnQuUmVsYXRpb25zaGlwRXhpc3RzKHZtbE5vZGUuVmFsdWUpKSB7CisgICAgICAgIHZhciByZWwgPSBQYXJ0LkdldFJlbGF0aW9uc2hpcCh2bWxOb2RlLlZhbHVlKTsKKyAgICAgICAgdmFyIHZtbFVyaSA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShyZWwuU291cmNlVXJpLCByZWwuVGFyZ2V0VXJpKTsKKworICAgICAgICBfdm1sRHJhd2luZ3MgPSBuZXcoX3BhY2thZ2UsIHRoaXMsIHZtbFVyaSk7CisgICAgICAgIF92bWxEcmF3aW5ncy5SZWxJZCA9IHJlbC5JZDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgQ3JlYXRlWG1sKCkgeworICAgIF93b3Jrc2hlZXRYbWwgPSBuZXcoKTsKKyAgICBfd29ya3NoZWV0WG1sLlByZXNlcnZlV2hpdGVzcGFjZSA9IEV4Y2VsUGFja2FnZS5fcHJlc2VydmVXaGl0ZXNwYWNlOworICAgIFppcFBhY2thZ2VQYXJ0IHBhY2tQYXJ0ID0gX3BhY2thZ2UuUGFja2FnZS5HZXRQYXJ0KFdvcmtzaGVldFVyaSk7CisgICAgc3RyaW5nIHhtbCA9ICIiOworCisgICAgLy8gRmlyc3QgQ29sdW1ucywgcm93cywgY2VsbHMsIG1lcmdlY2VsbHMsIGh5cGVybGlua3MgYW5kIHBhZ2VicmVha2VzIGFyZSBsb2FkZWQgZnJvbSBhIHhtbHN0cmVhbSB0byBvcHRpbWl6ZSBzcGVlZC4uLgorICAgIFN0cmVhbSBzdHJlYW0gPSBwYWNrUGFydC5HZXRTdHJlYW0oKTsKKworICAgIFhtbFRleHRSZWFkZXIgeHIgPSBuZXcgWG1sVGV4dFJlYWRlcihzdHJlYW0pOworICAgIHhyLlByb2hpYml0RHRkID0gdHJ1ZTsKKyAgICB4ci5XaGl0ZXNwYWNlSGFuZGxpbmcgPSBXaGl0ZXNwYWNlSGFuZGxpbmcuTm9uZTsKKyAgICBMb2FkQ29sdW1ucyh4cik7IC8vY29sdW1uWG1sCisgICAgbG9uZyBzdGFydCA9IHN0cmVhbS5Qb3NpdGlvbjsKKyAgICBMb2FkQ2VsbHMoeHIpOworICAgIHZhciBuZXh0RWxlbWVudExlbmd0aCA9IEdldEF0dHJpYnV0ZUxlbmd0aCh4cik7CisgICAgbG9uZyBlbmQgPSBzdHJlYW0uUG9zaXRpb24gLSBuZXh0RWxlbWVudExlbmd0aDsKKyAgICBMb2FkTWVyZ2VDZWxscyh4cik7CisgICAgTG9hZEh5cGVyTGlua3MoeHIpOworICAgIExvYWRSb3dQYWdlQnJlYWtlcyh4cik7CisgICAgTG9hZENvbFBhZ2VCcmVha2VzKHhyKTsKKyAgICAvLy4uLnRoZW4gdGhlIHJlc3Qgb2YgdGhlIFhtbCBpcyBleHRyYWN0ZWQgYW5kIGxvYWRlZCBpbnRvIHRoZSBXb3Jrc2hlZXRYbWwgZG9jdW1lbnQuCisgICAgc3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7CisgICAgRW5jb2RpbmcgZW5jb2Rpbmc7CisgICAgeG1sID0gR2V0V29ya1NoZWV0WG1sKHN0cmVhbSwgc3RhcnQsIGVuZCwgb3V0IGVuY29kaW5nKTsKKworICAgIC8vZmlyc3QgY2hhciBpcyBpbnZhbGlkIHNvbWV0aW1lcz8/CisgICAgaWYgKHhtbFswXSAhPSAnPCcpIHsKKyAgICAgIExvYWRYbWxTYWZlKF93b3Jrc2hlZXRYbWwsIHhtbC5TdWJzdHJpbmcoMSwgeG1sLkxlbmd0aCAtIDEpLCBlbmNvZGluZyk7CisgICAgfSBlbHNlIHsKKyAgICAgIExvYWRYbWxTYWZlKF93b3Jrc2hlZXRYbWwsIHhtbCwgZW5jb2RpbmcpOworICAgIH0KKworICAgIENsZWFyTm9kZXMoKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldCB0aGUgbGVudGggb2YgdGhlIGF0dHJpYnV0ZXMKKyAgLy8vIENvbmRpdGlvbmFsIGZvcm1hdHRpbmcgYXR0cmlidXRlcyBjYW4gYmUgZXh0cmVtbHkgbG9uZyBzb20gZ2V0IGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlcyB0byBmaW5ldHVuZSBwb3NpdGlvbi4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ4ciI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHJpdmF0ZSBpbnQgR2V0QXR0cmlidXRlTGVuZ3RoKFhtbFRleHRSZWFkZXIgeHIpIHsKKyAgICBpZiAoeHIuTm9kZVR5cGUgIT0gWG1sTm9kZVR5cGUuRWxlbWVudCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHZhciBsZW5ndGggPSAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB4ci5BdHRyaWJ1dGVDb3VudDsgaSsrKSB7CisgICAgICB2YXIgYSA9IHhyLkdldEF0dHJpYnV0ZShpKTsKKyAgICAgIGxlbmd0aCArPSBzdHJpbmcuSXNOdWxsT3JFbXB0eShhKSA/IDAgOiBhLkxlbmd0aDsKKyAgICB9CisgICAgcmV0dXJuIGxlbmd0aDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBMb2FkUm93UGFnZUJyZWFrZXMoWG1sVGV4dFJlYWRlciB4cikgeworICAgIGlmICghUmVhZFVudGlsKHhyLCAicm93QnJlYWtzIiwgImNvbEJyZWFrcyIpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHdoaWxlICh4ci5SZWFkKCkpIHsKKyAgICAgIGlmICh4ci5Mb2NhbE5hbWUgPT0gImJyayIpIHsKKyAgICAgICAgaWYgKHhyLk5vZGVUeXBlID09IFhtbE5vZGVUeXBlLkVsZW1lbnQpIHsKKyAgICAgICAgICBpbnQgaWQ7CisgICAgICAgICAgaWYgKGludC5UcnlQYXJzZSh4ci5HZXRBdHRyaWJ1dGUoImlkIiksIG91dCBpZCkpIHsKKyAgICAgICAgICAgIFJvdyhpZCkuUGFnZUJyZWFrID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBMb2FkQ29sUGFnZUJyZWFrZXMoWG1sVGV4dFJlYWRlciB4cikgeworICAgIGlmICghUmVhZFVudGlsKHhyLCAiY29sQnJlYWtzIikpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgd2hpbGUgKHhyLlJlYWQoKSkgeworICAgICAgaWYgKHhyLkxvY2FsTmFtZSA9PSAiYnJrIikgeworICAgICAgICBpZiAoeHIuTm9kZVR5cGUgPT0gWG1sTm9kZVR5cGUuRWxlbWVudCkgeworICAgICAgICAgIGludCBpZDsKKyAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKHhyLkdldEF0dHJpYnV0ZSgiaWQiKSwgb3V0IGlkKSkgeworICAgICAgICAgICAgQ29sdW1uKGlkKS5QYWdlQnJlYWsgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIENsZWFyTm9kZXMoKSB7CisgICAgaWYgKF93b3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOmNvbHMiLCBOYW1lU3BhY2VNYW5hZ2VyKSAhPSBudWxsKSB7CisgICAgICBfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpjb2xzIiwgTmFtZVNwYWNlTWFuYWdlcikuUmVtb3ZlQWxsKCk7CisgICAgfQorICAgIGlmIChfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDptZXJnZUNlbGxzIiwgTmFtZVNwYWNlTWFuYWdlcikgIT0gbnVsbCkgeworICAgICAgX3dvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6bWVyZ2VDZWxscyIsIE5hbWVTcGFjZU1hbmFnZXIpLlJlbW92ZUFsbCgpOworICAgIH0KKyAgICBpZiAoX3dvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6aHlwZXJsaW5rcyIsIE5hbWVTcGFjZU1hbmFnZXIpICE9IG51bGwpIHsKKyAgICAgIF93b3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOmh5cGVybGlua3MiLCBOYW1lU3BhY2VNYW5hZ2VyKS5SZW1vdmVBbGwoKTsKKyAgICB9CisgICAgaWYgKF93b3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOnJvd0JyZWFrcyIsIE5hbWVTcGFjZU1hbmFnZXIpICE9IG51bGwpIHsKKyAgICAgIF93b3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOnJvd0JyZWFrcyIsIE5hbWVTcGFjZU1hbmFnZXIpLlJlbW92ZUFsbCgpOworICAgIH0KKyAgICBpZiAoX3dvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6Y29sQnJlYWtzIiwgTmFtZVNwYWNlTWFuYWdlcikgIT0gbnVsbCkgeworICAgICAgX3dvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6Y29sQnJlYWtzIiwgTmFtZVNwYWNlTWFuYWdlcikuUmVtb3ZlQWxsKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBpbnQgX2Jsb2Nrc2l6ZSA9IDgxOTI7CisKKyAgcHJpdmF0ZSBzdHJpbmcgR2V0V29ya1NoZWV0WG1sKFN0cmVhbSBzdHJlYW0sIGxvbmcgc3RhcnQsIGxvbmcgZW5kLCBvdXQgRW5jb2RpbmcgZW5jb2RpbmcpIHsKKyAgICBTdHJlYW1SZWFkZXIgc3IgPSBuZXcgU3RyZWFtUmVhZGVyKHN0cmVhbSk7CisgICAgaW50IGxlbmd0aCA9IDA7CisgICAgY2hhcltdIGJsb2NrOworICAgIGludCBwb3M7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgTWF0Y2ggc3RhcnRtTWF0Y2gsCisgICAgICAgIGVuZE1hdGNoOworICAgIGRvIHsKKyAgICAgIGludCBzaXplID0gc3RyZWFtLkxlbmd0aCA8IF9ibG9ja3NpemUgPyAoaW50KXN0cmVhbS5MZW5ndGggOiBfYmxvY2tzaXplOworICAgICAgYmxvY2sgPSBuZXcgY2hhcltzaXplXTsKKyAgICAgIHBvcyA9IHNyLlJlYWRCbG9jayhibG9jaywgMCwgc2l6ZSk7CisgICAgICBzYi5BcHBlbmQoYmxvY2ssIDAsIHBvcyk7CisgICAgICBsZW5ndGggKz0gc2l6ZTsKKyAgICB9IHdoaWxlIChsZW5ndGggPCBzdGFydCArIDIwICYmIGxlbmd0aCA8IGVuZCk7CisgICAgc3RhcnRtTWF0Y2ggPSBSZWdleC5NYXRjaChzYi5Ub1N0cmluZygpLCBzdHJpbmcuRm9ybWF0KCIoPFtePl0qezB9W14+XSo+KSIsICJzaGVldERhdGEiKSk7CisgICAgaWYgKCFzdGFydG1NYXRjaC5TdWNjZXNzKSAvL05vdCBmb3VuZAorICAgIHsKKyAgICAgIGVuY29kaW5nID0gc3IuQ3VycmVudEVuY29kaW5nOworICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7CisgICAgfQorICAgIHN0cmluZyBzID0gc2IuVG9TdHJpbmcoKTsKKyAgICBzdHJpbmcgeG1sID0gcy5TdWJzdHJpbmcoMCwgc3RhcnRtTWF0Y2guSW5kZXgpOworICAgIGlmIChzdGFydG1NYXRjaC5WYWx1ZS5FbmRzV2l0aCgiLz4iKSkgeworICAgICAgeG1sICs9IHMuU3Vic3RyaW5nKHN0YXJ0bU1hdGNoLkluZGV4LCBzLkxlbmd0aCAtIHN0YXJ0bU1hdGNoLkluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHNyLlBlZWsoKSAhPSAtMSkgeworICAgICAgICAvKioqKiBGaXhlcyBpc3N1ZSAxNDc4OC4gRml4IGJ5IFBoaWxpcCBHYXJyZXR0ICoqKiovCisgICAgICAgIGxvbmcgZW5kU2Vla1N0YXJ0ID0gZW5kOworCisgICAgICAgIHdoaWxlIChlbmRTZWVrU3RhcnQgPj0gMCkgeworICAgICAgICAgIGVuZFNlZWtTdGFydCA9IE1hdGguTWF4KGVuZFNlZWtTdGFydCAtIF9ibG9ja3NpemUsIDApOworICAgICAgICAgIGludCBzaXplID0gKGludCkoZW5kIC0gZW5kU2Vla1N0YXJ0KTsKKyAgICAgICAgICBzdHJlYW0uU2VlayhlbmRTZWVrU3RhcnQsIFNlZWtPcmlnaW4uQmVnaW4pOworICAgICAgICAgIGJsb2NrID0gbmV3IGNoYXJbc2l6ZV07CisgICAgICAgICAgc3IgPSBuZXcoc3RyZWFtKTsKKyAgICAgICAgICBwb3MgPSBzci5SZWFkQmxvY2soYmxvY2ssIDAsIHNpemUpOworICAgICAgICAgIHNiID0gbmV3KCk7CisgICAgICAgICAgc2IuQXBwZW5kKGJsb2NrLCAwLCBwb3MpOworICAgICAgICAgIHMgPSBzYi5Ub1N0cmluZygpOworICAgICAgICAgIGVuZE1hdGNoID0gUmVnZXguTWF0Y2gocywgc3RyaW5nLkZvcm1hdCgiKDwvW14+XSp7MH1bXj5dKj4pIiwgInNoZWV0RGF0YSIpKTsKKyAgICAgICAgICBpZiAoZW5kTWF0Y2guU3VjY2VzcykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBlbmRNYXRjaCA9IFJlZ2V4Lk1hdGNoKHMsIHN0cmluZy5Gb3JtYXQoIig8L1tePl0qezB9W14+XSo+KSIsICJzaGVldERhdGEiKSk7CisgICAgICB4bWwgKz0KKyAgICAgICAgICAiPHNoZWV0RGF0YS8+IgorICAgICAgICAgICAgICArIHMuU3Vic3RyaW5nKAorICAgICAgICAgICAgICAgICAgZW5kTWF0Y2guSW5kZXggKyBlbmRNYXRjaC5MZW5ndGgsCisgICAgICAgICAgICAgICAgICBzLkxlbmd0aCAtIChlbmRNYXRjaC5JbmRleCArIGVuZE1hdGNoLkxlbmd0aCkpOworICAgIH0KKyAgICBpZiAoc3IuUGVlaygpID4gLTEpIHsKKyAgICAgIHhtbCArPSBzci5SZWFkVG9FbmQoKTsKKyAgICB9CisKKyAgICBlbmNvZGluZyA9IHNyLkN1cnJlbnRFbmNvZGluZzsKKyAgICByZXR1cm4geG1sOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIEdldEJsb2NrUG9zKHN0cmluZyB4bWwsIHN0cmluZyB0YWcsIHJlZiBpbnQgc3RhcnQsIHJlZiBpbnQgZW5kKSB7CisgICAgTWF0Y2ggc3RhcnRtTWF0Y2gsCisgICAgICAgIGVuZE1hdGNoOworICAgIHN0YXJ0bU1hdGNoID0gUmVnZXguTWF0Y2goeG1sLlN1YnN0cmluZyhzdGFydCksIHN0cmluZy5Gb3JtYXQoIig8W14+XSp7MH1bXj5dKj4pIiwgdGFnKSk7IC8vIjxbYS16QS1aOl0qIiArIHRhZyArICJbP10qPiIpOworCisgICAgaWYgKCFzdGFydG1NYXRjaC5TdWNjZXNzKSAvL05vdCBmb3VuZAorICAgIHsKKyAgICAgIHN0YXJ0ID0gLTE7CisgICAgICBlbmQgPSAtMTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFyIHN0YXJ0UG9zID0gc3RhcnRtTWF0Y2guSW5kZXggKyBzdGFydDsKKyAgICBpZiAoc3RhcnRtTWF0Y2guVmFsdWUuU3Vic3RyaW5nKHN0YXJ0bU1hdGNoLlZhbHVlLkxlbmd0aCAtIDIsIDEpID09ICIvIikgeworICAgICAgZW5kID0gc3RhcnRQb3MgKyBzdGFydG1NYXRjaC5MZW5ndGg7CisgICAgfSBlbHNlIHsKKyAgICAgIGVuZE1hdGNoID0gUmVnZXguTWF0Y2goeG1sLlN1YnN0cmluZyhzdGFydCksIHN0cmluZy5Gb3JtYXQoIig8L1tePl0qezB9W14+XSo+KSIsIHRhZykpOworICAgICAgaWYgKGVuZE1hdGNoLlN1Y2Nlc3MpIHsKKyAgICAgICAgZW5kID0gZW5kTWF0Y2guSW5kZXggKyBlbmRNYXRjaC5MZW5ndGggKyBzdGFydDsKKyAgICAgIH0KKyAgICB9CisgICAgc3RhcnQgPSBzdGFydFBvczsKKyAgfQorCisgIHByaXZhdGUgYm9vbCBSZWFkVW50aWwoWG1sVGV4dFJlYWRlciB4ciwgcGFyYW1zIHN0cmluZ1tdIHRhZ05hbWUpIHsKKyAgICBpZiAoeHIuRU9GKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHdoaWxlICghQXJyYXkuRXhpc3RzKHRhZ05hbWUsIHRhZyA9PiB4ci5Mb2NhbE5hbWUuRW5kc1dpdGgodGFnKSkpIHsKKyAgICAgIHhyLlJlYWQoKTsKKyAgICAgIGlmICh4ci5FT0YpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHhyLkxvY2FsTmFtZS5FbmRzV2l0aCh0YWdOYW1lWzBdKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgTG9hZENvbHVtbnMoCisgICAgICBYbWxUZXh0UmVhZGVyIHhyKSAvLyhzdHJpbmcgeG1sKQorICB7CisgICAgdmFyIGNvbExpc3QgPSBuZXcgTGlzdDxJUmFuZ2VJZD4oKTsKKyAgICBpZiAoUmVhZFVudGlsKHhyLCAiY29scyIsICJzaGVldERhdGEiKSkgeworICAgICAgLy9pZiAoeG1sICE9ICIiKQorICAgICAgLy97CisgICAgICAvL3ZhciB4cj1uZXcgWG1sVGV4dFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKHhtbCkpOworICAgICAgd2hpbGUgKHhyLlJlYWQoKSkgeworICAgICAgICBpZiAoeHIuTm9kZVR5cGUgPT0gWG1sTm9kZVR5cGUuV2hpdGVzcGFjZSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICh4ci5Mb2NhbE5hbWUgIT0gImNvbCIpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoeHIuTm9kZVR5cGUgPT0gWG1sTm9kZVR5cGUuRWxlbWVudCkgeworICAgICAgICAgIGludCBtaW4gPSBpbnQuUGFyc2UoeHIuR2V0QXR0cmlidXRlKCJtaW4iKSk7CisKKyAgICAgICAgICBFeGNlbENvbHVtbiBjb2wgPSBuZXcgRXhjZWxDb2x1bW4odGhpcywgbWluKTsKKworICAgICAgICAgIGNvbC5Db2x1bW5NYXggPSBpbnQuUGFyc2UoeHIuR2V0QXR0cmlidXRlKCJtYXgiKSk7CisgICAgICAgICAgY29sLldpZHRoID0KKyAgICAgICAgICAgICAgeHIuR2V0QXR0cmlidXRlKCJ3aWR0aCIpID09IG51bGwKKyAgICAgICAgICAgICAgICAgID8gMAorICAgICAgICAgICAgICAgICAgOiBkb3VibGUuUGFyc2UoeHIuR2V0QXR0cmlidXRlKCJ3aWR0aCIpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgICBjb2wuQmVzdEZpdCA9CisgICAgICAgICAgICAgIHhyLkdldEF0dHJpYnV0ZSgiYmVzdEZpdCIpICE9IG51bGwgJiYgeHIuR2V0QXR0cmlidXRlKCJiZXN0Rml0IikgPT0gIjEiCisgICAgICAgICAgICAgICAgICA/IHRydWUKKyAgICAgICAgICAgICAgICAgIDogZmFsc2U7CisgICAgICAgICAgY29sLkNvbGxhcHNlZCA9CisgICAgICAgICAgICAgIHhyLkdldEF0dHJpYnV0ZSgiY29sbGFwc2VkIikgIT0gbnVsbCAmJiB4ci5HZXRBdHRyaWJ1dGUoImNvbGxhcHNlZCIpID09ICIxIgorICAgICAgICAgICAgICAgICAgPyB0cnVlCisgICAgICAgICAgICAgICAgICA6IGZhbHNlOworICAgICAgICAgIGNvbC5QaG9uZXRpYyA9CisgICAgICAgICAgICAgIHhyLkdldEF0dHJpYnV0ZSgicGhvbmV0aWMiKSAhPSBudWxsICYmIHhyLkdldEF0dHJpYnV0ZSgicGhvbmV0aWMiKSA9PSAiMSIKKyAgICAgICAgICAgICAgICAgID8gdHJ1ZQorICAgICAgICAgICAgICAgICAgOiBmYWxzZTsKKyAgICAgICAgICBjb2wuT3V0bGluZUxldmVsID0gKHNob3J0KSh4ci5HZXRBdHRyaWJ1dGUoIm91dGxpbmVMZXZlbCIpID09IG51bGwKKyAgICAgICAgICAgICAgPyAwCisgICAgICAgICAgICAgIDogaW50LlBhcnNlKHhyLkdldEF0dHJpYnV0ZSgib3V0bGluZUxldmVsIiksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgICAgICBjb2wuSGlkZGVuID0KKyAgICAgICAgICAgICAgeHIuR2V0QXR0cmlidXRlKCJoaWRkZW4iKSAhPSBudWxsICYmIHhyLkdldEF0dHJpYnV0ZSgiaGlkZGVuIikgPT0gIjEiID8gdHJ1ZSA6IGZhbHNlOworICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUoMCwgbWluLCBjb2wpOworCisgICAgICAgICAgaW50IHN0eWxlOworICAgICAgICAgIGlmICghKHhyLkdldEF0dHJpYnV0ZSgic3R5bGUiKSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgfHwgIWludC5UcnlQYXJzZSh4ci5HZXRBdHRyaWJ1dGUoInN0eWxlIiksIG91dCBzdHlsZSkpKSB7CisgICAgICAgICAgICBfc3R5bGVzLlNldFZhbHVlKDAsIG1pbiwgc3R5bGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJlYWQgdW50aWwgdGhlIG5vZGUgaXMgZm91bmQuIElmIG5vdCBmb3VuZCB0aGUgeG1scmVhZGVyIGlzIHJlc2V0ZWQuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ieHIiPlRoZSByZWFkZXI8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5vZGVUZXh0Ij5UZXh0IHRvIHNlYXJjaCBmb3I8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFsdE5vZGUiPkFsdGVybmF0aXZlIHRleHQgdG8gc2VhcmNoIGZvcjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHByaXZhdGUgc3RhdGljIGJvb2wgUmVhZFhtbFJlYWRlclVudGlsKFhtbFRleHRSZWFkZXIgeHIsIHN0cmluZyBub2RlVGV4dCwgc3RyaW5nIGFsdE5vZGUpIHsKKyAgICBkbyB7CisgICAgICBpZiAoeHIuTG9jYWxOYW1lID09IG5vZGVUZXh0IHx8IHhyLkxvY2FsTmFtZSA9PSBhbHROb2RlKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0gd2hpbGUgKHhyLlJlYWQoKSk7CisgICAgeHIuQ2xvc2UoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMb2FkIEh5cGVybGlua3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ4ciI+VGhlIHJlYWRlcjwvcGFyYW0+CisgIHByaXZhdGUgdm9pZCBMb2FkSHlwZXJMaW5rcyhYbWxUZXh0UmVhZGVyIHhyKSB7CisgICAgaWYgKCFSZWFkVW50aWwoeHIsICJoeXBlcmxpbmtzIiwgInJvd0JyZWFrcyIsICJjb2xCcmVha3MiKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB3aGlsZSAoeHIuUmVhZCgpKSB7CisgICAgICBpZiAoeHIuTG9jYWxOYW1lID09ICJoeXBlcmxpbmsiKSB7CisgICAgICAgIGludCBmcm9tUm93LAorICAgICAgICAgICAgZnJvbUNvbCwKKyAgICAgICAgICAgIHRvUm93LAorICAgICAgICAgICAgdG9Db2w7CisgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0Um93Q29sRnJvbUFkZHJlc3MoCisgICAgICAgICAgICB4ci5HZXRBdHRyaWJ1dGUoInJlZiIpLAorICAgICAgICAgICAgb3V0IGZyb21Sb3csCisgICAgICAgICAgICBvdXQgZnJvbUNvbCwKKyAgICAgICAgICAgIG91dCB0b1JvdywKKyAgICAgICAgICAgIG91dCB0b0NvbCk7CisgICAgICAgIEV4Y2VsSHlwZXJMaW5rIGhsID0gbnVsbDsKKyAgICAgICAgaWYgKHhyLkdldEF0dHJpYnV0ZSgiaWQiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYVJlbGF0aW9uc2hpcHMpICE9IG51bGwpIHsKKyAgICAgICAgICB2YXIgcklkID0geHIuR2V0QXR0cmlidXRlKCJpZCIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hUmVsYXRpb25zaGlwcyk7CisgICAgICAgICAgdmFyIHVyaSA9IFBhcnQuR2V0UmVsYXRpb25zaGlwKHJJZCkuVGFyZ2V0VXJpOworCisgICAgICAgICAgLy8gR2V0IExvY2F0aW9uLCBpZiBhbnkuICBFUFBsdXMgQnVnIDE1NTE3CisgICAgICAgICAgdmFyIGxvY2F0aW9uID0geHIuR2V0QXR0cmlidXRlKCJsb2NhdGlvbiIpOworICAgICAgICAgIGxvY2F0aW9uID0gKHN0cmluZy5Jc051bGxPckVtcHR5KGxvY2F0aW9uKSkgPyAiIiA6ICIjIiArIGxvY2F0aW9uOworCisgICAgICAgICAgaWYgKHVyaS5Jc0Fic29sdXRlVXJpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBobCA9IG5ldyh1cmkuQWJzb2x1dGVVcmkgKyBsb2NhdGlvbik7CisgICAgICAgICAgICB9IGNhdGNoIHsKKyAgICAgICAgICAgICAgaGwgPSBuZXcodXJpLk9yaWdpbmFsU3RyaW5nICsgbG9jYXRpb24sIFVyaUtpbmQuQWJzb2x1dGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBobCA9IG5ldyh1cmkuT3JpZ2luYWxTdHJpbmcgKyBsb2NhdGlvbiwgVXJpS2luZC5SZWxhdGl2ZSk7CisgICAgICAgICAgfQorCisgICAgICAgICAgaGwuUklkID0gcklkOworICAgICAgICAgIFBhcnQuRGVsZXRlUmVsYXRpb25zaGlwKHJJZCk7IC8vRGVsZXRlIHRoZSByZWxhdGlvbnNoaXAsIGl0IGlzIHJlY3JlYXRlZCB3aGVuIHdlIHNhdmUgdGhlIHBhY2thZ2UuCisgICAgICAgIH0gZWxzZSBpZiAoeHIuR2V0QXR0cmlidXRlKCJsb2NhdGlvbiIpICE9IG51bGwpIHsKKyAgICAgICAgICBobCA9IG5ldyh4ci5HZXRBdHRyaWJ1dGUoImxvY2F0aW9uIiksIHhyLkdldEF0dHJpYnV0ZSgiZGlzcGxheSIpKTsKKyAgICAgICAgICBobC5Sb3dTcGFubiA9IHRvUm93IC0gZnJvbVJvdzsKKyAgICAgICAgICBobC5Db2xTcGFubiA9IHRvQ29sIC0gZnJvbUNvbDsKICAgICAgICAgfQogCi0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIFVyaSB0byB0aGUgd29ya3NoZWV0IHdpdGhpbiB0aGUgcGFja2FnZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBVcmkgV29ya3NoZWV0VXJpIHsgZ2V0IHsgcmV0dXJuIChfd29ya3NoZWV0VXJpKTsgfSB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBaaXAuWmlwUGFja2FnZVBhcnQgZm9yIHRoZSB3b3Jrc2hlZXQgd2l0aGluIHRoZSBwYWNrYWdlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBQYXJ0IHsgZ2V0IHsgcmV0dXJuIChfcGFja2FnZS5QYWNrYWdlLkdldFBhcnQoV29ya3NoZWV0VXJpKSk7IH0gfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgSUQgZm9yIHRoZSB3b3Jrc2hlZXQncyByZWxhdGlvbnNoaXAgd2l0aCB0aGUgd29ya2Jvb2sgaW4gdGhlIHBhY2thZ2UKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFJlbGF0aW9uc2hpcElEIHsgZ2V0IHsgcmV0dXJuIChfcmVsYXRpb25zaGlwSUQpOyB9IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgd29ya3NoZWV0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBpbnQgU2hlZXRJRCB7IGdldCB7IHJldHVybiAoX3NoZWV0SUQpOyB9IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHBvc2l0aW9uIG9mIHRoZSB3b3Jrc2hlZXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIGludCBQb3NpdGlvbklEIHsgZ2V0IHsgcmV0dXJuIChfcG9zaXRpb25JRCk7IH0gc2V0IHsgX3Bvc2l0aW9uSUQgPSB2YWx1ZTsgfSB9Ci0JCSNyZWdpb24gV29ya3NoZWV0IFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgCS8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBpbmRleCBpbiB0aGUgd29ya3NoZWV0cyBjb2xsZWN0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgSW5kZXggeyBnZXQgeyByZXR1cm4gKF9wb3NpdGlvbklEKTsgfSB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHJlc3MgZm9yIGF1dG9maWx0ZXIKLSAgICAgICAgLy8vIDxzZWVhbHNvIGNyZWY9IkV4Y2VsUmFuZ2VCYXNlLkF1dG9GaWx0ZXIiIC8+ICAgICAgICAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQWRkcmVzc0Jhc2UgQXV0b0ZpbHRlckFkZHJlc3MKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcgYWRkcmVzcyA9IEdldFhtbE5vZGVTdHJpbmcoImQ6YXV0b0ZpbHRlci9AcmVmIik7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gIiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3NCYXNlKGFkZHJlc3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiZDphdXRvRmlsdGVyL0ByZWYiLCB2YWx1ZS5BZGRyZXNzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIHR0ID0geHIuR2V0QXR0cmlidXRlKCJ0b29sdGlwIik7CisgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkodHQpKSB7CisgICAgICAgICAgaGwuVG9vbFRpcCA9IHR0OworICAgICAgICB9CisgICAgICAgIF9oeXBlckxpbmtzLlNldFZhbHVlKGZyb21Sb3csIGZyb21Db2wsIGhsKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIExvYWQgY2VsbHMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ4ciI+VGhlIHJlYWRlcjwvcGFyYW0+CisgIHByaXZhdGUgdm9pZCBMb2FkQ2VsbHMoWG1sVGV4dFJlYWRlciB4cikgeworICAgIC8vdmFyIGNlbGxMaXN0PW5ldyBMaXN0PElSYW5nZUlEPigpOworICAgIC8vdmFyIHJvd0xpc3QgPSBuZXcgTGlzdDxJUmFuZ2VJRD4oKTsKKyAgICAvL3ZhciBmb3JtdWxhTGlzdCA9IG5ldyBMaXN0PElSYW5nZUlEPigpOworICAgIFJlYWRVbnRpbCh4ciwgInNoZWV0RGF0YSIsICJtZXJnZUNlbGxzIiwgImh5cGVybGlua3MiLCAicm93QnJlYWtzIiwgImNvbEJyZWFrcyIpOworICAgIEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcyA9IG51bGw7CisgICAgc3RyaW5nIHR5cGUgPSAiIjsKKyAgICBpbnQgc3R5bGUgPSAwOworICAgIGludCByb3cgPSAwOworICAgIGludCBjb2wgPSAwOworICAgIHhyLlJlYWQoKTsKKworICAgIHdoaWxlICgheHIuRU9GKSB7CisgICAgICB3aGlsZSAoeHIuTm9kZVR5cGUgPT0gWG1sTm9kZVR5cGUuRW5kRWxlbWVudCkgeworICAgICAgICB4ci5SZWFkKCk7CisgICAgICB9CisgICAgICBpZiAoeHIuTG9jYWxOYW1lID09ICJyb3ciKSB7CisgICAgICAgIHZhciByID0geHIuR2V0QXR0cmlidXRlKCJyIik7CisgICAgICAgIGlmIChyID09IG51bGwpIHsKKyAgICAgICAgICByb3crKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICByb3cgPSBDb252ZXJ0LlRvSW50MzIocik7CiAgICAgICAgIH0KIAotICAgICAgICBpbnRlcm5hbCB2b2lkIENoZWNrU2hlZXRUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXMgaXMgRXhjZWxDaGFydHNoZWV0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IChuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJUaGlzIHByb3BlcnR5IG9yIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBhIENoYXJ0c2hlZXQiKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChEb0FkZFJvdyh4cikpIHsKKyAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgMCwgQWRkUm93KHhyLCByb3cpKTsKKyAgICAgICAgICBpZiAoeHIuR2V0QXR0cmlidXRlKCJzIikgIT0gbnVsbCkgeworICAgICAgICAgICAgX3N0eWxlcy5TZXRWYWx1ZShyb3csIDAsIGludC5QYXJzZSh4ci5HZXRBdHRyaWJ1dGUoInMiKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB4ci5SZWFkKCk7CisgICAgICB9IGVsc2UgaWYgKHhyLkxvY2FsTmFtZSA9PSAiYyIpIHsKKyAgICAgICAgLy9pZiAoY2VsbCAhPSBudWxsKSBjZWxsTGlzdC5BZGQoY2VsbCk7CisgICAgICAgIC8vY2VsbCA9IG5ldyBFeGNlbENlbGwodGhpcywgeHIuR2V0QXR0cmlidXRlKCJyIikpOworICAgICAgICB2YXIgciA9IHhyLkdldEF0dHJpYnV0ZSgiciIpOworICAgICAgICBpZiAociA9PSBudWxsKSB7CisgICAgICAgICAgLy9IYW5kbGUgY2VsbHMgd2l0aCBubyByZWZlcmVuY2UKKyAgICAgICAgICBjb2wrKzsKKyAgICAgICAgICBhZGRyZXNzID0gbmV3KHJvdywgY29sLCByb3csIGNvbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYWRkcmVzcyA9IG5ldyhyKTsKKyAgICAgICAgICBjb2wgPSBhZGRyZXNzLl9mcm9tQ29sOwogICAgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gUmV0dXJucyBhIEV4Y2VsV29ya3NoZWV0VmlldyBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIHNldCB0aGUgdmlldyBzdGF0ZSBwcm9wZXJ0aWVzIG9mIHRoZSB3b3Jrc2hlZXQKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIEV4Y2VsV29ya3NoZWV0VmlldyBWaWV3Ci0JCXsKLQkJCWdldAotCQkJewotCQkJCWlmIChfc2hlZXRWaWV3ID09IG51bGwpCi0JCQkJewotICAgICAgICAgICAgICAgICAgICBYbWxOb2RlIG5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6c2hlZXRWaWV3cy9kOnNoZWV0VmlldyIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJkOnNoZWV0Vmlld3MvZDpzaGVldFZpZXciKTsgLy90aGlzIG9uZSBzaG91bHMgYWx3YXlzIGV4aXN0LiBidXQgY2hlY2sgYW55d2F5Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOnNoZWV0Vmlld3MvZDpzaGVldFZpZXciLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBfc2hlZXRWaWV3ID0gbmV3IEV4Y2VsV29ya3NoZWV0VmlldyhOYW1lU3BhY2VNYW5hZ2VyLCBub2RlLCB0aGlzKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIChfc2hlZXRWaWV3KTsKLQkJCX0KLQkJfQorICAgICAgICAvL0RhdGV0eXBlCisgICAgICAgIGlmICh4ci5HZXRBdHRyaWJ1dGUoInQiKSAhPSBudWxsKSB7CisgICAgICAgICAgdHlwZSA9IHhyLkdldEF0dHJpYnV0ZSgidCIpOworICAgICAgICAgIF90eXBlcy5TZXRWYWx1ZShhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCB0eXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0eXBlID0gIiI7CisgICAgICAgIH0KKyAgICAgICAgLy9TdHlsZQorICAgICAgICBpZiAoeHIuR2V0QXR0cmlidXRlKCJzIikgIT0gbnVsbCkgeworICAgICAgICAgIHN0eWxlID0gaW50LlBhcnNlKHhyLkdldEF0dHJpYnV0ZSgicyIpKTsKKyAgICAgICAgICBfc3R5bGVzLlNldFZhbHVlKGFkZHJlc3MuX2Zyb21Sb3csIGFkZHJlc3MuX2Zyb21Db2wsIHN0eWxlKTsKKyAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKGFkZHJlc3MuX2Zyb21Sb3csIGFkZHJlc3MuX2Zyb21Db2wsIG51bGwpOyAvL1RPRE86QmV0dGVyIFBlcmZvcm1hbmNlID8/CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3R5bGUgPSAwOworICAgICAgICB9CisgICAgICAgIHhyLlJlYWQoKTsKKyAgICAgIH0gZWxzZSBpZiAoeHIuTG9jYWxOYW1lID09ICJ2IikgeworICAgICAgICBTZXRWYWx1ZUZyb21YbWwoeHIsIHR5cGUsIHN0eWxlLCBhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sKTsKIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBUaGUgd29ya3NoZWV0J3MgZGlzcGxheSBuYW1lIGFzIGl0IGFwcGVhcnMgb24gdGhlIHRhYgotCQkvLy8gPC9zdW1tYXJ5PgotCQlwdWJsaWMgc3RyaW5nIE5hbWUKLQkJewotCQkJZ2V0IHsgcmV0dXJuIChfbmFtZSk7IH0KLQkJCXNldAotCQkJewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBfbmFtZSkgcmV0dXJuOwotICAgICAgICAgICAgICAgIHZhbHVlPV9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuVmFsaWRhdGVGaXhTaGVldE5hbWUodmFsdWUpOwotICAgICAgICAgICAgICAgIGZvcmVhY2godmFyIHdzIGluIFdvcmtib29rLldvcmtzaGVldHMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZih3cy5Qb3NpdGlvbklEIT1Qb3NpdGlvbklEICYmIHdzLk5hbWUuRXF1YWxzKHZhbHVlLFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJXb3Jrc2hlZXQgbmFtZSBtdXN0IGJlIHVuaXF1ZSIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfcGFja2FnZS5Xb3JrYm9vay5TZXRYbWxOb2RlU3RyaW5nKHN0cmluZy5Gb3JtYXQoImQ6c2hlZXRzL2Q6c2hlZXRbQHNoZWV0SWQ9ezB9XS9AbmFtZSIsIF9zaGVldElEKSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIENoYW5nZU5hbWVzKHZhbHVlKTsKKyAgICAgICAgeHIuUmVhZCgpOworICAgICAgfSBlbHNlIGlmICh4ci5Mb2NhbE5hbWUgPT0gImYiKSB7CisgICAgICAgIHN0cmluZyB0ID0geHIuR2V0QXR0cmlidXRlKCJ0Iik7CisgICAgICAgIGlmICh0ID09IG51bGwpIHsKKyAgICAgICAgICBfZm9ybXVsYXMuU2V0VmFsdWUoYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fZnJvbUNvbCwgeHIuUmVhZEVsZW1lbnRDb250ZW50QXNTdHJpbmcoKSk7CisgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCBudWxsKTsKKyAgICAgICAgICAvL2Zvcm11bGFMaXN0LkFkZChjZWxsKTsKKyAgICAgICAgfSBlbHNlIGlmICh0ID09ICJzaGFyZWQiKSB7CisgICAgICAgICAgc3RyaW5nIHNpID0geHIuR2V0QXR0cmlidXRlKCJzaSIpOworICAgICAgICAgIGlmIChzaSAhPSBudWxsKSB7CisgICAgICAgICAgICB2YXIgc2ZJbmRleCA9IGludC5QYXJzZShzaSk7CisgICAgICAgICAgICBfZm9ybXVsYXMuU2V0VmFsdWUoYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fZnJvbUNvbCwgc2ZJbmRleCk7CisgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKGFkZHJlc3MuX2Zyb21Sb3csIGFkZHJlc3MuX2Zyb21Db2wsIG51bGwpOworICAgICAgICAgICAgc3RyaW5nIGZBZGRyZXNzID0geHIuR2V0QXR0cmlidXRlKCJyZWYiKTsKKyAgICAgICAgICAgIHN0cmluZyBmb3JtdWxhID0gQ29udmVydFV0aWwuRXhjZWxEZWNvZGVTdHJpbmcoeHIuUmVhZEVsZW1lbnRDb250ZW50QXNTdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAoZm9ybXVsYSAhPSAiIikgeworICAgICAgICAgICAgICBfc2hhcmVkRm9ybXVsYXMuQWRkKAorICAgICAgICAgICAgICAgICAgc2ZJbmRleCwKKyAgICAgICAgICAgICAgICAgIG5ldyhTb3VyY2VDb2RlVG9rZW5pemVyLkRlZmF1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgSW5kZXggPSBzZkluZGV4LAorICAgICAgICAgICAgICAgICAgICBGb3JtdWxhID0gZm9ybXVsYSwKKyAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyA9IGZBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBTdGFydFJvdyA9IGFkZHJlc3MuX2Zyb21Sb3csCisgICAgICAgICAgICAgICAgICAgIFN0YXJ0Q29sID0gYWRkcmVzcy5fZnJvbUNvbCwKKyAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4ci5SZWFkKCk7IC8vU29tZXRoaW5nIGlzIHdyb25nIGluIHRoZSBzaGVldCwgcmVhZCBuZXh0CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHQKKyAgICAgICAgICAgID09ICJhcnJheSIpIC8vVE9ETzogQXJyYXkgZnVuY3Rpb25zIGFyZSBub3Qgc3VwcG9ydCB5ZXQuIFJlYWQgdGhlIGZvcm11bGEgZm9yIHRoZSBzdGFydCBjZWxsIG9ubHkuCisgICAgICAgIHsKKyAgICAgICAgICBzdHJpbmcgYUFkZHJlc3MgPSB4ci5HZXRBdHRyaWJ1dGUoInJlZiIpOworICAgICAgICAgIEV4Y2VsUmFuZ2UgYWRkcmVzc1JhbmdlID0gbmV3IEV4Y2VsUmFuZ2UodGhpcywgYUFkZHJlc3MpOworICAgICAgICAgIHN0cmluZyBmb3JtdWxhID0geHIuUmVhZEVsZW1lbnRDb250ZW50QXNTdHJpbmcoKTsKKyAgICAgICAgICBib29sIGlzSW5kZXhNYXRjaEZvcm11bGEgPQorICAgICAgICAgICAgICBSZWdleC5Jc01hdGNoKGZvcm11bGEsIEAiSU5ERVhcKCIsIFJlZ2V4T3B0aW9ucy5JZ25vcmVDYXNlKQorICAgICAgICAgICAgICAgICAgJiYgUmVnZXguSXNNYXRjaChmb3JtdWxhLCBAIk1BVENIXCgiLCBSZWdleE9wdGlvbnMuSWdub3JlQ2FzZSkKKyAgICAgICAgICAgICAgICAgICYmICFhQWRkcmVzcy5Db250YWlucygiOiIpOworICAgICAgICAgIGlmIChpc0luZGV4TWF0Y2hGb3JtdWxhKSB7CisgICAgICAgICAgICBhZGRyZXNzUmFuZ2UuSXNBcnJheUZvcm11bGEgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGNvbEluZGV4ID0gYWRkcmVzc1JhbmdlLlN0YXJ0LkNvbHVtbjsKKyAgICAgICAgICAgICAgICBjb2xJbmRleCA8PSBhZGRyZXNzUmFuZ2UuRW5kLkNvbHVtbjsKKyAgICAgICAgICAgICAgICBjb2xJbmRleCsrKSB7CisgICAgICAgICAgICAgIGZvciAoaW50IHJvd0luZGV4ID0gYWRkcmVzc1JhbmdlLlN0YXJ0LlJvdzsKKyAgICAgICAgICAgICAgICAgIHJvd0luZGV4IDw9IGFkZHJlc3NSYW5nZS5FbmQuUm93OworICAgICAgICAgICAgICAgICAgcm93SW5kZXgrKykgeworICAgICAgICAgICAgICAgIHZhciBhZkluZGV4ID0gR2V0TWF4U2hhcmVGdW5jdGlvbkluZGV4KHRydWUpOworICAgICAgICAgICAgICAgIF9mb3JtdWxhcy5TZXRWYWx1ZShyb3dJbmRleCwgY29sSW5kZXgsIGFmSW5kZXgpOworICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93SW5kZXgsIGNvbEluZGV4LCBudWxsKTsKKyAgICAgICAgICAgICAgICBfc2hhcmVkRm9ybXVsYXMuQWRkKAorICAgICAgICAgICAgICAgICAgICBhZkluZGV4LAorICAgICAgICAgICAgICAgICAgICBuZXcoU291cmNlQ29kZVRva2VuaXplci5EZWZhdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgSW5kZXggPSBhZkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIEZvcm11bGEgPSBmb3JtdWxhLAorICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgPSBhQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICBTdGFydFJvdyA9IGFkZHJlc3MuX2Zyb21Sb3csCisgICAgICAgICAgICAgICAgICAgICAgU3RhcnRDb2wgPSBhZGRyZXNzLl9mcm9tQ29sLAorICAgICAgICAgICAgICAgICAgICAgIElzQXJyYXkgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkcmVzc1JhbmdlLklzQXJyYXlGb3JtdWxhID0gdHJ1ZTsKKyAgICAgICAgICAgIHZhciBhZkluZGV4ID0gR2V0TWF4U2hhcmVGdW5jdGlvbkluZGV4KHRydWUpOworICAgICAgICAgICAgZm9yIChpbnQgY29sSW5kZXggPSBhZGRyZXNzUmFuZ2UuU3RhcnQuQ29sdW1uOworICAgICAgICAgICAgICAgIGNvbEluZGV4IDw9IGFkZHJlc3NSYW5nZS5FbmQuQ29sdW1uOworICAgICAgICAgICAgICAgIGNvbEluZGV4KyspIHsKKyAgICAgICAgICAgICAgZm9yIChpbnQgcm93SW5kZXggPSBhZGRyZXNzUmFuZ2UuU3RhcnQuUm93OworICAgICAgICAgICAgICAgICAgcm93SW5kZXggPD0gYWRkcmVzc1JhbmdlLkVuZC5Sb3c7CisgICAgICAgICAgICAgICAgICByb3dJbmRleCsrKSB7CisgICAgICAgICAgICAgICAgX2Zvcm11bGFzLlNldFZhbHVlKHJvd0luZGV4LCBjb2xJbmRleCwgYWZJbmRleCk7CisgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShyb3dJbmRleCwgY29sSW5kZXgsIG51bGwpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfc2hhcmVkRm9ybXVsYXMuQWRkKAorICAgICAgICAgICAgICAgIGFmSW5kZXgsCisgICAgICAgICAgICAgICAgbmV3KFNvdXJjZUNvZGVUb2tlbml6ZXIuRGVmYXVsdCkgeworICAgICAgICAgICAgICAgICAgSW5kZXggPSBhZkluZGV4LAorICAgICAgICAgICAgICAgICAgRm9ybXVsYSA9IGZvcm11bGEsCisgICAgICAgICAgICAgICAgICBBZGRyZXNzID0gYUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICBTdGFydFJvdyA9IGFkZHJlc3MuX2Zyb21Sb3csCisgICAgICAgICAgICAgICAgICBTdGFydENvbCA9IGFkZHJlc3MuX2Zyb21Db2wsCisgICAgICAgICAgICAgICAgICBJc0FycmF5ID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSAvLyA/Pz8gc29tZSBvdGhlciB0eXBlCisgICAgICAgIHsKKyAgICAgICAgICB4ci5SZWFkKCk7IC8vU29tZXRoaW5nIGlzIHdyb25nIGluIHRoZSBzaGVldCwgcmVhZCBuZXh0CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoeHIuTG9jYWxOYW1lCisgICAgICAgICAgPT0gImlzIikgLy9JbmxpbmUgc3RyaW5nCisgICAgICB7CisgICAgICAgIHhyLlJlYWQoKTsKKyAgICAgICAgaWYgKHhyLkxvY2FsTmFtZSA9PSAidCIpIHsKKyAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKAorICAgICAgICAgICAgICBhZGRyZXNzLl9mcm9tUm93LAorICAgICAgICAgICAgICBhZGRyZXNzLl9mcm9tQ29sLAorICAgICAgICAgICAgICBDb252ZXJ0VXRpbC5FeGNlbERlY29kZVN0cmluZyh4ci5SZWFkRWxlbWVudENvbnRlbnRBc1N0cmluZygpKSk7CisgICAgICAgICAgLy9jZWxsLl92YWx1ZSA9IHhyLlJlYWRJbm5lclhtbCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUoYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fZnJvbUNvbCwgeHIuUmVhZE91dGVyWG1sKCkpOworICAgICAgICAgIF90eXBlcy5TZXRWYWx1ZShhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCAicnQiKTsKKyAgICAgICAgICBfZmxhZ3MuU2V0RmxhZ1ZhbHVlKGFkZHJlc3MuX2Zyb21Sb3csIGFkZHJlc3MuX2Zyb21Db2wsIHRydWUsIENlbGxGbGFncy5SaWNoVGV4dCk7CisgICAgICAgICAgLy9jZWxsLklzUmljaFRleHQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgLy9pZiAoY2VsbCAhPSBudWxsKSBjZWxsTGlzdC5BZGQoY2VsbCk7CiAKLSAgICAgICAgICAgICAgICBfbmFtZSA9IHZhbHVlOwotICAgICAgICAgICAgfQotCQl9CisgICAgLy9fY2VsbHMgPSBuZXcgUmFuZ2VDb2xsZWN0aW9uKGNlbGxMaXN0KTsKKyAgICAvL19yb3dzID0gbmV3IFJhbmdlQ29sbGVjdGlvbihyb3dMaXN0KTsKKyAgICAvL19mb3JtdWxhQ2VsbHMgPSBuZXcgUmFuZ2VDb2xsZWN0aW9uKGZvcm11bGFMaXN0KTsKKyAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBDaGFuZ2VOYW1lcyhzdHJpbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vUmVuYW1lcyBuYW1lIGluIHRoaXMgV29ya3NoZWV0OwotICAgICAgICAgICAgZm9yZWFjaCAodmFyIG4gaW4gV29ya2Jvb2suTmFtZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KG4uTmFtZUZvcm11bGEpICYmIG4uTmFtZVZhbHVlPT1udWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbi5DaGFuZ2VXb3Jrc2hlZXQoX25hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgd3MgaW4gV29ya2Jvb2suV29ya3NoZWV0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoISh3cyBpcyBFeGNlbENoYXJ0c2hlZXQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIG4gaW4gd3MuTmFtZXMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShuLk5hbWVGb3JtdWxhKSAmJiBuLk5hbWVWYWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4uQ2hhbmdlV29ya3NoZWV0KF9uYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbiBfbmFtZXM7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBuYW1lZCByYW5nZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24gTmFtZXMgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9uYW1lczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBJbmRpY2F0ZXMgaWYgdGhlIHdvcmtzaGVldCBpcyBoaWRkZW4gaW4gdGhlIHdvcmtib29rCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBlV29ya1NoZWV0SGlkZGVuIEhpZGRlbgotCQl7Ci0JCQlnZXQgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHN0YXRlPV9wYWNrYWdlLldvcmtib29rLkdldFhtbE5vZGVTdHJpbmcoc3RyaW5nLkZvcm1hdCgiZDpzaGVldHMvZDpzaGVldFtAc2hlZXRJZD17MH1dL0BzdGF0ZSIsIF9zaGVldElEKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlID09ICJoaWRkZW4iKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVXb3JrU2hlZXRIaWRkZW4uSGlkZGVuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PSAidmVyeUhpZGRlbiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVdvcmtTaGVldEhpZGRlbi5WZXJ5SGlkZGVuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZVdvcmtTaGVldEhpZGRlbi5WaXNpYmxlOwotICAgICAgICAgICAgfQotCQkJc2V0Ci0JCQl7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBlV29ya1NoZWV0SGlkZGVuLlZpc2libGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9wYWNrYWdlLldvcmtib29rLkRlbGV0ZU5vZGUoc3RyaW5nLkZvcm1hdCgiZDpzaGVldHMvZDpzaGVldFtAc2hlZXRJZD17MH1dL0BzdGF0ZSIsIF9zaGVldElEKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHY9dmFsdWUuVG9TdHJpbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHY9di5TdWJzdHJpbmcoMCwxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpK3YuU3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgX3BhY2thZ2UuV29ya2Jvb2suU2V0WG1sTm9kZVN0cmluZyhzdHJpbmcuRm9ybWF0KCJkOnNoZWV0cy9kOnNoZWV0W0BzaGVldElkPXswfV0vQHN0YXRlIiwgX3NoZWV0SUQpLHYgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCQkgICAgfQotCQl9Ci0gICAgICAgIGRvdWJsZSBfZGVmYXVsdFJvd0hlaWdodCA9IGRvdWJsZS5OYU47Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLQkJLy8vIEdldC9zZXQgdGhlIGRlZmF1bHQgaGVpZ2h0IG9mIGFsbCByb3dzIGluIHRoZSB3b3Jrc2hlZXQKLQkJLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZSBEZWZhdWx0Um93SGVpZ2h0Ci0JCXsKLQkJCWdldCAKLQkJCXsKLSAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOwotICAgICAgICAgICAgICAgIGlmIChkb3VibGUuSXNOYU4oX2RlZmF1bHRSb3dIZWlnaHQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2RlZmF1bHRSb3dIZWlnaHQgPSBHZXRYbWxOb2RlRG91YmxlKCJkOnNoZWV0Rm9ybWF0UHIvQGRlZmF1bHRSb3dIZWlnaHQiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoZG91YmxlLklzTmFOKF9kZWZhdWx0Um93SGVpZ2h0KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX2RlZmF1bHRSb3dIZWlnaHQgPSAxNTsgLy8gRXhjZWwgZGVmYXVsdCBoZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQkJCQlyZXR1cm4gX2RlZmF1bHRSb3dIZWlnaHQ7Ci0JCQl9Ci0JCQlzZXQKLQkJCXsKLSAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOwotICAgICAgICAgICAgICAgIF9kZWZhdWx0Um93SGVpZ2h0ID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiZDpzaGVldEZvcm1hdFByL0BkZWZhdWx0Um93SGVpZ2h0IiwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJkOnNoZWV0Rm9ybWF0UHIvQGN1c3RvbUhlaWdodCIsIHZhbHVlICE9IDE1KTsKKyAgcHJpdmF0ZSBib29sIERvQWRkUm93KFhtbFRleHRSZWFkZXIgeHIpIHsKKyAgICB2YXIgYyA9IHhyLkdldEF0dHJpYnV0ZSgiciIpID09IG51bGwgPyAwIDogMTsKKyAgICBpZiAoeHIuR2V0QXR0cmlidXRlKCJzcGFucyIpICE9IG51bGwpIHsKKyAgICAgIGMrKzsKKyAgICB9CisgICAgcmV0dXJuIHhyLkF0dHJpYnV0ZUNvdW50ID4gYzsKKyAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5Jc05hTihHZXRYbWxOb2RlRG91YmxlKCJkOnNoZWV0Rm9ybWF0UHIvQGRlZmF1bHRDb2xXaWR0aCIpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERlZmF1bHRDb2xXaWR0aCA9IDkuMTQwNjI1OwotICAgICAgICAgICAgICAgIH0KLQkJCX0KLQkJfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXQvc2V0IHRoZSBkZWZhdWx0IHdpZHRoIG9mIGFsbCByb3dzIGluIHRoZSB3b3Jrc2hlZXQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZSBEZWZhdWx0Q29sV2lkdGgKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBkb3VibGUgcmV0ID0gR2V0WG1sTm9kZURvdWJsZSgiZDpzaGVldEZvcm1hdFByL0BkZWZhdWx0Q29sV2lkdGgiKTsKLSAgICAgICAgICAgICAgICBpZiAoZG91YmxlLklzTmFOKHJldCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXQgPSA5LjE0MDYyNTsgLy8gRXhjZWwncyBkZWZhdWx0IHdpZHRoCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImQ6c2hlZXRGb3JtYXRQci9AZGVmYXVsdENvbFdpZHRoIiwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMb2FkIG1lcmdlZCBjZWxscworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InhyIj48L3BhcmFtPgorICBwcml2YXRlIHZvaWQgTG9hZE1lcmdlQ2VsbHMoWG1sVGV4dFJlYWRlciB4cikgeworICAgIGlmIChSZWFkVW50aWwoeHIsICJtZXJnZUNlbGxzIiwgImh5cGVybGlua3MiLCAicm93QnJlYWtzIiwgImNvbEJyZWFrcyIpICYmICF4ci5FT0YpIHsKKyAgICAgIHdoaWxlICh4ci5SZWFkKCkpIHsKKyAgICAgICAgaWYgKHhyLkxvY2FsTmFtZSAhPSAibWVyZ2VDZWxsIikgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICh4ci5Ob2RlVHlwZSA9PSBYbWxOb2RlVHlwZS5FbGVtZW50KSB7CisgICAgICAgICAgc3RyaW5nIGFkZHJlc3MgPSB4ci5HZXRBdHRyaWJ1dGUoInJlZiIpOworICAgICAgICAgIC8vaW50IGZyb21Sb3csIGZyb21Db2wsIHRvUm93LCB0b0NvbDsKKyAgICAgICAgICAvL0V4Y2VsQ2VsbEJhc2UuR2V0Um93Q29sRnJvbUFkZHJlc3MoYWRkcmVzcywgb3V0IGZyb21Sb3csIG91dCBmcm9tQ29sLCBvdXQgdG9Sb3csIG91dCB0b0NvbCk7CisgICAgICAgICAgLy9mb3IgKGludCByb3cgPSBmcm9tUm93OyByb3cgPD0gdG9Sb3c7IHJvdysrKQorICAgICAgICAgIC8veworICAgICAgICAgIC8vICAgIGZvciAoaW50IGNvbCA9IGZyb21Db2w7IGNvbCA8PSB0b0NvbDsgY29sKyspCisgICAgICAgICAgLy8gICAgeworICAgICAgICAgIC8vICAgICAgICBfZmxhZ3MuU2V0RmxhZ1ZhbHVlKHJvdywgY29sLCB0cnVlLENlbGxGbGFncy5NZXJnZWQpOworICAgICAgICAgIC8vICAgIH0KKyAgICAgICAgICAvL30KKyAgICAgICAgICAvL19tZXJnZWRDZWxscy5MaXN0LkFkZChhZGRyZXNzKTsKKyAgICAgICAgICBfbWVyZ2VkQ2VsbHMuQWRkKG5ldyBFeGNlbEFkZHJlc3MoYWRkcmVzcyksIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5Jc05hTihHZXRYbWxOb2RlRG91YmxlKCJkOnNoZWV0Rm9ybWF0UHIvQGRlZmF1bHRSb3dIZWlnaHQiKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEZWZhdWx0Um93SGVpZ2h0ID0gMTU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBVcGRhdGUgbWVyZ2VkIGNlbGxzCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ic3ciPlRoZSB3cml0ZXI8L3BhcmFtPgorICBwcml2YXRlIHZvaWQgVXBkYXRlTWVyZ2VkQ2VsbHMoU3RyZWFtV3JpdGVyIHN3KSB7CisgICAgc3cuV3JpdGUoIjxtZXJnZUNlbGxzPiIpOworICAgIGZvcmVhY2ggKHN0cmluZyBhZGRyZXNzIGluIF9tZXJnZWRDZWxscykgeworICAgICAgc3cuV3JpdGUoIjxtZXJnZUNlbGwgcmVmPVwiezB9XCIgLz4iLCBhZGRyZXNzKTsKKyAgICB9CisgICAgc3cuV3JpdGUoIjwvbWVyZ2VDZWxscz4iKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJlYWRzIGEgcm93IGZyb20gdGhlIFhNTCByZWFkZXIKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ4ciI+VGhlIHJlYWRlcjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij5UaGUgcm93IG51bWJlcjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHByaXZhdGUgUm93SW50ZXJuYWwgQWRkUm93KFhtbFRleHRSZWFkZXIgeHIsIGludCByb3cpIHsKKyAgICByZXR1cm4gbmV3KCkgeworICAgICAgQ29sbGFwc2VkID0KKyAgICAgICAgICAoeHIuR2V0QXR0cmlidXRlKCJjb2xsYXBzZWQiKSAhPSBudWxsICYmIHhyLkdldEF0dHJpYnV0ZSgiY29sbGFwc2VkIikgPT0gIjEiCisgICAgICAgICAgICAgID8gdHJ1ZQorICAgICAgICAgICAgICA6IGZhbHNlKSwKKyAgICAgIE91dGxpbmVMZXZlbCA9CisgICAgICAgICAgKHhyLkdldEF0dHJpYnV0ZSgib3V0bGluZUxldmVsIikgPT0gbnVsbAorICAgICAgICAgICAgICA/IChzaG9ydCkwCisgICAgICAgICAgICAgIDogc2hvcnQuUGFyc2UoeHIuR2V0QXR0cmlidXRlKCJvdXRsaW5lTGV2ZWwiKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpLAorICAgICAgSGVpZ2h0ID0KKyAgICAgICAgICAoeHIuR2V0QXR0cmlidXRlKCJodCIpID09IG51bGwKKyAgICAgICAgICAgICAgPyAtMQorICAgICAgICAgICAgICA6IGRvdWJsZS5QYXJzZSh4ci5HZXRBdHRyaWJ1dGUoImh0IiksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKSwKKyAgICAgIEhpZGRlbiA9CisgICAgICAgICAgKHhyLkdldEF0dHJpYnV0ZSgiaGlkZGVuIikgIT0gbnVsbCAmJiB4ci5HZXRBdHRyaWJ1dGUoImhpZGRlbiIpID09ICIxIiA/IHRydWUgOiBmYWxzZSksCisgICAgICBQaG9uZXRpYyA9IHhyLkdldEF0dHJpYnV0ZSgicGgiKSAhPSBudWxsICYmIHhyLkdldEF0dHJpYnV0ZSgicGgiKSA9PSAiMSIgPyB0cnVlIDogZmFsc2UsCisgICAgICBDdXN0b21IZWlnaHQgPQorICAgICAgICAgIHhyLkdldEF0dHJpYnV0ZSgiY3VzdG9tSGVpZ2h0IikgPT0gbnVsbCA/IGZhbHNlIDogeHIuR2V0QXR0cmlidXRlKCJjdXN0b21IZWlnaHQiKSA9PSAiMSIsCisgICAgfTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERhdGVUaW1lIF9leGNlbEVwb2NoID0gbmV3KDE4OTksIDEyLCAzMCk7CisKKyAgcHVibGljIHN0YXRpYyBEYXRlVGltZSBJbmNvcnJlY3REdXJhdGlvbkZyb21PYURhdGUoZG91YmxlIHZhbHVlKSB7CisgICAgLy8gVGhpcyBiZWhhdmlvciBpcyB3cm9uZy4gUmVhbCBPQURhdGUgdmFsdWVzIGhhdmUgYSBkaXNjb250aW51aXR5IG9uIDMwIERlY2VtYmVyIDE4OTkuCisgICAgLy8gRm9yIHJlYWwgT0FEYXRlIHZhbHVlcywgdGhlIG5lZ2F0aXZlIHNpZ24gYXBwbGllcyBvbmx5IHRvIHRoZSBpbnRlZ2VyIHBvcnRpb24gb2YKKyAgICAvLyB0aGUgZmxvYXQsICpub3QqIHRvIHRoZSBkZWNpbWFsIHBvcnRpb24uIEZvciBleGFtcGxlLCAtMC41IGFuZCAwLjUgYm90aCByZWZlciB0byB0aGUKKyAgICAvLyBzYW1lIGRhdGUsIGFuZCAtMS41IGlzIGFjdHVhbGx5IDE4OTktMTItMjkgMTI6MDAgKDEgZGF5IGJlZm9yZSAxODk5LTEyLTMwIDAwOjAwCisgICAgLy8gcGx1cyAwLjUgZGF5cyksICpub3QqIDE4OTktMTItMjggMTI6MDAgKDEuNSBkYXlzIGJlZm9yZSAxODk5LTEyLTMwIDAwOjAwKS4KKyAgICAvLworICAgIC8vIFVuZm9ydHVuYXRlbHksIEFwcFNoZWV0J3MgZHVyYXRpb24taGFuZGxpbmcgY29kZSBnZXRzIHRoaXMgdmVyeSB3cm9uZywgYW5kIHRyZWF0cyB0aGUKKyAgICAvLyBkdXJhdGlvbiBhcyB0aGUgb2Zmc2V0IGZyb20gMTg5OS0xMi0zMCAwMDowMC4gVGhpcyBpcyBjb3JyZWN0IGZvciBwb3NpdGl2ZSBkdXJhdGlvbnMsCisgICAgLy8gYnV0IGl0J3Mgd3JvbmcgZm9yIG5lZ2F0aXZlIGR1cmF0aW9ucy4gVGhpcyBjb2RlIHRyaWVzIHRvIGZpeCB0aGUgYnVnIHRoYXQgZXhpc3RzIGluCisgICAgLy8gQXBwU2hlZXQncyBkdXJhdGlvbi1oYW5kbGluZyBjb2RlIGhlcmUsIGFuZCBpdCBzdWNjZWVkcyBpbiBzb21lIGNhc2VzIGFuZCBmYWlscyBpbgorICAgIC8vIG90aGVycy4KKyAgICAvLworICAgIC8vIFRoaXMgY29kZSBhbHNvIGJyZWFrcyBkYXRlL3RpbWUgaGFuZGxpbmcgZm9yIGRhdGVzIGJlZm9yZSAxODk5LTEyLTMwIDAwOjAwIGluIHNvbWUKKyAgICAvLyBjYXNlcy4gU3BlY2lmaWNhbGx5LCBkYXRlcyBlbmQgdXAgYmVpbmcgb2Zmc2V0IGJ5IG9uZSBkYXkuCisgICAgLy8KKyAgICAvLyBSZWdhcmRsZXNzLCBjaGFuZ2luZyB0aGlzIGJlaGF2aW9yIGlzIHJpc2t5LCBzbyB0aGlzIGNvZGUgc2ltcGx5IHJlcGxpY2F0ZXMgdGhlCisgICAgLy8gZXhpc3RpbmcgYmVoYXZpb3IgZm9yCisgICAgaWYgKHZhbHVlID49IDApIHsKKyAgICAgIHJldHVybiBEYXRlVGltZS5Gcm9tT0FEYXRlKHZhbHVlKTsKKyAgICB9CisgICAgLy8gVGhpcyBsb29rcyBsaWtlIGEgdmVyeSBjb21wbGljYXRlZCB3YXkgdG8gY2FsbCBUaW1lU3Bhbi5Gcm9tRGF5cyh2YWx1ZSksIGJ1dAorICAgIC8vIFRpbWVTcGFuLkZyb21EYXlzIGFjdHVhbGx5IG9ubHkgZ3VhcmFudGVlcyBtaWxsaXNlY29uZCBwcmVjaXNpb24sIGFuZCBjcml0aWNhbGx5CisgICAgLy8gcm91bmRpbmcgaXMgZGlmZmVyZW50IG9uIC5ORVQgQ29yZSwgcmVzdWx0aW5nIGluIHZhbHVlcyBsaWtlIChlLmcuKSAzOjE1OjAwIGJlaW5nCisgICAgLy8gaW5jb3JyZWN0bHkgcm91bmRlZC4KKyAgICB2YXIgb2Zmc2V0ID0gRGF0ZVRpbWUuRnJvbU9BRGF0ZSgtdmFsdWUpIC0gX2V4Y2VsRXBvY2g7CisgICAgcmV0dXJuIF9leGNlbEVwb2NoIC0gb2Zmc2V0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIFNldFZhbHVlRnJvbVhtbChYbWxUZXh0UmVhZGVyIHhyLCBzdHJpbmcgdHlwZSwgaW50IHN0eWxlSWQsIGludCByb3csIGludCBjb2wpIHsKKyAgICAvL1htbE5vZGUgdm5vZGUgPSBjb2xOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6diIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgIC8vaWYgKHZub2RlID09IG51bGwpIHJldHVybiBudWxsOworICAgIGlmICh0eXBlID09ICJzIikgeworICAgICAgaW50IGl4ID0geHIuUmVhZEVsZW1lbnRDb250ZW50QXNJbnQoKTsKKworICAgICAgLy8gVGVtcG9yYXJ5IGRlYnVnZ2luZyBjb2RlIHRvIGxvY2F0ZSBpbnRlcm1pdHRlbnQgJ0luZGV4IHdhcyBvdXQgb2YgcmFuZ2UnIGV4Y2VwdGlvbi4KKyAgICAgIGlmIChpeCA8IDApIHsKKyAgICAgICAgdGhyb3cgbmV3KAorICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgICAiUmVhZEVsZW1lbnRDb250ZW50QXNJbnQgcmV0dXJuZWQgdmFsdWUgJ3swfScgd2hpY2ggaXMgbGVzcyB0aGFuIHplcm8uIiwKKyAgICAgICAgICAgICAgICBpeCkpOworICAgICAgfQorICAgICAgaWYgKGl4ID49IF9wYWNrYWdlLldvcmtib29rLl9zaGFyZWRTdHJpbmdzTGlzdC5Db3VudCkgeworICAgICAgICB0aHJvdyBuZXcoCisgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAgICJSZWFkRWxlbWVudENvbnRlbnRBc0ludCByZXR1cm5lZCBpbmRleCB2YWx1ZSAnezB9JyB3aGljaCBpcyBncmVhdGVyIHRoYW4gX3NoYXJlZFN0cmluZ3NMaXN0IGNvdW50IG9mIHsxfS4iLAorICAgICAgICAgICAgICAgIGl4LAorICAgICAgICAgICAgICAgIF9wYWNrYWdlLldvcmtib29rLl9zaGFyZWRTdHJpbmdzTGlzdC5Db3VudCkpOworICAgICAgfQorCisgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCBfcGFja2FnZS5Xb3JrYm9vay5fc2hhcmVkU3RyaW5nc0xpc3RbaXhdLlRleHQpOworICAgICAgaWYgKF9wYWNrYWdlLldvcmtib29rLl9zaGFyZWRTdHJpbmdzTGlzdFtpeF0uaXNSaWNoVGV4dCkgeworICAgICAgICBfZmxhZ3MuU2V0RmxhZ1ZhbHVlKHJvdywgY29sLCB0cnVlLCBDZWxsRmxhZ3MuUmljaFRleHQpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZSA9PSAic3RyIikgeworICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgQ29udmVydFV0aWwuRXhjZWxEZWNvZGVTdHJpbmcoeHIuUmVhZEVsZW1lbnRDb250ZW50QXNTdHJpbmcoKSkpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSAiYiIpIHsKKyAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsICh4ci5SZWFkRWxlbWVudENvbnRlbnRBc1N0cmluZygpICE9ICIwIikpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSAiZSIpIHsKKyAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIEdldEVycm9yVHlwZSh4ci5SZWFkRWxlbWVudENvbnRlbnRBc1N0cmluZygpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cmluZyB2ID0geHIuUmVhZEVsZW1lbnRDb250ZW50QXNTdHJpbmcoKTsKKyAgICAgIHZhciBuZiA9IFdvcmtib29rLlN0eWxlcy5DZWxsWGZzW3N0eWxlSWRdLk51bWJlckZvcm1hdElkOworICAgICAgaWYgKChuZiA+PSAyMCAmJiBuZiA8PSAyMSkKKyAgICAgICAgICB8fCAobmYgPj0gNDUKKyAgICAgICAgICAgICAgICAgICYmIG5mCisgICAgICAgICAgICAgICAgICAgICAgPD0gNDcpKSAvLyBEdXJhdGlvbgorICAgICAgeworICAgICAgICBkb3VibGUgcmVzOworICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKHYsIE51bWJlclN0eWxlcy5BbnksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCByZXMpKSB7CisgICAgICAgICAgaWYgKFdvcmtib29rLkRhdGUxOTA0KSB7CisgICAgICAgICAgICByZXMgKz0gRXhjZWxXb3JrYm9vay5fZGF0ZTE5MDRPZmZzZXQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChyZXMgPj0gLTY1NzQzNS4wICYmIHJlcyA8IDI5NTg0NjUuOTk5OTk5OSkgeworICAgICAgICAgICAgLy8gR2V0IHRoZSBEdXJhdGlvbiB2YWx1ZSBleHByZXNzZWQgYXMgYSBEYXRlVGltZS4KKyAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIEluY29ycmVjdER1cmF0aW9uRnJvbU9hRGF0ZShyZXMpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ29wZSB3aXRoIEdvb2dsZSBTaGVldHMgZXhwb3J0IG9mIGNlbGxzIGhhdmluZyBhIGZvcm11bGEuCisgICAgICAgICAgICAvLyBSYXRoZXIgdGhhbiBleHBvcnRpbmcgdGhlIG5hdGl2ZSB2YWx1ZSwgdGhleSBleHBvcnQgdGhlIGZvcm1hdHRlZCB2YWx1ZS4KKyAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIHYpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBDb3BlIHdpdGggR29vZ2xlIFNoZWV0cyBleHBvcnQgb2YgY2VsbHMgaGF2aW5nIGEgZm9ybXVsYS4KKyAgICAgICAgICAvLyBSYXRoZXIgdGhhbiBleHBvcnRpbmcgdGhlIG5hdGl2ZSB2YWx1ZSwgdGhleSBleHBvcnQgdGhlIGZvcm1hdHRlZCB2YWx1ZS4KKyAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCB2KTsKICAgICAgICAgfQotICAgICAgICAvKiogPG91dGxpbmVQciBhcHBseVN0eWxlcz0iMSIgc3VtbWFyeUJlbG93PSIwIiBzdW1tYXJ5UmlnaHQ9IjAiIC8+ICoqLwotICAgICAgICBjb25zdCBzdHJpbmcgb3V0TGluZVN1bW1hcnlCZWxvd1BhdGggPSAiZDpzaGVldFByL2Q6b3V0bGluZVByL0BzdW1tYXJ5QmVsb3ciOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTdW1tYXJ5IHJvd3MgYmVsb3cgZGV0YWlscyAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgT3V0TGluZVN1bW1hcnlCZWxvdwotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2wob3V0TGluZVN1bW1hcnlCZWxvd1BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKG91dExpbmVTdW1tYXJ5QmVsb3dQYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7Ci0gICAgICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKChuZiA+PSAxNCAmJiBuZiA8PSAxOSkKKyAgICAgICAgICB8fCAobmYKKyAgICAgICAgICAgICAgICAgID09IDIyKSkgLy8gRGF0ZVRpbWUKKyAgICAgIHsKKyAgICAgICAgZG91YmxlIHJlczsKKyAgICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZSh2LCBOdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgcmVzKSkgeworICAgICAgICAgIGlmIChXb3JrYm9vay5EYXRlMTkwNCkgeworICAgICAgICAgICAgcmVzICs9IEV4Y2VsV29ya2Jvb2suX2RhdGUxOTA0T2Zmc2V0OworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocmVzID49IC02NTc0MzUuMCAmJiByZXMgPCAyOTU4NDY1Ljk5OTk5OTkpIHsKKyAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIERhdGVUaW1lLkZyb21PQURhdGUocmVzKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENvcGUgd2l0aCBHb29nbGUgU2hlZXRzIGV4cG9ydCBvZiBjZWxscyBoYXZpbmcgYSBmb3JtdWxhLgorICAgICAgICAgICAgLy8gUmF0aGVyIHRoYW4gZXhwb3J0aW5nIHRoZSBuYXRpdmUgdmFsdWUsIHRoZXkgZXhwb3J0IHRoZSBmb3JtYXR0ZWQgdmFsdWUuCisgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCB2KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gQ29wZSB3aXRoIEdvb2dsZSBTaGVldHMgZXhwb3J0IG9mIGNlbGxzIGhhdmluZyBhIGZvcm11bGEuCisgICAgICAgICAgLy8gUmF0aGVyIHRoYW4gZXhwb3J0aW5nIHRoZSBuYXRpdmUgdmFsdWUsIHRoZXkgZXhwb3J0IHRoZSBmb3JtYXR0ZWQgdmFsdWUuCisgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgdik7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIG91dExpbmVTdW1tYXJ5UmlnaHRQYXRoID0gImQ6c2hlZXRQci9kOm91dGxpbmVQci9Ac3VtbWFyeVJpZ2h0IjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3VtbWFyeSByb3dzIHRvIHJpZ2h0IG9mIGRldGFpbHMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgT3V0TGluZVN1bW1hcnlSaWdodAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChvdXRMaW5lU3VtbWFyeVJpZ2h0UGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcob3V0TGluZVN1bW1hcnlSaWdodFBhdGgsIHZhbHVlID8gIjEiIDogIjAiKTsKLSAgICAgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRvdWJsZSBkOworICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKHYsIE51bWJlclN0eWxlcy5BbnksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCBkKSkgeworICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIGQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIENvcGUgd2l0aCBHb29nbGUgU2hlZXRzIGV4cG9ydCBvZiBjZWxscyBoYXZpbmcgYSBmb3JtdWxhLgorICAgICAgICAgIC8vIFJhdGhlciB0aGFuIGV4cG9ydGluZyB0aGUgbmF0aXZlIHZhbHVlLCB0aGV5IGV4cG9ydCB0aGUgZm9ybWF0dGVkIHZhbHVlLgorICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIHYpOworCisgICAgICAgICAgLy9fdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCBkb3VibGUuTmFOKTsKICAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgb3V0TGluZUFwcGx5U3R5bGVQYXRoID0gImQ6c2hlZXRQci9kOm91dGxpbmVQci9AYXBwbHlTdHlsZXMiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBdXRvbWF0aWMgc3R5bGVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIE91dExpbmVBcHBseVN0eWxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKG91dExpbmVBcHBseVN0eWxlUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcob3V0TGluZUFwcGx5U3R5bGVQYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7Ci0gICAgICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBvYmplY3QgR2V0RXJyb3JUeXBlKHN0cmluZyB2KSB7CisgICAgcmV0dXJuIEV4Y2VsRXJyb3JWYWx1ZS5QYXJzZSh2LlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgIC8vc3dpdGNoKHYuVG9VcHBlcigpKQorICAgIC8veworICAgIC8vICAgIGNhc2UgIiNESVYvMCEiOgorICAgIC8vICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JWYWx1ZS5jcmUoZUVycm9yVHlwZS5EaXYwKTsKKyAgICAvLyAgICBjYXNlICIjUkVGISI6CisgICAgLy8gICAgICAgIHJldHVybiBuZXcgRXhjZWxFcnJvclZhbHVlKGVFcnJvclR5cGUuUmVmKTsKKyAgICAvLyAgICBjYXNlICIjTi9BIjoKKyAgICAvLyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yVmFsdWUoZUVycm9yVHlwZS5OQSk7CisgICAgLy8gICAgY2FzZSAiI05BTUU/IjoKKyAgICAvLyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yVmFsdWUoZUVycm9yVHlwZS5OYW1lKTsKKyAgICAvLyAgICBjYXNlICIjTlVMTCEiOgorICAgIC8vICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JWYWx1ZShlRXJyb3JUeXBlLk51bGwpOworICAgIC8vICAgIGNhc2UgIiNOVU0hIjoKKyAgICAvLyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yVmFsdWUoZUVycm9yVHlwZS5OdW0pOworICAgIC8vICAgIGRlZmF1bHQ6CisgICAgLy8gICAgICAgIHJldHVybiBuZXcgRXhjZWxFcnJvclZhbHVlKGVFcnJvclR5cGUuVmFsdWUpOworICAgIC8vfQorICB9CisKKyAgLy9wcml2YXRlIHN0cmluZyBHZXRTaGFyZWRTdHJpbmcoaW50IHN0cmluZ0lEKQorICAvL3sKKyAgLy8gICAgc3RyaW5nIHJldFZhbHVlID0gbnVsbDsKKyAgLy8gICAgWG1sTm9kZUxpc3Qgc3RyaW5nTm9kZXMgPSB4bFBhY2thZ2UuV29ya2Jvb2suU2hhcmVkU3RyaW5nc1htbC5TZWxlY3ROb2RlcyhzdHJpbmcuRm9ybWF0KCIvL2Q6c2kiLCBzdHJpbmdJRCksIE5hbWVTcGFjZU1hbmFnZXIpOworICAvLyAgICBYbWxOb2RlIHN0cmluZ05vZGUgPSBzdHJpbmdOb2Rlc1tzdHJpbmdJRF07CisgIC8vICAgIGlmIChzdHJpbmdOb2RlICE9IG51bGwpCisgIC8vICAgICAgICByZXRWYWx1ZSA9IHN0cmluZ05vZGUuSW5uZXJUZXh0OworICAvLyAgICByZXR1cm4gKHJldFZhbHVlKTsKKyAgLy99CisKKworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgcmVmZXJlbmNlIHRvIHRoZSBoZWFkZXIgYW5kIGZvb3RlciBjbGFzcyB3aGljaCBhbGxvd3MgeW91IHRvCisgIC8vLyBzZXQgdGhlIGhlYWRlciBhbmQgZm9vdGVyIGZvciBhbGwgb2RkLCBldmVuIGFuZCBmaXJzdCBwYWdlcyBvZiB0aGUgd29ya3NoZWV0CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmVtYXJrcz4KKyAgLy8vIFRvIGZvcm1hdCB0aGUgdGV4dCB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGZvcm1hdAorICAvLy8gPGxpc3QgdHlwZT0idGFibGUiPgorICAvLy8gPGxpc3RoZWFkZXI+PHRlcm0+UHJlZml4PC90ZXJtPjxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+PC9saXN0aGVhZGVyPgorICAvLy8gPGl0ZW0+PHRlcm0+JmFtcDtVPC90ZXJtPjxkZXNjcmlwdGlvbj5VbmRlcmxpbmVkPC9kZXNjcmlwdGlvbj48L2l0ZW0+CisgIC8vLyA8aXRlbT48dGVybT4mYW1wO0U8L3Rlcm0+PGRlc2NyaXB0aW9uPkRvdWJsZSBVbmRlcmxpbmU8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KKyAgLy8vIDxpdGVtPjx0ZXJtPiZhbXA7Szp4eHh4eHg8L3Rlcm0+PGRlc2NyaXB0aW9uPkNvbG9yLiBleCAmYW1wO0s6RkYwMDAwIGZvciByZWQ8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KKyAgLy8vIDxpdGVtPjx0ZXJtPiZhbXA7IkZvbnQsUmVndWxhciBCb2xkIEl0YWxpYyI8L3Rlcm0+PGRlc2NyaXB0aW9uPkNoYW5nZXMgdGhlIGZvbnQuIFJlZ3VsYXIgb3IgQm9sZCBvciBJdGFsaWMgb3IgQm9sZCBJdGFsaWMgY2FuIGJlIHVzZWQuIGV4ICZhbXA7IkFyaWFsLEJvbGQgSXRhbGljIjwvZGVzY3JpcHRpb24+PC9pdGVtPgorICAvLy8gPGl0ZW0+PHRlcm0+JmFtcDtubjwvdGVybT48ZGVzY3JpcHRpb24+Q2hhbmdlIGZvbnQgc2l6ZS4gbm4gaXMgYW4gaW50ZWdlci4gZXggJmFtcDsyNDwvZGVzY3JpcHRpb24+PC9pdGVtPgorICAvLy8gPGl0ZW0+PHRlcm0+JmFtcDtHPC90ZXJtPjxkZXNjcmlwdGlvbj5QbGFjZWhvbGRlciBmb3IgaW1hZ2VzLiBJbWFnZXMgY2FuIG5vdCBiZSBhZGRlZCBieSB0aGUgbGlicmFyeSwgYnV0IGl0cyBwb3NzaWJsZSB0byB1c2UgaW4gYSB0ZW1wbGF0ZS48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KKyAgLy8vIDwvbGlzdD4KKyAgLy8vIDwvcmVtYXJrcz4KKyAgcHVibGljIEV4Y2VsSGVhZGVyRm9vdGVyIEhlYWRlckZvb3RlciB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfaGVhZGVyRm9vdGVyID09IG51bGwpIHsKKyAgICAgICAgWG1sTm9kZSBoZWFkZXJGb290ZXJOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOmhlYWRlckZvb3RlciIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICBpZiAoaGVhZGVyRm9vdGVyTm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgaGVhZGVyRm9vdGVyTm9kZSA9IENyZWF0ZU5vZGUoImQ6aGVhZGVyRm9vdGVyIik7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIHRhYkNvbG9yUGF0aCA9ICJkOnNoZWV0UHIvZDp0YWJDb2xvci9AcmdiIjsKLSAgICAgICAgY29uc3Qgc3RyaW5nIGNvZGVNb2R1bGVOYW1lUGF0aCA9ICJkOnNoZWV0UHIvQGNvZGVOYW1lIjsKLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIENvZGVNb2R1bGVOYW1lCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKGNvZGVNb2R1bGVOYW1lUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKGNvZGVNb2R1bGVOYW1lUGF0aCwgdmFsdWUpOwotICAgICAgICAgICAgfQorICAgICAgICBfaGVhZGVyRm9vdGVyID0gbmV3KE5hbWVTcGFjZU1hbmFnZXIsIGhlYWRlckZvb3Rlck5vZGUsIHRoaXMpOworICAgICAgfQorICAgICAgcmV0dXJuIChfaGVhZGVyRm9vdGVyKTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQcmludGVyIHNldHRpbmdzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFByaW50ZXJTZXR0aW5ncyBQcmludGVyU2V0dGluZ3MgeworICAgIGdldCB7CisgICAgICB2YXIgcHMgPSBuZXcgRXhjZWxQcmludGVyU2V0dGluZ3MoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSwgdGhpcyk7CisgICAgICBwcy5TY2hlbWFOb2RlT3JkZXIgPSBTY2hlbWFOb2RlT3JkZXI7CisgICAgICByZXR1cm4gcHM7CisgICAgfQorICB9CisKKyAgLy8vLy8gPHN1bW1hcnk+CisgIC8vLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBhbiBpbmRpdmlkdWFsIGNlbGwgd2l0aGluIHRoZSB3b3Jrc2hlZXQuCisgIC8vLy8vIDwvc3VtbWFyeT4KKyAgLy8vLy8gPHBhcmFtIG5hbWU9InJvdyI+VGhlIHJvdyBudW1iZXIgaW4gdGhlIHdvcmtzaGVldDwvcGFyYW0+CisgIC8vLy8vIDxwYXJhbSBuYW1lPSJjb2wiPlRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgorICAvLy8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIC8vaW50ZXJuYWwgRXhjZWxDZWxsIENlbGwoaW50IHJvdywgaW50IGNvbCkKKyAgLy97CisgIC8vICAgIHJldHVybiBuZXcgRXhjZWxDZWxsKF92YWx1ZXMsIHJvdywgY29sKTsKKyAgLy99CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBhIHJhbmdlIG9mIGNlbGxzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFJhbmdlIENlbGxzIHsKKyAgICBnZXQgeworICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgIHJldHVybiBuZXcodGhpcywgMSwgMSwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHNlbGVjdGVkIHJhbmdlIG9mIGNlbGxzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFJhbmdlIFNlbGVjdGVkUmFuZ2UgeworICAgIGdldCB7CisgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgcmV0dXJuIG5ldyh0aGlzLCBWaWV3LlNlbGVjdGVkUmFuZ2UpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgTWVyZ2VDZWxsc0NvbGxlY3Rpb24gX21lcmdlZENlbGxzID0gbmV3KCk7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcmVzc2VzIHRvIG1lcmdlZCByYW5nZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIE1lcmdlQ2VsbHNDb2xsZWN0aW9uIE1lcmdlZENlbGxzIHsKKyAgICBnZXQgeworICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgIHJldHVybiBfbWVyZ2VkQ2VsbHM7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIGFuIGluZGl2aWR1YWwgcm93IHdpdGhpbiB0aGUgd29ya3NoZWV0IHNvIHlvdSBjYW4gc2V0IGl0cyBwcm9wZXJ0aWVzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+VGhlIHJvdyBudW1iZXIgaW4gdGhlIHdvcmtzaGVldDwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFJvdyBSb3coaW50IHJvdykgeworICAgIC8vRXhjZWxSb3cgcjsKKyAgICAvL3Vsb25nIGlkID0gRXhjZWxSb3cuR2V0Um93SUQoX3NoZWV0SUQsIHJvdyk7CisgICAgLy9UT0RPOiBGaXhhLgorICAgIC8vdmFyIHYgPSBfdmFsdWVzLkdldFZhbHVlKHJvdywgMCk7CisgICAgLy9pZiAodiE9bnVsbCkKKyAgICAvL3sKKyAgICAvLyAgICB2YXIgcmk9KFJvd0ludGVybmFsKXY7CisgICAgLy8gICAgciA9IG5ldyBFeGNlbFJvdyh0aGlzLCByb3cpCisgICAgLy99CisgICAgLy9lbHNlCisgICAgLy97CisgICAgLy9yID0gbmV3IEV4Y2VsUm93KHRoaXMsIHJvdyk7CisgICAgLy9fdmFsdWVzLlNldFZhbHVlKHJvdywgMCwgcik7CisgICAgLy9fcm93cy5BZGQocik7CisgICAgLy99CisgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICBpZiAocm93IDwgMSB8fCByb3cgPiBFeGNlbFBhY2thZ2UuTWF4Um93cykgeworICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiUm93IG51bWJlciBvdXQgb2YgYm91bmRzIikpOworICAgIH0KKyAgICByZXR1cm4gbmV3KHRoaXMsIHJvdyk7CisgICAgLy9yZXR1cm4gcjsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBhbiBpbmRpdmlkdWFsIGNvbHVtbiB3aXRoaW4gdGhlIHdvcmtzaGVldCBzbyB5b3UgY2FuIHNldCBpdHMgcHJvcGVydGllcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2wiPlRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxDb2x1bW4gQ29sdW1uKGludCBjb2wpIHsKKyAgICBDaGVja1NoZWV0VHlwZSgpOworICAgIGlmIChjb2wgPCAxIHx8IGNvbCA+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSB7CisgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJDb2x1bW4gbnVtYmVyIG91dCBvZiBib3VuZHMiKSk7CisgICAgfQorICAgIHZhciBjb2x1bW4gPSBfdmFsdWVzLkdldFZhbHVlKDAsIGNvbCkgYXMgRXhjZWxDb2x1bW47CisgICAgaWYgKGNvbHVtbiAhPSBudWxsKSB7CisgICAgICBpZiAoY29sdW1uLkNvbHVtbk1pbiAhPSBjb2x1bW4uQ29sdW1uTWF4KSB7CisgICAgICAgIGludCBtYXhDb2wgPSBjb2x1bW4uQ29sdW1uTWF4OworICAgICAgICBjb2x1bW4uQ29sdW1uTWF4ID0gY29sOworICAgICAgICBFeGNlbENvbHVtbiBjb3B5ID0gQ29weUNvbHVtbihjb2x1bW4sIGNvbCArIDEsIG1heENvbCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGludCByID0gMCwKKyAgICAgICAgICBjID0gY29sOworICAgICAgaWYgKF92YWx1ZXMuUHJldkNlbGwocmVmIHIsIHJlZiBjKSkgeworICAgICAgICBjb2x1bW4gPSBfdmFsdWVzLkdldFZhbHVlKDAsIGMpIGFzIEV4Y2VsQ29sdW1uOworICAgICAgICBpbnQgbWF4Q29sID0gY29sdW1uLkNvbHVtbk1heDsKKyAgICAgICAgaWYgKG1heENvbCA+PSBjb2wpIHsKKyAgICAgICAgICBjb2x1bW4uQ29sdW1uTWF4ID0gY29sIC0gMTsKKyAgICAgICAgICBpZiAobWF4Q29sID4gY29sKSB7CisgICAgICAgICAgICBFeGNlbENvbHVtbiBuZXdDID0gQ29weUNvbHVtbihjb2x1bW4sIGNvbCArIDEsIG1heENvbCk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBDb3B5Q29sdW1uKGNvbHVtbiwgY29sLCBjb2wpOwogICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHZvaWQgQ29kZU5hbWVDaGFuZ2Uoc3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb2RlTW9kdWxlTmFtZSA9IHZhbHVlOworICAgICAgfQorICAgICAgLy9mb3JlYWNoIChFeGNlbENvbHVtbiBjaGVja0NvbHVtbiBpbiBfY29sdW1ucykKKyAgICAgIC8veworICAgICAgLy8gICAgaWYgKGNvbCA+IGNoZWNrQ29sdW1uLkNvbHVtbk1pbiAmJiBjb2wgPD0gY2hlY2tDb2x1bW4uQ29sdW1uTWF4KQorICAgICAgLy8gICAgeworICAgICAgLy8gICAgICAgIGludCBtYXhDb2wgPSBjaGVja0NvbHVtbi5Db2x1bW5NYXg7CisgICAgICAvLyAgICAgICAgY2hlY2tDb2x1bW4uQ29sdW1uTWF4ID0gY29sIC0gMTsKKyAgICAgIC8vICAgICAgICBpZiAobWF4Q29sID4gY29sKQorICAgICAgLy8gICAgICAgIHsKKyAgICAgIC8vICAgICAgICAgICAgRXhjZWxDb2x1bW4gbmV3QyA9IENvcHlDb2x1bW4oY2hlY2tDb2x1bW4sIGNvbCArIDEsIG1heENvbCk7CisgICAgICAvLyAgICAgICAgfQorICAgICAgLy8gICAgICAgIHJldHVybiBDb3B5Q29sdW1uKGNoZWNrQ29sdW1uLCBjb2wsY29sKTsKKyAgICAgIC8vICAgIH0KKyAgICAgIC8vfQorICAgICAgY29sdW1uID0gbmV3KHRoaXMsIGNvbCk7CisgICAgICBfdmFsdWVzLlNldFZhbHVlKDAsIGNvbCwgY29sdW1uKTsKKyAgICAgIC8vX2NvbHVtbnMuQWRkKGNvbHVtbik7CisgICAgfQorICAgIHJldHVybiBjb2x1bW47CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB3b3Jrc2hlZXQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPlRoZSBuYW1lIG9mIHRoZSB3b3Jrc2hlZXQ8L3JldHVybnM+CisgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIE5hbWU7CisgIH0KKworICBpbnRlcm5hbCBFeGNlbENvbHVtbiBDb3B5Q29sdW1uKEV4Y2VsQ29sdW1uIGMsIGludCBjb2wsIGludCBtYXhDb2wpIHsKKyAgICBFeGNlbENvbHVtbiBuZXdDID0gbmV3IEV4Y2VsQ29sdW1uKHRoaXMsIGNvbCk7CisgICAgbmV3Qy5Db2x1bW5NYXggPSBtYXhDb2wgPCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyA/IG1heENvbCA6IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zOworICAgIGlmIChjLlN0eWxlTmFtZSAhPSAiIikgeworICAgICAgbmV3Qy5TdHlsZU5hbWUgPSBjLlN0eWxlTmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgbmV3Qy5TdHlsZUlEID0gYy5TdHlsZUlEOworICAgIH0KKworICAgIG5ld0MuT3V0bGluZUxldmVsID0gYy5PdXRsaW5lTGV2ZWw7CisgICAgbmV3Qy5QaG9uZXRpYyA9IGMuUGhvbmV0aWM7CisgICAgbmV3Qy5CZXN0Rml0ID0gYy5CZXN0Rml0OworICAgIC8vX2NvbHVtbnMuQWRkKG5ld0MpOworICAgIF92YWx1ZXMuU2V0VmFsdWUoMCwgY29sLCBuZXdDKTsKKyAgICBuZXdDLl93aWR0aCA9IGMuX3dpZHRoOworICAgIG5ld0MuX2hpZGRlbiA9IGMuX2hpZGRlbjsKKyAgICByZXR1cm4gbmV3QzsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE1ha2UgdGhlIGN1cnJlbnQgd29ya3NoZWV0IGFjdGl2ZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHZvaWQgU2VsZWN0KCkgeworICAgIFZpZXcuVGFiU2VsZWN0ZWQgPSB0cnVlOworICAgIC8vU2VsZWN0KEFkZHJlc3MsIHRydWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2VsZWN0cyBhIHJhbmdlIGluIHRoZSB3b3Jrc2hlZXQuIFRoZSBhY3RpdmUgY2VsbCBpcyB0aGUgdG9wbW9zdCBjZWxsLgorICAvLy8gTWFrZSB0aGUgY3VycmVudCB3b3Jrc2hlZXQgYWN0aXZlLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPkFuIGFkZHJlc3MgcmFuZ2U8L3BhcmFtPgorICBwdWJsaWMgdm9pZCBTZWxlY3Qoc3RyaW5nIGFkZHJlc3MpIHsKKyAgICBTZWxlY3QoYWRkcmVzcywgdHJ1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTZWxlY3RzIGEgcmFuZ2UgaW4gdGhlIHdvcmtzaGVldC4gVGhlIGFjdGljZSBjZWxsIGlzIHRoZSB0b3Btb3N0IGNlbGwuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+QSByYW5nZSBvZiBjZWxsczwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ic2VsZWN0U2hlZXQiPk1ha2UgdGhlIHNoZWV0IGFjdGl2ZTwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIFNlbGVjdChzdHJpbmcgYWRkcmVzcywgYm9vbCBzZWxlY3RTaGVldCkgeworICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgaW50IGZyb21Db2wsCisgICAgICAgIGZyb21Sb3csCisgICAgICAgIHRvQ29sLAorICAgICAgICB0b1JvdzsKKyAgICAvL0dldCByb3dzIGFuZCBjb2x1bW5zIGFuZCB2YWxpZGF0ZSBhcyB3ZWxsCisgICAgRXhjZWxDZWxsQmFzZS5HZXRSb3dDb2xGcm9tQWRkcmVzcyhhZGRyZXNzLCBvdXQgZnJvbVJvdywgb3V0IGZyb21Db2wsIG91dCB0b1Jvdywgb3V0IHRvQ29sKTsKKworICAgIGlmIChzZWxlY3RTaGVldCkgeworICAgICAgVmlldy5UYWJTZWxlY3RlZCA9IHRydWU7CisgICAgfQorICAgIFZpZXcuU2VsZWN0ZWRSYW5nZSA9IGFkZHJlc3M7CisgICAgVmlldy5BY3RpdmVDZWxsID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGZyb21Sb3csIGZyb21Db2wpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2VsZWN0cyBhIHJhbmdlIGluIHRoZSB3b3Jrc2hlZXQuIFRoZSBhY3RpdmUgY2VsbCBpcyB0aGUgdG9wbW9zdCBjZWxsIG9mIHRoZSBmaXJzdCBhZGRyZXNzLgorICAvLy8gTWFrZSB0aGUgY3VycmVudCB3b3Jrc2hlZXQgYWN0aXZlLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPkFuIGFkZHJlc3MgcmFuZ2U8L3BhcmFtPgorICBwdWJsaWMgdm9pZCBTZWxlY3QoRXhjZWxBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICBDaGVja1NoZWV0VHlwZSgpOworICAgIFNlbGVjdChhZGRyZXNzLCB0cnVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNlbGVjdHMgYSByYW5nZSBpbiB0aGUgd29ya3NoZWV0LiBUaGUgYWN0aXZlIGNlbGwgaXMgdGhlIHRvcG1vc3QgY2VsbCBvZiB0aGUgZmlyc3QgYWRkcmVzcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5BIHJhbmdlIG9mIGNlbGxzPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJzZWxlY3RTaGVldCI+TWFrZSB0aGUgc2hlZXQgYWN0aXZlPC9wYXJhbT4KKyAgcHVibGljIHZvaWQgU2VsZWN0KEV4Y2VsQWRkcmVzcyBhZGRyZXNzLCBib29sIHNlbGVjdFNoZWV0KSB7CisgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICBpZiAoc2VsZWN0U2hlZXQpIHsKKyAgICAgIFZpZXcuVGFiU2VsZWN0ZWQgPSB0cnVlOworICAgIH0KKyAgICBzdHJpbmcgc2VsQWRkcmVzcyA9CisgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhhZGRyZXNzLlN0YXJ0LlJvdywgYWRkcmVzcy5TdGFydC5Db2x1bW4pCisgICAgICAgICAgICArICI6IgorICAgICAgICAgICAgKyBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoYWRkcmVzcy5FbmQuUm93LCBhZGRyZXNzLkVuZC5Db2x1bW4pOworICAgIGlmIChhZGRyZXNzLkFkZHJlc3NlcyAhPSBudWxsKSB7CisgICAgICBmb3JlYWNoICh2YXIgYSBpbiBhZGRyZXNzLkFkZHJlc3NlcykgeworICAgICAgICBzZWxBZGRyZXNzICs9CisgICAgICAgICAgICAiICIKKyAgICAgICAgICAgICAgICArIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhhLlN0YXJ0LlJvdywgYS5TdGFydC5Db2x1bW4pCisgICAgICAgICAgICAgICAgKyAiOiIKKyAgICAgICAgICAgICAgICArIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhhLkVuZC5Sb3csIGEuRW5kLkNvbHVtbik7CisgICAgICB9CisgICAgfQorICAgIFZpZXcuU2VsZWN0ZWRSYW5nZSA9IHNlbEFkZHJlc3M7CisgICAgVmlldy5BY3RpdmVDZWxsID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGFkZHJlc3MuU3RhcnQuUm93LCBhZGRyZXNzLlN0YXJ0LkNvbHVtbik7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbnNlcnRzIGEgbmV3IHJvdyBpbnRvIHRoZSBzcHJlYWRzaGVldC4gIEV4aXN0aW5nIHJvd3MgYmVsb3cgdGhlIHBvc2l0aW9uIGFyZQorICAvLy8gc2hpZnRlZCBkb3duLiAgQWxsIGZvcm11bGEgYXJlIHVwZGF0ZWQgdG8gdGFrZSBhY2NvdW50IG9mIHRoZSBuZXcgcm93LgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InJvd0Zyb20iPlRoZSBwb3NpdGlvbiBvZiB0aGUgbmV3IHJvdzwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icm93cyI+TnVtYmVyIG9mIHJvd3MgdG8gaW5zZXJ0PC9wYXJhbT4KKyAgcHVibGljIHZvaWQgSW5zZXJ0Um93KGludCByb3dGcm9tLCBpbnQgcm93cykgeworICAgIEluc2VydFJvdyhyb3dGcm9tLCByb3dzLCAwKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluc2VydHMgYSBuZXcgcm93IGludG8gdGhlIHNwcmVhZHNoZWV0LiAgRXhpc3Rpbmcgcm93cyBiZWxvdyB0aGUgcG9zaXRpb24gYXJlCisgIC8vLyBzaGlmdGVkIGRvd24uICBBbGwgZm9ybXVsYSBhcmUgdXBkYXRlZCB0byB0YWtlIGFjY291bnQgb2YgdGhlIG5ldyByb3cuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icm93RnJvbSI+VGhlIHBvc2l0aW9uIG9mIHRoZSBuZXcgcm93PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3dzIj5OdW1iZXIgb2Ygcm93cyB0byBpbnNlcnQuPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb3B5U3R5bGVzRnJvbVJvdyI+Q29weSBTdHlsZXMgZnJvbSB0aGlzIHJvdy4gQXBwbGllZCB0byBhbGwgaW5zZXJ0ZWQgcm93czwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIEluc2VydFJvdyhpbnQgcm93RnJvbSwgaW50IHJvd3MsIGludCBjb3B5U3R5bGVzRnJvbVJvdykgeworICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgdmFyIGQgPSBEaW1lbnNpb247CisKKyAgICBpZiAocm93RnJvbSA8IDEpIHsKKyAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJyb3dGcm9tIGNhbid0IGJlIGxlc3NlciB0aGF0IDEiKSk7CisgICAgfQorCisgICAgLy9DaGVjayB0aGF0IGNlbGxzIGFyZW4ndCBzaGlmdGVkIG91dHNpZGUgdGhlIGJvdW5kcmllcworICAgIGlmIChkICE9IG51bGwgJiYgZC5FbmQuUm93ID4gcm93RnJvbSAmJiBkLkVuZC5Sb3cgKyByb3dzID4gRXhjZWxQYWNrYWdlLk1heFJvd3MpIHsKKyAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAiQ2FuJ3QgaW5zZXJ0LiBSb3dzIHdpbGwgYmUgc2hpZnRlZCBvdXRzaWRlIHRoZSBib3VuZHJpZXMgb2YgdGhlIHdvcmtzaGVldC4iKSk7CisgICAgfQorCisgICAgbG9jayAodGhpcykgeworICAgICAgX3ZhbHVlcy5JbnNlcnQocm93RnJvbSwgMCwgcm93cywgMCk7CisgICAgICBfZm9ybXVsYXMuSW5zZXJ0KHJvd0Zyb20sIDAsIHJvd3MsIDApOworICAgICAgX3N0eWxlcy5JbnNlcnQocm93RnJvbSwgMCwgcm93cywgMCk7CisgICAgICBfdHlwZXMuSW5zZXJ0KHJvd0Zyb20sIDAsIHJvd3MsIDApOworICAgICAgX2NvbW1lbnRzU3RvcmUuSW5zZXJ0KHJvd0Zyb20sIDAsIHJvd3MsIDApOworICAgICAgX2h5cGVyTGlua3MuSW5zZXJ0KHJvd0Zyb20sIDAsIHJvd3MsIDApOworICAgICAgX2ZsYWdzLkluc2VydChyb3dGcm9tLCAwLCByb3dzLCAwKTsKKworICAgICAgZm9yZWFjaCAodmFyIGYgaW4gX3NoYXJlZEZvcm11bGFzLlZhbHVlcykgeworICAgICAgICBpZiAoZi5TdGFydFJvdyA+PSByb3dGcm9tKSB7CisgICAgICAgICAgZi5TdGFydFJvdyArPSByb3dzOworICAgICAgICB9CisgICAgICAgIHZhciBhID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoZi5BZGRyZXNzKTsKKyAgICAgICAgaWYgKGEuX2Zyb21Sb3cgPj0gcm93RnJvbSkgeworICAgICAgICAgIGEuX2Zyb21Sb3cgKz0gcm93czsKKyAgICAgICAgICBhLl90b1JvdyArPSByb3dzOworICAgICAgICB9IGVsc2UgaWYgKGEuX3RvUm93ID49IHJvd0Zyb20pIHsKKyAgICAgICAgICBhLl90b1JvdyArPSByb3dzOworICAgICAgICB9CisgICAgICAgIGYuQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhhLl9mcm9tUm93LCBhLl9mcm9tQ29sLCBhLl90b1JvdywgYS5fdG9Db2wpOworICAgICAgICBmLkZvcm11bGEgPSBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKGYuRm9ybXVsYSwgcm93cywgMCwgcm93RnJvbSwgMCk7CisgICAgICB9CisgICAgICB2YXIgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX2Zvcm11bGFzKTsKKyAgICAgIHdoaWxlIChjc2UuTmV4dCgpKSB7CisgICAgICAgIGlmIChjc2UuVmFsdWUgaXMgc3RyaW5nKSB7CisgICAgICAgICAgY3NlLlZhbHVlID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcygKKyAgICAgICAgICAgICAgY3NlLlZhbHVlLlRvU3RyaW5nKCksCisgICAgICAgICAgICAgIHJvd3MsCisgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgIHJvd0Zyb20sCisgICAgICAgICAgICAgIDApOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEZpeE1lcmdlZENlbGxzUm93KHJvd0Zyb20sIHJvd3MsIGZhbHNlKTsKKyAgICAgIGlmIChjb3B5U3R5bGVzRnJvbVJvdyA+IDApIHsKKyAgICAgICAgdmFyIGNzZVMgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50PigKKyAgICAgICAgICAgIF9zdHlsZXMsCisgICAgICAgICAgICBjb3B5U3R5bGVzRnJvbVJvdywKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBjb3B5U3R5bGVzRnJvbVJvdywKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsgLy9GaXhlcyBpc3N1ZSAxNTA2OCAsIDE1MDkwCisgICAgICAgIHdoaWxlIChjc2VTLk5leHQoKSkgeworICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgcm93czsgcisrKSB7CisgICAgICAgICAgICBfc3R5bGVzLlNldFZhbHVlKHJvd0Zyb20gKyByLCBjc2VTLkNvbHVtbiwgY3NlUy5WYWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBmb3JlYWNoICh2YXIgdGJsIGluIFRhYmxlcykgeworICAgICAgICB0YmwuQWRkcmVzcyA9IHRibC5BZGRyZXNzLkFkZFJvdyhyb3dGcm9tLCByb3dzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbnNlcnRzIGEgbmV3IGNvbHVtbiBpbnRvIHRoZSBzcHJlYWRzaGVldC4gIEV4aXN0aW5nIGNvbHVtbnMgYmVsb3cgdGhlIHBvc2l0aW9uIGFyZQorICAvLy8gc2hpZnRlZCBkb3duLiAgQWxsIGZvcm11bGEgYXJlIHVwZGF0ZWQgdG8gdGFrZSBhY2NvdW50IG9mIHRoZSBuZXcgY29sdW1uLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbkZyb20iPlRoZSBwb3NpdGlvbiBvZiB0aGUgbmV3IGNvbHVtbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1ucyI+TnVtYmVyIG9mIGNvbHVtbnMgdG8gaW5zZXJ0PC9wYXJhbT4KKyAgcHVibGljIHZvaWQgSW5zZXJ0Q29sdW1uKGludCBjb2x1bW5Gcm9tLCBpbnQgY29sdW1ucykgeworICAgIEluc2VydENvbHVtbihjb2x1bW5Gcm9tLCBjb2x1bW5zLCAwKTsKKyAgfQorCisgIC8vLzxzdW1tYXJ5PgorICAvLy8gSW5zZXJ0cyBhIG5ldyBjb2x1bW4gaW50byB0aGUgc3ByZWFkc2hlZXQuICBFeGlzdGluZyBjb2x1bW4gdG8gdGhlIGxlZnQgYXJlCisgIC8vLyBzaGlmdGVkLiAgQWxsIGZvcm11bGEgYXJlIHVwZGF0ZWQgdG8gdGFrZSBhY2NvdW50IG9mIHRoZSBuZXcgY29sdW1uLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbkZyb20iPlRoZSBwb3NpdGlvbiBvZiB0aGUgbmV3IGNvbHVtbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1ucyI+TnVtYmVyIG9mIGNvbHVtbnMgdG8gaW5zZXJ0LjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29weVN0eWxlc0Zyb21Db2x1bW4iPkNvcHkgU3R5bGVzIGZyb20gdGhpcyBjb2x1bW4uIEFwcGxpZWQgdG8gYWxsIGluc2VydGVkIGNvbHVtbnM8L3BhcmFtPgorICBwdWJsaWMgdm9pZCBJbnNlcnRDb2x1bW4oaW50IGNvbHVtbkZyb20sIGludCBjb2x1bW5zLCBpbnQgY29weVN0eWxlc0Zyb21Db2x1bW4pIHsKKyAgICBDaGVja1NoZWV0VHlwZSgpOworICAgIHZhciBkID0gRGltZW5zaW9uOworCisgICAgaWYgKGNvbHVtbkZyb20gPCAxKSB7CisgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiY29sdW1uRnJvbSBjYW4ndCBiZSBsZXNzZXIgdGhhdCAxIikpOworICAgIH0KKyAgICAvL0NoZWNrIHRoYXQgY2VsbHMgYXJlbid0IHNoaWZ0ZWQgb3V0c2lkZSB0aGUgYm91bmRyaWVzCisgICAgaWYgKGQgIT0gbnVsbAorICAgICAgICAmJiBkLkVuZC5Db2x1bW4gPiBjb2x1bW5Gcm9tCisgICAgICAgICYmIGQuRW5kLkNvbHVtbiArIGNvbHVtbnMgPiBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgeworICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICJDYW4ndCBpbnNlcnQuIENvbHVtbnMgd2lsbCBiZSBzaGlmdGVkIG91dHNpZGUgdGhlIGJvdW5kcmllcyBvZiB0aGUgd29ya3NoZWV0LiIpKTsKKyAgICB9CisKKyAgICBsb2NrICh0aGlzKSB7CisgICAgICBfdmFsdWVzLkluc2VydCgwLCBjb2x1bW5Gcm9tLCAwLCBjb2x1bW5zKTsKKyAgICAgIF9mb3JtdWxhcy5JbnNlcnQoMCwgY29sdW1uRnJvbSwgMCwgY29sdW1ucyk7CisgICAgICBfc3R5bGVzLkluc2VydCgwLCBjb2x1bW5Gcm9tLCAwLCBjb2x1bW5zKTsKKyAgICAgIF90eXBlcy5JbnNlcnQoMCwgY29sdW1uRnJvbSwgMCwgY29sdW1ucyk7CisgICAgICBfY29tbWVudHNTdG9yZS5JbnNlcnQoMCwgY29sdW1uRnJvbSwgMCwgY29sdW1ucyk7CisgICAgICBfaHlwZXJMaW5rcy5JbnNlcnQoMCwgY29sdW1uRnJvbSwgMCwgY29sdW1ucyk7CisgICAgICBfZmxhZ3MuSW5zZXJ0KDAsIGNvbHVtbkZyb20sIDAsIGNvbHVtbnMpOworCisgICAgICBmb3JlYWNoICh2YXIgZiBpbiBfc2hhcmVkRm9ybXVsYXMuVmFsdWVzKSB7CisgICAgICAgIGlmIChmLlN0YXJ0Q29sID49IGNvbHVtbkZyb20pIHsKKyAgICAgICAgICBmLlN0YXJ0Q29sICs9IGNvbHVtbnM7CisgICAgICAgIH0KKyAgICAgICAgdmFyIGEgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZShmLkFkZHJlc3MpOworICAgICAgICBpZiAoYS5fZnJvbUNvbCA+PSBjb2x1bW5Gcm9tKSB7CisgICAgICAgICAgYS5fZnJvbUNvbCArPSBjb2x1bW5zOworICAgICAgICAgIGEuX3RvQ29sICs9IGNvbHVtbnM7CisgICAgICAgIH0gZWxzZSBpZiAoYS5fdG9Db2wgPj0gY29sdW1uRnJvbSkgeworICAgICAgICAgIGEuX3RvQ29sICs9IGNvbHVtbnM7CisgICAgICAgIH0KKyAgICAgICAgZi5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGEuX2Zyb21Sb3csIGEuX2Zyb21Db2wsIGEuX3RvUm93LCBhLl90b0NvbCk7CisgICAgICAgIGYuRm9ybXVsYSA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoZi5Gb3JtdWxhLCAwLCBjb2x1bW5zLCAwLCBjb2x1bW5Gcm9tKTsKKyAgICAgIH0KKworICAgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF9mb3JtdWxhcyk7CisgICAgICB3aGlsZSAoY3NlLk5leHQoKSkgeworICAgICAgICBpZiAoY3NlLlZhbHVlIGlzIHN0cmluZykgeworICAgICAgICAgIGNzZS5WYWx1ZSA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoCisgICAgICAgICAgICAgIGNzZS5WYWx1ZS5Ub1N0cmluZygpLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICBjb2x1bW5zLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICBjb2x1bW5Gcm9tKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBGaXhNZXJnZWRDZWxsc0NvbHVtbihjb2x1bW5Gcm9tLCBjb2x1bW5zLCBmYWxzZSk7CisKKyAgICAgIHZhciBjc2VjID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX3ZhbHVlcywgMCwgMSwgMCwgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOworICAgICAgdmFyIGxzdCA9IG5ldyBMaXN0PEV4Y2VsQ29sdW1uPigpOworICAgICAgZm9yZWFjaCAodmFyIGNvbCBpbiBjc2VjKSB7CisgICAgICAgIGlmIChjb2wgaXMgRXhjZWxDb2x1bW4pIHsKKyAgICAgICAgICBsc3QuQWRkKChFeGNlbENvbHVtbiljb2wpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGZvciAoaW50IGkgPSBsc3QuQ291bnQgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICB2YXIgYyA9IGxzdFtpXTsKKyAgICAgICAgaWYgKGMuX2NvbHVtbk1pbiA+PSBjb2x1bW5Gcm9tKSB7CisgICAgICAgICAgaWYgKGMuX2NvbHVtbk1pbiArIGNvbHVtbnMgPD0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpIHsKKyAgICAgICAgICAgIGMuX2NvbHVtbk1pbiArPSBjb2x1bW5zOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjLl9jb2x1bW5NaW4gPSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1uczsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoYy5fY29sdW1uTWF4ICsgY29sdW1ucyA8PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykgeworICAgICAgICAgICAgYy5fY29sdW1uTWF4ICs9IGNvbHVtbnM7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGMuX2NvbHVtbk1heCA9IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjLl9jb2x1bW5NYXggPj0gY29sdW1uRnJvbSkgeworICAgICAgICAgIHZhciBjYyA9IGMuX2NvbHVtbk1heCAtIGNvbHVtbkZyb207CisgICAgICAgICAgYy5fY29sdW1uTWF4ID0gY29sdW1uRnJvbSAtIDE7CisgICAgICAgICAgQ29weUNvbHVtbihjLCBjb2x1bW5Gcm9tICsgY29sdW1ucywgY29sdW1uRnJvbSArIGNvbHVtbnMgKyBjYyk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGNvcHlTdHlsZXNGcm9tQ29sdW1uID4gMCkgeworICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGNvbHVtbnM7IGMrKykgeworICAgICAgICAgIHZhciBjb2wgPSBDb2x1bW4oY29sdW1uRnJvbSArIGMpOworICAgICAgICAgIGNvbC5TdHlsZUlEID0gQ29sdW1uKGNvcHlTdHlsZXNGcm9tQ29sdW1uKS5TdHlsZUlEOworICAgICAgICB9CisgICAgICB9CisgICAgICAvL0FkanVzdCB0YWJsZXMKKyAgICAgIGZvcmVhY2ggKHZhciB0YmwgaW4gVGFibGVzKSB7CisgICAgICAgIGlmIChjb2x1bW5Gcm9tID4gdGJsLkFkZHJlc3MuU3RhcnQuQ29sdW1uICYmIGNvbHVtbkZyb20gPD0gdGJsLkFkZHJlc3MuRW5kLkNvbHVtbikgeworICAgICAgICAgIEluc2VydFRhYmxlQ29sdW1ucyhjb2x1bW5Gcm9tLCBjb2x1bW5zLCB0YmwpOwogICAgICAgICB9CiAKLSAgICAgICAgI3JlZ2lvbiBXb3Jrc2hlZXRYbWwKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gVGhlIFhNTCBkb2N1bWVudCBob2xkaW5nIHRoZSB3b3Jrc2hlZXQgZGF0YS4KLSAgICAgICAgLy8vIEFsbCBjb2x1bW4sIHJvdywgY2VsbCwgcGFnZWJyZWFrLCBtZXJnZWQgY2VsbCBhbmQgaHlwZXJsaW5rLWRhdGEgYXJlIGxvYWRlZCBpbnRvIG1lbW9yeSBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBkb2N1bWVudCB3aGVuIGxvYWRpbmcgdGhlIGRvY3VtZW50LiAgICAgICAgCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCXB1YmxpYyBYbWxEb2N1bWVudCBXb3Jrc2hlZXRYbWwKLQkJewotCQkJZ2V0Ci0JCQl7Ci0JCQkJcmV0dXJuIChfd29ya3NoZWV0WG1sKTsKLQkJCX0KLQkJfQotICAgICAgICBpbnRlcm5hbCBFeGNlbFZtbERyYXdpbmdDb21tZW50Q29sbGVjdGlvbiBfdm1sRHJhd2luZ3MgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBWbWwgZHJhd2luZ3MuIHVuZGVybGF5aW5nIG9iamVjdCBmb3IgY29tbWVudHMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxWbWxEcmF3aW5nQ29tbWVudENvbGxlY3Rpb24gVm1sRHJhd2luZ3NDb21tZW50cwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3ZtbERyYXdpbmdzID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDcmVhdGVWbWxDb2xsZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfdm1sRHJhd2luZ3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxDb21tZW50Q29sbGVjdGlvbiBfY29tbWVudHMgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb2xsZWN0aW9uIG9mIGNvbW1lbnRzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENvbW1lbnRDb2xsZWN0aW9uIENvbW1lbnRzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKF9jb21tZW50cyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ3JlYXRlVm1sQ29sbGVjdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBfY29tbWVudHMgPSBuZXcgRXhjZWxDb21tZW50Q29sbGVjdGlvbihfcGFja2FnZSwgdGhpcywgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfY29tbWVudHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIENyZWF0ZVZtbENvbGxlY3Rpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdm1sTm9kZSA9IF93b3Jrc2hlZXRYbWwuRG9jdW1lbnRFbGVtZW50LlNlbGVjdFNpbmdsZU5vZGUoImQ6bGVnYWN5RHJhd2luZy9AcjppZCIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgaWYgKHZtbE5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfdm1sRHJhd2luZ3MgPSBuZXcgRXhjZWxWbWxEcmF3aW5nQ29tbWVudENvbGxlY3Rpb24oX3BhY2thZ2UsIHRoaXMsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChQYXJ0LlJlbGF0aW9uc2hpcEV4aXN0cyh2bWxOb2RlLlZhbHVlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciByZWwgPSBQYXJ0LkdldFJlbGF0aW9uc2hpcCh2bWxOb2RlLlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHZtbFVyaSA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShyZWwuU291cmNlVXJpLCByZWwuVGFyZ2V0VXJpKTsKKyAgICAgICAgdGJsLkFkZHJlc3MgPSB0YmwuQWRkcmVzcy5BZGRDb2x1bW4oY29sdW1uRnJvbSwgY29sdW1ucyk7CisgICAgICB9CisgICAgfQorICB9CiAKLSAgICAgICAgICAgICAgICAgICAgX3ZtbERyYXdpbmdzID0gbmV3IEV4Y2VsVm1sRHJhd2luZ0NvbW1lbnRDb2xsZWN0aW9uKF9wYWNrYWdlLCB0aGlzLCB2bWxVcmkpOwotICAgICAgICAgICAgICAgICAgICBfdm1sRHJhd2luZ3MuUmVsSWQgPSByZWwuSWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICBwcml2YXRlIHN0YXRpYyB2b2lkIEluc2VydFRhYmxlQ29sdW1ucyhpbnQgY29sdW1uRnJvbSwgaW50IGNvbHVtbnMsIEV4Y2VsVGFibGUgdGJsKSB7CisgICAgdmFyIG5vZGUgPSB0YmwuQ29sdW1uc1swXS5Ub3BOb2RlLlBhcmVudE5vZGU7CisgICAgdmFyIGl4ID0gY29sdW1uRnJvbSAtIHRibC5BZGRyZXNzLlN0YXJ0LkNvbHVtbiAtIDE7CisgICAgdmFyIGluc1BvcyA9IG5vZGUuQ2hpbGROb2Rlc1tpeF07CisgICAgaXggKz0gMjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnM7IGkrKykgeworICAgICAgdmFyIG5hbWUgPSB0YmwuQ29sdW1ucy5HZXRVbmlxdWVOYW1lKAorICAgICAgICAgIHN0cmluZy5Gb3JtYXQoIkNvbHVtbnswfSIsIChpeCsrKS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkpOworICAgICAgWG1sRWxlbWVudCB0YWJsZUNvbHVtbiA9IChYbWxFbGVtZW50KQorICAgICAgICB0YmwuVGFibGVYbWwuQ3JlYXRlTm9kZShYbWxOb2RlVHlwZS5FbGVtZW50LCAidGFibGVDb2x1bW4iLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgdGFibGVDb2x1bW4uU2V0QXR0cmlidXRlKAorICAgICAgICAgICJpZCIsCisgICAgICAgICAgKHRibC5Db2x1bW5zLkNvdW50ICsgaSArIDEpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgIHRhYmxlQ29sdW1uLlNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOworICAgICAgaW5zUG9zID0gbm9kZS5JbnNlcnRBZnRlcih0YWJsZUNvbHVtbiwgaW5zUG9zKTsKKyAgICB9IC8vQ3JlYXRlIHRibCBDb2x1bW4KKyAgICB0YmwuX2NvbHMgPSBuZXcodGJsKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZHMgYSB2YWx1ZSB0byB0aGUgcm93IG9mIG1lcmdlZCBjZWxscyB0byBmaXggZm9yIGluc2VydHMgb3IgZGVsZXRlcworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3dzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImRlbGV0ZSI+PC9wYXJhbT4KKyAgcHJpdmF0ZSB2b2lkIEZpeE1lcmdlZENlbGxzUm93KGludCByb3csIGludCByb3dzLCBib29sIGRlbGV0ZSkgeworICAgIGlmIChkZWxldGUpIHsKKyAgICAgIF9tZXJnZWRDZWxscy5fY2VsbHMuRGVsZXRlKHJvdywgMCwgcm93cywgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9tZXJnZWRDZWxscy5fY2VsbHMuSW5zZXJ0KHJvdywgMCwgcm93cywgMCk7CisgICAgfQorCisgICAgTGlzdDxpbnQ+IHJlbW92ZUluZGV4ID0gbmV3IExpc3Q8aW50PigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX21lcmdlZENlbGxzLkNvdW50OyBpKyspIHsKKyAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoX21lcmdlZENlbGxzW2ldKSkgeworICAgICAgICBFeGNlbEFkZHJlc3NCYXNlIGFkZHIgPSBuZXcoX21lcmdlZENlbGxzW2ldKSwKKyAgICAgICAgICAgIG5ld0FkZHI7CisgICAgICAgIGlmIChkZWxldGUpIHsKKyAgICAgICAgICBuZXdBZGRyID0gYWRkci5EZWxldGVSb3cocm93LCByb3dzKTsKKyAgICAgICAgICBpZiAobmV3QWRkciA9PSBudWxsKSB7CisgICAgICAgICAgICByZW1vdmVJbmRleC5BZGQoaSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmV3QWRkciA9IGFkZHIuQWRkUm93KHJvdywgcm93cyk7CisgICAgICAgICAgaWYgKG5ld0FkZHIuQWRkcmVzcyAhPSBhZGRyLkFkZHJlc3MpIHsKKyAgICAgICAgICAgIC8vICAgIF9tZXJnZWRDZWxscy5fY2VsbHMuSW5zZXJ0KHJvdywgMCwgcm93cywgMCk7CisgICAgICAgICAgICBfbWVyZ2VkQ2VsbHMuU2V0SW5kZXgobmV3QWRkciwgaSk7CisgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIENyZWF0ZVhtbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93b3Jrc2hlZXRYbWwgPSBuZXcgWG1sRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIF93b3Jrc2hlZXRYbWwuUHJlc2VydmVXaGl0ZXNwYWNlID0gRXhjZWxQYWNrYWdlLnByZXNlcnZlV2hpdGVzcGFjZTsKLSAgICAgICAgICAgIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBwYWNrUGFydCA9IF9wYWNrYWdlLlBhY2thZ2UuR2V0UGFydChXb3Jrc2hlZXRVcmkpOwotICAgICAgICAgICAgc3RyaW5nIHhtbCA9ICIiOwotCi0gICAgICAgICAgICAvLyBGaXJzdCBDb2x1bW5zLCByb3dzLCBjZWxscywgbWVyZ2VjZWxscywgaHlwZXJsaW5rcyBhbmQgcGFnZWJyZWFrZXMgYXJlIGxvYWRlZCBmcm9tIGEgeG1sc3RyZWFtIHRvIG9wdGltaXplIHNwZWVkLi4uCi0gICAgICAgICAgICBTdHJlYW0gc3RyZWFtID0gcGFja1BhcnQuR2V0U3RyZWFtKCk7Ci0KLSAgICAgICAgICAgIFhtbFRleHRSZWFkZXIgeHIgPSBuZXcgWG1sVGV4dFJlYWRlcihzdHJlYW0pOwotICAgICAgICAgICAgeHIuUHJvaGliaXREdGQgPSB0cnVlOwotICAgICAgICAgICAgeHIuV2hpdGVzcGFjZUhhbmRsaW5nID0gV2hpdGVzcGFjZUhhbmRsaW5nLk5vbmU7Ci0gICAgICAgICAgICBMb2FkQ29sdW1ucyh4cik7ICAgIC8vY29sdW1uWG1sCi0gICAgICAgICAgICBsb25nIHN0YXJ0ID0gc3RyZWFtLlBvc2l0aW9uOwotICAgICAgICAgICAgTG9hZENlbGxzKHhyKTsKLSAgICAgICAgICAgIHZhciBuZXh0RWxlbWVudExlbmd0aCA9IEdldEF0dHJpYnV0ZUxlbmd0aCh4cik7Ci0gICAgICAgICAgICBsb25nIGVuZCA9IHN0cmVhbS5Qb3NpdGlvbiAtIG5leHRFbGVtZW50TGVuZ3RoOwotICAgICAgICAgICAgTG9hZE1lcmdlQ2VsbHMoeHIpOwotICAgICAgICAgICAgTG9hZEh5cGVyTGlua3MoeHIpOwotICAgICAgICAgICAgTG9hZFJvd1BhZ2VCcmVha2VzKHhyKTsKLSAgICAgICAgICAgIExvYWRDb2xQYWdlQnJlYWtlcyh4cik7Ci0gICAgICAgICAgICAvLy4uLnRoZW4gdGhlIHJlc3Qgb2YgdGhlIFhtbCBpcyBleHRyYWN0ZWQgYW5kIGxvYWRlZCBpbnRvIHRoZSBXb3Jrc2hlZXRYbWwgZG9jdW1lbnQuCi0gICAgICAgICAgICBzdHJlYW0uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKLSAgICAgICAgICAgIEVuY29kaW5nIGVuY29kaW5nOwotICAgICAgICAgICAgeG1sID0gR2V0V29ya1NoZWV0WG1sKHN0cmVhbSwgc3RhcnQsIGVuZCwgb3V0IGVuY29kaW5nKTsKLQotICAgICAgICAgICAgLy9maXJzdCBjaGFyIGlzIGludmFsaWQgc29tZXRpbWVzPz8gCi0gICAgICAgICAgICBpZiAoeG1sWzBdICE9ICc8JykKLSAgICAgICAgICAgICAgICBMb2FkWG1sU2FmZShfd29ya3NoZWV0WG1sLCB4bWwuU3Vic3RyaW5nKDEsIHhtbC5MZW5ndGggLSAxKSwgZW5jb2RpbmcpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIExvYWRYbWxTYWZlKF93b3Jrc2hlZXRYbWwsIHhtbCwgZW5jb2RpbmcpOwotCi0gICAgICAgICAgICBDbGVhck5vZGVzKCk7CisgICAgICAgIGlmIChuZXdBZGRyLkFkZHJlc3MgIT0gYWRkci5BZGRyZXNzKSB7CisgICAgICAgICAgX21lcmdlZENlbGxzLkxpc3RbaV0gPSBuZXdBZGRyLl9hZGRyZXNzOwogICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldCB0aGUgbGVudGggb2YgdGhlIGF0dHJpYnV0ZXMKLSAgICAgICAgLy8vIENvbmRpdGlvbmFsIGZvcm1hdHRpbmcgYXR0cmlidXRlcyBjYW4gYmUgZXh0cmVtbHkgbG9uZyBzb20gZ2V0IGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlcyB0byBmaW5ldHVuZSBwb3NpdGlvbi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ4ciI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHJpdmF0ZSBpbnQgR2V0QXR0cmlidXRlTGVuZ3RoKFhtbFRleHRSZWFkZXIgeHIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh4ci5Ob2RlVHlwZSAhPSBYbWxOb2RlVHlwZS5FbGVtZW50KSByZXR1cm4gMDsKLSAgICAgICAgICAgIHZhciBsZW5ndGggPSAwOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHhyLkF0dHJpYnV0ZUNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGE9eHIuR2V0QXR0cmlidXRlKGkpOwotICAgICAgICAgICAgICAgIGxlbmd0aCArPSBzdHJpbmcuSXNOdWxsT3JFbXB0eShhKSA/IDAgOiBhLkxlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBsZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIExvYWRSb3dQYWdlQnJlYWtlcyhYbWxUZXh0UmVhZGVyIHhyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZighUmVhZFVudGlsKHhyLCAicm93QnJlYWtzIiwiY29sQnJlYWtzIikpIHJldHVybjsKLSAgICAgICAgICAgIHdoaWxlICh4ci5SZWFkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHhyLkxvY2FsTmFtZSA9PSAiYnJrIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4ci5Ob2RlVHlwZSA9PSBYbWxOb2RlVHlwZS5FbGVtZW50KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKHhyLkdldEF0dHJpYnV0ZSgiaWQiKSwgb3V0IGlkKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3coaWQpLlBhZ2VCcmVhayA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ICAgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBMb2FkQ29sUGFnZUJyZWFrZXMoWG1sVGV4dFJlYWRlciB4cikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFSZWFkVW50aWwoeHIsICJjb2xCcmVha3MiKSkgcmV0dXJuOwotICAgICAgICAgICAgd2hpbGUgKHhyLlJlYWQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoeHIuTG9jYWxOYW1lID09ICJicmsiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhyLk5vZGVUeXBlID09IFhtbE5vZGVUeXBlLkVsZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UoeHIuR2V0QXR0cmlidXRlKCJpZCIpLCBvdXQgaWQpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtbihpZCkuUGFnZUJyZWFrID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZvciAoaW50IGkgPSByZW1vdmVJbmRleC5Db3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBfbWVyZ2VkQ2VsbHMuTGlzdC5SZW1vdmVBdChyZW1vdmVJbmRleFtpXSk7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIHZhbHVlIHRvIHRoZSByb3cgb2YgbWVyZ2VkIGNlbGxzIHRvIGZpeCBmb3IgaW5zZXJ0cyBvciBkZWxldGVzCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1uIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbnMiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZGVsZXRlIj48L3BhcmFtPgorICBwcml2YXRlIHZvaWQgRml4TWVyZ2VkQ2VsbHNDb2x1bW4oaW50IGNvbHVtbiwgaW50IGNvbHVtbnMsIGJvb2wgZGVsZXRlKSB7CisgICAgaWYgKGRlbGV0ZSkgeworICAgICAgX21lcmdlZENlbGxzLl9jZWxscy5EZWxldGUoMCwgY29sdW1uLCAwLCBjb2x1bW5zKTsKKyAgICB9IGVsc2UgeworICAgICAgX21lcmdlZENlbGxzLl9jZWxscy5JbnNlcnQoMCwgY29sdW1uLCAwLCBjb2x1bW5zKTsKKyAgICB9CisgICAgTGlzdDxpbnQ+IHJlbW92ZUluZGV4ID0gbmV3IExpc3Q8aW50PigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX21lcmdlZENlbGxzLkNvdW50OyBpKyspIHsKKyAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoX21lcmdlZENlbGxzW2ldKSkgeworICAgICAgICBFeGNlbEFkZHJlc3NCYXNlIGFkZHIgPSBuZXcoX21lcmdlZENlbGxzW2ldKSwKKyAgICAgICAgICAgIG5ld0FkZHI7CisgICAgICAgIGlmIChkZWxldGUpIHsKKyAgICAgICAgICBuZXdBZGRyID0gYWRkci5EZWxldGVDb2x1bW4oY29sdW1uLCBjb2x1bW5zKTsKKyAgICAgICAgICBpZiAobmV3QWRkciA9PSBudWxsKSB7CisgICAgICAgICAgICByZW1vdmVJbmRleC5BZGQoaSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmV3QWRkciA9IGFkZHIuQWRkQ29sdW1uKGNvbHVtbiwgY29sdW1ucyk7CisgICAgICAgICAgaWYgKG5ld0FkZHIuQWRkcmVzcyAhPSBhZGRyLkFkZHJlc3MpIHsKKyAgICAgICAgICAgIF9tZXJnZWRDZWxscy5TZXRJbmRleChuZXdBZGRyLCBpKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgQ2xlYXJOb2RlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpjb2xzIiwgTmFtZVNwYWNlTWFuYWdlcikhPW51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3dvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6Y29scyIsIE5hbWVTcGFjZU1hbmFnZXIpLlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOm1lcmdlQ2VsbHMiLCBOYW1lU3BhY2VNYW5hZ2VyKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF93b3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOm1lcmdlQ2VsbHMiLCBOYW1lU3BhY2VNYW5hZ2VyKS5SZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpoeXBlcmxpbmtzIiwgTmFtZVNwYWNlTWFuYWdlcikgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpoeXBlcmxpbmtzIiwgTmFtZVNwYWNlTWFuYWdlcikuUmVtb3ZlQWxsKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoX3dvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6cm93QnJlYWtzIiwgTmFtZVNwYWNlTWFuYWdlcikgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpyb3dCcmVha3MiLCBOYW1lU3BhY2VNYW5hZ2VyKS5SZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpjb2xCcmVha3MiLCBOYW1lU3BhY2VNYW5hZ2VyKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF93b3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOmNvbEJyZWFrcyIsIE5hbWVTcGFjZU1hbmFnZXIpLlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAobmV3QWRkci5BZGRyZXNzICE9IGFkZHIuQWRkcmVzcykgeworICAgICAgICAgIF9tZXJnZWRDZWxscy5MaXN0W2ldID0gbmV3QWRkci5fYWRkcmVzczsKICAgICAgICAgfQotICAgICAgICBjb25zdCBpbnQgQkxPQ0tTSVpFPTgxOTI7Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIEdldFdvcmtTaGVldFhtbChTdHJlYW0gc3RyZWFtLCBsb25nIHN0YXJ0LCBsb25nIGVuZCwgb3V0IEVuY29kaW5nIGVuY29kaW5nKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJlYW1SZWFkZXIgc3IgPSBuZXcgU3RyZWFtUmVhZGVyKHN0cmVhbSk7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gMDsKLSAgICAgICAgICAgIGNoYXJbXSBibG9jazsKLSAgICAgICAgICAgIGludCBwb3M7Ci0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsgICAgICAgICAgICAKLSAgICAgICAgICAgIE1hdGNoIHN0YXJ0bU1hdGNoLCBlbmRNYXRjaDsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHNpemUgPSBzdHJlYW0uTGVuZ3RoIDwgQkxPQ0tTSVpFID8gKGludClzdHJlYW0uTGVuZ3RoIDogQkxPQ0tTSVpFOwotICAgICAgICAgICAgICAgIGJsb2NrID0gbmV3IGNoYXJbc2l6ZV07Ci0gICAgICAgICAgICAgICAgcG9zID0gc3IuUmVhZEJsb2NrKGJsb2NrLCAwLCBzaXplKTsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBzYi5BcHBlbmQoYmxvY2ssMCxwb3MpOwotICAgICAgICAgICAgICAgIGxlbmd0aCArPSBzaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKGxlbmd0aCA8IHN0YXJ0ICsgMjAgJiYgbGVuZ3RoIDwgZW5kKTsKLSAgICAgICAgICAgIHN0YXJ0bU1hdGNoID0gUmVnZXguTWF0Y2goc2IuVG9TdHJpbmcoKSwgc3RyaW5nLkZvcm1hdCgiKDxbXj5dKnswfVtePl0qPikiLCAic2hlZXREYXRhIikpOwotICAgICAgICAgICAgaWYgKCFzdGFydG1NYXRjaC5TdWNjZXNzKSAvL05vdCBmb3VuZAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVuY29kaW5nID0gc3IuQ3VycmVudEVuY29kaW5nOwotICAgICAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyBzID0gc2IuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcgeG1sID0gcy5TdWJzdHJpbmcoMCwgc3RhcnRtTWF0Y2guSW5kZXgpOyAKLSAgICAgICAgICAgICAgICBpZihzdGFydG1NYXRjaC5WYWx1ZS5FbmRzV2l0aCgiLz4iKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbCArPSBzLlN1YnN0cmluZyhzdGFydG1NYXRjaC5JbmRleCwgcy5MZW5ndGggLSBzdGFydG1NYXRjaC5JbmRleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzci5QZWVrKCkgIT0gLTEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqIEZpeGVzIGlzc3VlIDE0Nzg4LiBGaXggYnkgUGhpbGlwIEdhcnJldHQgKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZW5kU2Vla1N0YXJ0ID0gZW5kOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKGludCBpID0gcmVtb3ZlSW5kZXguQ291bnQgLSAxOyBpID49IDA7IGktLSkgeworICAgICAgX21lcmdlZENlbGxzLkxpc3QuUmVtb3ZlQXQocmVtb3ZlSW5kZXhbaV0pOworICAgIH0KKyAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZW5kU2Vla1N0YXJ0ID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kU2Vla1N0YXJ0ID0gTWF0aC5NYXgoZW5kU2Vla1N0YXJ0IC0gQkxPQ0tTSVpFLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IChpbnQpKGVuZCAtIGVuZFNlZWtTdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLlNlZWsoZW5kU2Vla1N0YXJ0LCBTZWVrT3JpZ2luLkJlZ2luKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9IG5ldyBjaGFyW3NpemVdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyID0gbmV3IFN0cmVhbVJlYWRlcihzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IHNyLlJlYWRCbG9jayhibG9jaywgMCwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChibG9jaywgMCwgcG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gc2IuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRNYXRjaCA9IFJlZ2V4Lk1hdGNoKHMsIHN0cmluZy5Gb3JtYXQoIig8L1tePl0qezB9W14+XSo+KSIsICJzaGVldERhdGEiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZE1hdGNoLlN1Y2Nlc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZW5kTWF0Y2ggPSBSZWdleC5NYXRjaChzLCBzdHJpbmcuRm9ybWF0KCIoPC9bXj5dKnswfVtePl0qPikiLCAic2hlZXREYXRhIikpOwotICAgICAgICAgICAgICAgICAgICB4bWwgKz0gIjxzaGVldERhdGEvPiIgKyBzLlN1YnN0cmluZyhlbmRNYXRjaC5JbmRleCArIGVuZE1hdGNoLkxlbmd0aCwgcy5MZW5ndGggLSAoZW5kTWF0Y2guSW5kZXggKyBlbmRNYXRjaC5MZW5ndGgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNyLlBlZWsoKSA+IC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sICs9IHNyLlJlYWRUb0VuZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBlbmNvZGluZyA9IHNyLkN1cnJlbnRFbmNvZGluZzsKLSAgICAgICAgICAgICAgICByZXR1cm4geG1sOwotICAgICAgICAgICAgfQorICBwcml2YXRlIHZvaWQgRml4U2hhcmVkRm9ybXVsYXNSb3dzKGludCBwb3NpdGlvbiwgaW50IHJvd3MpIHsKKyAgICBMaXN0PEZvcm11bGFzPiBhZGRlZCA9IG5ldyBMaXN0PEZvcm11bGFzPigpOworICAgIExpc3Q8Rm9ybXVsYXM+IGRlbGV0ZWQgPSBuZXcgTGlzdDxGb3JtdWxhcz4oKTsKKworICAgIGZvcmVhY2ggKGludCBpZCBpbiBfc2hhcmVkRm9ybXVsYXMuS2V5cykgeworICAgICAgdmFyIGYgPSBfc2hhcmVkRm9ybXVsYXNbaWRdOworICAgICAgaW50IGZyb21Db2wsCisgICAgICAgICAgZnJvbVJvdywKKyAgICAgICAgICB0b0NvbCwKKyAgICAgICAgICB0b1JvdzsKKworICAgICAgRXhjZWxDZWxsQmFzZS5HZXRSb3dDb2xGcm9tQWRkcmVzcyhmLkFkZHJlc3MsIG91dCBmcm9tUm93LCBvdXQgZnJvbUNvbCwgb3V0IHRvUm93LCBvdXQgdG9Db2wpOworICAgICAgaWYgKHBvc2l0aW9uID49IGZyb21Sb3cKKyAgICAgICAgICAmJiBwb3NpdGlvbiArIChNYXRoLkFicyhyb3dzKSkKKyAgICAgICAgICAgICAgPD0gdG9Sb3cpIC8vSW5zZXJ0L2RlbGV0ZSBpcyB3aGl0aGluIHRoZSBzaGFyZSBmb3JtdWxhIGFkZHJlc3MKKyAgICAgIHsKKyAgICAgICAgaWYgKHJvd3MKKyAgICAgICAgICAgID4gMCkgLy9JbnNlcnQKKyAgICAgICAgeworICAgICAgICAgIGYuQWRkcmVzcyA9CisgICAgICAgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhmcm9tUm93LCBmcm9tQ29sKQorICAgICAgICAgICAgICAgICAgKyAiOiIKKyAgICAgICAgICAgICAgICAgICsgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKHBvc2l0aW9uIC0gMSwgdG9Db2wpOworICAgICAgICAgIGlmICh0b1JvdyAhPSBmcm9tUm93KSB7CisgICAgICAgICAgICBGb3JtdWxhcyBuZXdGID0gbmV3IEZvcm11bGFzKFNvdXJjZUNvZGVUb2tlbml6ZXIuRGVmYXVsdCk7CisgICAgICAgICAgICBuZXdGLlN0YXJ0Q29sID0gZi5TdGFydENvbDsKKyAgICAgICAgICAgIG5ld0YuU3RhcnRSb3cgPSBwb3NpdGlvbiArIHJvd3M7CisgICAgICAgICAgICBuZXdGLkFkZHJlc3MgPQorICAgICAgICAgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhwb3NpdGlvbiArIHJvd3MsIGZyb21Db2wpCisgICAgICAgICAgICAgICAgICAgICsgIjoiCisgICAgICAgICAgICAgICAgICAgICsgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKHRvUm93ICsgcm93cywgdG9Db2wpOworICAgICAgICAgICAgbmV3Ri5Gb3JtdWxhID0gRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVGcm9tUjFDMSgKKyAgICAgICAgICAgICAgICBFeGNlbENlbGxCYXNlLlRyYW5zbGF0ZVRvUjFDMShmLkZvcm11bGEsIGYuU3RhcnRSb3csIGYuU3RhcnRDb2wpLAorICAgICAgICAgICAgICAgIHBvc2l0aW9uLAorICAgICAgICAgICAgICAgIGYuU3RhcnRDb2wpOworICAgICAgICAgICAgYWRkZWQuQWRkKG5ld0YpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoZnJvbVJvdyAtIHJvd3MgPCB0b1JvdykgeworICAgICAgICAgICAgZi5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGZyb21Sb3csIGZyb21Db2wsIHRvUm93ICsgcm93cywgdG9Db2wpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmLkFkZHJlc3MgPQorICAgICAgICAgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhmcm9tUm93LCBmcm9tQ29sKQorICAgICAgICAgICAgICAgICAgICArICI6IgorICAgICAgICAgICAgICAgICAgICArIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyh0b1JvdyArIHJvd3MsIHRvQ29sKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEdldEJsb2NrUG9zKHN0cmluZyB4bWwsIHN0cmluZyB0YWcsIHJlZiBpbnQgc3RhcnQsIHJlZiBpbnQgZW5kKQorICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA8PSB0b1JvdykgeworICAgICAgICBpZiAocm93cworICAgICAgICAgICAgPiAwKSAvL0luc2VydCBiZWZvcmUgc2hpZnQgZG93bgogICAgICAgICB7Ci0gICAgICAgICAgICBNYXRjaCBzdGFydG1NYXRjaCwgZW5kTWF0Y2g7Ci0gICAgICAgICAgICBzdGFydG1NYXRjaCA9IFJlZ2V4Lk1hdGNoKHhtbC5TdWJzdHJpbmcoc3RhcnQpLCBzdHJpbmcuRm9ybWF0KCIoPFtePl0qezB9W14+XSo+KSIsIHRhZykpOyAvLyI8W2EtekEtWjpdKiIgKyB0YWcgKyAiWz9dKj4iKTsKKyAgICAgICAgICBmLlN0YXJ0Um93ICs9IHJvd3M7CisgICAgICAgICAgLy9mLkZvcm11bGEgPSBFeGNlbENlbGwuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoZi5Gb3JtdWxhLCByb3dzLCAwLCBwb3NpdGlvbiwgMCk7IC8vUmVjYWxjIHRoZSBjZWxscyBwb3NpdGlvbnMKKyAgICAgICAgICBmLkFkZHJlc3MgPQorICAgICAgICAgICAgICBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZnJvbVJvdyArIHJvd3MsIGZyb21Db2wpCisgICAgICAgICAgICAgICAgICArICI6IgorICAgICAgICAgICAgICAgICAgKyBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3ModG9Sb3cgKyByb3dzLCB0b0NvbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy9DZWxsc1tmLkFkZHJlc3NdLlNldFNoYXJlZEZvcm11bGFJRChpbnQuTWluVmFsdWUpOworICAgICAgICAgIGlmIChwb3NpdGlvbiA8PSBmcm9tUm93CisgICAgICAgICAgICAgICYmIHBvc2l0aW9uICsgTWF0aC5BYnMocm93cykKKyAgICAgICAgICAgICAgICAgID4gdG9Sb3cpIC8vRGVsZXRlIHRoZSBmb3JtdWxhCisgICAgICAgICAgeworICAgICAgICAgICAgZGVsZXRlZC5BZGQoZik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRvUm93ID0gdG9Sb3cgKyByb3dzIDwgcG9zaXRpb24gLSAxID8gcG9zaXRpb24gLSAxIDogdG9Sb3cgKyByb3dzOworICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDw9IGZyb21Sb3cpIHsKKyAgICAgICAgICAgICAgZnJvbVJvdyA9IGZyb21Sb3cgKyByb3dzIDwgcG9zaXRpb24gPyBwb3NpdGlvbiA6IGZyb21Sb3cgKyByb3dzOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoIXN0YXJ0bU1hdGNoLlN1Y2Nlc3MpIC8vTm90IGZvdW5kCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsKLSAgICAgICAgICAgICAgICBlbmQgPSAtMTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgc3RhcnRQb3M9c3RhcnRtTWF0Y2guSW5kZXgrc3RhcnQ7Ci0gICAgICAgICAgICBpZihzdGFydG1NYXRjaC5WYWx1ZS5TdWJzdHJpbmcoc3RhcnRtTWF0Y2guVmFsdWUuTGVuZ3RoLTIsMSk9PSIvIikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbmQgPSBzdGFydFBvcyArIHN0YXJ0bU1hdGNoLkxlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbmRNYXRjaCA9IFJlZ2V4Lk1hdGNoKHhtbC5TdWJzdHJpbmcoc3RhcnQpLCBzdHJpbmcuRm9ybWF0KCIoPC9bXj5dKnswfVtePl0qPikiLCB0YWcpKTsKLSAgICAgICAgICAgICAgICBpZiAoZW5kTWF0Y2guU3VjY2VzcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZCA9IGVuZE1hdGNoLkluZGV4ICsgZW5kTWF0Y2guTGVuZ3RoICsgc3RhcnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhcnQgPSBzdGFydFBvczsKKyAgICAgICAgICAgIGYuQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhmcm9tUm93LCBmcm9tQ29sLCB0b1JvdywgdG9Db2wpOworICAgICAgICAgICAgQ2VsbHNbZi5BZGRyZXNzXS5TZXRTaGFyZWRGb3JtdWxhSWQoZi5JbmRleCk7CisgICAgICAgICAgICAvL2YuU3RhcnRSb3cgPSBmcm9tUm93OworCisgICAgICAgICAgICAvL2YuRm9ybXVsYSA9IEV4Y2VsQ2VsbC5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhmLkZvcm11bGEsIHJvd3MsIDAsIHBvc2l0aW9uLCAwKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBib29sIFJlYWRVbnRpbChYbWxUZXh0UmVhZGVyIHhyLHBhcmFtcyBzdHJpbmdbXSB0YWdOYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoeHIuRU9GKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB3aGlsZSAoIUFycmF5LkV4aXN0cyh0YWdOYW1lLCB0YWcgPT4geHIuTG9jYWxOYW1lLkVuZHNXaXRoKHRhZykpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhyLlJlYWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoeHIuRU9GKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKHhyLkxvY2FsTmFtZS5FbmRzV2l0aCh0YWdOYW1lWzBdKSk7CisgICAgICB9CisgICAgfQorCisgICAgQWRkRm9ybXVsYXMoYWRkZWQsIHBvc2l0aW9uLCByb3dzKTsKKworICAgIC8vUmVtb3ZlIGZvcm11bGFzCisgICAgZm9yZWFjaCAoRm9ybXVsYXMgZiBpbiBkZWxldGVkKSB7CisgICAgICBfc2hhcmVkRm9ybXVsYXMuUmVtb3ZlKGYuSW5kZXgpOworICAgIH0KKworICAgIC8vRml4IEZvcm11bGFzCisgICAgYWRkZWQgPSBuZXcoKTsKKyAgICBmb3JlYWNoIChpbnQgaWQgaW4gX3NoYXJlZEZvcm11bGFzLktleXMpIHsKKyAgICAgIHZhciBmID0gX3NoYXJlZEZvcm11bGFzW2lkXTsKKyAgICAgIFVwZGF0ZVNoYXJlZEZvcm11bGFSb3cocmVmIGYsIHBvc2l0aW9uLCByb3dzLCByZWYgYWRkZWQpOworICAgIH0KKyAgICBBZGRGb3JtdWxhcyhhZGRlZCwgcG9zaXRpb24sIHJvd3MpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIEFkZEZvcm11bGFzKExpc3Q8Rm9ybXVsYXM+IGFkZGVkLCBpbnQgcG9zaXRpb24sIGludCByb3dzKSB7CisgICAgLy9BZGQgbmV3IGZvcm11bGFzCisgICAgZm9yZWFjaCAoRm9ybXVsYXMgZiBpbiBhZGRlZCkgeworICAgICAgZi5JbmRleCA9IEdldE1heFNoYXJlRnVuY3Rpb25JbmRleChmYWxzZSk7CisgICAgICBfc2hhcmVkRm9ybXVsYXMuQWRkKGYuSW5kZXgsIGYpOworICAgICAgQ2VsbHNbZi5BZGRyZXNzXS5TZXRTaGFyZWRGb3JtdWxhSWQoZi5JbmRleCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIFVwZGF0ZVNoYXJlZEZvcm11bGFSb3coCisgICAgICByZWYgRm9ybXVsYXMgZm9ybXVsYSwKKyAgICAgIGludCBzdGFydFJvdywKKyAgICAgIGludCByb3dzLAorICAgICAgcmVmIExpc3Q8Rm9ybXVsYXM+IG5ld0Zvcm11bGFzKSB7CisgICAgaW50IGZyb21Sb3csCisgICAgICAgIGZyb21Db2wsCisgICAgICAgIHRvUm93LAorICAgICAgICB0b0NvbDsKKyAgICBpbnQgbmV3Rm9ybXVsYXNDb3VudCA9IG5ld0Zvcm11bGFzLkNvdW50OworICAgIEV4Y2VsQ2VsbEJhc2UuR2V0Um93Q29sRnJvbUFkZHJlc3MoCisgICAgICAgIGZvcm11bGEuQWRkcmVzcywKKyAgICAgICAgb3V0IGZyb21Sb3csCisgICAgICAgIG91dCBmcm9tQ29sLAorICAgICAgICBvdXQgdG9Sb3csCisgICAgICAgIG91dCB0b0NvbCk7CisgICAgLy9pbnQgcmVmU3BsaXRzID0gUmVnZXguU3BsaXQoZm9ybXVsYS5Gb3JtdWxhLCAiI1JFRiEiKS5HZXRVcHBlckJvdW5kKDApOworICAgIHN0cmluZyBmb3JtdWFsUjFDMTsKKyAgICBpZiAocm93cyA+IDAgfHwgZnJvbVJvdyA8PSBzdGFydFJvdykgeworICAgICAgZm9ybXVhbFIxQzEgPSBFeGNlbENlbGxCYXNlLlRyYW5zbGF0ZVRvUjFDMSgKKyAgICAgICAgICBmb3JtdWxhLkZvcm11bGEsCisgICAgICAgICAgZm9ybXVsYS5TdGFydFJvdywKKyAgICAgICAgICBmb3JtdWxhLlN0YXJ0Q29sKTsKKyAgICAgIGZvcm11bGEuRm9ybXVsYSA9IEV4Y2VsQ2VsbEJhc2UuVHJhbnNsYXRlRnJvbVIxQzEoZm9ybXVhbFIxQzEsIGZyb21Sb3csIGZvcm11bGEuU3RhcnRDb2wpOworICAgIH0gZWxzZSB7CisgICAgICBmb3JtdWFsUjFDMSA9IEV4Y2VsQ2VsbEJhc2UuVHJhbnNsYXRlVG9SMUMxKAorICAgICAgICAgIGZvcm11bGEuRm9ybXVsYSwKKyAgICAgICAgICBmb3JtdWxhLlN0YXJ0Um93IC0gcm93cywKKyAgICAgICAgICBmb3JtdWxhLlN0YXJ0Q29sKTsKKyAgICAgIGZvcm11bGEuRm9ybXVsYSA9IEV4Y2VsQ2VsbEJhc2UuVHJhbnNsYXRlRnJvbVIxQzEoCisgICAgICAgICAgZm9ybXVhbFIxQzEsCisgICAgICAgICAgZm9ybXVsYS5TdGFydFJvdywKKyAgICAgICAgICBmb3JtdWxhLlN0YXJ0Q29sKTsKKyAgICB9CisgICAgLy9ib29sIGlzUmVmID0gZmFsc2U7CisgICAgLy9Gb3JtdWxhcyByZXN0Rm9ybXVsYT1mb3JtdWxhOworICAgIHN0cmluZyBwcmV2Rm9ybXVhbFIxQzEgPSBmb3JtdWFsUjFDMTsKKyAgICBmb3IgKGludCByb3cgPSBmcm9tUm93OyByb3cgPD0gdG9Sb3c7IHJvdysrKSB7CisgICAgICBmb3IgKGludCBjb2wgPSBmcm9tQ29sOyBjb2wgPD0gdG9Db2w7IGNvbCsrKSB7CisgICAgICAgIHN0cmluZyBuZXdGb3JtdWxhOworICAgICAgICBzdHJpbmcgY3VycmVudEZvcm11bGFSMUMxOworICAgICAgICBpZiAocm93cyA+IDAgfHwgcm93IDwgc3RhcnRSb3cpIHsKKyAgICAgICAgICBuZXdGb3JtdWxhID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcygKKyAgICAgICAgICAgICAgRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVGcm9tUjFDMShmb3JtdWFsUjFDMSwgcm93LCBjb2wpLAorICAgICAgICAgICAgICByb3dzLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICBzdGFydFJvdywKKyAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgY3VycmVudEZvcm11bGFSMUMxID0gRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVUb1IxQzEobmV3Rm9ybXVsYSwgcm93LCBjb2wpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5ld0Zvcm11bGEgPSBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKAorICAgICAgICAgICAgICBFeGNlbENlbGxCYXNlLlRyYW5zbGF0ZUZyb21SMUMxKGZvcm11YWxSMUMxLCByb3cgLSByb3dzLCBjb2wpLAorICAgICAgICAgICAgICByb3dzLAorICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICBzdGFydFJvdywKKyAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgY3VycmVudEZvcm11bGFSMUMxID0gRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVUb1IxQzEobmV3Rm9ybXVsYSwgcm93LCBjb2wpOwogICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBMb2FkQ29sdW1ucyAoWG1sVGV4dFJlYWRlciB4cikvLyhzdHJpbmcgeG1sKQorICAgICAgICBpZiAoY3VycmVudEZvcm11bGFSMUMxCisgICAgICAgICAgICAhPSBwcmV2Rm9ybXVhbFIxQzEpIC8vbmV3Rm9ybXVsYS5Db250YWlucygiI1JFRiEiKSkKICAgICAgICAgewotICAgICAgICAgICAgdmFyIGNvbExpc3QgPSBuZXcgTGlzdDxJUmFuZ2VJRD4oKTsKLSAgICAgICAgICAgIGlmIChSZWFkVW50aWwoeHIsICJjb2xzIiwgInNoZWV0RGF0YSIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgLy9pZiAoeG1sICE9ICIiKQotICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgLy92YXIgeHI9bmV3IFhtbFRleHRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcih4bWwpKTsKLSAgICAgICAgICAgICAgICB3aGlsZSh4ci5SZWFkKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoeHIuTm9kZVR5cGUgPT0gWG1sTm9kZVR5cGUuV2hpdGVzcGFjZSkgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4ci5Mb2NhbE5hbWUgIT0gImNvbCIpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBpZiAoeHIuTm9kZVR5cGUgPT0gWG1sTm9kZVR5cGUuRWxlbWVudCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbiA9IGludC5QYXJzZSh4ci5HZXRBdHRyaWJ1dGUoIm1pbiIpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxDb2x1bW4gY29sID0gbmV3IEV4Y2VsQ29sdW1uKHRoaXMsIG1pbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5Db2x1bW5NYXggPSBpbnQuUGFyc2UoeHIuR2V0QXR0cmlidXRlKCJtYXgiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2wuV2lkdGggPSB4ci5HZXRBdHRyaWJ1dGUoIndpZHRoIikgPT0gbnVsbCA/IDAgOiBkb3VibGUuUGFyc2UoeHIuR2V0QXR0cmlidXRlKCJ3aWR0aCIpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wuQmVzdEZpdCA9IHhyLkdldEF0dHJpYnV0ZSgiYmVzdEZpdCIpICE9IG51bGwgJiYgeHIuR2V0QXR0cmlidXRlKCJiZXN0Rml0IikgPT0gIjEiID8gdHJ1ZSA6IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5Db2xsYXBzZWQgPSB4ci5HZXRBdHRyaWJ1dGUoImNvbGxhcHNlZCIpICE9IG51bGwgJiYgeHIuR2V0QXR0cmlidXRlKCJjb2xsYXBzZWQiKSA9PSAiMSIgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLlBob25ldGljID0geHIuR2V0QXR0cmlidXRlKCJwaG9uZXRpYyIpICE9IG51bGwgJiYgeHIuR2V0QXR0cmlidXRlKCJwaG9uZXRpYyIpID09ICIxIiA/IHRydWUgOiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5PdXRsaW5lTGV2ZWwgPSAoc2hvcnQpKHhyLkdldEF0dHJpYnV0ZSgib3V0bGluZUxldmVsIikgPT0gbnVsbCA/IDAgOiBpbnQuUGFyc2UoeHIuR2V0QXR0cmlidXRlKCJvdXRsaW5lTGV2ZWwiKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5IaWRkZW4gPSB4ci5HZXRBdHRyaWJ1dGUoImhpZGRlbiIpICE9IG51bGwgJiYgeHIuR2V0QXR0cmlidXRlKCJoaWRkZW4iKSA9PSAiMSIgPyB0cnVlIDogZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKDAsIG1pbiwgY29sKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3R5bGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh4ci5HZXRBdHRyaWJ1dGUoInN0eWxlIikgPT0gbnVsbCB8fCAhaW50LlRyeVBhcnNlKHhyLkdldEF0dHJpYnV0ZSgic3R5bGUiKSwgb3V0IHN0eWxlKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0eWxlcy5TZXRWYWx1ZSgwLCBtaW4sIHN0eWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAvL2lmIChyZWZTcGxpdHMgPT0gMCB8fCBSZWdleC5TcGxpdChuZXdGb3JtdWxhLCAiI1JFRiEiKS5HZXRVcHBlckJvdW5kKDApICE9IHJlZlNwbGl0cykKKyAgICAgICAgICAvL3sKKyAgICAgICAgICAvL2lzUmVmID0gdHJ1ZTsKKyAgICAgICAgICBpZiAocm93ID09IGZyb21Sb3cgJiYgY29sID09IGZyb21Db2wpIHsKKyAgICAgICAgICAgIGZvcm11bGEuRm9ybXVsYSA9IG5ld0Zvcm11bGE7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChuZXdGb3JtdWxhcy5Db3VudCA9PSBuZXdGb3JtdWxhc0NvdW50KSB7CisgICAgICAgICAgICAgIGZvcm11bGEuQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcygKKyAgICAgICAgICAgICAgICAgIGZvcm11bGEuU3RhcnRSb3csCisgICAgICAgICAgICAgICAgICBmb3JtdWxhLlN0YXJ0Q29sLAorICAgICAgICAgICAgICAgICAgcm93IC0gMSwKKyAgICAgICAgICAgICAgICAgIGNvbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBuZXdGb3JtdWxhc1tuZXdGb3JtdWxhcy5Db3VudCAtIDFdLkFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoCisgICAgICAgICAgICAgICAgICBuZXdGb3JtdWxhc1tuZXdGb3JtdWxhcy5Db3VudCAtIDFdLlN0YXJ0Um93LAorICAgICAgICAgICAgICAgICAgbmV3Rm9ybXVsYXNbbmV3Rm9ybXVsYXMuQ291bnQgLSAxXS5TdGFydENvbCwKKyAgICAgICAgICAgICAgICAgIHJvdyAtIDEsCisgICAgICAgICAgICAgICAgICBjb2wpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFyIHJlZkZvcm11bGEgPSBuZXcgRm9ybXVsYXMoU291cmNlQ29kZVRva2VuaXplci5EZWZhdWx0KTsKKyAgICAgICAgICAgIHJlZkZvcm11bGEuRm9ybXVsYSA9IG5ld0Zvcm11bGE7CisgICAgICAgICAgICByZWZGb3JtdWxhLlN0YXJ0Um93ID0gcm93OworICAgICAgICAgICAgcmVmRm9ybXVsYS5TdGFydENvbCA9IGNvbDsKKyAgICAgICAgICAgIG5ld0Zvcm11bGFzLkFkZChyZWZGb3JtdWxhKTsKKworICAgICAgICAgICAgLy9yZXN0Rm9ybXVsYSA9IG51bGw7CisgICAgICAgICAgICBwcmV2Rm9ybXVhbFIxQzEgPSBjdXJyZW50Rm9ybXVsYVIxQzE7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWQgdW50aWwgdGhlIG5vZGUgaXMgZm91bmQuIElmIG5vdCBmb3VuZCB0aGUgeG1scmVhZGVyIGlzIHJlc2V0ZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ieHIiPlRoZSByZWFkZXI8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGVUZXh0Ij5UZXh0IHRvIHNlYXJjaCBmb3I8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFsdE5vZGUiPkFsdGVybmF0aXZlIHRleHQgdG8gc2VhcmNoIGZvcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgUmVhZFhtbFJlYWRlclVudGlsKFhtbFRleHRSZWFkZXIgeHIsIHN0cmluZyBub2RlVGV4dCwgc3RyaW5nIGFsdE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHhyLkxvY2FsTmFtZSA9PSBub2RlVGV4dCB8fCB4ci5Mb2NhbE5hbWUgPT0gYWx0Tm9kZSkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSh4ci5SZWFkKCkpOwotICAgICAgICAgICAgeHIuQ2xvc2UoKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMb2FkIEh5cGVybGlua3MKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ4ciI+VGhlIHJlYWRlcjwvcGFyYW0+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBMb2FkSHlwZXJMaW5rcyhYbWxUZXh0UmVhZGVyIHhyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIVJlYWRVbnRpbCh4ciwgImh5cGVybGlua3MiLCAicm93QnJlYWtzIiwgImNvbEJyZWFrcyIpKSByZXR1cm47Ci0gICAgICAgICAgICB3aGlsZSAoeHIuUmVhZCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh4ci5Mb2NhbE5hbWUgPT0gImh5cGVybGluayIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbVJvdywgZnJvbUNvbCwgdG9Sb3csIHRvQ29sOwotICAgICAgICAgICAgICAgICAgICBFeGNlbENlbGxCYXNlLkdldFJvd0NvbEZyb21BZGRyZXNzKHhyLkdldEF0dHJpYnV0ZSgicmVmIiksIG91dCBmcm9tUm93LCBvdXQgZnJvbUNvbCwgb3V0IHRvUm93LCBvdXQgdG9Db2wpOwotICAgICAgICAgICAgICAgICAgICBFeGNlbEh5cGVyTGluayBobCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4ci5HZXRBdHRyaWJ1dGUoImlkIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBySWQgPSB4ci5HZXRBdHRyaWJ1dGUoImlkIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHVyaSA9IFBhcnQuR2V0UmVsYXRpb25zaGlwKHJJZCkuVGFyZ2V0VXJpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgTG9jYXRpb24sIGlmIGFueS4gIEVQUGx1cyBCdWcgMTU1MTcKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9IHhyLkdldEF0dHJpYnV0ZSgibG9jYXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gKHN0cmluZy5Jc051bGxPckVtcHR5KGxvY2F0aW9uKSkgPyAiIiA6ICIjIiArIGxvY2F0aW9uOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJpLklzQWJzb2x1dGVVcmkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobCA9IG5ldyBFeGNlbEh5cGVyTGluayh1cmkuQWJzb2x1dGVVcmkgKyBsb2NhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobCA9IG5ldyBFeGNlbEh5cGVyTGluayh1cmkuT3JpZ2luYWxTdHJpbmcgKyBsb2NhdGlvbiwgVXJpS2luZC5BYnNvbHV0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhsID0gbmV3IEV4Y2VsSHlwZXJMaW5rKHVyaS5PcmlnaW5hbFN0cmluZyArIGxvY2F0aW9uLCBVcmlLaW5kLlJlbGF0aXZlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaGwuUklkID0gcklkOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFydC5EZWxldGVSZWxhdGlvbnNoaXAocklkKTsgLy9EZWxldGUgdGhlIHJlbGF0aW9uc2hpcCwgaXQgaXMgcmVjcmVhdGVkIHdoZW4gd2Ugc2F2ZSB0aGUgcGFja2FnZS4KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh4ci5HZXRBdHRyaWJ1dGUoImxvY2F0aW9uIikgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaGwgPSBuZXcgRXhjZWxIeXBlckxpbmsoeHIuR2V0QXR0cmlidXRlKCJsb2NhdGlvbiIpLCB4ci5HZXRBdHRyaWJ1dGUoImRpc3BsYXkiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBobC5Sb3dTcGFubiA9IHRvUm93IC0gZnJvbVJvdzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhsLkNvbFNwYW5uID0gdG9Db2wgLSBmcm9tQ29sOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHR0ID0geHIuR2V0QXR0cmlidXRlKCJ0b29sdGlwIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkodHQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBobC5Ub29sVGlwID0gdHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgX2h5cGVyTGlua3MuU2V0VmFsdWUoZnJvbVJvdywgZnJvbUNvbCwgaGwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTG9hZCBjZWxscwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InhyIj5UaGUgcmVhZGVyPC9wYXJhbT4KLSAgICAgICAgcHJpdmF0ZSB2b2lkIExvYWRDZWxscyhYbWxUZXh0UmVhZGVyIHhyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL3ZhciBjZWxsTGlzdD1uZXcgTGlzdDxJUmFuZ2VJRD4oKTsKLSAgICAgICAgICAgIC8vdmFyIHJvd0xpc3QgPSBuZXcgTGlzdDxJUmFuZ2VJRD4oKTsKLSAgICAgICAgICAgIC8vdmFyIGZvcm11bGFMaXN0ID0gbmV3IExpc3Q8SVJhbmdlSUQ+KCk7Ci0gICAgICAgICAgICBSZWFkVW50aWwoeHIsICJzaGVldERhdGEiLCAibWVyZ2VDZWxscyIsICJoeXBlcmxpbmtzIiwgInJvd0JyZWFrcyIsICJjb2xCcmVha3MiKTsKLSAgICAgICAgICAgIEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcz1udWxsOwotICAgICAgICAgICAgc3RyaW5nIHR5cGU9IiI7Ci0gICAgICAgICAgICBpbnQgc3R5bGU9MDsKLSAgICAgICAgICAgIGludCByb3cgPSAwOwotICAgICAgICAgICAgaW50IGNvbCA9IDA7Ci0gICAgICAgICAgICB4ci5SZWFkKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHdoaWxlICgheHIuRU9GKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlICh4ci5Ob2RlVHlwZSA9PSBYbWxOb2RlVHlwZS5FbmRFbGVtZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeHIuUmVhZCgpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICh4ci5Mb2NhbE5hbWUgPT0gInJvdyIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHhyLkdldEF0dHJpYnV0ZSgiciIpOwotICAgICAgICAgICAgICAgICAgICBpZiAociA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByb3crKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA9IENvbnZlcnQuVG9JbnQzMihyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChEb0FkZFJvdyh4cikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCAwLCBBZGRSb3coeHIsIHJvdykpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoeHIuR2V0QXR0cmlidXRlKCJzIikgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3R5bGVzLlNldFZhbHVlKHJvdywgMCwgaW50LlBhcnNlKHhyLkdldEF0dHJpYnV0ZSgicyIpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgeHIuUmVhZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh4ci5Mb2NhbE5hbWUgPT0gImMiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9pZiAoY2VsbCAhPSBudWxsKSBjZWxsTGlzdC5BZGQoY2VsbCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vY2VsbCA9IG5ldyBFeGNlbENlbGwodGhpcywgeHIuR2V0QXR0cmlidXRlKCJyIikpOwotICAgICAgICAgICAgICAgICAgICB2YXIgciA9IHhyLkdldEF0dHJpYnV0ZSgiciIpOwotICAgICAgICAgICAgICAgICAgICBpZiAociA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0hhbmRsZSBjZWxscyB3aXRoIG5vIHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICAgICAgY29sKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2Uocm93LCBjb2wsIHJvdywgY29sKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZShyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IGFkZHJlc3MuX2Zyb21Db2w7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgLy9EYXRldHlwZQotICAgICAgICAgICAgICAgICAgICBpZiAoeHIuR2V0QXR0cmlidXRlKCJ0IikgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT14ci5HZXRBdHRyaWJ1dGUoInQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF90eXBlcy5TZXRWYWx1ZShhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCB0eXBlKTsgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSIiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vU3R5bGUKLSAgICAgICAgICAgICAgICAgICAgaWYoeHIuR2V0QXR0cmlidXRlKCJzIikgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9aW50LlBhcnNlKHhyLkdldEF0dHJpYnV0ZSgicyIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9zdHlsZXMuU2V0VmFsdWUoYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fZnJvbUNvbCwgc3R5bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCBudWxsKTsgLy9UT0RPOkJldHRlciBQZXJmb3JtYW5jZSA/PwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHhyLlJlYWQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoeHIuTG9jYWxOYW1lID09ICJ2IikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNldFZhbHVlRnJvbVhtbCh4ciwgdHlwZSwgc3R5bGUsIGFkZHJlc3MuX2Zyb21Sb3csIGFkZHJlc3MuX2Zyb21Db2wpOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgeHIuUmVhZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh4ci5Mb2NhbE5hbWUgPT0gImYiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHQgPSB4ci5HZXRBdHRyaWJ1dGUoInQiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX2Zvcm11bGFzLlNldFZhbHVlKGFkZHJlc3MuX2Zyb21Sb3csIGFkZHJlc3MuX2Zyb21Db2wsIHhyLlJlYWRFbGVtZW50Q29udGVudEFzU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9ybXVsYUxpc3QuQWRkKGNlbGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHQgPT0gInNoYXJlZCIpCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHNpID0geHIuR2V0QXR0cmlidXRlKCJzaSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNmSW5kZXggPSBpbnQuUGFyc2Uoc2kpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mb3JtdWxhcy5TZXRWYWx1ZShhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCBzZkluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKGFkZHJlc3MuX2Zyb21Sb3csIGFkZHJlc3MuX2Zyb21Db2wsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmQWRkcmVzcyA9IHhyLkdldEF0dHJpYnV0ZSgicmVmIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZvcm11bGEgPSBDb252ZXJ0VXRpbC5FeGNlbERlY29kZVN0cmluZyh4ci5SZWFkRWxlbWVudENvbnRlbnRBc1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybXVsYSAhPSAiIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zaGFyZWRGb3JtdWxhcy5BZGQoc2ZJbmRleCwgbmV3IEZvcm11bGFzKFNvdXJjZUNvZGVUb2tlbml6ZXIuRGVmYXVsdCkgeyBJbmRleCA9IHNmSW5kZXgsIEZvcm11bGEgPSBmb3JtdWxhLCBBZGRyZXNzID0gZkFkZHJlc3MsIFN0YXJ0Um93ID0gYWRkcmVzcy5fZnJvbVJvdywgU3RhcnRDb2wgPSBhZGRyZXNzLl9mcm9tQ29sIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ci5SZWFkKCk7ICAvL1NvbWV0aGluZyBpcyB3cm9uZyBpbiB0aGUgc2hlZXQsIHJlYWQgbmV4dAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHQgPT0gImFycmF5IikgLy9UT0RPOiBBcnJheSBmdW5jdGlvbnMgYXJlIG5vdCBzdXBwb3J0IHlldC4gUmVhZCB0aGUgZm9ybXVsYSBmb3IgdGhlIHN0YXJ0IGNlbGwgb25seS4KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFBZGRyZXNzID0geHIuR2V0QXR0cmlidXRlKCJyZWYiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsUmFuZ2UgYWRkcmVzc1JhbmdlID0gbmV3IEV4Y2VsUmFuZ2UodGhpcywgYUFkZHJlc3MpOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBmb3JtdWxhID0geHIuUmVhZEVsZW1lbnRDb250ZW50QXNTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNJbmRleE1hdGNoRm9ybXVsYSA9IFJlZ2V4LklzTWF0Y2goZm9ybXVsYSwgQCJJTkRFWFwoIiwgUmVnZXhPcHRpb25zLklnbm9yZUNhc2UpICYmIFJlZ2V4LklzTWF0Y2goZm9ybXVsYSwgQCJNQVRDSFwoIiwgUmVnZXhPcHRpb25zLklnbm9yZUNhc2UpICYmICFhQWRkcmVzcy5Db250YWlucygiOiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW5kZXhNYXRjaEZvcm11bGEpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzc1JhbmdlLklzQXJyYXlGb3JtdWxhID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sSW5kZXggPSBhZGRyZXNzUmFuZ2UuU3RhcnQuQ29sdW1uOyBjb2xJbmRleCA8PSBhZGRyZXNzUmFuZ2UuRW5kLkNvbHVtbjsgY29sSW5kZXgrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHJvd0luZGV4ID0gYWRkcmVzc1JhbmdlLlN0YXJ0LlJvdzsgcm93SW5kZXggPD0gYWRkcmVzc1JhbmdlLkVuZC5Sb3c7IHJvd0luZGV4KyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZkluZGV4ID0gR2V0TWF4U2hhcmVGdW5jdGlvbkluZGV4KHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zvcm11bGFzLlNldFZhbHVlKHJvd0luZGV4LCBjb2xJbmRleCwgYWZJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvd0luZGV4LCBjb2xJbmRleCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2hhcmVkRm9ybXVsYXMuQWRkKGFmSW5kZXgsIG5ldyBGb3JtdWxhcyhTb3VyY2VDb2RlVG9rZW5pemVyLkRlZmF1bHQpIHsgSW5kZXggPSBhZkluZGV4LCBGb3JtdWxhID0gZm9ybXVsYSwgQWRkcmVzcyA9IGFBZGRyZXNzLCBTdGFydFJvdyA9IGFkZHJlc3MuX2Zyb21Sb3csIFN0YXJ0Q29sID0gYWRkcmVzcy5fZnJvbUNvbCwgSXNBcnJheSA9IGZhbHNlIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3NSYW5nZS5Jc0FycmF5Rm9ybXVsYSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFmSW5kZXggPSBHZXRNYXhTaGFyZUZ1bmN0aW9uSW5kZXgodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgY29sSW5kZXggPSBhZGRyZXNzUmFuZ2UuU3RhcnQuQ29sdW1uOyBjb2xJbmRleCA8PSBhZGRyZXNzUmFuZ2UuRW5kLkNvbHVtbjsgY29sSW5kZXgrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHJvd0luZGV4ID0gYWRkcmVzc1JhbmdlLlN0YXJ0LlJvdzsgcm93SW5kZXggPD0gYWRkcmVzc1JhbmdlLkVuZC5Sb3c7IHJvd0luZGV4KyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mb3JtdWxhcy5TZXRWYWx1ZShyb3dJbmRleCwgY29sSW5kZXgsIGFmSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShyb3dJbmRleCwgY29sSW5kZXgsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zaGFyZWRGb3JtdWxhcy5BZGQoYWZJbmRleCwgbmV3IEZvcm11bGFzKFNvdXJjZUNvZGVUb2tlbml6ZXIuRGVmYXVsdCkgeyBJbmRleCA9IGFmSW5kZXgsIEZvcm11bGEgPSBmb3JtdWxhLCBBZGRyZXNzID0gYUFkZHJlc3MsIFN0YXJ0Um93ID0gYWRkcmVzcy5fZnJvbVJvdywgU3RhcnRDb2wgPSBhZGRyZXNzLl9mcm9tQ29sLCBJc0FycmF5ID0gdHJ1ZSB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIC8vID8/PyBzb21lIG90aGVyIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgeHIuUmVhZCgpOyAgLy9Tb21ldGhpbmcgaXMgd3JvbmcgaW4gdGhlIHNoZWV0LCByZWFkIG5leHQKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHhyLkxvY2FsTmFtZSA9PSAiaXMiKSAgIC8vSW5saW5lIHN0cmluZwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeHIuUmVhZCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoeHIuTG9jYWxOYW1lID09ICJ0IikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCBDb252ZXJ0VXRpbC5FeGNlbERlY29kZVN0cmluZyh4ci5SZWFkRWxlbWVudENvbnRlbnRBc1N0cmluZygpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2NlbGwuX3ZhbHVlID0geHIuUmVhZElubmVyWG1sKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKGFkZHJlc3MuX2Zyb21Sb3csIGFkZHJlc3MuX2Zyb21Db2wsIHhyLlJlYWRPdXRlclhtbCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF90eXBlcy5TZXRWYWx1ZShhZGRyZXNzLl9mcm9tUm93LCBhZGRyZXNzLl9mcm9tQ29sLCAicnQiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9mbGFncy5TZXRGbGFnVmFsdWUoYWRkcmVzcy5fZnJvbVJvdywgYWRkcmVzcy5fZnJvbUNvbCwgdHJ1ZSwgQ2VsbEZsYWdzLlJpY2hUZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vY2VsbC5Jc1JpY2hUZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2lmIChjZWxsICE9IG51bGwpIGNlbGxMaXN0LkFkZChjZWxsKTsKLQotICAgICAgICAgICAgLy9fY2VsbHMgPSBuZXcgUmFuZ2VDb2xsZWN0aW9uKGNlbGxMaXN0KTsKLSAgICAgICAgICAgIC8vX3Jvd3MgPSBuZXcgUmFuZ2VDb2xsZWN0aW9uKHJvd0xpc3QpOwotICAgICAgICAgICAgLy9fZm9ybXVsYUNlbGxzID0gbmV3IFJhbmdlQ29sbGVjdGlvbihmb3JtdWxhTGlzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2wgRG9BZGRSb3coWG1sVGV4dFJlYWRlciB4cikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGMgPSB4ci5HZXRBdHRyaWJ1dGUoInIiKT09bnVsbCA/IDA6MTsKLSAgICAgICAgICAgIGlmICh4ci5HZXRBdHRyaWJ1dGUoInNwYW5zIikgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4geHIuQXR0cmlidXRlQ291bnQgPiBjOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIExvYWQgbWVyZ2VkIGNlbGxzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ieHIiPjwvcGFyYW0+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBMb2FkTWVyZ2VDZWxscyhYbWxUZXh0UmVhZGVyIHhyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihSZWFkVW50aWwoeHIsICJtZXJnZUNlbGxzIiwgImh5cGVybGlua3MiLCAicm93QnJlYWtzIiwgImNvbEJyZWFrcyIpICYmICF4ci5FT0YpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKHhyLlJlYWQoKSkKLSAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHhyLkxvY2FsTmFtZSAhPSAibWVyZ2VDZWxsIikgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh4ci5Ob2RlVHlwZSA9PSBYbWxOb2RlVHlwZS5FbGVtZW50KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYWRkcmVzcyA9IHhyLkdldEF0dHJpYnV0ZSgicmVmIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2ludCBmcm9tUm93LCBmcm9tQ29sLCB0b1JvdywgdG9Db2w7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0V4Y2VsQ2VsbEJhc2UuR2V0Um93Q29sRnJvbUFkZHJlc3MoYWRkcmVzcywgb3V0IGZyb21Sb3csIG91dCBmcm9tQ29sLCBvdXQgdG9Sb3csIG91dCB0b0NvbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2ZvciAoaW50IHJvdyA9IGZyb21Sb3c7IHJvdyA8PSB0b1Jvdzsgcm93KyspCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZvciAoaW50IGNvbCA9IGZyb21Db2w7IGNvbCA8PSB0b0NvbDsgY29sKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgX2ZsYWdzLlNldEZsYWdWYWx1ZShyb3csIGNvbCwgdHJ1ZSxDZWxsRmxhZ3MuTWVyZ2VkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgICAgICAgICAgICAgLy9fbWVyZ2VkQ2VsbHMuTGlzdC5BZGQoYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfbWVyZ2VkQ2VsbHMuQWRkKG5ldyBFeGNlbEFkZHJlc3MoYWRkcmVzcyksIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBVcGRhdGUgbWVyZ2VkIGNlbGxzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic3ciPlRoZSB3cml0ZXI8L3BhcmFtPgotICAgICAgICBwcml2YXRlIHZvaWQgVXBkYXRlTWVyZ2VkQ2VsbHMoU3RyZWFtV3JpdGVyIHN3KQotICAgICAgICB7Ci0gICAgICAgICAgICBzdy5Xcml0ZSgiPG1lcmdlQ2VsbHM+Iik7Ci0gICAgICAgICAgICBmb3JlYWNoIChzdHJpbmcgYWRkcmVzcyBpbiBfbWVyZ2VkQ2VsbHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3cuV3JpdGUoIjxtZXJnZUNlbGwgcmVmPVwiezB9XCIgLz4iLCBhZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3LldyaXRlKCI8L21lcmdlQ2VsbHM+Iik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVhZHMgYSByb3cgZnJvbSB0aGUgWE1MIHJlYWRlcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InhyIj5UaGUgcmVhZGVyPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPlRoZSByb3cgbnVtYmVyPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHJpdmF0ZSBSb3dJbnRlcm5hbCBBZGRSb3coWG1sVGV4dFJlYWRlciB4ciwgaW50IHJvdykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBSb3dJbnRlcm5hbCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29sbGFwc2VkPSh4ci5HZXRBdHRyaWJ1dGUoImNvbGxhcHNlZCIpICE9IG51bGwgJiYgeHIuR2V0QXR0cmlidXRlKCJjb2xsYXBzZWQiKT09ICIxIiA/IHRydWUgOiBmYWxzZSksCi0gICAgICAgICAgICAgICAgT3V0bGluZUxldmVsID0gKHhyLkdldEF0dHJpYnV0ZSgib3V0bGluZUxldmVsIikgPT0gbnVsbCA/IChzaG9ydCkwIDogc2hvcnQuUGFyc2UoeHIuR2V0QXR0cmlidXRlKCJvdXRsaW5lTGV2ZWwiKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpLAotICAgICAgICAgICAgICAgIEhlaWdodCA9ICh4ci5HZXRBdHRyaWJ1dGUoImh0IikgPT0gbnVsbCA/IC0xIDogZG91YmxlLlBhcnNlKHhyLkdldEF0dHJpYnV0ZSgiaHQiKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpLAotICAgICAgICAgICAgICAgIEhpZGRlbiA9ICh4ci5HZXRBdHRyaWJ1dGUoImhpZGRlbiIpICE9IG51bGwgJiYgeHIuR2V0QXR0cmlidXRlKCJoaWRkZW4iKSA9PSAiMSIgPyB0cnVlIDogZmFsc2UpLAotICAgICAgICAgICAgICAgIFBob25ldGljID0geHIuR2V0QXR0cmlidXRlKCJwaCIpICE9IG51bGwgJiYgeHIuR2V0QXR0cmlidXRlKCJwaCIpID09ICIxIiA/IHRydWUgOiBmYWxzZSwKLSAgICAgICAgICAgICAgICBDdXN0b21IZWlnaHQgPSB4ci5HZXRBdHRyaWJ1dGUoImN1c3RvbUhlaWdodCIpID09IG51bGwgPyBmYWxzZSA6IHhyLkdldEF0dHJpYnV0ZSgiY3VzdG9tSGVpZ2h0Iik9PSIxIgotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERhdGVUaW1lIF9leGNlbEVwb2NoID0gbmV3IERhdGVUaW1lKDE4OTksIDEyLCAzMCk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgc3RhdGljIERhdGVUaW1lIEluY29ycmVjdER1cmF0aW9uRnJvbU9BRGF0ZShkb3VibGUgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoaXMgYmVoYXZpb3IgaXMgd3JvbmcuIFJlYWwgT0FEYXRlIHZhbHVlcyBoYXZlIGEgZGlzY29udGludWl0eSBvbiAzMCBEZWNlbWJlciAxODk5LgotICAgICAgICAgICAgLy8gRm9yIHJlYWwgT0FEYXRlIHZhbHVlcywgdGhlIG5lZ2F0aXZlIHNpZ24gYXBwbGllcyBvbmx5IHRvIHRoZSBpbnRlZ2VyIHBvcnRpb24gb2YKLSAgICAgICAgICAgIC8vIHRoZSBmbG9hdCwgKm5vdCogdG8gdGhlIGRlY2ltYWwgcG9ydGlvbi4gRm9yIGV4YW1wbGUsIC0wLjUgYW5kIDAuNSBib3RoIHJlZmVyIHRvIHRoZQotICAgICAgICAgICAgLy8gc2FtZSBkYXRlLCBhbmQgLTEuNSBpcyBhY3R1YWxseSAxODk5LTEyLTI5IDEyOjAwICgxIGRheSBiZWZvcmUgMTg5OS0xMi0zMCAwMDowMAotICAgICAgICAgICAgLy8gcGx1cyAwLjUgZGF5cyksICpub3QqIDE4OTktMTItMjggMTI6MDAgKDEuNSBkYXlzIGJlZm9yZSAxODk5LTEyLTMwIDAwOjAwKS4KLSAgICAgICAgICAgIC8vIAotICAgICAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgQXBwU2hlZXQncyBkdXJhdGlvbi1oYW5kbGluZyBjb2RlIGdldHMgdGhpcyB2ZXJ5IHdyb25nLCBhbmQgdHJlYXRzIHRoZQotICAgICAgICAgICAgLy8gZHVyYXRpb24gYXMgdGhlIG9mZnNldCBmcm9tIDE4OTktMTItMzAgMDA6MDAuIFRoaXMgaXMgY29ycmVjdCBmb3IgcG9zaXRpdmUgZHVyYXRpb25zLAotICAgICAgICAgICAgLy8gYnV0IGl0J3Mgd3JvbmcgZm9yIG5lZ2F0aXZlIGR1cmF0aW9ucy4gVGhpcyBjb2RlIHRyaWVzIHRvIGZpeCB0aGUgYnVnIHRoYXQgZXhpc3RzIGluCi0gICAgICAgICAgICAvLyBBcHBTaGVldCdzIGR1cmF0aW9uLWhhbmRsaW5nIGNvZGUgaGVyZSwgYW5kIGl0IHN1Y2NlZWRzIGluIHNvbWUgY2FzZXMgYW5kIGZhaWxzIGluCi0gICAgICAgICAgICAvLyBvdGhlcnMuCi0gICAgICAgICAgICAvLyAKLSAgICAgICAgICAgIC8vIFRoaXMgY29kZSBhbHNvIGJyZWFrcyBkYXRlL3RpbWUgaGFuZGxpbmcgZm9yIGRhdGVzIGJlZm9yZSAxODk5LTEyLTMwIDAwOjAwIGluIHNvbWUKLSAgICAgICAgICAgIC8vIGNhc2VzLiBTcGVjaWZpY2FsbHksIGRhdGVzIGVuZCB1cCBiZWluZyBvZmZzZXQgYnkgb25lIGRheS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBSZWdhcmRsZXNzLCBjaGFuZ2luZyB0aGlzIGJlaGF2aW9yIGlzIHJpc2t5LCBzbyB0aGlzIGNvZGUgc2ltcGx5IHJlcGxpY2F0ZXMgdGhlCi0gICAgICAgICAgICAvLyBleGlzdGluZyBiZWhhdmlvciBmb3IgCi0gICAgICAgICAgICBpZiAodmFsdWUgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRGF0ZVRpbWUuRnJvbU9BRGF0ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGxvb2tzIGxpa2UgYSB2ZXJ5IGNvbXBsaWNhdGVkIHdheSB0byBjYWxsIFRpbWVTcGFuLkZyb21EYXlzKHZhbHVlKSwgYnV0Ci0gICAgICAgICAgICAgICAgLy8gVGltZVNwYW4uRnJvbURheXMgYWN0dWFsbHkgb25seSBndWFyYW50ZWVzIG1pbGxpc2Vjb25kIHByZWNpc2lvbiwgYW5kIGNyaXRpY2FsbHkKLSAgICAgICAgICAgICAgICAvLyByb3VuZGluZyBpcyBkaWZmZXJlbnQgb24gLk5FVCBDb3JlLCByZXN1bHRpbmcgaW4gdmFsdWVzIGxpa2UgKGUuZy4pIDM6MTU6MDAgYmVpbmcKLSAgICAgICAgICAgICAgICAvLyBpbmNvcnJlY3RseSByb3VuZGVkLgotICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSBEYXRlVGltZS5Gcm9tT0FEYXRlKC12YWx1ZSkgLSBfZXhjZWxFcG9jaDsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2V4Y2VsRXBvY2ggLSBvZmZzZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgU2V0VmFsdWVGcm9tWG1sKFhtbFRleHRSZWFkZXIgeHIsIHN0cmluZyB0eXBlLCBpbnQgc3R5bGVJRCwgaW50IHJvdywgaW50IGNvbCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9YbWxOb2RlIHZub2RlID0gY29sTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOnYiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIC8vaWYgKHZub2RlID09IG51bGwpIHJldHVybiBudWxsOwotICAgICAgICAgICAgaWYgKHR5cGUgPT0gInMiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBpeCA9IHhyLlJlYWRFbGVtZW50Q29udGVudEFzSW50KCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBUZW1wb3JhcnkgZGVidWdnaW5nIGNvZGUgdG8gbG9jYXRlIGludGVybWl0dGVudCAnSW5kZXggd2FzIG91dCBvZiByYW5nZScgZXhjZXB0aW9uLgotICAgICAgICAgICAgICAgIGlmIChpeCA8IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIlJlYWRFbGVtZW50Q29udGVudEFzSW50IHJldHVybmVkIHZhbHVlICd7MH0nIHdoaWNoIGlzIGxlc3MgdGhhbiB6ZXJvLiIsIGl4KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpeCA+PSBfcGFja2FnZS5Xb3JrYm9vay5fc2hhcmVkU3RyaW5nc0xpc3QuQ291bnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIlJlYWRFbGVtZW50Q29udGVudEFzSW50IHJldHVybmVkIGluZGV4IHZhbHVlICd7MH0nIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiBfc2hhcmVkU3RyaW5nc0xpc3QgY291bnQgb2YgezF9LiIsIGl4LCBfcGFja2FnZS5Xb3JrYm9vay5fc2hhcmVkU3RyaW5nc0xpc3QuQ291bnQpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCBfcGFja2FnZS5Xb3JrYm9vay5fc2hhcmVkU3RyaW5nc0xpc3RbaXhdLlRleHQpOwotICAgICAgICAgICAgICAgIGlmIChfcGFja2FnZS5Xb3JrYm9vay5fc2hhcmVkU3RyaW5nc0xpc3RbaXhdLmlzUmljaFRleHQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZmxhZ3MuU2V0RmxhZ1ZhbHVlKHJvdywgY29sLCB0cnVlLCBDZWxsRmxhZ3MuUmljaFRleHQpOwotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0eXBlID09ICJzdHIiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIENvbnZlcnRVdGlsLkV4Y2VsRGVjb2RlU3RyaW5nKHhyLlJlYWRFbGVtZW50Q29udGVudEFzU3RyaW5nKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImIiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsICh4ci5SZWFkRWxlbWVudENvbnRlbnRBc1N0cmluZygpIT0iMCIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImUiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIEdldEVycm9yVHlwZSh4ci5SZWFkRWxlbWVudENvbnRlbnRBc1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHYgPSB4ci5SZWFkRWxlbWVudENvbnRlbnRBc1N0cmluZygpOwotICAgICAgICAgICAgICAgIHZhciBuZiA9IFdvcmtib29rLlN0eWxlcy5DZWxsWGZzW3N0eWxlSURdLk51bWJlckZvcm1hdElkOwotICAgICAgICAgICAgICAgIGlmICgobmYgPj0gMjAgJiYgbmYgPD0gMjEpIHx8IChuZiA+PSA0NSAmJiBuZiA8PSA0NykpICAvLyBEdXJhdGlvbgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJlczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZSh2LCBOdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgcmVzKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFdvcmtib29rLkRhdGUxOTA0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyArPSBFeGNlbFdvcmtib29rLmRhdGUxOTA0T2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA+PSAtNjU3NDM1LjAgJiYgcmVzIDwgMjk1ODQ2NS45OTk5OTk5KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgRHVyYXRpb24gdmFsdWUgZXhwcmVzc2VkIGFzIGEgRGF0ZVRpbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgSW5jb3JyZWN0RHVyYXRpb25Gcm9tT0FEYXRlKHJlcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvcGUgd2l0aCBHb29nbGUgU2hlZXRzIGV4cG9ydCBvZiBjZWxscyBoYXZpbmcgYSBmb3JtdWxhLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhdGhlciB0aGFuIGV4cG9ydGluZyB0aGUgbmF0aXZlIHZhbHVlLCB0aGV5IGV4cG9ydCB0aGUgZm9ybWF0dGVkIHZhbHVlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIHYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvcGUgd2l0aCBHb29nbGUgU2hlZXRzIGV4cG9ydCBvZiBjZWxscyBoYXZpbmcgYSBmb3JtdWxhLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmF0aGVyIHRoYW4gZXhwb3J0aW5nIHRoZSBuYXRpdmUgdmFsdWUsIHRoZXkgZXhwb3J0IHRoZSBmb3JtYXR0ZWQgdmFsdWUuCi0gICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCB2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICgobmYgPj0gMTQgJiYgbmYgPD0gMTkpIHx8IChuZiA9PSAyMikpICAgLy8gRGF0ZVRpbWUKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSByZXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2UodiwgTnVtYmVyU3R5bGVzLkFueSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IHJlcykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXb3JrYm9vay5EYXRlMTkwNCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgKz0gRXhjZWxXb3JrYm9vay5kYXRlMTkwNE9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPj0gLTY1NzQzNS4wICYmIHJlcyA8IDI5NTg0NjUuOTk5OTk5OSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCBEYXRlVGltZS5Gcm9tT0FEYXRlKHJlcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvcGUgd2l0aCBHb29nbGUgU2hlZXRzIGV4cG9ydCBvZiBjZWxscyBoYXZpbmcgYSBmb3JtdWxhLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhdGhlciB0aGFuIGV4cG9ydGluZyB0aGUgbmF0aXZlIHZhbHVlLCB0aGV5IGV4cG9ydCB0aGUgZm9ybWF0dGVkIHZhbHVlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIHYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29wZSB3aXRoIEdvb2dsZSBTaGVldHMgZXhwb3J0IG9mIGNlbGxzIGhhdmluZyBhIGZvcm11bGEuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBSYXRoZXIgdGhhbiBleHBvcnRpbmcgdGhlIG5hdGl2ZSB2YWx1ZSwgdGhleSBleHBvcnQgdGhlIGZvcm1hdHRlZCB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIHYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkOwotICAgICAgICAgICAgICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKHYsIE51bWJlclN0eWxlcy5BbnksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCBkKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3BlIHdpdGggR29vZ2xlIFNoZWV0cyBleHBvcnQgb2YgY2VsbHMgaGF2aW5nIGEgZm9ybXVsYS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJhdGhlciB0aGFuIGV4cG9ydGluZyB0aGUgbmF0aXZlIHZhbHVlLCB0aGV5IGV4cG9ydCB0aGUgZm9ybWF0dGVkIHZhbHVlLgotICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgdik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgZG91YmxlLk5hTik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIG9iamVjdCBHZXRFcnJvclR5cGUoc3RyaW5nIHYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBFeGNlbEVycm9yVmFsdWUuUGFyc2Uodi5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgIC8vc3dpdGNoKHYuVG9VcHBlcigpKQotICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAvLyAgICBjYXNlICIjRElWLzAhIjoKLSAgICAgICAgICAgIC8vICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JWYWx1ZS5jcmUoZUVycm9yVHlwZS5EaXYwKTsKLSAgICAgICAgICAgIC8vICAgIGNhc2UgIiNSRUYhIjoKLSAgICAgICAgICAgIC8vICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JWYWx1ZShlRXJyb3JUeXBlLlJlZik7Ci0gICAgICAgICAgICAvLyAgICBjYXNlICIjTi9BIjoKLSAgICAgICAgICAgIC8vICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JWYWx1ZShlRXJyb3JUeXBlLk5BKTsKLSAgICAgICAgICAgIC8vICAgIGNhc2UgIiNOQU1FPyI6Ci0gICAgICAgICAgICAvLyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yVmFsdWUoZUVycm9yVHlwZS5OYW1lKTsKLSAgICAgICAgICAgIC8vICAgIGNhc2UgIiNOVUxMISI6Ci0gICAgICAgICAgICAvLyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yVmFsdWUoZUVycm9yVHlwZS5OdWxsKTsKLSAgICAgICAgICAgIC8vICAgIGNhc2UgIiNOVU0hIjoKLSAgICAgICAgICAgIC8vICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JWYWx1ZShlRXJyb3JUeXBlLk51bSk7Ci0gICAgICAgICAgICAvLyAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gICAgICAgIHJldHVybiBuZXcgRXhjZWxFcnJvclZhbHVlKGVFcnJvclR5cGUuVmFsdWUpOwotICAgICAgICAgICAgLy99Ci0gICAgICAgIH0KLSAgICAgICAgLy9wcml2YXRlIHN0cmluZyBHZXRTaGFyZWRTdHJpbmcoaW50IHN0cmluZ0lEKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgc3RyaW5nIHJldFZhbHVlID0gbnVsbDsKLSAgICAgICAgLy8gICAgWG1sTm9kZUxpc3Qgc3RyaW5nTm9kZXMgPSB4bFBhY2thZ2UuV29ya2Jvb2suU2hhcmVkU3RyaW5nc1htbC5TZWxlY3ROb2RlcyhzdHJpbmcuRm9ybWF0KCIvL2Q6c2kiLCBzdHJpbmdJRCksIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAvLyAgICBYbWxOb2RlIHN0cmluZ05vZGUgPSBzdHJpbmdOb2Rlc1tzdHJpbmdJRF07Ci0gICAgICAgIC8vICAgIGlmIChzdHJpbmdOb2RlICE9IG51bGwpCi0gICAgICAgIC8vICAgICAgICByZXRWYWx1ZSA9IHN0cmluZ05vZGUuSW5uZXJUZXh0OwotICAgICAgICAvLyAgICByZXR1cm4gKHJldFZhbHVlKTsKKyAgICAgICAgLy8gICAgfQorICAgICAgICAvLyAgICBlbHNlCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIGlzUmVmID0gZmFsc2U7CisgICAgICAgIC8vICAgIH0KICAgICAgICAgLy99Ci0gICAgICAgICNlbmRyZWdpb24KLQkJI3JlZ2lvbiBIZWFkZXJGb290ZXIKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQSByZWZlcmVuY2UgdG8gdGhlIGhlYWRlciBhbmQgZm9vdGVyIGNsYXNzIHdoaWNoIGFsbG93cyB5b3UgdG8gCi0JCS8vLyBzZXQgdGhlIGhlYWRlciBhbmQgZm9vdGVyIGZvciBhbGwgb2RkLCBldmVuIGFuZCBmaXJzdCBwYWdlcyBvZiB0aGUgd29ya3NoZWV0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIFRvIGZvcm1hdCB0aGUgdGV4dCB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGZvcm1hdAotICAgICAgICAvLy8gPGxpc3QgdHlwZT0idGFibGUiPgotICAgICAgICAvLy8gPGxpc3RoZWFkZXI+PHRlcm0+UHJlZml4PC90ZXJtPjxkZXNjcmlwdGlvbj5EZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+PC9saXN0aGVhZGVyPgotICAgICAgICAvLy8gPGl0ZW0+PHRlcm0+JmFtcDtVPC90ZXJtPjxkZXNjcmlwdGlvbj5VbmRlcmxpbmVkPC9kZXNjcmlwdGlvbj48L2l0ZW0+Ci0gICAgICAgIC8vLyA8aXRlbT48dGVybT4mYW1wO0U8L3Rlcm0+PGRlc2NyaXB0aW9uPkRvdWJsZSBVbmRlcmxpbmU8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLSAgICAgICAgLy8vIDxpdGVtPjx0ZXJtPiZhbXA7Szp4eHh4eHg8L3Rlcm0+PGRlc2NyaXB0aW9uPkNvbG9yLiBleCAmYW1wO0s6RkYwMDAwIGZvciByZWQ8L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLSAgICAgICAgLy8vIDxpdGVtPjx0ZXJtPiZhbXA7IkZvbnQsUmVndWxhciBCb2xkIEl0YWxpYyI8L3Rlcm0+PGRlc2NyaXB0aW9uPkNoYW5nZXMgdGhlIGZvbnQuIFJlZ3VsYXIgb3IgQm9sZCBvciBJdGFsaWMgb3IgQm9sZCBJdGFsaWMgY2FuIGJlIHVzZWQuIGV4ICZhbXA7IkFyaWFsLEJvbGQgSXRhbGljIjwvZGVzY3JpcHRpb24+PC9pdGVtPgotICAgICAgICAvLy8gPGl0ZW0+PHRlcm0+JmFtcDtubjwvdGVybT48ZGVzY3JpcHRpb24+Q2hhbmdlIGZvbnQgc2l6ZS4gbm4gaXMgYW4gaW50ZWdlci4gZXggJmFtcDsyNDwvZGVzY3JpcHRpb24+PC9pdGVtPgotICAgICAgICAvLy8gPGl0ZW0+PHRlcm0+JmFtcDtHPC90ZXJtPjxkZXNjcmlwdGlvbj5QbGFjZWhvbGRlciBmb3IgaW1hZ2VzLiBJbWFnZXMgY2FuIG5vdCBiZSBhZGRlZCBieSB0aGUgbGlicmFyeSwgYnV0IGl0cyBwb3NzaWJsZSB0byB1c2UgaW4gYSB0ZW1wbGF0ZS48L2Rlc2NyaXB0aW9uPjwvaXRlbT4KLSAgICAgICAgLy8vIDwvbGlzdD4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgcHVibGljIEV4Y2VsSGVhZGVyRm9vdGVyIEhlYWRlckZvb3RlcgotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlpZiAoX2hlYWRlckZvb3RlciA9PSBudWxsKQotCQkJCXsKLSAgICAgICAgICAgICAgICAgICAgWG1sTm9kZSBoZWFkZXJGb290ZXJOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOmhlYWRlckZvb3RlciIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyRm9vdGVyTm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyRm9vdGVyTm9kZT0gQ3JlYXRlTm9kZSgiZDpoZWFkZXJGb290ZXIiKTsKLSAgICAgICAgICAgICAgICAgICAgX2hlYWRlckZvb3RlciA9IG5ldyBFeGNlbEhlYWRlckZvb3RlcihOYW1lU3BhY2VNYW5hZ2VyLCBoZWFkZXJGb290ZXJOb2RlLCB0aGlzKTsKLQkJCQl9ICAgICAgICAgICAgICAgIAotCQkJCXJldHVybiAoX2hlYWRlckZvb3Rlcik7Ci0JCQl9Ci0JCX0KLQkJI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gIlByaW50ZXJTZXR0aW5ncyIKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUHJpbnRlciBzZXR0aW5ncwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxQcmludGVyU2V0dGluZ3MgUHJpbnRlclNldHRpbmdzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBwcyA9IG5ldyBFeGNlbFByaW50ZXJTZXR0aW5ncyhOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBwcy5TY2hlbWFOb2RlT3JkZXIgPSBTY2hlbWFOb2RlT3JkZXI7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotCQkjZW5kcmVnaW9uIC8vIEVORCBXb3Jrc2hlZXQgUHVibGljIFByb3BlcnRpZXMKLQotCQkjcmVnaW9uIFdvcmtzaGVldCBQdWJsaWMgTWV0aG9kcwotICAgICAgICAKLSAgICAgICAgLy8vLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBhbiBpbmRpdmlkdWFsIGNlbGwgd2l0aGluIHRoZSB3b3Jrc2hlZXQuCi0gICAgICAgIC8vLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vLy8gPHBhcmFtIG5hbWU9InJvdyI+VGhlIHJvdyBudW1iZXIgaW4gdGhlIHdvcmtzaGVldDwvcGFyYW0+Ci0gICAgICAgIC8vLy8vIDxwYXJhbSBuYW1lPSJjb2wiPlRoZSBjb2x1bW4gbnVtYmVyIGluIHRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgotICAgICAgICAvLy8vLyA8cmV0dXJucz48L3JldHVybnM+CQkKLSAgICAgICAgLy9pbnRlcm5hbCBFeGNlbENlbGwgQ2VsbChpbnQgcm93LCBpbnQgY29sKQorICAgICAgICAvL2Vsc2UKICAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIHJldHVybiBuZXcgRXhjZWxDZWxsKF92YWx1ZXMsIHJvdywgY29sKTsKKyAgICAgICAgLy8gICAgaXNSZWYgPSBmYWxzZTsKICAgICAgICAgLy99Ci0gICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIGEgcmFuZ2Ugb2YgY2VsbHMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4gIAotICAgICAgICBwdWJsaWMgRXhjZWxSYW5nZSBDZWxscwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxSYW5nZSh0aGlzLCAxLCAxLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgc2VsZWN0ZWQgcmFuZ2Ugb2YgY2VsbHMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4gIAotICAgICAgICBwdWJsaWMgRXhjZWxSYW5nZSBTZWxlY3RlZFJhbmdlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFJhbmdlKHRoaXMsIFZpZXcuU2VsZWN0ZWRSYW5nZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgTWVyZ2VDZWxsc0NvbGxlY3Rpb24gX21lcmdlZENlbGxzID0gbmV3IE1lcmdlQ2VsbHNDb2xsZWN0aW9uKCk7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHJlc3NlcyB0byBtZXJnZWQgcmFuZ2VzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBNZXJnZUNlbGxzQ29sbGVjdGlvbiBNZXJnZWRDZWxscwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBfbWVyZ2VkQ2VsbHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotCQkvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIGFuIGluZGl2aWR1YWwgcm93IHdpdGhpbiB0aGUgd29ya3NoZWV0IHNvIHlvdSBjYW4gc2V0IGl0cyBwcm9wZXJ0aWVzLgotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InJvdyI+VGhlIHJvdyBudW1iZXIgaW4gdGhlIHdvcmtzaGVldDwvcGFyYW0+Ci0JCS8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0JCXB1YmxpYyBFeGNlbFJvdyBSb3coaW50IHJvdykKLQkJewotICAgICAgICAgICAgLy9FeGNlbFJvdyByOwotICAgICAgICAgICAgLy91bG9uZyBpZCA9IEV4Y2VsUm93LkdldFJvd0lEKF9zaGVldElELCByb3cpOwotICAgICAgICAgICAgLy9UT0RPOiBGaXhhLgotICAgICAgICAgICAgLy92YXIgdiA9IF92YWx1ZXMuR2V0VmFsdWUocm93LCAwKTsKLSAgICAgICAgICAgIC8vaWYgKHYhPW51bGwpCi0gICAgICAgICAgICAvL3sKLSAgICAgICAgICAgIC8vICAgIHZhciByaT0oUm93SW50ZXJuYWwpdjsKLSAgICAgICAgICAgIC8vICAgIHIgPSBuZXcgRXhjZWxSb3codGhpcywgcm93KQotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAvL2Vsc2UKLSAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgIC8vciA9IG5ldyBFeGNlbFJvdyh0aGlzLCByb3cpOwotICAgICAgICAgICAgICAgIC8vX3ZhbHVlcy5TZXRWYWx1ZShyb3csIDAsIHIpOwotICAgICAgICAgICAgICAgIC8vX3Jvd3MuQWRkKHIpOwotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOwotICAgICAgICAgICAgaWYgKHJvdyA8IDEgfHwgcm93ID4gRXhjZWxQYWNrYWdlLk1heFJvd3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiUm93IG51bWJlciBvdXQgb2YgYm91bmRzIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFJvdyh0aGlzLCByb3cpOwotICAgICAgICAgICAgLy9yZXR1cm4gcjsKLQkJfQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gYW4gaW5kaXZpZHVhbCBjb2x1bW4gd2l0aGluIHRoZSB3b3Jrc2hlZXQgc28geW91IGNhbiBzZXQgaXRzIHByb3BlcnRpZXMuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iY29sIj5UaGUgY29sdW1uIG51bWJlciBpbiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KLQkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLQkJcHVibGljIEV4Y2VsQ29sdW1uIENvbHVtbihpbnQgY29sKQotCQl7ICAgICAgICAgICAgCi0gICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOwotICAgICAgICAgICAgaWYgKGNvbCA8IDEgfHwgY29sID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQ29sdW1uIG51bWJlciBvdXQgb2YgYm91bmRzIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIGNvbHVtbiA9IF92YWx1ZXMuR2V0VmFsdWUoMCwgY29sKSBhcyBFeGNlbENvbHVtbjsKLSAgICAgICAgICAgIGlmIChjb2x1bW4hPW51bGwpCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uQ29sdW1uTWluICE9IGNvbHVtbi5Db2x1bW5NYXgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgbWF4Q29sID0gY29sdW1uLkNvbHVtbk1heDsKLSAgICAgICAgICAgICAgICAgICAgY29sdW1uLkNvbHVtbk1heCA9IGNvbDsKLSAgICAgICAgICAgICAgICAgICAgRXhjZWxDb2x1bW4gY29weSA9IENvcHlDb2x1bW4oY29sdW1uLCBjb2wgKyAxLCBtYXhDb2wpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgcj0wLCBjPWNvbDsKLSAgICAgICAgICAgICAgICBpZiAoX3ZhbHVlcy5QcmV2Q2VsbChyZWYgciwgcmVmIGMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gX3ZhbHVlcy5HZXRWYWx1ZSgwLCBjKSBhcyBFeGNlbENvbHVtbjsKLSAgICAgICAgICAgICAgICAgICAgaW50IG1heENvbCA9IGNvbHVtbi5Db2x1bW5NYXg7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYXhDb2wgPj0gY29sKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW4uQ29sdW1uTWF4ID0gY29sLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4Q29sID4gY29sKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsQ29sdW1uIG5ld0MgPSBDb3B5Q29sdW1uKGNvbHVtbiwgY29sICsgMSwgbWF4Q29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb3B5Q29sdW1uKGNvbHVtbiwgY29sLCBjb2wpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vZm9yZWFjaCAoRXhjZWxDb2x1bW4gY2hlY2tDb2x1bW4gaW4gX2NvbHVtbnMpCi0gICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgLy8gICAgaWYgKGNvbCA+IGNoZWNrQ29sdW1uLkNvbHVtbk1pbiAmJiBjb2wgPD0gY2hlY2tDb2x1bW4uQ29sdW1uTWF4KQotICAgICAgICAgICAgICAgIC8vICAgIHsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgaW50IG1heENvbCA9IGNoZWNrQ29sdW1uLkNvbHVtbk1heDsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgY2hlY2tDb2x1bW4uQ29sdW1uTWF4ID0gY29sIC0gMTsKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgaWYgKG1heENvbCA+IGNvbCkKLSAgICAgICAgICAgICAgICAvLyAgICAgICAgewotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgRXhjZWxDb2x1bW4gbmV3QyA9IENvcHlDb2x1bW4oY2hlY2tDb2x1bW4sIGNvbCArIDEsIG1heENvbCk7Ci0gICAgICAgICAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyAgICAgICAgcmV0dXJuIENvcHlDb2x1bW4oY2hlY2tDb2x1bW4sIGNvbCxjb2wpOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vICAgIH0KLSAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICBjb2x1bW4gPSBuZXcgRXhjZWxDb2x1bW4odGhpcywgY29sKTsKLSAgICAgICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKDAsIGNvbCwgY29sdW1uKTsKLSAgICAgICAgICAgICAgICAvL19jb2x1bW5zLkFkZChjb2x1bW4pOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjb2x1bW47Ci0JCX0KKyAgICAgICAgLy9pZiAocmVzdEZvcm11bGE9PW51bGwpCisgICAgICAgIC8veworICAgICAgICAvL2lmIChuZXdGb3JtdWxhcy5Db3VudCA9PSBuZXdGb3JtdWxhc0NvdW50KQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgZm9ybXVsYS5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGZvcm11bGEuU3RhcnRSb3csIGZvcm11bGEuU3RhcnRDb2wsIHJvdyAtIDEsIGNvbCk7CisgICAgICAgIC8vfQorICAgICAgICAvL2Vsc2UKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Zvcm11bGFzW25ld0Zvcm11bGFzLkNvdW50IC0gMV0uQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhuZXdGb3JtdWxhc1tuZXdGb3JtdWxhcy5Db3VudCAtIDFdLlN0YXJ0Um93LCBuZXdGb3JtdWxhc1swXS5TdGFydENvbCwgcm93IC0gMSwgY29sKTsKKyAgICAgICAgLy99CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd29ya3NoZWV0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgbmFtZSBvZiB0aGUgd29ya3NoZWV0PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxDb2x1bW4gQ29weUNvbHVtbihFeGNlbENvbHVtbiBjLCBpbnQgY29sLCBpbnQgbWF4Q29sKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeGNlbENvbHVtbiBuZXdDID0gbmV3IEV4Y2VsQ29sdW1uKHRoaXMsIGNvbCk7Ci0gICAgICAgICAgICBuZXdDLkNvbHVtbk1heCA9IG1heENvbCA8IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zID8gbWF4Q29sIDogRXhjZWxQYWNrYWdlLk1heENvbHVtbnM7Ci0gICAgICAgICAgICBpZiAoYy5TdHlsZU5hbWUgIT0gIiIpCi0gICAgICAgICAgICAgICAgbmV3Qy5TdHlsZU5hbWUgPSBjLlN0eWxlTmFtZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBuZXdDLlN0eWxlSUQgPSBjLlN0eWxlSUQ7CisgICAgICAgIC8vcmVzdEZvcm11bGEgPSBuZXcgRm9ybXVsYXMoKTsKKyAgICAgICAgLy9yZXN0Rm9ybXVsYS5Gb3JtdWxhID0gbmV3Rm9ybXVsYTsKKyAgICAgICAgLy9yZXN0Rm9ybXVsYS5TdGFydFJvdyA9IHJvdzsKKyAgICAgICAgLy9yZXN0Rm9ybXVsYS5TdGFydENvbCA9IGNvbDsKKyAgICAgICAgLy9uZXdGb3JtdWxhcy5BZGQocmVzdEZvcm11bGEpOworICAgICAgICAvL30KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHJvd3MgPCAwICYmIGZvcm11bGEuU3RhcnRSb3cgPiBzdGFydFJvdykgeworICAgICAgaWYgKGZvcm11bGEuU3RhcnRSb3cgKyByb3dzIDwgc3RhcnRSb3cpIHsKKyAgICAgICAgZm9ybXVsYS5TdGFydFJvdyA9IHN0YXJ0Um93OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9ybXVsYS5TdGFydFJvdyArPSByb3dzOworICAgICAgfQorICAgIH0KKyAgICBpZiAobmV3Rm9ybXVsYXMuQ291bnQgPiBuZXdGb3JtdWxhc0NvdW50KSB7CisgICAgICBuZXdGb3JtdWxhc1tuZXdGb3JtdWxhcy5Db3VudCAtIDFdLkFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoCisgICAgICAgICAgbmV3Rm9ybXVsYXNbbmV3Rm9ybXVsYXMuQ291bnQgLSAxXS5TdGFydFJvdywKKyAgICAgICAgICBuZXdGb3JtdWxhc1tuZXdGb3JtdWxhcy5Db3VudCAtIDFdLlN0YXJ0Q29sLAorICAgICAgICAgIHRvUm93LAorICAgICAgICAgIHRvQ29sKTsKKyAgICB9CisgIH0KIAotICAgICAgICAgICAgbmV3Qy5PdXRsaW5lTGV2ZWwgPSBjLk91dGxpbmVMZXZlbDsKLSAgICAgICAgICAgIG5ld0MuUGhvbmV0aWMgPSBjLlBob25ldGljOwotICAgICAgICAgICAgbmV3Qy5CZXN0Rml0ID0gYy5CZXN0Rml0OwotICAgICAgICAgICAgLy9fY29sdW1ucy5BZGQobmV3Qyk7Ci0gICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKDAsIGNvbCwgbmV3Qyk7Ci0gICAgICAgICAgICBuZXdDLl93aWR0aCA9IGMuX3dpZHRoOwotICAgICAgICAgICAgbmV3Qy5faGlkZGVuID0gYy5faGlkZGVuOwotICAgICAgICAgICAgcmV0dXJuIG5ld0M7Ci0gICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBNYWtlIHRoZSBjdXJyZW50IHdvcmtzaGVldCBhY3RpdmUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFNlbGVjdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZpZXcuVGFiU2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgLy9TZWxlY3QoQWRkcmVzcywgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2VsZWN0cyBhIHJhbmdlIGluIHRoZSB3b3Jrc2hlZXQuIFRoZSBhY3RpdmUgY2VsbCBpcyB0aGUgdG9wbW9zdCBjZWxsLgotICAgICAgICAvLy8gTWFrZSB0aGUgY3VycmVudCB3b3Jrc2hlZXQgYWN0aXZlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkFkZHJlc3MiPkFuIGFkZHJlc3MgcmFuZ2U8L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBTZWxlY3Qoc3RyaW5nIEFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNlbGVjdChBZGRyZXNzLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZWxlY3RzIGEgcmFuZ2UgaW4gdGhlIHdvcmtzaGVldC4gVGhlIGFjdGljZSBjZWxsIGlzIHRoZSB0b3Btb3N0IGNlbGwuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQWRkcmVzcyI+QSByYW5nZSBvZiBjZWxsczwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iU2VsZWN0U2hlZXQiPk1ha2UgdGhlIHNoZWV0IGFjdGl2ZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFNlbGVjdChzdHJpbmcgQWRkcmVzcywgYm9vbCBTZWxlY3RTaGVldCkKLSAgICAgICAgewotICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKLSAgICAgICAgICAgIGludCBmcm9tQ29sLCBmcm9tUm93LCB0b0NvbCwgdG9Sb3c7Ci0gICAgICAgICAgICAvL0dldCByb3dzIGFuZCBjb2x1bW5zIGFuZCB2YWxpZGF0ZSBhcyB3ZWxsCi0gICAgICAgICAgICBFeGNlbENlbGxCYXNlLkdldFJvd0NvbEZyb21BZGRyZXNzKEFkZHJlc3MsIG91dCBmcm9tUm93LCBvdXQgZnJvbUNvbCwgb3V0IHRvUm93LCBvdXQgdG9Db2wpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBEZWxldGUgdGhlIHNwZWNpZmllZCByb3cgZnJvbSB0aGUgd29ya3NoZWV0LgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+QSByb3cgdG8gYmUgZGVsZXRlZDwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIERlbGV0ZVJvdyhpbnQgcm93KSB7CisgICAgRGVsZXRlUm93KHJvdywgMSk7CisgIH0KIAotICAgICAgICAgICAgaWYgKFNlbGVjdFNoZWV0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZpZXcuVGFiU2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVmlldy5TZWxlY3RlZFJhbmdlID0gQWRkcmVzczsKLSAgICAgICAgICAgIFZpZXcuQWN0aXZlQ2VsbCA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhmcm9tUm93LCBmcm9tQ29sKTsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZWxlY3RzIGEgcmFuZ2UgaW4gdGhlIHdvcmtzaGVldC4gVGhlIGFjdGl2ZSBjZWxsIGlzIHRoZSB0b3Btb3N0IGNlbGwgb2YgdGhlIGZpcnN0IGFkZHJlc3MuCi0gICAgICAgIC8vLyBNYWtlIHRoZSBjdXJyZW50IHdvcmtzaGVldCBhY3RpdmUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQWRkcmVzcyI+QW4gYWRkcmVzcyByYW5nZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFNlbGVjdChFeGNlbEFkZHJlc3MgQWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKLSAgICAgICAgICAgIFNlbGVjdChBZGRyZXNzLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZWxlY3RzIGEgcmFuZ2UgaW4gdGhlIHdvcmtzaGVldC4gVGhlIGFjdGl2ZSBjZWxsIGlzIHRoZSB0b3Btb3N0IGNlbGwgb2YgdGhlIGZpcnN0IGFkZHJlc3MuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQWRkcmVzcyI+QSByYW5nZSBvZiBjZWxsczwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iU2VsZWN0U2hlZXQiPk1ha2UgdGhlIHNoZWV0IGFjdGl2ZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFNlbGVjdChFeGNlbEFkZHJlc3MgQWRkcmVzcywgYm9vbCBTZWxlY3RTaGVldCkKLSAgICAgICAgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBEZWxldGUgdGhlIHNwZWNpZmllZCByb3cgZnJvbSB0aGUgd29ya3NoZWV0LgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InJvd0Zyb20iPlRoZSBzdGFydCByb3c8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InJvd3MiPk51bWJlciBvZiByb3dzIHRvIGRlbGV0ZTwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIERlbGV0ZVJvdyhpbnQgcm93RnJvbSwgaW50IHJvd3MpIHsKKyAgICBDaGVja1NoZWV0VHlwZSgpOworICAgIGlmIChyb3dGcm9tIDwgMSB8fCByb3dGcm9tICsgcm93cyA+IEV4Y2VsUGFja2FnZS5NYXhSb3dzKSB7CisgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAiUm93IG91dCBvZiByYW5nZS4gU3BhbnMgZnJvbSAxIHRvICIKKyAgICAgICAgICAgICAgICAgICsgRXhjZWxQYWNrYWdlLk1heFJvd3MuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpKTsKKyAgICB9CisgICAgbG9jayAodGhpcykgeworICAgICAgX3ZhbHVlcy5EZWxldGUocm93RnJvbSwgMCwgcm93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOworICAgICAgX3R5cGVzLkRlbGV0ZShyb3dGcm9tLCAwLCByb3dzLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgICBfZm9ybXVsYXMuRGVsZXRlKHJvd0Zyb20sIDAsIHJvd3MsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICAgIF9zdHlsZXMuRGVsZXRlKHJvd0Zyb20sIDAsIHJvd3MsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICAgIF9mbGFncy5EZWxldGUocm93RnJvbSwgMCwgcm93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOworICAgICAgX2NvbW1lbnRzU3RvcmUuRGVsZXRlKHJvd0Zyb20sIDAsIHJvd3MsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICAgIF9oeXBlckxpbmtzLkRlbGV0ZShyb3dGcm9tLCAwLCByb3dzLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CiAKLSAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoU2VsZWN0U2hlZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVmlldy5UYWJTZWxlY3RlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJpbmcgc2VsQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhBZGRyZXNzLlN0YXJ0LlJvdywgQWRkcmVzcy5TdGFydC5Db2x1bW4pICsgIjoiICsgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKEFkZHJlc3MuRW5kLlJvdywgQWRkcmVzcy5FbmQuQ29sdW1uKTsKLSAgICAgICAgICAgIGlmIChBZGRyZXNzLkFkZHJlc3NlcyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhIGluIEFkZHJlc3MuQWRkcmVzc2VzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2VsQWRkcmVzcyArPSAiICIgKyBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoYS5TdGFydC5Sb3csIGEuU3RhcnQuQ29sdW1uKSArICI6IiArIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhhLkVuZC5Sb3csIGEuRW5kLkNvbHVtbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgVmlldy5TZWxlY3RlZFJhbmdlID0gc2VsQWRkcmVzczsKLSAgICAgICAgICAgIFZpZXcuQWN0aXZlQ2VsbCA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhBZGRyZXNzLlN0YXJ0LlJvdywgQWRkcmVzcy5TdGFydC5Db2x1bW4pOwotICAgICAgICB9CisgICAgICBBZGp1c3RGb3JtdWxhc1Jvdyhyb3dGcm9tLCByb3dzKTsKKyAgICAgIEZpeE1lcmdlZENlbGxzUm93KHJvd0Zyb20sIHJvd3MsIHRydWUpOwogCi0JCSNyZWdpb24gSW5zZXJ0Um93Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluc2VydHMgYSBuZXcgcm93IGludG8gdGhlIHNwcmVhZHNoZWV0LiAgRXhpc3Rpbmcgcm93cyBiZWxvdyB0aGUgcG9zaXRpb24gYXJlIAotICAgICAgICAvLy8gc2hpZnRlZCBkb3duLiAgQWxsIGZvcm11bGEgYXJlIHVwZGF0ZWQgdG8gdGFrZSBhY2NvdW50IG9mIHRoZSBuZXcgcm93LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd0Zyb20iPlRoZSBwb3NpdGlvbiBvZiB0aGUgbmV3IHJvdzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93cyI+TnVtYmVyIG9mIHJvd3MgdG8gaW5zZXJ0PC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgSW5zZXJ0Um93KGludCByb3dGcm9tLCBpbnQgcm93cykKLSAgICAgICAgewotICAgICAgICAgICAgSW5zZXJ0Um93KHJvd0Zyb20sIHJvd3MsIDApOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLQkJLy8vIEluc2VydHMgYSBuZXcgcm93IGludG8gdGhlIHNwcmVhZHNoZWV0LiAgRXhpc3Rpbmcgcm93cyBiZWxvdyB0aGUgcG9zaXRpb24gYXJlIAotCQkvLy8gc2hpZnRlZCBkb3duLiAgQWxsIGZvcm11bGEgYXJlIHVwZGF0ZWQgdG8gdGFrZSBhY2NvdW50IG9mIHRoZSBuZXcgcm93LgotCQkvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd0Zyb20iPlRoZSBwb3NpdGlvbiBvZiB0aGUgbmV3IHJvdzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93cyI+TnVtYmVyIG9mIHJvd3MgdG8gaW5zZXJ0LjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29weVN0eWxlc0Zyb21Sb3ciPkNvcHkgU3R5bGVzIGZyb20gdGhpcyByb3cuIEFwcGxpZWQgdG8gYWxsIGluc2VydGVkIHJvd3M8L3BhcmFtPgotCQlwdWJsaWMgdm9pZCAgSW5zZXJ0Um93KGludCByb3dGcm9tLCBpbnQgcm93cywgaW50IGNvcHlTdHlsZXNGcm9tUm93KQotCQl7Ci0gICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOwotICAgICAgICAgICAgICAgIHZhciBkID0gRGltZW5zaW9uOworICAgICAgZm9yZWFjaCAodmFyIHRibCBpbiBUYWJsZXMpIHsKKyAgICAgICAgdGJsLkFkZHJlc3MgPSB0YmwuQWRkcmVzcy5EZWxldGVSb3cocm93RnJvbSwgcm93cyk7CisgICAgICB9CisgICAgfQorICB9CiAKLSAgICAgICAgICAgIGlmIChyb3dGcm9tIDwgMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigicm93RnJvbSBjYW4ndCBiZSBsZXNzZXIgdGhhdCAxIikpOwotICAgICAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBEZWxldGUgdGhlIHNwZWNpZmllZCBjb2x1bW4gZnJvbSB0aGUgd29ya3NoZWV0LgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+VGhlIGNvbHVtbiB0byBiZSBkZWxldGVkPC9wYXJhbT4KKyAgcHVibGljIHZvaWQgRGVsZXRlQ29sdW1uKGludCBjb2x1bW4pIHsKKyAgICBEZWxldGVDb2x1bW4oY29sdW1uLCAxKTsKKyAgfQogCi0gICAgICAgICAgICAvL0NoZWNrIHRoYXQgY2VsbHMgYXJlbid0IHNoaWZ0ZWQgb3V0c2lkZSB0aGUgYm91bmRyaWVzCi0gICAgICAgICAgICBpZiAoZCAhPSBudWxsICYmIGQuRW5kLlJvdyA+IHJvd0Zyb20gJiYgZC5FbmQuUm93ICsgcm93cyA+IEV4Y2VsUGFja2FnZS5NYXhSb3dzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJDYW4ndCBpbnNlcnQuIFJvd3Mgd2lsbCBiZSBzaGlmdGVkIG91dHNpZGUgdGhlIGJvdW5kcmllcyBvZiB0aGUgd29ya3NoZWV0LiIpKTsKLSAgICAgICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRGVsZXRlIHRoZSBzcGVjaWZpZWQgY29sdW1uIGZyb20gdGhlIHdvcmtzaGVldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW5Gcm9tIj5UaGUgc3RhcnQgY29sdW1uPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW5zIj5OdW1iZXIgb2YgY29sdW1ucyB0byBkZWxldGU8L3BhcmFtPgorICBwdWJsaWMgdm9pZCBEZWxldGVDb2x1bW4oaW50IGNvbHVtbkZyb20sIGludCBjb2x1bW5zKSB7CisgICAgaWYgKGNvbHVtbkZyb20gPCAxIHx8IGNvbHVtbkZyb20gKyBjb2x1bW5zID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpIHsKKyAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICJDb2x1bW4gb3V0IG9mIHJhbmdlLiBTcGFucyBmcm9tIDEgdG8gIgorICAgICAgICAgICAgICAgICAgKyBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucy5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkpOworICAgIH0KKyAgICBsb2NrICh0aGlzKSB7CisgICAgICB2YXIgY29sID0gX3ZhbHVlcy5HZXRWYWx1ZSgwLCBjb2x1bW5Gcm9tKSBhcyBFeGNlbENvbHVtbjsKKyAgICAgIGlmIChjb2wgPT0gbnVsbCkgeworICAgICAgICB2YXIgciA9IDA7CisgICAgICAgIHZhciBjID0gY29sdW1uRnJvbTsKKyAgICAgICAgaWYgKF92YWx1ZXMuUHJldkNlbGwocmVmIHIsIHJlZiBjKSkgeworICAgICAgICAgIGNvbCA9IF92YWx1ZXMuR2V0VmFsdWUoMCwgYykgYXMgRXhjZWxDb2x1bW47CisgICAgICAgICAgaWYgKGNvbC5fY29sdW1uTWF4ID49IGNvbHVtbkZyb20pIHsKKyAgICAgICAgICAgIGNvbC5Db2x1bW5NYXggPSBjb2x1bW5Gcm9tIC0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KIAotICAgICAgICAgICAgbG9jayAodGhpcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfdmFsdWVzLkluc2VydChyb3dGcm9tLCAwLCByb3dzLCAwKTsKLSAgICAgICAgICAgICAgICBfZm9ybXVsYXMuSW5zZXJ0KHJvd0Zyb20sIDAsIHJvd3MsIDApOwotICAgICAgICAgICAgICAgIF9zdHlsZXMuSW5zZXJ0KHJvd0Zyb20sIDAsIHJvd3MsIDApOwotICAgICAgICAgICAgICAgIF90eXBlcy5JbnNlcnQocm93RnJvbSwgMCwgcm93cywgMCk7Ci0gICAgICAgICAgICAgICAgX2NvbW1lbnRzU3RvcmUuSW5zZXJ0KHJvd0Zyb20sIDAsIHJvd3MsIDApOwotICAgICAgICAgICAgICAgIF9oeXBlckxpbmtzLkluc2VydChyb3dGcm9tLCAwLCByb3dzLCAwKTsKLSAgICAgICAgICAgICAgICBfZmxhZ3MuSW5zZXJ0KHJvd0Zyb20sIDAsIHJvd3MsIDApOworICAgICAgX3ZhbHVlcy5EZWxldGUoMCwgY29sdW1uRnJvbSwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIGNvbHVtbnMpOworICAgICAgX3R5cGVzLkRlbGV0ZSgwLCBjb2x1bW5Gcm9tLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgY29sdW1ucyk7CisgICAgICBfZm9ybXVsYXMuRGVsZXRlKDAsIGNvbHVtbkZyb20sIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCBjb2x1bW5zKTsKKyAgICAgIF9zdHlsZXMuRGVsZXRlKDAsIGNvbHVtbkZyb20sIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCBjb2x1bW5zKTsKKyAgICAgIF9mbGFncy5EZWxldGUoMCwgY29sdW1uRnJvbSwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIGNvbHVtbnMpOworICAgICAgX2NvbW1lbnRzU3RvcmUuRGVsZXRlKDAsIGNvbHVtbkZyb20sIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCBjb2x1bW5zKTsKKyAgICAgIF9oeXBlckxpbmtzLkRlbGV0ZSgwLCBjb2x1bW5Gcm9tLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgY29sdW1ucyk7CiAKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZiBpbiBfc2hhcmVkRm9ybXVsYXMuVmFsdWVzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGYuU3RhcnRSb3cgPj0gcm93RnJvbSkgZi5TdGFydFJvdyArPSByb3dzOwotICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKGYuQWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhLl9mcm9tUm93ID49IHJvd0Zyb20pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGEuX2Zyb21Sb3cgKz0gcm93czsKLSAgICAgICAgICAgICAgICAgICAgICAgIGEuX3RvUm93ICs9IHJvd3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYS5fdG9Sb3cgPj0gcm93RnJvbSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYS5fdG9Sb3cgKz0gcm93czsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmLkFkZHJlc3MgPSBFeGNlbEFkZHJlc3NCYXNlLkdldEFkZHJlc3MoYS5fZnJvbVJvdywgYS5fZnJvbUNvbCwgYS5fdG9Sb3csIGEuX3RvQ29sKTsKLSAgICAgICAgICAgICAgICAgICAgZi5Gb3JtdWxhID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhmLkZvcm11bGEsIHJvd3MsIDAsIHJvd0Zyb20sIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YXIgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX2Zvcm11bGFzKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoY3NlLk5leHQoKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjc2UuVmFsdWUgaXMgc3RyaW5nKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjc2UuVmFsdWUgPSBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKGNzZS5WYWx1ZS5Ub1N0cmluZygpLCByb3dzLCAwLCByb3dGcm9tLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgIEFkanVzdEZvcm11bGFzQ29sdW1uKGNvbHVtbkZyb20sIGNvbHVtbnMpOworICAgICAgRml4TWVyZ2VkQ2VsbHNDb2x1bW4oY29sdW1uRnJvbSwgY29sdW1ucywgdHJ1ZSk7CiAKLSAgICAgICAgICAgICAgICBGaXhNZXJnZWRDZWxsc1Jvdyhyb3dGcm9tLCByb3dzLCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHlTdHlsZXNGcm9tUm93ID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBjc2VTID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPGludD4oX3N0eWxlcywgY29weVN0eWxlc0Zyb21Sb3csIDAsIGNvcHlTdHlsZXNGcm9tUm93LCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7IC8vRml4ZXMgaXNzdWUgMTUwNjggLCAxNTA5MAotICAgICAgICAgICAgICAgICAgICB3aGlsZShjc2VTLk5leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCByb3dzOyByKyspCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0eWxlcy5TZXRWYWx1ZShyb3dGcm9tICsgciwgY3NlUy5Db2x1bW4sIGNzZVMuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0YmwgaW4gVGFibGVzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGJsLkFkZHJlc3MgPSB0YmwuQWRkcmVzcy5BZGRSb3cocm93RnJvbSwgcm93cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluc2VydHMgYSBuZXcgY29sdW1uIGludG8gdGhlIHNwcmVhZHNoZWV0LiAgRXhpc3RpbmcgY29sdW1ucyBiZWxvdyB0aGUgcG9zaXRpb24gYXJlIAotICAgICAgICAvLy8gc2hpZnRlZCBkb3duLiAgQWxsIGZvcm11bGEgYXJlIHVwZGF0ZWQgdG8gdGFrZSBhY2NvdW50IG9mIHRoZSBuZXcgY29sdW1uLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbkZyb20iPlRoZSBwb3NpdGlvbiBvZiB0aGUgbmV3IGNvbHVtbjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1ucyI+TnVtYmVyIG9mIGNvbHVtbnMgdG8gaW5zZXJ0PC9wYXJhbT4gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBJbnNlcnRDb2x1bW4oaW50IGNvbHVtbkZyb20sIGludCBjb2x1bW5zKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbnNlcnRDb2x1bW4oY29sdW1uRnJvbSwgY29sdW1ucywgMCk7CisgICAgICB2YXIgY3NlYyA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KAorICAgICAgICAgIF92YWx1ZXMsCisgICAgICAgICAgMCwKKyAgICAgICAgICBjb2x1bW5Gcm9tLAorICAgICAgICAgIDAsCisgICAgICAgICAgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOworICAgICAgZm9yZWFjaCAodmFyIGNvbHVtbiBpbiBjc2VjKSB7CisgICAgICAgIGlmIChjb2x1bW4gaXMgRXhjZWxDb2x1bW4pIHsKKyAgICAgICAgICB2YXIgYyA9IChFeGNlbENvbHVtbiljb2x1bW47CisgICAgICAgICAgaWYgKGMuX2NvbHVtbk1pbiA+PSBjb2x1bW5Gcm9tKSB7CisgICAgICAgICAgICBjLl9jb2x1bW5NaW4gLT0gY29sdW1uczsKKyAgICAgICAgICAgIGMuX2NvbHVtbk1heCAtPSBjb2x1bW5zOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAvLy88c3VtbWFyeT4KLSAgICAgICAgLy8vIEluc2VydHMgYSBuZXcgY29sdW1uIGludG8gdGhlIHNwcmVhZHNoZWV0LiAgRXhpc3RpbmcgY29sdW1uIHRvIHRoZSBsZWZ0IGFyZSAKLSAgICAgICAgLy8vIHNoaWZ0ZWQuICBBbGwgZm9ybXVsYSBhcmUgdXBkYXRlZCB0byB0YWtlIGFjY291bnQgb2YgdGhlIG5ldyBjb2x1bW4uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1uRnJvbSI+VGhlIHBvc2l0aW9uIG9mIHRoZSBuZXcgY29sdW1uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW5zIj5OdW1iZXIgb2YgY29sdW1ucyB0byBpbnNlcnQuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb3B5U3R5bGVzRnJvbUNvbHVtbiI+Q29weSBTdHlsZXMgZnJvbSB0aGlzIGNvbHVtbi4gQXBwbGllZCB0byBhbGwgaW5zZXJ0ZWQgY29sdW1uczwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIEluc2VydENvbHVtbihpbnQgY29sdW1uRnJvbSwgaW50IGNvbHVtbnMsIGludCBjb3B5U3R5bGVzRnJvbUNvbHVtbikKLSAgICAgICAgewotICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKLSAgICAgICAgICAgIHZhciBkID0gRGltZW5zaW9uOworICAgICAgfQogCi0gICAgICAgICAgICBpZiAoY29sdW1uRnJvbSA8IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oImNvbHVtbkZyb20gY2FuJ3QgYmUgbGVzc2VyIHRoYXQgMSIpKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vQ2hlY2sgdGhhdCBjZWxscyBhcmVuJ3Qgc2hpZnRlZCBvdXRzaWRlIHRoZSBib3VuZHJpZXMKLSAgICAgICAgICAgIGlmIChkICE9IG51bGwgJiYgZC5FbmQuQ29sdW1uID4gY29sdW1uRnJvbSAmJiBkLkVuZC5Db2x1bW4gKyBjb2x1bW5zID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkNhbid0IGluc2VydC4gQ29sdW1ucyB3aWxsIGJlIHNoaWZ0ZWQgb3V0c2lkZSB0aGUgYm91bmRyaWVzIG9mIHRoZSB3b3Jrc2hlZXQuIikpOworICAgICAgZm9yZWFjaCAodmFyIHRibCBpbiBUYWJsZXMpIHsKKyAgICAgICAgaWYgKGNvbHVtbkZyb20gPj0gdGJsLkFkZHJlc3MuU3RhcnQuQ29sdW1uICYmIGNvbHVtbkZyb20gPD0gdGJsLkFkZHJlc3MuRW5kLkNvbHVtbikgeworICAgICAgICAgIHZhciBub2RlID0gdGJsLkNvbHVtbnNbMF0uVG9wTm9kZS5QYXJlbnROb2RlOworICAgICAgICAgIHZhciBpeCA9IGNvbHVtbkZyb20gLSB0YmwuQWRkcmVzcy5TdGFydC5Db2x1bW47CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5zOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChub2RlLkNoaWxkTm9kZXMuQ291bnQgPiBpeCkgeworICAgICAgICAgICAgICBub2RlLlJlbW92ZUNoaWxkKG5vZGUuQ2hpbGROb2Rlc1tpeF0pOwogICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICB0YmwuX2NvbHMgPSBuZXcodGJsKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBsb2NrICh0aGlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF92YWx1ZXMuSW5zZXJ0KDAsIGNvbHVtbkZyb20sIDAsIGNvbHVtbnMpOwotICAgICAgICAgICAgICAgIF9mb3JtdWxhcy5JbnNlcnQoMCwgY29sdW1uRnJvbSwgMCwgY29sdW1ucyk7Ci0gICAgICAgICAgICAgICAgX3N0eWxlcy5JbnNlcnQoMCwgY29sdW1uRnJvbSwgMCwgY29sdW1ucyk7Ci0gICAgICAgICAgICAgICAgX3R5cGVzLkluc2VydCgwLCBjb2x1bW5Gcm9tLCAwLCBjb2x1bW5zKTsKLSAgICAgICAgICAgICAgICBfY29tbWVudHNTdG9yZS5JbnNlcnQoMCwgY29sdW1uRnJvbSwgMCwgY29sdW1ucyk7Ci0gICAgICAgICAgICAgICAgX2h5cGVyTGlua3MuSW5zZXJ0KDAsIGNvbHVtbkZyb20sIDAsIGNvbHVtbnMpOwotICAgICAgICAgICAgICAgIF9mbGFncy5JbnNlcnQoMCwgY29sdW1uRnJvbSwgMCwgY29sdW1ucyk7CisgICAgICAgIHRibC5BZGRyZXNzID0gdGJsLkFkZHJlc3MuRGVsZXRlQ29sdW1uKGNvbHVtbkZyb20sIGNvbHVtbnMpOworICAgICAgfQorICAgIH0KKyAgfQogCi0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGYgaW4gX3NoYXJlZEZvcm11bGFzLlZhbHVlcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmLlN0YXJ0Q29sID49IGNvbHVtbkZyb20pIGYuU3RhcnRDb2wgKz0gY29sdW1uczsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZShmLkFkZHJlc3MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYS5fZnJvbUNvbCA+PSBjb2x1bW5Gcm9tKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhLl9mcm9tQ29sICs9IGNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhLl90b0NvbCArPSBjb2x1bW5zOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEuX3RvQ29sID49IGNvbHVtbkZyb20pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGEuX3RvQ29sICs9IGNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZi5BZGRyZXNzID0gRXhjZWxBZGRyZXNzQmFzZS5HZXRBZGRyZXNzKGEuX2Zyb21Sb3csIGEuX2Zyb21Db2wsIGEuX3RvUm93LCBhLl90b0NvbCk7Ci0gICAgICAgICAgICAgICAgICAgIGYuRm9ybXVsYSA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoZi5Gb3JtdWxhLCAwLCBjb2x1bW5zLCAwLCBjb2x1bW5Gcm9tKTsKLSAgICAgICAgICAgICAgICB9CisgIGludGVybmFsIHZvaWQgQWRqdXN0Rm9ybXVsYXNSb3coaW50IHJvd0Zyb20sIGludCByb3dzKSB7CisgICAgdmFyIGRlbFNmID0gbmV3IExpc3Q8aW50PigpOworICAgIGZvcmVhY2ggKHZhciBzZiBpbiBfc2hhcmVkRm9ybXVsYXMuVmFsdWVzKSB7CisgICAgICB2YXIgYSA9IG5ldyBFeGNlbEFkZHJlc3Moc2YuQWRkcmVzcykuRGVsZXRlUm93KHJvd0Zyb20sIHJvd3MpOworICAgICAgaWYgKGEgPT0gbnVsbCkgeworICAgICAgICBkZWxTZi5BZGQoc2YuSW5kZXgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2YuQWRkcmVzcyA9IGEuQWRkcmVzczsKKyAgICAgICAgaWYgKHNmLlN0YXJ0Um93ID4gcm93RnJvbSkgeworICAgICAgICAgIHZhciByID0gTWF0aC5NaW4oc2YuU3RhcnRSb3cgLSByb3dGcm9tLCByb3dzKTsKKyAgICAgICAgICBzZi5Gb3JtdWxhID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhzZi5Gb3JtdWxhLCAtciwgMCwgcm93RnJvbSwgMCk7CisgICAgICAgICAgc2YuU3RhcnRSb3cgLT0gcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmb3JlYWNoICh2YXIgaXggaW4gZGVsU2YpIHsKKyAgICAgIF9zaGFyZWRGb3JtdWxhcy5SZW1vdmUoaXgpOworICAgIH0KKyAgICBkZWxTZiA9IG51bGw7CisgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KAorICAgICAgICBfZm9ybXVsYXMsCisgICAgICAgIDEsCisgICAgICAgIDEsCisgICAgICAgIEV4Y2VsUGFja2FnZS5NYXhSb3dzLAorICAgICAgICBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgd2hpbGUgKGNzZS5OZXh0KCkpIHsKKyAgICAgIGlmIChjc2UuVmFsdWUgaXMgc3RyaW5nKSB7CisgICAgICAgIGNzZS5WYWx1ZSA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoCisgICAgICAgICAgICBjc2UuVmFsdWUuVG9TdHJpbmcoKSwKKyAgICAgICAgICAgIC1yb3dzLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIHJvd0Zyb20sCisgICAgICAgICAgICAwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotICAgICAgICAgICAgICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihfZm9ybXVsYXMpOwotICAgICAgICAgICAgICAgIHdoaWxlIChjc2UuTmV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNzZS5WYWx1ZSBpcyBzdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzZS5WYWx1ZSA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoY3NlLlZhbHVlLlRvU3RyaW5nKCksIDAsIGNvbHVtbnMsIDAsIGNvbHVtbkZyb20pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICBpbnRlcm5hbCB2b2lkIEFkanVzdEZvcm11bGFzQ29sdW1uKGludCBjb2x1bW5Gcm9tLCBpbnQgY29sdW1ucykgeworICAgIHZhciBkZWxTZiA9IG5ldyBMaXN0PGludD4oKTsKKyAgICBmb3JlYWNoICh2YXIgc2YgaW4gX3NoYXJlZEZvcm11bGFzLlZhbHVlcykgeworICAgICAgdmFyIGEgPSBuZXcgRXhjZWxBZGRyZXNzKHNmLkFkZHJlc3MpLkRlbGV0ZUNvbHVtbihjb2x1bW5Gcm9tLCBjb2x1bW5zKTsKKyAgICAgIGlmIChhID09IG51bGwpIHsKKyAgICAgICAgZGVsU2YuQWRkKHNmLkluZGV4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNmLkFkZHJlc3MgPSBhLkFkZHJlc3M7CisgICAgICAgIC8vc2YuRm9ybXVsYSA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoc2YuRm9ybXVsYSwgMCwgLWNvbHVtbnMsIDAsIGNvbHVtbkZyb20pOworICAgICAgICBpZiAoc2YuU3RhcnRDb2wgPiBjb2x1bW5Gcm9tKSB7CisgICAgICAgICAgdmFyIGMgPSBNYXRoLk1pbihzZi5TdGFydENvbCAtIGNvbHVtbkZyb20sIGNvbHVtbnMpOworICAgICAgICAgIHNmLkZvcm11bGEgPSBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKHNmLkZvcm11bGEsIDAsIC1jLCAwLCAxKTsKKyAgICAgICAgICBzZi5TdGFydENvbCAtPSBjOworICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBGaXhNZXJnZWRDZWxsc0NvbHVtbihjb2x1bW5Gcm9tLCBjb2x1bW5zLCBmYWxzZSk7CisgICAgICAgIC8vc2YuQWRkcmVzcyA9IGEuQWRkcmVzczsKKyAgICAgICAgLy9zZi5Gb3JtdWxhID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhzZi5Gb3JtdWxhLCAwLC1jb2x1bW5zLDAsIGNvbHVtbkZyb20pOworICAgICAgICAvL2lmIChzZi5TdGFydENvbCA+PSBjb2x1bW5Gcm9tKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgc2YuU3RhcnRDb2wgLT0gc2YuU3RhcnRDb2w7CisgICAgICAgIC8vfQorICAgICAgfQorICAgIH0KKyAgICBmb3JlYWNoICh2YXIgaXggaW4gZGVsU2YpIHsKKyAgICAgIF9zaGFyZWRGb3JtdWxhcy5SZW1vdmUoaXgpOworICAgIH0KKyAgICBkZWxTZiA9IG51bGw7CisgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KAorICAgICAgICBfZm9ybXVsYXMsCisgICAgICAgIDEsCisgICAgICAgIDEsCisgICAgICAgIEV4Y2VsUGFja2FnZS5NYXhSb3dzLAorICAgICAgICBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgd2hpbGUgKGNzZS5OZXh0KCkpIHsKKyAgICAgIGlmIChjc2UuVmFsdWUgaXMgc3RyaW5nKSB7CisgICAgICAgIGNzZS5WYWx1ZSA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoCisgICAgICAgICAgICBjc2UuVmFsdWUuVG9TdHJpbmcoKSwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAtY29sdW1ucywKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBjb2x1bW5Gcm9tKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotICAgICAgICAgICAgICAgIHZhciBjc2VjID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX3ZhbHVlcywgMCwgMSwgMCwgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOwotICAgICAgICAgICAgICAgIHZhciBsc3QgPSBuZXcgTGlzdDxFeGNlbENvbHVtbj4oKTsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY29sIGluIGNzZWMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29sIGlzIEV4Y2VsQ29sdW1uKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsc3QuQWRkKChFeGNlbENvbHVtbiljb2wpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBEZWxldGVzIHRoZSBzcGVjaWZpZWQgcm93IGZyb20gdGhlIHdvcmtzaGVldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3dGcm9tIj5UaGUgbnVtYmVyIG9mIHRoZSBzdGFydCByb3cgdG8gYmUgZGVsZXRlZDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icm93cyI+TnVtYmVyIG9mIHJvd3MgdG8gZGVsZXRlPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJzaGlmdE90aGVyUm93c1VwIj5Ob3QgdXNlZC4gUm93cyBhcmUgYWx3YXlzIHNoaWZ0ZWQ8L3BhcmFtPgorICBwdWJsaWMgdm9pZCBEZWxldGVSb3coaW50IHJvd0Zyb20sIGludCByb3dzLCBib29sIHNoaWZ0T3RoZXJSb3dzVXApIHsKKyAgICBEZWxldGVSb3cocm93RnJvbSwgcm93cyk7CisgIH0KIAotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBsc3QuQ291bnQtMTsgaSA+PSAwOyBpLS0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGxzdFtpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMuX2NvbHVtbk1pbiA+PSBjb2x1bW5Gcm9tKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5fY29sdW1uTWluICsgY29sdW1ucyA8PSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLl9jb2x1bW5NaW4gKz0gY29sdW1uczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLl9jb2x1bW5NaW4gPSBFeGNlbFBhY2thZ2UuTWF4Q29sdW1uczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMuX2NvbHVtbk1heCArIGNvbHVtbnMgPD0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5fY29sdW1uTWF4ICs9IGNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5fY29sdW1uTWF4ID0gRXhjZWxQYWNrYWdlLk1heENvbHVtbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYy5fY29sdW1uTWF4ID49IGNvbHVtbkZyb20pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYyA9IGMuX2NvbHVtbk1heCAtIGNvbHVtbkZyb207Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLl9jb2x1bW5NYXggPSBjb2x1bW5Gcm9tIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvcHlDb2x1bW4oYywgY29sdW1uRnJvbSArIGNvbHVtbnMsIGNvbHVtbkZyb20gKyBjb2x1bW5zICsgY2MpOwotICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldCB0aGUgY2VsbCB2YWx1ZSBmcm9tIHRodyB3b3Jrc2hlZXQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPlRoZSByb3cgbnVtYmVyPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPlRoZSByb3cgbnVtYmVyPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPlRoZSB2YWx1ZTwvcmV0dXJucz4KKyAgcHVibGljIG9iamVjdCBHZXRWYWx1ZShpbnQgcm93LCBpbnQgY29sdW1uKSB7CisgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAvL3Vsb25nIGNlbGxJRCA9IEV4Y2VsQ2VsbEJhc2UuR2V0Q2VsbElEKFNoZWV0SUQsIFJvdywgQ29sdW1uKTsKKyAgICB2YXIgdiA9IF92YWx1ZXMuR2V0VmFsdWUocm93LCBjb2x1bW4pOworICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgIC8vdmFyIGNlbGwgPSAoKEV4Y2VsQ2VsbClfY2VsbHNbY2VsbElEXSk7CisgICAgICBpZiAoX2ZsYWdzLkdldEZsYWdWYWx1ZShyb3csIGNvbHVtbiwgQ2VsbEZsYWdzLlJpY2hUZXh0KSkgeworICAgICAgICByZXR1cm4gQ2VsbHNbcm93LCBjb2x1bW5dLlJpY2hUZXh0LlRleHQ7CisgICAgICB9CisgICAgICByZXR1cm4gdjsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KIAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXQgYSBzdHJvbmdseSB0eXBlZCBjZWxsIHZhbHVlIGZyb20gdGhlIHdvcmtzaGVldAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgdHlwZTwvdHlwZXBhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+VGhlIHJvdyBudW1iZXI8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+VGhlIHJvdyBudW1iZXI8L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIHZhbHVlLiBJZiB0aGUgdmFsdWUgY2FuJ3QgYmUgY29udmVydGVkIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSwgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSByZXR1cm5lZDwvcmV0dXJucz4KKyAgcHVibGljIFQgR2V0VmFsdWU8VD4oaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgLy91bG9uZyBjZWxsSUQ9RXhjZWxDZWxsQmFzZS5HZXRDZWxsSUQoU2hlZXRJRCwgUm93LCBDb2x1bW4pOworICAgIHZhciB2ID0gX3ZhbHVlcy5HZXRWYWx1ZShyb3csIGNvbHVtbik7CisgICAgaWYgKHYgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIGRlZmF1bHQoVCk7CisgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGNvcHlTdHlsZXNGcm9tQ29sdW1uID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY29sdW1uczsgYysrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sID0gdGhpcy5Db2x1bW4oY29sdW1uRnJvbSArIGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29sLlN0eWxlSUQgPSB0aGlzLkNvbHVtbihjb3B5U3R5bGVzRnJvbUNvbHVtbikuU3R5bGVJRDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL0FkanVzdCB0YWJsZXMKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdGJsIGluIFRhYmxlcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5Gcm9tID4gdGJsLkFkZHJlc3MuU3RhcnQuQ29sdW1uICYmIGNvbHVtbkZyb20gPD0gdGJsLkFkZHJlc3MuRW5kLkNvbHVtbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0VGFibGVDb2x1bW5zKGNvbHVtbkZyb20sIGNvbHVtbnMsIHRibCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAvL3ZhciBjZWxsPSgoRXhjZWxDZWxsKV9jZWxsc1tjZWxsSURdKTsKKyAgICBpZiAoX2ZsYWdzLkdldEZsYWdWYWx1ZShyb3csIGNvbHVtbiwgQ2VsbEZsYWdzLlJpY2hUZXh0KSkgeworICAgICAgcmV0dXJuIChUKShvYmplY3QpQ2VsbHNbcm93LCBjb2x1bW5dLlJpY2hUZXh0LlRleHQ7CisgICAgfQorICAgIHJldHVybiBHZXRUeXBlZFZhbHVlPFQ+KHYpOworICB9CiAKLSAgICAgICAgICAgICAgICAgICAgdGJsLkFkZHJlc3M9dGJsLkFkZHJlc3MuQWRkQ29sdW1uKGNvbHVtbkZyb20sIGNvbHVtbnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgLy9UaGFua3MgdG8gTWljaGFlbCBUcmFuIGZvciBwYXJ0cyBvZiB0aGlzIG1ldGhvZAorICBpbnRlcm5hbCBUIEdldFR5cGVkVmFsdWU8VD4ob2JqZWN0IHYpIHsKKyAgICBpZiAodiA9PSBudWxsKSB7CisgICAgICByZXR1cm4gZGVmYXVsdChUKTsKKyAgICB9CisgICAgVHlwZSBmcm9tVHlwZSA9IHYuR2V0VHlwZSgpOworICAgIFR5cGUgdG9UeXBlID0gdHlwZW9mKFQpOworICAgIGlmIChmcm9tVHlwZSA9PSB0b1R5cGUpIHsKKyAgICAgIHJldHVybiAoVCl2OworICAgIH0KKyAgICB2YXIgY252ID0gVHlwZURlc2NyaXB0b3IuR2V0Q29udmVydGVyKGZyb21UeXBlKTsKKyAgICBpZiAodG9UeXBlCisgICAgICAgID09IHR5cGVvZihEYXRlVGltZSkpIC8vSGFuZGxlIGRhdGVzCisgICAgeworICAgICAgaWYgKGZyb21UeXBlID09IHR5cGVvZihUaW1lU3BhbikpIHsKKyAgICAgICAgcmV0dXJuICgoVCkob2JqZWN0KShuZXcgRGF0ZVRpbWUoKChUaW1lU3Bhbil2KS5UaWNrcykpKTsKKyAgICAgIH0KKyAgICAgIGlmIChmcm9tVHlwZSA9PSB0eXBlb2Yoc3RyaW5nKSkgeworICAgICAgICBEYXRlVGltZSBkdDsKKyAgICAgICAgaWYgKERhdGVUaW1lLlRyeVBhcnNlKHYuVG9TdHJpbmcoKSwgb3V0IGR0KSkgeworICAgICAgICAgIHJldHVybiAoVCkob2JqZWN0KShkdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlZmF1bHQoVCk7CisgICAgICB9CisgICAgICBpZiAoY252LkNhbkNvbnZlcnRUbyh0eXBlb2YoZG91YmxlKSkpIHsKKyAgICAgICAgcmV0dXJuIChUKShvYmplY3QpKERhdGVUaW1lLkZyb21PQURhdGUoKGRvdWJsZSljbnYuQ29udmVydFRvKHYsIHR5cGVvZihkb3VibGUpKSkpOworICAgICAgfQorICAgICAgcmV0dXJuIGRlZmF1bHQoVCk7CisgICAgfQorICAgIGlmICh0b1R5cGUKKyAgICAgICAgPT0gdHlwZW9mKFRpbWVTcGFuKSkgLy9IYW5kbGUgdGltZXNwYW4KKyAgICB7CisgICAgICBpZiAoZnJvbVR5cGUgPT0gdHlwZW9mKERhdGVUaW1lKSkgeworICAgICAgICByZXR1cm4gKChUKShvYmplY3QpKG5ldyBUaW1lU3BhbigoKERhdGVUaW1lKXYpLlRpY2tzKSkpOworICAgICAgfQorICAgICAgaWYgKGZyb21UeXBlID09IHR5cGVvZihzdHJpbmcpKSB7CisgICAgICAgIFRpbWVTcGFuIHRzOworICAgICAgICBpZiAoVGltZVNwYW4uVHJ5UGFyc2Uodi5Ub1N0cmluZygpLCBvdXQgdHMpKSB7CisgICAgICAgICAgcmV0dXJuIChUKShvYmplY3QpKHRzKTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVmYXVsdChUKTsKKyAgICAgIH0KKyAgICAgIGlmIChjbnYuQ2FuQ29udmVydFRvKHR5cGVvZihkb3VibGUpKSkgeworICAgICAgICByZXR1cm4gKFQpCisgICAgICAgICAgKG9iamVjdCkobmV3IFRpbWVTcGFuKAorICAgICAgICAgICAgICBEYXRlVGltZS5Gcm9tT0FEYXRlKChkb3VibGUpY252LkNvbnZlcnRUbyh2LCB0eXBlb2YoZG91YmxlKSkpLlRpY2tzKSk7CisgICAgICB9CisgICAgICB0cnkgeworICAgICAgICAvLyBJc3N1ZSAxNDY4MiAtLSAiR2V0VmFsdWU8ZGVjaW1hbD4oKSB3b24ndCBjb252ZXJ0IHN0cmluZ3MiCisgICAgICAgIC8vIEFzIHN1Z2dlc3RlZCwgYWZ0ZXIgYWxsIHNwZWNpYWwgY2FzZXMsIGFsbCAuTkVUIHRvIGRvIGl0J3MKKyAgICAgICAgLy8gcHJlZmVycmVkIGNvbnZlcnNpb24gcmF0aGVyIHRoYW4gc2ltcGx5IHJldHVybmluZyB0aGUgZGVmYXVsdAorICAgICAgICByZXR1cm4gKFQpQ29udmVydC5DaGFuZ2VUeXBlKHYsIHR5cGVvZihUKSk7CisgICAgICB9IGNhdGNoIChFeGNlcHRpb24pIHsKKyAgICAgICAgLy8gVGhpcyB3YXMgdGhlIHByZXZpb3VzIGJlaGF2aW91ciAtLSBubyBjb252ZXJzaW9uIGlzIGF2YWlsYWJsZS4KKyAgICAgICAgcmV0dXJuIGRlZmF1bHQoVCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChjbnYuQ2FuQ29udmVydFRvKHRvVHlwZSkpIHsKKyAgICAgIHJldHVybiAoVCljbnYuQ29udmVydFRvKHYsIHR5cGVvZihUKSk7CisgICAgfQorICAgIGlmICh0b1R5cGUuSXNHZW5lcmljVHlwZSAmJiB0b1R5cGUuR2V0R2VuZXJpY1R5cGVEZWZpbml0aW9uKCkuRXF1YWxzKHR5cGVvZihOdWxsYWJsZTw+KSkpIHsKKyAgICAgIHRvVHlwZSA9IE51bGxhYmxlLkdldFVuZGVybHlpbmdUeXBlKHRvVHlwZSk7CisgICAgICBpZiAoY252LkNhbkNvbnZlcnRUbyh0b1R5cGUpKSB7CisgICAgICAgIHJldHVybiAoVCljbnYuQ29udmVydFRvKHYsIHR5cGVvZihUKSk7CisgICAgICB9CisgICAgfQogCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgSW5zZXJ0VGFibGVDb2x1bW5zKGludCBjb2x1bW5Gcm9tLCBpbnQgY29sdW1ucywgRXhjZWxUYWJsZSB0YmwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBub2RlID0gdGJsLkNvbHVtbnNbMF0uVG9wTm9kZS5QYXJlbnROb2RlOwotICAgICAgICAgICAgdmFyIGl4ID0gY29sdW1uRnJvbSAtIHRibC5BZGRyZXNzLlN0YXJ0LkNvbHVtbiAtIDE7Ci0gICAgICAgICAgICB2YXIgaW5zUG9zID0gbm9kZS5DaGlsZE5vZGVzW2l4XTsKLSAgICAgICAgICAgIGl4ICs9IDI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgbmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgIHRibC5Db2x1bW5zLkdldFVuaXF1ZU5hbWUoc3RyaW5nLkZvcm1hdCgiQ29sdW1uezB9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpeCsrKS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkpOwotICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgdGFibGVDb2x1bW4gPQotICAgICAgICAgICAgICAgICAgICAoWG1sRWxlbWVudCkgdGJsLlRhYmxlWG1sLkNyZWF0ZU5vZGUoWG1sTm9kZVR5cGUuRWxlbWVudCwgInRhYmxlQ29sdW1uIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLlNldEF0dHJpYnV0ZSgiaWQiLCAodGJsLkNvbHVtbnMuQ291bnQgKyBpICsgMSkuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgICAgIHRhYmxlQ29sdW1uLlNldEF0dHJpYnV0ZSgibmFtZSIsIG5hbWUpOwotICAgICAgICAgICAgICAgIGluc1BvcyA9IG5vZGUuSW5zZXJ0QWZ0ZXIodGFibGVDb2x1bW4sIGluc1Bvcyk7Ci0gICAgICAgICAgICB9IC8vQ3JlYXRlIHRibCBDb2x1bW4KLSAgICAgICAgICAgIHRibC5fY29scyA9IG5ldyBFeGNlbFRhYmxlQ29sdW1uQ29sbGVjdGlvbih0YmwpOwotICAgICAgICB9CisgICAgaWYgKGZyb21UeXBlID09IHR5cGVvZihkb3VibGUpICYmIHRvVHlwZSA9PSB0eXBlb2YoZGVjaW1hbCkpIHsKKyAgICAgIHJldHVybiAoVCkob2JqZWN0KUNvbnZlcnQuVG9EZWNpbWFsKHYpOworICAgIH0KKyAgICBpZiAoZnJvbVR5cGUgPT0gdHlwZW9mKGRlY2ltYWwpICYmIHRvVHlwZSA9PSB0eXBlb2YoZG91YmxlKSkgeworICAgICAgcmV0dXJuIChUKShvYmplY3QpQ29udmVydC5Ub0RvdWJsZSh2KTsKKyAgICB9CisgICAgcmV0dXJuIGRlZmF1bHQoVCk7CisgIH0KIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIGEgdmFsdWUgdG8gdGhlIHJvdyBvZiBtZXJnZWQgY2VsbHMgdG8gZml4IGZvciBpbnNlcnRzIG9yIGRlbGV0ZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93cyI+PC9wYXJhbT4gCi0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGVsZXRlIj48L3BhcmFtPgotICAgICAgICBwcml2YXRlIHZvaWQgRml4TWVyZ2VkQ2VsbHNSb3coaW50IHJvdywgaW50IHJvd3MsIGJvb2wgZGVsZXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVsZXRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9tZXJnZWRDZWxscy5fY2VsbHMuRGVsZXRlKHJvdywgMCwgcm93cywgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX21lcmdlZENlbGxzLl9jZWxscy5JbnNlcnQocm93LCAwLCByb3dzLCAwKTsKLSAgICAgICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2V0IHRoZSB2YWx1ZSBvZiBhIGNlbGwKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPlRoZSByb3cgbnVtYmVyPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPlRoZSBjb2x1bW4gbnVtYmVyPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlPC9wYXJhbT4KKyAgcHVibGljIHZvaWQgU2V0VmFsdWUoaW50IHJvdywgaW50IGNvbHVtbiwgb2JqZWN0IHZhbHVlKSB7CisgICAgQ2hlY2tTaGVldFR5cGUoKTsKKyAgICBpZiAocm93IDwgMSB8fCBjb2x1bW4gPCAxIHx8IHJvdyA+IEV4Y2VsUGFja2FnZS5NYXhSb3dzICYmIGNvbHVtbiA+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJSb3cgb3IgQ29sdW1uIG91dCBvZiByYW5nZSIpOworICAgIH0KKyAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgY29sdW1uLCB2YWx1ZSk7CisgIH0KIAotICAgICAgICAgICAgTGlzdDxpbnQ+IHJlbW92ZUluZGV4ID0gbmV3IExpc3Q8aW50PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbWVyZ2VkQ2VsbHMuQ291bnQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KCBfbWVyZ2VkQ2VsbHNbaV0pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRXhjZWxBZGRyZXNzQmFzZSBhZGRyID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoX21lcmdlZENlbGxzW2ldKSwgbmV3QWRkcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGV0ZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWRkciA9IGFkZHIuRGVsZXRlUm93KHJvdywgcm93cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3QWRkciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUluZGV4LkFkZChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FkZHIgPSBhZGRyLkFkZFJvdyhyb3csIHJvd3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0FkZHIuQWRkcmVzcyAhPSBhZGRyLkFkZHJlc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBfbWVyZ2VkQ2VsbHMuX2NlbGxzLkluc2VydChyb3csIDAsIHJvd3MsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tZXJnZWRDZWxscy5TZXRJbmRleChuZXdBZGRyLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTZXQgdGhlIHZhbHVlIG9mIGEgY2VsbAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBFeGNlbCBhZGRyZXNzPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlPC9wYXJhbT4KKyAgcHVibGljIHZvaWQgU2V0VmFsdWUoc3RyaW5nIGFkZHJlc3MsIG9iamVjdCB2YWx1ZSkgeworICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgaW50IHJvdywKKyAgICAgICAgY29sOworICAgIEV4Y2VsQ2VsbEJhc2UuR2V0Um93Q29sKGFkZHJlc3MsIG91dCByb3csIG91dCBjb2wsIHRydWUpOworICAgIGlmIChyb3cgPCAxIHx8IGNvbCA8IDEgfHwgcm93ID4gRXhjZWxQYWNrYWdlLk1heFJvd3MgJiYgY29sID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkFkZHJlc3MgaXMgaW52YWxpZCBvciBvdXQgb2YgcmFuZ2UiKTsKKyAgICB9CisgICAgX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgdmFsdWUpOworICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0FkZHIuQWRkcmVzcyAhPSBhZGRyLkFkZHJlc3MpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9tZXJnZWRDZWxscy5MaXN0W2ldID0gbmV3QWRkci5fYWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSByZW1vdmVJbmRleC5Db3VudCAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9tZXJnZWRDZWxscy5MaXN0LlJlbW92ZUF0KHJlbW92ZUluZGV4W2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIGEgdmFsdWUgdG8gdGhlIHJvdyBvZiBtZXJnZWQgY2VsbHMgdG8gZml4IGZvciBpbnNlcnRzIG9yIGRlbGV0ZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1ucyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZWxldGUiPjwvcGFyYW0+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBGaXhNZXJnZWRDZWxsc0NvbHVtbihpbnQgY29sdW1uLCBpbnQgY29sdW1ucywgYm9vbCBkZWxldGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZWxldGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX21lcmdlZENlbGxzLl9jZWxscy5EZWxldGUoMCwgY29sdW1uLCAwLCBjb2x1bW5zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfbWVyZ2VkQ2VsbHMuX2NlbGxzLkluc2VydCgwLCBjb2x1bW4sIDAsIGNvbHVtbnMpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8aW50PiByZW1vdmVJbmRleCA9IG5ldyBMaXN0PGludD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX21lcmdlZENlbGxzLkNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShfbWVyZ2VkQ2VsbHNbaV0pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRXhjZWxBZGRyZXNzQmFzZSBhZGRyID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoX21lcmdlZENlbGxzW2ldKSwgbmV3QWRkcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGV0ZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3QWRkciA9IGFkZHIuRGVsZXRlQ29sdW1uKGNvbHVtbiwgY29sdW1ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3QWRkciA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUluZGV4LkFkZChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FkZHIgPSBhZGRyLkFkZENvbHVtbihjb2x1bW4sIGNvbHVtbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0FkZHIuQWRkcmVzcyAhPSBhZGRyLkFkZHJlc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX21lcmdlZENlbGxzLlNldEluZGV4KG5ld0FkZHIsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldCBNZXJnZUNlbGwgSW5kZXggTm8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1uIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgaW50IEdldE1lcmdlQ2VsbElkKGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IF9tZXJnZWRDZWxscy5Db3VudDsgaSsrKSB7CisgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KF9tZXJnZWRDZWxsc1tpXSkpIHsKKyAgICAgICAgRXhjZWxSYW5nZSByYW5nZSA9IENlbGxzW19tZXJnZWRDZWxsc1tpXV07CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0FkZHIuQWRkcmVzcyAhPSBhZGRyLkFkZHJlc3MpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9tZXJnZWRDZWxscy5MaXN0W2ldID0gbmV3QWRkci5fYWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSByZW1vdmVJbmRleC5Db3VudCAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9tZXJnZWRDZWxscy5MaXN0LlJlbW92ZUF0KHJlbW92ZUluZGV4W2ldKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKHJhbmdlLlN0YXJ0LlJvdyA8PSByb3cgJiYgcm93IDw9IHJhbmdlLkVuZC5Sb3cpIHsKKyAgICAgICAgICBpZiAocmFuZ2UuU3RhcnQuQ29sdW1uIDw9IGNvbHVtbiAmJiBjb2x1bW4gPD0gcmFuZ2UuRW5kLkNvbHVtbikgeworICAgICAgICAgICAgcmV0dXJuIGkgKyAxOworICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgRml4U2hhcmVkRm9ybXVsYXNSb3dzKGludCBwb3NpdGlvbiwgaW50IHJvd3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8Rm9ybXVsYXM+IGFkZGVkID0gbmV3IExpc3Q8Rm9ybXVsYXM+KCk7Ci0gICAgICAgICAgICBMaXN0PEZvcm11bGFzPiBkZWxldGVkID0gbmV3IExpc3Q8Rm9ybXVsYXM+KCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CiAKLSAgICAgICAgICAgIGZvcmVhY2ggKGludCBpZCBpbiBfc2hhcmVkRm9ybXVsYXMuS2V5cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZiA9IF9zaGFyZWRGb3JtdWxhc1tpZF07Ci0gICAgICAgICAgICAgICAgaW50IGZyb21Db2wsIGZyb21Sb3csIHRvQ29sLCB0b1JvdzsKKyAgaW50ZXJuYWwgdm9pZCBTYXZlKCkgeworICAgIERlbGV0ZVByaW50ZXJTZXR0aW5ncygpOwogCi0gICAgICAgICAgICAgICAgRXhjZWxDZWxsQmFzZS5HZXRSb3dDb2xGcm9tQWRkcmVzcyhmLkFkZHJlc3MsIG91dCBmcm9tUm93LCBvdXQgZnJvbUNvbCwgb3V0IHRvUm93LCBvdXQgdG9Db2wpOwotICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+PSBmcm9tUm93ICYmIHBvc2l0aW9uKyhNYXRoLkFicyhyb3dzKSkgPD0gdG9Sb3cpIC8vSW5zZXJ0L2RlbGV0ZSBpcyB3aGl0aGluIHRoZSBzaGFyZSBmb3JtdWxhIGFkZHJlc3MKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyb3dzID4gMCkgLy9JbnNlcnQKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZi5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGZyb21Sb3csIGZyb21Db2wpICsgIjoiICsgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKHBvc2l0aW9uIC0gMSwgdG9Db2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRvUm93ICE9IGZyb21Sb3cpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybXVsYXMgbmV3RiA9IG5ldyBGb3JtdWxhcyhTb3VyY2VDb2RlVG9rZW5pemVyLkRlZmF1bHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0YuU3RhcnRDb2wgPSBmLlN0YXJ0Q29sOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0YuU3RhcnRSb3cgPSBwb3NpdGlvbiArIHJvd3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Ri5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKHBvc2l0aW9uICsgcm93cywgZnJvbUNvbCkgKyAiOiIgKyBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3ModG9Sb3cgKyByb3dzLCB0b0NvbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Ri5Gb3JtdWxhID0gRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVGcm9tUjFDMShFeGNlbENlbGxCYXNlLlRyYW5zbGF0ZVRvUjFDMShmLkZvcm11bGEsIGYuU3RhcnRSb3csIGYuU3RhcnRDb2wpLCBwb3NpdGlvbiwgZi5TdGFydENvbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQuQWRkKG5ld0YpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21Sb3cgLSByb3dzIDwgdG9Sb3cpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGZyb21Sb3csIGZyb21Db2wsIHRvUm93K3Jvd3MsIHRvQ29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLkFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZnJvbVJvdywgZnJvbUNvbCkgKyAiOiIgKyBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3ModG9Sb3cgKyByb3dzLCB0b0NvbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAocG9zaXRpb24gPD0gdG9Sb3cpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAocm93cyA+IDApIC8vSW5zZXJ0IGJlZm9yZSBzaGlmdCBkb3duCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYuU3RhcnRSb3cgKz0gcm93czsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vZi5Gb3JtdWxhID0gRXhjZWxDZWxsLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKGYuRm9ybXVsYSwgcm93cywgMCwgcG9zaXRpb24sIDApOyAvL1JlY2FsYyB0aGUgY2VsbHMgcG9zaXRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICBmLkFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZnJvbVJvdyArIHJvd3MsIGZyb21Db2wpICsgIjoiICsgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKHRvUm93ICsgcm93cywgdG9Db2wpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9DZWxsc1tmLkFkZHJlc3NdLlNldFNoYXJlZEZvcm11bGFJRChpbnQuTWluVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDw9IGZyb21Sb3cgJiYgcG9zaXRpb24gKyBNYXRoLkFicyhyb3dzKSA+IHRvUm93KSAgLy9EZWxldGUgdGhlIGZvcm11bGEgCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlZC5BZGQoZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Sb3cgPSB0b1JvdyArIHJvd3MgPCBwb3NpdGlvbiAtIDEgPyBwb3NpdGlvbiAtIDEgOiB0b1JvdyArIHJvd3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDw9IGZyb21Sb3cpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tUm93ID0gZnJvbVJvdyArIHJvd3MgPCBwb3NpdGlvbiA/IHBvc2l0aW9uIDogZnJvbVJvdyArIHJvd3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGZyb21Sb3csIGZyb21Db2wsIHRvUm93LCB0b0NvbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsbHNbZi5BZGRyZXNzXS5TZXRTaGFyZWRGb3JtdWxhSUQoZi5JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mLlN0YXJ0Um93ID0gZnJvbVJvdzsKKyAgICBpZiAoX3dvcmtzaGVldFhtbCAhPSBudWxsKSB7CisgICAgICBpZiAoISh0aGlzIGlzIEV4Y2VsQ2hhcnRzaGVldCkpIHsKKyAgICAgICAgLy8gc2F2ZSB0aGUgaGVhZGVyICYgZm9vdGVyIChpZiBkZWZpbmVkKQorICAgICAgICBpZiAoX2hlYWRlckZvb3RlciAhPSBudWxsKSB7CisgICAgICAgICAgSGVhZGVyRm9vdGVyLlNhdmUoKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9mLkZvcm11bGEgPSBFeGNlbENlbGwuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoZi5Gb3JtdWxhLCByb3dzLCAwLCBwb3NpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICB2YXIgZCA9IERpbWVuc2lvbjsKKyAgICAgICAgaWYgKGQgPT0gbnVsbCkgeworICAgICAgICAgIERlbGV0ZUFsbE5vZGUoImQ6ZGltZW5zaW9uL0ByZWYiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJkOmRpbWVuc2lvbi9AcmVmIiwgZC5BZGRyZXNzKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBBZGRGb3JtdWxhcyhhZGRlZCwgcG9zaXRpb24sIHJvd3MpOworICAgICAgICBTYXZlQ29tbWVudHMoKTsKKyAgICAgICAgU2F2ZVRhYmxlcygpOworICAgICAgICBTYXZlUGl2b3RUYWJsZXMoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotICAgICAgICAgICAgLy9SZW1vdmUgZm9ybXVsYXMKLSAgICAgICAgICAgIGZvcmVhY2ggKEZvcm11bGFzIGYgaW4gZGVsZXRlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfc2hhcmVkRm9ybXVsYXMuUmVtb3ZlKGYuSW5kZXgpOwotICAgICAgICAgICAgfQorICBpbnRlcm5hbCB2b2lkIFNhdmVIYW5kbGVyKFN0cmVhbVdyaXRlciBzdHJlYW1Xcml0ZXIpIHsKKyAgICAvL0NyZWF0ZSB0aGUgbm9kZXMgaWYgdGhleSBkbyBub3QgZXhpc3QuCisgICAgaWYgKHRoaXMgaXMgRXhjZWxDaGFydHNoZWV0KSB7CisgICAgICBzdHJlYW1Xcml0ZXIuV3JpdGUoX3dvcmtzaGVldFhtbC5PdXRlclhtbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIENyZWF0ZU5vZGUoImQ6Y29scyIpOworICAgICAgQ3JlYXRlTm9kZSgiZDpzaGVldERhdGEiKTsKKyAgICAgIENyZWF0ZU5vZGUoImQ6bWVyZ2VDZWxscyIpOworICAgICAgQ3JlYXRlTm9kZSgiZDpoeXBlcmxpbmtzIik7CisgICAgICBDcmVhdGVOb2RlKCJkOnJvd0JyZWFrcyIpOworICAgICAgQ3JlYXRlTm9kZSgiZDpjb2xCcmVha3MiKTsKIAotICAgICAgICAgICAgLy9GaXggRm9ybXVsYXMKLSAgICAgICAgICAgIGFkZGVkID0gbmV3IExpc3Q8Rm9ybXVsYXM+KCk7Ci0gICAgICAgICAgICBmb3JlYWNoIChpbnQgaWQgaW4gX3NoYXJlZEZvcm11bGFzLktleXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGYgPSBfc2hhcmVkRm9ybXVsYXNbaWRdOwotICAgICAgICAgICAgICAgIFVwZGF0ZVNoYXJlZEZvcm11bGFSb3cocmVmIGYsIHBvc2l0aW9uLCByb3dzLCByZWYgYWRkZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQWRkRm9ybXVsYXMoYWRkZWQsIHBvc2l0aW9uLCByb3dzKTsKLSAgICAgICAgfQorICAgICAgLy9TdHJlYW1Xcml0ZXIgc3c9bmV3IFN0cmVhbVdyaXRlcihQYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKKyAgICAgIHZhciB4bWwgPSBfd29ya3NoZWV0WG1sLk91dGVyWG1sOworICAgICAgaW50IGNvbFN0YXJ0ID0gMCwKKyAgICAgICAgICBjb2xFbmQgPSAwOworICAgICAgR2V0QmxvY2tQb3MoeG1sLCAiY29scyIsIHJlZiBjb2xTdGFydCwgcmVmIGNvbEVuZCk7CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZEZvcm11bGFzKExpc3Q8Rm9ybXVsYXM+IGFkZGVkLCBpbnQgcG9zaXRpb24sIGludCByb3dzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL0FkZCBuZXcgZm9ybXVsYXMKLSAgICAgICAgICAgIGZvcmVhY2ggKEZvcm11bGFzIGYgaW4gYWRkZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZi5JbmRleCA9IEdldE1heFNoYXJlRnVuY3Rpb25JbmRleChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgX3NoYXJlZEZvcm11bGFzLkFkZChmLkluZGV4LCBmKTsKLSAgICAgICAgICAgICAgICBDZWxsc1tmLkFkZHJlc3NdLlNldFNoYXJlZEZvcm11bGFJRChmLkluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgc3RyZWFtV3JpdGVyLldyaXRlKHhtbC5TdWJzdHJpbmcoMCwgY29sU3RhcnQpKTsKKyAgICAgIHZhciBjb2xCcmVha3MgPSBuZXcgTGlzdDxpbnQ+KCk7CisgICAgICAvL2lmIChfY29sdW1ucy5Db3VudCA+IDApCisgICAgICAvL3sKKyAgICAgIFVwZGF0ZUNvbHVtbkRhdGEoc3RyZWFtV3JpdGVyKTsKKyAgICAgIC8vfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBVcGRhdGVTaGFyZWRGb3JtdWxhUm93KHJlZiBGb3JtdWxhcyBmb3JtdWxhLCBpbnQgc3RhcnRSb3csIGludCByb3dzLCByZWYgTGlzdDxGb3JtdWxhcz4gbmV3Rm9ybXVsYXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBmcm9tUm93LGZyb21Db2wsIHRvUm93LCB0b0NvbDsKLSAgICAgICAgICAgIGludCBuZXdGb3JtdWxhc0NvdW50ID0gbmV3Rm9ybXVsYXMuQ291bnQ7Ci0gICAgICAgICAgICBFeGNlbENlbGxCYXNlLkdldFJvd0NvbEZyb21BZGRyZXNzKGZvcm11bGEuQWRkcmVzcywgb3V0IGZyb21Sb3csIG91dCBmcm9tQ29sLCBvdXQgdG9Sb3csIG91dCB0b0NvbCk7Ci0gICAgICAgICAgICAvL2ludCByZWZTcGxpdHMgPSBSZWdleC5TcGxpdChmb3JtdWxhLkZvcm11bGEsICIjUkVGISIpLkdldFVwcGVyQm91bmQoMCk7Ci0gICAgICAgICAgICBzdHJpbmcgZm9ybXVhbFIxQzE7Ci0gICAgICAgICAgICBpZiAocm93cyA+IDAgfHwgZnJvbVJvdyA8PSBzdGFydFJvdykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3JtdWFsUjFDMSA9IEV4Y2VsUmFuZ2VCYXNlLlRyYW5zbGF0ZVRvUjFDMShmb3JtdWxhLkZvcm11bGEsIGZvcm11bGEuU3RhcnRSb3csIGZvcm11bGEuU3RhcnRDb2wpOwotICAgICAgICAgICAgICAgIGZvcm11bGEuRm9ybXVsYSA9IEV4Y2VsUmFuZ2VCYXNlLlRyYW5zbGF0ZUZyb21SMUMxKGZvcm11YWxSMUMxLCBmcm9tUm93LCBmb3JtdWxhLlN0YXJ0Q29sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3JtdWFsUjFDMSA9IEV4Y2VsUmFuZ2VCYXNlLlRyYW5zbGF0ZVRvUjFDMShmb3JtdWxhLkZvcm11bGEsIGZvcm11bGEuU3RhcnRSb3ctcm93cywgZm9ybXVsYS5TdGFydENvbCk7Ci0gICAgICAgICAgICAgICAgZm9ybXVsYS5Gb3JtdWxhID0gRXhjZWxSYW5nZUJhc2UuVHJhbnNsYXRlRnJvbVIxQzEoZm9ybXVhbFIxQzEsIGZvcm11bGEuU3RhcnRSb3csIGZvcm11bGEuU3RhcnRDb2wpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9ib29sIGlzUmVmID0gZmFsc2U7Ci0gICAgICAgICAgICAvL0Zvcm11bGFzIHJlc3RGb3JtdWxhPWZvcm11bGE7Ci0gICAgICAgICAgICBzdHJpbmcgcHJldkZvcm11YWxSMUMxID0gZm9ybXVhbFIxQzE7Ci0gICAgICAgICAgICBmb3IgKGludCByb3cgPSBmcm9tUm93OyByb3cgPD0gdG9Sb3c7IHJvdysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IGZyb21Db2w7IGNvbCA8PSB0b0NvbDsgY29sKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmV3Rm9ybXVsYTsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGN1cnJlbnRGb3JtdWxhUjFDMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvd3MgPiAwIHx8IHJvdyA8IHN0YXJ0Um93KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtdWxhID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhFeGNlbENlbGxCYXNlLlRyYW5zbGF0ZUZyb21SMUMxKGZvcm11YWxSMUMxLCByb3csIGNvbCksIHJvd3MsIDAsIHN0YXJ0Um93LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGb3JtdWxhUjFDMSA9IEV4Y2VsUmFuZ2VCYXNlLlRyYW5zbGF0ZVRvUjFDMShuZXdGb3JtdWxhLCByb3csIGNvbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtdWxhID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhFeGNlbENlbGxCYXNlLlRyYW5zbGF0ZUZyb21SMUMxKGZvcm11YWxSMUMxLCByb3ctcm93cywgY29sKSwgcm93cywgMCwgc3RhcnRSb3csIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZvcm11bGFSMUMxID0gRXhjZWxSYW5nZUJhc2UuVHJhbnNsYXRlVG9SMUMxKG5ld0Zvcm11bGEsIHJvdywgY29sKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZvcm11bGFSMUMxICE9IHByZXZGb3JtdWFsUjFDMSkgLy9uZXdGb3JtdWxhLkNvbnRhaW5zKCIjUkVGISIpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChyZWZTcGxpdHMgPT0gMCB8fCBSZWdleC5TcGxpdChuZXdGb3JtdWxhLCAiI1JFRiEiKS5HZXRVcHBlckJvdW5kKDApICE9IHJlZlNwbGl0cykKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgICAgICAgICAgLy9pc1JlZiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm93ID09IGZyb21Sb3cgJiYgY29sID09IGZyb21Db2wpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXVsYS5Gb3JtdWxhID0gbmV3Rm9ybXVsYTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Rm9ybXVsYXMuQ291bnQgPT0gbmV3Rm9ybXVsYXNDb3VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm11bGEuQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhmb3JtdWxhLlN0YXJ0Um93LCBmb3JtdWxhLlN0YXJ0Q29sLCByb3cgLSAxLCBjb2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtdWxhc1tuZXdGb3JtdWxhcy5Db3VudCAtIDFdLkFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MobmV3Rm9ybXVsYXNbbmV3Rm9ybXVsYXMuQ291bnQgLSAxXS5TdGFydFJvdywgbmV3Rm9ybXVsYXNbbmV3Rm9ybXVsYXMuQ291bnQgLSAxXS5TdGFydENvbCwgcm93IC0gMSwgY29sKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlZkZvcm11bGEgPSBuZXcgRm9ybXVsYXMoU291cmNlQ29kZVRva2VuaXplci5EZWZhdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZGb3JtdWxhLkZvcm11bGEgPSBuZXdGb3JtdWxhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkZvcm11bGEuU3RhcnRSb3cgPSByb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmRm9ybXVsYS5TdGFydENvbCA9IGNvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGb3JtdWxhcy5BZGQocmVmRm9ybXVsYSk7CisgICAgICBpbnQgY2VsbFN0YXJ0ID0gY29sRW5kLAorICAgICAgICAgIGNlbGxFbmQgPSBjb2xFbmQ7CisgICAgICBHZXRCbG9ja1Bvcyh4bWwsICJzaGVldERhdGEiLCByZWYgY2VsbFN0YXJ0LCByZWYgY2VsbEVuZCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Jlc3RGb3JtdWxhID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Rm9ybXVhbFIxQzEgPSBjdXJyZW50Rm9ybXVsYVIxQzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gICAgfQotICAgICAgICAgICAgICAgICAgICAvLyAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIGlzUmVmID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAgICAgICAgIC8vZWxzZQotICAgICAgICAgICAgICAgICAgICAvL3sKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgaXNSZWYgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAgICAgICAgIC8vaWYgKHJlc3RGb3JtdWxhPT1udWxsKQotICAgICAgICAgICAgICAgICAgICAvL3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKG5ld0Zvcm11bGFzLkNvdW50ID09IG5ld0Zvcm11bGFzQ291bnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAvL3sKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGZvcm11bGEuQWRkcmVzcyA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhmb3JtdWxhLlN0YXJ0Um93LCBmb3JtdWxhLlN0YXJ0Q29sLCByb3cgLSAxLCBjb2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vewotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Rm9ybXVsYXNbbmV3Rm9ybXVsYXMuQ291bnQgLSAxXS5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKG5ld0Zvcm11bGFzW25ld0Zvcm11bGFzLkNvdW50IC0gMV0uU3RhcnRSb3csIG5ld0Zvcm11bGFzWzBdLlN0YXJ0Q29sLCByb3cgLSAxLCBjb2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy99CisgICAgICBzdHJlYW1Xcml0ZXIuV3JpdGUoeG1sLlN1YnN0cmluZyhjb2xFbmQsIGNlbGxTdGFydCAtIGNvbEVuZCkpOworICAgICAgdmFyIHJvd0JyZWFrcyA9IG5ldyBMaXN0PGludD4oKTsKKyAgICAgIFVwZGF0ZVJvd0NlbGxEYXRhKHN0cmVhbVdyaXRlcik7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzdEZvcm11bGEgPSBuZXcgRm9ybXVsYXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzdEZvcm11bGEuRm9ybXVsYSA9IG5ld0Zvcm11bGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3Jlc3RGb3JtdWxhLlN0YXJ0Um93ID0gcm93OwotICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXN0Rm9ybXVsYS5TdGFydENvbCA9IGNvbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vbmV3Rm9ybXVsYXMuQWRkKHJlc3RGb3JtdWxhKTsKLSAgICAgICAgICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJvd3MgPCAwICYmIGZvcm11bGEuU3RhcnRSb3cgPiBzdGFydFJvdykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZm9ybXVsYS5TdGFydFJvdyArIHJvd3MgPCBzdGFydFJvdykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcm11bGEuU3RhcnRSb3cgPSBzdGFydFJvdzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybXVsYS5TdGFydFJvdyArPSByb3dzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuZXdGb3JtdWxhcy5Db3VudCA+IG5ld0Zvcm11bGFzQ291bnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmV3Rm9ybXVsYXNbbmV3Rm9ybXVsYXMuQ291bnQgLSAxXS5BZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKG5ld0Zvcm11bGFzW25ld0Zvcm11bGFzLkNvdW50IC0gMV0uU3RhcnRSb3csIG5ld0Zvcm11bGFzW25ld0Zvcm11bGFzLkNvdW50IC0gMV0uU3RhcnRDb2wsIHRvUm93LCB0b0NvbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgorICAgICAgaW50IG1lcmdlU3RhcnQgPSBjZWxsRW5kLAorICAgICAgICAgIG1lcmdlRW5kID0gY2VsbEVuZDsKIAotICAgICAgICAjcmVnaW9uIERlbGV0ZVJvdwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEZWxldGUgdGhlIHNwZWNpZmllZCByb3cgZnJvbSB0aGUgd29ya3NoZWV0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+QSByb3cgdG8gYmUgZGVsZXRlZDwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZVJvdyhpbnQgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICBEZWxldGVSb3cocm93LCAxKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEZWxldGUgdGhlIHNwZWNpZmllZCByb3cgZnJvbSB0aGUgd29ya3NoZWV0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd0Zyb20iPlRoZSBzdGFydCByb3c8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd3MiPk51bWJlciBvZiByb3dzIHRvIGRlbGV0ZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZVJvdyhpbnQgcm93RnJvbSwgaW50IHJvd3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAocm93RnJvbSA8IDEgfHwgcm93RnJvbSArIHJvd3MgPiBFeGNlbFBhY2thZ2UuTWF4Um93cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRFeGNlcHRpb24oIlJvdyBvdXQgb2YgcmFuZ2UuIFNwYW5zIGZyb20gMSB0byAiICsgRXhjZWxQYWNrYWdlLk1heFJvd3MuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxvY2sgKHRoaXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3ZhbHVlcy5EZWxldGUocm93RnJvbSwgMCwgcm93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOwotICAgICAgICAgICAgICAgIF90eXBlcy5EZWxldGUocm93RnJvbSwgMCwgcm93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOwotICAgICAgICAgICAgICAgIF9mb3JtdWxhcy5EZWxldGUocm93RnJvbSwgMCwgcm93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOwotICAgICAgICAgICAgICAgIF9zdHlsZXMuRGVsZXRlKHJvd0Zyb20sIDAsIHJvd3MsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKLSAgICAgICAgICAgICAgICBfZmxhZ3MuRGVsZXRlKHJvd0Zyb20sIDAsIHJvd3MsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKLSAgICAgICAgICAgICAgICBfY29tbWVudHNTdG9yZS5EZWxldGUocm93RnJvbSwgMCwgcm93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOwotICAgICAgICAgICAgICAgIF9oeXBlckxpbmtzLkRlbGV0ZShyb3dGcm9tLCAwLCByb3dzLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7CisgICAgICBHZXRCbG9ja1Bvcyh4bWwsICJtZXJnZUNlbGxzIiwgcmVmIG1lcmdlU3RhcnQsIHJlZiBtZXJnZUVuZCk7CisgICAgICBzdHJlYW1Xcml0ZXIuV3JpdGUoeG1sLlN1YnN0cmluZyhjZWxsRW5kLCBtZXJnZVN0YXJ0IC0gY2VsbEVuZCkpOwogCi0gICAgICAgICAgICAgICAgQWRqdXN0Rm9ybXVsYXNSb3cocm93RnJvbSwgcm93cyk7Ci0gICAgICAgICAgICAgICAgRml4TWVyZ2VkQ2VsbHNSb3cocm93RnJvbSwgcm93cywgdHJ1ZSk7CisgICAgICBDbGVhbnVwTWVyZ2VkQ2VsbHMoX21lcmdlZENlbGxzKTsKKyAgICAgIGlmIChfbWVyZ2VkQ2VsbHMuQ291bnQgPiAwKSB7CisgICAgICAgIFVwZGF0ZU1lcmdlZENlbGxzKHN0cmVhbVdyaXRlcik7CisgICAgICB9CiAKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdGJsIGluIFRhYmxlcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRibC5BZGRyZXNzID0gdGJsLkFkZHJlc3MuRGVsZXRlUm93KHJvd0Zyb20sIHJvd3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEZWxldGUgdGhlIHNwZWNpZmllZCBjb2x1bW4gZnJvbSB0aGUgd29ya3NoZWV0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+VGhlIGNvbHVtbiB0byBiZSBkZWxldGVkPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlQ29sdW1uKGludCBjb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlbGV0ZUNvbHVtbihjb2x1bW4sMSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGVsZXRlIHRoZSBzcGVjaWZpZWQgY29sdW1uIGZyb20gdGhlIHdvcmtzaGVldC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW5Gcm9tIj5UaGUgc3RhcnQgY29sdW1uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW5zIj5OdW1iZXIgb2YgY29sdW1ucyB0byBkZWxldGU8L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBEZWxldGVDb2x1bW4oaW50IGNvbHVtbkZyb20sIGludCBjb2x1bW5zKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29sdW1uRnJvbSA8IDEgfHwgY29sdW1uRnJvbSArIGNvbHVtbnMgPiBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJDb2x1bW4gb3V0IG9mIHJhbmdlLiBTcGFucyBmcm9tIDEgdG8gIiArIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsb2NrICh0aGlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBjb2wgPSBfdmFsdWVzLkdldFZhbHVlKDAsIGNvbHVtbkZyb20pIGFzIEV4Y2VsQ29sdW1uOwotICAgICAgICAgICAgICAgIGlmIChjb2wgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciByID0gMDsgCi0gICAgICAgICAgICAgICAgICAgIHZhciBjID0gY29sdW1uRnJvbTsKLSAgICAgICAgICAgICAgICAgICAgaWYoX3ZhbHVlcy5QcmV2Q2VsbChyZWYgcixyZWYgYykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbCA9IF92YWx1ZXMuR2V0VmFsdWUoMCwgYykgYXMgRXhjZWxDb2x1bW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihjb2wuX2NvbHVtbk1heCA+PSBjb2x1bW5Gcm9tKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbC5Db2x1bW5NYXg9Y29sdW1uRnJvbS0xOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgaW50IGh5cGVyU3RhcnQgPSBtZXJnZUVuZCwKKyAgICAgICAgICBoeXBlckVuZCA9IG1lcmdlRW5kOworICAgICAgR2V0QmxvY2tQb3MoeG1sLCAiaHlwZXJsaW5rcyIsIHJlZiBoeXBlclN0YXJ0LCByZWYgaHlwZXJFbmQpOworICAgICAgc3RyZWFtV3JpdGVyLldyaXRlKHhtbC5TdWJzdHJpbmcobWVyZ2VFbmQsIGh5cGVyU3RhcnQgLSBtZXJnZUVuZCkpOworICAgICAgLy9pZiAoX2h5cGVyTGlua0NlbGxzLkNvdW50ID4gMCkKKyAgICAgIC8veworICAgICAgVXBkYXRlSHlwZXJMaW5rcyhzdHJlYW1Xcml0ZXIpOworICAgICAgLy8gfQogCi0gICAgICAgICAgICAgICAgX3ZhbHVlcy5EZWxldGUoMCwgY29sdW1uRnJvbSwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIGNvbHVtbnMpOwotICAgICAgICAgICAgICAgIF90eXBlcy5EZWxldGUoMCwgY29sdW1uRnJvbSwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIGNvbHVtbnMpOwotICAgICAgICAgICAgICAgIF9mb3JtdWxhcy5EZWxldGUoMCwgY29sdW1uRnJvbSwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIGNvbHVtbnMpOwotICAgICAgICAgICAgICAgIF9zdHlsZXMuRGVsZXRlKDAsIGNvbHVtbkZyb20sIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCBjb2x1bW5zKTsKLSAgICAgICAgICAgICAgICBfZmxhZ3MuRGVsZXRlKDAsIGNvbHVtbkZyb20sIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCBjb2x1bW5zKTsKLSAgICAgICAgICAgICAgICBfY29tbWVudHNTdG9yZS5EZWxldGUoMCwgY29sdW1uRnJvbSwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIGNvbHVtbnMpOwotICAgICAgICAgICAgICAgIF9oeXBlckxpbmtzLkRlbGV0ZSgwLCBjb2x1bW5Gcm9tLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgY29sdW1ucyk7CisgICAgICBpbnQgcm93QnJlYWtTdGFydCA9IGh5cGVyRW5kLAorICAgICAgICAgIHJvd0JyZWFrRW5kID0gaHlwZXJFbmQ7CisgICAgICBHZXRCbG9ja1Bvcyh4bWwsICJyb3dCcmVha3MiLCByZWYgcm93QnJlYWtTdGFydCwgcmVmIHJvd0JyZWFrRW5kKTsKKyAgICAgIHN0cmVhbVdyaXRlci5Xcml0ZSh4bWwuU3Vic3RyaW5nKGh5cGVyRW5kLCByb3dCcmVha1N0YXJ0IC0gaHlwZXJFbmQpKTsKKyAgICAgIC8vaWYgKHJvd0JyZWFrcy5Db3VudCA+IDApCisgICAgICAvL3sKKyAgICAgIFVwZGF0ZVJvd0JyZWFrcyhzdHJlYW1Xcml0ZXIpOworICAgICAgLy99CiAKLSAgICAgICAgICAgICAgICBBZGp1c3RGb3JtdWxhc0NvbHVtbihjb2x1bW5Gcm9tLCBjb2x1bW5zKTsKLSAgICAgICAgICAgICAgICBGaXhNZXJnZWRDZWxsc0NvbHVtbihjb2x1bW5Gcm9tLCBjb2x1bW5zLCB0cnVlKTsKKyAgICAgIGludCBjb2xCcmVha1N0YXJ0ID0gcm93QnJlYWtFbmQsCisgICAgICAgICAgY29sQnJlYWtFbmQgPSByb3dCcmVha0VuZDsKKyAgICAgIEdldEJsb2NrUG9zKHhtbCwgImNvbEJyZWFrcyIsIHJlZiBjb2xCcmVha1N0YXJ0LCByZWYgY29sQnJlYWtFbmQpOworICAgICAgc3RyZWFtV3JpdGVyLldyaXRlKHhtbC5TdWJzdHJpbmcocm93QnJlYWtFbmQsIGNvbEJyZWFrU3RhcnQgLSByb3dCcmVha0VuZCkpOworICAgICAgLy9pZiAoY29sQnJlYWtzLkNvdW50ID4gMCkKKyAgICAgIC8veworICAgICAgVXBkYXRlQ29sQnJlYWtzKHN0cmVhbVdyaXRlcik7CisgICAgICAvL30KKyAgICAgIHN0cmVhbVdyaXRlci5Xcml0ZSh4bWwuU3Vic3RyaW5nKGNvbEJyZWFrRW5kLCB4bWwuTGVuZ3RoIC0gY29sQnJlYWtFbmQpKTsKKyAgICB9CisgIH0KIAotICAgICAgICAgICAgICAgIHZhciBjc2VjID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX3ZhbHVlcywgMCwgY29sdW1uRnJvbSwgMCwgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjb2x1bW4gaW4gY3NlYykgICAgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uIGlzIEV4Y2VsQ29sdW1uKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IChFeGNlbENvbHVtbiljb2x1bW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy5fY29sdW1uTWluID49IGNvbHVtbkZyb20pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5fY29sdW1uTWluIC09IGNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5fY29sdW1uTWF4IC09IGNvbHVtbnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIERlbGV0ZSB0aGUgcHJpbnRlcnNldHRpbmdzIHJlbGF0aW9uc2hpcCBhbmQgcGFydC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHJpdmF0ZSB2b2lkIERlbGV0ZVByaW50ZXJTZXR0aW5ncygpIHsKKyAgICAvL0RlbGV0ZSB0aGUgcmVsYXRpb25zaGlwIGZyb20gdGhlIHBhZ2VTZXR1cCB0YWcKKyAgICBYbWxBdHRyaWJ1dGUgYXR0ciA9IChYbWxBdHRyaWJ1dGUpCisgICAgICBXb3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOnBhZ2VTZXR1cC9AcjppZCIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgIGlmIChhdHRyICE9IG51bGwpIHsKKyAgICAgIHN0cmluZyByZWxJZCA9IGF0dHIuVmFsdWU7CisgICAgICAvL0ZpcnN0IGRlbGV0ZSB0aGUgYXR0cmlidXRlIGZyb20gdGhlIFhNTAorICAgICAgYXR0ci5Pd25lckVsZW1lbnQuQXR0cmlidXRlcy5SZW1vdmUoYXR0cik7CisgICAgICBpZiAoUGFydC5SZWxhdGlvbnNoaXBFeGlzdHMocmVsSWQpKSB7CisgICAgICAgIHZhciByZWwgPSBQYXJ0LkdldFJlbGF0aW9uc2hpcChyZWxJZCk7CisgICAgICAgIFVyaSBwcmludGVyU2V0dGluZ3NVcmkgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSk7CisgICAgICAgIFBhcnQuRGVsZXRlUmVsYXRpb25zaGlwKHJlbC5JZCk7CiAKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdGJsIGluIFRhYmxlcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2x1bW5Gcm9tID49IHRibC5BZGRyZXNzLlN0YXJ0LkNvbHVtbiAmJiBjb2x1bW5Gcm9tIDw9IHRibC5BZGRyZXNzLkVuZC5Db2x1bW4pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gdGJsLkNvbHVtbnNbMF0uVG9wTm9kZS5QYXJlbnROb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl4ID0gY29sdW1uRnJvbSAtIHRibC5BZGRyZXNzLlN0YXJ0LkNvbHVtbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uczsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLkNoaWxkTm9kZXMuQ291bnQgPiBpeCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuUmVtb3ZlQ2hpbGQobm9kZS5DaGlsZE5vZGVzW2l4XSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRibC5fY29scyA9IG5ldyBFeGNlbFRhYmxlQ29sdW1uQ29sbGVjdGlvbih0YmwpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIC8vRGVsZXRlIHRoZSBwYXJ0IGZyb20gdGhlIHBhY2thZ2UKKyAgICAgICAgaWYgKF9wYWNrYWdlLlBhY2thZ2UuUGFydEV4aXN0cyhwcmludGVyU2V0dGluZ3NVcmkpKSB7CisgICAgICAgICAgX3BhY2thZ2UuUGFja2FnZS5EZWxldGVQYXJ0KHByaW50ZXJTZXR0aW5nc1VyaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KIAotICAgICAgICAgICAgICAgICAgICB0YmwuQWRkcmVzcyA9IHRibC5BZGRyZXNzLkRlbGV0ZUNvbHVtbihjb2x1bW5Gcm9tLCBjb2x1bW5zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgIHByaXZhdGUgdm9pZCBTYXZlQ29tbWVudHMoKSB7CisgICAgaWYgKF9jb21tZW50cyAhPSBudWxsKSB7CisgICAgICBpZiAoX2NvbW1lbnRzLkNvdW50ID09IDApIHsKKyAgICAgICAgaWYgKF9jb21tZW50cy5VcmkgIT0gbnVsbCkgeworICAgICAgICAgIFBhcnQuRGVsZXRlUmVsYXRpb25zaGlwKF9jb21tZW50cy5SZWxJZCk7CisgICAgICAgICAgX3BhY2thZ2UuUGFja2FnZS5EZWxldGVQYXJ0KF9jb21tZW50cy5VcmkpOwogICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHZvaWQgQWRqdXN0Rm9ybXVsYXNSb3coaW50IHJvd0Zyb20sIGludCByb3dzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZGVsU0YgPSBuZXcgTGlzdDxpbnQ+KCk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgc2YgaW4gX3NoYXJlZEZvcm11bGFzLlZhbHVlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgYSA9IG5ldyBFeGNlbEFkZHJlc3Moc2YuQWRkcmVzcykuRGVsZXRlUm93KHJvd0Zyb20sIHJvd3MpOwotICAgICAgICAgICAgICAgIGlmIChhPT1udWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGVsU0YuQWRkKHNmLkluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2YuQWRkcmVzcyA9IGEuQWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNmLlN0YXJ0Um93ID4gcm93RnJvbSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBNYXRoLk1pbihzZi5TdGFydFJvdyAtIHJvd0Zyb20sIHJvd3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2YuRm9ybXVsYSA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoc2YuRm9ybXVsYSwgLXIsIDAsIHJvd0Zyb20sIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgc2YuU3RhcnRSb3cgLT0gcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpeCBpbiBkZWxTRikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfc2hhcmVkRm9ybXVsYXMuUmVtb3ZlKGl4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlbFNGID0gbnVsbDsKLSAgICAgICAgICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihfZm9ybXVsYXMsIDEsIDEsIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7Ci0gICAgICAgICAgICB3aGlsZSAoY3NlLk5leHQoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY3NlLlZhbHVlIGlzIHN0cmluZykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNzZS5WYWx1ZSA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoY3NlLlZhbHVlLlRvU3RyaW5nKCksIC1yb3dzLCAwLCByb3dGcm9tLCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIFJlbW92ZUxlZ2FjeURyYXdpbmdSZWwoVm1sRHJhd2luZ3NDb21tZW50cy5SZWxJZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoX2NvbW1lbnRzLlVyaSA9PSBudWxsKSB7CisgICAgICAgICAgX2NvbW1lbnRzLlVyaSA9IG5ldyhzdHJpbmcuRm9ybWF0KCIveGwvY29tbWVudHN7MH0ueG1sIiwgU2hlZXRJRCksIFVyaUtpbmQuUmVsYXRpdmUpOworICAgICAgICB9CisgICAgICAgIGlmIChfY29tbWVudHMuUGFydCA9PSBudWxsKSB7CisgICAgICAgICAgX2NvbW1lbnRzLlBhcnQgPSBfcGFja2FnZS5QYWNrYWdlLkNyZWF0ZVBhcnQoCisgICAgICAgICAgICAgIF9jb21tZW50cy5VcmksCisgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5jb21tZW50cyt4bWwiLAorICAgICAgICAgICAgICBfcGFja2FnZS5Db21wcmVzc2lvbik7CisgICAgICAgICAgdmFyIHJlbCA9IFBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICBVcmlIZWxwZXIuR2V0UmVsYXRpdmVVcmkoV29ya3NoZWV0VXJpLCBfY29tbWVudHMuVXJpKSwKKyAgICAgICAgICAgICAgVGFyZ2V0TW9kZS5JbnRlcm5hbCwKKyAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9jb21tZW50cyIpOwogICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHZvaWQgQWRqdXN0Rm9ybXVsYXNDb2x1bW4oaW50IGNvbHVtbkZyb20sIGludCBjb2x1bW5zKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZGVsU0YgPSBuZXcgTGlzdDxpbnQ+KCk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgc2YgaW4gX3NoYXJlZEZvcm11bGFzLlZhbHVlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgYSA9IG5ldyBFeGNlbEFkZHJlc3Moc2YuQWRkcmVzcykuRGVsZXRlQ29sdW1uKGNvbHVtbkZyb20sIGNvbHVtbnMpOwotICAgICAgICAgICAgICAgIGlmIChhID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkZWxTRi5BZGQoc2YuSW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZi5BZGRyZXNzID0gYS5BZGRyZXNzOwotICAgICAgICAgICAgICAgICAgICAvL3NmLkZvcm11bGEgPSBFeGNlbENlbGxCYXNlLlVwZGF0ZUZvcm11bGFSZWZlcmVuY2VzKHNmLkZvcm11bGEsIDAsIC1jb2x1bW5zLCAwLCBjb2x1bW5Gcm9tKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNmLlN0YXJ0Q29sID4gY29sdW1uRnJvbSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBNYXRoLk1pbihzZi5TdGFydENvbCAtIGNvbHVtbkZyb20sIGNvbHVtbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2YuRm9ybXVsYSA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoc2YuRm9ybXVsYSwgMCwgLWMsIDAsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2YuU3RhcnRDb2wtPSBjOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIF9jb21tZW50cy5Db21tZW50WG1sLlNhdmUoX2NvbW1lbnRzLlBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSkpOworICAgICAgfQorICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAvL3NmLkFkZHJlc3MgPSBhLkFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgIC8vc2YuRm9ybXVsYSA9IEV4Y2VsQ2VsbEJhc2UuVXBkYXRlRm9ybXVsYVJlZmVyZW5jZXMoc2YuRm9ybXVsYSwgMCwtY29sdW1ucywwLCBjb2x1bW5Gcm9tKTsKLSAgICAgICAgICAgICAgICAgICAgLy9pZiAoc2YuU3RhcnRDb2wgPj0gY29sdW1uRnJvbSkKLSAgICAgICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIHNmLlN0YXJ0Q29sIC09IHNmLlN0YXJ0Q29sOwotICAgICAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgaXggaW4gZGVsU0YpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3NoYXJlZEZvcm11bGFzLlJlbW92ZShpeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWxTRiA9IG51bGw7Ci0gICAgICAgICAgICB2YXIgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX2Zvcm11bGFzLCAxLCAxLCAgRXhjZWxQYWNrYWdlLk1heFJvd3MsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKLSAgICAgICAgICAgIHdoaWxlIChjc2UuTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjc2UuVmFsdWUgaXMgc3RyaW5nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY3NlLlZhbHVlID0gRXhjZWxDZWxsQmFzZS5VcGRhdGVGb3JtdWxhUmVmZXJlbmNlcyhjc2UuVmFsdWUuVG9TdHJpbmcoKSwgMCwgLWNvbHVtbnMsIDAsIGNvbHVtbkZyb20pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICBpZiAoX3ZtbERyYXdpbmdzICE9IG51bGwpIHsKKyAgICAgIGlmIChfdm1sRHJhd2luZ3MuQ291bnQgPT0gMCkgeworICAgICAgICBpZiAoX3ZtbERyYXdpbmdzLlVyaSAhPSBudWxsKSB7CisgICAgICAgICAgUGFydC5EZWxldGVSZWxhdGlvbnNoaXAoX3ZtbERyYXdpbmdzLlJlbElkKTsKKyAgICAgICAgICBfcGFja2FnZS5QYWNrYWdlLkRlbGV0ZVBhcnQoX3ZtbERyYXdpbmdzLlVyaSk7CiAgICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGVsZXRlcyB0aGUgc3BlY2lmaWVkIHJvdyBmcm9tIHRoZSB3b3Jrc2hlZXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93RnJvbSI+VGhlIG51bWJlciBvZiB0aGUgc3RhcnQgcm93IHRvIGJlIGRlbGV0ZWQ8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd3MiPk51bWJlciBvZiByb3dzIHRvIGRlbGV0ZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2hpZnRPdGhlclJvd3NVcCI+Tm90IHVzZWQuIFJvd3MgYXJlIGFsd2F5cyBzaGlmdGVkPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlUm93KGludCByb3dGcm9tLCBpbnQgcm93cywgYm9vbCBzaGlmdE90aGVyUm93c1VwKQotCQl7Ci0gICAgICAgICAgICBEZWxldGVSb3cocm93RnJvbSwgcm93cyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoX3ZtbERyYXdpbmdzLlVyaSA9PSBudWxsKSB7CisgICAgICAgICAgX3ZtbERyYXdpbmdzLlVyaSA9IEdldE5ld1VyaShfcGFja2FnZS5QYWNrYWdlLCAiL3hsL2RyYXdpbmdzL3ZtbERyYXdpbmd7MH0udm1sIik7CiAgICAgICAgIH0KLQkJI2VuZHJlZ2lvbgotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXQgdGhlIGNlbGwgdmFsdWUgZnJvbSB0aHcgd29ya3NoZWV0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUm93Ij5UaGUgcm93IG51bWJlcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQ29sdW1uIj5UaGUgcm93IG51bWJlcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgdmFsdWU8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBvYmplY3QgR2V0VmFsdWUoaW50IFJvdywgaW50IENvbHVtbikKLSAgICAgICAgewotICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKLSAgICAgICAgICAgIC8vdWxvbmcgY2VsbElEID0gRXhjZWxDZWxsQmFzZS5HZXRDZWxsSUQoU2hlZXRJRCwgUm93LCBDb2x1bW4pOwotICAgICAgICAgICAgdmFyIHYgPSBfdmFsdWVzLkdldFZhbHVlKFJvdywgQ29sdW1uKTsKLSAgICAgICAgICAgIGlmICh2IT1udWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vdmFyIGNlbGwgPSAoKEV4Y2VsQ2VsbClfY2VsbHNbY2VsbElEXSk7Ci0gICAgICAgICAgICAgICAgaWYgKF9mbGFncy5HZXRGbGFnVmFsdWUoUm93LCBDb2x1bW4sIENlbGxGbGFncy5SaWNoVGV4dCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iamVjdClDZWxsc1tSb3csIENvbHVtbl0uUmljaFRleHQuVGV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQorICAgICAgICBpZiAoX3ZtbERyYXdpbmdzLlBhcnQgPT0gbnVsbCkgeworICAgICAgICAgIF92bWxEcmF3aW5ncy5QYXJ0ID0gX3BhY2thZ2UuUGFja2FnZS5DcmVhdGVQYXJ0KAorICAgICAgICAgICAgICBfdm1sRHJhd2luZ3MuVXJpLAorICAgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnZtbERyYXdpbmciLAorICAgICAgICAgICAgICBfcGFja2FnZS5Db21wcmVzc2lvbik7CisgICAgICAgICAgdmFyIHJlbCA9IFBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKAorICAgICAgICAgICAgICBVcmlIZWxwZXIuR2V0UmVsYXRpdmVVcmkoV29ya3NoZWV0VXJpLCBfdm1sRHJhd2luZ3MuVXJpKSwKKyAgICAgICAgICAgICAgVGFyZ2V0TW9kZS5JbnRlcm5hbCwKKyAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi92bWxEcmF3aW5nIik7CisgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiZDpsZWdhY3lEcmF3aW5nL0ByOmlkIiwgcmVsLklkKTsKKyAgICAgICAgICBfdm1sRHJhd2luZ3MuUmVsSWQgPSByZWwuSWQ7CiAgICAgICAgIH0KKyAgICAgICAgX3ZtbERyYXdpbmdzLlZtbERyYXdpbmdYbWwuU2F2ZShfdm1sRHJhd2luZ3MuUGFydC5HZXRTdHJlYW0oKSk7CisgICAgICB9CisgICAgfQorICB9CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0IGEgc3Ryb25nbHkgdHlwZWQgY2VsbCB2YWx1ZSBmcm9tIHRoZSB3b3Jrc2hlZXQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIHR5cGU8L3R5cGVwYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJSb3ciPlRoZSByb3cgbnVtYmVyPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJDb2x1bW4iPlRoZSByb3cgbnVtYmVyPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSB2YWx1ZS4gSWYgdGhlIHZhbHVlIGNhbid0IGJlIGNvbnZlcnRlZCB0byB0aGUgc3BlY2lmaWVkIHR5cGUsIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQ8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBUIEdldFZhbHVlPFQ+KGludCBSb3csIGludCBDb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7Ci0gICAgICAgICAgICAvL3Vsb25nIGNlbGxJRD1FeGNlbENlbGxCYXNlLkdldENlbGxJRChTaGVldElELCBSb3csIENvbHVtbik7Ci0gICAgICAgICAgICB2YXIgdiA9IF92YWx1ZXMuR2V0VmFsdWUoUm93LCBDb2x1bW4pOyAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodj09bnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChUKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2F2ZSBhbGwgdGFibGUgZGF0YQorICAvLy8gPC9zdW1tYXJ5PgorICBwcml2YXRlIHZvaWQgU2F2ZVRhYmxlcygpIHsKKyAgICBmb3JlYWNoICh2YXIgdGJsIGluIFRhYmxlcykgeworICAgICAgaWYgKHRibC5TaG93SGVhZGVyIHx8IHRibC5TaG93VG90YWwpIHsKKyAgICAgICAgaW50IGNvbE51bSA9IHRibC5BZGRyZXNzLl9mcm9tQ29sOworICAgICAgICB2YXIgY29sVmFsID0gbmV3IEhhc2hTZXQ8c3RyaW5nPigpOworICAgICAgICBmb3JlYWNoICh2YXIgY29sIGluIHRibC5Db2x1bW5zKSB7CisgICAgICAgICAgc3RyaW5nIG4gPSBjb2wuTmFtZS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgIGlmICh0YmwuU2hvd0hlYWRlcikgeworICAgICAgICAgICAgbiA9IHRibC5Xb3JrU2hlZXQuR2V0VmFsdWU8c3RyaW5nPigKKyAgICAgICAgICAgICAgICB0YmwuQWRkcmVzcy5fZnJvbVJvdywKKyAgICAgICAgICAgICAgICB0YmwuQWRkcmVzcy5fZnJvbUNvbCArIGNvbC5Qb3NpdGlvbik7CisgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkobikpIHsKKyAgICAgICAgICAgICAgbiA9IGNvbC5OYW1lLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBjb2wuTmFtZSA9IG47CiAgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG4gPSBjb2wuTmFtZS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy92YXIgY2VsbD0oKEV4Y2VsQ2VsbClfY2VsbHNbY2VsbElEXSk7Ci0gICAgICAgICAgICBpZiAoX2ZsYWdzLkdldEZsYWdWYWx1ZShSb3csIENvbHVtbiwgQ2VsbEZsYWdzLlJpY2hUZXh0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFQpKG9iamVjdClDZWxsc1tSb3csIENvbHVtbl0uUmljaFRleHQuVGV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0VHlwZWRWYWx1ZTxUPih2KTsKKyAgICAgICAgICBpZiAoY29sVmFsLkNvbnRhaW5zKG4pKSB7CisgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWREYXRhRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIlRhYmxlIHswfSBDb2x1bW4gezF9IGRvZXMgbm90IGhhdmUgYSB1bmlxdWUgbmFtZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgdGJsLk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2wuTmFtZSkpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29sVmFsLkFkZChuKTsKKyAgICAgICAgICBjb2wuTmFtZSA9IENvbnZlcnRVdGlsLkV4Y2VsRW5jb2RlU3RyaW5nKGNvbC5OYW1lKTsKKyAgICAgICAgICBpZiAodGJsLlNob3dIZWFkZXIpIHsKKyAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUodGJsLkFkZHJlc3MuX2Zyb21Sb3csIGNvbE51bSwgY29sLk5hbWUpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAodGJsLlNob3dUb3RhbCkgeworICAgICAgICAgICAgU2V0VGFibGVUb3RhbEZ1bmN0aW9uKHRibCwgY29sLCBjb2xOdW0pOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGNvbC5DYWxjdWxhdGVkQ29sdW1uRm9ybXVsYSkpIHsKKyAgICAgICAgICAgIGludCBmcm9tUm93ID0gdGJsLlNob3dIZWFkZXIgPyB0YmwuQWRkcmVzcy5fZnJvbVJvdyArIDEgOiB0YmwuQWRkcmVzcy5fZnJvbVJvdzsKKyAgICAgICAgICAgIGludCB0b1JvdyA9IHRibC5TaG93VG90YWwgPyB0YmwuQWRkcmVzcy5fdG9Sb3cgLSAxIDogdGJsLkFkZHJlc3MuX3RvUm93OworICAgICAgICAgICAgZm9yIChpbnQgcm93ID0gZnJvbVJvdzsgcm93IDw9IHRvUm93OyByb3crKykgeworICAgICAgICAgICAgICAvL0NlbGwocm93LCBjb2xOdW0pLkZvcm11bGEgPSBjb2wuQ2FsY3VsYXRlZENvbHVtbkZvcm11bGE7CisgICAgICAgICAgICAgIFNldEZvcm11bGEocm93LCBjb2xOdW0sIGNvbC5DYWxjdWxhdGVkQ29sdW1uRm9ybXVsYSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGNvbE51bSsrOwogICAgICAgICB9Ci0gICAgICAgIC8vVGhhbmtzIHRvIE1pY2hhZWwgVHJhbiBmb3IgcGFydHMgb2YgdGhpcyBtZXRob2QKLSAgICAgICAgaW50ZXJuYWwgVCBHZXRUeXBlZFZhbHVlPFQ+KG9iamVjdCB2KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodiA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KFQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHlwZSBmcm9tVHlwZSA9IHYuR2V0VHlwZSgpOwotICAgICAgICAgICAgVHlwZSB0b1R5cGUgPSB0eXBlb2YoVCk7Ci0gICAgICAgICAgICBpZiAoZnJvbVR5cGUgPT0gdG9UeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoVCl2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIGNudiA9IFR5cGVEZXNjcmlwdG9yLkdldENvbnZlcnRlcihmcm9tVHlwZSk7Ci0gICAgICAgICAgICBpZiAodG9UeXBlID09IHR5cGVvZihEYXRlVGltZSkpICAgIC8vSGFuZGxlIGRhdGVzCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZyb21UeXBlID09IHR5cGVvZihUaW1lU3BhbikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChUKShvYmplY3QpKG5ldyBEYXRlVGltZSgoKFRpbWVTcGFuKXYpLlRpY2tzKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChmcm9tVHlwZSA9PSB0eXBlb2Yoc3RyaW5nKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERhdGVUaW1lIGR0OwotICAgICAgICAgICAgICAgICAgICBpZiAoRGF0ZVRpbWUuVHJ5UGFyc2Uodi5Ub1N0cmluZygpLCBvdXQgZHQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFQpKG9iamVjdCkoZHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQoVCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh0YmwuUGFydCA9PSBudWxsKSB7CisgICAgICAgIHRibC5UYWJsZVVyaSA9IEdldE5ld1VyaShfcGFja2FnZS5QYWNrYWdlLCAiL3hsL3RhYmxlcy90YWJsZXswfS54bWwiLCB0YmwuSWQpOworICAgICAgICB0YmwuUGFydCA9IF9wYWNrYWdlLlBhY2thZ2UuQ3JlYXRlUGFydCgKKyAgICAgICAgICAgIHRibC5UYWJsZVVyaSwKKyAgICAgICAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC50YWJsZSt4bWwiLAorICAgICAgICAgICAgV29ya2Jvb2suX3BhY2thZ2UuQ29tcHJlc3Npb24pOworICAgICAgICB2YXIgc3RyZWFtID0gdGJsLlBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSk7CisgICAgICAgIHRibC5UYWJsZVhtbC5TYXZlKHN0cmVhbSk7CisgICAgICAgIHZhciByZWwgPSBQYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcCgKKyAgICAgICAgICAgIFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShXb3Jrc2hlZXRVcmksIHRibC5UYWJsZVVyaSksCisgICAgICAgICAgICBUYXJnZXRNb2RlLkludGVybmFsLAorICAgICAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi90YWJsZSIpOworICAgICAgICB0YmwuUmVsYXRpb25zaGlwSUQgPSByZWwuSWQ7CiAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNudi5DYW5Db252ZXJ0VG8odHlwZW9mKGRvdWJsZSkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFQpKG9iamVjdCkoRGF0ZVRpbWUuRnJvbU9BRGF0ZSgoZG91YmxlKWNudi5Db252ZXJ0VG8odiwgdHlwZW9mKGRvdWJsZSkpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHRvVHlwZSA9PSB0eXBlb2YoVGltZVNwYW4pKSAgICAvL0hhbmRsZSB0aW1lc3BhbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmcm9tVHlwZSA9PSB0eXBlb2YoRGF0ZVRpbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoVCkob2JqZWN0KShuZXcgVGltZVNwYW4oKChEYXRlVGltZSl2KS5UaWNrcykpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoZnJvbVR5cGUgPT0gdHlwZW9mKHN0cmluZykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUaW1lU3BhbiB0czsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFRpbWVTcGFuLlRyeVBhcnNlKHYuVG9TdHJpbmcoKSwgb3V0IHRzKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUKShvYmplY3QpKHRzKTsgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChUKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY252LkNhbkNvbnZlcnRUbyh0eXBlb2YoZG91YmxlKSkpCi0gICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgQ3JlYXRlTm9kZSgiZDp0YWJsZVBhcnRzIik7CisgICAgICAgIFhtbE5vZGUgdGJscyA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDp0YWJsZVBhcnRzIiwgTmFtZVNwYWNlTWFuYWdlcik7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVCkob2JqZWN0KShuZXcgVGltZVNwYW4oRGF0ZVRpbWUuRnJvbU9BRGF0ZSgoZG91YmxlKWNudi5Db252ZXJ0VG8odiwgdHlwZW9mKGRvdWJsZSkpKS5UaWNrcykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXNzdWUgMTQ2ODIgLS0gIkdldFZhbHVlPGRlY2ltYWw+KCkgd29uJ3QgY29udmVydCBzdHJpbmdzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFzIHN1Z2dlc3RlZCwgYWZ0ZXIgYWxsIHNwZWNpYWwgY2FzZXMsIGFsbCAuTkVUIHRvIGRvIGl0J3MgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlZmVycmVkIGNvbnZlcnNpb24gcmF0aGVyIHRoYW4gc2ltcGx5IHJldHVybmluZyB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoVClDb252ZXJ0LkNoYW5nZVR5cGUodiwgdHlwZW9mKFQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyB3YXMgdGhlIHByZXZpb3VzIGJlaGF2aW91ciAtLSBubyBjb252ZXJzaW9uIGlzIGF2YWlsYWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdChUKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY252LkNhbkNvbnZlcnRUbyh0b1R5cGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUKWNudi5Db252ZXJ0VG8odiwgdHlwZW9mKFQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRvVHlwZS5Jc0dlbmVyaWNUeXBlICYmIHRvVHlwZS5HZXRHZW5lcmljVHlwZURlZmluaXRpb24oKS5FcXVhbHModHlwZW9mKE51bGxhYmxlPD4pKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9UeXBlID0gTnVsbGFibGUuR2V0VW5kZXJseWluZ1R5cGUodG9UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbnYuQ2FuQ29udmVydFRvKHRvVHlwZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUKWNudi5Db252ZXJ0VG8odiwgdHlwZW9mKFQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICB2YXIgdGJsTm9kZSA9IHRibHMuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJ0YWJsZVBhcnQiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgICB0YmxzLkFwcGVuZENoaWxkKHRibE5vZGUpOworICAgICAgICB0YmxOb2RlLlNldEF0dHJpYnV0ZSgiaWQiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYVJlbGF0aW9uc2hpcHMsIHJlbC5JZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgc3RyZWFtID0gdGJsLlBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSk7CisgICAgICAgIHRibC5UYWJsZVhtbC5TYXZlKHN0cmVhbSk7CisgICAgICB9CisgICAgfQorICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYoZnJvbVR5cGU9PXR5cGVvZihkb3VibGUpICYmIHRvVHlwZT09dHlwZW9mKGRlY2ltYWwpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFQpKG9iamVjdClDb252ZXJ0LlRvRGVjaW1hbCh2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmcm9tVHlwZSA9PSB0eXBlb2YoZGVjaW1hbCkgJiYgdG9UeXBlID09IHR5cGVvZihkb3VibGUpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFQpKG9iamVjdClDb252ZXJ0LlRvRG91YmxlKHYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQoVCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgIGludGVybmFsIHZvaWQgU2V0VGFibGVUb3RhbEZ1bmN0aW9uKEV4Y2VsVGFibGUgdGJsLCBFeGNlbFRhYmxlQ29sdW1uIGNvbCwgaW50IGNvbE51bSA9IC0xKSB7CisgICAgaWYgKHRibC5TaG93VG90YWwgPT0gZmFsc2UpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGNvbE51bSA9PSAtMSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YmwuQ29sdW1ucy5Db3VudDsgaSsrKSB7CisgICAgICAgIGlmICh0YmwuQ29sdW1uc1tpXS5OYW1lID09IGNvbC5OYW1lKSB7CisgICAgICAgICAgY29sTnVtID0gdGJsLkFkZHJlc3MuX2Zyb21Db2wgKyBpOwogICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNldCB0aGUgdmFsdWUgb2YgYSBjZWxsCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iUm93Ij5UaGUgcm93IG51bWJlcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQ29sdW1uIj5UaGUgY29sdW1uIG51bWJlcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iVmFsdWUiPlRoZSB2YWx1ZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFNldFZhbHVlKGludCBSb3csIGludCBDb2x1bW4sIG9iamVjdCBWYWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChSb3cgPCAxIHx8IENvbHVtbiA8IDEgfHwgUm93ID4gRXhjZWxQYWNrYWdlLk1heFJvd3MgJiYgQ29sdW1uID4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiUm93IG9yIENvbHVtbiBvdXQgb2YgcmFuZ2UiKTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUoUm93LCBDb2x1bW4sIFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXQgdGhlIHZhbHVlIG9mIGEgY2VsbAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkFkZHJlc3MiPlRoZSBFeGNlbCBhZGRyZXNzPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJWYWx1ZSI+VGhlIHZhbHVlPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgU2V0VmFsdWUoc3RyaW5nIEFkZHJlc3MsIG9iamVjdCBWYWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKLSAgICAgICAgICAgIGludCByb3csIGNvbDsKLSAgICAgICAgICAgIEV4Y2VsQWRkcmVzc0Jhc2UuR2V0Um93Q29sKEFkZHJlc3MsIG91dCByb3csIG91dCBjb2wsIHRydWUpOwotICAgICAgICAgICAgaWYgKHJvdyA8IDEgfHwgY29sIDwgMSB8fCByb3cgPiBFeGNlbFBhY2thZ2UuTWF4Um93cyAmJiBjb2wgPiBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJBZGRyZXNzIGlzIGludmFsaWQgb3Igb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCBWYWx1ZSk7ICAgICAgICAgICAKLSAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoY29sLlRvdGFsc1Jvd0Z1bmN0aW9uID09IFJvd0Z1bmN0aW9ucy5DdXN0b20pIHsKKyAgICAgIFNldEZvcm11bGEodGJsLkFkZHJlc3MuX3RvUm93LCBjb2xOdW0sIGNvbC5Ub3RhbHNSb3dGb3JtdWxhKTsKKyAgICB9IGVsc2UgaWYgKGNvbC5Ub3RhbHNSb3dGdW5jdGlvbiAhPSBSb3dGdW5jdGlvbnMuTm9uZSkgeworICAgICAgc3dpdGNoIChjb2wuVG90YWxzUm93RnVuY3Rpb24pIHsKKyAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuQXZlcmFnZToKKyAgICAgICAgICBTZXRGb3JtdWxhKHRibC5BZGRyZXNzLl90b1JvdywgY29sTnVtLCBHZXRUb3RhbEZ1bmN0aW9uKGNvbCwgIjEwMSIpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuQ291bnQ6CisgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDIiKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUm93RnVuY3Rpb25zLkNvdW50TnVtczoKKyAgICAgICAgICBTZXRGb3JtdWxhKHRibC5BZGRyZXNzLl90b1JvdywgY29sTnVtLCBHZXRUb3RhbEZ1bmN0aW9uKGNvbCwgIjEwMyIpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuTWF4OgorICAgICAgICAgIFNldEZvcm11bGEodGJsLkFkZHJlc3MuX3RvUm93LCBjb2xOdW0sIEdldFRvdGFsRnVuY3Rpb24oY29sLCAiMTA0IikpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJvd0Z1bmN0aW9ucy5NaW46CisgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDUiKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUm93RnVuY3Rpb25zLlN0ZERldjoKKyAgICAgICAgICBTZXRGb3JtdWxhKHRibC5BZGRyZXNzLl90b1JvdywgY29sTnVtLCBHZXRUb3RhbEZ1bmN0aW9uKGNvbCwgIjEwNyIpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuVmFyOgorICAgICAgICAgIFNldEZvcm11bGEodGJsLkFkZHJlc3MuX3RvUm93LCBjb2xOdW0sIEdldFRvdGFsRnVuY3Rpb24oY29sLCAiMTEwIikpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJvd0Z1bmN0aW9ucy5TdW06CisgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDkiKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgKG5ldygiVW5rbm93biBSb3dGdW5jdGlvbiBlbnVtIikpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBfdmFsdWVzLlNldFZhbHVlKHRibC5BZGRyZXNzLl90b1JvdywgY29sTnVtLCBjb2wuVG90YWxzUm93TGFiZWwpOworICAgIH0KKyAgfQogCi0gICAgICAgICNyZWdpb24gTWVyZ2VDZWxsSWQKKyAgaW50ZXJuYWwgdm9pZCBTZXRGb3JtdWxhKGludCByb3csIGludCBjb2wsIG9iamVjdCB2YWx1ZSkgeworICAgIF9mb3JtdWxhcy5TZXRWYWx1ZShyb3csIGNvbCwgdmFsdWUpOworICAgIGlmICghX3ZhbHVlcy5FeGlzdHMocm93LCBjb2wpKSB7CisgICAgICBfdmFsdWVzLlNldFZhbHVlKHJvdywgY29sLCBudWxsKTsKKyAgICB9CisgIH0KIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXQgTWVyZ2VDZWxsIEluZGV4IE5vCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIGludCBHZXRNZXJnZUNlbGxJZChpbnQgcm93LCBpbnQgY29sdW1uKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9tZXJnZWRDZWxscy5Db3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgaWYoIXN0cmluZy5Jc051bGxPckVtcHR5KCBfbWVyZ2VkQ2VsbHNbaV0pKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFeGNlbFJhbmdlIHJhbmdlID0gQ2VsbHNbX21lcmdlZENlbGxzW2ldXTsKKyAgaW50ZXJuYWwgdm9pZCBTZXRTdHlsZShpbnQgcm93LCBpbnQgY29sLCBpbnQgdmFsdWUpIHsKKyAgICBfc3R5bGVzLlNldFZhbHVlKHJvdywgY29sLCB2YWx1ZSk7CisgICAgaWYgKCFfdmFsdWVzLkV4aXN0cyhyb3csIGNvbCkpIHsKKyAgICAgIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIG51bGwpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBTYXZlUGl2b3RUYWJsZXMoKSB7CisgICAgZm9yZWFjaCAodmFyIHB0IGluIFBpdm90VGFibGVzKSB7CisgICAgICBpZiAocHQuRGF0YUZpZWxkcy5Db3VudCA+IDEpIHsKKyAgICAgICAgWG1sRWxlbWVudCBwYXJlbnROb2RlOworICAgICAgICBpZiAocHQuRGF0YU9uUm93cykgeworICAgICAgICAgIHBhcmVudE5vZGUgPQorICAgICAgICAgICAgICBwdC5QaXZvdFRhYmxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpyb3dGaWVsZHMiLCBwdC5OYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpIHsKKyAgICAgICAgICAgIHB0LkNyZWF0ZU5vZGUoImQ6cm93RmllbGRzIik7CisgICAgICAgICAgICBwYXJlbnROb2RlID0KKyAgICAgICAgICAgICAgICBwdC5QaXZvdFRhYmxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpyb3dGaWVsZHMiLCBwdC5OYW1lU3BhY2VNYW5hZ2VyKQorICAgICAgICAgICAgICAgICAgICBhcyBYbWxFbGVtZW50OworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwYXJlbnROb2RlID0KKyAgICAgICAgICAgICAgcHQuUGl2b3RUYWJsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6Y29sRmllbGRzIiwgcHQuTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKyAgICAgICAgICBpZiAocGFyZW50Tm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICBwdC5DcmVhdGVOb2RlKCJkOmNvbEZpZWxkcyIpOworICAgICAgICAgICAgcGFyZW50Tm9kZSA9CisgICAgICAgICAgICAgICAgcHQuUGl2b3RUYWJsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6Y29sRmllbGRzIiwgcHQuTmFtZVNwYWNlTWFuYWdlcikKKyAgICAgICAgICAgICAgICAgICAgYXMgWG1sRWxlbWVudDsKKyAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2UuU3RhcnQuUm93IDw9IHJvdyAmJiByb3cgPD0gcmFuZ2UuRW5kLlJvdykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlLlN0YXJ0LkNvbHVtbiA8PSBjb2x1bW4gJiYgY29sdW1uIDw9IHJhbmdlLkVuZC5Db2x1bW4pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBpZiAocGFyZW50Tm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOmZpZWxkW0AgeD0gXCItMlwiXSIsIHB0Lk5hbWVTcGFjZU1hbmFnZXIpID09IG51bGwpIHsKKyAgICAgICAgICBYbWxFbGVtZW50IGZpZWxkTm9kZSA9IHB0LlBpdm90VGFibGVYbWwuQ3JlYXRlRWxlbWVudCgiZmllbGQiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgICAgIGZpZWxkTm9kZS5TZXRBdHRyaWJ1dGUoIngiLCAiLTIiKTsKKyAgICAgICAgICBwYXJlbnROb2RlLkFwcGVuZENoaWxkKGZpZWxkTm9kZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHZhciB3cyA9IFdvcmtib29rLldvcmtzaGVldHNbcHQuQ2FjaGVEZWZpbml0aW9uLlNvdXJjZVJhbmdlLldvcmtTaGVldF07CisgICAgICB2YXIgdCA9IHdzLlRhYmxlcy5HZXRGcm9tUmFuZ2UocHQuQ2FjaGVEZWZpbml0aW9uLlNvdXJjZVJhbmdlKTsKKyAgICAgIHZhciBmaWVsZHMgPSBwdC5DYWNoZURlZmluaXRpb24uQ2FjaGVEZWZpbml0aW9uWG1sLlNlbGVjdE5vZGVzKAorICAgICAgICAgICJkOnBpdm90Q2FjaGVEZWZpbml0aW9uL2Q6Y2FjaGVGaWVsZHMvZDpjYWNoZUZpZWxkIiwKKyAgICAgICAgICBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgIGludCBpeCA9IDA7CisgICAgICBpZiAoZmllbGRzICE9IG51bGwpIHsKKyAgICAgICAgdmFyIGZsZHMgPSBuZXcgSGFzaFNldDxzdHJpbmc+KCk7CisgICAgICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgbm9kZSBpbiBmaWVsZHMpIHsKKyAgICAgICAgICBpZiAoaXggPj0gcHQuQ2FjaGVEZWZpbml0aW9uLlNvdXJjZVJhbmdlLkNvbHVtbnMpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICB2YXIgZmxkTmFtZSA9IG5vZGUuR2V0QXR0cmlidXRlKCJuYW1lIik7IC8vRml4ZXMgaXNzdWUgMTUyOTUgZHVwIG5hbWUgZXJyb3IKKyAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZmxkTmFtZSkpIHsKKyAgICAgICAgICAgIGZsZE5hbWUgPQorICAgICAgICAgICAgICAgICh0ID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgPyBwdC5DYWNoZURlZmluaXRpb24uU291cmNlUmFuZ2UuT2Zmc2V0KDAsIGl4KyssIDEsIDEpLlZhbHVlLlRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICAgICAgOiB0LkNvbHVtbnNbaXgrK10uTmFtZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChmbGRzLkNvbnRhaW5zKGZsZE5hbWUpKSB7CisgICAgICAgICAgICBmbGROYW1lID0gR2V0TmV3TmFtZShmbGRzLCBmbGROYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZmxkcy5BZGQoZmxkTmFtZSk7CisgICAgICAgICAgbm9kZS5TZXRBdHRyaWJ1dGUoIm5hbWUiLCBmbGROYW1lKTsKKyAgICAgICAgfQorICAgICAgICBmb3JlYWNoICh2YXIgZGYgaW4gcHQuRGF0YUZpZWxkcykgeworICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShkZi5OYW1lKSkgeworICAgICAgICAgICAgc3RyaW5nIG5hbWU7CisgICAgICAgICAgICBpZiAoZGYuRnVuY3Rpb24gPT0gRGF0YUZpZWxkRnVuY3Rpb25zLk5vbmUpIHsKKyAgICAgICAgICAgICAgbmFtZSA9IGRmLkZpZWxkLk5hbWU7IC8vTmFtZSBtdXN0IGJlIHNldCBvciBFeGNlbCB3aWxsIGNyYXNoIG9uIHJlbmFtZS4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIG5hbWUgPSBkZi5GdW5jdGlvbiArICIgb2YgIiArIGRmLkZpZWxkLk5hbWU7IC8vTmFtZSBtdXN0IGJlIHNldCBvciBFeGNlbCB3aWxsIGNyYXNoIG9uIHJlbmFtZS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vTWFrZSBzdXJlIG5hbWUgaXMgdW5pcXVlCisgICAgICAgICAgICB2YXIgbmV3TmFtZSA9IG5hbWU7CisgICAgICAgICAgICB2YXIgaSA9IDI7CisgICAgICAgICAgICB3aGlsZSAocHQuRGF0YUZpZWxkcy5FeGlzdHNEZk5hbWUobmV3TmFtZSwgZGYpKSB7CisgICAgICAgICAgICAgIG5ld05hbWUgPSBuYW1lICsgKGkrKykuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGRmLk5hbWUgPSBuZXdOYW1lOworICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgfQorICAgICAgcHQuUGl2b3RUYWJsZVhtbC5TYXZlKHB0LlBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSkpOworICAgICAgcHQuQ2FjaGVEZWZpbml0aW9uLkNhY2hlRGVmaW5pdGlvblhtbC5TYXZlKAorICAgICAgICAgIHB0LkNhY2hlRGVmaW5pdGlvbi5QYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUpKTsKKyAgICB9CisgIH0KIAotICAgICAgICAjZW5kcmVnaW9uCi0JCSNlbmRyZWdpb24gLy8gRU5EIFdvcmtzaGVldCBQdWJsaWMgTWV0aG9kcworICBwcml2YXRlIHN0cmluZyBHZXROZXdOYW1lKEhhc2hTZXQ8c3RyaW5nPiBmbGRzLCBzdHJpbmcgZmxkTmFtZSkgeworICAgIGludCBpeCA9IDI7CisgICAgd2hpbGUgKGZsZHMuQ29udGFpbnMoZmxkTmFtZSArIGl4LlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKSkgeworICAgICAgaXgrKzsKKyAgICB9CisgICAgcmV0dXJuIGZsZE5hbWUgKyBpeC5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgfQogCi0JCSNyZWdpb24gV29ya3NoZWV0IFByaXZhdGUgTWV0aG9kcworICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgR2V0VG90YWxGdW5jdGlvbihFeGNlbFRhYmxlQ29sdW1uIGNvbCwgc3RyaW5nIGZ1bmN0aW9uTnVtKSB7CisgICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoIlNVQlRPVEFMKHswfSx7MX1bezJ9XSkiLCBmdW5jdGlvbk51bSwgY29sLl90YmwuTmFtZSwgY29sLk5hbWUpOworICB9CiAKLQkJI3JlZ2lvbiBXb3Jrc2hlZXQgU2F2ZQotICAgICAgICBpbnRlcm5hbCB2b2lkIFNhdmUoKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGVsZXRlUHJpbnRlclNldHRpbmdzKCk7CisgIHByaXZhdGUgdm9pZCBDbGVhbnVwTWVyZ2VkQ2VsbHMoTWVyZ2VDZWxsc0NvbGxlY3Rpb24gbWVyZ2VkQ2VsbHMpIHsKKyAgICBpbnQgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBtZXJnZWRDZWxscy5MaXN0LkNvdW50KSB7CisgICAgICBpZiAobWVyZ2VkQ2VsbHNbaV0gPT0gbnVsbCkgeworICAgICAgICBtZXJnZWRDZWxscy5MaXN0LlJlbW92ZUF0KGkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaSsrOworICAgICAgfQorICAgIH0KKyAgfQogCi0gICAgICAgICAgICAgICAgaWYgKF93b3Jrc2hlZXRYbWwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7CisgIHByaXZhdGUgdm9pZCBVcGRhdGVDb2xCcmVha3MoU3RyZWFtV3JpdGVyIHN3KSB7CisgICAgU3RyaW5nQnVpbGRlciBicmVha3MgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIGludCBjb3VudCA9IDA7CisgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF92YWx1ZXMsIDAsIDAsIDAsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICAvL2ZvcmVhY2ggKEV4Y2VsQ29sdW1uIGNvbCBpbiBfY29sdW1ucykKKyAgICB3aGlsZSAoY3NlLk5leHQoKSkgeworICAgICAgdmFyIGNvbCA9IGNzZS5WYWx1ZSBhcyBFeGNlbENvbHVtbjsKKyAgICAgIGlmIChjb2wgIT0gbnVsbCAmJiBjb2wuUGFnZUJyZWFrKSB7CisgICAgICAgIGJyZWFrcy5BcHBlbmRGb3JtYXQoIjxicmsgaWQ9XCJ7MH1cIiBtYXg9XCIxNjM4M1wiIG1hbj1cIjFcIiAvPiIsIGNzZS5Db2x1bW4pOworICAgICAgICBjb3VudCsrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoY291bnQgPiAwKSB7CisgICAgICBzdy5Xcml0ZSgiPGNvbEJyZWFrcyBjb3VudD1cInswfVwiIG1hbnVhbEJyZWFrQ291bnQ9XCJ7MH1cIj57MX08L2NvbEJyZWFrcz4iLCBjb3VudCwgYnJlYWtzKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgVXBkYXRlUm93QnJlYWtzKFN0cmVhbVdyaXRlciBzdykgeworICAgIFN0cmluZ0J1aWxkZXIgYnJlYWtzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBpbnQgY291bnQgPSAwOworICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihfdmFsdWVzLCAwLCAwLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgMCk7CisgICAgLy9mb3JlYWNoKEV4Y2VsUm93IHJvdyBpbiBfcm93cykKKyAgICB3aGlsZSAoY3NlLk5leHQoKSkgeworICAgICAgdmFyIHJvdyA9IGNzZS5WYWx1ZSBhcyBSb3dJbnRlcm5hbDsKKyAgICAgIGlmIChyb3cgIT0gbnVsbCAmJiByb3cuUGFnZUJyZWFrKSB7CisgICAgICAgIGJyZWFrcy5BcHBlbmRGb3JtYXQoIjxicmsgaWQ9XCJ7MH1cIiBtYXg9XCIxMDQ4NTc1XCIgbWFuPVwiMVwiIC8+IiwgY3NlLlJvdyk7CisgICAgICAgIGNvdW50Kys7CisgICAgICB9CisgICAgfQorICAgIGlmIChjb3VudCA+IDApIHsKKyAgICAgIHN3LldyaXRlKCI8cm93QnJlYWtzIGNvdW50PVwiezB9XCIgbWFudWFsQnJlYWtDb3VudD1cInswfVwiPnsxfTwvcm93QnJlYWtzPiIsIGNvdW50LCBicmVha3MpOworICAgIH0KKyAgfQogCi0gICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMgaXMgRXhjZWxDaGFydHNoZWV0KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB0aGUgaGVhZGVyICYgZm9vdGVyIChpZiBkZWZpbmVkKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9oZWFkZXJGb290ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXJGb290ZXIuU2F2ZSgpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbnNlcnRzIHRoZSBjb2xzIGNvbGxlY3Rpb24gaW50byB0aGUgWE1MIGRvY3VtZW50CisgIC8vLyA8L3N1bW1hcnk+CisgIHByaXZhdGUgdm9pZCBVcGRhdGVDb2x1bW5EYXRhKFN0cmVhbVdyaXRlciBzdykgeworICAgIC8vRXhjZWxDb2x1bW4gcHJldkNvbCA9IG51bGw7ICAgLy9jb21tZW50ZWQgb3V0IDExLzEtMTIgSksKKyAgICAvL2ZvcmVhY2ggKEV4Y2VsQ29sdW1uIGNvbCBpbiBfY29sdW1ucykKKyAgICAvL3sKKyAgICAvLyAgICBpZiAocHJldkNvbCAhPSBudWxsKQorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICAgaWYocHJldkNvbC5Db2x1bW5NYXggIT0gY29sLkNvbHVtbk1pbi0xKQorICAgIC8vICAgICAgICB7CisgICAgLy8gICAgICAgICAgICBwcmV2Q29sLl9jb2x1bW5NYXg9Y29sLkNvbHVtbk1pbi0xOworICAgIC8vICAgICAgICB9CisgICAgLy8gICAgfQorICAgIC8vICAgIHByZXZDb2wgPSBjb2w7CisgICAgLy99CisgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF92YWx1ZXMsIDAsIDEsIDAsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICAvL3N3LldyaXRlKCI8Y29scz4iKTsKKyAgICAvL2ZvcmVhY2ggKEV4Y2VsQ29sdW1uIGNvbCBpbiBfY29sdW1ucykKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICB3aGlsZSAoY3NlLk5leHQoKSkgeworICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgIHN3LldyaXRlKCI8Y29scz4iKTsKKyAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHZhciBjb2wgPSBjc2UuVmFsdWUgYXMgRXhjZWxDb2x1bW47CisgICAgICBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbFhmcz4gY2VsbFhmcyA9IF9wYWNrYWdlLldvcmtib29rLlN0eWxlcy5DZWxsWGZzOwogCi0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IERpbWVuc2lvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5EZWxldGVBbGxOb2RlKCJkOmRpbWVuc2lvbi9AcmVmIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5TZXRYbWxOb2RlU3RyaW5nKCJkOmRpbWVuc2lvbi9AcmVmIiwgZC5BZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZUNvbW1lbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTYXZlVGFibGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTYXZlUGl2b3RUYWJsZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICAgIHN3LldyaXRlKCI8Y29sIG1pbj1cInswfVwiIG1heD1cInsxfVwiIiwgY29sLkNvbHVtbk1pbiwgY29sLkNvbHVtbk1heCk7CisgICAgICBpZiAoY29sLkhpZGRlbikgeworICAgICAgICAvL3NiWG1sLkFwcGVuZCgiIHdpZHRoPVwiMFwiIGhpZGRlbj1cIjFcIiBjdXN0b21XaWR0aD1cIjFcIiIpOworICAgICAgICBzdy5Xcml0ZSgiIGhpZGRlbj1cIjFcIiIpOworICAgICAgfSBlbHNlIGlmIChjb2wuQmVzdEZpdCkgeworICAgICAgICBzdy5Xcml0ZSgiIGJlc3RGaXQ9XCIxXCIiKTsKKyAgICAgIH0KKyAgICAgIHN3LldyaXRlKAorICAgICAgICAgIHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsCisgICAgICAgICAgICAgICIgd2lkdGg9XCJ7MH1cIiBjdXN0b21XaWR0aD1cIjFcIiIsCisgICAgICAgICAgICAgIGNvbC5XaWR0aCkpOworICAgICAgaWYgKGNvbC5PdXRsaW5lTGV2ZWwgPiAwKSB7CisgICAgICAgIHN3LldyaXRlKCIgb3V0bGluZUxldmVsPVwiezB9XCIgIiwgY29sLk91dGxpbmVMZXZlbCk7CisgICAgICAgIGlmIChjb2wuQ29sbGFwc2VkKSB7CisgICAgICAgICAgaWYgKGNvbC5IaWRkZW4pIHsKKyAgICAgICAgICAgIHN3LldyaXRlKCIgY29sbGFwc2VkPVwiMVwiIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3LldyaXRlKCIgY29sbGFwc2VkPVwiMVwiIGhpZGRlbj1cIjFcIiIpOyAvL0Fsd2F5cyBoaWRkZW4KKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBTYXZlSGFuZGxlcihTdHJlYW1Xcml0ZXIgc3RyZWFtV3JpdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL0NyZWF0ZSB0aGUgbm9kZXMgaWYgdGhleSBkbyBub3QgZXhpc3QuCi0gICAgICAgICAgICBpZiAodGhpcyBpcyBFeGNlbENoYXJ0c2hlZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyLldyaXRlKF93b3Jrc2hlZXRYbWwuT3V0ZXJYbWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoImQ6Y29scyIpOwotICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoImQ6c2hlZXREYXRhIik7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlTm9kZSgiZDptZXJnZUNlbGxzIik7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlTm9kZSgiZDpoeXBlcmxpbmtzIik7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlTm9kZSgiZDpyb3dCcmVha3MiKTsKLSAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJkOmNvbEJyZWFrcyIpOworICAgICAgfQorICAgICAgaWYgKGNvbC5QaG9uZXRpYykgeworICAgICAgICBzdy5Xcml0ZSgiIHBob25ldGljPVwiMVwiIik7CisgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvL1N0cmVhbVdyaXRlciBzdz1uZXcgU3RyZWFtV3JpdGVyKFBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOwotICAgICAgICAgICAgICAgIHZhciB4bWwgPSBfd29ya3NoZWV0WG1sLk91dGVyWG1sOwotICAgICAgICAgICAgICAgIGludCBjb2xTdGFydCA9IDAsIGNvbEVuZCA9IDA7Ci0gICAgICAgICAgICAgICAgR2V0QmxvY2tQb3MoeG1sLCAiY29scyIsIHJlZiBjb2xTdGFydCwgcmVmIGNvbEVuZCk7Ci0KLSAgICAgICAgICAgICAgICBzdHJlYW1Xcml0ZXIuV3JpdGUoeG1sLlN1YnN0cmluZygwLCBjb2xTdGFydCkpOwotICAgICAgICAgICAgICAgIHZhciBjb2xCcmVha3MgPSBuZXcgTGlzdDxpbnQ+KCk7Ci0gICAgICAgICAgICAgICAgLy9pZiAoX2NvbHVtbnMuQ291bnQgPiAwKQotICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgIFVwZGF0ZUNvbHVtbkRhdGEoc3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAvL30KLQotICAgICAgICAgICAgICAgIGludCBjZWxsU3RhcnQgPSBjb2xFbmQsIGNlbGxFbmQgPSBjb2xFbmQ7Ci0gICAgICAgICAgICAgICAgR2V0QmxvY2tQb3MoeG1sLCAic2hlZXREYXRhIiwgcmVmIGNlbGxTdGFydCwgcmVmIGNlbGxFbmQpOwotCi0gICAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyLldyaXRlKHhtbC5TdWJzdHJpbmcoY29sRW5kLCBjZWxsU3RhcnQgLSBjb2xFbmQpKTsKLSAgICAgICAgICAgICAgICB2YXIgcm93QnJlYWtzID0gbmV3IExpc3Q8aW50PigpOwotICAgICAgICAgICAgICAgIFVwZGF0ZVJvd0NlbGxEYXRhKHN0cmVhbVdyaXRlcik7CisgICAgICB2YXIgc3R5bGVJZCA9IGNvbC5TdHlsZUlEID49IDAgPyBjZWxsWGZzW2NvbC5TdHlsZUlEXS5uZXdJRCA6IGNvbC5TdHlsZUlEOworICAgICAgaWYgKHN0eWxlSWQgPiAwKSB7CisgICAgICAgIHN3LldyaXRlKCIgc3R5bGU9XCJ7MH1cIiIsIHN0eWxlSWQpOworICAgICAgfQorICAgICAgc3cuV3JpdGUoIiAvPiIpOwogCi0gICAgICAgICAgICAgICAgaW50IG1lcmdlU3RhcnQgPSBjZWxsRW5kLCBtZXJnZUVuZCA9IGNlbGxFbmQ7CisgICAgICAvL2lmIChjb2wuUGFnZUJyZWFrKQorICAgICAgLy97CisgICAgICAvLyAgICBjb2xCcmVha3MuQWRkKGNvbC5Db2x1bW5NaW4pOworICAgICAgLy99CisgICAgfQorICAgIGlmICghZmlyc3QpIHsKKyAgICAgIHN3LldyaXRlKCI8L2NvbHM+Iik7CisgICAgfQorICB9CiAKLSAgICAgICAgICAgICAgICBHZXRCbG9ja1Bvcyh4bWwsICJtZXJnZUNlbGxzIiwgcmVmIG1lcmdlU3RhcnQsIHJlZiBtZXJnZUVuZCk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtV3JpdGVyLldyaXRlKHhtbC5TdWJzdHJpbmcoY2VsbEVuZCwgbWVyZ2VTdGFydCAtIGNlbGxFbmQpKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW5zZXJ0IHJvdyBhbmQgY2VsbHMgaW50byB0aGUgWE1MIGRvY3VtZW50CisgIC8vLyA8L3N1bW1hcnk+CisgIHByaXZhdGUgdm9pZCBVcGRhdGVSb3dDZWxsRGF0YShTdHJlYW1Xcml0ZXIgc3cpIHsKKyAgICBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbFhmcz4gY2VsbFhmcyA9IF9wYWNrYWdlLldvcmtib29rLlN0eWxlcy5DZWxsWGZzOwogCi0gICAgICAgICAgICAgICAgQ2xlYW51cE1lcmdlZENlbGxzKF9tZXJnZWRDZWxscyk7Ci0gICAgICAgICAgICAgICAgaWYgKF9tZXJnZWRDZWxscy5Db3VudCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBVcGRhdGVNZXJnZWRDZWxscyhzdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgICAgIH0KKyAgICBpbnQgcm93ID0gLTE7CiAKLSAgICAgICAgICAgICAgICBpbnQgaHlwZXJTdGFydCA9IG1lcmdlRW5kLCBoeXBlckVuZCA9IG1lcmdlRW5kOwotICAgICAgICAgICAgICAgIEdldEJsb2NrUG9zKHhtbCwgImh5cGVybGlua3MiLCByZWYgaHlwZXJTdGFydCwgcmVmIGh5cGVyRW5kKTsKLSAgICAgICAgICAgICAgICBzdHJlYW1Xcml0ZXIuV3JpdGUoeG1sLlN1YnN0cmluZyhtZXJnZUVuZCwgaHlwZXJTdGFydCAtIG1lcmdlRW5kKSk7Ci0gICAgICAgICAgICAgICAgLy9pZiAoX2h5cGVyTGlua0NlbGxzLkNvdW50ID4gMCkKLSAgICAgICAgICAgICAgICAvL3sKLSAgICAgICAgICAgICAgICBVcGRhdGVIeXBlckxpbmtzKHN0cmVhbVdyaXRlcik7Ci0gICAgICAgICAgICAgICAgLy8gfQorICAgIFN0cmluZ0J1aWxkZXIgc2JYbWwgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIHZhciBzcyA9IF9wYWNrYWdlLldvcmtib29rLl9zaGFyZWRTdHJpbmdzOworICAgIHZhciBzdHlsZXMgPSBfcGFja2FnZS5Xb3JrYm9vay5TdHlsZXM7CisgICAgdmFyIGNhY2hlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBjYWNoZS5BcHBlbmQoIjxzaGVldERhdGE+Iik7CiAKLSAgICAgICAgICAgICAgICBpbnQgcm93QnJlYWtTdGFydCA9IGh5cGVyRW5kLCByb3dCcmVha0VuZCA9IGh5cGVyRW5kOwotICAgICAgICAgICAgICAgIEdldEJsb2NrUG9zKHhtbCwgInJvd0JyZWFrcyIsIHJlZiByb3dCcmVha1N0YXJ0LCByZWYgcm93QnJlYWtFbmQpOwotICAgICAgICAgICAgICAgIHN0cmVhbVdyaXRlci5Xcml0ZSh4bWwuU3Vic3RyaW5nKGh5cGVyRW5kLCByb3dCcmVha1N0YXJ0IC0gaHlwZXJFbmQpKTsKLSAgICAgICAgICAgICAgICAvL2lmIChyb3dCcmVha3MuQ291bnQgPiAwKQotICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgIFVwZGF0ZVJvd0JyZWFrcyhzdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgICAgIC8vfQorICAgIC8vU2V0IGEgdmFsdWUgZm9yIGNlbGxzIHdpdGggc3R5bGUgYW5kIG5vIHZhbHVlIHNldC4KKyAgICB2YXIgY3NlU3R5bGUgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8aW50PigKKyAgICAgICAgX3N0eWxlcywKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgRXhjZWxQYWNrYWdlLk1heFJvd3MsCisgICAgICAgIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKKyAgICBmb3JlYWNoICh2YXIgcyBpbiBjc2VTdHlsZSkgeworICAgICAgaWYgKCFfdmFsdWVzLkV4aXN0cyhjc2VTdHlsZS5Sb3csIGNzZVN0eWxlLkNvbHVtbikpIHsKKyAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShjc2VTdHlsZS5Sb3csIGNzZVN0eWxlLkNvbHVtbiwgbnVsbCk7CisgICAgICB9CisgICAgfQogCi0gICAgICAgICAgICAgICAgaW50IGNvbEJyZWFrU3RhcnQgPSByb3dCcmVha0VuZCwgY29sQnJlYWtFbmQgPSByb3dCcmVha0VuZDsKLSAgICAgICAgICAgICAgICBHZXRCbG9ja1Bvcyh4bWwsICJjb2xCcmVha3MiLCByZWYgY29sQnJlYWtTdGFydCwgcmVmIGNvbEJyZWFrRW5kKTsKLSAgICAgICAgICAgICAgICBzdHJlYW1Xcml0ZXIuV3JpdGUoeG1sLlN1YnN0cmluZyhyb3dCcmVha0VuZCwgY29sQnJlYWtTdGFydCAtIHJvd0JyZWFrRW5kKSk7Ci0gICAgICAgICAgICAgICAgLy9pZiAoY29sQnJlYWtzLkNvdW50ID4gMCkKLSAgICAgICAgICAgICAgICAvL3sKLSAgICAgICAgICAgICAgICBVcGRhdGVDb2xCcmVha3Moc3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICBzdHJlYW1Xcml0ZXIuV3JpdGUoeG1sLlN1YnN0cmluZyhjb2xCcmVha0VuZCwgeG1sLkxlbmd0aCAtIGNvbEJyZWFrRW5kKSk7Ci0gICAgICAgICAgICB9CisgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KAorICAgICAgICBfdmFsdWVzLAorICAgICAgICAxLAorICAgICAgICAwLAorICAgICAgICBFeGNlbFBhY2thZ2UuTWF4Um93cywKKyAgICAgICAgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOworICAgIC8vZm9yZWFjaCAoSVJhbmdlSUQgciBpbiBfY2VsbHMpCisgICAgd2hpbGUgKGNzZS5OZXh0KCkpIHsKKyAgICAgIGlmIChjc2UuQ29sdW1uID4gMCkgeworICAgICAgICBpbnQgc3R5bGVJZCA9IGNlbGxYZnNbc3R5bGVzLkdldFN0eWxlSWQodGhpcywgY3NlLlJvdywgY3NlLkNvbHVtbildLm5ld0lEOworICAgICAgICAvL0FkZCB0aGUgcm93IGVsZW1lbnQgaWYgaXQncyBhIG5ldyByb3cKKyAgICAgICAgaWYgKGNzZS5Sb3cgIT0gcm93KSB7CisgICAgICAgICAgV3JpdGVSb3coY2FjaGUsIGNlbGxYZnMsIHJvdywgY3NlLlJvdyk7CisgICAgICAgICAgcm93ID0gY3NlLlJvdzsKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGVsZXRlIHRoZSBwcmludGVyc2V0dGluZ3MgcmVsYXRpb25zaGlwIGFuZCBwYXJ0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHZvaWQgRGVsZXRlUHJpbnRlclNldHRpbmdzKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9EZWxldGUgdGhlIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBwYWdlU2V0dXAgdGFnCi0gICAgICAgICAgICBYbWxBdHRyaWJ1dGUgYXR0ciA9IChYbWxBdHRyaWJ1dGUpV29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpwYWdlU2V0dXAvQHI6aWQiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHJlbElEID0gYXR0ci5WYWx1ZTsKLSAgICAgICAgICAgICAgICAvL0ZpcnN0IGRlbGV0ZSB0aGUgYXR0cmlidXRlIGZyb20gdGhlIFhNTAotICAgICAgICAgICAgICAgIGF0dHIuT3duZXJFbGVtZW50LkF0dHJpYnV0ZXMuUmVtb3ZlKGF0dHIpOwotICAgICAgICAgICAgICAgIGlmKFBhcnQuUmVsYXRpb25zaGlwRXhpc3RzKHJlbElEKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciByZWwgPSBQYXJ0LkdldFJlbGF0aW9uc2hpcChyZWxJRCk7Ci0gICAgICAgICAgICAgICAgICAgIFVyaSBwcmludGVyU2V0dGluZ3NVcmkgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIFBhcnQuRGVsZXRlUmVsYXRpb25zaGlwKHJlbC5JZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy9EZWxldGUgdGhlIHBhcnQgZnJvbSB0aGUgcGFja2FnZQotICAgICAgICAgICAgICAgICAgICBpZihfcGFja2FnZS5QYWNrYWdlLlBhcnRFeGlzdHMocHJpbnRlclNldHRpbmdzVXJpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX3BhY2thZ2UuUGFja2FnZS5EZWxldGVQYXJ0KHByaW50ZXJTZXR0aW5nc1VyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgICAgIG9iamVjdCB2ID0gY3NlLlZhbHVlOworICAgICAgICBvYmplY3QgZm9ybXVsYSA9IF9mb3JtdWxhcy5HZXRWYWx1ZShjc2UuUm93LCBjc2UuQ29sdW1uKTsKKyAgICAgICAgaWYgKGZvcm11bGEgaXMgaW50KSB7CisgICAgICAgICAgaW50IHNmSWQgPSAoaW50KWZvcm11bGE7CisgICAgICAgICAgdmFyIGYgPSBfc2hhcmVkRm9ybXVsYXNbc2ZJZF07CisgICAgICAgICAgaWYgKGYuQWRkcmVzcy5JbmRleE9mKCc6JykgPiAwKSB7CisgICAgICAgICAgICBpZiAoZi5TdGFydENvbCA9PSBjc2UuQ29sdW1uICYmIGYuU3RhcnRSb3cgPT0gY3NlLlJvdykgeworICAgICAgICAgICAgICBpZiAoZi5Jc0FycmF5KSB7CisgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiPGMgcj1cInswfVwiIHM9XCJ7MX1cIns1fT48ZiByZWY9XCJ7Mn1cIiB0PVwiYXJyYXlcIj57M308L2Y+ezR9PC9jPiIsCisgICAgICAgICAgICAgICAgICAgIGNzZS5DZWxsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgc3R5bGVJZCA8IDAgPyAwIDogc3R5bGVJZCwKKyAgICAgICAgICAgICAgICAgICAgZi5BZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBTZWN1cml0eUVsZW1lbnQuRXNjYXBlKGYuRm9ybXVsYSksCisgICAgICAgICAgICAgICAgICAgIEdldEZvcm11bGFWYWx1ZSh2KSwKKyAgICAgICAgICAgICAgICAgICAgR2V0Q2VsbFR5cGUodiwgdHJ1ZSkpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIjxjIHI9XCJ7MH1cIiBzPVwiezF9XCJ7Nn0+PGYgcmVmPVwiezJ9XCIgdD1cInNoYXJlZFwiICBzaT1cInszfVwiPns0fTwvZj57NX08L2M+IiwKKyAgICAgICAgICAgICAgICAgICAgY3NlLkNlbGxBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBzdHlsZUlkIDwgMCA/IDAgOiBzdHlsZUlkLAorICAgICAgICAgICAgICAgICAgICBmLkFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIHNmSWQsCisgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoZi5Gb3JtdWxhKSwKKyAgICAgICAgICAgICAgICAgICAgR2V0Rm9ybXVsYVZhbHVlKHYpLAorICAgICAgICAgICAgICAgICAgICBHZXRDZWxsVHlwZSh2LCB0cnVlKSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZi5Jc0FycmF5KSB7CisgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICI8YyByPVwiezB9XCIgcz1cInsxfVwiIC8+IiwKKyAgICAgICAgICAgICAgICAgIGNzZS5DZWxsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgIHN0eWxlSWQgPCAwID8gMCA6IHN0eWxlSWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KAorICAgICAgICAgICAgICAgICAgIjxjIHI9XCJ7MH1cIiBzPVwiezF9XCJ7NH0+PGYgdD1cInNoYXJlZFwiIHNpPVwiezJ9XCIgLz57M308L2M+IiwKKyAgICAgICAgICAgICAgICAgIGNzZS5DZWxsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgIHN0eWxlSWQgPCAwID8gMCA6IHN0eWxlSWQsCisgICAgICAgICAgICAgICAgICBzZklkLAorICAgICAgICAgICAgICAgICAgR2V0Rm9ybXVsYVZhbHVlKHYpLAorICAgICAgICAgICAgICAgICAgR2V0Q2VsbFR5cGUodiwgdHJ1ZSkpOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBTYXZlQ29tbWVudHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2NvbW1lbnRzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9jb21tZW50cy5Db3VudCA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9jb21tZW50cy5VcmkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgUGFydC5EZWxldGVSZWxhdGlvbnNoaXAoX2NvbW1lbnRzLlJlbElkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9wYWNrYWdlLlBhY2thZ2UuRGVsZXRlUGFydChfY29tbWVudHMuVXJpKTsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBSZW1vdmVMZWdhY3lEcmF3aW5nUmVsKFZtbERyYXdpbmdzQ29tbWVudHMuUmVsSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoX2NvbW1lbnRzLlVyaSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfY29tbWVudHMuVXJpPW5ldyBVcmkoc3RyaW5nLkZvcm1hdChAIi94bC9jb21tZW50c3swfS54bWwiLCBTaGVldElEKSwgVXJpS2luZC5SZWxhdGl2ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYoX2NvbW1lbnRzLlBhcnQ9PW51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jb21tZW50cy5QYXJ0ID0gX3BhY2thZ2UuUGFja2FnZS5DcmVhdGVQYXJ0KF9jb21tZW50cy5VcmksICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5jb21tZW50cyt4bWwiLCBfcGFja2FnZS5Db21wcmVzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVsID0gUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKFdvcmtzaGVldFVyaSwgX2NvbW1lbnRzLlVyaSksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcysiL2NvbW1lbnRzIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgX2NvbW1lbnRzLkNvbW1lbnRYbWwuU2F2ZShfY29tbWVudHMuUGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlKSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBjYW4gYWxzbyBoYXZlIGEgc2luZ2xlIGNlbGwgYXJyYXkgZm9ybXVsYQorICAgICAgICAgICAgaWYgKGYuSXNBcnJheSkgeworICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoCisgICAgICAgICAgICAgICAgICAiPGMgcj1cInswfVwiIHM9XCJ7MX1cIns1fT48ZiByZWY9XCJ7Mn1cIiB0PVwiYXJyYXlcIj57M308L2Y+ezR9PC9jPiIsCisgICAgICAgICAgICAgICAgICBjc2UuQ2VsbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICBzdHlsZUlkIDwgMCA/IDAgOiBzdHlsZUlkLAorICAgICAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgiezB9OnsxfSIsIGYuQWRkcmVzcywgZi5BZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoZi5Gb3JtdWxhKSwKKyAgICAgICAgICAgICAgICAgIEdldEZvcm11bGFWYWx1ZSh2KSwKKyAgICAgICAgICAgICAgICAgIEdldENlbGxUeXBlKHYsIHRydWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgiPGMgcj1cInswfVwiIHM9XCJ7MX1cIj4iLCBmLkFkZHJlc3MsIHN0eWxlSWQgPCAwID8gMCA6IHN0eWxlSWQpOworICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoCisgICAgICAgICAgICAgICAgICAiPGY+ezB9PC9mPnsxfTwvYz4iLAorICAgICAgICAgICAgICAgICAgU2VjdXJpdHlFbGVtZW50LkVzY2FwZShmLkZvcm11bGEpLAorICAgICAgICAgICAgICAgICAgR2V0Rm9ybXVsYVZhbHVlKHYpKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKF92bWxEcmF3aW5ncyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfdm1sRHJhd2luZ3MuQ291bnQgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfdm1sRHJhd2luZ3MuVXJpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhcnQuRGVsZXRlUmVsYXRpb25zaGlwKF92bWxEcmF3aW5ncy5SZWxJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfcGFja2FnZS5QYWNrYWdlLkRlbGV0ZVBhcnQoX3ZtbERyYXdpbmdzLlVyaSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF92bWxEcmF3aW5ncy5VcmkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX3ZtbERyYXdpbmdzLlVyaSA9IFhtbEhlbHBlci5HZXROZXdVcmkoX3BhY2thZ2UuUGFja2FnZSwgQCIveGwvZHJhd2luZ3Mvdm1sRHJhd2luZ3swfS52bWwiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoX3ZtbERyYXdpbmdzLlBhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX3ZtbERyYXdpbmdzLlBhcnQgPSBfcGFja2FnZS5QYWNrYWdlLkNyZWF0ZVBhcnQoX3ZtbERyYXdpbmdzLlVyaSwgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC52bWxEcmF3aW5nIiwgX3BhY2thZ2UuQ29tcHJlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbCA9IFBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShXb3Jrc2hlZXRVcmksIF92bWxEcmF3aW5ncy5VcmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3ZtbERyYXdpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoImQ6bGVnYWN5RHJhd2luZy9AcjppZCIsIHJlbC5JZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdm1sRHJhd2luZ3MuUmVsSWQgPSByZWwuSWQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgX3ZtbERyYXdpbmdzLlZtbERyYXdpbmdYbWwuU2F2ZShfdm1sRHJhd2luZ3MuUGFydC5HZXRTdHJlYW0oKSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmb3JtdWxhICE9IG51bGwgJiYgZm9ybXVsYS5Ub1N0cmluZygpICE9ICIiKSB7CisgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KAorICAgICAgICAgICAgICAiPGMgcj1cInswfVwiIHM9XCJ7MX1cInsyfT4iLAorICAgICAgICAgICAgICBjc2UuQ2VsbEFkZHJlc3MsCisgICAgICAgICAgICAgIHN0eWxlSWQgPCAwID8gMCA6IHN0eWxlSWQsCisgICAgICAgICAgICAgIEdldENlbGxUeXBlKHYsIHRydWUpKTsKKyAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoCisgICAgICAgICAgICAgICI8Zj57MH08L2Y+ezF9PC9jPiIsCisgICAgICAgICAgICAgIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoZm9ybXVsYS5Ub1N0cmluZygpKSwKKyAgICAgICAgICAgICAgR2V0Rm9ybXVsYVZhbHVlKHYpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAodiA9PSBudWxsICYmIHN0eWxlSWQgPiAwKSB7CisgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoCisgICAgICAgICAgICAgICAgIjxjIHI9XCJ7MH1cIiBzPVwiezF9XCIgLz4iLAorICAgICAgICAgICAgICAgIGNzZS5DZWxsQWRkcmVzcywKKyAgICAgICAgICAgICAgICBzdHlsZUlkIDwgMCA/IDAgOiBzdHlsZUlkKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHYgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCh2LkdldFR5cGUoKS5Jc1ByaW1pdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgdiBpcyBkb3VibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHYgaXMgZGVjaW1hbAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgdiBpcyBEYXRlVGltZQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgdiBpcyBUaW1lU3BhbikpIHsKKyAgICAgICAgICAgICAgLy9zdHJpbmcgc3YgPSBHZXRWYWx1ZUZvclhtbCh2KTsKKyAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KAorICAgICAgICAgICAgICAgICAgIjxjIHI9XCJ7MH1cIiBzPVwiezF9XCIgezJ9PiIsCisgICAgICAgICAgICAgICAgICBjc2UuQ2VsbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICBzdHlsZUlkIDwgMCA/IDAgOiBzdHlsZUlkLAorICAgICAgICAgICAgICAgICAgR2V0Q2VsbFR5cGUodikpOworICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoInswfTwvYz4iLCBHZXRGb3JtdWxhVmFsdWUodikpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaW50IGl4OworICAgICAgICAgICAgICBpZiAoIXNzLkNvbnRhaW5zS2V5KHYuVG9TdHJpbmcoKSkpIHsKKyAgICAgICAgICAgICAgICBpeCA9IHNzLkNvdW50OworICAgICAgICAgICAgICAgIHNzLkFkZCgKKyAgICAgICAgICAgICAgICAgICAgdi5Ub1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBuZXcoKSB7CisgICAgICAgICAgICAgICAgICAgICAgaXNSaWNoVGV4dCA9IF9mbGFncy5HZXRGbGFnVmFsdWUoY3NlLlJvdywgY3NlLkNvbHVtbiwgQ2VsbEZsYWdzLlJpY2hUZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBpeCwKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXggPSBzc1t2LlRvU3RyaW5nKCldLnBvczsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoCisgICAgICAgICAgICAgICAgICAiPGMgcj1cInswfVwiIHM9XCJ7MX1cIiB0PVwic1wiPiIsCisgICAgICAgICAgICAgICAgICBjc2UuQ2VsbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICBzdHlsZUlkIDwgMCA/IDAgOiBzdHlsZUlkKTsKKyAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCI8dj57MH08L3Y+PC9jPiIsIGl4KTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2F2ZSBhbGwgdGFibGUgZGF0YQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHZvaWQgU2F2ZVRhYmxlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0YmwgaW4gVGFibGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0YmwuU2hvd0hlYWRlciB8fCB0YmwuU2hvd1RvdGFsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbE51bSA9IHRibC5BZGRyZXNzLl9mcm9tQ29sOwotICAgICAgICAgICAgICAgICAgICB2YXIgY29sVmFsID0gbmV3IEhhc2hTZXQ8c3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY29sIGluIHRibC5Db2x1bW5zKQotICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbj1jb2wuTmFtZS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRibC5TaG93SGVhZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSB0YmwuV29ya1NoZWV0LkdldFZhbHVlPHN0cmluZz4odGJsLkFkZHJlc3MuX2Zyb21Sb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRibC5BZGRyZXNzLl9mcm9tQ29sICsgY29sLlBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkobikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gY29sLk5hbWUuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sLk5hbWUgPSBuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gY29sLk5hbWUuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihjb2xWYWwuQ29udGFpbnMobikpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEludmFsaWREYXRhRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIlRhYmxlIHswfSBDb2x1bW4gezF9IGRvZXMgbm90IGhhdmUgYSB1bmlxdWUgbmFtZS4iLCB0YmwuTmFtZSwgY29sLk5hbWUpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2xWYWwuQWRkKG4pOwotICAgICAgICAgICAgICAgICAgICAgICAgY29sLk5hbWUgPSBDb252ZXJ0VXRpbC5FeGNlbEVuY29kZVN0cmluZyhjb2wuTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGJsLlNob3dIZWFkZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZSh0YmwuQWRkcmVzcy5fZnJvbVJvdywgY29sTnVtLCBjb2wuTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGJsLlNob3dUb3RhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRUYWJsZVRvdGFsRnVuY3Rpb24odGJsLCBjb2wsIGNvbE51bSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGNvbC5DYWxjdWxhdGVkQ29sdW1uRm9ybXVsYSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyb21Sb3cgPSB0YmwuU2hvd0hlYWRlciA/IHRibC5BZGRyZXNzLl9mcm9tUm93ICsgMSA6IHRibC5BZGRyZXNzLl9mcm9tUm93OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b1JvdyA9IHRibC5TaG93VG90YWwgPyB0YmwuQWRkcmVzcy5fdG9Sb3cgLSAxIDogdGJsLkFkZHJlc3MuX3RvUm93OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHJvdyA9IGZyb21Sb3c7IHJvdyA8PSB0b1Jvdzsgcm93KyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0NlbGwocm93LCBjb2xOdW0pLkZvcm11bGEgPSBjb2wuQ2FsY3VsYXRlZENvbHVtbkZvcm11bGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldEZvcm11bGEocm93LCBjb2xOdW0sIGNvbC5DYWxjdWxhdGVkQ29sdW1uRm9ybXVsYSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbE51bSsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAodGJsLlBhcnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRibC5UYWJsZVVyaSA9IEdldE5ld1VyaShfcGFja2FnZS5QYWNrYWdlLCBAIi94bC90YWJsZXMvdGFibGV7MH0ueG1sIiwgdGJsLklkKTsKLSAgICAgICAgICAgICAgICAgICAgdGJsLlBhcnQgPSBfcGFja2FnZS5QYWNrYWdlLkNyZWF0ZVBhcnQodGJsLlRhYmxlVXJpLCAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwudGFibGUreG1sIiwgV29ya2Jvb2suX3BhY2thZ2UuQ29tcHJlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gdGJsLlBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRibC5UYWJsZVhtbC5TYXZlKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhciByZWwgPSBQYXJ0LkNyZWF0ZVJlbGF0aW9uc2hpcChVcmlIZWxwZXIuR2V0UmVsYXRpdmVVcmkoV29ya3NoZWV0VXJpLCB0YmwuVGFibGVVcmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3RhYmxlIik7Ci0gICAgICAgICAgICAgICAgICAgIHRibC5SZWxhdGlvbnNoaXBJRCA9IHJlbC5JZDsKKyAgICAgICAgLy8vL1VwZGF0ZSBoeXBlcmxpbmtzLgorICAgICAgICAvL2lmIChjZWxsLkh5cGVybGluayAhPSBudWxsKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgX2h5cGVyTGlua0NlbGxzLkFkZChjZWxsLkNlbGxJRCk7CisgICAgICAgIC8vfQorICAgICAgfSBlbHNlIC8vRXhjZWxSb3cKKyAgICAgIHsKKyAgICAgICAgLy9pbnQgbmV3Um93PSgoRXhjZWxSb3cpY3NlLlZhbHVlKS5Sb3c7CisgICAgICAgIFdyaXRlUm93KGNhY2hlLCBjZWxsWGZzLCByb3csIGNzZS5Sb3cpOworICAgICAgICByb3cgPSBjc2UuUm93OworICAgICAgfQorICAgICAgaWYgKGNhY2hlLkxlbmd0aCA+IDB4NjAwMDAwKSB7CisgICAgICAgIHN3LldyaXRlKGNhY2hlLlRvU3RyaW5nKCkpOworICAgICAgICBjYWNoZSA9IG5ldygpOworICAgICAgfQorICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKCJkOnRhYmxlUGFydHMiKTsKLSAgICAgICAgICAgICAgICAgICAgWG1sTm9kZSB0YmxzID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOnRhYmxlUGFydHMiLE5hbWVTcGFjZU1hbmFnZXIpOworICAgIGlmIChyb3cgIT0gLTEpIHsKKyAgICAgIGNhY2hlLkFwcGVuZCgiPC9yb3c+Iik7CisgICAgfQorICAgIGNhY2hlLkFwcGVuZCgiPC9zaGVldERhdGE+Iik7CisgICAgc3cuV3JpdGUoY2FjaGUuVG9TdHJpbmcoKSk7CisgICAgc3cuRmx1c2goKTsKKyAgfQorCisgIHByaXZhdGUgb2JqZWN0IEdldEZvcm11bGFWYWx1ZShvYmplY3QgdikgeworICAgIC8vaWYgKF9wYWNrYWdlLldvcmtib29rLl9pc0NhbGN1bGF0ZWQpCisgICAgLy97CisgICAgaWYgKHYgIT0gbnVsbCAmJiB2LlRvU3RyaW5nKCkgIT0gIiIpIHsKKyAgICAgIHJldHVybiAiPHY+IiArIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoR2V0VmFsdWVGb3JYbWwodikpICsgIjwvdj4iOyAvL0ZpeGVzIGlzc3VlIDE1MDcxCisgICAgfQorICAgIHJldHVybiAiIjsKKyAgfQogCi0gICAgICAgICAgICAgICAgICAgIHZhciB0YmxOb2RlID0gdGJscy5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoInRhYmxlUGFydCIsRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotICAgICAgICAgICAgICAgICAgICB0YmxzLkFwcGVuZENoaWxkKHRibE5vZGUpOwotICAgICAgICAgICAgICAgICAgICB0YmxOb2RlLlNldEF0dHJpYnV0ZSgiaWQiLEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzLCByZWwuSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gdGJsLlBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHRibC5UYWJsZVhtbC5TYXZlKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHByaXZhdGUgc3RyaW5nIEdldENlbGxUeXBlKG9iamVjdCB2LCBib29sIGFsbG93U3RyID0gZmFsc2UpIHsKKyAgICBpZiAodiBpcyBib29sKSB7CisgICAgICByZXR1cm4gIiB0PVwiYlwiIjsKKyAgICB9CisgICAgaWYgKCh2IGlzIGRvdWJsZSAmJiBkb3VibGUuSXNJbmZpbml0eSgoZG91YmxlKXYpKSB8fCB2IGlzIEV4Y2VsRXJyb3JWYWx1ZSkgeworICAgICAgcmV0dXJuICIgdD1cImVcIiI7CisgICAgfQorICAgIGlmIChhbGxvd1N0cgorICAgICAgICAmJiB2ICE9IG51bGwKKyAgICAgICAgJiYgISh2LkdldFR5cGUoKS5Jc1ByaW1pdGl2ZQorICAgICAgICAgICAgICAgIHx8IHYgaXMgZG91YmxlCisgICAgICAgICAgICAgICAgfHwgdiBpcyBkZWNpbWFsCisgICAgICAgICAgICAgICAgfHwgdiBpcyBEYXRlVGltZQorICAgICAgICAgICAgICAgIHx8IHYgaXMgVGltZVNwYW4pKSB7CisgICAgICByZXR1cm4gIiB0PVwic3RyXCIiOworICAgIH0KKyAgICByZXR1cm4gIiI7CisgIH0KIAotICAgICAgICBpbnRlcm5hbCB2b2lkIFNldFRhYmxlVG90YWxGdW5jdGlvbihFeGNlbFRhYmxlIHRibCwgRXhjZWxUYWJsZUNvbHVtbiBjb2wsIGludCBjb2xOdW09LTEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0YmwuU2hvd1RvdGFsID09IGZhbHNlKSByZXR1cm47Ci0gICAgICAgICAgICBpZiAoY29sTnVtID09IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGJsLkNvbHVtbnMuQ291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YmwuQ29sdW1uc1tpXS5OYW1lID09IGNvbC5OYW1lKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb2xOdW0gPSB0YmwuQWRkcmVzcy5fZnJvbUNvbCArIGk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29sLlRvdGFsc1Jvd0Z1bmN0aW9uID09IFJvd0Z1bmN0aW9ucy5DdXN0b20pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgY29sLlRvdGFsc1Jvd0Zvcm11bGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY29sLlRvdGFsc1Jvd0Z1bmN0aW9uICE9IFJvd0Z1bmN0aW9ucy5Ob25lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoY29sLlRvdGFsc1Jvd0Z1bmN0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuQXZlcmFnZToKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldEZvcm11bGEodGJsLkFkZHJlc3MuX3RvUm93LCBjb2xOdW0sIEdldFRvdGFsRnVuY3Rpb24oY29sLCAiMTAxIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUm93RnVuY3Rpb25zLkNvdW50OgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDIiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuQ291bnROdW1zOgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDMiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuTWF4OgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDQiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuTWluOgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDUiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuU3RkRGV2OgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDciKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuVmFyOgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMTAiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBSb3dGdW5jdGlvbnMuU3VtOgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0Rm9ybXVsYSh0YmwuQWRkcmVzcy5fdG9Sb3csIGNvbE51bSwgR2V0VG90YWxGdW5jdGlvbihjb2wsICIxMDkiKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJVbmtub3duIFJvd0Z1bmN0aW9uIGVudW0iKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF92YWx1ZXMuU2V0VmFsdWUodGJsLkFkZHJlc3MuX3RvUm93LCBjb2xOdW0sIGNvbC5Ub3RhbHNSb3dMYWJlbCk7CisgIHByaXZhdGUgc3RyaW5nIEdldFZhbHVlRm9yWG1sKG9iamVjdCB2KSB7CisgICAgc3RyaW5nIHM7CisgICAgdHJ5IHsKKyAgICAgIGlmICh2IGlzIERhdGVUaW1lKSB7CisgICAgICAgIGRvdWJsZSBzZHYgPSAoKERhdGVUaW1lKXYpLlRvT0FEYXRlKCk7CiAKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKFdvcmtib29rLkRhdGUxOTA0KSB7CisgICAgICAgICAgc2R2IC09IEV4Y2VsV29ya2Jvb2suX2RhdGUxOTA0T2Zmc2V0OwogICAgICAgICB9CiAKLSAgICAgICAgaW50ZXJuYWwgdm9pZCBTZXRGb3JtdWxhKGludCByb3csIGludCBjb2wsIG9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2Zvcm11bGFzLlNldFZhbHVlKHJvdywgY29sLCB2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoIV92YWx1ZXMuRXhpc3RzKHJvdywgY29sKSkgX3ZhbHVlcy5TZXRWYWx1ZShyb3csIGNvbCwgbnVsbCk7CisgICAgICAgIHMgPSBzZHYuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICB9IGVsc2UgaWYgKHYgaXMgVGltZVNwYW4pIHsKKyAgICAgICAgcyA9IG5ldyBEYXRlVGltZSgoKFRpbWVTcGFuKXYpLlRpY2tzKS5Ub09BRGF0ZSgpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICA7CisgICAgICB9IGVsc2UgaWYgKHYuR2V0VHlwZSgpLklzUHJpbWl0aXZlIHx8IHYgaXMgZG91YmxlIHx8IHYgaXMgZGVjaW1hbCkgeworICAgICAgICBpZiAodiBpcyBkb3VibGUgJiYgZG91YmxlLklzTmFOKChkb3VibGUpdikpIHsKKyAgICAgICAgICBzID0gIiI7CisgICAgICAgIH0gZWxzZSBpZiAodiBpcyBkb3VibGUgJiYgZG91YmxlLklzSW5maW5pdHkoKGRvdWJsZSl2KSkgeworICAgICAgICAgIHMgPSAiI05VTSEiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHMgPSBDb252ZXJ0CisgICAgICAgICAgICAgIC5Ub0RvdWJsZSh2LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKQorICAgICAgICAgICAgICAuVG9TdHJpbmcoIlIxNSIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwogICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHZvaWQgU2V0U3R5bGUoaW50IHJvdywgaW50IGNvbCwgaW50IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc3R5bGVzLlNldFZhbHVlKHJvdywgY29sLCB2YWx1ZSk7Ci0gICAgICAgICAgICBpZighX3ZhbHVlcy5FeGlzdHMocm93LGNvbCkpIF92YWx1ZXMuU2V0VmFsdWUocm93LCBjb2wsIG51bGwpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcyA9IHYuVG9TdHJpbmcoKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIHsKKyAgICAgIHMgPSAiMCI7CisgICAgfQorICAgIHJldHVybiBzOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIFdyaXRlUm93KAorICAgICAgU3RyaW5nQnVpbGRlciBjYWNoZSwKKyAgICAgIEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsWGZzPiBjZWxsWGZzLAorICAgICAgaW50IHByZXZSb3csCisgICAgICBpbnQgcm93KSB7CisgICAgaWYgKHByZXZSb3cgIT0gLTEpIHsKKyAgICAgIGNhY2hlLkFwcGVuZCgiPC9yb3c+Iik7CisgICAgfQorICAgIC8vdWxvbmcgcm93SUQgPSBFeGNlbFJvdy5HZXRSb3dJRChTaGVldElELCByb3cpOworICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgiPHJvdyByPVwiezB9XCIgIiwgcm93KTsKKyAgICBSb3dJbnRlcm5hbCBjdXJyUm93ID0gX3ZhbHVlcy5HZXRWYWx1ZShyb3csIDApIGFzIFJvd0ludGVybmFsOworICAgIGlmIChjdXJyUm93ICE9IG51bGwpIHsKKyAgICAgIGlmIChjdXJyUm93LkhpZGRlbikgeworICAgICAgICBjYWNoZS5BcHBlbmQoImh0PVwiMFwiIGhpZGRlbj1cIjFcIiAiKTsKKyAgICAgIH0gZWxzZSBpZiAoY3VyclJvdy5IZWlnaHQgIT0gRGVmYXVsdFJvd0hlaWdodCAmJiBjdXJyUm93LkhlaWdodCA+PSAwKSB7CisgICAgICAgIGNhY2hlLkFwcGVuZEZvcm1hdChDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCAiaHQ9XCJ7MH1cIiAiLCBjdXJyUm93LkhlaWdodCk7CisgICAgICAgIGlmIChjdXJyUm93LkN1c3RvbUhlaWdodCkgeworICAgICAgICAgIGNhY2hlLkFwcGVuZCgiY3VzdG9tSGVpZ2h0PVwiMVwiICIpOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIHZvaWQgU2F2ZVBpdm90VGFibGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yZWFjaCAodmFyIHB0IGluIFBpdm90VGFibGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwdC5EYXRhRmllbGRzLkNvdW50ID4gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgcGFyZW50Tm9kZTsKLSAgICAgICAgICAgICAgICAgICAgaWYocHQuRGF0YU9uUm93cz09dHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9ICBwdC5QaXZvdFRhYmxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpyb3dGaWVsZHMiLCBwdC5OYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdC5DcmVhdGVOb2RlKCJkOnJvd0ZpZWxkcyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwdC5QaXZvdFRhYmxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpyb3dGaWVsZHMiLCBwdC5OYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9ICBwdC5QaXZvdFRhYmxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpjb2xGaWVsZHMiLCBwdC5OYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdC5DcmVhdGVOb2RlKCJkOmNvbEZpZWxkcyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSBwdC5QaXZvdFRhYmxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpjb2xGaWVsZHMiLCBwdC5OYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CisgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpmaWVsZFtAIHg9IFwiLTJcIl0iLCBwdC5OYW1lU3BhY2VNYW5hZ2VyKSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGZpZWxkTm9kZSA9IHB0LlBpdm90VGFibGVYbWwuQ3JlYXRlRWxlbWVudCgiZmllbGQiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE5vZGUuU2V0QXR0cmlidXRlKCJ4IiwgIi0yIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlLkFwcGVuZENoaWxkKGZpZWxkTm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFyIHdzID0gV29ya2Jvb2suV29ya3NoZWV0c1twdC5DYWNoZURlZmluaXRpb24uU291cmNlUmFuZ2UuV29ya1NoZWV0XTsKLSAgICAgICAgICAgICAgICB2YXIgdCA9IHdzLlRhYmxlcy5HZXRGcm9tUmFuZ2UocHQuQ2FjaGVEZWZpbml0aW9uLlNvdXJjZVJhbmdlKTsKLSAgICAgICAgICAgICAgICB2YXIgZmllbGRzID0KLSAgICAgICAgICAgICAgICAgICAgcHQuQ2FjaGVEZWZpbml0aW9uLkNhY2hlRGVmaW5pdGlvblhtbC5TZWxlY3ROb2RlcygKLSAgICAgICAgICAgICAgICAgICAgICAgICJkOnBpdm90Q2FjaGVEZWZpbml0aW9uL2Q6Y2FjaGVGaWVsZHMvZDpjYWNoZUZpZWxkIiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgaW50IGl4ID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoZmllbGRzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgZmxkcyA9IG5ldyBIYXNoU2V0PHN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBub2RlIGluIGZpZWxkcykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl4ID49IHB0LkNhY2hlRGVmaW5pdGlvbi5Tb3VyY2VSYW5nZS5Db2x1bW5zKSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbGROYW1lID0gbm9kZS5HZXRBdHRyaWJ1dGUoIm5hbWUiKTsgICAgICAgICAgICAgICAgICAgICAgICAvL0ZpeGVzIGlzc3VlIDE1Mjk1IGR1cCBuYW1lIGVycm9yCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZmxkTmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxkTmFtZSA9ICh0ID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwdC5DYWNoZURlZmluaXRpb24uU291cmNlUmFuZ2UuT2Zmc2V0KDAsIGl4KyssIDEsIDEpLlZhbHVlLlRvU3RyaW5nKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0LkNvbHVtbnNbaXgrK10uTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmxkcy5Db250YWlucyhmbGROYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxkTmFtZSA9IEdldE5ld05hbWUoZmxkcywgZmxkTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGRzLkFkZChmbGROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuU2V0QXR0cmlidXRlKCJuYW1lIiwgZmxkTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGRmIGluIHB0LkRhdGFGaWVsZHMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShkZi5OYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGYuRnVuY3Rpb24gPT0gRGF0YUZpZWxkRnVuY3Rpb25zLk5vbmUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gZGYuRmllbGQuTmFtZTsgLy9OYW1lIG11c3QgYmUgc2V0IG9yIEV4Y2VsIHdpbGwgY3Jhc2ggb24gcmVuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBkZi5GdW5jdGlvbi5Ub1N0cmluZygpICsgIiBvZiAiICsgZGYuRmllbGQuTmFtZTsgLy9OYW1lIG11c3QgYmUgc2V0IG9yIEV4Y2VsIHdpbGwgY3Jhc2ggb24gcmVuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01ha2Ugc3VyZSBuYW1lIGlzIHVuaXF1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdOYW1lID0gbmFtZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHB0LkRhdGFGaWVsZHMuRXhpc3RzRGZOYW1lKG5ld05hbWUsIGRmKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBuYW1lICsgKGkrKykuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmLk5hbWUgPSBuZXdOYW1lOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB0LlBpdm90VGFibGVYbWwuU2F2ZShwdC5QYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUpKTsKLSAgICAgICAgICAgICAgICBwdC5DYWNoZURlZmluaXRpb24uQ2FjaGVEZWZpbml0aW9uWG1sLlNhdmUocHQuQ2FjaGVEZWZpbml0aW9uLlBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSkpOwotICAgICAgICAgICAgfQorICAgICAgaWYgKGN1cnJSb3cuT3V0bGluZUxldmVsID4gMCkgeworICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoIm91dGxpbmVMZXZlbCA9XCJ7MH1cIiAiLCBjdXJyUm93Lk91dGxpbmVMZXZlbCk7CisgICAgICAgIGlmIChjdXJyUm93LkNvbGxhcHNlZCkgeworICAgICAgICAgIGlmIChjdXJyUm93LkhpZGRlbikgeworICAgICAgICAgICAgY2FjaGUuQXBwZW5kKCIgY29sbGFwc2VkPVwiMVwiICIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYWNoZS5BcHBlbmQoIiBjb2xsYXBzZWQ9XCIxXCIgaGlkZGVuPVwiMVwiICIpOyAvL0Fsd2F5cyBoaWRkZW4KKyAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChjdXJyUm93LlBob25ldGljKSB7CisgICAgICAgIGNhY2hlLkFwcGVuZCgicGg9XCIxXCIgIik7CisgICAgICB9CisgICAgfQorICAgIHZhciBzID0gX3N0eWxlcy5HZXRWYWx1ZShyb3csIDApOworICAgIGlmIChzID4gMCkgeworICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCJzPVwiezB9XCIgY3VzdG9tRm9ybWF0PVwiMVwiIiwgY2VsbFhmc1tzXS5uZXdJRCk7CisgICAgfQorICAgIGNhY2hlLkFwcGVuZCgiPiIpOworICB9CiAKLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0TmV3TmFtZShIYXNoU2V0PHN0cmluZz4gZmxkcywgc3RyaW5nIGZsZE5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpeCA9IDI7Ci0gICAgICAgICAgICB3aGlsZSAoZmxkcy5Db250YWlucyhmbGROYW1lICsgaXguVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGl4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmxkTmFtZSArIGl4LlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICBwcml2YXRlIHZvaWQgV3JpdGVSb3coCisgICAgICBTdHJlYW1Xcml0ZXIgc3csCisgICAgICBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbFhmcz4gY2VsbFhmcywKKyAgICAgIGludCBwcmV2Um93LAorICAgICAgaW50IHJvdykgeworICAgIGlmIChwcmV2Um93ICE9IC0xKSB7CisgICAgICBzdy5Xcml0ZSgiPC9yb3c+Iik7CisgICAgfQorICAgIC8vdWxvbmcgcm93SUQgPSBFeGNlbFJvdy5HZXRSb3dJRChTaGVldElELCByb3cpOworICAgIHN3LldyaXRlKCI8cm93IHI9XCJ7MH1cIiAiLCByb3cpOworICAgIFJvd0ludGVybmFsIGN1cnJSb3cgPSBfdmFsdWVzLkdldFZhbHVlKHJvdywgMCkgYXMgUm93SW50ZXJuYWw7CisgICAgaWYgKGN1cnJSb3cgIT0gbnVsbCkgeworICAgICAgaWYgKGN1cnJSb3cuSGlkZGVuKSB7CisgICAgICAgIHN3LldyaXRlKCJodD1cIjBcIiBoaWRkZW49XCIxXCIgIik7CisgICAgICB9IGVsc2UgaWYgKGN1cnJSb3cuSGVpZ2h0ICE9IERlZmF1bHRSb3dIZWlnaHQpIHsKKyAgICAgICAgc3cuV3JpdGUoc3RyaW5nLkZvcm1hdChDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCAiaHQ9XCJ7MH1cIiAiLCBjdXJyUm93LkhlaWdodCkpOworICAgICAgICBpZiAoY3VyclJvdy5DdXN0b21IZWlnaHQpIHsKKyAgICAgICAgICBzdy5Xcml0ZSgiY3VzdG9tSGVpZ2h0PVwiMVwiICIpOwogICAgICAgICB9CisgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEdldFRvdGFsRnVuY3Rpb24oRXhjZWxUYWJsZUNvbHVtbiBjb2wsc3RyaW5nIEZ1bmN0aW9uTnVtKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc3RyaW5nLkZvcm1hdCgiU1VCVE9UQUwoezB9LHsxfVt7Mn1dKSIsIEZ1bmN0aW9uTnVtLCBjb2wuX3RibC5OYW1lLCBjb2wuTmFtZSk7CisgICAgICBpZiAoY3VyclJvdy5PdXRsaW5lTGV2ZWwgPiAwKSB7CisgICAgICAgIHN3LldyaXRlKCJvdXRsaW5lTGV2ZWwgPVwiezB9XCIgIiwgY3VyclJvdy5PdXRsaW5lTGV2ZWwpOworICAgICAgICBpZiAoY3VyclJvdy5Db2xsYXBzZWQpIHsKKyAgICAgICAgICBpZiAoY3VyclJvdy5IaWRkZW4pIHsKKyAgICAgICAgICAgIHN3LldyaXRlKCIgY29sbGFwc2VkPVwiMVwiICIpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdy5Xcml0ZSgiIGNvbGxhcHNlZD1cIjFcIiBoaWRkZW49XCIxXCIgIik7IC8vQWx3YXlzIGhpZGRlbgorICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGN1cnJSb3cuUGhvbmV0aWMpIHsKKyAgICAgICAgc3cuV3JpdGUoInBoPVwiMVwiICIpOworICAgICAgfQorICAgIH0KKyAgICB2YXIgcyA9IF9zdHlsZXMuR2V0VmFsdWUocm93LCAwKTsKKyAgICBpZiAocyA+IDApIHsKKyAgICAgIHN3LldyaXRlKCJzPVwiezB9XCIgY3VzdG9tRm9ybWF0PVwiMVwiIiwgY2VsbFhmc1tzXS5uZXdJRCk7CisgICAgfQorICAgIHN3LldyaXRlKCI+Iik7CisgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgQ2xlYW51cE1lcmdlZENlbGxzKE1lcmdlQ2VsbHNDb2xsZWN0aW9uIF9tZXJnZWRDZWxscykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGk9MDsKLSAgICAgICAgICAgIHdoaWxlIChpIDwgX21lcmdlZENlbGxzLkxpc3QuQ291bnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9tZXJnZWRDZWxsc1tpXSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX21lcmdlZENlbGxzLkxpc3QuUmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFVwZGF0ZSB4bWwgd2l0aCBoeXBlcmxpbmtzCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ic3ciPlRoZSBzdHJlYW08L3BhcmFtPgorICBwcml2YXRlIHZvaWQgVXBkYXRlSHlwZXJMaW5rcyhTdHJlYW1Xcml0ZXIgc3cpIHsKKyAgICBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPiBoeXBzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7CisgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxVcmk+KF9oeXBlckxpbmtzKTsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICAvL2ZvcmVhY2ggKHVsb25nIGNlbGwgaW4gX2h5cGVyTGlua3MpCisgICAgd2hpbGUgKGNzZS5OZXh0KCkpIHsKKyAgICAgIGlmIChmaXJzdCkgeworICAgICAgICBzdy5Xcml0ZSgiPGh5cGVybGlua3M+Iik7CisgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICB9CisgICAgICAvL2ludCByb3csIGNvbDsKKyAgICAgIHZhciB1cmkgPSBfaHlwZXJMaW5rcy5HZXRWYWx1ZShjc2UuUm93LCBjc2UuQ29sdW1uKTsKKyAgICAgIC8vRXhjZWxDZWxsIGNlbGwgPSBfY2VsbHNbY2VsbElkXSBhcyBFeGNlbENlbGw7CisgICAgICBpZiAodXJpIGlzIEV4Y2VsSHlwZXJMaW5rCisgICAgICAgICAgJiYgIXN0cmluZy5Jc051bGxPckVtcHR5KCh1cmkgYXMgRXhjZWxIeXBlckxpbmspLlJlZmVyZW5jZUFkZHJlc3MpKSB7CisgICAgICAgIEV4Y2VsSHlwZXJMaW5rIGhsID0gdXJpIGFzIEV4Y2VsSHlwZXJMaW5rOworICAgICAgICBzdy5Xcml0ZSgKKyAgICAgICAgICAgICI8aHlwZXJsaW5rIHJlZj1cInswfVwiIGxvY2F0aW9uPVwiezF9XCIgezJ9ezN9Lz4iLAorICAgICAgICAgICAgQ2VsbHNbY3NlLlJvdywgY3NlLkNvbHVtbiwgY3NlLlJvdyArIGhsLlJvd1NwYW5uLCBjc2UuQ29sdW1uICsgaGwuQ29sU3Bhbm5dLkFkZHJlc3MsCisgICAgICAgICAgICBFeGNlbENlbGxCYXNlLkdldEZ1bGxBZGRyZXNzKAorICAgICAgICAgICAgICAgIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoTmFtZSksCisgICAgICAgICAgICAgICAgU2VjdXJpdHlFbGVtZW50LkVzY2FwZShobC5SZWZlcmVuY2VBZGRyZXNzKSksCisgICAgICAgICAgICBzdHJpbmcuSXNOdWxsT3JFbXB0eShobC5EaXNwbGF5KQorICAgICAgICAgICAgICAgID8gIiIKKyAgICAgICAgICAgICAgICA6ICJkaXNwbGF5PVwiIiArIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoaGwuRGlzcGxheSkgKyAiXCIgIiwKKyAgICAgICAgICAgIHN0cmluZy5Jc051bGxPckVtcHR5KGhsLlRvb2xUaXApCisgICAgICAgICAgICAgICAgPyAiIgorICAgICAgICAgICAgICAgIDogInRvb2x0aXA9XCIiICsgU2VjdXJpdHlFbGVtZW50LkVzY2FwZShobC5Ub29sVGlwKSArICJcIiAiKTsKKyAgICAgIH0gZWxzZSBpZiAodXJpICE9IG51bGwpIHsKKyAgICAgICAgc3RyaW5nIGlkOworICAgICAgICBVcmkgaHlwOworICAgICAgICBpZiAodXJpIGlzIEV4Y2VsSHlwZXJMaW5rKSB7CisgICAgICAgICAgaHlwID0gKChFeGNlbEh5cGVyTGluayl1cmkpLk9yaWdpbmFsVXJpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGh5cCA9IHVyaTsKICAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgVXBkYXRlQ29sQnJlYWtzKFN0cmVhbVdyaXRlciBzdykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBicmVha3MgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihfdmFsdWVzLCAwLCAwLCAwLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7Ci0gICAgICAgICAgICAvL2ZvcmVhY2ggKEV4Y2VsQ29sdW1uIGNvbCBpbiBfY29sdW1ucykKLSAgICAgICAgICAgIHdoaWxlKGNzZS5OZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGNvbD1jc2UuVmFsdWUgYXMgRXhjZWxDb2x1bW47Ci0gICAgICAgICAgICAgICAgaWYgKGNvbCAhPSBudWxsICYmIGNvbC5QYWdlQnJlYWspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVha3MuQXBwZW5kRm9ybWF0KCI8YnJrIGlkPVwiezB9XCIgbWF4PVwiMTYzODNcIiBtYW49XCIxXCIgLz4iLCBjc2UuQ29sdW1uKTsKLSAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3LldyaXRlKHN0cmluZy5Gb3JtYXQoIjxjb2xCcmVha3MgY291bnQ9XCJ7MH1cIiBtYW51YWxCcmVha0NvdW50PVwiezB9XCI+ezF9PC9jb2xCcmVha3M+IiwgY291bnQsIGJyZWFrcy5Ub1N0cmluZygpKSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChoeXBzLkNvbnRhaW5zS2V5KGh5cC5PcmlnaW5hbFN0cmluZykpIHsKKyAgICAgICAgICBpZCA9IGh5cHNbaHlwLk9yaWdpbmFsU3RyaW5nXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YXIgcmVsYXRpb25zaGlwID0gUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICAgIGh5cCwKKyAgICAgICAgICAgICAgVGFyZ2V0TW9kZS5FeHRlcm5hbCwKKyAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFIeXBlcmxpbmspOworICAgICAgICAgIGlmICh1cmkgaXMgRXhjZWxIeXBlckxpbmspIHsKKyAgICAgICAgICAgIEV4Y2VsSHlwZXJMaW5rIGhsID0gdXJpIGFzIEV4Y2VsSHlwZXJMaW5rOworICAgICAgICAgICAgc3cuV3JpdGUoCisgICAgICAgICAgICAgICAgIjxoeXBlcmxpbmsgcmVmPVwiezB9XCIgezJ9ezN9cjppZD1cInsxfVwiIC8+IiwKKyAgICAgICAgICAgICAgICBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoY3NlLlJvdywgY3NlLkNvbHVtbiksCisgICAgICAgICAgICAgICAgcmVsYXRpb25zaGlwLklkLAorICAgICAgICAgICAgICAgIHN0cmluZy5Jc051bGxPckVtcHR5KGhsLkRpc3BsYXkpCisgICAgICAgICAgICAgICAgICAgID8gIiIKKyAgICAgICAgICAgICAgICAgICAgOiAiZGlzcGxheT1cIiIgKyBTZWN1cml0eUVsZW1lbnQuRXNjYXBlKGhsLkRpc3BsYXkpICsgIlwiICIsCisgICAgICAgICAgICAgICAgc3RyaW5nLklzTnVsbE9yRW1wdHkoaGwuVG9vbFRpcCkKKyAgICAgICAgICAgICAgICAgICAgPyAiIgorICAgICAgICAgICAgICAgICAgICA6ICJ0b29sdGlwPVwiIiArIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoaGwuVG9vbFRpcCkgKyAiXCIgIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3LldyaXRlKAorICAgICAgICAgICAgICAgICI8aHlwZXJsaW5rIHJlZj1cInswfVwiIHI6aWQ9XCJ7MX1cIiAvPiIsCisgICAgICAgICAgICAgICAgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKGNzZS5Sb3csIGNzZS5Db2x1bW4pLAorICAgICAgICAgICAgICAgIHJlbGF0aW9uc2hpcC5JZCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlkID0gcmVsYXRpb25zaGlwLklkOwogICAgICAgICB9CisgICAgICAgIC8vY2VsbC5IeXBlckxpbmtSSWQgPSBpZDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmaXJzdCkgeworICAgICAgc3cuV3JpdGUoIjwvaHlwZXJsaW5rcz4iKTsKKyAgICB9CisgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgVXBkYXRlUm93QnJlYWtzKFN0cmVhbVdyaXRlciBzdykKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBicmVha3M9bmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICB2YXIgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4oX3ZhbHVlcywgMCwgMCwgRXhjZWxQYWNrYWdlLk1heFJvd3MsIDApOwotICAgICAgICAgICAgLy9mb3JlYWNoKEV4Y2VsUm93IHJvdyBpbiBfcm93cykgICAgICAgICAgICAKLSAgICAgICAgICAgIHdoaWxlKGNzZS5OZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJvdz1jc2UuVmFsdWUgYXMgUm93SW50ZXJuYWw7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdyAhPSBudWxsICYmIHJvdy5QYWdlQnJlYWspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVha3MuQXBwZW5kRm9ybWF0KCI8YnJrIGlkPVwiezB9XCIgbWF4PVwiMTA0ODU3NVwiIG1hbj1cIjFcIiAvPiIsIGNzZS5Sb3cpOwotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjb3VudD4wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3LldyaXRlKHN0cmluZy5Gb3JtYXQoIjxyb3dCcmVha3MgY291bnQ9XCJ7MH1cIiBtYW51YWxCcmVha0NvdW50PVwiezB9XCI+ezF9PC9yb3dCcmVha3M+IiwgY291bnQsIGJyZWFrcy5Ub1N0cmluZygpKSk7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluc2VydHMgdGhlIGNvbHMgY29sbGVjdGlvbiBpbnRvIHRoZSBYTUwgZG9jdW1lbnQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFVwZGF0ZUNvbHVtbkRhdGEoU3RyZWFtV3JpdGVyIHN3KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL0V4Y2VsQ29sdW1uIHByZXZDb2wgPSBudWxsOyAgIC8vY29tbWVudGVkIG91dCAxMS8xLTEyIEpLIAotICAgICAgICAgICAgLy9mb3JlYWNoIChFeGNlbENvbHVtbiBjb2wgaW4gX2NvbHVtbnMpCi0gICAgICAgICAgICAvL3sgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyAgICBpZiAocHJldkNvbCAhPSBudWxsKQotICAgICAgICAgICAgLy8gICAgewotICAgICAgICAgICAgLy8gICAgICAgIGlmKHByZXZDb2wuQ29sdW1uTWF4ICE9IGNvbC5Db2x1bW5NaW4tMSkKLSAgICAgICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgICAgIHByZXZDb2wuX2NvbHVtbk1heD1jb2wuQ29sdW1uTWluLTE7Ci0gICAgICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAgICAgLy8gICAgfQotICAgICAgICAgICAgLy8gICAgcHJldkNvbCA9IGNvbDsKLSAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF92YWx1ZXMsIDAsIDEsIDAsIEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zKTsKLSAgICAgICAgICAgIC8vc3cuV3JpdGUoIjxjb2xzPiIpOwotICAgICAgICAgICAgLy9mb3JlYWNoIChFeGNlbENvbHVtbiBjb2wgaW4gX2NvbHVtbnMpCi0gICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHdoaWxlKGNzZS5OZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3cuV3JpdGUoIjxjb2xzPiIpOwotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YXIgY29sID0gY3NlLlZhbHVlIGFzIEV4Y2VsQ29sdW1uOwotICAgICAgICAgICAgICAgIEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsWGZzPiBjZWxsWGZzID0gX3BhY2thZ2UuV29ya2Jvb2suU3R5bGVzLkNlbGxYZnM7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENyZWF0ZSB0aGUgaHlwZXJsaW5rcyBub2RlIGluIHRoZSBYTUwKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHJpdmF0ZSBYbWxOb2RlIENyZWF0ZUh5cGVyTGlua0NvbGxlY3Rpb24oKSB7CisgICAgWG1sRWxlbWVudCBobCA9IF93b3Jrc2hlZXRYbWwuQ3JlYXRlRWxlbWVudCgiaHlwZXJsaW5rcyIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgWG1sTm9kZSBwcmV2Tm9kZSA9IF93b3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgKKyAgICAgICAgIi8vZDpjb25kaXRpb25hbEZvcm1hdHRpbmciLAorICAgICAgICBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBpZiAocHJldk5vZGUgPT0gbnVsbCkgeworICAgICAgcHJldk5vZGUgPSBfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDptZXJnZUNlbGxzIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICBpZiAocHJldk5vZGUgPT0gbnVsbCkgeworICAgICAgICBwcmV2Tm9kZSA9IF93b3Jrc2hlZXRYbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOnNoZWV0RGF0YSIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX3dvcmtzaGVldFhtbC5Eb2N1bWVudEVsZW1lbnQuSW5zZXJ0QWZ0ZXIoaGwsIHByZXZOb2RlKTsKKyAgfQogCi0gICAgICAgICAgICAgICAgc3cuV3JpdGUoIjxjb2wgbWluPVwiezB9XCIgbWF4PVwiezF9XCIiLCBjb2wuQ29sdW1uTWluLCBjb2wuQ29sdW1uTWF4KTsKLSAgICAgICAgICAgICAgICBpZiAoY29sLkhpZGRlbiA9PSB0cnVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9zYlhtbC5BcHBlbmQoIiB3aWR0aD1cIjBcIiBoaWRkZW49XCIxXCIgY3VzdG9tV2lkdGg9XCIxXCIiKTsKLSAgICAgICAgICAgICAgICAgICAgc3cuV3JpdGUoIiBoaWRkZW49XCIxXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sLkJlc3RGaXQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiIGJlc3RGaXQ9XCIxXCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3cuV3JpdGUoc3RyaW5nLkZvcm1hdChDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCAiIHdpZHRoPVwiezB9XCIgY3VzdG9tV2lkdGg9XCIxXCIiLCBjb2wuV2lkdGgpKTsKLSAgICAgICAgICAgICAgICBpZiAoY29sLk91dGxpbmVMZXZlbCA+IDApCi0gICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKCIgb3V0bGluZUxldmVsPVwiezB9XCIgIiwgY29sLk91dGxpbmVMZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2wuQ29sbGFwc2VkKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sLkhpZGRlbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiIGNvbGxhcHNlZD1cIjFcIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKCIgY29sbGFwc2VkPVwiMVwiIGhpZGRlbj1cIjFcIiIpOyAvL0Fsd2F5cyBoaWRkZW4KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29sLlBob25ldGljKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3cuV3JpdGUoIiBwaG9uZXRpYz1cIjFcIiIpOwotICAgICAgICAgICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRGltZW5zaW9uIGFkZHJlc3MgZm9yIHRoZSB3b3Jrc2hlZXQuCisgIC8vLyBUb3AgbGVmdCBjZWxsIHRvIEJvdHRvbSByaWdodC4KKyAgLy8vIElmIHRoZSB3b3Jrc2hlZXQgaGFzIG5vIGNlbGxzLCBudWxsIGlzIHJldHVybmVkCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEFkZHJlc3NCYXNlIERpbWVuc2lvbiB7CisgICAgZ2V0IHsKKyAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICBpbnQgZnJvbVJvdywKKyAgICAgICAgICBmcm9tQ29sLAorICAgICAgICAgIHRvUm93LAorICAgICAgICAgIHRvQ29sOworICAgICAgaWYgKF92YWx1ZXMuR2V0RGltZW5zaW9uKG91dCBmcm9tUm93LCBvdXQgZnJvbUNvbCwgb3V0IHRvUm93LCBvdXQgdG9Db2wpKSB7CisgICAgICAgIHZhciBhZGRyID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoZnJvbVJvdywgZnJvbUNvbCwgdG9Sb3csIHRvQ29sKTsKKyAgICAgICAgYWRkci5fd3MgPSBOYW1lOworICAgICAgICByZXR1cm4gYWRkcjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgRXhjZWxTaGVldFByb3RlY3Rpb24gX3Byb3RlY3Rpb247CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWNjZXNzIHRvIHNoZWV0IHByb3RlY3Rpb24gcHJvcGVydGllcworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxTaGVldFByb3RlY3Rpb24gUHJvdGVjdGlvbiB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfcHJvdGVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgIF9wcm90ZWN0aW9uID0gbmV3KE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIHRoaXMpOworICAgICAgfQorICAgICAgcmV0dXJuIF9wcm90ZWN0aW9uOworICAgIH0KKyAgfQogCi0gICAgICAgICAgICAgICAgdmFyIHN0eWxlSUQgPSBjb2wuU3R5bGVJRCA+PSAwID8gY2VsbFhmc1tjb2wuU3R5bGVJRF0ubmV3SUQgOiBjb2wuU3R5bGVJRDsKLSAgICAgICAgICAgICAgICBpZiAoc3R5bGVJRCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiIHN0eWxlPVwiezB9XCIiLCBzdHlsZUlEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3cuV3JpdGUoIiAvPiIpOworICBwcml2YXRlIEV4Y2VsUHJvdGVjdGVkUmFuZ2VDb2xsZWN0aW9uIF9wcm90ZWN0ZWRSYW5nZXM7CiAKLSAgICAgICAgICAgICAgICAvL2lmIChjb2wuUGFnZUJyZWFrKQotICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgIC8vICAgIGNvbEJyZWFrcy5BZGQoY29sLkNvbHVtbk1pbik7Ci0gICAgICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZpcnN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN3LldyaXRlKCI8L2NvbHM+Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5zZXJ0IHJvdyBhbmQgY2VsbHMgaW50byB0aGUgWE1MIGRvY3VtZW50Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBVcGRhdGVSb3dDZWxsRGF0YShTdHJlYW1Xcml0ZXIgc3cpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsWGZzPiBjZWxsWGZzID0gX3BhY2thZ2UuV29ya2Jvb2suU3R5bGVzLkNlbGxYZnM7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGludCByb3cgPSAtMTsKKyAgcHVibGljIEV4Y2VsUHJvdGVjdGVkUmFuZ2VDb2xsZWN0aW9uIFByb3RlY3RlZFJhbmdlcyB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfcHJvdGVjdGVkUmFuZ2VzID09IG51bGwpIHsKKyAgICAgICAgX3Byb3RlY3RlZFJhbmdlcyA9IG5ldyhOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCB0aGlzKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfcHJvdGVjdGVkUmFuZ2VzOworICAgIH0KKyAgfQogCi0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiWG1sID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIHZhciBzcyA9IF9wYWNrYWdlLldvcmtib29rLl9zaGFyZWRTdHJpbmdzOwotICAgICAgICAgICAgdmFyIHN0eWxlcyA9IF9wYWNrYWdlLldvcmtib29rLlN0eWxlczsKLSAgICAgICAgICAgIHZhciBjYWNoZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBjYWNoZS5BcHBlbmQoIjxzaGVldERhdGE+Iik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vU2V0IGEgdmFsdWUgZm9yIGNlbGxzIHdpdGggc3R5bGUgYW5kIG5vIHZhbHVlIHNldC4KLSAgICAgICAgICAgIHZhciBjc2VTdHlsZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxpbnQ+KF9zdHlsZXMsIDAsIDAsIEV4Y2VsUGFja2FnZS5NYXhSb3dzLCBFeGNlbFBhY2thZ2UuTWF4Q29sdW1ucyk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgcyBpbiBjc2VTdHlsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZighX3ZhbHVlcy5FeGlzdHMoY3NlU3R5bGUuUm93LCBjc2VTdHlsZS5Db2x1bW4pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5TZXRWYWx1ZShjc2VTdHlsZS5Sb3csIGNzZVN0eWxlLkNvbHVtbiwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICBwcml2YXRlIEV4Y2VsVGFibGVDb2xsZWN0aW9uIF90YWJsZXM7CiAKLSAgICAgICAgICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihfdmFsdWVzLCAxLCAwLCBFeGNlbFBhY2thZ2UuTWF4Um93cywgRXhjZWxQYWNrYWdlLk1heENvbHVtbnMpOwotICAgICAgICAgICAgLy9mb3JlYWNoIChJUmFuZ2VJRCByIGluIF9jZWxscykKLSAgICAgICAgICAgIHdoaWxlKGNzZS5OZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNzZS5Db2x1bW4+MCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdHlsZUlEID0gY2VsbFhmc1tzdHlsZXMuR2V0U3R5bGVJZCh0aGlzLCBjc2UuUm93LCBjc2UuQ29sdW1uKV0ubmV3SUQ7Ci0gICAgICAgICAgICAgICAgICAgIC8vQWRkIHRoZSByb3cgZWxlbWVudCBpZiBpdCdzIGEgbmV3IHJvdwotICAgICAgICAgICAgICAgICAgICBpZiAoY3NlLlJvdyAhPSByb3cpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlUm93KGNhY2hlLCBjZWxsWGZzLCByb3csIGNzZS5Sb3cpOwotICAgICAgICAgICAgICAgICAgICAgICAgcm93ID0gY3NlLlJvdzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBvYmplY3QgdiA9IGNzZS5WYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGZvcm11bGEgPSBfZm9ybXVsYXMuR2V0VmFsdWUoY3NlLlJvdywgY3NlLkNvbHVtbik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmb3JtdWxhIGlzIGludCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNmSWQgPSAoaW50KWZvcm11bGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZiA9IF9zaGFyZWRGb3JtdWxhc1soaW50KXNmSWRdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuQWRkcmVzcy5JbmRleE9mKCc6JykgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLlN0YXJ0Q29sID09IGNzZS5Db2x1bW4gJiYgZi5TdGFydFJvdyA9PSBjc2UuUm93KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuSXNBcnJheSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCI8YyByPVwiezB9XCIgcz1cInsxfVwiezV9PjxmIHJlZj1cInsyfVwiIHQ9XCJhcnJheVwiPnszfTwvZj57NH08L2M+IiwgY3NlLkNlbGxBZGRyZXNzLCBzdHlsZUlEIDwgMCA/IDAgOiBzdHlsZUlELCBmLkFkZHJlc3MsIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoZi5Gb3JtdWxhKSwgR2V0Rm9ybXVsYVZhbHVlKHYpLCBHZXRDZWxsVHlwZSh2LHRydWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgiPGMgcj1cInswfVwiIHM9XCJ7MX1cIns2fT48ZiByZWY9XCJ7Mn1cIiB0PVwic2hhcmVkXCIgIHNpPVwiezN9XCI+ezR9PC9mPns1fTwvYz4iLCBjc2UuQ2VsbEFkZHJlc3MsIHN0eWxlSUQgPCAwID8gMCA6IHN0eWxlSUQsIGYuQWRkcmVzcywgc2ZJZCwgU2VjdXJpdHlFbGVtZW50LkVzY2FwZShmLkZvcm11bGEpLCBHZXRGb3JtdWxhVmFsdWUodiksIEdldENlbGxUeXBlKHYsdHJ1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRhYmxlcyBkZWZpbmVkIGluIHRoZSB3b3Jrc2hlZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFRhYmxlQ29sbGVjdGlvbiBUYWJsZXMgeworICAgIGdldCB7CisgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgaWYgKFdvcmtib29rLl9uZXh0VGFibGVJRCA9PSBpbnQuTWluVmFsdWUpIHsKKyAgICAgICAgV29ya2Jvb2suUmVhZEFsbFRhYmxlcygpOworICAgICAgfQorICAgICAgaWYgKF90YWJsZXMgPT0gbnVsbCkgeworICAgICAgICBfdGFibGVzID0gbmV3KHRoaXMpOworICAgICAgfQorICAgICAgcmV0dXJuIF90YWJsZXM7CisgICAgfQorICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZi5Jc0FycmF5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCI8YyByPVwiezB9XCIgcz1cInsxfVwiIC8+IiwgY3NlLkNlbGxBZGRyZXNzLCBzdHlsZUlEIDwgMCA/IDAgOiBzdHlsZUlEKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCI8YyByPVwiezB9XCIgcz1cInsxfVwiezR9PjxmIHQ9XCJzaGFyZWRcIiBzaT1cInsyfVwiIC8+ezN9PC9jPiIsIGNzZS5DZWxsQWRkcmVzcywgc3R5bGVJRCA8IDAgPyAwIDogc3R5bGVJRCwgc2ZJZCwgR2V0Rm9ybXVsYVZhbHVlKHYpLCBHZXRDZWxsVHlwZSh2LHRydWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGFsc28gaGF2ZSBhIHNpbmdsZSBjZWxsIGFycmF5IGZvcm11bGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmLklzQXJyYXkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoIjxjIHI9XCJ7MH1cIiBzPVwiezF9XCJ7NX0+PGYgcmVmPVwiezJ9XCIgdD1cImFycmF5XCI+ezN9PC9mPns0fTwvYz4iLCBjc2UuQ2VsbEFkZHJlc3MsIHN0eWxlSUQgPCAwID8gMCA6IHN0eWxlSUQsIHN0cmluZy5Gb3JtYXQoInswfTp7MX0iLCBmLkFkZHJlc3MsIGYuQWRkcmVzcyksIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoZi5Gb3JtdWxhKSwgR2V0Rm9ybXVsYVZhbHVlKHYpLCBHZXRDZWxsVHlwZSh2LHRydWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCI8YyByPVwiezB9XCIgcz1cInsxfVwiPiIsIGYuQWRkcmVzcywgc3R5bGVJRCA8IDAgPyAwIDogc3R5bGVJRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgiPGY+ezB9PC9mPnsxfTwvYz4iLCBTZWN1cml0eUVsZW1lbnQuRXNjYXBlKGYuRm9ybXVsYSksIEdldEZvcm11bGFWYWx1ZSh2KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvcm11bGEhPW51bGwgJiYgZm9ybXVsYS5Ub1N0cmluZygpIT0iIikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCI8YyByPVwiezB9XCIgcz1cInsxfVwiezJ9PiIsIGNzZS5DZWxsQWRkcmVzcywgc3R5bGVJRCA8IDAgPyAwIDogc3R5bGVJRCwgR2V0Q2VsbFR5cGUodix0cnVlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoIjxmPnswfTwvZj57MX08L2M+IiwgU2VjdXJpdHlFbGVtZW50LkVzY2FwZShmb3JtdWxhLlRvU3RyaW5nKCkpLCBHZXRGb3JtdWxhVmFsdWUodikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCAmJiBzdHlsZUlEID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoIjxjIHI9XCJ7MH1cIiBzPVwiezF9XCIgLz4iLCBjc2UuQ2VsbEFkZHJlc3MsIHN0eWxlSUQgPCAwID8gMCA6IHN0eWxlSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih2ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2LkdldFR5cGUoKS5Jc1ByaW1pdGl2ZSB8fCB2IGlzIGRvdWJsZSB8fCB2IGlzIGRlY2ltYWwgfHwgdiBpcyBEYXRlVGltZSB8fCB2IGlzIFRpbWVTcGFuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3RyaW5nIHN2ID0gR2V0VmFsdWVGb3JYbWwodik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgiPGMgcj1cInswfVwiIHM9XCJ7MX1cIiB7Mn0+IiwgY3NlLkNlbGxBZGRyZXNzLCBzdHlsZUlEIDwgMCA/IDAgOiBzdHlsZUlELCBHZXRDZWxsVHlwZSh2KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgiezB9PC9jPiIsIEdldEZvcm11bGFWYWx1ZSh2KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpeDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzcy5Db250YWluc0tleSh2LlRvU3RyaW5nKCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpeCA9IHNzLkNvdW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3MuQWRkKHYuVG9TdHJpbmcoKSwgbmV3IEV4Y2VsV29ya2Jvb2suU2hhcmVkU3RyaW5nSXRlbSgpIHsgaXNSaWNoVGV4dCA9IF9mbGFncy5HZXRGbGFnVmFsdWUoY3NlLlJvdyxjc2UuQ29sdW1uLENlbGxGbGFncy5SaWNoVGV4dCksIHBvcyA9IGl4IH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXggPSBzc1t2LlRvU3RyaW5nKCldLnBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoIjxjIHI9XCJ7MH1cIiBzPVwiezF9XCIgdD1cInNcIj4iLCBjc2UuQ2VsbEFkZHJlc3MsIHN0eWxlSUQgPCAwID8gMCA6IHN0eWxlSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmRGb3JtYXQoIjx2PnswfTwvdj48L2M+IiwgaXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLy8vVXBkYXRlIGh5cGVybGlua3MuCi0gICAgICAgICAgICAgICAgICAgLy9pZiAoY2VsbC5IeXBlcmxpbmsgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIF9oeXBlckxpbmtDZWxscy5BZGQoY2VsbC5DZWxsSUQpOwotICAgICAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSAgLy9FeGNlbFJvdwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9pbnQgbmV3Um93PSgoRXhjZWxSb3cpY3NlLlZhbHVlKS5Sb3c7Ci0gICAgICAgICAgICAgICAgICAgIFdyaXRlUm93KGNhY2hlLCBjZWxsWGZzLCByb3csIGNzZS5Sb3cpOwotICAgICAgICAgICAgICAgICAgICByb3cgPSBjc2UuUm93OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2FjaGUuTGVuZ3RoID4gMHg2MDAwMDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZShjYWNoZS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgcHJpdmF0ZSBFeGNlbFBpdm90VGFibGVDb2xsZWN0aW9uIF9waXZvdFRhYmxlczsKIAotICAgICAgICAgICAgaWYgKHJvdyAhPSAtMSkgY2FjaGUuQXBwZW5kKCI8L3Jvdz4iKTsKLSAgICAgICAgICAgIGNhY2hlLkFwcGVuZCgiPC9zaGVldERhdGE+Iik7Ci0gICAgICAgICAgICBzdy5Xcml0ZShjYWNoZS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIHN3LkZsdXNoKCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFBpdm90dGFibGVzIGRlZmluZWQgaW4gdGhlIHdvcmtzaGVldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZUNvbGxlY3Rpb24gUGl2b3RUYWJsZXMgeworICAgIGdldCB7CisgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgaWYgKF9waXZvdFRhYmxlcyA9PSBudWxsKSB7CisgICAgICAgIGlmIChXb3JrYm9vay5fbmV4dFBpdm90VGFibGVJRCA9PSBpbnQuTWluVmFsdWUpIHsKKyAgICAgICAgICBXb3JrYm9vay5SZWFkQWxsVGFibGVzKCk7CiAgICAgICAgIH0KKyAgICAgICAgX3Bpdm90VGFibGVzID0gbmV3KHRoaXMpOworICAgICAgfQorICAgICAgcmV0dXJuIF9waXZvdFRhYmxlczsKKyAgICB9CisgIH0KIAotICAgICAgICBwcml2YXRlIG9iamVjdCBHZXRGb3JtdWxhVmFsdWUob2JqZWN0IHYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vaWYgKF9wYWNrYWdlLldvcmtib29rLl9pc0NhbGN1bGF0ZWQpCi0gICAgICAgICAgICAvL3sgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiB2LlRvU3RyaW5nKCkhPSIiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAiPHY+IiArIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoR2V0VmFsdWVGb3JYbWwodikpICsgIjwvdj4iOyAvL0ZpeGVzIGlzc3VlIDE1MDcxCi0gICAgICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHByaXZhdGUgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xsZWN0aW9uIF9jb25kaXRpb25hbEZvcm1hdHRpbmc7CiAKLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0Q2VsbFR5cGUob2JqZWN0IHYsIGJvb2wgYWxsb3dTdHI9ZmFsc2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2IGlzIGJvb2wpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIgdD1cImJcIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgodiBpcyBkb3VibGUgJiYgZG91YmxlLklzSW5maW5pdHkoKGRvdWJsZSl2KSkgfHwgdiBpcyBFeGNlbEVycm9yVmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIgdD1cImVcIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKGFsbG93U3RyICYmIHYhPW51bGwgJiYgISh2LkdldFR5cGUoKS5Jc1ByaW1pdGl2ZSB8fCB2IGlzIGRvdWJsZSB8fCB2IGlzIGRlY2ltYWwgfHwgdiBpcyBEYXRlVGltZSB8fCB2IGlzIFRpbWVTcGFuKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiB0PVwic3RyXCIiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb25kaXRpb25hbEZvcm1hdHRpbmcgZGVmaW5lZCBpbiB0aGUgd29ya3NoZWV0LiBVc2UgdGhlIEFkZCBtZXRob2RzIHRvIGNyZWF0ZSBDb25kaXRpb25hbEZvcm1hdHRpbmcgYW5kIGFkZCB0aGVtIHRvIHRoZSB3b3Jrc2hlZXQuIFRoZW4KKyAgLy8vIHNldCB0aGUgcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UgcmV0dXJuZWQuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8c2VlYWxzbyBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbGxlY3Rpb24iLz4KKyAgcHVibGljIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sbGVjdGlvbiBDb25kaXRpb25hbEZvcm1hdHRpbmcgeworICAgIGdldCB7CisgICAgICBDaGVja1NoZWV0VHlwZSgpOworICAgICAgaWYgKF9jb25kaXRpb25hbEZvcm1hdHRpbmcgPT0gbnVsbCkgeworICAgICAgICBfY29uZGl0aW9uYWxGb3JtYXR0aW5nID0gbmV3KHRoaXMpOworICAgICAgfQorICAgICAgcmV0dXJuIF9jb25kaXRpb25hbEZvcm1hdHRpbmc7CisgICAgfQorICB9CiAKLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0VmFsdWVGb3JYbWwob2JqZWN0IHYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBzOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHYgaXMgRGF0ZVRpbWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2R2ID0gKChEYXRlVGltZSl2KS5Ub09BRGF0ZSgpOworICBwcml2YXRlIEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uIF9kYXRhVmFsaWRhdGlvbjsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoV29ya2Jvb2suRGF0ZTE5MDQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNkdiAtPSBFeGNlbFdvcmtib29rLmRhdGUxOTA0T2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIERhdGFWYWxpZGF0aW9uIGRlZmluZWQgaW4gdGhlIHdvcmtzaGVldC4gVXNlIHRoZSBBZGQgbWV0aG9kcyB0byBjcmVhdGUgRGF0YVZhbGlkYXRpb25zIGFuZCBhZGQgdGhlbSB0byB0aGUgd29ya3NoZWV0LiBUaGVuCisgIC8vLyBzZXQgdGhlIHByb3BlcnRpZXMgb24gdGhlIGluc3RhbmNlIHJldHVybmVkLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHNlZWFsc28gY3JlZj0iRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24iLz4KKyAgcHVibGljIEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uIERhdGFWYWxpZGF0aW9ucyB7CisgICAgZ2V0IHsKKyAgICAgIENoZWNrU2hlZXRUeXBlKCk7CisgICAgICBpZiAoX2RhdGFWYWxpZGF0aW9uID09IG51bGwpIHsKKyAgICAgICAgX2RhdGFWYWxpZGF0aW9uID0gbmV3KHRoaXMpOworICAgICAgfQorICAgICAgcmV0dXJuIF9kYXRhVmFsaWRhdGlvbjsKKyAgICB9CisgIH0KIAotICAgICAgICAgICAgICAgICAgICBzID0gc2R2LlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh2IGlzIFRpbWVTcGFuKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcyA9IG5ldyBEYXRlVGltZSgoKFRpbWVTcGFuKXYpLlRpY2tzKS5Ub09BRGF0ZSgpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOyA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYodi5HZXRUeXBlKCkuSXNQcmltaXRpdmUgfHwgdiBpcyBkb3VibGUgfHwgdiBpcyBkZWNpbWFsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHYgaXMgZG91YmxlICYmIGRvdWJsZS5Jc05hTigoZG91YmxlKXYpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpcyBkb3VibGUgJiYgZG91YmxlLklzSW5maW5pdHkoKGRvdWJsZSl2KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICIjTlVNISI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzID0gQ29udmVydC5Ub0RvdWJsZSh2LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKS5Ub1N0cmluZygiUjE1IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcyA9IHYuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgdGhlIHN0eWxlIElEIGdpdmVuIGEgc3R5bGUgbmFtZS4KKyAgLy8vIFRoZSBzdHlsZSBJRCB3aWxsIGJlIGNyZWF0ZWQgaWYgbm90IGZvdW5kLCBidXQgb25seSBpZiB0aGUgc3R5bGUgbmFtZSBleGlzdHMhCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ic3R5bGVOYW1lIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBpbnRlcm5hbCBpbnQgR2V0U3R5bGVJZChzdHJpbmcgc3R5bGVOYW1lKSB7CisgICAgRXhjZWxOYW1lZFN0eWxlWG1sIG5hbWVkU3R5bGUgPSBudWxsOworICAgIFdvcmtib29rLlN0eWxlcy5OYW1lZFN0eWxlcy5GaW5kQnlJZChzdHlsZU5hbWUsIHJlZiBuYW1lZFN0eWxlKTsKKyAgICBpZiAobmFtZWRTdHlsZS5YZklkID09IGludC5NaW5WYWx1ZSkgeworICAgICAgbmFtZWRTdHlsZS5YZklkID0gV29ya2Jvb2suU3R5bGVzLkNlbGxYZnMuRmluZEluZGV4QnlJZChuYW1lZFN0eWxlLlN0eWxlLklkKTsKKyAgICB9CisgICAgcmV0dXJuIG5hbWVkU3R5bGUuWGZJZDsKKyAgfQogCi0gICAgICAgICAgICBjYXRjaAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHMgPSAiMCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gczsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVSb3coU3RyaW5nQnVpbGRlciBjYWNoZSwgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxYZnM+IGNlbGxYZnMsIGludCBwcmV2Um93LCBpbnQgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHJldlJvdyAhPSAtMSkgY2FjaGUuQXBwZW5kKCI8L3Jvdz4iKTsKLSAgICAgICAgICAgIC8vdWxvbmcgcm93SUQgPSBFeGNlbFJvdy5HZXRSb3dJRChTaGVldElELCByb3cpOwotICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCI8cm93IHI9XCJ7MH1cIiAiLCByb3cpOwotICAgICAgICAgICAgUm93SW50ZXJuYWwgY3VyclJvdyA9IF92YWx1ZXMuR2V0VmFsdWUocm93LCAwKSBhcyBSb3dJbnRlcm5hbDsKLSAgICAgICAgICAgIGlmIChjdXJyUm93ICE9IG51bGwpCi0gICAgICAgICAgICB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSB3b3JrYm9vayBvYmplY3QKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsV29ya2Jvb2sgV29ya2Jvb2sgPT4gX3BhY2thZ2UuV29ya2Jvb2s7CiAKLSAgICAgICAgICAgICAgICBpZiAoY3VyclJvdy5IaWRkZW4gPT0gdHJ1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZCgiaHQ9XCIwXCIgaGlkZGVuPVwiMVwiICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyUm93LkhlaWdodCAhPSBEZWZhdWx0Um93SGVpZ2h0ICYmIGN1cnJSb3cuSGVpZ2h0Pj0wKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KHN0cmluZy5Gb3JtYXQoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgImh0PVwiezB9XCIgIiwgY3VyclJvdy5IZWlnaHQpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJSb3cuQ3VzdG9tSGVpZ2h0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmQoImN1c3RvbUhlaWdodD1cIjFcIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0IHRoZSBuZXh0IElEIGZyb20gYSBzaGFyZWQgZm9ybXVsYSBvciBhbiBBcnJheSBmb3JtdWxhCisgIC8vLyBTaGFyZWRmb3J1bWxhcyB3aWxsIGhhdmUgYW4gaWQgZnJvbSAwLXguIEFycmF5IGZvcm11bGEgaWRzIHN0YXJ0IGZyb20gMHg0MDAwMDAxLS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpc0FycmF5Ij5JZiB0aGUgZm9ybXVsYSBpcyBhbiBhcnJheSBmb3JtdWxhPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgaW50ZXJuYWwgaW50IEdldE1heFNoYXJlRnVuY3Rpb25JbmRleChib29sIGlzQXJyYXkpIHsKKyAgICBpbnQgaSA9IF9zaGFyZWRGb3JtdWxhcy5Db3VudCArIDE7CisgICAgaWYgKGlzQXJyYXkpIHsKKyAgICAgIGkgfD0gMHg0MDAwMDAwMDsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoY3VyclJvdy5PdXRsaW5lTGV2ZWwgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kRm9ybWF0KCJvdXRsaW5lTGV2ZWwgPVwiezB9XCIgIiwgY3VyclJvdy5PdXRsaW5lTGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3VyclJvdy5Db2xsYXBzZWQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyUm93LkhpZGRlbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmQoIiBjb2xsYXBzZWQ9XCIxXCIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUuQXBwZW5kKCIgY29sbGFwc2VkPVwiMVwiIGhpZGRlbj1cIjFcIiAiKTsgLy9BbHdheXMgaGlkZGVuCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJSb3cuUGhvbmV0aWMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYWNoZS5BcHBlbmQoInBoPVwiMVwiICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBzID0gX3N0eWxlcy5HZXRWYWx1ZShyb3csIDApOwotICAgICAgICAgICAgaWYgKHMgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhY2hlLkFwcGVuZEZvcm1hdCgicz1cInswfVwiIGN1c3RvbUZvcm1hdD1cIjFcIiIsIGNlbGxYZnNbc10ubmV3SUQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FjaGUuQXBwZW5kKCI+Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlUm93KFN0cmVhbVdyaXRlciBzdywgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxYZnM+IGNlbGxYZnMsIGludCBwcmV2Um93LCBpbnQgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHJldlJvdyAhPSAtMSkgc3cuV3JpdGUoIjwvcm93PiIpOwotICAgICAgICAgICAgLy91bG9uZyByb3dJRCA9IEV4Y2VsUm93LkdldFJvd0lEKFNoZWV0SUQsIHJvdyk7Ci0gICAgICAgICAgICBzdy5Xcml0ZSgiPHJvdyByPVwiezB9XCIgIiwgcm93KTsKLSAgICAgICAgICAgIFJvd0ludGVybmFsIGN1cnJSb3cgPSBfdmFsdWVzLkdldFZhbHVlKHJvdywgMCkgYXMgUm93SW50ZXJuYWw7Ci0gICAgICAgICAgICBpZiAoY3VyclJvdyE9bnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZiAoY3VyclJvdy5IaWRkZW4gPT0gdHJ1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKCJodD1cIjBcIiBoaWRkZW49XCIxXCIgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJSb3cuSGVpZ2h0ICE9IERlZmF1bHRSb3dIZWlnaHQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZShzdHJpbmcuRm9ybWF0KEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsICJodD1cInswfVwiICIsIGN1cnJSb3cuSGVpZ2h0KSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyUm93LkN1c3RvbUhlaWdodCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc3cuV3JpdGUoImN1c3RvbUhlaWdodD1cIjFcIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICB3aGlsZSAoX3NoYXJlZEZvcm11bGFzLkNvbnRhaW5zS2V5KGkpKSB7CisgICAgICBpKys7CisgICAgfQorICAgIHJldHVybiBpOworICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoY3VyclJvdy5PdXRsaW5lTGV2ZWwgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3cuV3JpdGUoIm91dGxpbmVMZXZlbCA9XCJ7MH1cIiAiLCBjdXJyUm93Lk91dGxpbmVMZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyUm93LkNvbGxhcHNlZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJSb3cuSGlkZGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKCIgY29sbGFwc2VkPVwiMVwiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKCIgY29sbGFwc2VkPVwiMVwiIGhpZGRlbj1cIjFcIiAiKTsgLy9BbHdheXMgaGlkZGVuCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJSb3cuUGhvbmV0aWMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgicGg9XCIxXCIgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHMgPSBfc3R5bGVzLkdldFZhbHVlKHJvdywgMCk7Ci0gICAgICAgICAgICBpZiAocyA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3cuV3JpdGUoInM9XCJ7MH1cIiBjdXN0b21Gb3JtYXQ9XCIxXCIiLCBjZWxsWGZzW3NdLm5ld0lEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3LldyaXRlKCI+Iik7Ci0gICAgICAgIH0KKyAgaW50ZXJuYWwgdm9pZCBTZXRIZkxlZ2FjeURyYXdpbmdSZWwoc3RyaW5nIHJlbElkKSB7CisgICAgU2V0WG1sTm9kZVN0cmluZygiZDpsZWdhY3lEcmF3aW5nSEYvQHI6aWQiLCByZWxJZCk7CisgIH0KIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBVcGRhdGUgeG1sIHdpdGggaHlwZXJsaW5rcyAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdyI+VGhlIHN0cmVhbTwvcGFyYW0+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBVcGRhdGVIeXBlckxpbmtzKFN0cmVhbVdyaXRlciBzdykKLSAgICAgICAgewotICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+IGh5cHMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICB2YXIgY3NlID0gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPFVyaT4oX2h5cGVyTGlua3MpOwotICAgICAgICAgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgICAgICAgICAgIC8vZm9yZWFjaCAodWxvbmcgY2VsbCBpbiBfaHlwZXJMaW5rcykKLSAgICAgICAgICAgICAgICB3aGlsZShjc2UuTmV4dCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiPGh5cGVybGlua3M+Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vaW50IHJvdywgY29sOwotICAgICAgICAgICAgICAgICAgICB2YXIgdXJpID0gX2h5cGVyTGlua3MuR2V0VmFsdWUoY3NlLlJvdywgY3NlLkNvbHVtbik7Ci0gICAgICAgICAgICAgICAgICAgIC8vRXhjZWxDZWxsIGNlbGwgPSBfY2VsbHNbY2VsbElkXSBhcyBFeGNlbENlbGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmkgaXMgRXhjZWxIeXBlckxpbmsgJiYgIXN0cmluZy5Jc051bGxPckVtcHR5KCh1cmkgYXMgRXhjZWxIeXBlckxpbmspLlJlZmVyZW5jZUFkZHJlc3MpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFeGNlbEh5cGVyTGluayBobCA9IHVyaSBhcyBFeGNlbEh5cGVyTGluazsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKCI8aHlwZXJsaW5rIHJlZj1cInswfVwiIGxvY2F0aW9uPVwiezF9XCIgezJ9ezN9Lz4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWxsc1tjc2UuUm93LCBjc2UuQ29sdW1uLCBjc2UuUm93ICsgaGwuUm93U3Bhbm4sIGNzZS5Db2x1bW4gKyBobC5Db2xTcGFubl0uQWRkcmVzcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0RnVsbEFkZHJlc3MoU2VjdXJpdHlFbGVtZW50LkVzY2FwZShOYW1lKSwgU2VjdXJpdHlFbGVtZW50LkVzY2FwZShobC5SZWZlcmVuY2VBZGRyZXNzKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuSXNOdWxsT3JFbXB0eShobC5EaXNwbGF5KSA/ICIiIDogImRpc3BsYXk9XCIiICsgU2VjdXJpdHlFbGVtZW50LkVzY2FwZShobC5EaXNwbGF5KSArICJcIiAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLklzTnVsbE9yRW1wdHkoaGwuVG9vbFRpcCkgPyAiIiA6ICJ0b29sdGlwPVwiIiArIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoaGwuVG9vbFRpcCkgKyAiXCIgIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdXJpIT1udWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBVcmkgaHlwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSBpcyBFeGNlbEh5cGVyTGluaykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoeXAgPSAoKEV4Y2VsSHlwZXJMaW5rKXVyaSkuT3JpZ2luYWxVcmk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHlwID0gdXJpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh5cHMuQ29udGFpbnNLZXkoaHlwLk9yaWdpbmFsU3RyaW5nKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCA9IGh5cHNbaHlwLk9yaWdpbmFsU3RyaW5nXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVsYXRpb25zaGlwID0gUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoaHlwLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5FeHRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYUh5cGVybGluayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSBpcyBFeGNlbEh5cGVyTGluaykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsSHlwZXJMaW5rIGhsID0gdXJpIGFzIEV4Y2VsSHlwZXJMaW5rOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiPGh5cGVybGluayByZWY9XCJ7MH1cIiB7Mn17M31yOmlkPVwiezF9XCIgLz4iLCBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoY3NlLlJvdywgY3NlLkNvbHVtbiksIHJlbGF0aW9uc2hpcC5JZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLklzTnVsbE9yRW1wdHkoaGwuRGlzcGxheSkgPyAiIiA6ICJkaXNwbGF5PVwiIiArIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoaGwuRGlzcGxheSkgKyAiXCIgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy5Jc051bGxPckVtcHR5KGhsLlRvb2xUaXApID8gIiIgOiAidG9vbHRpcD1cIiIgKyBTZWN1cml0eUVsZW1lbnQuRXNjYXBlKGhsLlRvb2xUaXApICsgIlwiICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiPGh5cGVybGluayByZWY9XCJ7MH1cIiByOmlkPVwiezF9XCIgLz4iLCBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoY3NlLlJvdywgY3NlLkNvbHVtbiksIHJlbGF0aW9uc2hpcC5JZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gcmVsYXRpb25zaGlwLklkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy9jZWxsLkh5cGVyTGlua1JJZCA9IGlkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdy5Xcml0ZSgiPC9oeXBlcmxpbmtzPiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGUgdGhlIGh5cGVybGlua3Mgbm9kZSBpbiB0aGUgWE1MCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHByaXZhdGUgWG1sTm9kZSBDcmVhdGVIeXBlckxpbmtDb2xsZWN0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sRWxlbWVudCBobD1fd29ya3NoZWV0WG1sLkNyZWF0ZUVsZW1lbnQoImh5cGVybGlua3MiLEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgIFhtbE5vZGUgcHJldk5vZGUgPSBfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpjb25kaXRpb25hbEZvcm1hdHRpbmciLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGlmIChwcmV2Tm9kZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByZXZOb2RlID0gX3dvcmtzaGVldFhtbC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6bWVyZ2VDZWxscyIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIGlmIChwcmV2Tm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcHJldk5vZGUgPSBfd29ya3NoZWV0WG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpzaGVldERhdGEiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX3dvcmtzaGVldFhtbC5Eb2N1bWVudEVsZW1lbnQuSW5zZXJ0QWZ0ZXIoaGwsIHByZXZOb2RlKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEaW1lbnNpb24gYWRkcmVzcyBmb3IgdGhlIHdvcmtzaGVldC4gCi0gICAgICAgIC8vLyBUb3AgbGVmdCBjZWxsIHRvIEJvdHRvbSByaWdodC4KLSAgICAgICAgLy8vIElmIHRoZSB3b3Jrc2hlZXQgaGFzIG5vIGNlbGxzLCBudWxsIGlzIHJldHVybmVkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEFkZHJlc3NCYXNlIERpbWVuc2lvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDaGVja1NoZWV0VHlwZSgpOwotICAgICAgICAgICAgICAgIGludCBmcm9tUm93LCBmcm9tQ29sLCB0b1JvdywgdG9Db2w7Ci0gICAgICAgICAgICAgICAgaWYgKF92YWx1ZXMuR2V0RGltZW5zaW9uKG91dCBmcm9tUm93LCBvdXQgZnJvbUNvbCwgb3V0IHRvUm93LCBvdXQgdG9Db2wpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGFkZHIgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZShmcm9tUm93LCBmcm9tQ29sLCB0b1JvdywgdG9Db2wpOwotICAgICAgICAgICAgICAgICAgICBhZGRyLl93cyA9IE5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxTaGVldFByb3RlY3Rpb24gX3Byb3RlY3Rpb249bnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWNjZXNzIHRvIHNoZWV0IHByb3RlY3Rpb24gcHJvcGVydGllcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxTaGVldFByb3RlY3Rpb24gUHJvdGVjdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3Byb3RlY3Rpb24gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9wcm90ZWN0aW9uID0gbmV3IEV4Y2VsU2hlZXRQcm90ZWN0aW9uKE5hbWVTcGFjZU1hbmFnZXIsIFRvcE5vZGUsIHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX3Byb3RlY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgaW50ZXJuYWwgdm9pZCBSZW1vdmVMZWdhY3lEcmF3aW5nUmVsKHN0cmluZyByZWxJZCkgeworICAgIHZhciBuID0gV29ya3NoZWV0WG1sLkRvY3VtZW50RWxlbWVudC5TZWxlY3RTaW5nbGVOb2RlKAorICAgICAgICBzdHJpbmcuRm9ybWF0KCJkOmxlZ2FjeURyYXdpbmdbQHI6aWQ9XCJ7MH1cIl0iLCByZWxJZCksCisgICAgICAgIE5hbWVTcGFjZU1hbmFnZXIpOworICAgIGlmIChuICE9IG51bGwpIHsKKyAgICAgIG4uUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChuKTsKKyAgICB9CisgIH0KIAotICAgICAgICBwcml2YXRlIEV4Y2VsUHJvdGVjdGVkUmFuZ2VDb2xsZWN0aW9uIF9wcm90ZWN0ZWRSYW5nZXM7Ci0gICAgICAgIHB1YmxpYyBFeGNlbFByb3RlY3RlZFJhbmdlQ29sbGVjdGlvbiBQcm90ZWN0ZWRSYW5nZXMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9wcm90ZWN0ZWRSYW5nZXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgX3Byb3RlY3RlZFJhbmdlcyA9IG5ldyBFeGNlbFByb3RlY3RlZFJhbmdlQ29sbGVjdGlvbihOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLCB0aGlzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3Byb3RlY3RlZFJhbmdlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgRXhjZWxUYWJsZUNvbGxlY3Rpb24gX3RhYmxlcyA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRhYmxlcyBkZWZpbmVkIGluIHRoZSB3b3Jrc2hlZXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFRhYmxlQ29sbGVjdGlvbiBUYWJsZXMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoV29ya2Jvb2suX25leHRUYWJsZUlEID09IGludC5NaW5WYWx1ZSkgV29ya2Jvb2suUmVhZEFsbFRhYmxlcygpOwotICAgICAgICAgICAgICAgIGlmIChfdGFibGVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfdGFibGVzID0gbmV3IEV4Y2VsVGFibGVDb2xsZWN0aW9uKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX3RhYmxlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbFBpdm90VGFibGVDb2xsZWN0aW9uIF9waXZvdFRhYmxlcyA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBpdm90dGFibGVzIGRlZmluZWQgaW4gdGhlIHdvcmtzaGVldC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZUNvbGxlY3Rpb24gUGl2b3RUYWJsZXMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoX3Bpdm90VGFibGVzID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoV29ya2Jvb2suX25leHRQaXZvdFRhYmxlSUQgPT0gaW50Lk1pblZhbHVlKSBXb3JrYm9vay5SZWFkQWxsVGFibGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIF9waXZvdFRhYmxlcyA9IG5ldyBFeGNlbFBpdm90VGFibGVDb2xsZWN0aW9uKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX3Bpdm90VGFibGVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgRXhjZWxDb25kaXRpb25hbEZvcm1hdHRpbmdDb2xsZWN0aW9uIF9jb25kaXRpb25hbEZvcm1hdHRpbmcgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25kaXRpb25hbEZvcm1hdHRpbmcgZGVmaW5lZCBpbiB0aGUgd29ya3NoZWV0LiBVc2UgdGhlIEFkZCBtZXRob2RzIHRvIGNyZWF0ZSBDb25kaXRpb25hbEZvcm1hdHRpbmcgYW5kIGFkZCB0aGVtIHRvIHRoZSB3b3Jrc2hlZXQuIFRoZW4KLSAgICAgICAgLy8vIHNldCB0aGUgcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UgcmV0dXJuZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbGxlY3Rpb24iLz4KLSAgICAgICAgcHVibGljIEV4Y2VsQ29uZGl0aW9uYWxGb3JtYXR0aW5nQ29sbGVjdGlvbiBDb25kaXRpb25hbEZvcm1hdHRpbmcKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2hlY2tTaGVldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoX2NvbmRpdGlvbmFsRm9ybWF0dGluZyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2NvbmRpdGlvbmFsRm9ybWF0dGluZyA9IG5ldyBFeGNlbENvbmRpdGlvbmFsRm9ybWF0dGluZ0NvbGxlY3Rpb24odGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfY29uZGl0aW9uYWxGb3JtYXR0aW5nOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24gX2RhdGFWYWxpZGF0aW9uID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGF0YVZhbGlkYXRpb24gZGVmaW5lZCBpbiB0aGUgd29ya3NoZWV0LiBVc2UgdGhlIEFkZCBtZXRob2RzIHRvIGNyZWF0ZSBEYXRhVmFsaWRhdGlvbnMgYW5kIGFkZCB0aGVtIHRvIHRoZSB3b3Jrc2hlZXQuIFRoZW4KLSAgICAgICAgLy8vIHNldCB0aGUgcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UgcmV0dXJuZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJFeGNlbERhdGFWYWxpZGF0aW9uQ29sbGVjdGlvbiIvPgotICAgICAgICBwdWJsaWMgRXhjZWxEYXRhVmFsaWRhdGlvbkNvbGxlY3Rpb24gRGF0YVZhbGlkYXRpb25zCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENoZWNrU2hlZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKF9kYXRhVmFsaWRhdGlvbiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2RhdGFWYWxpZGF0aW9uID0gbmV3IEV4Y2VsRGF0YVZhbGlkYXRpb25Db2xsZWN0aW9uKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2RhdGFWYWxpZGF0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIGludGVybmFsIHZvaWQgVXBkYXRlQ2VsbHNXaXRoRGF0ZTE5MDRTZXR0aW5nKCkgeworICAgIHZhciBjc2UgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihfdmFsdWVzKTsKKyAgICB2YXIgb2Zmc2V0ID0gV29ya2Jvb2suRGF0ZTE5MDQgPyAtRXhjZWxXb3JrYm9vay5fZGF0ZTE5MDRPZmZzZXQgOiBFeGNlbFdvcmtib29rLl9kYXRlMTkwNE9mZnNldDsKKyAgICB3aGlsZSAoY3NlLk1vdmVOZXh0KCkpIHsKKyAgICAgIGlmIChjc2UuVmFsdWUgaXMgRGF0ZVRpbWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBkb3VibGUgc2R2ID0gKChEYXRlVGltZSljc2UuVmFsdWUpLlRvT0FEYXRlKCk7CisgICAgICAgICAgc2R2ICs9IG9mZnNldDsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0JCS8vLyBSZXR1cm5zIHRoZSBzdHlsZSBJRCBnaXZlbiBhIHN0eWxlIG5hbWUuICAKLQkJLy8vIFRoZSBzdHlsZSBJRCB3aWxsIGJlIGNyZWF0ZWQgaWYgbm90IGZvdW5kLCBidXQgb25seSBpZiB0aGUgc3R5bGUgbmFtZSBleGlzdHMhCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iU3R5bGVOYW1lIj48L3BhcmFtPgotCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotCQlpbnRlcm5hbCBpbnQgR2V0U3R5bGVJRChzdHJpbmcgU3R5bGVOYW1lKQotCQl7Ci0JCQlFeGNlbE5hbWVkU3R5bGVYbWwgbmFtZWRTdHlsZT1udWxsOwotICAgICAgICAgICAgV29ya2Jvb2suU3R5bGVzLk5hbWVkU3R5bGVzLkZpbmRCeUlEKFN0eWxlTmFtZSwgcmVmIG5hbWVkU3R5bGUpOwotICAgICAgICAgICAgaWYgKG5hbWVkU3R5bGUuWGZJZCA9PSBpbnQuTWluVmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZWRTdHlsZS5YZklkPVdvcmtib29rLlN0eWxlcy5DZWxsWGZzLkZpbmRJbmRleEJ5SUQobmFtZWRTdHlsZS5TdHlsZS5JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmFtZWRTdHlsZS5YZklkOwotCQl9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB3b3JrYm9vayBvYmplY3QKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsV29ya2Jvb2sgV29ya2Jvb2sKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9wYWNrYWdlLldvcmtib29rOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JCSNlbmRyZWdpb24KLSAgICAgICAgI2VuZHJlZ2lvbiAgLy8gRU5EIFdvcmtzaGVldCBQcml2YXRlIE1ldGhvZHMKKyAgICAgICAgICBjc2UuVmFsdWUgPSBEYXRlVGltZS5Gcm9tT0FEYXRlKHNkdik7CisgICAgICAgIH0gY2F0Y2gge30KKyAgICAgIH0KKyAgICB9CisgIH0KIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXQgdGhlIG5leHQgSUQgZnJvbSBhIHNoYXJlZCBmb3JtdWxhIG9yIGFuIEFycmF5IGZvcm11bGEKLSAgICAgICAgLy8vIFNoYXJlZGZvcnVtbGFzIHdpbGwgaGF2ZSBhbiBpZCBmcm9tIDAteC4gQXJyYXkgZm9ybXVsYSBpZHMgc3RhcnQgZnJvbSAweDQwMDAwMDEtLiAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpc0FycmF5Ij5JZiB0aGUgZm9ybXVsYSBpcyBhbiBhcnJheSBmb3JtdWxhPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgaW50IEdldE1heFNoYXJlRnVuY3Rpb25JbmRleChib29sIGlzQXJyYXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpPV9zaGFyZWRGb3JtdWxhcy5Db3VudCArIDE7Ci0gICAgICAgICAgICBpZiAoaXNBcnJheSkKLSAgICAgICAgICAgICAgICBpIHw9IDB4NDAwMDAwMDA7CisgIHB1YmxpYyBzdHJpbmcgR2V0Rm9ybXVsYShpbnQgcm93LCBpbnQgY29sKSB7CisgICAgdmFyIHYgPSBfZm9ybXVsYXMuR2V0VmFsdWUocm93LCBjb2wpOworICAgIGlmICh2IGlzIGludCkgeworICAgICAgcmV0dXJuIF9zaGFyZWRGb3JtdWxhc1soaW50KXZdLkdldEZvcm11bGEocm93LCBjb2wsIE5hbWUpOworICAgIH0KKyAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICByZXR1cm4gdi5Ub1N0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gIiI7CisgIH0KIAotICAgICAgICAgICAgd2hpbGUoX3NoYXJlZEZvcm11bGFzLkNvbnRhaW5zS2V5KGkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHZvaWQgU2V0SEZMZWdhY3lEcmF3aW5nUmVsKHN0cmluZyByZWxJRCkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiZDpsZWdhY3lEcmF3aW5nSEYvQHI6aWQiLCByZWxJRCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBSZW1vdmVMZWdhY3lEcmF3aW5nUmVsKHN0cmluZyByZWxJRCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG4gPSBXb3Jrc2hlZXRYbWwuRG9jdW1lbnRFbGVtZW50LlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiZDpsZWdhY3lEcmF3aW5nW0ByOmlkPVwiezB9XCJdIiwgcmVsSUQpLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGlmIChuICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbi5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKG4pOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHB1YmxpYyBzdHJpbmcgR2V0Rm9ybXVsYVIxQzEoaW50IHJvdywgaW50IGNvbCkgeworICAgIHZhciB2ID0gX2Zvcm11bGFzLkdldFZhbHVlKHJvdywgY29sKTsKKyAgICBpZiAodiBpcyBpbnQpIHsKKyAgICAgIHZhciBzZiA9IF9zaGFyZWRGb3JtdWxhc1soaW50KXZdOworICAgICAgcmV0dXJuIEV4Y2VsQ2VsbEJhc2UuVHJhbnNsYXRlVG9SMUMxKAorICAgICAgICAgIEZvcm11bGFzLlJlbW92ZUR1bW15RnVuY3Rpb24oc2YuRm9ybXVsYSksCisgICAgICAgICAgc2YuU3RhcnRSb3csCisgICAgICAgICAgc2YuU3RhcnRDb2wpOworICAgIH0KKyAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICByZXR1cm4gRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVUb1IxQzEoRm9ybXVsYXMuUmVtb3ZlRHVtbXlGdW5jdGlvbih2LlRvU3RyaW5nKCkpLCByb3csIGNvbCk7CisgICAgfQorICAgIHJldHVybiAiIjsKKyAgfQogCi0gICAgICAgIGludGVybmFsIHZvaWQgVXBkYXRlQ2VsbHNXaXRoRGF0ZTE5MDRTZXR0aW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGNzZSA9IG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KF92YWx1ZXMpOwotICAgICAgICAgICAgdmFyIG9mZnNldCA9IFdvcmtib29rLkRhdGUxOTA0ID8gLUV4Y2VsV29ya2Jvb2suZGF0ZTE5MDRPZmZzZXQgOiBFeGNlbFdvcmtib29rLmRhdGUxOTA0T2Zmc2V0OwotICAgICAgICAgICAgd2hpbGUoY3NlLk1vdmVOZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNzZS5WYWx1ZSBpcyBEYXRlVGltZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2R2ID0gKChEYXRlVGltZSljc2UuVmFsdWUpLlRvT0FEYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZHYgKz0gb2Zmc2V0OworICBwdWJsaWMgc3RyaW5nIEdldEZvcm11bGFSMUMxX1YxKGludCByb3csIGludCBjb2wpIHsKKyAgICB2YXIgdiA9IF9mb3JtdWxhcy5HZXRWYWx1ZShyb3csIGNvbCk7CisgICAgaWYgKHYgaXMgaW50KSB7CisgICAgICB2YXIgc2YgPSBfc2hhcmVkRm9ybXVsYXNbKGludCl2XTsKKyAgICAgIHJldHVybiBFeGNlbENlbGxCYXNlLlRyYW5zbGF0ZVRvUjFDMV9WMSgKKyAgICAgICAgICBGb3JtdWxhcy5SZW1vdmVEdW1teUZ1bmN0aW9uKHNmLkZvcm11bGEpLAorICAgICAgICAgIHNmLlN0YXJ0Um93LAorICAgICAgICAgIHNmLlN0YXJ0Q29sKTsKKyAgICB9CisgICAgaWYgKHYgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIEV4Y2VsQ2VsbEJhc2UuVHJhbnNsYXRlVG9SMUMxX1YxKEZvcm11bGFzLlJlbW92ZUR1bW15RnVuY3Rpb24odi5Ub1N0cmluZygpKSwgcm93LCBjb2wpOworICAgIH0KKyAgICByZXR1cm4gIiI7CisgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgY3NlLlZhbHVlID0gRGF0ZVRpbWUuRnJvbU9BRGF0ZShzZHYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgc3RyaW5nIEdldEZvcm11bGEoaW50IHJvdywgaW50IGNvbCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHYgPSBfZm9ybXVsYXMuR2V0VmFsdWUocm93LCBjb2wpOwotICAgICAgICAgICAgaWYgKHYgaXMgaW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc2hhcmVkRm9ybXVsYXNbKGludCl2XS5HZXRGb3JtdWxhKHJvdyxjb2wsIE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB2LlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgR2V0Rm9ybXVsYVIxQzEoaW50IHJvdywgaW50IGNvbCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHYgPSBfZm9ybXVsYXMuR2V0VmFsdWUocm93LCBjb2wpOwotICAgICAgICAgICAgaWYgKHYgaXMgaW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzZiA9IF9zaGFyZWRGb3JtdWxhc1soaW50KXZdOwotICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbENlbGxCYXNlLlRyYW5zbGF0ZVRvUjFDMShGb3JtdWxhcy5SZW1vdmVEdW1teUZ1bmN0aW9uKHNmLkZvcm11bGEpLCBzZi5TdGFydFJvdywgc2YuU3RhcnRDb2wpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbENlbGxCYXNlLlRyYW5zbGF0ZVRvUjFDMShGb3JtdWxhcy5SZW1vdmVEdW1teUZ1bmN0aW9uKHYuVG9TdHJpbmcoKSksIHJvdywgY29sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgcHVibGljIGJvb2wgSXNBcnJheUZvcm11bGEoaW50IHJvdywgaW50IGNvbCkgPT4KKyAgICBfZmxhZ3MuR2V0RmxhZ1ZhbHVlKHJvdywgY29sLCBDZWxsRmxhZ3MuQXJyYXlGb3JtdWxhKTsKIAotICAgICAgICBwdWJsaWMgc3RyaW5nIEdldEZvcm11bGFSMUMxX1YxKGludCByb3csIGludCBjb2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB2ID0gX2Zvcm11bGFzLkdldFZhbHVlKHJvdywgY29sKTsKLSAgICAgICAgICAgIGlmICh2IGlzIGludCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc2YgPSBfc2hhcmVkRm9ybXVsYXNbKGludCl2XTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVUb1IxQzFfVjEoRm9ybXVsYXMuUmVtb3ZlRHVtbXlGdW5jdGlvbihzZi5Gb3JtdWxhKSwgc2YuU3RhcnRSb3csIHNmLlN0YXJ0Q29sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHYgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxDZWxsQmFzZS5UcmFuc2xhdGVUb1IxQzFfVjEoRm9ybXVsYXMuUmVtb3ZlRHVtbXlGdW5jdGlvbih2LlRvU3RyaW5nKCkpLCByb3csIGNvbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHB1YmxpYyBzdHJpbmcgR2V0QXJyYXlGb3JtdWxhQWRkcmVzcyhpbnQgcm93LCBpbnQgY29sKSB7CisgICAgdmFyIHYgPSBfZm9ybXVsYXMuR2V0VmFsdWUocm93LCBjb2wpOworICAgIGlmICgodiBpcyBpbnQpICYmIChfc2hhcmVkRm9ybXVsYXNbKGludCl2XS5Jc0FycmF5KSkgeworICAgICAgcmV0dXJuIF9zaGFyZWRGb3JtdWxhc1soaW50KXZdLkFkZHJlc3M7CisgICAgfQorICAgIHJldHVybiAiIjsKKyAgfQogCi0gICAgICAgIHB1YmxpYyBib29sIElzQXJyYXlGb3JtdWxhKGludCByb3csIGludCBjb2wpID0+IF9mbGFncy5HZXRGbGFnVmFsdWUocm93LCBjb2wsIENlbGxGbGFncy5BcnJheUZvcm11bGEpOwotICAgICAgICAKLSAgICAgICAgcHVibGljIHN0cmluZyBHZXRBcnJheUZvcm11bGFBZGRyZXNzKGludCByb3csIGludCBjb2wpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB2ID0gX2Zvcm11bGFzLkdldFZhbHVlKHJvdywgY29sKTsKLSAgICAgICAgICAgIGlmICgodiBpcyBpbnQpICYmIChfc2hhcmVkRm9ybXVsYXNbKGludCl2XS5Jc0FycmF5KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3NoYXJlZEZvcm11bGFzWyhpbnQpdl0uQWRkcmVzczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBpbnQgR2V0U3R5bGVJZChpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgICAgICBpbnQgc3R5bGVJZCA9IDA7Ci0gICAgICAgICAgICBpZiAoIV9zdHlsZXMuRXhpc3RzKHJvdywgY29sLCByZWYgc3R5bGVJZCkgJiYgIV9zdHlsZXMuRXhpc3RzKHJvdywgMCwgcmVmIHN0eWxlSWQpKSAgewotICAgICAgICAgICAgICAgIHN0eWxlSWQgPSBfc3R5bGVzLkdldFZhbHVlKDAsIGNvbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3R5bGVJZDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0IHRoZSBFeGNlbENvbHVtbiBmb3IgY29sdW1uIChzcGFuIENvbHVtbk1pbiBhbmQgQ29sdW1uTWF4KQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxDb2x1bW4gR2V0Q29sdW1uKGludCBjb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjID0gX3ZhbHVlcy5HZXRWYWx1ZSgwLCBjb2x1bW4pIGFzIEV4Y2VsQ29sdW1uOwotICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgcm93ID0gMCwgY29sID0gY29sdW1uOwotICAgICAgICAgICAgICAgIGlmIChfdmFsdWVzLlByZXZDZWxsKHJlZiByb3csIHJlZiBjb2wpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYyA9IF92YWx1ZXMuR2V0VmFsdWUoMCwgY29sKSBhcyBFeGNlbENvbHVtbjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLkNvbHVtbk1heCA+PSBjb2x1bW4pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjOworICBwdWJsaWMgaW50IEdldFN0eWxlSWQoaW50IHJvdywgaW50IGNvbCkgeworICAgIGludCBzdHlsZUlkID0gMDsKKyAgICBpZiAoIV9zdHlsZXMuRXhpc3RzKHJvdywgY29sLCByZWYgc3R5bGVJZCkgJiYgIV9zdHlsZXMuRXhpc3RzKHJvdywgMCwgcmVmIHN0eWxlSWQpKSB7CisgICAgICBzdHlsZUlkID0gX3N0eWxlcy5HZXRWYWx1ZSgwLCBjb2wpOworICAgIH0KKyAgICByZXR1cm4gc3R5bGVJZDsKKyAgfQogCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldCB0aGUgRXhjZWxDb2x1bW4gZm9yIGNvbHVtbiAoc3BhbiBDb2x1bW5NaW4gYW5kIENvbHVtbk1heCkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIGludGVybmFsIEV4Y2VsQ29sdW1uIEdldENvbHVtbihpbnQgY29sdW1uKSB7CisgICAgdmFyIGMgPSBfdmFsdWVzLkdldFZhbHVlKDAsIGNvbHVtbikgYXMgRXhjZWxDb2x1bW47CisgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgaW50IHJvdyA9IDAsCisgICAgICAgICAgY29sID0gY29sdW1uOworICAgICAgaWYgKF92YWx1ZXMuUHJldkNlbGwocmVmIHJvdywgcmVmIGNvbCkpIHsKKyAgICAgICAgYyA9IF92YWx1ZXMuR2V0VmFsdWUoMCwgY29sKSBhcyBFeGNlbENvbHVtbjsKKyAgICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLkNvbHVtbk1heCA+PSBjb2x1bW4pIHsKKyAgICAgICAgICByZXR1cm4gYzsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGM7CisgIH0KIAotICAgICAgICBwdWJsaWMgYm9vbCBFcXVhbHMoRXhjZWxXb3Jrc2hlZXQgeCwgRXhjZWxXb3Jrc2hlZXQgeSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHguTmFtZSA9PSB5Lk5hbWUgJiYgeC5TaGVldElEID09IHkuU2hlZXRJRCAmJiB4LldvcmtzaGVldFhtbC5PdXRlclhtbCA9PSB5LldvcmtzaGVldFhtbC5PdXRlclhtbDsKLSAgICAgICAgfQorICBwdWJsaWMgYm9vbCBFcXVhbHMoRXhjZWxXb3Jrc2hlZXQgeCwgRXhjZWxXb3Jrc2hlZXQgeSkgeworICAgIHJldHVybiB4Lk5hbWUgPT0geS5OYW1lCisgICAgICAgICYmIHguU2hlZXRJRCA9PSB5LlNoZWV0SUQKKyAgICAgICAgJiYgeC5Xb3Jrc2hlZXRYbWwuT3V0ZXJYbWwgPT0geS5Xb3Jrc2hlZXRYbWwuT3V0ZXJYbWw7CisgIH0KIAotICAgICAgICBwdWJsaWMgaW50IEdldEhhc2hDb2RlKEV4Y2VsV29ya3NoZWV0IG9iaikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG9iai5Xb3Jrc2hlZXRYbWwuT3V0ZXJYbWwuR2V0SGFzaENvZGUoKTsKLSAgICAgICAgfQotCX0gIC8vIEVORCBjbGFzcyBXb3Jrc2hlZXQKKyAgcHVibGljIGludCBHZXRIYXNoQ29kZShFeGNlbFdvcmtzaGVldCBvYmopIHsKKyAgICByZXR1cm4gb2JqLldvcmtzaGVldFhtbC5PdXRlclhtbC5HZXRIYXNoQ29kZSgpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRXhjZWxXb3Jrc2hlZXRWaWV3LmNzIGIvRVBQbHVzL0V4Y2VsV29ya3NoZWV0Vmlldy5jcwppbmRleCAyNTRhMGQwLi5jMzA0N2EyIDEwMDY0NAotLS0gYS9FUFBsdXMvRXhjZWxXb3Jrc2hlZXRWaWV3LmNzCisrKyBiL0VQUGx1cy9FeGNlbFdvcmtzaGVldFZpZXcuY3MKQEAgLTQsNyArNCw3IEBACiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgogICogU2VlIGh0dHA6Ly93d3cuY29kZXBsZXguY29tL0VQUGx1cyBmb3IgZGV0YWlscy4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBL5GxsbWFuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBL77+9bGxtYW4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC0xMyw0NTUgKzEzLDM4OCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS+RsbG1hbgkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgIDIwMDktMTAtMDEKLSAqIEphbiBL5GxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0yNworICogSmFuIEvvv71sbG1hbgkJICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgIDIwMDktMTAtMDEKKyAqIEphbiBL77+9bGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLlhtbDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKLQkvLy8gPHN1bW1hcnk+Ci0JLy8vIFJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCB2aWV3IHN0YXRlcyBvZiB0aGUgd29ya3NoZWV0Ci0JLy8vIDwvc3VtbWFyeT4KLQlwdWJsaWMgY2xhc3MgRXhjZWxXb3Jrc2hlZXRWaWV3IDogWG1sSGVscGVyCi0JewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgd29ya3NoZWV0IHBhbmVzIGFmdGVyIGEgZnJlZXplIG9yIHNwbGl0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgY2xhc3MgRXhjZWxXb3Jrc2hlZXRQYW5lcyA6IFhtbEhlbHBlcgotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxFbGVtZW50IF9zZWxlY3Rpb25Ob2RlID0gbnVsbDsKLSAgICAgICAgICAgIGludGVybmFsIEV4Y2VsV29ya3NoZWV0UGFuZXMoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlKSA6Ci0gICAgICAgICAgICAgICAgYmFzZShucywgdG9wTm9kZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih0b3BOb2RlLk5hbWU9PSJzZWxlY3Rpb24iKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3NlbGVjdGlvbk5vZGU9dG9wTm9kZSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOwogCi0gICAgICAgICAgICBjb25zdCBzdHJpbmcgX2FjdGl2ZUNlbGxQYXRoID0gIkBhY3RpdmVDZWxsIjsKLSAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyBTZXQgdGhlIGFjdGl2ZSBjZWxsLiBNdXN0IGJlIHNldCB3aXRoaW4gdGhlIFNlbGVjdGVkUmFuZ2UuCi0gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgcHVibGljIHN0cmluZyBBY3RpdmVDZWxsCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYWRkcmVzcyA9IEdldFhtbE5vZGVTdHJpbmcoX2FjdGl2ZUNlbGxQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gIiIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQTEiOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBhZGRyZXNzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBmcm9tQ29sLCBmcm9tUm93LCB0b0NvbCwgdG9Sb3c7Ci0gICAgICAgICAgICAgICAgICAgIGlmKF9zZWxlY3Rpb25Ob2RlPT1udWxsKSBDcmVhdGVTZWxlY3Rpb25FbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0Um93Q29sRnJvbUFkZHJlc3ModmFsdWUsIG91dCBmcm9tUm93LCBvdXQgZnJvbUNvbCwgb3V0IHRvUm93LCBvdXQgdG9Db2wpOwotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9hY3RpdmVDZWxsUGF0aCwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoKChYbWxFbGVtZW50KVRvcE5vZGUpLkdldEF0dHJpYnV0ZSgic3FyZWYiKSA9PSAiIikKLSAgICAgICAgICAgICAgICAgICAgeworLy8vIDxzdW1tYXJ5PgorLy8vIFJlcHJlc2VudHMgdGhlIGRpZmZlcmVudCB2aWV3IHN0YXRlcyBvZiB0aGUgd29ya3NoZWV0CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsV29ya3NoZWV0VmlldyA6IFhtbEhlbHBlciB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSB3b3Jrc2hlZXQgcGFuZXMgYWZ0ZXIgYSBmcmVlemUgb3Igc3BsaXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBjbGFzcyBFeGNlbFdvcmtzaGVldFBhbmVzIDogWG1sSGVscGVyIHsKKyAgICBwcml2YXRlIFhtbEVsZW1lbnQgX3NlbGVjdGlvbk5vZGU7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkUmFuZ2UgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZnJvbVJvdywgZnJvbUNvbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE86QWRkIGZpeCBmb3Igb3V0IG9mIHJhbmdlIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIENyZWF0ZVNlbGVjdGlvbkVsZW1lbnQoKQotICAgICAgICAgICAgewotIAkgICAgICAgICAgICBfc2VsZWN0aW9uTm9kZT1Ub3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgic2VsZWN0aW9uIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotICAgICAgICAgICAgICAgIFRvcE5vZGUuQXBwZW5kQ2hpbGQoX3NlbGVjdGlvbk5vZGUpOwotICAgICAgICAgICAgICAgIFRvcE5vZGU9X3NlbGVjdGlvbk5vZGU7ICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29uc3Qgc3RyaW5nIF9zZWxlY3Rpb25SYW5nZVBhdGggPSAiQHNxcmVmIjsKLSAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyBTZWxlY3RlZCBDZWxscy5Vc2VkIGluIGNvbWJpbmF0aW9uIHdpdGggQWN0aXZlQ2VsbAotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4gICAgICAgIAotICAgICAgICAgICAgcHVibGljIHN0cmluZyBTZWxlY3RlZFJhbmdlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYWRkcmVzcyA9IEdldFhtbE5vZGVTdHJpbmcoX3NlbGVjdGlvblJhbmdlUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzID09ICIiKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkExIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkcmVzczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgZnJvbUNvbCwgZnJvbVJvdywgdG9Db2wsIHRvUm93OwotICAgICAgICAgICAgICAgICAgICBpZihfc2VsZWN0aW9uTm9kZT09bnVsbCkgQ3JlYXRlU2VsZWN0aW9uRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBFeGNlbENlbGxCYXNlLkdldFJvd0NvbEZyb21BZGRyZXNzKHZhbHVlLCBvdXQgZnJvbVJvdywgb3V0IGZyb21Db2wsIG91dCB0b1Jvdywgb3V0IHRvQ29sKTsKLSAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc2VsZWN0aW9uUmFuZ2VQYXRoLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoKFhtbEVsZW1lbnQpVG9wTm9kZSkuR2V0QXR0cmlidXRlKCJhY3RpdmVDZWxsIikgPT0gIiIpCi0gICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZlQ2VsbCA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhmcm9tUm93LCBmcm9tQ29sKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETzpBZGQgZml4IGZvciBvdXQgb2YgcmFuZ2UgaGVyZQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JCXByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dvcmtzaGVldDsKLQotCQkjcmVnaW9uIEV4Y2VsV29ya3NoZWV0VmlldyBDb25zdHJ1Y3RvcgotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBDcmVhdGVzIGEgbmV3IEV4Y2VsV29ya3NoZWV0VmlldyB3aGljaCBwcm92aWRlcyBhY2Nlc3MgdG8gYWxsIHRoZSB2aWV3IHN0YXRlcyBvZiB0aGUgd29ya3NoZWV0LgotCQkvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5zIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5vZGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ieGxXb3Jrc2hlZXQiPjwvcGFyYW0+Ci0JCWludGVybmFsIEV4Y2VsV29ya3NoZWV0VmlldyhYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIG5vZGUsICBFeGNlbFdvcmtzaGVldCB4bFdvcmtzaGVldCkgOgotICAgICAgICAgICAgYmFzZShucywgbm9kZSkKLQkJewotICAgICAgICAgICAgX3dvcmtzaGVldCA9IHhsV29ya3NoZWV0OwotICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgInNoZWV0Vmlld3MiLCAic2hlZXRWaWV3IiwgInBhbmUiLCAic2VsZWN0aW9uIiB9OwotICAgICAgICAgICAgUGFuZXMgPSBMb2FkUGFuZXMoKTsgCi0JCX0KLQotCQkjZW5kcmVnaW9uCi0gICAgICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXRQYW5lc1tdIExvYWRQYW5lcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE5vZGVMaXN0IG5vZGVzID0gVG9wTm9kZS5TZWxlY3ROb2RlcygiLy9kOnNlbGVjdGlvbiIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgaWYobm9kZXMuQ291bnQ9PTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbFdvcmtzaGVldFBhbmVzW10geyBuZXcgRXhjZWxXb3Jrc2hlZXRQYW5lcyhOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlKSB9OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0UGFuZXNbXSBwYW5lcyA9IG5ldyBFeGNlbFdvcmtzaGVldFBhbmVzW25vZGVzLkNvdW50XTsKLSAgICAgICAgICAgICAgICBpbnQgaT0wOwotICAgICAgICAgICAgICAgIGZvcmVhY2goWG1sRWxlbWVudCBlbGVtIGluIG5vZGVzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGFuZXNbaSsrXSA9IG5ldyBFeGNlbFdvcmtzaGVldFBhbmVzKE5hbWVTcGFjZU1hbmFnZXIsIGVsZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcGFuZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJI3JlZ2lvbiBTaGVldFZpZXdFbGVtZW50Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHNoZWV0VmlldyBlbGVtZW50Ci0JCS8vLyA8L3N1bW1hcnk+Ci0JCXByb3RlY3RlZCBpbnRlcm5hbCBYbWxFbGVtZW50IFNoZWV0Vmlld0VsZW1lbnQKLQkJewotCQkJZ2V0IAotCQkJewotCQkJCXJldHVybiAoWG1sRWxlbWVudClUb3BOb2RlOwotCQkJfQotCQl9Ci0JCSNlbmRyZWdpb24KLQkJI3JlZ2lvbiBUYWJTZWxlY3RlZAotICAgICAgICBwcml2YXRlIFhtbEVsZW1lbnQgX3NlbGVjdGlvbk5vZGUgPSBudWxsOwotICAgICAgICBwcml2YXRlIFhtbEVsZW1lbnQgU2VsZWN0aW9uTm9kZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfc2VsZWN0aW9uTm9kZSA9IFNoZWV0Vmlld0VsZW1lbnQuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOnNlbGVjdGlvbiIsIF93b3Jrc2hlZXQuTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKLSAgICAgICAgICAgICAgICBpZiAoX3NlbGVjdGlvbk5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9zZWxlY3Rpb25Ob2RlID0gX3dvcmtzaGVldC5Xb3Jrc2hlZXRYbWwuQ3JlYXRlRWxlbWVudCgic2VsZWN0aW9uIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotICAgICAgICAgICAgICAgICAgICBTaGVldFZpZXdFbGVtZW50LkFwcGVuZENoaWxkKF9zZWxlY3Rpb25Ob2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zZWxlY3Rpb25Ob2RlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgI3JlZ2lvbiBQdWJsaWMgTWV0aG9kcyAmIFByb3BlcnRpZXMKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGFjdGl2ZSBjZWxsLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIEFjdGl2ZUNlbGwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBhbmVzW1BhbmVzLkdldFVwcGVyQm91bmQoMCldLkFjdGl2ZUNlbGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFuZXNbUGFuZXMuR2V0VXBwZXJCb3VuZCgwKV0uQWN0aXZlQ2VsbCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNlbGVjdGVkIENlbGxzIGluIHRoZSB3b3Jrc2hlZXQuVXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIEFjdGl2ZUNlbGwKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBTZWxlY3RlZFJhbmdlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBQYW5lc1tQYW5lcy5HZXRVcHBlckJvdW5kKDApXS5TZWxlY3RlZFJhbmdlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUGFuZXNbUGFuZXMuR2V0VXBwZXJCb3VuZCgwKV0uU2VsZWN0ZWRSYW5nZSA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluZGljYXRlcyBpZiB0aGUgd29ya3NoZWV0IGlzIHNlbGVjdGVkIHdpdGhpbiB0aGUgd29ya2Jvb2sKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgVGFiU2VsZWN0ZWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAdGFiU2VsZWN0ZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIC8vIGVuc3VyZSBubyBvdGhlciB3b3Jrc2hlZXQgaGFzIGl0cyB0YWJTZWxlY3RlZCBhdHRyaWJ1dGUgc2V0IHRvIDEKLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxXb3Jrc2hlZXQgc2hlZXQgaW4gX3dvcmtzaGVldC5fcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzKQotICAgICAgICAgICAgICAgICAgICAgICAgc2hlZXQuVmlldy5UYWJTZWxlY3RlZCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgICAgIFNoZWV0Vmlld0VsZW1lbnQuU2V0QXR0cmlidXRlKCJ0YWJTZWxlY3RlZCIsICIxIik7Ci0gICAgICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgYm9va1ZpZXcgPSBfd29ya3NoZWV0Lldvcmtib29rLldvcmtib29rWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDp3b3JrYm9va1ZpZXciLCBfd29ya3NoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChib29rVmlldyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib29rVmlldy5TZXRBdHRyaWJ1dGUoImFjdGl2ZVRhYiIsIChfd29ya3NoZWV0LlBvc2l0aW9uSUQgLSAxKS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkB0YWJTZWxlY3RlZCIsICIwIik7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFNldHMgdGhlIHZpZXcgbW9kZSBvZiB0aGUgd29ya3NoZWV0IHRvIHBhZ2VsYXlvdXQKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIGJvb2wgUGFnZUxheW91dFZpZXcKLQkJewotCQkJZ2V0Ci0JCQl7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkB2aWV3IikgPT0gInBhZ2VMYXlvdXQiOwotCQkJfQotCQkJc2V0Ci0JCQl7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAdmlldyIsICJwYWdlTGF5b3V0Iik7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBTaGVldFZpZXdFbGVtZW50LlJlbW92ZUF0dHJpYnV0ZSgidmlldyIpOwotCQkJfQotCQl9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNldHMgdGhlIHZpZXcgbW9kZSBvZiB0aGUgd29ya3NoZWV0IHRvIHBhZ2VicmVhawotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBQYWdlQnJlYWtWaWV3Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJAdmlldyIpID09ICJwYWdlQnJlYWtQcmV2aWV3IjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHZpZXciLCAicGFnZUJyZWFrUHJldmlldyIpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgU2hlZXRWaWV3RWxlbWVudC5SZW1vdmVBdHRyaWJ1dGUoInZpZXciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTaG93IGdyaWRsaW5lcyBpbiB0aGUgd29ya3NoZWV0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFNob3dHcmlkTGluZXMgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQHNob3dHcmlkTGluZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBzaG93R3JpZExpbmVzIiwgdmFsdWUgPyAiMSIgOiAiMCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNob3cgdGhlIENvbHVtbi9Sb3cgaGVhZGVycyAoY29udGFpbmcgY29sdW1uIGxldHRlcnMgYW5kIHJvdyBudW1iZXJzKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93SGVhZGVycwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBzaG93Um93Q29sSGVhZGVycyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHNob3dSb3dDb2xIZWFkZXJzIiwgdmFsdWUgPyAiMSIgOiAiMCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdpbmRvdyB6b29tIG1hZ25pZmljYXRpb24gZm9yIGN1cnJlbnQgdmlldyByZXByZXNlbnRpbmcgcGVyY2VudCB2YWx1ZXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgWm9vbVNjYWxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KCJAem9vbVNjYWxlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAxMCB8fCB2YWx1ZSA+IDQwMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlpvb21lIHNjYWxlIG91dCBvZiByYW5nZSAoMTAtNDAwKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAem9vbVNjYWxlIiwgdmFsdWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNoZWV0IGlzIGluICdyaWdodCB0byBsZWZ0JyBkaXNwbGF5IG1vZGUuIFdoZW4gaW4gdGhpcyBtb2RlLENvbHVtbiBBIGlzIG9uIHRoZSBmYXIgcmlnaHQsIENvbHVtbiBCIDtpcyBvbmUgY29sdW1uIGxlZnQgb2YgQ29sdW1uIEEsIGFuZCBzbyBvbi4gQWxzbyxpbmZvcm1hdGlvbiBpbiBjZWxscyBpcyBkaXNwbGF5ZWQgaW4gdGhlIFJpZ2h0IHRvIExlZnQgZm9ybWF0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBSaWdodFRvTGVmdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkByaWdodFRvTGVmdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHJpZ2h0VG9MZWZ0IiwgdmFsdWUgPT0gdHJ1ZSA/ICIxIiA6ICIwIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgYm9vbCBXaW5kb3dQcm90ZWN0aW9uIAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkB3aW5kb3dQcm90ZWN0aW9uIixmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQHdpbmRvd1Byb3RlY3Rpb24iLHZhbHVlLGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZWZlcmVuY2UgdG8gdGhlIHBhbmVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFdvcmtzaGVldFBhbmVzW10gUGFuZXMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgaW50ZXJuYWwgc2V0OwotICAgICAgICB9Ci0gICAgICAgIHN0cmluZyBfcGFuZU5vZGVQYXRoID0gImQ6cGFuZSI7Ci0gICAgICAgIHN0cmluZyBfc2VsZWN0aW9uTm9kZVBhdGggPSAiZDpzZWxlY3Rpb24iOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGcmVlemUgdGhlIGNvbHVtbnMvcm93cyB0byBsZWZ0IGFuZCBhYm92ZSB0aGUgY2VsbAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJvdyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJDb2x1bW4iPjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIEZyZWV6ZVBhbmVzKGludCBSb3csIGludCBDb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vVE9ETzpmaXggdGhpcyBtZXRob2QgdG8gaGFuZGxlIHNwbGl0cyBhcyB3ZWxsLgotICAgICAgICAgICAgaWYgKFJvdyA9PSAxICYmIENvbHVtbiA9PSAxKSBVbkZyZWV6ZVBhbmVzKCk7Ci0gICAgICAgICAgICBzdHJpbmcgc3FSZWYgPSBTZWxlY3RlZFJhbmdlLCBhY3RpdmVDZWxsID0gQWN0aXZlQ2VsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWG1sRWxlbWVudCBwYW5lTm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfcGFuZU5vZGVQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgaWYgKHBhbmVOb2RlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfcGFuZU5vZGVQYXRoKTsKLSAgICAgICAgICAgICAgICBwYW5lTm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfcGFuZU5vZGVQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFuZU5vZGUuUmVtb3ZlQWxsKCk7ICAgLy9DbGVhciBhbGwgYXR0cmlidXRlcwotICAgICAgICAgICAgaWYgKENvbHVtbiA+IDEpIHBhbmVOb2RlLlNldEF0dHJpYnV0ZSgieFNwbGl0IiwgKENvbHVtbiAtIDEpLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgaWYgKFJvdyA+IDEpIHBhbmVOb2RlLlNldEF0dHJpYnV0ZSgieVNwbGl0IiwgKFJvdyAtIDEpLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcGFuZU5vZGUuU2V0QXR0cmlidXRlKCJ0b3BMZWZ0Q2VsbCIsIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhSb3csIENvbHVtbikpOwotICAgICAgICAgICAgcGFuZU5vZGUuU2V0QXR0cmlidXRlKCJzdGF0ZSIsICJmcm96ZW4iKTsKLQotICAgICAgICAgICAgUmVtb3ZlU2VsZWN0aW9uKCk7Ci0KLSAgICAgICAgICAgIGlmIChSb3cgPiAxICYmIENvbHVtbj09MSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYW5lTm9kZS5TZXRBdHRyaWJ1dGUoImFjdGl2ZVBhbmUiLCAiYm90dG9tTGVmdCIpOwotICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgc2VsPVRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzZWxlY3Rpb24iLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICAgICAgc2VsLlNldEF0dHJpYnV0ZSgicGFuZSIsICJib3R0b21MZWZ0Iik7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUNlbGwgIT0gIiIpIHNlbC5TZXRBdHRyaWJ1dGUoImFjdGl2ZUNlbGwiLCBhY3RpdmVDZWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoc3FSZWYgIT0gIiIpIHNlbC5TZXRBdHRyaWJ1dGUoInNxcmVmIiwgc3FSZWYpOwotICAgICAgICAgICAgICAgIHNlbC5TZXRBdHRyaWJ1dGUoInNxcmVmIiwgc3FSZWYpOwotICAgICAgICAgICAgICAgIFRvcE5vZGUuSW5zZXJ0QWZ0ZXIoc2VsLCBwYW5lTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChDb2x1bW4gPiAxICYmIFJvdyA9PSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhbmVOb2RlLlNldEF0dHJpYnV0ZSgiYWN0aXZlUGFuZSIsICJ0b3BSaWdodCIpOwotICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgc2VsID0gVG9wTm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoInNlbGVjdGlvbiIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgICAgICBzZWwuU2V0QXR0cmlidXRlKCJwYW5lIiwgInRvcFJpZ2h0Iik7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUNlbGwgIT0gIiIpIHNlbC5TZXRBdHRyaWJ1dGUoImFjdGl2ZUNlbGwiLCBhY3RpdmVDZWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoc3FSZWYgIT0gIiIpIHNlbC5TZXRBdHRyaWJ1dGUoInNxcmVmIiwgc3FSZWYpOwotICAgICAgICAgICAgICAgIFRvcE5vZGUuSW5zZXJ0QWZ0ZXIoc2VsLCBwYW5lTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGFuZU5vZGUuU2V0QXR0cmlidXRlKCJhY3RpdmVQYW5lIiwgImJvdHRvbVJpZ2h0Iik7Ci0gICAgICAgICAgICAgICAgWG1sRWxlbWVudCBzZWwxID0gVG9wTm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoInNlbGVjdGlvbiIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgICAgICBzZWwxLlNldEF0dHJpYnV0ZSgicGFuZSIsICJ0b3BSaWdodCIpOwotICAgICAgICAgICAgICAgIHN0cmluZyBjZWxsID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKDEsIENvbHVtbik7Ci0gICAgICAgICAgICAgICAgc2VsMS5TZXRBdHRyaWJ1dGUoImFjdGl2ZUNlbGwiLCBjZWxsKTsKLSAgICAgICAgICAgICAgICBzZWwxLlNldEF0dHJpYnV0ZSgic3FyZWYiLCBjZWxsKTsKLSAgICAgICAgICAgICAgICBwYW5lTm9kZS5QYXJlbnROb2RlLkluc2VydEFmdGVyKHNlbDEsIHBhbmVOb2RlKTsKLQotICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgc2VsMiA9IFRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzZWxlY3Rpb24iLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICAgICAgY2VsbCA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhSb3csIDEpOwotICAgICAgICAgICAgICAgIHNlbDIuU2V0QXR0cmlidXRlKCJwYW5lIiwgImJvdHRvbUxlZnQiKTsKLSAgICAgICAgICAgICAgICBzZWwyLlNldEF0dHJpYnV0ZSgiYWN0aXZlQ2VsbCIsIGNlbGwpOwotICAgICAgICAgICAgICAgIHNlbDIuU2V0QXR0cmlidXRlKCJzcXJlZiIsIGNlbGwpOwotICAgICAgICAgICAgICAgIHNlbDEuUGFyZW50Tm9kZS5JbnNlcnRBZnRlcihzZWwyLCBzZWwxKTsKLQotICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgc2VsMyA9IFRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzZWxlY3Rpb24iLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICAgICAgc2VsMy5TZXRBdHRyaWJ1dGUoInBhbmUiLCAiYm90dG9tUmlnaHQiKTsKLSAgICAgICAgICAgICAgICBpZihhY3RpdmVDZWxsIT0iIikgc2VsMy5TZXRBdHRyaWJ1dGUoImFjdGl2ZUNlbGwiLCBhY3RpdmVDZWxsKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYoc3FSZWYhPSIiKSBzZWwzLlNldEF0dHJpYnV0ZSgic3FyZWYiLCBzcVJlZik7Ci0gICAgICAgICAgICAgICAgc2VsMi5QYXJlbnROb2RlLkluc2VydEFmdGVyKHNlbDMsIHNlbDIpOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQYW5lcz1Mb2FkUGFuZXMoKTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgUmVtb3ZlU2VsZWN0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9GaW5kIHNlbGVjdGlvbiBub2RlcyBhbmQgcmVtb3ZlIHRoZW0gICAgICAgICAgICAKLSAgICAgICAgICAgIFhtbE5vZGVMaXN0IHNlbGVjdGlvbnMgPSBUb3BOb2RlLlNlbGVjdE5vZGVzKF9zZWxlY3Rpb25Ob2RlUGF0aCwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICBmb3JlYWNoIChYbWxOb2RlIHNlbCBpbiBzZWxlY3Rpb25zKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlbC5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKHNlbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVW5sb2NrIGFsbCByb3dzIGFuZCBjb2x1bW5zIHRvIHNjcm9sbCBmcmVlbHkKLSAgICAgICAgLy8vIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFVuRnJlZXplUGFuZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcgc3FSZWYgPSBTZWxlY3RlZFJhbmdlLCBhY3RpdmVDZWxsID0gQWN0aXZlQ2VsbDsKLQotICAgICAgICAgICAgWG1sRWxlbWVudCBwYW5lTm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfcGFuZU5vZGVQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgaWYgKHBhbmVOb2RlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGFuZU5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChwYW5lTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSZW1vdmVTZWxlY3Rpb24oKTsKLQotICAgICAgICAgICAgUGFuZXM9TG9hZFBhbmVzKCk7Ci0KLSAgICAgICAgICAgIFNlbGVjdGVkUmFuZ2UgPSBzcVJlZjsKLSAgICAgICAgICAgIEFjdGl2ZUNlbGwgPSBhY3RpdmVDZWxsOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KKyAgICBpbnRlcm5hbCBFeGNlbFdvcmtzaGVldFBhbmVzKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgdG9wTm9kZSkKKyAgICAgICAgOiBiYXNlKG5zLCB0b3BOb2RlKSB7CisgICAgICBpZiAodG9wTm9kZS5OYW1lID09ICJzZWxlY3Rpb24iKSB7CisgICAgICAgIF9zZWxlY3Rpb25Ob2RlID0gdG9wTm9kZSBhcyBYbWxFbGVtZW50OworICAgICAgfQogICAgIH0KKworICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9hY3RpdmVDZWxsUGF0aCA9ICJAYWN0aXZlQ2VsbCI7CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFNldCB0aGUgYWN0aXZlIGNlbGwuIE11c3QgYmUgc2V0IHdpdGhpbiB0aGUgU2VsZWN0ZWRSYW5nZS4KKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIHB1YmxpYyBzdHJpbmcgQWN0aXZlQ2VsbCB7CisgICAgICBnZXQgeworICAgICAgICBzdHJpbmcgYWRkcmVzcyA9IEdldFhtbE5vZGVTdHJpbmcoX2FjdGl2ZUNlbGxQYXRoKTsKKyAgICAgICAgaWYgKGFkZHJlc3MgPT0gIiIpIHsKKyAgICAgICAgICByZXR1cm4gIkExIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICAgIH0KKyAgICAgIHNldCB7CisgICAgICAgIGludCBmcm9tQ29sLAorICAgICAgICAgICAgZnJvbVJvdywKKyAgICAgICAgICAgIHRvQ29sLAorICAgICAgICAgICAgdG9Sb3c7CisgICAgICAgIGlmIChfc2VsZWN0aW9uTm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgQ3JlYXRlU2VsZWN0aW9uRWxlbWVudCgpOworICAgICAgICB9CisgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0Um93Q29sRnJvbUFkZHJlc3ModmFsdWUsIG91dCBmcm9tUm93LCBvdXQgZnJvbUNvbCwgb3V0IHRvUm93LCBvdXQgdG9Db2wpOworICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9hY3RpdmVDZWxsUGF0aCwgdmFsdWUpOworICAgICAgICBpZiAoKChYbWxFbGVtZW50KVRvcE5vZGUpLkdldEF0dHJpYnV0ZSgic3FyZWYiKSA9PSAiIikgeworICAgICAgICAgIFNlbGVjdGVkUmFuZ2UgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZnJvbVJvdywgZnJvbUNvbCk7CisgICAgICAgIH0KKyAgICAgICAgLy9UT0RPOkFkZCBmaXggZm9yIG91dCBvZiByYW5nZSBoZXJlCisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIENyZWF0ZVNlbGVjdGlvbkVsZW1lbnQoKSB7CisgICAgICBfc2VsZWN0aW9uTm9kZSA9IFRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzZWxlY3Rpb24iLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgVG9wTm9kZS5BcHBlbmRDaGlsZChfc2VsZWN0aW9uTm9kZSk7CisgICAgICBUb3BOb2RlID0gX3NlbGVjdGlvbk5vZGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3NlbGVjdGlvblJhbmdlUGF0aCA9ICJAc3FyZWYiOworCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBTZWxlY3RlZCBDZWxscy5Vc2VkIGluIGNvbWJpbmF0aW9uIHdpdGggQWN0aXZlQ2VsbAorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgcHVibGljIHN0cmluZyBTZWxlY3RlZFJhbmdlIHsKKyAgICAgIGdldCB7CisgICAgICAgIHN0cmluZyBhZGRyZXNzID0gR2V0WG1sTm9kZVN0cmluZyhfc2VsZWN0aW9uUmFuZ2VQYXRoKTsKKyAgICAgICAgaWYgKGFkZHJlc3MgPT0gIiIpIHsKKyAgICAgICAgICByZXR1cm4gIkExIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRkcmVzczsKKyAgICAgIH0KKyAgICAgIHNldCB7CisgICAgICAgIGludCBmcm9tQ29sLAorICAgICAgICAgICAgZnJvbVJvdywKKyAgICAgICAgICAgIHRvQ29sLAorICAgICAgICAgICAgdG9Sb3c7CisgICAgICAgIGlmIChfc2VsZWN0aW9uTm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgQ3JlYXRlU2VsZWN0aW9uRWxlbWVudCgpOworICAgICAgICB9CisgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0Um93Q29sRnJvbUFkZHJlc3ModmFsdWUsIG91dCBmcm9tUm93LCBvdXQgZnJvbUNvbCwgb3V0IHRvUm93LCBvdXQgdG9Db2wpOworICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9zZWxlY3Rpb25SYW5nZVBhdGgsIHZhbHVlKTsKKyAgICAgICAgaWYgKCgoWG1sRWxlbWVudClUb3BOb2RlKS5HZXRBdHRyaWJ1dGUoImFjdGl2ZUNlbGwiKSA9PSAiIikgeworICAgICAgICAgIEFjdGl2ZUNlbGwgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZnJvbVJvdywgZnJvbUNvbCk7CisgICAgICAgIH0KKyAgICAgICAgLy9UT0RPOkFkZCBmaXggZm9yIG91dCBvZiByYW5nZSBoZXJlCisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd29ya3NoZWV0OworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENyZWF0ZXMgYSBuZXcgRXhjZWxXb3Jrc2hlZXRWaWV3IHdoaWNoIHByb3ZpZGVzIGFjY2VzcyB0byBhbGwgdGhlIHZpZXcgc3RhdGVzIG9mIHRoZSB3b3Jrc2hlZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibnMiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ4bFdvcmtzaGVldCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxXb3Jrc2hlZXRWaWV3KFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgbm9kZSwgRXhjZWxXb3Jrc2hlZXQgeGxXb3Jrc2hlZXQpCisgICAgICA6IGJhc2UobnMsIG5vZGUpIHsKKyAgICBfd29ya3NoZWV0ID0geGxXb3Jrc2hlZXQ7CisgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3W10geyAic2hlZXRWaWV3cyIsICJzaGVldFZpZXciLCAicGFuZSIsICJzZWxlY3Rpb24iIH07CisgICAgUGFuZXMgPSBMb2FkUGFuZXMoKTsKKyAgfQorCisgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXRQYW5lc1tdIExvYWRQYW5lcygpIHsKKyAgICBYbWxOb2RlTGlzdCBub2RlcyA9IFRvcE5vZGUuU2VsZWN0Tm9kZXMoIi8vZDpzZWxlY3Rpb24iLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBpZiAobm9kZXMuQ291bnQgPT0gMCkgeworICAgICAgcmV0dXJuIG5ld1tdIHsgbmV3IEV4Y2VsV29ya3NoZWV0UGFuZXMoTmFtZVNwYWNlTWFuYWdlciwgVG9wTm9kZSkgfTsKKyAgICB9CisgICAgRXhjZWxXb3Jrc2hlZXRQYW5lc1tdIHBhbmVzID0gbmV3IEV4Y2VsV29ya3NoZWV0UGFuZXNbbm9kZXMuQ291bnRdOworICAgIGludCBpID0gMDsKKyAgICBmb3JlYWNoIChYbWxFbGVtZW50IGVsZW0gaW4gbm9kZXMpIHsKKyAgICAgIHBhbmVzW2krK10gPSBuZXcoTmFtZVNwYWNlTWFuYWdlciwgZWxlbSk7CisgICAgfQorICAgIHJldHVybiBwYW5lczsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHNoZWV0VmlldyBlbGVtZW50CisgIC8vLyA8L3N1bW1hcnk+CisgIHByb3RlY3RlZCBpbnRlcm5hbCBYbWxFbGVtZW50IFNoZWV0Vmlld0VsZW1lbnQgPT4gKFhtbEVsZW1lbnQpVG9wTm9kZTsKKworICBwcml2YXRlIFhtbEVsZW1lbnQgX3NlbGVjdGlvbk5vZGU7CisKKyAgcHJpdmF0ZSBYbWxFbGVtZW50IFNlbGVjdGlvbk5vZGUgeworICAgIGdldCB7CisgICAgICBfc2VsZWN0aW9uTm9kZSA9CisgICAgICAgICAgU2hlZXRWaWV3RWxlbWVudC5TZWxlY3RTaW5nbGVOb2RlKCIvL2Q6c2VsZWN0aW9uIiwgX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKQorICAgICAgICAgICAgICBhcyBYbWxFbGVtZW50OworICAgICAgaWYgKF9zZWxlY3Rpb25Ob2RlID09IG51bGwpIHsKKyAgICAgICAgX3NlbGVjdGlvbk5vZGUgPSBfd29ya3NoZWV0LldvcmtzaGVldFhtbC5DcmVhdGVFbGVtZW50KAorICAgICAgICAgICAgInNlbGVjdGlvbiIsCisgICAgICAgICAgICBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgICBTaGVldFZpZXdFbGVtZW50LkFwcGVuZENoaWxkKF9zZWxlY3Rpb25Ob2RlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfc2VsZWN0aW9uTm9kZTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgYWN0aXZlIGNlbGwuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgQWN0aXZlQ2VsbCB7CisgICAgZ2V0IHsgcmV0dXJuIFBhbmVzW1BhbmVzLkdldFVwcGVyQm91bmQoMCldLkFjdGl2ZUNlbGw7IH0KKyAgICBzZXQgeyBQYW5lc1tQYW5lcy5HZXRVcHBlckJvdW5kKDApXS5BY3RpdmVDZWxsID0gdmFsdWU7IH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNlbGVjdGVkIENlbGxzIGluIHRoZSB3b3Jrc2hlZXQuVXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIEFjdGl2ZUNlbGwKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBTZWxlY3RlZFJhbmdlIHsKKyAgICBnZXQgeyByZXR1cm4gUGFuZXNbUGFuZXMuR2V0VXBwZXJCb3VuZCgwKV0uU2VsZWN0ZWRSYW5nZTsgfQorICAgIHNldCB7IFBhbmVzW1BhbmVzLkdldFVwcGVyQm91bmQoMCldLlNlbGVjdGVkUmFuZ2UgPSB2YWx1ZTsgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW5kaWNhdGVzIGlmIHRoZSB3b3Jrc2hlZXQgaXMgc2VsZWN0ZWQgd2l0aGluIHRoZSB3b3JrYm9vaworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBUYWJTZWxlY3RlZCB7CisgICAgZ2V0IHsgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAdGFiU2VsZWN0ZWQiKTsgfQorICAgIHNldCB7CisgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgLy8gICAgLy8gZW5zdXJlIG5vIG90aGVyIHdvcmtzaGVldCBoYXMgaXRzIHRhYlNlbGVjdGVkIGF0dHJpYnV0ZSBzZXQgdG8gMQorICAgICAgICBmb3JlYWNoIChFeGNlbFdvcmtzaGVldCBzaGVldCBpbiBfd29ya3NoZWV0Ll9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMpIHsKKyAgICAgICAgICBzaGVldC5WaWV3LlRhYlNlbGVjdGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBTaGVldFZpZXdFbGVtZW50LlNldEF0dHJpYnV0ZSgidGFiU2VsZWN0ZWQiLCAiMSIpOworICAgICAgICBYbWxFbGVtZW50IGJvb2tWaWV3ID0KKyAgICAgICAgICAgIF93b3Jrc2hlZXQuV29ya2Jvb2suV29ya2Jvb2tYbWwuU2VsZWN0U2luZ2xlTm9kZSgKKyAgICAgICAgICAgICAgICAiLy9kOndvcmtib29rVmlldyIsCisgICAgICAgICAgICAgICAgX3dvcmtzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICBpZiAoYm9va1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgIGJvb2tWaWV3LlNldEF0dHJpYnV0ZSgiYWN0aXZlVGFiIiwgKF93b3Jrc2hlZXQuUG9zaXRpb25JRCAtIDEpLlRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAdGFiU2VsZWN0ZWQiLCAiMCIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNldHMgdGhlIHZpZXcgbW9kZSBvZiB0aGUgd29ya3NoZWV0IHRvIHBhZ2VsYXlvdXQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgUGFnZUxheW91dFZpZXcgeworICAgIGdldCB7IHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJAdmlldyIpID09ICJwYWdlTGF5b3V0IjsgfQorICAgIHNldCB7CisgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHZpZXciLCAicGFnZUxheW91dCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU2hlZXRWaWV3RWxlbWVudC5SZW1vdmVBdHRyaWJ1dGUoInZpZXciKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTZXRzIHRoZSB2aWV3IG1vZGUgb2YgdGhlIHdvcmtzaGVldCB0byBwYWdlYnJlYWsKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgUGFnZUJyZWFrVmlldyB7CisgICAgZ2V0IHsgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkB2aWV3IikgPT0gInBhZ2VCcmVha1ByZXZpZXciOyB9CisgICAgc2V0IHsKKyAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAdmlldyIsICJwYWdlQnJlYWtQcmV2aWV3Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICBTaGVldFZpZXdFbGVtZW50LlJlbW92ZUF0dHJpYnV0ZSgidmlldyIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNob3cgZ3JpZGxpbmVzIGluIHRoZSB3b3Jrc2hlZXQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgU2hvd0dyaWRMaW5lcyB7CisgICAgZ2V0IHsgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAc2hvd0dyaWRMaW5lcyIpOyB9CisgICAgc2V0IHsgU2V0WG1sTm9kZVN0cmluZygiQHNob3dHcmlkTGluZXMiLCB2YWx1ZSA/ICIxIiA6ICIwIik7IH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNob3cgdGhlIENvbHVtbi9Sb3cgaGVhZGVycyAoY29udGFpbmcgY29sdW1uIGxldHRlcnMgYW5kIHJvdyBudW1iZXJzKQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBTaG93SGVhZGVycyB7CisgICAgZ2V0IHsgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAc2hvd1Jvd0NvbEhlYWRlcnMiKTsgfQorICAgIHNldCB7IFNldFhtbE5vZGVTdHJpbmcoIkBzaG93Um93Q29sSGVhZGVycyIsIHZhbHVlID8gIjEiIDogIjAiKTsgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gV2luZG93IHpvb20gbWFnbmlmaWNhdGlvbiBmb3IgY3VycmVudCB2aWV3IHJlcHJlc2VudGluZyBwZXJjZW50IHZhbHVlcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBab29tU2NhbGUgeworICAgIGdldCB7IHJldHVybiBHZXRYbWxOb2RlSW50KCJAem9vbVNjYWxlIik7IH0KKyAgICBzZXQgeworICAgICAgaWYgKHZhbHVlIDwgMTAgfHwgdmFsdWUgPiA0MDApIHsKKyAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiWm9vbWUgc2NhbGUgb3V0IG9mIHJhbmdlICgxMC00MDApIik7CisgICAgICB9CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAem9vbVNjYWxlIiwgdmFsdWUuVG9TdHJpbmcoKSk7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHNoZWV0IGlzIGluICdyaWdodCB0byBsZWZ0JyBkaXNwbGF5IG1vZGUuIFdoZW4gaW4gdGhpcyBtb2RlLENvbHVtbiBBIGlzIG9uIHRoZSBmYXIgcmlnaHQsIENvbHVtbiBCIDtpcyBvbmUgY29sdW1uIGxlZnQgb2YgQ29sdW1uIEEsIGFuZCBzbyBvbi4gQWxzbyxpbmZvcm1hdGlvbiBpbiBjZWxscyBpcyBkaXNwbGF5ZWQgaW4gdGhlIFJpZ2h0IHRvIExlZnQgZm9ybWF0LgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBSaWdodFRvTGVmdCB7CisgICAgZ2V0IHsgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAcmlnaHRUb0xlZnQiKTsgfQorICAgIHNldCB7IFNldFhtbE5vZGVTdHJpbmcoIkByaWdodFRvTGVmdCIsIHZhbHVlID8gIjEiIDogIjAiKTsgfQorICB9CisKKyAgaW50ZXJuYWwgYm9vbCBXaW5kb3dQcm90ZWN0aW9uIHsKKyAgICBnZXQgeyByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkB3aW5kb3dQcm90ZWN0aW9uIiwgZmFsc2UpOyB9CisgICAgc2V0IHsgU2V0WG1sTm9kZUJvb2woIkB3aW5kb3dQcm90ZWN0aW9uIiwgdmFsdWUsIGZhbHNlKTsgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmVmZXJlbmNlIHRvIHRoZSBwYW5lcworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxXb3Jrc2hlZXRQYW5lc1tdIFBhbmVzIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKworICBwcml2YXRlIHN0cmluZyBfcGFuZU5vZGVQYXRoID0gImQ6cGFuZSI7CisgIHByaXZhdGUgc3RyaW5nIF9zZWxlY3Rpb25Ob2RlUGF0aCA9ICJkOnNlbGVjdGlvbiI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRnJlZXplIHRoZSBjb2x1bW5zL3Jvd3MgdG8gbGVmdCBhbmQgYWJvdmUgdGhlIGNlbGwKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sdW1uIj48L3BhcmFtPgorICBwdWJsaWMgdm9pZCBGcmVlemVQYW5lcyhpbnQgcm93LCBpbnQgY29sdW1uKSB7CisgICAgLy9UT0RPOmZpeCB0aGlzIG1ldGhvZCB0byBoYW5kbGUgc3BsaXRzIGFzIHdlbGwuCisgICAgaWYgKHJvdyA9PSAxICYmIGNvbHVtbiA9PSAxKSB7CisgICAgICBVbkZyZWV6ZVBhbmVzKCk7CisgICAgfQorICAgIHN0cmluZyBzcVJlZiA9IFNlbGVjdGVkUmFuZ2UsCisgICAgICAgIGFjdGl2ZUNlbGwgPSBBY3RpdmVDZWxsOworCisgICAgWG1sRWxlbWVudCBwYW5lTm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfcGFuZU5vZGVQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgIGlmIChwYW5lTm9kZSA9PSBudWxsKSB7CisgICAgICBDcmVhdGVOb2RlKF9wYW5lTm9kZVBhdGgpOworICAgICAgcGFuZU5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX3BhbmVOb2RlUGF0aCwgTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKyAgICB9CisgICAgcGFuZU5vZGUuUmVtb3ZlQWxsKCk7IC8vQ2xlYXIgYWxsIGF0dHJpYnV0ZXMKKyAgICBpZiAoY29sdW1uID4gMSkgeworICAgICAgcGFuZU5vZGUuU2V0QXR0cmlidXRlKCJ4U3BsaXQiLCAoY29sdW1uIC0gMSkuVG9TdHJpbmcoKSk7CisgICAgfQorICAgIGlmIChyb3cgPiAxKSB7CisgICAgICBwYW5lTm9kZS5TZXRBdHRyaWJ1dGUoInlTcGxpdCIsIChyb3cgLSAxKS5Ub1N0cmluZygpKTsKKyAgICB9CisgICAgcGFuZU5vZGUuU2V0QXR0cmlidXRlKCJ0b3BMZWZ0Q2VsbCIsIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhyb3csIGNvbHVtbikpOworICAgIHBhbmVOb2RlLlNldEF0dHJpYnV0ZSgic3RhdGUiLCAiZnJvemVuIik7CisKKyAgICBSZW1vdmVTZWxlY3Rpb24oKTsKKworICAgIGlmIChyb3cgPiAxICYmIGNvbHVtbiA9PSAxKSB7CisgICAgICBwYW5lTm9kZS5TZXRBdHRyaWJ1dGUoImFjdGl2ZVBhbmUiLCAiYm90dG9tTGVmdCIpOworICAgICAgWG1sRWxlbWVudCBzZWwgPSBUb3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgic2VsZWN0aW9uIiwgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKTsKKyAgICAgIHNlbC5TZXRBdHRyaWJ1dGUoInBhbmUiLCAiYm90dG9tTGVmdCIpOworICAgICAgaWYgKGFjdGl2ZUNlbGwgIT0gIiIpIHsKKyAgICAgICAgc2VsLlNldEF0dHJpYnV0ZSgiYWN0aXZlQ2VsbCIsIGFjdGl2ZUNlbGwpOworICAgICAgfQorICAgICAgaWYgKHNxUmVmICE9ICIiKSB7CisgICAgICAgIHNlbC5TZXRBdHRyaWJ1dGUoInNxcmVmIiwgc3FSZWYpOworICAgICAgfQorICAgICAgc2VsLlNldEF0dHJpYnV0ZSgic3FyZWYiLCBzcVJlZik7CisgICAgICBUb3BOb2RlLkluc2VydEFmdGVyKHNlbCwgcGFuZU5vZGUpOworICAgIH0gZWxzZSBpZiAoY29sdW1uID4gMSAmJiByb3cgPT0gMSkgeworICAgICAgcGFuZU5vZGUuU2V0QXR0cmlidXRlKCJhY3RpdmVQYW5lIiwgInRvcFJpZ2h0Iik7CisgICAgICBYbWxFbGVtZW50IHNlbCA9IFRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzZWxlY3Rpb24iLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgc2VsLlNldEF0dHJpYnV0ZSgicGFuZSIsICJ0b3BSaWdodCIpOworICAgICAgaWYgKGFjdGl2ZUNlbGwgIT0gIiIpIHsKKyAgICAgICAgc2VsLlNldEF0dHJpYnV0ZSgiYWN0aXZlQ2VsbCIsIGFjdGl2ZUNlbGwpOworICAgICAgfQorICAgICAgaWYgKHNxUmVmICE9ICIiKSB7CisgICAgICAgIHNlbC5TZXRBdHRyaWJ1dGUoInNxcmVmIiwgc3FSZWYpOworICAgICAgfQorICAgICAgVG9wTm9kZS5JbnNlcnRBZnRlcihzZWwsIHBhbmVOb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgcGFuZU5vZGUuU2V0QXR0cmlidXRlKCJhY3RpdmVQYW5lIiwgImJvdHRvbVJpZ2h0Iik7CisgICAgICBYbWxFbGVtZW50IHNlbDEgPSBUb3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgic2VsZWN0aW9uIiwgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKTsKKyAgICAgIHNlbDEuU2V0QXR0cmlidXRlKCJwYW5lIiwgInRvcFJpZ2h0Iik7CisgICAgICBzdHJpbmcgY2VsbCA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcygxLCBjb2x1bW4pOworICAgICAgc2VsMS5TZXRBdHRyaWJ1dGUoImFjdGl2ZUNlbGwiLCBjZWxsKTsKKyAgICAgIHNlbDEuU2V0QXR0cmlidXRlKCJzcXJlZiIsIGNlbGwpOworICAgICAgcGFuZU5vZGUuUGFyZW50Tm9kZS5JbnNlcnRBZnRlcihzZWwxLCBwYW5lTm9kZSk7CisKKyAgICAgIFhtbEVsZW1lbnQgc2VsMiA9IFRvcE5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzZWxlY3Rpb24iLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgY2VsbCA9IEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhyb3csIDEpOworICAgICAgc2VsMi5TZXRBdHRyaWJ1dGUoInBhbmUiLCAiYm90dG9tTGVmdCIpOworICAgICAgc2VsMi5TZXRBdHRyaWJ1dGUoImFjdGl2ZUNlbGwiLCBjZWxsKTsKKyAgICAgIHNlbDIuU2V0QXR0cmlidXRlKCJzcXJlZiIsIGNlbGwpOworICAgICAgc2VsMS5QYXJlbnROb2RlLkluc2VydEFmdGVyKHNlbDIsIHNlbDEpOworCisgICAgICBYbWxFbGVtZW50IHNlbDMgPSBUb3BOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgic2VsZWN0aW9uIiwgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKTsKKyAgICAgIHNlbDMuU2V0QXR0cmlidXRlKCJwYW5lIiwgImJvdHRvbVJpZ2h0Iik7CisgICAgICBpZiAoYWN0aXZlQ2VsbCAhPSAiIikgeworICAgICAgICBzZWwzLlNldEF0dHJpYnV0ZSgiYWN0aXZlQ2VsbCIsIGFjdGl2ZUNlbGwpOworICAgICAgfQorICAgICAgaWYgKHNxUmVmICE9ICIiKSB7CisgICAgICAgIHNlbDMuU2V0QXR0cmlidXRlKCJzcXJlZiIsIHNxUmVmKTsKKyAgICAgIH0KKyAgICAgIHNlbDIuUGFyZW50Tm9kZS5JbnNlcnRBZnRlcihzZWwzLCBzZWwyKTsKKyAgICB9CisgICAgUGFuZXMgPSBMb2FkUGFuZXMoKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBSZW1vdmVTZWxlY3Rpb24oKSB7CisgICAgLy9GaW5kIHNlbGVjdGlvbiBub2RlcyBhbmQgcmVtb3ZlIHRoZW0KKyAgICBYbWxOb2RlTGlzdCBzZWxlY3Rpb25zID0gVG9wTm9kZS5TZWxlY3ROb2Rlcyhfc2VsZWN0aW9uTm9kZVBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgIGZvcmVhY2ggKFhtbE5vZGUgc2VsIGluIHNlbGVjdGlvbnMpIHsKKyAgICAgIHNlbC5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKHNlbCk7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVW5sb2NrIGFsbCByb3dzIGFuZCBjb2x1bW5zIHRvIHNjcm9sbCBmcmVlbHkKKyAgLy8vIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyB2b2lkIFVuRnJlZXplUGFuZXMoKSB7CisgICAgc3RyaW5nIHNxUmVmID0gU2VsZWN0ZWRSYW5nZSwKKyAgICAgICAgYWN0aXZlQ2VsbCA9IEFjdGl2ZUNlbGw7CisKKyAgICBYbWxFbGVtZW50IHBhbmVOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9wYW5lTm9kZVBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7CisgICAgaWYgKHBhbmVOb2RlICE9IG51bGwpIHsKKyAgICAgIHBhbmVOb2RlLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQocGFuZU5vZGUpOworICAgIH0KKyAgICBSZW1vdmVTZWxlY3Rpb24oKTsKKworICAgIFBhbmVzID0gTG9hZFBhbmVzKCk7CisKKyAgICBTZWxlY3RlZFJhbmdlID0gc3FSZWY7CisgICAgQWN0aXZlQ2VsbCA9IGFjdGl2ZUNlbGw7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9FeGNlbFdvcmtzaGVldHMuY3MgYi9FUFBsdXMvRXhjZWxXb3Jrc2hlZXRzLmNzCmluZGV4IDE4YzJlY2YuLjkxZTNjZGIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9FeGNlbFdvcmtzaGVldHMuY3MKKysrIGIvRVBQbHVzL0V4Y2VsV29ya3NoZWV0cy5jcwpAQCAtMTMsNTE2ICsxMyw1MTYgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgMjAwOS0xMC0wMQogICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIFN5c3RlbS5JTzsKK3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Ci1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAotewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gVGhlIGNvbGxlY3Rpb24gb2Ygd29ya3NoZWV0cyBmb3IgdGhlIHdvcmtib29rCi0JLy8vIDwvc3VtbWFyeT4KLQlwdWJsaWMgY2xhc3MgRXhjZWxXb3Jrc2hlZXRzIDogWG1sSGVscGVyLCBJRW51bWVyYWJsZTxFeGNlbFdvcmtzaGVldD4KLQl7Ci0JCSNyZWdpb24gUHJpdmF0ZSBQcm9wZXJ0aWVzCi0gICAgICAgIHByaXZhdGUgRXhjZWxQYWNrYWdlIF9wY2s7Ci0gICAgICAgIHByaXZhdGUgRGljdGlvbmFyeTxpbnQsIEV4Y2VsV29ya3NoZWV0PiBfd29ya3NoZWV0czsKLQkJcHJpdmF0ZSBYbWxOYW1lc3BhY2VNYW5hZ2VyIF9uYW1lc3BhY2VNYW5hZ2VyOwotCQkjZW5kcmVnaW9uCi0JCSNyZWdpb24gRXhjZWxXb3Jrc2hlZXRzIENvbnN0cnVjdG9yCi0JCWludGVybmFsIEV4Y2VsV29ya3NoZWV0cyhFeGNlbFBhY2thZ2UgcGNrLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbSwgWG1sTm9kZSB0b3BOb2RlKSA6Ci0gICAgICAgICAgICBiYXNlKG5zbSwgdG9wTm9kZSkKLQkJewotCQkJX3BjayA9IHBjazsKLSAgICAgICAgICAgIF9uYW1lc3BhY2VNYW5hZ2VyID0gbnNtOwotCQkJX3dvcmtzaGVldHMgPSBuZXcgRGljdGlvbmFyeTxpbnQsIEV4Y2VsV29ya3NoZWV0PigpOwotCQkJaW50IHBvc2l0aW9uSUQgPSAxOwogCi0gICAgICAgICAgICBmb3JlYWNoIChYbWxOb2RlIHNoZWV0Tm9kZSBpbiB0b3BOb2RlLkNoaWxkTm9kZXMpCi0JCQl7Ci0gICAgICAgICAgICAgICAgaWYgKHNoZWV0Tm9kZS5Ob2RlVHlwZSA9PSBYbWxOb2RlVHlwZS5FbGVtZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSBzaGVldE5vZGUuQXR0cmlidXRlc1sibmFtZSJdLlZhbHVlOwotICAgICAgICAgICAgICAgICAgICAvL0dldCB0aGUgcmVsYXRpb25zaGlwIGlkCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmVsSWQgPSBzaGVldE5vZGUuQXR0cmlidXRlc1sicjppZCJdLlZhbHVlOwotICAgICAgICAgICAgICAgICAgICBpbnQgc2hlZXRJRCA9IENvbnZlcnQuVG9JbnQzMihzaGVldE5vZGUuQXR0cmlidXRlc1sic2hlZXRJZCJdLlZhbHVlKTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOwogCi0gICAgICAgICAgICAgICAgICAgIC8vSGlkZGVuIHByb3BlcnR5Ci0gICAgICAgICAgICAgICAgICAgIGVXb3JrU2hlZXRIaWRkZW4gaGlkZGVuID0gZVdvcmtTaGVldEhpZGRlbi5WaXNpYmxlOwotICAgICAgICAgICAgICAgICAgICBYbWxOb2RlIGF0dHIgPSBzaGVldE5vZGUuQXR0cmlidXRlc1sic3RhdGUiXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbiA9IFRyYW5zbGF0ZUhpZGRlbihhdHRyLlZhbHVlKTsKKy8vLyA8c3VtbWFyeT4KKy8vLyBUaGUgY29sbGVjdGlvbiBvZiB3b3Jrc2hlZXRzIGZvciB0aGUgd29ya2Jvb2sKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxXb3Jrc2hlZXRzIDogWG1sSGVscGVyLCBJRW51bWVyYWJsZTxFeGNlbFdvcmtzaGVldD4geworICBwcml2YXRlIEV4Y2VsUGFja2FnZSBfcGNrOworICBwcml2YXRlIERpY3Rpb25hcnk8aW50LCBFeGNlbFdvcmtzaGVldD4gX3dvcmtzaGVldHM7CisgIHByaXZhdGUgWG1sTmFtZXNwYWNlTWFuYWdlciBfbmFtZXNwYWNlTWFuYWdlcjsKIAotICAgICAgICAgICAgICAgICAgICB2YXIgc2hlZXRSZWxhdGlvbiA9IHBjay5Xb3JrYm9vay5QYXJ0LkdldFJlbGF0aW9uc2hpcChyZWxJZCk7Ci0gICAgICAgICAgICAgICAgICAgIFVyaSB1cmlXb3Jrc2hlZXQgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocGNrLldvcmtib29rLldvcmtib29rVXJpLCBzaGVldFJlbGF0aW9uLlRhcmdldFVyaSk7CisgIGludGVybmFsIEV4Y2VsV29ya3NoZWV0cyhFeGNlbFBhY2thZ2UgcGNrLCBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbSwgWG1sTm9kZSB0b3BOb2RlKQorICAgICAgOiBiYXNlKG5zbSwgdG9wTm9kZSkgeworICAgIF9wY2sgPSBwY2s7CisgICAgX25hbWVzcGFjZU1hbmFnZXIgPSBuc207CisgICAgX3dvcmtzaGVldHMgPSBuZXcoKTsKKyAgICBpbnQgcG9zaXRpb25JZCA9IDE7CiAKLSAgICAgICAgICAgICAgICAgICAgLy9hZGQgdGhlIHdvcmtzaGVldAotICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXRSZWxhdGlvbi5SZWxhdGlvbnNoaXBUeXBlLkVuZHNXaXRoKCJjaGFydHNoZWV0IikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXRzLkFkZChwb3NpdGlvbklELCBuZXcgRXhjZWxDaGFydHNoZWV0KF9uYW1lc3BhY2VNYW5hZ2VyLCBfcGNrLCByZWxJZCwgdXJpV29ya3NoZWV0LCBuYW1lLCBzaGVldElELCBwb3NpdGlvbklELCBoaWRkZW4pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF93b3Jrc2hlZXRzLkFkZChwb3NpdGlvbklELCBuZXcgRXhjZWxXb3Jrc2hlZXQoX25hbWVzcGFjZU1hbmFnZXIsIF9wY2ssIHJlbElkLCB1cmlXb3Jrc2hlZXQsIG5hbWUsIHNoZWV0SUQsIHBvc2l0aW9uSUQsIGhpZGRlbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSUQrKzsKLSAgICAgICAgICAgICAgICB9Ci0JCQl9Ci0JCX0KKyAgICBmb3JlYWNoIChYbWxOb2RlIHNoZWV0Tm9kZSBpbiB0b3BOb2RlLkNoaWxkTm9kZXMpIHsKKyAgICAgIGlmIChzaGVldE5vZGUuTm9kZVR5cGUgPT0gWG1sTm9kZVR5cGUuRWxlbWVudCkgeworICAgICAgICBzdHJpbmcgbmFtZSA9IHNoZWV0Tm9kZS5BdHRyaWJ1dGVzWyJuYW1lIl0uVmFsdWU7CisgICAgICAgIC8vR2V0IHRoZSByZWxhdGlvbnNoaXAgaWQKKyAgICAgICAgc3RyaW5nIHJlbElkID0gc2hlZXROb2RlLkF0dHJpYnV0ZXNbInI6aWQiXS5WYWx1ZTsKKyAgICAgICAgaW50IHNoZWV0SWQgPSBDb252ZXJ0LlRvSW50MzIoc2hlZXROb2RlLkF0dHJpYnV0ZXNbInNoZWV0SWQiXS5WYWx1ZSk7CiAKLSAgICAgICAgcHJpdmF0ZSBlV29ya1NoZWV0SGlkZGVuIFRyYW5zbGF0ZUhpZGRlbihzdHJpbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAiaGlkZGVuIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVXb3JrU2hlZXRIaWRkZW4uSGlkZGVuOwotICAgICAgICAgICAgICAgIGNhc2UgInZlcnlIaWRkZW4iOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVdvcmtTaGVldEhpZGRlbi5WZXJ5SGlkZGVuOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlV29ya1NoZWV0SGlkZGVuLlZpc2libGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkJI2VuZHJlZ2lvbgotCQkjcmVnaW9uIEV4Y2VsV29ya3NoZWV0cyBQdWJsaWMgUHJvcGVydGllcwotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd29ya3NoZWV0cyBpbiB0aGUgd29ya2Jvb2sKLQkJLy8vIDwvc3VtbWFyeT4KLQkJcHVibGljIGludCBDb3VudAotCQl7Ci0JCQlnZXQgeyByZXR1cm4gKF93b3Jrc2hlZXRzLkNvdW50KTsgfQotCQl9Ci0JCSNlbmRyZWdpb24KLSAgICAgICAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgRVJSX0RVUF9XT1JLU0hFRVQgPSAiQSB3b3Jrc2hlZXQgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHdvcmtib29rIjsKLSAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIFdPUktTSEVFVF9DT05URU5UVFlQRSA9IEAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwud29ya3NoZWV0K3htbCI7Ci0gICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBDSEFSVFNIRUVUX0NPTlRFTlRUWVBFID0gQCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5jaGFydHNoZWV0K3htbCI7Ci0JCSNyZWdpb24gRXhjZWxXb3Jrc2hlZXRzIFB1YmxpYyBNZXRob2RzCi0JCS8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvcmVhY2ggc3VwcG9ydAotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHJldHVybnM+QW4gZW51bWVyYXRvcjwvcmV0dXJucz4KLQkJcHVibGljIElFbnVtZXJhdG9yPEV4Y2VsV29ya3NoZWV0PiBHZXRFbnVtZXJhdG9yKCkKLQkJewotCQkJcmV0dXJuIChfd29ya3NoZWV0cy5WYWx1ZXMuR2V0RW51bWVyYXRvcigpKTsKLSAgICAgICAgfQotICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlIE1lbWJlcnMKLQotICAgICAgICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChfd29ya3NoZWV0cy5WYWx1ZXMuR2V0RW51bWVyYXRvcigpKTsKKyAgICAgICAgLy9IaWRkZW4gcHJvcGVydHkKKyAgICAgICAgZVdvcmtTaGVldEhpZGRlbiBoaWRkZW4gPSBlV29ya1NoZWV0SGlkZGVuLlZpc2libGU7CisgICAgICAgIFhtbE5vZGUgYXR0ciA9IHNoZWV0Tm9kZS5BdHRyaWJ1dGVzWyJzdGF0ZSJdOworICAgICAgICBpZiAoYXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgaGlkZGVuID0gVHJhbnNsYXRlSGlkZGVuKGF0dHIuVmFsdWUpOwogICAgICAgICB9CiAKLSAgICAgICAgI2VuZHJlZ2lvbgotCQkjcmVnaW9uIEFkZCBXb3Jrc2hlZXQKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQWRkcyBhIG5ldyBibGFuayB3b3Jrc2hlZXQuCi0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+VGhlIG5hbWUgb2YgdGhlIHdvcmtib29rPC9wYXJhbT4KLQkJcHVibGljIEV4Y2VsV29ya3NoZWV0IEFkZChzdHJpbmcgTmFtZSkKLQkJewotICAgICAgICAgICAgaW50IHNoZWV0SUQ7Ci0gICAgICAgICAgICBVcmkgdXJpV29ya3NoZWV0OwotICAgICAgICAgICAgbG9jayAoX3dvcmtzaGVldHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTmFtZSA9IFZhbGlkYXRlRml4U2hlZXROYW1lKE5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChHZXRCeU5hbWUoTmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbihFUlJfRFVQX1dPUktTSEVFVCArICIgOiAiICsgTmFtZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBHZXRTaGVldFVSSShyZWYgTmFtZSwgb3V0IHNoZWV0SUQsIG91dCB1cmlXb3Jrc2hlZXQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgd29ya3NoZWV0UGFydCA9IF9wY2suUGFja2FnZS5DcmVhdGVQYXJ0KHVyaVdvcmtzaGVldCwgV09SS1NIRUVUX0NPTlRFTlRUWVBFLCBfcGNrLkNvbXByZXNzaW9uKTsKKyAgICAgICAgdmFyIHNoZWV0UmVsYXRpb24gPSBwY2suV29ya2Jvb2suUGFydC5HZXRSZWxhdGlvbnNoaXAocmVsSWQpOworICAgICAgICBVcmkgdXJpV29ya3NoZWV0ID0gVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKAorICAgICAgICAgICAgcGNrLldvcmtib29rLldvcmtib29rVXJpLAorICAgICAgICAgICAgc2hlZXRSZWxhdGlvbi5UYXJnZXRVcmkpOwogCi0gICAgICAgICAgICAgICAgLy9DcmVhdGUgdGhlIG5ldywgZW1wdHkgd29ya3NoZWV0IGFuZCBzYXZlIGl0IHRvIHRoZSBwYWNrYWdlCi0gICAgICAgICAgICAgICAgU3RyZWFtV3JpdGVyIHN0cmVhbVdvcmtzaGVldCA9IG5ldyBTdHJlYW1Xcml0ZXIod29ya3NoZWV0UGFydC5HZXRTdHJlYW0oRmlsZU1vZGUuQ3JlYXRlLCBGaWxlQWNjZXNzLldyaXRlKSk7Ci0gICAgICAgICAgICAgICAgWG1sRG9jdW1lbnQgd29ya3NoZWV0WG1sID0gQ3JlYXRlTmV3V29ya3NoZWV0KGZhbHNlKTsKLSAgICAgICAgICAgICAgICB3b3Jrc2hlZXRYbWwuU2F2ZShzdHJlYW1Xb3Jrc2hlZXQpOwotCi0gICAgICAgICAgICAgICAgc3RyaW5nIHJlbCA9IENyZWF0ZVdvcmtib29rUmVsKE5hbWUsIHNoZWV0SUQsIHVyaVdvcmtzaGVldCwgZmFsc2UpOwotCi0gICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uSUQgPSBfd29ya3NoZWV0cy5Db3VudCArIDE7Ci0gICAgICAgICAgICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0OwotCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXQgPSBuZXcgRXhjZWxXb3Jrc2hlZXQoX25hbWVzcGFjZU1hbmFnZXIsIF9wY2ssIHJlbCwgdXJpV29ya3NoZWV0LCBOYW1lLCBzaGVldElELCBwb3NpdGlvbklELCBlV29ya1NoZWV0SGlkZGVuLlZpc2libGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIF93b3Jrc2hlZXRzLkFkZChwb3NpdGlvbklELCB3b3Jrc2hlZXQpOwotICAgICAgICAgICAgICAgIHJldHVybiB3b3Jrc2hlZXQ7Ci0gICAgICAgICAgICB9CisgICAgICAgIC8vYWRkIHRoZSB3b3Jrc2hlZXQKKyAgICAgICAgaWYgKHNoZWV0UmVsYXRpb24uUmVsYXRpb25zaGlwVHlwZS5FbmRzV2l0aCgiY2hhcnRzaGVldCIpKSB7CisgICAgICAgICAgX3dvcmtzaGVldHMuQWRkKAorICAgICAgICAgICAgICBwb3NpdGlvbklkLAorICAgICAgICAgICAgICBuZXcgRXhjZWxDaGFydHNoZWV0KAorICAgICAgICAgICAgICAgICAgX25hbWVzcGFjZU1hbmFnZXIsCisgICAgICAgICAgICAgICAgICBfcGNrLAorICAgICAgICAgICAgICAgICAgcmVsSWQsCisgICAgICAgICAgICAgICAgICB1cmlXb3Jrc2hlZXQsCisgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgc2hlZXRJZCwKKyAgICAgICAgICAgICAgICAgIHBvc2l0aW9uSWQsCisgICAgICAgICAgICAgICAgICBoaWRkZW4pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBfd29ya3NoZWV0cy5BZGQoCisgICAgICAgICAgICAgIHBvc2l0aW9uSWQsCisgICAgICAgICAgICAgIG5ldyhfbmFtZXNwYWNlTWFuYWdlciwgX3BjaywgcmVsSWQsIHVyaVdvcmtzaGVldCwgbmFtZSwgc2hlZXRJZCwgcG9zaXRpb25JZCwgaGlkZGVuKSk7CiAgICAgICAgIH0KKyAgICAgICAgcG9zaXRpb25JZCsrOworICAgICAgfQorICAgIH0KKyAgfQogCi0JCXN0cmluZyBDcmVhdGVXb3JrYm9va1JlbChzdHJpbmcgTmFtZSwgaW50IHNoZWV0SUQsIFVyaSB1cmlXb3Jrc2hlZXQsIGJvb2wgaXNDaGFydCkKLSAgICAgICAgewotICAgICAgICAgICAgLy9DcmVhdGUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB3b3JrYm9vayBhbmQgdGhlIG5ldyB3b3Jrc2hlZXQKLSAgICAgICAgICAgIHZhciByZWwgPSBfcGNrLldvcmtib29rLlBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShfcGNrLldvcmtib29rLldvcmtib29rVXJpLCB1cmlXb3Jrc2hlZXQpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiLyIgKyAoaXNDaGFydCA/ICJjaGFydHNoZWV0IiA6ICJ3b3Jrc2hlZXQiKSk7CisgIHByaXZhdGUgZVdvcmtTaGVldEhpZGRlbiBUcmFuc2xhdGVIaWRkZW4oc3RyaW5nIHZhbHVlKSB7CisgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgY2FzZSAiaGlkZGVuIjoKKyAgICAgICAgcmV0dXJuIGVXb3JrU2hlZXRIaWRkZW4uSGlkZGVuOworICAgICAgY2FzZSAidmVyeUhpZGRlbiI6CisgICAgICAgIHJldHVybiBlV29ya1NoZWV0SGlkZGVuLlZlcnlIaWRkZW47CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZVdvcmtTaGVldEhpZGRlbi5WaXNpYmxlOworICAgIH0KKyAgfQogCi0gICAgICAgICAgICAvL0NyZWF0ZSB0aGUgbmV3IHNoZWV0IG5vZGUKLSAgICAgICAgICAgIFhtbEVsZW1lbnQgd29ya3NoZWV0Tm9kZSA9IF9wY2suV29ya2Jvb2suV29ya2Jvb2tYbWwuQ3JlYXRlRWxlbWVudCgic2hlZXQiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICB3b3Jrc2hlZXROb2RlLlNldEF0dHJpYnV0ZSgibmFtZSIsIE5hbWUpOwotICAgICAgICAgICAgd29ya3NoZWV0Tm9kZS5TZXRBdHRyaWJ1dGUoInNoZWV0SWQiLCBzaGVldElELlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgd29ya3NoZWV0Tm9kZS5TZXRBdHRyaWJ1dGUoImlkIiwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMsIHJlbC5JZCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB3b3Jrc2hlZXRzIGluIHRoZSB3b3JrYm9vaworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IENvdW50ID0+IChfd29ya3NoZWV0cy5Db3VudCk7CiAKLSAgICAgICAgICAgIFRvcE5vZGUuQXBwZW5kQ2hpbGQod29ya3NoZWV0Tm9kZSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVsLklkOworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZXJyRHVwV29ya3NoZWV0ID0KKyAgICAgICJBIHdvcmtzaGVldCB3aXRoIHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgd29ya2Jvb2siOworICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgX3dvcmtzaGVldENvbnRlbnR0eXBlID0KKyAgICAgICJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC53b3Jrc2hlZXQreG1sIjsKKyAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIF9jaGFydHNoZWV0Q29udGVudHR5cGUgPQorICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLmNoYXJ0c2hlZXQreG1sIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBGb3JlYWNoIHN1cHBvcnQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPkFuIGVudW1lcmF0b3I8L3JldHVybnM+CisgIHB1YmxpYyBJRW51bWVyYXRvcjxFeGNlbFdvcmtzaGVldD4gR2V0RW51bWVyYXRvcigpIHsKKyAgICByZXR1cm4gKF93b3Jrc2hlZXRzLlZhbHVlcy5HZXRFbnVtZXJhdG9yKCkpOworICB9CisKKyAgSUVudW1lcmF0b3IgSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpIHsKKyAgICByZXR1cm4gKF93b3Jrc2hlZXRzLlZhbHVlcy5HZXRFbnVtZXJhdG9yKCkpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBhIG5ldyBibGFuayB3b3Jrc2hlZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIG5hbWUgb2YgdGhlIHdvcmtib29rPC9wYXJhbT4KKyAgcHVibGljIEV4Y2VsV29ya3NoZWV0IEFkZChzdHJpbmcgbmFtZSkgeworICAgIGludCBzaGVldElkOworICAgIFVyaSB1cmlXb3Jrc2hlZXQ7CisgICAgbG9jayAoX3dvcmtzaGVldHMpIHsKKyAgICAgIG5hbWUgPSBWYWxpZGF0ZUZpeFNoZWV0TmFtZShuYW1lKTsKKyAgICAgIGlmIChHZXRCeU5hbWUobmFtZSkgIT0gbnVsbCkgeworICAgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oX2VyckR1cFdvcmtzaGVldCArICIgOiAiICsgbmFtZSkpOworICAgICAgfQorICAgICAgR2V0U2hlZXRVcmkocmVmIG5hbWUsIG91dCBzaGVldElkLCBvdXQgdXJpV29ya3NoZWV0LCBmYWxzZSk7CisgICAgICBaaXBQYWNrYWdlUGFydCB3b3Jrc2hlZXRQYXJ0ID0gX3Bjay5QYWNrYWdlLkNyZWF0ZVBhcnQoCisgICAgICAgICAgdXJpV29ya3NoZWV0LAorICAgICAgICAgIF93b3Jrc2hlZXRDb250ZW50dHlwZSwKKyAgICAgICAgICBfcGNrLkNvbXByZXNzaW9uKTsKKworICAgICAgLy9DcmVhdGUgdGhlIG5ldywgZW1wdHkgd29ya3NoZWV0IGFuZCBzYXZlIGl0IHRvIHRoZSBwYWNrYWdlCisgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtV29ya3NoZWV0ID0gbmV3IFN0cmVhbVdyaXRlcigKKyAgICAgICAgICB3b3Jrc2hlZXRQYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKKyAgICAgIFhtbERvY3VtZW50IHdvcmtzaGVldFhtbCA9IENyZWF0ZU5ld1dvcmtzaGVldChmYWxzZSk7CisgICAgICB3b3Jrc2hlZXRYbWwuU2F2ZShzdHJlYW1Xb3Jrc2hlZXQpOworCisgICAgICBzdHJpbmcgcmVsID0gQ3JlYXRlV29ya2Jvb2tSZWwobmFtZSwgc2hlZXRJZCwgdXJpV29ya3NoZWV0LCBmYWxzZSk7CisKKyAgICAgIGludCBwb3NpdGlvbklkID0gX3dvcmtzaGVldHMuQ291bnQgKyAxOworICAgICAgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0OworCisgICAgICB7CisgICAgICAgIHdvcmtzaGVldCA9IG5ldygKKyAgICAgICAgICAgIF9uYW1lc3BhY2VNYW5hZ2VyLAorICAgICAgICAgICAgX3BjaywKKyAgICAgICAgICAgIHJlbCwKKyAgICAgICAgICAgIHVyaVdvcmtzaGVldCwKKyAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICBzaGVldElkLAorICAgICAgICAgICAgcG9zaXRpb25JZCwKKyAgICAgICAgICAgIGVXb3JrU2hlZXRIaWRkZW4uVmlzaWJsZSk7CisgICAgICB9CisKKyAgICAgIF93b3Jrc2hlZXRzLkFkZChwb3NpdGlvbklkLCB3b3Jrc2hlZXQpOworICAgICAgcmV0dXJuIHdvcmtzaGVldDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0cmluZyBDcmVhdGVXb3JrYm9va1JlbChzdHJpbmcgbmFtZSwgaW50IHNoZWV0SWQsIFVyaSB1cmlXb3Jrc2hlZXQsIGJvb2wgaXNDaGFydCkgeworICAgIC8vQ3JlYXRlIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGUgd29ya2Jvb2sgYW5kIHRoZSBuZXcgd29ya3NoZWV0CisgICAgdmFyIHJlbCA9IF9wY2suV29ya2Jvb2suUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoCisgICAgICAgIFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShfcGNrLldvcmtib29rLldvcmtib29rVXJpLCB1cmlXb3Jrc2hlZXQpLAorICAgICAgICBUYXJnZXRNb2RlLkludGVybmFsLAorICAgICAgICBFeGNlbFBhY2thZ2UuX3NjaGVtYVJlbGF0aW9uc2hpcHMgKyAiLyIgKyAoaXNDaGFydCA/ICJjaGFydHNoZWV0IiA6ICJ3b3Jrc2hlZXQiKSk7CisKKyAgICAvL0NyZWF0ZSB0aGUgbmV3IHNoZWV0IG5vZGUKKyAgICBYbWxFbGVtZW50IHdvcmtzaGVldE5vZGUgPSBfcGNrLldvcmtib29rLldvcmtib29rWG1sLkNyZWF0ZUVsZW1lbnQoCisgICAgICAgICJzaGVldCIsCisgICAgICAgIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgd29ya3NoZWV0Tm9kZS5TZXRBdHRyaWJ1dGUoIm5hbWUiLCBuYW1lKTsKKyAgICB3b3Jrc2hlZXROb2RlLlNldEF0dHJpYnV0ZSgic2hlZXRJZCIsIHNoZWV0SWQuVG9TdHJpbmcoKSk7CisgICAgd29ya3NoZWV0Tm9kZS5TZXRBdHRyaWJ1dGUoImlkIiwgRXhjZWxQYWNrYWdlLl9zY2hlbWFSZWxhdGlvbnNoaXBzLCByZWwuSWQpOworCisgICAgVG9wTm9kZS5BcHBlbmRDaGlsZCh3b3Jrc2hlZXROb2RlKTsKKyAgICByZXR1cm4gcmVsLklkOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIEdldFNoZWV0VXJpKHJlZiBzdHJpbmcgbmFtZSwgb3V0IGludCBzaGVldElkLCBvdXQgVXJpIHVyaVdvcmtzaGVldCwgYm9vbCBpc0NoYXJ0KSB7CisgICAgbmFtZSA9IFZhbGlkYXRlRml4U2hlZXROYW1lKG5hbWUpOworCisgICAgLy9GaXJzdCBmaW5kIG1heGltdW0gZXhpc3Rpbmcgc2hlZXRJRAorICAgIHNoZWV0SWQgPSAwOworICAgIGZvcmVhY2ggKHZhciB3cyBpbiB0aGlzKSB7CisgICAgICBpZiAod3MuU2hlZXRJRCA+IHNoZWV0SWQpIHsKKyAgICAgICAgc2hlZXRJZCA9IHdzLlNoZWV0SUQ7CisgICAgICB9CisgICAgfQorICAgIC8vIHdlIG5vdyBoYXZlIHRoZSBtYXggZXhpc3RpbmcgdmFsdWVzLCBzbyBhZGQgb25lCisgICAgc2hlZXRJZCsrOworCisgICAgLy8gYWRkIHRoZSBuZXcgd29ya3NoZWV0IHRvIHRoZSBwYWNrYWdlCisgICAgaWYgKGlzQ2hhcnQpIHsKKyAgICAgIHVyaVdvcmtzaGVldCA9IG5ldygiL3hsL2NoYXJ0c2hlZXRzL2NoYXJ0c2hlZXQiICsgc2hlZXRJZCArICIueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHVyaVdvcmtzaGVldCA9IG5ldygiL3hsL3dvcmtzaGVldHMvc2hlZXQiICsgc2hlZXRJZCArICIueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSk7CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgc3RyaW5nIFZhbGlkYXRlRml4U2hlZXROYW1lKHN0cmluZyBuYW1lKSB7CisgICAgLy9yZW1vdmUgaW52YWxpZCBjaGFyYWN0ZXJzCisgICAgaWYgKFZhbGlkYXRlTmFtZShuYW1lKSkgeworICAgICAgaWYgKG5hbWUuSW5kZXhPZignOicpID4gLTEpIHsKKyAgICAgICAgbmFtZSA9IG5hbWUuUmVwbGFjZSgiOiIsICIgIik7CisgICAgICB9CisgICAgICBpZiAobmFtZS5JbmRleE9mKCcvJykgPiAtMSkgeworICAgICAgICBuYW1lID0gbmFtZS5SZXBsYWNlKCIvIiwgIiAiKTsKKyAgICAgIH0KKyAgICAgIGlmIChuYW1lLkluZGV4T2YoJ1xcJykgPiAtMSkgeworICAgICAgICBuYW1lID0gbmFtZS5SZXBsYWNlKCJcXCIsICIgIik7CisgICAgICB9CisgICAgICBpZiAobmFtZS5JbmRleE9mKCc/JykgPiAtMSkgeworICAgICAgICBuYW1lID0gbmFtZS5SZXBsYWNlKCI/IiwgIiAiKTsKKyAgICAgIH0KKyAgICAgIGlmIChuYW1lLkluZGV4T2YoJ1snKSA+IC0xKSB7CisgICAgICAgIG5hbWUgPSBuYW1lLlJlcGxhY2UoIlsiLCAiICIpOworICAgICAgfQorICAgICAgaWYgKG5hbWUuSW5kZXhPZignXScpID4gLTEpIHsKKyAgICAgICAgbmFtZSA9IG5hbWUuUmVwbGFjZSgiXSIsICIgIik7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKG5hbWUuVHJpbSgpID09ICIiKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRoZSB3b3Jrc2hlZXQgY2FuIG5vdCBoYXZlIGFuIGVtcHR5IG5hbWUiKTsKKyAgICB9CisgICAgaWYgKG5hbWUuTGVuZ3RoID4gMzEpIHsKKyAgICAgIG5hbWUgPSBuYW1lLlN1YnN0cmluZygwLCAzMSk7IC8vQSBzaGVldCBjYW4gaGF2ZSBtYXggMzEgY2hhcidzCisgICAgfQorICAgIHJldHVybiBuYW1lOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVmFsaWRhdGUgdGhlIHNoZWV0bmFtZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPlRoZSBOYW1lPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPlRydWUgaWYgdmFsaWQ8L3JldHVybnM+CisgIHByaXZhdGUgYm9vbCBWYWxpZGF0ZU5hbWUoc3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gUmVnZXguSXNNYXRjaChuYW1lLCBAIjp8XD98L3xcXHxcW3xcXSIpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ3JlYXRlcyB0aGUgWE1MIGRvY3VtZW50IHJlcHJlc2VudGluZyBhIG5ldyBlbXB0eSB3b3Jrc2hlZXQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgaW50ZXJuYWwgWG1sRG9jdW1lbnQgQ3JlYXRlTmV3V29ya3NoZWV0KGJvb2wgaXNDaGFydCkgeworICAgIFhtbERvY3VtZW50IHhtbERvYyA9IG5ldyBYbWxEb2N1bWVudCgpOworICAgIFhtbEVsZW1lbnQgZWxlbVdzID0geG1sRG9jLkNyZWF0ZUVsZW1lbnQoCisgICAgICAgIGlzQ2hhcnQgPyAiY2hhcnRzaGVldCIgOiAid29ya3NoZWV0IiwKKyAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKTsKKyAgICBlbGVtV3MuU2V0QXR0cmlidXRlKCJ4bWxuczpyIiwgRXhjZWxQYWNrYWdlLl9zY2hlbWFSZWxhdGlvbnNoaXBzKTsKKyAgICB4bWxEb2MuQXBwZW5kQ2hpbGQoZWxlbVdzKTsKKworICAgIGlmIChpc0NoYXJ0KSB7CisgICAgICBYbWxFbGVtZW50IGVsZW1TaGVldFByID0geG1sRG9jLkNyZWF0ZUVsZW1lbnQoInNoZWV0UHIiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgZWxlbVdzLkFwcGVuZENoaWxkKGVsZW1TaGVldFByKTsKKworICAgICAgWG1sRWxlbWVudCBlbGVtU2hlZXRWaWV3cyA9IHhtbERvYy5DcmVhdGVFbGVtZW50KCJzaGVldFZpZXdzIiwgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKTsKKyAgICAgIGVsZW1Xcy5BcHBlbmRDaGlsZChlbGVtU2hlZXRWaWV3cyk7CisKKyAgICAgIFhtbEVsZW1lbnQgZWxlbVNoZWV0VmlldyA9IHhtbERvYy5DcmVhdGVFbGVtZW50KCJzaGVldFZpZXciLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgZWxlbVNoZWV0Vmlldy5TZXRBdHRyaWJ1dGUoIndvcmtib29rVmlld0lkIiwgIjAiKTsKKyAgICAgIGVsZW1TaGVldFZpZXcuU2V0QXR0cmlidXRlKCJ6b29tVG9GaXQiLCAiMSIpOworCisgICAgICBlbGVtU2hlZXRWaWV3cy5BcHBlbmRDaGlsZChlbGVtU2hlZXRWaWV3KTsKKyAgICB9IGVsc2UgeworICAgICAgWG1sRWxlbWVudCBlbGVtU2hlZXRWaWV3cyA9IHhtbERvYy5DcmVhdGVFbGVtZW50KCJzaGVldFZpZXdzIiwgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKTsKKyAgICAgIGVsZW1Xcy5BcHBlbmRDaGlsZChlbGVtU2hlZXRWaWV3cyk7CisKKyAgICAgIFhtbEVsZW1lbnQgZWxlbVNoZWV0VmlldyA9IHhtbERvYy5DcmVhdGVFbGVtZW50KCJzaGVldFZpZXciLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgZWxlbVNoZWV0Vmlldy5TZXRBdHRyaWJ1dGUoIndvcmtib29rVmlld0lkIiwgIjAiKTsKKyAgICAgIGVsZW1TaGVldFZpZXdzLkFwcGVuZENoaWxkKGVsZW1TaGVldFZpZXcpOworCisgICAgICBYbWxFbGVtZW50IGVsZW1TaGVldEZvcm1hdFByID0geG1sRG9jLkNyZWF0ZUVsZW1lbnQoCisgICAgICAgICAgInNoZWV0Rm9ybWF0UHIiLAorICAgICAgICAgIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgICBlbGVtU2hlZXRGb3JtYXRQci5TZXRBdHRyaWJ1dGUoImRlZmF1bHRSb3dIZWlnaHQiLCAiMTUiKTsKKyAgICAgIGVsZW1Xcy5BcHBlbmRDaGlsZChlbGVtU2hlZXRGb3JtYXRQcik7CisKKyAgICAgIFhtbEVsZW1lbnQgZWxlbVNoZWV0RGF0YSA9IHhtbERvYy5DcmVhdGVFbGVtZW50KCJzaGVldERhdGEiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgZWxlbVdzLkFwcGVuZENoaWxkKGVsZW1TaGVldERhdGEpOworICAgIH0KKyAgICByZXR1cm4geG1sRG9jOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyB0aGUgd29ya3NoZWV0IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icG9zaXRpb25JZCI+VGhlIHBvc2l0aW9uIG9mIHRoZSB3b3Jrc2hlZXQuIDEtYmFzZTwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFdvcmtzaGVldCB0aGlzW2ludCBwb3NpdGlvbklkXSB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfd29ya3NoZWV0cy5Db250YWluc0tleShwb3NpdGlvbklkKSkgeworICAgICAgICByZXR1cm4gX3dvcmtzaGVldHNbcG9zaXRpb25JZF07CisgICAgICB9CisgICAgICB0aHJvdyAobmV3IEluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbigiV29ya3NoZWV0IHBvc2l0aW9uIG91dCBvZiByYW5nZS4iKSk7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyB0aGUgd29ya3NoZWV0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgbmFtZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPlRoZSBuYW1lIG9mIHRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxXb3Jrc2hlZXQgdGhpc1tzdHJpbmcgbmFtZV0geworICAgIGdldCB7IHJldHVybiBHZXRCeU5hbWUobmFtZSk7IH0KKyAgfQorCisgIGludGVybmFsIEV4Y2VsV29ya3NoZWV0IEdldEJ5U2hlZXRJZChpbnQgbG9jYWxTaGVldElkKSB7CisgICAgZm9yZWFjaCAoRXhjZWxXb3Jrc2hlZXQgd3MgaW4gdGhpcykgeworICAgICAgaWYgKHdzLlNoZWV0SUQgPT0gbG9jYWxTaGVldElkKSB7CisgICAgICAgIHJldHVybiB3czsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IEdldEJ5TmFtZShzdHJpbmcgbmFtZSkgeworICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShuYW1lKSkgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIEV4Y2VsV29ya3NoZWV0IHhsV29ya3NoZWV0ID0gbnVsbDsKKyAgICBmb3JlYWNoIChFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQgaW4gX3dvcmtzaGVldHMuVmFsdWVzKSB7CisgICAgICBpZiAod29ya3NoZWV0Lk5hbWUuRXF1YWxzKG5hbWUsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKSB7CisgICAgICAgIHhsV29ya3NoZWV0ID0gd29ya3NoZWV0OworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKHhsV29ya3NoZWV0KTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE1vdmVzIHRoZSBzb3VyY2Ugd29ya3NoZWV0IHRvIHRoZSBwb3NpdGlvbiBiZWZvcmUgdGhlIHRhcmdldCB3b3Jrc2hlZXQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJzb3VyY2VOYW1lIj5UaGUgbmFtZSBvZiB0aGUgc291cmNlIHdvcmtzaGVldDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idGFyZ2V0TmFtZSI+VGhlIG5hbWUgb2YgdGhlIHRhcmdldCB3b3Jrc2hlZXQ8L3BhcmFtPgorICBwdWJsaWMgdm9pZCBNb3ZlQmVmb3JlKHN0cmluZyBzb3VyY2VOYW1lLCBzdHJpbmcgdGFyZ2V0TmFtZSkgeworICAgIE1vdmUoc291cmNlTmFtZSwgdGFyZ2V0TmFtZSwgZmFsc2UpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTW92ZXMgdGhlIHNvdXJjZSB3b3Jrc2hlZXQgdG8gdGhlIHBvc2l0aW9uIGJlZm9yZSB0aGUgdGFyZ2V0IHdvcmtzaGVldAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InNvdXJjZVBvc2l0aW9uSWQiPlRoZSBpZCBvZiB0aGUgc291cmNlIHdvcmtzaGVldDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idGFyZ2V0UG9zaXRpb25JZCI+VGhlIGlkIG9mIHRoZSB0YXJnZXQgd29ya3NoZWV0PC9wYXJhbT4KKyAgcHVibGljIHZvaWQgTW92ZUJlZm9yZShpbnQgc291cmNlUG9zaXRpb25JZCwgaW50IHRhcmdldFBvc2l0aW9uSWQpIHsKKyAgICBNb3ZlKHNvdXJjZVBvc2l0aW9uSWQsIHRhcmdldFBvc2l0aW9uSWQsIGZhbHNlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE1vdmVzIHRoZSBzb3VyY2Ugd29ya3NoZWV0IHRvIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgdGFyZ2V0IHdvcmtzaGVldAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InNvdXJjZU5hbWUiPlRoZSBuYW1lIG9mIHRoZSBzb3VyY2Ugd29ya3NoZWV0PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0YXJnZXROYW1lIj5UaGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHdvcmtzaGVldDwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIE1vdmVBZnRlcihzdHJpbmcgc291cmNlTmFtZSwgc3RyaW5nIHRhcmdldE5hbWUpIHsKKyAgICBNb3ZlKHNvdXJjZU5hbWUsIHRhcmdldE5hbWUsIHRydWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTW92ZXMgdGhlIHNvdXJjZSB3b3Jrc2hlZXQgdG8gdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSB0YXJnZXQgd29ya3NoZWV0CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ic291cmNlUG9zaXRpb25JZCI+VGhlIGlkIG9mIHRoZSBzb3VyY2Ugd29ya3NoZWV0PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0YXJnZXRQb3NpdGlvbklkIj5UaGUgaWQgb2YgdGhlIHRhcmdldCB3b3Jrc2hlZXQ8L3BhcmFtPgorICBwdWJsaWMgdm9pZCBNb3ZlQWZ0ZXIoaW50IHNvdXJjZVBvc2l0aW9uSWQsIGludCB0YXJnZXRQb3NpdGlvbklkKSB7CisgICAgTW92ZShzb3VyY2VQb3NpdGlvbklkLCB0YXJnZXRQb3NpdGlvbklkLCB0cnVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ic291cmNlTmFtZSI+PC9wYXJhbT4KKyAgcHVibGljIHZvaWQgTW92ZVRvU3RhcnQoc3RyaW5nIHNvdXJjZU5hbWUpIHsKKyAgICB2YXIgc291cmNlU2hlZXQgPSB0aGlzW3NvdXJjZU5hbWVdOworICAgIGlmIChzb3VyY2VTaGVldCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcoCisgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgIk1vdmUgd29ya3NoZWV0IGVycm9yOiBDb3VsZCBub3QgZmluZCB3b3Jrc2hlZXQgdG8gbW92ZSAnezB9JyIsCisgICAgICAgICAgICAgIHNvdXJjZU5hbWUpKTsKKyAgICB9CisgICAgTW92ZShzb3VyY2VTaGVldC5Qb3NpdGlvbklELCAxLCBmYWxzZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InNvdXJjZVBvc2l0aW9uSWQiPjwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIE1vdmVUb1N0YXJ0KGludCBzb3VyY2VQb3NpdGlvbklkKSB7CisgICAgTW92ZShzb3VyY2VQb3NpdGlvbklkLCAxLCBmYWxzZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InNvdXJjZU5hbWUiPjwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIE1vdmVUb0VuZChzdHJpbmcgc291cmNlTmFtZSkgeworICAgIHZhciBzb3VyY2VTaGVldCA9IHRoaXNbc291cmNlTmFtZV07CisgICAgaWYgKHNvdXJjZVNoZWV0ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldygKKyAgICAgICAgICBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAiTW92ZSB3b3Jrc2hlZXQgZXJyb3I6IENvdWxkIG5vdCBmaW5kIHdvcmtzaGVldCB0byBtb3ZlICd7MH0nIiwKKyAgICAgICAgICAgICAgc291cmNlTmFtZSkpOworICAgIH0KKyAgICBNb3ZlKHNvdXJjZVNoZWV0LlBvc2l0aW9uSUQsIF93b3Jrc2hlZXRzLkNvdW50LCB0cnVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ic291cmNlUG9zaXRpb25JZCI+PC9wYXJhbT4KKyAgcHVibGljIHZvaWQgTW92ZVRvRW5kKGludCBzb3VyY2VQb3NpdGlvbklkKSB7CisgICAgTW92ZShzb3VyY2VQb3NpdGlvbklkLCBfd29ya3NoZWV0cy5Db3VudCwgdHJ1ZSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgTW92ZShzdHJpbmcgc291cmNlTmFtZSwgc3RyaW5nIHRhcmdldE5hbWUsIGJvb2wgcGxhY2VBZnRlcikgeworICAgIHZhciBzb3VyY2VTaGVldCA9IHRoaXNbc291cmNlTmFtZV07CisgICAgaWYgKHNvdXJjZVNoZWV0ID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldygKKyAgICAgICAgICBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAiTW92ZSB3b3Jrc2hlZXQgZXJyb3I6IENvdWxkIG5vdCBmaW5kIHdvcmtzaGVldCB0byBtb3ZlICd7MH0nIiwKKyAgICAgICAgICAgICAgc291cmNlTmFtZSkpOworICAgIH0KKyAgICB2YXIgdGFyZ2V0U2hlZXQgPSB0aGlzW3RhcmdldE5hbWVdOworICAgIGlmICh0YXJnZXRTaGVldCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcoCisgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgIk1vdmUgd29ya3NoZWV0IGVycm9yOiBDb3VsZCBub3QgZmluZCB3b3Jrc2hlZXQgdG8gbW92ZSAnezB9JyIsCisgICAgICAgICAgICAgIHRhcmdldE5hbWUpKTsKKyAgICB9CisgICAgTW92ZShzb3VyY2VTaGVldC5Qb3NpdGlvbklELCB0YXJnZXRTaGVldC5Qb3NpdGlvbklELCBwbGFjZUFmdGVyKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBNb3ZlKGludCBzb3VyY2VQb3NpdGlvbklkLCBpbnQgdGFyZ2V0UG9zaXRpb25JZCwgYm9vbCBwbGFjZUFmdGVyKSB7CisgICAgLy8gQnVnZml4OiBpZiBzb3VyY2UgYW5kIHRhcmdldCBhcmUgdGhlIHNhbWUgd29ya3NoZWV0IHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIGNyZWF0ZSBhIGR1cGxpY2F0ZQorICAgIC8vICAgICAgICAgd2hpY2ggd2lsbCBjYXVzZSBhIGNvcnJ1cHQgd29ya2Jvb2suIC9zd21hbCAyMDE0LTA1LTEwCisgICAgaWYgKHNvdXJjZVBvc2l0aW9uSWQgPT0gdGFyZ2V0UG9zaXRpb25JZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxvY2sgKF93b3Jrc2hlZXRzKSB7CisgICAgICB2YXIgc291cmNlU2hlZXQgPSB0aGlzW3NvdXJjZVBvc2l0aW9uSWRdOworICAgICAgaWYgKHNvdXJjZVNoZWV0ID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3KAorICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgICAiTW92ZSB3b3Jrc2hlZXQgZXJyb3I6IENvdWxkIG5vdCBmaW5kIHdvcmtzaGVldCBhdCBwb3NpdGlvbiAnezB9JyIsCisgICAgICAgICAgICAgICAgc291cmNlUG9zaXRpb25JZCkpOworICAgICAgfQorICAgICAgdmFyIHRhcmdldFNoZWV0ID0gdGhpc1t0YXJnZXRQb3NpdGlvbklkXTsKKyAgICAgIGlmICh0YXJnZXRTaGVldCA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldygKKyAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICAgIk1vdmUgd29ya3NoZWV0IGVycm9yOiBDb3VsZCBub3QgZmluZCB3b3Jrc2hlZXQgYXQgcG9zaXRpb24gJ3swfSciLAorICAgICAgICAgICAgICAgIHRhcmdldFBvc2l0aW9uSWQpKTsKKyAgICAgIH0KKyAgICAgIGlmIChzb3VyY2VQb3NpdGlvbklkID09IHRhcmdldFBvc2l0aW9uSWQgJiYgX3dvcmtzaGVldHMuQ291bnQgPCAyKSB7CisgICAgICAgIHJldHVybjsgLy8tLS0gbm8gcmVhc29uIHRvIGF0dGVtcHQgdG8gcmUtYXJyYW5nZSBhIHNpbmdsZSBpdGVtIHdpdGggaXRzZWxmCisgICAgICB9CisKKyAgICAgIHZhciBpbmRleCA9IDE7CisgICAgICB2YXIgbmV3T3JkZXIgPSBuZXcgRGljdGlvbmFyeTxpbnQsIEV4Y2VsV29ya3NoZWV0PigpOworICAgICAgZm9yZWFjaCAodmFyIGVudHJ5IGluIF93b3Jrc2hlZXRzKSB7CisgICAgICAgIGlmIChlbnRyeS5LZXkgPT0gdGFyZ2V0UG9zaXRpb25JZCkgeworICAgICAgICAgIGlmICghcGxhY2VBZnRlcikgeworICAgICAgICAgICAgc291cmNlU2hlZXQuUG9zaXRpb25JRCA9IGluZGV4OworICAgICAgICAgICAgbmV3T3JkZXIuQWRkKGluZGV4KyssIHNvdXJjZVNoZWV0KTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBlbnRyeS5WYWx1ZS5Qb3NpdGlvbklEID0gaW5kZXg7CisgICAgICAgICAgbmV3T3JkZXIuQWRkKGluZGV4KyssIGVudHJ5LlZhbHVlKTsKKworICAgICAgICAgIGlmIChwbGFjZUFmdGVyKSB7CisgICAgICAgICAgICBzb3VyY2VTaGVldC5Qb3NpdGlvbklEID0gaW5kZXg7CisgICAgICAgICAgICBuZXdPcmRlci5BZGQoaW5kZXgrKywgc291cmNlU2hlZXQpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5LZXkgPT0gc291cmNlUG9zaXRpb25JZCkgeworICAgICAgICAgIC8vLS0tIGRvIG5vdGhpbmcKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBlbnRyeS5WYWx1ZS5Qb3NpdGlvbklEID0gaW5kZXg7CisgICAgICAgICAgbmV3T3JkZXIuQWRkKGluZGV4KyssIGVudHJ5LlZhbHVlKTsKICAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgR2V0U2hlZXRVUkkocmVmIHN0cmluZyBOYW1lLCBvdXQgaW50IHNoZWV0SUQsIG91dCBVcmkgdXJpV29ya3NoZWV0LCBib29sIGlzQ2hhcnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5hbWUgPSBWYWxpZGF0ZUZpeFNoZWV0TmFtZShOYW1lKTsKKyAgICAgIH0KKyAgICAgIF93b3Jrc2hlZXRzID0gbmV3T3JkZXI7CiAKLSAgICAgICAgICAgIC8vRmlyc3QgZmluZCBtYXhpbXVtIGV4aXN0aW5nIHNoZWV0SUQKLSAgICAgICAgICAgIHNoZWV0SUQgPSAwOwotICAgICAgICAgICAgZm9yZWFjaCh2YXIgd3MgaW4gdGhpcykKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHdzLlNoZWV0SUQgPiBzaGVldElEKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2hlZXRJRCA9IHdzLlNoZWV0SUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gd2Ugbm93IGhhdmUgdGhlIG1heCBleGlzdGluZyB2YWx1ZXMsIHNvIGFkZCBvbmUKLSAgICAgICAgICAgIHNoZWV0SUQrKzsKKyAgICAgIE1vdmVTaGVldFhtbE5vZGUoc291cmNlU2hlZXQsIHRhcmdldFNoZWV0LCBwbGFjZUFmdGVyKTsKKyAgICB9CisgIH0KIAotICAgICAgICAgICAgLy8gYWRkIHRoZSBuZXcgd29ya3NoZWV0IHRvIHRoZSBwYWNrYWdlCi0gICAgICAgICAgICBpZiAoaXNDaGFydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1cmlXb3Jrc2hlZXQgPSBuZXcgVXJpKCIveGwvY2hhcnRzaGVldHMvY2hhcnRzaGVldCIgKyBzaGVldElELlRvU3RyaW5nKCkgKyAiLnhtbCIsIFVyaUtpbmQuUmVsYXRpdmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVyaVdvcmtzaGVldCA9IG5ldyBVcmkoIi94bC93b3Jrc2hlZXRzL3NoZWV0IiArIHNoZWV0SUQuVG9TdHJpbmcoKSArICIueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgVmFsaWRhdGVGaXhTaGVldE5hbWUoc3RyaW5nIE5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vcmVtb3ZlIGludmFsaWQgY2hhcmFjdGVycwotICAgICAgICAgICAgaWYgKFZhbGlkYXRlTmFtZShOYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoTmFtZS5JbmRleE9mKCc6JykgPiAtMSkgTmFtZSA9IE5hbWUuUmVwbGFjZSgiOiIsICIgIik7Ci0gICAgICAgICAgICAgICAgaWYgKE5hbWUuSW5kZXhPZignLycpID4gLTEpIE5hbWUgPSBOYW1lLlJlcGxhY2UoIi8iLCAiICIpOwotICAgICAgICAgICAgICAgIGlmIChOYW1lLkluZGV4T2YoJ1xcJykgPiAtMSkgTmFtZSA9IE5hbWUuUmVwbGFjZSgiXFwiLCAiICIpOwotICAgICAgICAgICAgICAgIGlmIChOYW1lLkluZGV4T2YoJz8nKSA+IC0xKSBOYW1lID0gTmFtZS5SZXBsYWNlKCI/IiwgIiAiKTsKLSAgICAgICAgICAgICAgICBpZiAoTmFtZS5JbmRleE9mKCdbJykgPiAtMSkgTmFtZSA9IE5hbWUuUmVwbGFjZSgiWyIsICIgIik7Ci0gICAgICAgICAgICAgICAgaWYgKE5hbWUuSW5kZXhPZignXScpID4gLTEpIE5hbWUgPSBOYW1lLlJlcGxhY2UoIl0iLCAiICIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoTmFtZS5UcmltKCkgPT0gIiIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgd29ya3NoZWV0IGNhbiBub3QgaGF2ZSBhbiBlbXB0eSBuYW1lIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTmFtZS5MZW5ndGggPiAzMSkgTmFtZSA9IE5hbWUuU3Vic3RyaW5nKDAsIDMxKTsgICAvL0Egc2hlZXQgY2FuIGhhdmUgbWF4IDMxIGNoYXIncyAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIE5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVmFsaWRhdGUgdGhlIHNoZWV0bmFtZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPlRoZSBOYW1lPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRydWUgaWYgdmFsaWQ8L3JldHVybnM+Ci0gICAgICAgIHByaXZhdGUgYm9vbCBWYWxpZGF0ZU5hbWUoc3RyaW5nIE5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnMuUmVnZXguSXNNYXRjaChOYW1lLCBAIjp8XD98L3xcXHxcW3xcXSIpOwotICAgICAgICB9Ci0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQ3JlYXRlcyB0aGUgWE1MIGRvY3VtZW50IHJlcHJlc2VudGluZyBhIG5ldyBlbXB0eSB3b3Jrc2hlZXQKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLQkJaW50ZXJuYWwgWG1sRG9jdW1lbnQgQ3JlYXRlTmV3V29ya3NoZWV0KGJvb2wgaXNDaGFydCkKLQkJewotCQkJWG1sRG9jdW1lbnQgeG1sRG9jID0gbmV3IFhtbERvY3VtZW50KCk7Ci0gICAgICAgICAgICBYbWxFbGVtZW50IGVsZW1XcyA9IHhtbERvYy5DcmVhdGVFbGVtZW50KGlzQ2hhcnQgPyAiY2hhcnRzaGVldCIgOiAid29ya3NoZWV0IiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotICAgICAgICAgICAgZWxlbVdzLlNldEF0dHJpYnV0ZSgieG1sbnM6ciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzKTsKLSAgICAgICAgICAgIHhtbERvYy5BcHBlbmRDaGlsZChlbGVtV3MpOwotCi0KLSAgICAgICAgICAgIGlmIChpc0NoYXJ0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZWxlbVNoZWV0UHIgPSB4bWxEb2MuQ3JlYXRlRWxlbWVudCgic2hlZXRQciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgICAgICBlbGVtV3MuQXBwZW5kQ2hpbGQoZWxlbVNoZWV0UHIpOwotCi0gICAgICAgICAgICAgICAgWG1sRWxlbWVudCBlbGVtU2hlZXRWaWV3cyA9IHhtbERvYy5DcmVhdGVFbGVtZW50KCJzaGVldFZpZXdzIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotICAgICAgICAgICAgICAgIGVsZW1Xcy5BcHBlbmRDaGlsZChlbGVtU2hlZXRWaWV3cyk7Ci0KLSAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGVsZW1TaGVldFZpZXcgPSB4bWxEb2MuQ3JlYXRlRWxlbWVudCgic2hlZXRWaWV3IiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotICAgICAgICAgICAgICAgIGVsZW1TaGVldFZpZXcuU2V0QXR0cmlidXRlKCJ3b3JrYm9va1ZpZXdJZCIsICIwIik7Ci0gICAgICAgICAgICAgICAgZWxlbVNoZWV0Vmlldy5TZXRBdHRyaWJ1dGUoInpvb21Ub0ZpdCIsICIxIik7Ci0KLSAgICAgICAgICAgICAgICBlbGVtU2hlZXRWaWV3cy5BcHBlbmRDaGlsZChlbGVtU2hlZXRWaWV3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGVsZW1TaGVldFZpZXdzID0geG1sRG9jLkNyZWF0ZUVsZW1lbnQoInNoZWV0Vmlld3MiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICAgICAgZWxlbVdzLkFwcGVuZENoaWxkKGVsZW1TaGVldFZpZXdzKTsKLQotICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZWxlbVNoZWV0VmlldyA9IHhtbERvYy5DcmVhdGVFbGVtZW50KCJzaGVldFZpZXciLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICAgICAgZWxlbVNoZWV0Vmlldy5TZXRBdHRyaWJ1dGUoIndvcmtib29rVmlld0lkIiwgIjAiKTsKLSAgICAgICAgICAgICAgICBlbGVtU2hlZXRWaWV3cy5BcHBlbmRDaGlsZChlbGVtU2hlZXRWaWV3KTsKLQotICAgICAgICAgICAgICAgIFhtbEVsZW1lbnQgZWxlbVNoZWV0Rm9ybWF0UHIgPSB4bWxEb2MuQ3JlYXRlRWxlbWVudCgic2hlZXRGb3JtYXRQciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgICAgICBlbGVtU2hlZXRGb3JtYXRQci5TZXRBdHRyaWJ1dGUoImRlZmF1bHRSb3dIZWlnaHQiLCAiMTUiKTsKLSAgICAgICAgICAgICAgICBlbGVtV3MuQXBwZW5kQ2hpbGQoZWxlbVNoZWV0Rm9ybWF0UHIpOwotCi0gICAgICAgICAgICAgICAgWG1sRWxlbWVudCBlbGVtU2hlZXREYXRhID0geG1sRG9jLkNyZWF0ZUVsZW1lbnQoInNoZWV0RGF0YSIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgICAgICBlbGVtV3MuQXBwZW5kQ2hpbGQoZWxlbVNoZWV0RGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4geG1sRG9jOwotCQl9Ci0JCSNlbmRyZWdpb24KLQkKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gUmV0dXJucyB0aGUgd29ya3NoZWV0IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uICAKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJQb3NpdGlvbklEIj5UaGUgcG9zaXRpb24gb2YgdGhlIHdvcmtzaGVldC4gMS1iYXNlPC9wYXJhbT4KLQkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLQkJcHVibGljIEV4Y2VsV29ya3NoZWV0IHRoaXNbaW50IFBvc2l0aW9uSURdCi0JCXsKLQkJCWdldAotCQkJewotCQkJICAgIGlmIChfd29ya3NoZWV0cy5Db250YWluc0tleShQb3NpdGlvbklEKSkKLQkJCSAgICB7Ci0JCQkgICAgICAgIHJldHVybiBfd29ya3NoZWV0c1tQb3NpdGlvbklEXTsKLQkJCSAgICB9Ci0JCQkgICAgZWxzZQotCQkJICAgIHsKLQkJCSAgICAgICAgdGhyb3cgKG5ldyBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24oIldvcmtzaGVldCBwb3NpdGlvbiBvdXQgb2YgcmFuZ2UuIikpOwotCQkJICAgIH0KLQkJCX0KLQkJfQotCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFJldHVybnMgdGhlIHdvcmtzaGVldCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIG5hbWUKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJOYW1lIj5UaGUgbmFtZSBvZiB0aGUgd29ya3NoZWV0PC9wYXJhbT4KLQkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLQkJcHVibGljIEV4Y2VsV29ya3NoZWV0IHRoaXNbc3RyaW5nIE5hbWVdCi0JCXsKLQkJCWdldAotCQkJewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRCeU5hbWUoTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJI2VuZHJlZ2lvbgotICAgICAgICBpbnRlcm5hbCBFeGNlbFdvcmtzaGVldCBHZXRCeVNoZWV0SUQoaW50IGxvY2FsU2hlZXRJRCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yZWFjaCAoRXhjZWxXb3Jrc2hlZXQgd3MgaW4gdGhpcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAod3MuU2hlZXRJRCA9PSBsb2NhbFNoZWV0SUQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBHZXRCeU5hbWUoc3RyaW5nIE5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShOYW1lKSkgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB4bFdvcmtzaGVldCA9IG51bGw7Ci0gICAgICAgICAgICBmb3JlYWNoIChFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQgaW4gX3dvcmtzaGVldHMuVmFsdWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh3b3Jrc2hlZXQuTmFtZS5FcXVhbHMoTmFtZSwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCi0gICAgICAgICAgICAgICAgICAgIHhsV29ya3NoZWV0ID0gd29ya3NoZWV0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICh4bFdvcmtzaGVldCk7Ci0gICAgICAgIH0KLQkJI3JlZ2lvbiBNb3ZlQmVmb3JlIGFuZCBNb3ZlQWZ0ZXIgTWV0aG9kcwotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBNb3ZlcyB0aGUgc291cmNlIHdvcmtzaGVldCB0byB0aGUgcG9zaXRpb24gYmVmb3JlIHRoZSB0YXJnZXQgd29ya3NoZWV0Ci0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0ic291cmNlTmFtZSI+VGhlIG5hbWUgb2YgdGhlIHNvdXJjZSB3b3Jrc2hlZXQ8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9InRhcmdldE5hbWUiPlRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgd29ya3NoZWV0PC9wYXJhbT4KLQkJcHVibGljIHZvaWQgTW92ZUJlZm9yZShzdHJpbmcgc291cmNlTmFtZSwgc3RyaW5nIHRhcmdldE5hbWUpCi0JCXsKLQkJCU1vdmUoc291cmNlTmFtZSwgdGFyZ2V0TmFtZSwgZmFsc2UpOwotCQl9Ci0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gTW92ZXMgdGhlIHNvdXJjZSB3b3Jrc2hlZXQgdG8gdGhlIHBvc2l0aW9uIGJlZm9yZSB0aGUgdGFyZ2V0IHdvcmtzaGVldAotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InNvdXJjZVBvc2l0aW9uSWQiPlRoZSBpZCBvZiB0aGUgc291cmNlIHdvcmtzaGVldDwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0idGFyZ2V0UG9zaXRpb25JZCI+VGhlIGlkIG9mIHRoZSB0YXJnZXQgd29ya3NoZWV0PC9wYXJhbT4KLQkJcHVibGljIHZvaWQgTW92ZUJlZm9yZShpbnQgc291cmNlUG9zaXRpb25JZCwgaW50IHRhcmdldFBvc2l0aW9uSWQpCi0JCXsKLQkJCU1vdmUoc291cmNlUG9zaXRpb25JZCwgdGFyZ2V0UG9zaXRpb25JZCwgZmFsc2UpOwotCQl9Ci0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gTW92ZXMgdGhlIHNvdXJjZSB3b3Jrc2hlZXQgdG8gdGhlIHBvc2l0aW9uIGFmdGVyIHRoZSB0YXJnZXQgd29ya3NoZWV0Ci0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0ic291cmNlTmFtZSI+VGhlIG5hbWUgb2YgdGhlIHNvdXJjZSB3b3Jrc2hlZXQ8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9InRhcmdldE5hbWUiPlRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgd29ya3NoZWV0PC9wYXJhbT4KLQkJcHVibGljIHZvaWQgTW92ZUFmdGVyKHN0cmluZyBzb3VyY2VOYW1lLCBzdHJpbmcgdGFyZ2V0TmFtZSkKLQkJewotCQkJTW92ZShzb3VyY2VOYW1lLCB0YXJnZXROYW1lLCB0cnVlKTsKLQkJfQotCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIE1vdmVzIHRoZSBzb3VyY2Ugd29ya3NoZWV0IHRvIHRoZSBwb3NpdGlvbiBhZnRlciB0aGUgdGFyZ2V0IHdvcmtzaGVldAotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InNvdXJjZVBvc2l0aW9uSWQiPlRoZSBpZCBvZiB0aGUgc291cmNlIHdvcmtzaGVldDwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0idGFyZ2V0UG9zaXRpb25JZCI+VGhlIGlkIG9mIHRoZSB0YXJnZXQgd29ya3NoZWV0PC9wYXJhbT4KLQkJcHVibGljIHZvaWQgTW92ZUFmdGVyKGludCBzb3VyY2VQb3NpdGlvbklkLCBpbnQgdGFyZ2V0UG9zaXRpb25JZCkKLQkJewotCQkJTW92ZShzb3VyY2VQb3NpdGlvbklkLCB0YXJnZXRQb3NpdGlvbklkLCB0cnVlKTsKLQkJfQotCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIAotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InNvdXJjZU5hbWUiPjwvcGFyYW0+Ci0JCXB1YmxpYyB2b2lkIE1vdmVUb1N0YXJ0KHN0cmluZyBzb3VyY2VOYW1lKQotCQl7Ci0JCQl2YXIgc291cmNlU2hlZXQgPSB0aGlzW3NvdXJjZU5hbWVdOwotCQkJaWYgKHNvdXJjZVNoZWV0ID09IG51bGwpCi0JCQl7Ci0JCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJNb3ZlIHdvcmtzaGVldCBlcnJvcjogQ291bGQgbm90IGZpbmQgd29ya3NoZWV0IHRvIG1vdmUgJ3swfSciLCBzb3VyY2VOYW1lKSk7Ci0JCQl9Ci0JCQlNb3ZlKHNvdXJjZVNoZWV0LlBvc2l0aW9uSUQsIDEsIGZhbHNlKTsKLQkJfQotCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIAotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InNvdXJjZVBvc2l0aW9uSWQiPjwvcGFyYW0+Ci0JCXB1YmxpYyB2b2lkIE1vdmVUb1N0YXJ0KGludCBzb3VyY2VQb3NpdGlvbklkKQotCQl7Ci0JCQlNb3ZlKHNvdXJjZVBvc2l0aW9uSWQsIDEsIGZhbHNlKTsKLQkJfQotCi0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIAotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InNvdXJjZU5hbWUiPjwvcGFyYW0+Ci0JCXB1YmxpYyB2b2lkIE1vdmVUb0VuZChzdHJpbmcgc291cmNlTmFtZSkKLQkJewotCQkJdmFyIHNvdXJjZVNoZWV0ID0gdGhpc1tzb3VyY2VOYW1lXTsKLQkJCWlmIChzb3VyY2VTaGVldCA9PSBudWxsKQotCQkJewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiTW92ZSB3b3Jrc2hlZXQgZXJyb3I6IENvdWxkIG5vdCBmaW5kIHdvcmtzaGVldCB0byBtb3ZlICd7MH0nIiwgc291cmNlTmFtZSkpOwotCQkJfQotCQkJTW92ZShzb3VyY2VTaGVldC5Qb3NpdGlvbklELCBfd29ya3NoZWV0cy5Db3VudCwgdHJ1ZSk7Ci0JCX0KLQotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyAKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJzb3VyY2VQb3NpdGlvbklkIj48L3BhcmFtPgotCQlwdWJsaWMgdm9pZCBNb3ZlVG9FbmQoaW50IHNvdXJjZVBvc2l0aW9uSWQpCi0JCXsKLQkJCU1vdmUoc291cmNlUG9zaXRpb25JZCwgX3dvcmtzaGVldHMuQ291bnQsIHRydWUpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIE1vdmUoc3RyaW5nIHNvdXJjZU5hbWUsIHN0cmluZyB0YXJnZXROYW1lLCBib29sIHBsYWNlQWZ0ZXIpCi0JCXsKLQkJCXZhciBzb3VyY2VTaGVldCA9IHRoaXNbc291cmNlTmFtZV07Ci0JCQlpZiAoc291cmNlU2hlZXQgPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIk1vdmUgd29ya3NoZWV0IGVycm9yOiBDb3VsZCBub3QgZmluZCB3b3Jrc2hlZXQgdG8gbW92ZSAnezB9JyIsIHNvdXJjZU5hbWUpKTsKLQkJCX0KLQkJCXZhciB0YXJnZXRTaGVldCA9IHRoaXNbdGFyZ2V0TmFtZV07Ci0JCQlpZiAodGFyZ2V0U2hlZXQgPT0gbnVsbCkKLQkJCXsKLQkJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIk1vdmUgd29ya3NoZWV0IGVycm9yOiBDb3VsZCBub3QgZmluZCB3b3Jrc2hlZXQgdG8gbW92ZSAnezB9JyIsIHRhcmdldE5hbWUpKTsKLQkJCX0KLQkJCU1vdmUoc291cmNlU2hlZXQuUG9zaXRpb25JRCwgdGFyZ2V0U2hlZXQuUG9zaXRpb25JRCwgcGxhY2VBZnRlcik7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgTW92ZShpbnQgc291cmNlUG9zaXRpb25JZCwgaW50IHRhcmdldFBvc2l0aW9uSWQsIGJvb2wgcGxhY2VBZnRlcikKLQkJewotICAgICAgICAgICAgLy8gQnVnZml4OiBpZiBzb3VyY2UgYW5kIHRhcmdldCBhcmUgdGhlIHNhbWUgd29ya3NoZWV0IHRoZSBmb2xsb3dpbmcgY29kZSB3aWxsIGNyZWF0ZSBhIGR1cGxpY2F0ZQotICAgICAgICAgICAgLy8gICAgICAgICB3aGljaCB3aWxsIGNhdXNlIGEgY29ycnVwdCB3b3JrYm9vay4gL3N3bWFsIDIwMTQtMDUtMTAKLQkJICAgIGlmIChzb3VyY2VQb3NpdGlvbklkID09IHRhcmdldFBvc2l0aW9uSWQpIHJldHVybjsKLQotICAgICAgICAgICAgbG9jayAoX3dvcmtzaGVldHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNvdXJjZVNoZWV0ID0gdGhpc1tzb3VyY2VQb3NpdGlvbklkXTsKLSAgICAgICAgICAgICAgICBpZiAoc291cmNlU2hlZXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiTW92ZSB3b3Jrc2hlZXQgZXJyb3I6IENvdWxkIG5vdCBmaW5kIHdvcmtzaGVldCBhdCBwb3NpdGlvbiAnezB9JyIsIHNvdXJjZVBvc2l0aW9uSWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFyIHRhcmdldFNoZWV0ID0gdGhpc1t0YXJnZXRQb3NpdGlvbklkXTsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0U2hlZXQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiTW92ZSB3b3Jrc2hlZXQgZXJyb3I6IENvdWxkIG5vdCBmaW5kIHdvcmtzaGVldCBhdCBwb3NpdGlvbiAnezB9JyIsIHRhcmdldFBvc2l0aW9uSWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZVBvc2l0aW9uSWQgPT0gdGFyZ2V0UG9zaXRpb25JZCAmJiBfd29ya3NoZWV0cy5Db3VudCA8IDIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47CQkvLy0tLSBubyByZWFzb24gdG8gYXR0ZW1wdCB0byByZS1hcnJhbmdlIGEgc2luZ2xlIGl0ZW0gd2l0aCBpdHNlbGYKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSAxOwotICAgICAgICAgICAgICAgIHZhciBuZXdPcmRlciA9IG5ldyBEaWN0aW9uYXJ5PGludCwgRXhjZWxXb3Jrc2hlZXQ+KCk7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGVudHJ5IGluIF93b3Jrc2hlZXRzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LktleSA9PSB0YXJnZXRQb3NpdGlvbklkKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsYWNlQWZ0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlU2hlZXQuUG9zaXRpb25JRCA9IGluZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld09yZGVyLkFkZChpbmRleCsrLCBzb3VyY2VTaGVldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LlZhbHVlLlBvc2l0aW9uSUQgPSBpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld09yZGVyLkFkZChpbmRleCsrLCBlbnRyeS5WYWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGFjZUFmdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVNoZWV0LlBvc2l0aW9uSUQgPSBpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPcmRlci5BZGQoaW5kZXgrKywgc291cmNlU2hlZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJ5LktleSA9PSBzb3VyY2VQb3NpdGlvbklkKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLy0tLSBkbyBub3RoaW5nCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5WYWx1ZS5Qb3NpdGlvbklEID0gaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdPcmRlci5BZGQoaW5kZXgrKywgZW50cnkuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF93b3Jrc2hlZXRzID0gbmV3T3JkZXI7Ci0KLSAgICAgICAgICAgICAgICBNb3ZlU2hlZXRYbWxOb2RlKHNvdXJjZVNoZWV0LCB0YXJnZXRTaGVldCwgcGxhY2VBZnRlcik7Ci0gICAgICAgICAgICB9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgTW92ZVNoZWV0WG1sTm9kZShFeGNlbFdvcmtzaGVldCBzb3VyY2VTaGVldCwgRXhjZWxXb3Jrc2hlZXQgdGFyZ2V0U2hlZXQsIGJvb2wgcGxhY2VBZnRlcikKLQkJewotICAgICAgICAgICAgbG9jayAoVG9wTm9kZS5Pd25lckRvY3VtZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzb3VyY2VOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKHN0cmluZy5Gb3JtYXQoImQ6c2hlZXRbQHNoZWV0SWQgPSAnezB9J10iLCBzb3VyY2VTaGVldC5TaGVldElEKSwgX25hbWVzcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIHZhciB0YXJnZXROb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKHN0cmluZy5Gb3JtYXQoImQ6c2hlZXRbQHNoZWV0SWQgPSAnezB9J10iLCB0YXJnZXRTaGVldC5TaGVldElEKSwgX25hbWVzcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIGlmIChzb3VyY2VOb2RlID09IG51bGwgfHwgdGFyZ2V0Tm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiU291cmNlIFNoZWV0SWQgYW5kIFRhcmdldCBTaGVldElkIG11c3QgYmUgdmFsaWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBsYWNlQWZ0ZXIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUb3BOb2RlLkluc2VydEFmdGVyKHNvdXJjZU5vZGUsIHRhcmdldE5vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUb3BOb2RlLkluc2VydEJlZm9yZShzb3VyY2VOb2RlLCB0YXJnZXROb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0JCX0KLQotCQkjZW5kcmVnaW9uCi0gICAgfSAvLyBlbmQgY2xhc3MgV29ya3NoZWV0cwotfQorICBwcml2YXRlIHZvaWQgTW92ZVNoZWV0WG1sTm9kZSgKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHNvdXJjZVNoZWV0LAorICAgICAgRXhjZWxXb3Jrc2hlZXQgdGFyZ2V0U2hlZXQsCisgICAgICBib29sIHBsYWNlQWZ0ZXIpIHsKKyAgICBsb2NrIChUb3BOb2RlLk93bmVyRG9jdW1lbnQpIHsKKyAgICAgIHZhciBzb3VyY2VOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKAorICAgICAgICAgIHN0cmluZy5Gb3JtYXQoImQ6c2hlZXRbQHNoZWV0SWQgPSAnezB9J10iLCBzb3VyY2VTaGVldC5TaGVldElEKSwKKyAgICAgICAgICBfbmFtZXNwYWNlTWFuYWdlcik7CisgICAgICB2YXIgdGFyZ2V0Tm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgKKyAgICAgICAgICBzdHJpbmcuRm9ybWF0KCJkOnNoZWV0W0BzaGVldElkID0gJ3swfSddIiwgdGFyZ2V0U2hlZXQuU2hlZXRJRCksCisgICAgICAgICAgX25hbWVzcGFjZU1hbmFnZXIpOworICAgICAgaWYgKHNvdXJjZU5vZGUgPT0gbnVsbCB8fCB0YXJnZXROb2RlID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3KCJTb3VyY2UgU2hlZXRJZCBhbmQgVGFyZ2V0IFNoZWV0SWQgbXVzdCBiZSB2YWxpZCIpOworICAgICAgfQorICAgICAgaWYgKHBsYWNlQWZ0ZXIpIHsKKyAgICAgICAgVG9wTm9kZS5JbnNlcnRBZnRlcihzb3VyY2VOb2RlLCB0YXJnZXROb2RlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFRvcE5vZGUuSW5zZXJ0QmVmb3JlKHNvdXJjZU5vZGUsIHRhcmdldE5vZGUpOworICAgICAgfQorICAgIH0KKyAgfQorfSAvLyBlbmQgY2xhc3MgV29ya3NoZWV0cwpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0NhbGN1bGF0ZUV4dGVudGlvbnMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvQ2FsY3VsYXRlRXh0ZW50aW9ucy5jcwppbmRleCA2OWJjM2VlLi45Y2IxYzI4IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvQ2FsY3VsYXRlRXh0ZW50aW9ucy5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvQ2FsY3VsYXRlRXh0ZW50aW9ucy5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTkzICsxMywxODEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSmFuIEvDpGxsbWFuICAgICAgICAgICAgICAgICAgICAgIEFkZGVkICAgICAgICAgICAgICAgICAgICAgICAyMDEyLTAzLTA0ICAKKyAqIEphbiBLw6RsbG1hbiAgICAgICAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAgICAgICAgICAgICAgICAgMjAxMi0wMy0wNAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXVzaW5nIFN5c3RlbS5UaHJlYWRpbmc7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uSU87CiB1c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKLXVzaW5nIFN5c3RlbS5JTzsKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCi17Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWxjdWxhdGlvbkV4dGVuc2lvbgotICAgIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIENhbGN1bGF0ZSh0aGlzIEV4Y2VsV29ya2Jvb2sgd29ya2Jvb2spCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhbGN1bGF0ZSh3b3JrYm9vaywgbmV3IEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24oKXtBbGxvd0NpcmN1bGFyZVJlZmVyZW5jZXM9ZmFsc2V9KTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQ2FsY3VsYXRlKHRoaXMgRXhjZWxXb3JrYm9vayB3b3JrYm9vaywgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbiBvcHRpb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbml0KHdvcmtib29rKTsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwogCi0gICAgICAgICAgICB2YXIgZGMgPSBEZXBlbmRlbmN5Q2hhaW5GYWN0b3J5LkNyZWF0ZSh3b3JrYm9vaywgb3B0aW9ucyk7Ci0gICAgICAgICAgICB3b3JrYm9vay5Gb3JtdWxhUGFyc2VyLkluaXROZXdDYWxjKCk7Ci0gICAgICAgICAgICBDYWxjQ2hhaW4od29ya2Jvb2ssIHdvcmtib29rLkZvcm11bGFQYXJzZXIsIGRjKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQ2FsY3VsYXRlKHRoaXMgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBDYWxjdWxhdGUod29ya3NoZWV0LCBuZXcgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQ2FsY3VsYXRlKHRoaXMgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBFeGNlbENhbGN1bGF0aW9uT3B0aW9uIG9wdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluaXQod29ya3NoZWV0Lldvcmtib29rKTsKLSAgICAgICAgICAgIC8vd29ya3NoZWV0Lldvcmtib29rLl9mb3JtdWxhUGFyc2VyID0gbnVsbDsgVE9ETzpDYW50IHJlc2V0LiBEb24ndCB3b3JrIHdpdGggdXNlcmRlZmluZWQgb3Igb3ZlcnJpZGVkIHdvcmtzaGVldCBmdW5jdGlvbnMgICAgICAgICAgICAKLSAgICAgICAgICAgIHZhciBkYyA9IERlcGVuZGVuY3lDaGFpbkZhY3RvcnkuQ3JlYXRlKHdvcmtzaGVldCwgb3B0aW9ucyk7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbDsKIAotICAgICAgICAgICAgLy8gRGlzcGxheSBDYWxjIENoYWluIHRvIGRldGVybWluZSB3aHkgZm9ybXVsYSBjYWxjdWxhdGlvbiBpcyB0YWtpbmcgc28gbG9uZy4KLSAgICAgICAgICAgIC8vIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gZGlzcGxheSB0aGUgQ2FsYyBDaGFpbi4KLSAgICAgICAgICAgIC8vIERpc3BsYXlDYWxjQ2hhaW4od29ya3NoZWV0LCBkYyk7CitwdWJsaWMgc3RhdGljIGNsYXNzIENhbGN1bGF0aW9uRXh0ZW5zaW9uIHsKKyAgcHVibGljIHN0YXRpYyB2b2lkIENhbGN1bGF0ZSh0aGlzIEV4Y2VsV29ya2Jvb2sgd29ya2Jvb2spIHsKKyAgICBDYWxjdWxhdGUoCisgICAgICAgIHdvcmtib29rLAorICAgICAgICBuZXcoKSB7CisgICAgICAgICAgQWxsb3dDaXJjdWxhcmVSZWZlcmVuY2VzID0gZmFsc2UsCisgICAgICAgIH0pOworICB9CiAKLSAgICAgICAgICAgIHZhciBwYXJzZXIgPSB3b3Jrc2hlZXQuV29ya2Jvb2suRm9ybXVsYVBhcnNlcjsKLSAgICAgICAgICAgIHBhcnNlci5Jbml0TmV3Q2FsYygpOwotICAgICAgICAgICAgQ2FsY0NoYWluKHdvcmtzaGVldC5Xb3JrYm9vaywgcGFyc2VyLCBkYyk7Ci0gICAgICAgIH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIENhbGN1bGF0ZSh0aGlzIEV4Y2VsV29ya2Jvb2sgd29ya2Jvb2ssIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykgeworICAgIEluaXQod29ya2Jvb2spOwogCi0gICAgICAgIC8vIEkgYWRkZWQgdGhpcyBtZXRob2QgaW4gRGVjZW1iZXIgMjAxOSB0byBhbmFseXplIHdoeSBmb3JtdWxhIGNhbGN1bGF0aW9uIHdhcyB0YWtpbmcKLSAgICAgICAgLy8gc28gbG9uZyBkdXJpbmcgYSAnUmVnZW5lcmF0ZScgb2YgYSBNaWNyb3NvZnQgRXhjZWwgdGFibGUuCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgRGlzcGxheUNhbGNDaGFpbihFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIERlcGVuZGVuY3lDaGFpbiBkYykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gT3BlbiBPdXRwdXQgZmlsZQotICAgICAgICAgICAgc3RyaW5nIG91dHB1dEZvbGRlck5hbWUgPSBAIkM6XFxFUFBsdXMiOwotICAgICAgICAgICAgRGlyZWN0b3J5LkNyZWF0ZURpcmVjdG9yeShvdXRwdXRGb2xkZXJOYW1lKTsKLSAgICAgICAgICAgIERhdGVUaW1lIGludm9jYXRpb25EYXRlVGltZSA9IERhdGVUaW1lLk5vdzsKLSAgICAgICAgICAgIHN0cmluZyBvdXRwdXRGaWxlTmFtZSA9IFBhdGguQ29tYmluZShvdXRwdXRGb2xkZXJOYW1lLCAkIkNhbGNDaGFpbl97d29ya3NoZWV0Lk5hbWV9X3tpbnZvY2F0aW9uRGF0ZVRpbWUuVG9TdHJpbmcoInl5eXlNTWRkX0hIbW1zc19mZmYiKX0udHh0Iik7Ci0gICAgICAgICAgICBGaWxlU3RyZWFtIGZpbGVTdHJlYW0gPSBuZXcgRmlsZVN0cmVhbShvdXRwdXRGaWxlTmFtZSwgRmlsZU1vZGUuQ3JlYXRlTmV3KTsKLSAgICAgICAgICAgIFN0cmVhbVdyaXRlciBzdHJlYW1Xcml0ZXIgPSBuZXcgU3lzdGVtLklPLlN0cmVhbVdyaXRlcihmaWxlU3RyZWFtLCBFbmNvZGluZy5VVEY4LCA2NTUzNik7CisgICAgdmFyIGRjID0gRGVwZW5kZW5jeUNoYWluRmFjdG9yeS5DcmVhdGUod29ya2Jvb2ssIG9wdGlvbnMpOworICAgIHdvcmtib29rLkZvcm11bGFQYXJzZXIuSW5pdE5ld0NhbGMoKTsKKyAgICBDYWxjQ2hhaW4od29ya2Jvb2ssIHdvcmtib29rLkZvcm11bGFQYXJzZXIsIGRjKTsKKyAgfQogCi0gICAgICAgICAgICAvLyBEaXNwbGF5IENhbGNDaGFpbgotICAgICAgICAgICAgZm9yZWFjaCAoaW50IGluZGV4IGluIGRjLkNhbGNPcmRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGb3JtdWxhQ2VsbCBmb3JtdWxhQ2VsbCA9IGRjLmxpc3RbaW5kZXhdOwotICAgICAgICAgICAgICAgIHN0cmluZyBjYWxjQ2hhaW5WYWx1ZSA9ICIiOwotICAgICAgICAgICAgICAgIGNhbGNDaGFpblZhbHVlICs9ICQiSW5kZXgge2luZGV4fSwgIjsKLSAgICAgICAgICAgICAgICBjYWxjQ2hhaW5WYWx1ZSArPSAkIldvcmtzaGVldCAne2Zvcm11bGFDZWxsLndzLk5hbWV9JywgIjsKLSAgICAgICAgICAgICAgICBjYWxjQ2hhaW5WYWx1ZSArPSAkIlJvdyB7Zm9ybXVsYUNlbGwuUm93fSwgIjsKLSAgICAgICAgICAgICAgICBjYWxjQ2hhaW5WYWx1ZSArPSAkIkNvbCB7Zm9ybXVsYUNlbGwuQ29sdW1ufSwgIjsKLSAgICAgICAgICAgICAgICBjYWxjQ2hhaW5WYWx1ZSArPSAkIiBGb3JtdWxhICd7Zm9ybXVsYUNlbGwuRm9ybXVsYX0nIjsKLSAgICAgICAgICAgICAgICBzdHJlYW1Xcml0ZXIuV3JpdGVMaW5lKGNhbGNDaGFpblZhbHVlKTsKLSAgICAgICAgICAgIH0KKyAgcHVibGljIHN0YXRpYyB2b2lkIENhbGN1bGF0ZSh0aGlzIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCkgeworICAgIENhbGN1bGF0ZSh3b3Jrc2hlZXQsIG5ldyBFeGNlbENhbGN1bGF0aW9uT3B0aW9uKCkpOworICB9CiAKLSAgICAgICAgICAgIC8vIENsb3NlIE91dHB1dCBmaWxlCi0gICAgICAgICAgICBzdHJlYW1Xcml0ZXIuRmx1c2goKTsKLSAgICAgICAgICAgIHN0cmVhbVdyaXRlci5DbG9zZSgpOwotICAgICAgICB9CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBDYWxjdWxhdGUodGhpcyBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykgeworICAgIEluaXQod29ya3NoZWV0Lldvcmtib29rKTsKKyAgICAvL3dvcmtzaGVldC5Xb3JrYm9vay5fZm9ybXVsYVBhcnNlciA9IG51bGw7IFRPRE86Q2FudCByZXNldC4gRG9uJ3Qgd29yayB3aXRoIHVzZXJkZWZpbmVkIG9yIG92ZXJyaWRlZCB3b3Jrc2hlZXQgZnVuY3Rpb25zCisgICAgdmFyIGRjID0gRGVwZW5kZW5jeUNoYWluRmFjdG9yeS5DcmVhdGUod29ya3NoZWV0LCBvcHRpb25zKTsKIAotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQ2FsY3VsYXRlKHRoaXMgRXhjZWxSYW5nZUJhc2UgcmFuZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhbGN1bGF0ZShyYW5nZSwgbmV3IEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIENhbGN1bGF0ZSh0aGlzIEV4Y2VsUmFuZ2VCYXNlIHJhbmdlLCBFeGNlbENhbGN1bGF0aW9uT3B0aW9uIG9wdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluaXQocmFuZ2UuX3dvcmtib29rKTsKLSAgICAgICAgICAgIHZhciBwYXJzZXIgPSByYW5nZS5fd29ya2Jvb2suRm9ybXVsYVBhcnNlcjsKLSAgICAgICAgICAgIHBhcnNlci5Jbml0TmV3Q2FsYygpOwotICAgICAgICAgICAgdmFyIGRjID0gRGVwZW5kZW5jeUNoYWluRmFjdG9yeS5DcmVhdGUocmFuZ2UsIG9wdGlvbnMpOwotICAgICAgICAgICAgQ2FsY0NoYWluKHJhbmdlLl93b3JrYm9vaywgcGFyc2VyLCBkYyk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHN0YXRpYyBvYmplY3QgQ2FsY3VsYXRlKHRoaXMgRXhjZWxXb3Jrc2hlZXQgd29ya3NoZWV0LCBzdHJpbmcgRm9ybXVsYSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENhbGN1bGF0ZSh3b3Jrc2hlZXQsIEZvcm11bGEsIG5ldyBFeGNlbENhbGN1bGF0aW9uT3B0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgb2JqZWN0IENhbGN1bGF0ZSh0aGlzIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIEZvcm11bGEsIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd29ya3NoZWV0LkNoZWNrU2hlZXRUeXBlKCk7Ci0gICAgICAgICAgICAgICAgaWYoc3RyaW5nLklzTnVsbE9yRW1wdHkoRm9ybXVsYS5UcmltKCkpKSByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICBJbml0KHdvcmtzaGVldC5Xb3JrYm9vayk7Ci0gICAgICAgICAgICAgICAgdmFyIHBhcnNlciA9IHdvcmtzaGVldC5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyOwotICAgICAgICAgICAgICAgIHBhcnNlci5Jbml0TmV3Q2FsYygpOwotICAgICAgICAgICAgICAgIGlmIChGb3JtdWxhWzBdID09ICc9JykgRm9ybXVsYSA9IEZvcm11bGEuU3Vic3RyaW5nKDEpOyAvL1JlbW92ZSBhbnkgc3RhcnRpbmcgZXF1YWwgc2lnbgotICAgICAgICAgICAgICAgIHZhciBkYyA9IERlcGVuZGVuY3lDaGFpbkZhY3RvcnkuQ3JlYXRlKHdvcmtzaGVldCwgRm9ybXVsYSwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgdmFyIGYgPSBkYy5saXN0WzBdOwotICAgICAgICAgICAgICAgIGRjLkNhbGNPcmRlci5SZW1vdmVBdChkYy5DYWxjT3JkZXIuQ291bnQgLSAxKTsKKyAgICAvLyBEaXNwbGF5IENhbGMgQ2hhaW4gdG8gZGV0ZXJtaW5lIHdoeSBmb3JtdWxhIGNhbGN1bGF0aW9uIGlzIHRha2luZyBzbyBsb25nLgorICAgIC8vIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gZGlzcGxheSB0aGUgQ2FsYyBDaGFpbi4KKyAgICAvLyBEaXNwbGF5Q2FsY0NoYWluKHdvcmtzaGVldCwgZGMpOwogCi0gICAgICAgICAgICAgICAgQ2FsY0NoYWluKHdvcmtzaGVldC5Xb3JrYm9vaywgcGFyc2VyLCBkYyk7CisgICAgdmFyIHBhcnNlciA9IHdvcmtzaGVldC5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyOworICAgIHBhcnNlci5Jbml0TmV3Q2FsYygpOworICAgIENhbGNDaGFpbih3b3Jrc2hlZXQuV29ya2Jvb2ssIHBhcnNlciwgZGMpOworICB9CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyLlBhcnNlQ2VsbChmLlRva2Vucywgd29ya3NoZWV0Lk5hbWUsIC0xLCAtMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGV4Lk1lc3NhZ2UsIEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ2FsY0NoYWluKEV4Y2VsV29ya2Jvb2sgd2IsIEZvcm11bGFQYXJzZXIgcGFyc2VyLCBEZXBlbmRlbmN5Q2hhaW4gZGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpeCBpbiBkYy5DYWxjT3JkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBkYy5saXN0W2l4XTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciB3cyA9IHdiLldvcmtzaGVldHMuR2V0QnlTaGVldElEKGl0ZW0uU2hlZXRJRCk7Ci0gICAgICAgICAgICAgICAgICAgIHZhciB2ID0gcGFyc2VyLlBhcnNlQ2VsbChpdGVtLlRva2Vucywgd3MgPT0gbnVsbCA/ICIiIDogd3MuTmFtZSwgaXRlbS5Sb3csIGl0ZW0uQ29sdW1uKTsKLSAgICAgICAgICAgICAgICAgICAgU2V0VmFsdWUod2IsIGl0ZW0sIHYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRnVuY3Rpb25FeGNlcHRpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBFeGNlbCBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IEVQUGx1cwotICAgICAgICAgICAgICAgICAgICB0aHJvdzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGVycm9yID0gRXhjZWxFcnJvclZhbHVlLlBhcnNlKEV4Y2VsRXJyb3JWYWx1ZS5WYWx1ZXMuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBTZXRWYWx1ZSh3YiwgaXRlbSwgZXJyb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEluaXQoRXhjZWxXb3JrYm9vayB3b3JrYm9vaykKLSAgICAgICAgewotICAgICAgICAgICAgd29ya2Jvb2suX2Zvcm11bGFUb2tlbnMgPSBuZXcgQ2VsbFN0b3JlPExpc3Q8VG9rZW4+PigpOzsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciB3cyBpbiB3b3JrYm9vay5Xb3Jrc2hlZXRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghKHdzIGlzIEV4Y2VsQ2hhcnRzaGVldCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3cy5fZm9ybXVsYVRva2VucyA9IG5ldyBDZWxsU3RvcmU8TGlzdDxUb2tlbj4+KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgIC8vIEkgYWRkZWQgdGhpcyBtZXRob2QgaW4gRGVjZW1iZXIgMjAxOSB0byBhbmFseXplIHdoeSBmb3JtdWxhIGNhbGN1bGF0aW9uIHdhcyB0YWtpbmcKKyAgLy8gc28gbG9uZyBkdXJpbmcgYSAnUmVnZW5lcmF0ZScgb2YgYSBNaWNyb3NvZnQgRXhjZWwgdGFibGUuCisgIHByaXZhdGUgc3RhdGljIHZvaWQgRGlzcGxheUNhbGNDaGFpbihFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsIERlcGVuZGVuY3lDaGFpbiBkYykgeworICAgIC8vIE9wZW4gT3V0cHV0IGZpbGUKKyAgICBzdHJpbmcgb3V0cHV0Rm9sZGVyTmFtZSA9IEAiQzpcXEVQUGx1cyI7CisgICAgRGlyZWN0b3J5LkNyZWF0ZURpcmVjdG9yeShvdXRwdXRGb2xkZXJOYW1lKTsKKyAgICBEYXRlVGltZSBpbnZvY2F0aW9uRGF0ZVRpbWUgPSBEYXRlVGltZS5Ob3c7CisgICAgc3RyaW5nIG91dHB1dEZpbGVOYW1lID0gUGF0aC5Db21iaW5lKAorICAgICAgICBvdXRwdXRGb2xkZXJOYW1lLAorICAgICAgICAkIkNhbGNDaGFpbl97d29ya3NoZWV0Lk5hbWV9X3tpbnZvY2F0aW9uRGF0ZVRpbWUuVG9TdHJpbmcoInl5eXlNTWRkX0hIbW1zc19mZmYiKX0udHh0Iik7CisgICAgRmlsZVN0cmVhbSBmaWxlU3RyZWFtID0gbmV3IEZpbGVTdHJlYW0ob3V0cHV0RmlsZU5hbWUsIEZpbGVNb2RlLkNyZWF0ZU5ldyk7CisgICAgU3RyZWFtV3JpdGVyIHN0cmVhbVdyaXRlciA9IG5ldyBTdHJlYW1Xcml0ZXIoZmlsZVN0cmVhbSwgRW5jb2RpbmcuVVRGOCwgNjU1MzYpOwogCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgU2V0VmFsdWUoRXhjZWxXb3JrYm9vayB3b3JrYm9vaywgRm9ybXVsYUNlbGwgaXRlbSwgb2JqZWN0IHYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpdGVtLkNvbHVtbiA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpdGVtLlNoZWV0SUQgPD0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtib29rLk5hbWVzW2l0ZW0uUm93XS5OYW1lVmFsdWUgPSB2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgc2ggPSB3b3JrYm9vay5Xb3Jrc2hlZXRzLkdldEJ5U2hlZXRJRChpdGVtLlNoZWV0SUQpOwotICAgICAgICAgICAgICAgICAgICBzaC5OYW1lc1tpdGVtLlJvd10uTmFtZVZhbHVlID0gdjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNoZWV0ID0gd29ya2Jvb2suV29ya3NoZWV0cy5HZXRCeVNoZWV0SUQoaXRlbS5TaGVldElEKTsKLSAgICAgICAgICAgICAgICBzaGVldC5fdmFsdWVzLlNldFZhbHVlKGl0ZW0uUm93LCBpdGVtLkNvbHVtbiwgdik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAvLyBEaXNwbGF5IENhbGNDaGFpbgorICAgIGZvcmVhY2ggKGludCBpbmRleCBpbiBkYy5DYWxjT3JkZXIpIHsKKyAgICAgIEZvcm11bGFDZWxsIGZvcm11bGFDZWxsID0gZGMubGlzdFtpbmRleF07CisgICAgICBzdHJpbmcgY2FsY0NoYWluVmFsdWUgPSAiIjsKKyAgICAgIGNhbGNDaGFpblZhbHVlICs9ICQiSW5kZXgge2luZGV4fSwgIjsKKyAgICAgIGNhbGNDaGFpblZhbHVlICs9ICQiV29ya3NoZWV0ICd7Zm9ybXVsYUNlbGwud3MuTmFtZX0nLCAiOworICAgICAgY2FsY0NoYWluVmFsdWUgKz0gJCJSb3cge2Zvcm11bGFDZWxsLlJvd30sICI7CisgICAgICBjYWxjQ2hhaW5WYWx1ZSArPSAkIkNvbCB7Zm9ybXVsYUNlbGwuQ29sdW1ufSwgIjsKKyAgICAgIGNhbGNDaGFpblZhbHVlICs9ICQiIEZvcm11bGEgJ3tmb3JtdWxhQ2VsbC5Gb3JtdWxhfSciOworICAgICAgc3RyZWFtV3JpdGVyLldyaXRlTGluZShjYWxjQ2hhaW5WYWx1ZSk7CiAgICAgfQorCisgICAgLy8gQ2xvc2UgT3V0cHV0IGZpbGUKKyAgICBzdHJlYW1Xcml0ZXIuRmx1c2goKTsKKyAgICBzdHJlYW1Xcml0ZXIuQ2xvc2UoKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBDYWxjdWxhdGUodGhpcyBFeGNlbFJhbmdlQmFzZSByYW5nZSkgeworICAgIENhbGN1bGF0ZShyYW5nZSwgbmV3KCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIENhbGN1bGF0ZSh0aGlzIEV4Y2VsUmFuZ2VCYXNlIHJhbmdlLCBFeGNlbENhbGN1bGF0aW9uT3B0aW9uIG9wdGlvbnMpIHsKKyAgICBJbml0KHJhbmdlLl93b3JrYm9vayk7CisgICAgdmFyIHBhcnNlciA9IHJhbmdlLl93b3JrYm9vay5Gb3JtdWxhUGFyc2VyOworICAgIHBhcnNlci5Jbml0TmV3Q2FsYygpOworICAgIHZhciBkYyA9IERlcGVuZGVuY3lDaGFpbkZhY3RvcnkuQ3JlYXRlKHJhbmdlLCBvcHRpb25zKTsKKyAgICBDYWxjQ2hhaW4ocmFuZ2UuX3dvcmtib29rLCBwYXJzZXIsIGRjKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgb2JqZWN0IENhbGN1bGF0ZSh0aGlzIEV4Y2VsV29ya3NoZWV0IHdvcmtzaGVldCwgc3RyaW5nIGZvcm11bGEpIHsKKyAgICByZXR1cm4gQ2FsY3VsYXRlKHdvcmtzaGVldCwgZm9ybXVsYSwgbmV3KCkpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBvYmplY3QgQ2FsY3VsYXRlKAorICAgICAgdGhpcyBFeGNlbFdvcmtzaGVldCB3b3Jrc2hlZXQsCisgICAgICBzdHJpbmcgZm9ybXVsYSwKKyAgICAgIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykgeworICAgIHRyeSB7CisgICAgICB3b3Jrc2hlZXQuQ2hlY2tTaGVldFR5cGUoKTsKKyAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShmb3JtdWxhLlRyaW0oKSkpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICBJbml0KHdvcmtzaGVldC5Xb3JrYm9vayk7CisgICAgICB2YXIgcGFyc2VyID0gd29ya3NoZWV0Lldvcmtib29rLkZvcm11bGFQYXJzZXI7CisgICAgICBwYXJzZXIuSW5pdE5ld0NhbGMoKTsKKyAgICAgIGlmIChmb3JtdWxhWzBdID09ICc9JykgeworICAgICAgICBmb3JtdWxhID0gZm9ybXVsYS5TdWJzdHJpbmcoMSk7IC8vUmVtb3ZlIGFueSBzdGFydGluZyBlcXVhbCBzaWduCisgICAgICB9CisgICAgICB2YXIgZGMgPSBEZXBlbmRlbmN5Q2hhaW5GYWN0b3J5LkNyZWF0ZSh3b3Jrc2hlZXQsIGZvcm11bGEsIG9wdGlvbnMpOworICAgICAgdmFyIGYgPSBkYy5saXN0WzBdOworICAgICAgZGMuQ2FsY09yZGVyLlJlbW92ZUF0KGRjLkNhbGNPcmRlci5Db3VudCAtIDEpOworCisgICAgICBDYWxjQ2hhaW4od29ya3NoZWV0Lldvcmtib29rLCBwYXJzZXIsIGRjKTsKKworICAgICAgcmV0dXJuIHBhcnNlci5QYXJzZUNlbGwoZi5Ub2tlbnMsIHdvcmtzaGVldC5OYW1lLCAtMSwgLTEpOworICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZXguTWVzc2FnZSwgRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBDYWxjQ2hhaW4oRXhjZWxXb3JrYm9vayB3YiwgRm9ybXVsYVBhcnNlciBwYXJzZXIsIERlcGVuZGVuY3lDaGFpbiBkYykgeworICAgIGZvcmVhY2ggKHZhciBpeCBpbiBkYy5DYWxjT3JkZXIpIHsKKyAgICAgIHZhciBpdGVtID0gZGMubGlzdFtpeF07CisgICAgICB0cnkgeworICAgICAgICB2YXIgd3MgPSB3Yi5Xb3Jrc2hlZXRzLkdldEJ5U2hlZXRJZChpdGVtLlNoZWV0SUQpOworICAgICAgICB2YXIgdiA9IHBhcnNlci5QYXJzZUNlbGwoaXRlbS5Ub2tlbnMsIHdzID09IG51bGwgPyAiIiA6IHdzLk5hbWUsIGl0ZW0uUm93LCBpdGVtLkNvbHVtbik7CisgICAgICAgIFNldFZhbHVlKHdiLCBpdGVtLCB2KTsKKyAgICAgIH0gY2F0Y2ggKEZ1bmN0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgIC8vIEV4Y2VsIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgRVBQbHVzCisgICAgICAgIHRocm93OworICAgICAgfSBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93OworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uKSB7CisgICAgICAgIHZhciBlcnJvciA9IEV4Y2VsRXJyb3JWYWx1ZS5QYXJzZShFeGNlbEVycm9yVmFsdWUuVmFsdWVzLlZhbHVlKTsKKyAgICAgICAgU2V0VmFsdWUod2IsIGl0ZW0sIGVycm9yKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIEluaXQoRXhjZWxXb3JrYm9vayB3b3JrYm9vaykgeworICAgIHdvcmtib29rLl9mb3JtdWxhVG9rZW5zID0gbmV3KCk7CisgICAgOworICAgIGZvcmVhY2ggKHZhciB3cyBpbiB3b3JrYm9vay5Xb3Jrc2hlZXRzKSB7CisgICAgICBpZiAoISh3cyBpcyBFeGNlbENoYXJ0c2hlZXQpKSB7CisgICAgICAgIHdzLl9mb3JtdWxhVG9rZW5zID0gbmV3KCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBTZXRWYWx1ZShFeGNlbFdvcmtib29rIHdvcmtib29rLCBGb3JtdWxhQ2VsbCBpdGVtLCBvYmplY3QgdikgeworICAgIGlmIChpdGVtLkNvbHVtbiA9PSAwKSB7CisgICAgICBpZiAoaXRlbS5TaGVldElEIDw9IDApIHsKKyAgICAgICAgd29ya2Jvb2suTmFtZXNbaXRlbS5Sb3ddLk5hbWVWYWx1ZSA9IHY7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YXIgc2ggPSB3b3JrYm9vay5Xb3Jrc2hlZXRzLkdldEJ5U2hlZXRJZChpdGVtLlNoZWV0SUQpOworICAgICAgICBzaC5OYW1lc1tpdGVtLlJvd10uTmFtZVZhbHVlID0gdjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdmFyIHNoZWV0ID0gd29ya2Jvb2suV29ya3NoZWV0cy5HZXRCeVNoZWV0SWQoaXRlbS5TaGVldElEKTsKKyAgICAgIHNoZWV0Ll92YWx1ZXMuU2V0VmFsdWUoaXRlbS5Sb3csIGl0ZW0uQ29sdW1uLCB2KTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9EZXBlbmRlbmN5Q2hhaW4vRGVwZW5kZW5jeUNoYWluLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0RlcGVuZGVuY3lDaGFpbi9EZXBlbmRlbmN5Q2hhaW4uY3MKaW5kZXggOWJjOTM2Zi4uNzRhMGE3ZSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0RlcGVuZGVuY3lDaGFpbi9EZXBlbmRlbmN5Q2hhaW4uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0RlcGVuZGVuY3lDaGFpbi9EZXBlbmRlbmN5Q2hhaW4uY3MKQEAgLTEsMTcgKzEsMTUgQEAKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZwotewotICAgIGludGVybmFsIGNsYXNzIERlcGVuZGVuY3lDaGFpbgotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgTGlzdDxGb3JtdWxhQ2VsbD4gbGlzdCA9IG5ldyBMaXN0PEZvcm11bGFDZWxsPigpOwotICAgICAgICBpbnRlcm5hbCBEaWN0aW9uYXJ5PHVsb25nLCBpbnQ+IGluZGV4ID0gbmV3IERpY3Rpb25hcnk8dWxvbmcsIGludD4oKTsKLSAgICAgICAgaW50ZXJuYWwgTGlzdDxpbnQ+IENhbGNPcmRlciA9IG5ldyBMaXN0PGludD4oKTsKLSAgICAgICAgaW50ZXJuYWwgdm9pZCBBZGQoRm9ybXVsYUNlbGwgZikKLSAgICAgICAgewotICAgICAgICAgICAgbGlzdC5BZGQoZik7Ci0gICAgICAgICAgICBmLkluZGV4ID0gbGlzdC5Db3VudCAtIDE7Ci0gICAgICAgICAgICBpbmRleC5BZGQoRXhjZWxDZWxsQmFzZS5HZXRDZWxsSUQoZi5TaGVldElELCBmLlJvdywgZi5Db2x1bW4pLCBmLkluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKKworaW50ZXJuYWwgY2xhc3MgRGVwZW5kZW5jeUNoYWluIHsKKyAgaW50ZXJuYWwgTGlzdDxGb3JtdWxhQ2VsbD4gbGlzdCA9IG5ldygpOworICBpbnRlcm5hbCBEaWN0aW9uYXJ5PHVsb25nLCBpbnQ+IGluZGV4ID0gbmV3KCk7CisgIGludGVybmFsIExpc3Q8aW50PiBDYWxjT3JkZXIgPSBuZXcoKTsKKworICBpbnRlcm5hbCB2b2lkIEFkZChGb3JtdWxhQ2VsbCBmKSB7CisgICAgbGlzdC5BZGQoZik7CisgICAgZi5JbmRleCA9IGxpc3QuQ291bnQgLSAxOworICAgIGluZGV4LkFkZChFeGNlbENlbGxCYXNlLkdldENlbGxJZChmLlNoZWV0SUQsIGYuUm93LCBmLkNvbHVtbiksIGYuSW5kZXgpOworICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRGVwZW5kZW5jeUNoYWluL0RlcGVuZGVueUNoYWluRmFjdG9yeS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9EZXBlbmRlbmN5Q2hhaW4vRGVwZW5kZW55Q2hhaW5GYWN0b3J5LmNzCmluZGV4IGMxNTA4MTcuLmJkM2JiZDkgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9EZXBlbmRlbmN5Q2hhaW4vRGVwZW5kZW55Q2hhaW5GYWN0b3J5LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9EZXBlbmRlbmN5Q2hhaW4vRGVwZW5kZW55Q2hhaW5GYWN0b3J5LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywzNTQgKzEzLDM2MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBKYW4gS8OkbGxtYW4gICAgICAgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgICAgICAgICAgICAgICAgIDIwMTItMDMtMDQgIAorICogSmFuIEvDpGxsbWFuICAgICAgICAgICAgICAgICAgICAgIEFkZGVkICAgICAgICAgICAgICAgICAgICAgICAyMDEyLTAzLTA0CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nCi17Ci0gICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIERlcGVuZGVuY3lDaGFpbkZhY3RvcnkKLSAgICB7Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBEZXBlbmRlbmN5Q2hhaW4gQ3JlYXRlKEV4Y2VsV29ya2Jvb2sgd2IsIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGRlcENoYWluID0gbmV3IERlcGVuZGVuY3lDaGFpbigpOwotICAgICAgICAgICAgZm9yZWFjaCAodmFyIHdzIGluIHdiLldvcmtzaGVldHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCEod3MgaXMgRXhjZWxDaGFydHNoZWV0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEdldENoYWluKGRlcENoYWluLCB3Yi5Gb3JtdWxhUGFyc2VyLkxleGVyLCB3cy5DZWxscywgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIEdldFdvcmtzaGVldE5hbWVzKHdzLCBkZXBDaGFpbiwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yZWFjaCAodmFyIG5hbWUgaW4gd2IuTmFtZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG5hbWUuTmFtZVZhbHVlPT1udWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgR2V0Q2hhaW4oZGVwQ2hhaW4sIHdiLkZvcm11bGFQYXJzZXIuTGV4ZXIsIG5hbWUsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkZXBDaGFpbjsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7CiAKLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIERlcGVuZGVuY3lDaGFpbiBDcmVhdGUoRXhjZWxXb3Jrc2hlZXQgd3MsIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgd3MuQ2hlY2tTaGVldFR5cGUoKTsKLSAgICAgICAgICAgIHZhciBkZXBDaGFpbiA9IG5ldyBEZXBlbmRlbmN5Q2hhaW4oKTsKLQotICAgICAgICAgICAgR2V0Q2hhaW4oZGVwQ2hhaW4sIHdzLldvcmtib29rLkZvcm11bGFQYXJzZXIuTGV4ZXIsIHdzLkNlbGxzLCBvcHRpb25zKTsKLQotICAgICAgICAgICAgR2V0V29ya3NoZWV0TmFtZXMod3MsIGRlcENoYWluLCBvcHRpb25zKTsKLQotICAgICAgICAgICAgcmV0dXJuIGRlcENoYWluOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBEZXBlbmRlbmN5Q2hhaW4gQ3JlYXRlKEV4Y2VsV29ya3NoZWV0IHdzLCBzdHJpbmcgRm9ybXVsYSwgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbiBvcHRpb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cy5DaGVja1NoZWV0VHlwZSgpOwotICAgICAgICAgICAgdmFyIGRlcENoYWluID0gbmV3IERlcGVuZGVuY3lDaGFpbigpOwotCi0gICAgICAgICAgICBHZXRDaGFpbihkZXBDaGFpbiwgd3MuV29ya2Jvb2suRm9ybXVsYVBhcnNlci5MZXhlciwgd3MsIEZvcm11bGEsIG9wdGlvbnMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gZGVwQ2hhaW47Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEdldFdvcmtzaGVldE5hbWVzKEV4Y2VsV29ya3NoZWV0IHdzLCBEZXBlbmRlbmN5Q2hhaW4gZGVwQ2hhaW4sIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yZWFjaCAodmFyIG5hbWUgaW4gd3MuTmFtZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShuYW1lLk5hbWVGb3JtdWxhKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEdldENoYWluKGRlcENoYWluLCB3cy5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyLkxleGVyLCBuYW1lLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIERlcGVuZGVuY3lDaGFpbiBDcmVhdGUoRXhjZWxSYW5nZUJhc2UgcmFuZ2UsIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGRlcENoYWluID0gbmV3IERlcGVuZGVuY3lDaGFpbigpOwotCi0gICAgICAgICAgICBHZXRDaGFpbihkZXBDaGFpbiwgcmFuZ2UuV29ya3NoZWV0Lldvcmtib29rLkZvcm11bGFQYXJzZXIuTGV4ZXIsIHJhbmdlLCBvcHRpb25zKTsKLQotICAgICAgICAgICAgcmV0dXJuIGRlcENoYWluOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgR2V0Q2hhaW4oRGVwZW5kZW5jeUNoYWluIGRlcENoYWluLCBJTGV4ZXIgbGV4ZXIsIEV4Y2VsTmFtZWRSYW5nZSBuYW1lLCBFeGNlbENhbGN1bGF0aW9uT3B0aW9uIG9wdGlvbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cyA9IG5hbWUuV29ya3NoZWV0OwotICAgICAgICAgICAgdmFyIGlkID0gRXhjZWxDZWxsQmFzZS5HZXRDZWxsSUQod3M9PW51bGw/MDp3cy5TaGVldElELCBuYW1lLkluZGV4LCAwKTsKLSAgICAgICAgICAgIGlmICghZGVwQ2hhaW4uaW5kZXguQ29udGFpbnNLZXkoaWQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBmID0gbmV3IEZvcm11bGFDZWxsKCkgeyBTaGVldElEID0gd3MgPT0gbnVsbCA/IDAgOiB3cy5TaGVldElELCBSb3cgPSBuYW1lLkluZGV4LCBDb2x1bW4gPSAwLCBGb3JtdWxhPW5hbWUuTmFtZUZvcm11bGEgfTsKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGYuRm9ybXVsYSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmLlRva2VucyA9IGxleGVyLlRva2VuaXplKGYuRm9ybXVsYSwgKHdzPT1udWxsID8gbnVsbCA6IHdzLk5hbWUpKS5Ub0xpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuX3dvcmtib29rLl9mb3JtdWxhVG9rZW5zLlNldFZhbHVlKG5hbWUuSW5kZXgsIDAsIGYuVG9rZW5zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdzLl9mb3JtdWxhVG9rZW5zLlNldFZhbHVlKG5hbWUuSW5kZXgsIDAsIGYuVG9rZW5zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkZXBDaGFpbi5BZGQoZik7Ci0gICAgICAgICAgICAgICAgICAgIEZvbGxvd0NoYWluKGRlcENoYWluLCBsZXhlcixuYW1lLl93b3JrYm9vaywgd3MsIGYsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEdldENoYWluKERlcGVuZGVuY3lDaGFpbiBkZXBDaGFpbiwgSUxleGVyIGxleGVyLCBFeGNlbFdvcmtzaGVldCB3cywgc3RyaW5nIGZvcm11bGEsIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGYgPSBuZXcgRm9ybXVsYUNlbGwoKSB7IFNoZWV0SUQgPSB3cy5TaGVldElELCBSb3cgPSAtMSwgQ29sdW1uID0gLTEgfTsKLSAgICAgICAgICAgIGYuRm9ybXVsYSA9IGZvcm11bGE7Ci0gICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGYuRm9ybXVsYSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZi5Ub2tlbnMgPSBsZXhlci5Ub2tlbml6ZShmLkZvcm11bGEsIHdzLk5hbWUpLlRvTGlzdCgpOwotICAgICAgICAgICAgICAgIGRlcENoYWluLkFkZChmKTsKLSAgICAgICAgICAgICAgICBGb2xsb3dDaGFpbihkZXBDaGFpbiwgbGV4ZXIsIHdzLldvcmtib29rLCB3cywgZiwgb3B0aW9ucyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEdldENoYWluKERlcGVuZGVuY3lDaGFpbiBkZXBDaGFpbiwgSUxleGVyIGxleGVyLCBFeGNlbFJhbmdlQmFzZSBSYW5nZSwgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbiBvcHRpb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgd3MgPSBSYW5nZS5Xb3Jrc2hlZXQ7Ci0gICAgICAgICAgICB2YXIgZnMgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0Pih3cy5fZm9ybXVsYXMsIFJhbmdlLlN0YXJ0LlJvdywgUmFuZ2UuU3RhcnQuQ29sdW1uLCBSYW5nZS5FbmQuUm93LCBSYW5nZS5FbmQuQ29sdW1uKTsKLSAgICAgICAgICAgIHdoaWxlIChmcy5OZXh0KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZzLlZhbHVlID09IG51bGwgfHwgZnMuVmFsdWUuVG9TdHJpbmcoKS5UcmltKCkgPT0gIiIpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIHZhciBpZCA9IEV4Y2VsQ2VsbEJhc2UuR2V0Q2VsbElEKHdzLlNoZWV0SUQsIGZzLlJvdywgZnMuQ29sdW1uKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRlcENoYWluLmluZGV4LkNvbnRhaW5zS2V5KGlkKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBmID0gbmV3IEZvcm11bGFDZWxsKCkgeyBTaGVldElEID0gd3MuU2hlZXRJRCwgUm93ID0gZnMuUm93LCBDb2x1bW4gPSBmcy5Db2x1bW4gfTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZzLlZhbHVlIGlzIGludCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZi5Gb3JtdWxhID0gd3MuX3NoYXJlZEZvcm11bGFzWyhpbnQpZnMuVmFsdWVdLkdldEZvcm11bGEoZnMuUm93LCBmcy5Db2x1bW4sIHdzLk5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZi5Gb3JtdWxhID0gZnMuVmFsdWUuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGYuRm9ybXVsYSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGYuVG9rZW5zID0gbGV4ZXIuVG9rZW5pemUoZi5Gb3JtdWxhLCBSYW5nZS5Xb3Jrc2hlZXQuTmFtZSkuVG9MaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3cy5fZm9ybXVsYVRva2Vucy5TZXRWYWx1ZShmcy5Sb3csIGZzLkNvbHVtbiwgZi5Ub2tlbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVwQ2hhaW4uQWRkKGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgRm9sbG93Q2hhaW4oZGVwQ2hhaW4sIGxleGVyLCB3cy5Xb3JrYm9vaywgd3MsIGYsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGZvbGxvd3MgdGhlIGNhbGN1bGF0aW9uIGNoYWluIHRvIGdldCB0aGUgb3JkZXIgb2YgdGhlIGNhbGN1bGF0aW9uCi0gICAgICAgIC8vLyBHb3RvICghKSBpcyB1c2VkIGludGVybmFsbHkgdG8gcHJldmVudCBzdGFja292ZXJmbG93IG9uIGV4dHJlbWx5IGxhcmdldCBkZXBlbmRlbmN5IHRyZWVzICh0aGF0IGlzLCBtYW55IHJlY3Vyc2l2ZSBmb3JtdWxhcykuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGVwQ2hhaW4iPlRoZSBkZXBlbmRlbmN5IGNoYWluIG9iamVjdDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGV4ZXIiPlRoZSBmb3JtdWxhIHRva2VuaXplcjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id2IiPlRoZSB3b3JrYm9vayB3aGVyZSB0aGUgZm9ybXVsYSBjb21lcyBmcm9tPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3cyI+VGhlIHdvcmtzaGVldCB3aGVyZSB0aGUgZm9ybXVsYSBjb21lcyBmcm9tPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmIj5UaGUgY2VsbCBmdW5jdGlvbiBvYmplY3Q8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9wdGlvbnMiPkNhbGN1bHRhaXRvbiBvcHRpb25zPC9wYXJhbT4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBGb2xsb3dDaGFpbihEZXBlbmRlbmN5Q2hhaW4gZGVwQ2hhaW4sIElMZXhlciBsZXhlciwgRXhjZWxXb3JrYm9vayB3YiwgRXhjZWxXb3Jrc2hlZXQgd3MsIEZvcm11bGFDZWxsIGYsIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykKLSAgICAgICAgewotICAgICAgICAgICAgU3RhY2s8Rm9ybXVsYUNlbGw+IHN0YWNrID0gbmV3IFN0YWNrPEZvcm11bGFDZWxsPigpOwotICAgICAgICBpdGVyYXRlVG9rZW46Ci0gICAgICAgICAgICB3aGlsZSAoZi50b2tlbkl4IDwgZi5Ub2tlbnMuQ291bnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHQgPSBmLlRva2Vuc1tmLnRva2VuSXhdOwotICAgICAgICAgICAgICAgIGlmICh0LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuRXhjZWxBZGRyZXNzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGFkciA9IG5ldyBFeGNlbEZvcm11bGFBZGRyZXNzKHQuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYWRyLlRhYmxlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkci5TZXRSQ0Zyb21UYWJsZSh3cy5fcGFja2FnZSwgbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoZi5Sb3csIGYuQ29sdW1uLCBmLlJvdywgZi5Db2x1bW4pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChhZHIuV29ya1NoZWV0ID09IG51bGwgJiYgYWRyLkNvbGxpZGUobmV3IEV4Y2VsQWRkcmVzc0Jhc2UoZi5Sb3csIGYuQ29sdW1uLCBmLlJvdywgZi5Db2x1bW4pKSE9RXhjZWxBZGRyZXNzQmFzZS5lQWRkcmVzc0NvbGxpdGlvbi5ObykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBDaXJjdWxhclJlZmVyZW5jZUV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJDaXJjdWxhciBSZWZlcmVuY2UgaW4gY2VsbCB7MH0iLCBFeGNlbEFkZHJlc3NCYXNlLkdldEFkZHJlc3MoZi5Sb3csIGYuQ29sdW1uKSkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChhZHIuX2Zyb21Sb3cgPiAwICYmIGFkci5fZnJvbUNvbCA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShhZHIuV29ya1NoZWV0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi53cyA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi53cyA9IHdzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChmLndzLlNoZWV0SUQgIT0gZi5TaGVldElEKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi53cyA9IHdiLldvcmtzaGVldHMuR2V0QnlTaGVldElEKGYuU2hlZXRJRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYud3MgPSB3Yi5Xb3Jrc2hlZXRzW2Fkci5Xb3JrU2hlZXRdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZi53cyAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuaXRlcmF0b3IgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihmLndzLl9mb3JtdWxhcywgYWRyLlN0YXJ0LlJvdywgYWRyLlN0YXJ0LkNvbHVtbiwgYWRyLkVuZC5Sb3csIGFkci5FbmQuQ29sdW1uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGl0ZXJhdGVDZWxsczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh0LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuTmFtZVZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGFkcldiLCBhZHJXcywgYWRyTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgRXhjZWxOYW1lZFJhbmdlIG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIEV4Y2VsQWRkcmVzc0Jhc2UuU3BsaXRBZGRyZXNzKHQuVmFsdWUsIG91dCBhZHJXYiwgb3V0IGFkcldzLCBvdXQgYWRyTmFtZSwgZi53cz09bnVsbCA/ICIiIDogZi53cy5OYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShhZHJXcykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLndzID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZi53cyA9IHdiLldvcmtzaGVldHNbYWRyV3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoZi53cy5OYW1lcy5Db250YWluc0tleSh0LlZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gZi53cy5OYW1lc1thZHJOYW1lXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdiLk5hbWVzLkNvbnRhaW5zS2V5KGFkck5hbWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB3Yi5OYW1lc1thZHJOYW1lXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5hbWUgIT0gbnVsbCkgZi53cyA9IG5hbWUuV29ya3NoZWV0OyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdiLk5hbWVzLkNvbnRhaW5zS2V5KGFkck5hbWUpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gd2IuTmFtZXNbdC5WYWx1ZV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoYWRyV3MpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYud3MgPSBuYW1lLldvcmtzaGVldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShuYW1lLk5hbWVGb3JtdWxhKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5OYW1lVmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuaXRlcmF0b3IgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PihmLndzLl9mb3JtdWxhcywgbmFtZS5TdGFydC5Sb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLlN0YXJ0LkNvbHVtbiwgbmFtZS5FbmQuUm93LCBuYW1lLkVuZC5Db2x1bW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGl0ZXJhdGVDZWxsczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gRXhjZWxBZGRyZXNzQmFzZS5HZXRDZWxsSUQobmFtZS5Mb2NhbFNoZWV0SWQsIG5hbWUuSW5kZXgsIDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXBDaGFpbi5pbmRleC5Db250YWluc0tleShpZCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmYgPSBuZXcgRm9ybXVsYUNlbGwoKSB7IFNoZWV0SUQgPSBuYW1lLkxvY2FsU2hlZXRJZCwgUm93ID0gbmFtZS5JbmRleCwgQ29sdW1uID0gMCB9OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZi5Gb3JtdWxhID0gbmFtZS5OYW1lRm9ybXVsYTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmYuVG9rZW5zID0gbmFtZS5Mb2NhbFNoZWV0SWQgPT0gLTEgPyBsZXhlci5Ub2tlbml6ZShyZi5Gb3JtdWxhKS5Ub0xpc3QoKSA6IGxleGVyLlRva2VuaXplKHJmLkZvcm11bGEsIHdiLldvcmtzaGVldHMuR2V0QnlTaGVldElEKG5hbWUuTG9jYWxTaGVldElkKS5OYW1lKS5Ub0xpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcENoYWluLkFkZChyZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrLlB1c2goZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSByZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpdGVyYXRlVG9rZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFjay5Db3VudCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYXIgaW4gc3RhY2spCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEV4Y2VsQWRkcmVzc0Jhc2UuR2V0Q2VsbElEKHBhci5TaGVldElELCBwYXIuUm93LCBwYXIuQ29sdW1uKSA9PSBpZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQ2lyY3VsYXJSZWZlcmVuY2VFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiQ2lyY3VsYXIgUmVmZXJlbmNlIGluIG5hbWUgezB9IiwgbmFtZS5OYW1lKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmLnRva2VuSXgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlcENoYWluLkNhbGNPcmRlci5BZGQoZi5JbmRleCk7Ci0gICAgICAgICAgICBpZiAoc3RhY2suQ291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGYgPSBzdGFjay5Qb3AoKTsKLSAgICAgICAgICAgICAgICBnb3RvIGl0ZXJhdGVDZWxsczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaXRlcmF0ZUNlbGxzOgotCi0gICAgICAgICAgICB3aGlsZSAoZi5pdGVyYXRvciAhPSBudWxsICYmIGYuaXRlcmF0b3IuTmV4dCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB2ID0gZi5pdGVyYXRvci5WYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAodiA9PSBudWxsIHx8IHYuVG9TdHJpbmcoKS5UcmltKCkgPT0gIiIpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIHZhciBpZCA9IEV4Y2VsQWRkcmVzc0Jhc2UuR2V0Q2VsbElEKGYud3MuU2hlZXRJRCwgZi5pdGVyYXRvci5Sb3csIGYuaXRlcmF0b3IuQ29sdW1uKTsKLSAgICAgICAgICAgICAgICBpZiAoIWRlcENoYWluLmluZGV4LkNvbnRhaW5zS2V5KGlkKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciByZiA9IG5ldyBGb3JtdWxhQ2VsbCgpIHsgU2hlZXRJRCA9IGYud3MuU2hlZXRJRCwgUm93ID0gZi5pdGVyYXRvci5Sb3csIENvbHVtbiA9IGYuaXRlcmF0b3IuQ29sdW1uIH07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmLml0ZXJhdG9yLlZhbHVlIGlzIGludCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmYuRm9ybXVsYSA9IGYud3MuX3NoYXJlZEZvcm11bGFzWyhpbnQpdl0uR2V0Rm9ybXVsYShmLml0ZXJhdG9yLlJvdywgZi5pdGVyYXRvci5Db2x1bW4sIHdzLk5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmYuRm9ybXVsYSA9IHYuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZi53cyA9IGYud3M7Ci0gICAgICAgICAgICAgICAgICAgIHJmLlRva2VucyA9IGxleGVyLlRva2VuaXplKHJmLkZvcm11bGEsIGYud3MuTmFtZSkuVG9MaXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHdzLl9mb3JtdWxhVG9rZW5zLlNldFZhbHVlKHJmLlJvdywgcmYuQ29sdW1uLCByZi5Ub2tlbnMpOwotICAgICAgICAgICAgICAgICAgICBkZXBDaGFpbi5BZGQocmYpOwotICAgICAgICAgICAgICAgICAgICBzdGFjay5QdXNoKGYpOwotICAgICAgICAgICAgICAgICAgICBmID0gcmY7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gaXRlcmF0ZVRva2VuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2suQ291bnQgPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFyIGluIHN0YWNrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChFeGNlbEFkZHJlc3NCYXNlLkdldENlbGxJRChwYXIud3MuU2hlZXRJRCwgcGFyLml0ZXJhdG9yLlJvdywgcGFyLml0ZXJhdG9yLkNvbHVtbikgPT0gaWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5BbGxvd0NpcmN1bGFyZVJlZmVyZW5jZXMgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQ2lyY3VsYXJSZWZlcmVuY2VFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiQ2lyY3VsYXIgUmVmZXJlbmNlIGluIGNlbGwgezB9IXsxfSIsIHBhci53cy5OYW1lLCBFeGNlbEFkZHJlc3MuR2V0QWRkcmVzcyhmLlJvdywgZi5Db2x1bW4pKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IHN0YWNrLlBvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBpdGVyYXRlQ2VsbHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmLnRva2VuSXgrKzsKLSAgICAgICAgICAgIGdvdG8gaXRlcmF0ZVRva2VuOwotICAgICAgICB9CitpbnRlcm5hbCBzdGF0aWMgY2xhc3MgRGVwZW5kZW5jeUNoYWluRmFjdG9yeSB7CisgIGludGVybmFsIHN0YXRpYyBEZXBlbmRlbmN5Q2hhaW4gQ3JlYXRlKEV4Y2VsV29ya2Jvb2sgd2IsIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykgeworICAgIHZhciBkZXBDaGFpbiA9IG5ldyBEZXBlbmRlbmN5Q2hhaW4oKTsKKyAgICBmb3JlYWNoICh2YXIgd3MgaW4gd2IuV29ya3NoZWV0cykgeworICAgICAgaWYgKCEod3MgaXMgRXhjZWxDaGFydHNoZWV0KSkgeworICAgICAgICBHZXRDaGFpbihkZXBDaGFpbiwgd2IuRm9ybXVsYVBhcnNlci5MZXhlciwgd3MuQ2VsbHMsIG9wdGlvbnMpOworICAgICAgICBHZXRXb3Jrc2hlZXROYW1lcyh3cywgZGVwQ2hhaW4sIG9wdGlvbnMpOworICAgICAgfQogICAgIH0KKyAgICBmb3JlYWNoICh2YXIgbmFtZSBpbiB3Yi5OYW1lcykgeworICAgICAgaWYgKG5hbWUuTmFtZVZhbHVlID09IG51bGwpIHsKKyAgICAgICAgR2V0Q2hhaW4oZGVwQ2hhaW4sIHdiLkZvcm11bGFQYXJzZXIuTGV4ZXIsIG5hbWUsIG9wdGlvbnMpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGVwQ2hhaW47CisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgRGVwZW5kZW5jeUNoYWluIENyZWF0ZShFeGNlbFdvcmtzaGVldCB3cywgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbiBvcHRpb25zKSB7CisgICAgd3MuQ2hlY2tTaGVldFR5cGUoKTsKKyAgICB2YXIgZGVwQ2hhaW4gPSBuZXcgRGVwZW5kZW5jeUNoYWluKCk7CisKKyAgICBHZXRDaGFpbihkZXBDaGFpbiwgd3MuV29ya2Jvb2suRm9ybXVsYVBhcnNlci5MZXhlciwgd3MuQ2VsbHMsIG9wdGlvbnMpOworCisgICAgR2V0V29ya3NoZWV0TmFtZXMod3MsIGRlcENoYWluLCBvcHRpb25zKTsKKworICAgIHJldHVybiBkZXBDaGFpbjsKKyAgfQorCisgIGludGVybmFsIHN0YXRpYyBEZXBlbmRlbmN5Q2hhaW4gQ3JlYXRlKAorICAgICAgRXhjZWxXb3Jrc2hlZXQgd3MsCisgICAgICBzdHJpbmcgZm9ybXVsYSwKKyAgICAgIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykgeworICAgIHdzLkNoZWNrU2hlZXRUeXBlKCk7CisgICAgdmFyIGRlcENoYWluID0gbmV3IERlcGVuZGVuY3lDaGFpbigpOworCisgICAgR2V0Q2hhaW4oZGVwQ2hhaW4sIHdzLldvcmtib29rLkZvcm11bGFQYXJzZXIuTGV4ZXIsIHdzLCBmb3JtdWxhLCBvcHRpb25zKTsKKworICAgIHJldHVybiBkZXBDaGFpbjsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgR2V0V29ya3NoZWV0TmFtZXMoCisgICAgICBFeGNlbFdvcmtzaGVldCB3cywKKyAgICAgIERlcGVuZGVuY3lDaGFpbiBkZXBDaGFpbiwKKyAgICAgIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykgeworICAgIGZvcmVhY2ggKHZhciBuYW1lIGluIHdzLk5hbWVzKSB7CisgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KG5hbWUuTmFtZUZvcm11bGEpKSB7CisgICAgICAgIEdldENoYWluKGRlcENoYWluLCB3cy5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyLkxleGVyLCBuYW1lLCBvcHRpb25zKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgRGVwZW5kZW5jeUNoYWluIENyZWF0ZShFeGNlbFJhbmdlQmFzZSByYW5nZSwgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbiBvcHRpb25zKSB7CisgICAgdmFyIGRlcENoYWluID0gbmV3IERlcGVuZGVuY3lDaGFpbigpOworCisgICAgR2V0Q2hhaW4oZGVwQ2hhaW4sIHJhbmdlLldvcmtzaGVldC5Xb3JrYm9vay5Gb3JtdWxhUGFyc2VyLkxleGVyLCByYW5nZSwgb3B0aW9ucyk7CisKKyAgICByZXR1cm4gZGVwQ2hhaW47CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIEdldENoYWluKAorICAgICAgRGVwZW5kZW5jeUNoYWluIGRlcENoYWluLAorICAgICAgSUxleGVyIGxleGVyLAorICAgICAgRXhjZWxOYW1lZFJhbmdlIG5hbWUsCisgICAgICBFeGNlbENhbGN1bGF0aW9uT3B0aW9uIG9wdGlvbnMpIHsKKyAgICB2YXIgd3MgPSBuYW1lLldvcmtzaGVldDsKKyAgICB2YXIgaWQgPSBFeGNlbENlbGxCYXNlLkdldENlbGxJZCh3cyA9PSBudWxsID8gMCA6IHdzLlNoZWV0SUQsIG5hbWUuSW5kZXgsIDApOworICAgIGlmICghZGVwQ2hhaW4uaW5kZXguQ29udGFpbnNLZXkoaWQpKSB7CisgICAgICB2YXIgZiA9IG5ldyBGb3JtdWxhQ2VsbCB7CisgICAgICAgIFNoZWV0SUQgPSB3cyA9PSBudWxsID8gMCA6IHdzLlNoZWV0SUQsCisgICAgICAgIFJvdyA9IG5hbWUuSW5kZXgsCisgICAgICAgIENvbHVtbiA9IDAsCisgICAgICAgIEZvcm11bGEgPSBuYW1lLk5hbWVGb3JtdWxhLAorICAgICAgfTsKKyAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZi5Gb3JtdWxhKSkgeworICAgICAgICBmLlRva2VucyA9IGxleGVyLlRva2VuaXplKGYuRm9ybXVsYSwgKHdzID09IG51bGwgPyBudWxsIDogd3MuTmFtZSkpLlRvTGlzdCgpOworICAgICAgICBpZiAod3MgPT0gbnVsbCkgeworICAgICAgICAgIG5hbWUuX3dvcmtib29rLl9mb3JtdWxhVG9rZW5zLlNldFZhbHVlKG5hbWUuSW5kZXgsIDAsIGYuVG9rZW5zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB3cy5fZm9ybXVsYVRva2Vucy5TZXRWYWx1ZShuYW1lLkluZGV4LCAwLCBmLlRva2Vucyk7CisgICAgICAgIH0KKyAgICAgICAgZGVwQ2hhaW4uQWRkKGYpOworICAgICAgICBGb2xsb3dDaGFpbihkZXBDaGFpbiwgbGV4ZXIsIG5hbWUuX3dvcmtib29rLCB3cywgZiwgb3B0aW9ucyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBHZXRDaGFpbigKKyAgICAgIERlcGVuZGVuY3lDaGFpbiBkZXBDaGFpbiwKKyAgICAgIElMZXhlciBsZXhlciwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdzLAorICAgICAgc3RyaW5nIGZvcm11bGEsCisgICAgICBFeGNlbENhbGN1bGF0aW9uT3B0aW9uIG9wdGlvbnMpIHsKKyAgICB2YXIgZiA9IG5ldyBGb3JtdWxhQ2VsbCB7CisgICAgICBTaGVldElEID0gd3MuU2hlZXRJRCwKKyAgICAgIFJvdyA9IC0xLAorICAgICAgQ29sdW1uID0gLTEsCisgICAgfTsKKyAgICBmLkZvcm11bGEgPSBmb3JtdWxhOworICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZi5Gb3JtdWxhKSkgeworICAgICAgZi5Ub2tlbnMgPSBsZXhlci5Ub2tlbml6ZShmLkZvcm11bGEsIHdzLk5hbWUpLlRvTGlzdCgpOworICAgICAgZGVwQ2hhaW4uQWRkKGYpOworICAgICAgRm9sbG93Q2hhaW4oZGVwQ2hhaW4sIGxleGVyLCB3cy5Xb3JrYm9vaywgd3MsIGYsIG9wdGlvbnMpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgR2V0Q2hhaW4oCisgICAgICBEZXBlbmRlbmN5Q2hhaW4gZGVwQ2hhaW4sCisgICAgICBJTGV4ZXIgbGV4ZXIsCisgICAgICBFeGNlbFJhbmdlQmFzZSByYW5nZSwKKyAgICAgIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykgeworICAgIHZhciB3cyA9IHJhbmdlLldvcmtzaGVldDsKKyAgICB2YXIgZnMgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PigKKyAgICAgICAgd3MuX2Zvcm11bGFzLAorICAgICAgICByYW5nZS5TdGFydC5Sb3csCisgICAgICAgIHJhbmdlLlN0YXJ0LkNvbHVtbiwKKyAgICAgICAgcmFuZ2UuRW5kLlJvdywKKyAgICAgICAgcmFuZ2UuRW5kLkNvbHVtbik7CisgICAgd2hpbGUgKGZzLk5leHQoKSkgeworICAgICAgaWYgKGZzLlZhbHVlID09IG51bGwgfHwgZnMuVmFsdWUuVG9TdHJpbmcoKS5UcmltKCkgPT0gIiIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB2YXIgaWQgPSBFeGNlbENlbGxCYXNlLkdldENlbGxJZCh3cy5TaGVldElELCBmcy5Sb3csIGZzLkNvbHVtbik7CisgICAgICBpZiAoIWRlcENoYWluLmluZGV4LkNvbnRhaW5zS2V5KGlkKSkgeworICAgICAgICB2YXIgZiA9IG5ldyBGb3JtdWxhQ2VsbCB7CisgICAgICAgICAgU2hlZXRJRCA9IHdzLlNoZWV0SUQsCisgICAgICAgICAgUm93ID0gZnMuUm93LAorICAgICAgICAgIENvbHVtbiA9IGZzLkNvbHVtbiwKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKGZzLlZhbHVlIGlzIGludCkgeworICAgICAgICAgIGYuRm9ybXVsYSA9IHdzLl9zaGFyZWRGb3JtdWxhc1soaW50KWZzLlZhbHVlXS5HZXRGb3JtdWxhKGZzLlJvdywgZnMuQ29sdW1uLCB3cy5OYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmLkZvcm11bGEgPSBmcy5WYWx1ZS5Ub1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZi5Gb3JtdWxhKSkgeworICAgICAgICAgIGYuVG9rZW5zID0gbGV4ZXIuVG9rZW5pemUoZi5Gb3JtdWxhLCByYW5nZS5Xb3Jrc2hlZXQuTmFtZSkuVG9MaXN0KCk7CisgICAgICAgICAgd3MuX2Zvcm11bGFUb2tlbnMuU2V0VmFsdWUoZnMuUm93LCBmcy5Db2x1bW4sIGYuVG9rZW5zKTsKKyAgICAgICAgICBkZXBDaGFpbi5BZGQoZik7CisgICAgICAgICAgRm9sbG93Q2hhaW4oZGVwQ2hhaW4sIGxleGVyLCB3cy5Xb3JrYm9vaywgd3MsIGYsIG9wdGlvbnMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBtZXRob2QgZm9sbG93cyB0aGUgY2FsY3VsYXRpb24gY2hhaW4gdG8gZ2V0IHRoZSBvcmRlciBvZiB0aGUgY2FsY3VsYXRpb24KKyAgLy8vIEdvdG8gKCEpIGlzIHVzZWQgaW50ZXJuYWxseSB0byBwcmV2ZW50IHN0YWNrb3ZlcmZsb3cgb24gZXh0cmVtbHkgbGFyZ2V0IGRlcGVuZGVuY3kgdHJlZXMgKHRoYXQgaXMsIG1hbnkgcmVjdXJzaXZlIGZvcm11bGFzKS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJkZXBDaGFpbiI+VGhlIGRlcGVuZGVuY3kgY2hhaW4gb2JqZWN0PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJsZXhlciI+VGhlIGZvcm11bGEgdG9rZW5pemVyPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ3YiI+VGhlIHdvcmtib29rIHdoZXJlIHRoZSBmb3JtdWxhIGNvbWVzIGZyb208L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9IndzIj5UaGUgd29ya3NoZWV0IHdoZXJlIHRoZSBmb3JtdWxhIGNvbWVzIGZyb208L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImYiPlRoZSBjZWxsIGZ1bmN0aW9uIG9iamVjdDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ib3B0aW9ucyI+Q2FsY3VsdGFpdG9uIG9wdGlvbnM8L3BhcmFtPgorICBwcml2YXRlIHN0YXRpYyB2b2lkIEZvbGxvd0NoYWluKAorICAgICAgRGVwZW5kZW5jeUNoYWluIGRlcENoYWluLAorICAgICAgSUxleGVyIGxleGVyLAorICAgICAgRXhjZWxXb3JrYm9vayB3YiwKKyAgICAgIEV4Y2VsV29ya3NoZWV0IHdzLAorICAgICAgRm9ybXVsYUNlbGwgZiwKKyAgICAgIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24gb3B0aW9ucykgeworICAgIFN0YWNrPEZvcm11bGFDZWxsPiBzdGFjayA9IG5ldyBTdGFjazxGb3JtdWxhQ2VsbD4oKTsKKyAgICBpdGVyYXRlVG9rZW46CisgICAgd2hpbGUgKGYudG9rZW5JeCA8IGYuVG9rZW5zLkNvdW50KSB7CisgICAgICB2YXIgdCA9IGYuVG9rZW5zW2YudG9rZW5JeF07CisgICAgICBpZiAodC5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLkV4Y2VsQWRkcmVzcykgeworICAgICAgICB2YXIgYWRyID0gbmV3IEV4Y2VsRm9ybXVsYUFkZHJlc3ModC5WYWx1ZSk7CisgICAgICAgIGlmIChhZHIuVGFibGUgIT0gbnVsbCkgeworICAgICAgICAgIGFkci5TZXRSY0Zyb21UYWJsZSh3cy5fcGFja2FnZSwgbmV3KGYuUm93LCBmLkNvbHVtbiwgZi5Sb3csIGYuQ29sdW1uKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYWRyLldvcmtTaGVldCA9PSBudWxsCisgICAgICAgICAgICAmJiBhZHIuQ29sbGlkZShuZXcoZi5Sb3csIGYuQ29sdW1uLCBmLlJvdywgZi5Db2x1bW4pKQorICAgICAgICAgICAgICAgICE9IEV4Y2VsQWRkcmVzc0Jhc2UuZUFkZHJlc3NDb2xsaXRpb24uTm8pIHsKKyAgICAgICAgICB0aHJvdyAobmV3IENpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAiQ2lyY3VsYXIgUmVmZXJlbmNlIGluIGNlbGwgezB9IiwKKyAgICAgICAgICAgICAgICAgICAgICBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZi5Sb3csIGYuQ29sdW1uKSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhZHIuX2Zyb21Sb3cgPiAwICYmIGFkci5fZnJvbUNvbCA+IDApIHsKKyAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoYWRyLldvcmtTaGVldCkpIHsKKyAgICAgICAgICAgIGlmIChmLndzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgZi53cyA9IHdzOworICAgICAgICAgICAgfSBlbHNlIGlmIChmLndzLlNoZWV0SUQgIT0gZi5TaGVldElEKSB7CisgICAgICAgICAgICAgIGYud3MgPSB3Yi5Xb3Jrc2hlZXRzLkdldEJ5U2hlZXRJZChmLlNoZWV0SUQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmLndzID0gd2IuV29ya3NoZWV0c1thZHIuV29ya1NoZWV0XTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoZi53cyAhPSBudWxsKSB7CisgICAgICAgICAgICBmLml0ZXJhdG9yID0gbmV3KAorICAgICAgICAgICAgICAgIGYud3MuX2Zvcm11bGFzLAorICAgICAgICAgICAgICAgIGFkci5TdGFydC5Sb3csCisgICAgICAgICAgICAgICAgYWRyLlN0YXJ0LkNvbHVtbiwKKyAgICAgICAgICAgICAgICBhZHIuRW5kLlJvdywKKyAgICAgICAgICAgICAgICBhZHIuRW5kLkNvbHVtbik7CisgICAgICAgICAgICBnb3RvIGl0ZXJhdGVDZWxsczsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodC5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk5hbWVWYWx1ZSkgeworICAgICAgICBzdHJpbmcgYWRyV2IsCisgICAgICAgICAgICBhZHJXcywKKyAgICAgICAgICAgIGFkck5hbWU7CisgICAgICAgIEV4Y2VsTmFtZWRSYW5nZSBuYW1lOworICAgICAgICBFeGNlbEFkZHJlc3NCYXNlLlNwbGl0QWRkcmVzcygKKyAgICAgICAgICAgIHQuVmFsdWUsCisgICAgICAgICAgICBvdXQgYWRyV2IsCisgICAgICAgICAgICBvdXQgYWRyV3MsCisgICAgICAgICAgICBvdXQgYWRyTmFtZSwKKyAgICAgICAgICAgIGYud3MgPT0gbnVsbCA/ICIiIDogZi53cy5OYW1lKTsKKyAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShhZHJXcykpIHsKKyAgICAgICAgICBpZiAoZi53cyA9PSBudWxsKSB7CisgICAgICAgICAgICBmLndzID0gd2IuV29ya3NoZWV0c1thZHJXc107CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChmLndzLk5hbWVzLkNvbnRhaW5zS2V5KHQuVmFsdWUpKSB7CisgICAgICAgICAgICBuYW1lID0gZi53cy5OYW1lc1thZHJOYW1lXTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHdiLk5hbWVzLkNvbnRhaW5zS2V5KGFkck5hbWUpKSB7CisgICAgICAgICAgICBuYW1lID0gd2IuTmFtZXNbYWRyTmFtZV07CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5hbWUgPSBudWxsOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBmLndzID0gbmFtZS5Xb3Jrc2hlZXQ7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHdiLk5hbWVzLkNvbnRhaW5zS2V5KGFkck5hbWUpKSB7CisgICAgICAgICAgbmFtZSA9IHdiLk5hbWVzW3QuVmFsdWVdOworICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShhZHJXcykpIHsKKyAgICAgICAgICAgIGYud3MgPSBuYW1lLldvcmtzaGVldDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmFtZSA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KG5hbWUuTmFtZUZvcm11bGEpKSB7CisgICAgICAgICAgICBpZiAobmFtZS5OYW1lVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICBmLml0ZXJhdG9yID0gbmV3KAorICAgICAgICAgICAgICAgICAgZi53cy5fZm9ybXVsYXMsCisgICAgICAgICAgICAgICAgICBuYW1lLlN0YXJ0LlJvdywKKyAgICAgICAgICAgICAgICAgIG5hbWUuU3RhcnQuQ29sdW1uLAorICAgICAgICAgICAgICAgICAgbmFtZS5FbmQuUm93LAorICAgICAgICAgICAgICAgICAgbmFtZS5FbmQuQ29sdW1uKTsKKyAgICAgICAgICAgICAgZ290byBpdGVyYXRlQ2VsbHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhciBpZCA9IEV4Y2VsQ2VsbEJhc2UuR2V0Q2VsbElkKG5hbWUuTG9jYWxTaGVldElkLCBuYW1lLkluZGV4LCAwKTsKKworICAgICAgICAgICAgaWYgKCFkZXBDaGFpbi5pbmRleC5Db250YWluc0tleShpZCkpIHsKKyAgICAgICAgICAgICAgdmFyIHJmID0gbmV3IEZvcm11bGFDZWxsIHsKKyAgICAgICAgICAgICAgICBTaGVldElEID0gbmFtZS5Mb2NhbFNoZWV0SWQsCisgICAgICAgICAgICAgICAgUm93ID0gbmFtZS5JbmRleCwKKyAgICAgICAgICAgICAgICBDb2x1bW4gPSAwLAorICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICByZi5Gb3JtdWxhID0gbmFtZS5OYW1lRm9ybXVsYTsKKyAgICAgICAgICAgICAgcmYuVG9rZW5zID0KKyAgICAgICAgICAgICAgICAgIG5hbWUuTG9jYWxTaGVldElkID09IC0xCisgICAgICAgICAgICAgICAgICAgICAgPyBsZXhlci5Ub2tlbml6ZShyZi5Gb3JtdWxhKS5Ub0xpc3QoKQorICAgICAgICAgICAgICAgICAgICAgIDogbGV4ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLlRva2VuaXplKHJmLkZvcm11bGEsIHdiLldvcmtzaGVldHMuR2V0QnlTaGVldElkKG5hbWUuTG9jYWxTaGVldElkKS5OYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9MaXN0KCk7CisKKyAgICAgICAgICAgICAgZGVwQ2hhaW4uQWRkKHJmKTsKKyAgICAgICAgICAgICAgc3RhY2suUHVzaChmKTsKKyAgICAgICAgICAgICAgZiA9IHJmOworICAgICAgICAgICAgICBnb3RvIGl0ZXJhdGVUb2tlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGFjay5Db3VudCA+IDApIHsKKyAgICAgICAgICAgICAgLy9DaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcworICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFyIGluIHN0YWNrKSB7CisgICAgICAgICAgICAgICAgaWYgKEV4Y2VsQ2VsbEJhc2UuR2V0Q2VsbElkKHBhci5TaGVldElELCBwYXIuUm93LCBwYXIuQ29sdW1uKSA9PSBpZCkgeworICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBDaXJjdWxhclJlZmVyZW5jZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgiQ2lyY3VsYXIgUmVmZXJlbmNlIGluIG5hbWUgezB9IiwgbmFtZS5OYW1lKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgZi50b2tlbkl4Kys7CisgICAgfQorICAgIGRlcENoYWluLkNhbGNPcmRlci5BZGQoZi5JbmRleCk7CisgICAgaWYgKHN0YWNrLkNvdW50ID4gMCkgeworICAgICAgZiA9IHN0YWNrLlBvcCgpOworICAgICAgZ290byBpdGVyYXRlQ2VsbHM7CisgICAgfQorICAgIHJldHVybjsKKyAgICBpdGVyYXRlQ2VsbHM6CisKKyAgICB3aGlsZSAoZi5pdGVyYXRvciAhPSBudWxsICYmIGYuaXRlcmF0b3IuTmV4dCgpKSB7CisgICAgICB2YXIgdiA9IGYuaXRlcmF0b3IuVmFsdWU7CisgICAgICBpZiAodiA9PSBudWxsIHx8IHYuVG9TdHJpbmcoKS5UcmltKCkgPT0gIiIpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB2YXIgaWQgPSBFeGNlbENlbGxCYXNlLkdldENlbGxJZChmLndzLlNoZWV0SUQsIGYuaXRlcmF0b3IuUm93LCBmLml0ZXJhdG9yLkNvbHVtbik7CisgICAgICBpZiAoIWRlcENoYWluLmluZGV4LkNvbnRhaW5zS2V5KGlkKSkgeworICAgICAgICB2YXIgcmYgPSBuZXcgRm9ybXVsYUNlbGwgeworICAgICAgICAgIFNoZWV0SUQgPSBmLndzLlNoZWV0SUQsCisgICAgICAgICAgUm93ID0gZi5pdGVyYXRvci5Sb3csCisgICAgICAgICAgQ29sdW1uID0gZi5pdGVyYXRvci5Db2x1bW4sCisgICAgICAgIH07CisgICAgICAgIGlmIChmLml0ZXJhdG9yLlZhbHVlIGlzIGludCkgeworICAgICAgICAgIHJmLkZvcm11bGEgPSBmLndzLl9zaGFyZWRGb3JtdWxhc1soaW50KXZdCisgICAgICAgICAgICAgIC5HZXRGb3JtdWxhKGYuaXRlcmF0b3IuUm93LCBmLml0ZXJhdG9yLkNvbHVtbiwgd3MuTmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmYuRm9ybXVsYSA9IHYuVG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICByZi53cyA9IGYud3M7CisgICAgICAgIHJmLlRva2VucyA9IGxleGVyLlRva2VuaXplKHJmLkZvcm11bGEsIGYud3MuTmFtZSkuVG9MaXN0KCk7CisgICAgICAgIHdzLl9mb3JtdWxhVG9rZW5zLlNldFZhbHVlKHJmLlJvdywgcmYuQ29sdW1uLCByZi5Ub2tlbnMpOworICAgICAgICBkZXBDaGFpbi5BZGQocmYpOworICAgICAgICBzdGFjay5QdXNoKGYpOworICAgICAgICBmID0gcmY7CisgICAgICAgIGdvdG8gaXRlcmF0ZVRva2VuOworICAgICAgfQorICAgICAgaWYgKHN0YWNrLkNvdW50ID4gMCkgeworICAgICAgICAvL0NoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzCisgICAgICAgIGZvcmVhY2ggKHZhciBwYXIgaW4gc3RhY2spIHsKKyAgICAgICAgICBpZiAoRXhjZWxDZWxsQmFzZS5HZXRDZWxsSWQocGFyLndzLlNoZWV0SUQsIHBhci5pdGVyYXRvci5Sb3csIHBhci5pdGVyYXRvci5Db2x1bW4pCisgICAgICAgICAgICAgID09IGlkKSB7CisgICAgICAgICAgICBpZiAob3B0aW9ucy5BbGxvd0NpcmN1bGFyZVJlZmVyZW5jZXMgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgdGhyb3cgKG5ldyBDaXJjdWxhclJlZmVyZW5jZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2lyY3VsYXIgUmVmZXJlbmNlIGluIGNlbGwgezB9IXsxfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhci53cy5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoZi5Sb3csIGYuQ29sdW1uKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGYgPSBzdGFjay5Qb3AoKTsKKyAgICAgICAgICAgIGdvdG8gaXRlcmF0ZUNlbGxzOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmLnRva2VuSXgrKzsKKyAgICBnb3RvIGl0ZXJhdGVUb2tlbjsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0RlcGVuZGVuY3lDaGFpbi9Gb3JtdWxhQ2VsbC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9EZXBlbmRlbmN5Q2hhaW4vRm9ybXVsYUNlbGwuY3MKaW5kZXggZGE5MjgyOC4uMmI5NmE3ZCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0RlcGVuZGVuY3lDaGFpbi9Gb3JtdWxhQ2VsbC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRGVwZW5kZW5jeUNoYWluL0Zvcm11bGFDZWxsLmNzCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS+RsbG1hbgorLyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS++/vWxsbWFuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpAQCAtNywzNyArNyw0MiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKLXsKLSAgICBpbnRlcm5hbCBjbGFzcyBGb3JtdWxhQ2VsbAotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgaW50IEluZGV4IHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgaW50ZXJuYWwgaW50IFNoZWV0SUQgeyBnZXQ7IHNldDsgfQotICAgICAgICBpbnRlcm5hbCBpbnQgUm93IHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgaW50ZXJuYWwgaW50IENvbHVtbiB7IGdldDsgc2V0OyB9Ci0gICAgICAgIGludGVybmFsIHN0cmluZyBGb3JtdWxhIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgaW50ZXJuYWwgTGlzdDxUb2tlbj4gVG9rZW5zIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgaW50ZXJuYWwgaW50IHRva2VuSXggPSAwOwotICAgICAgICBpbnRlcm5hbCBpbnQgYWRkcmVzc0l4ID0gMDsKLSAgICAgICAgaW50ZXJuYWwgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PiBpdGVyYXRvcjsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxXb3Jrc2hlZXQgd3M7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOworCitpbnRlcm5hbCBjbGFzcyBGb3JtdWxhQ2VsbCB7CisgIGludGVybmFsIGludCBJbmRleCB7IGdldDsgc2V0OyB9CisKKyAgaW50ZXJuYWwgaW50IFNoZWV0SUQgeyBnZXQ7IHNldDsgfQorCisgIGludGVybmFsIGludCBSb3cgeyBnZXQ7IHNldDsgfQorCisgIGludGVybmFsIGludCBDb2x1bW4geyBnZXQ7IHNldDsgfQorCisgIGludGVybmFsIHN0cmluZyBGb3JtdWxhIHsgZ2V0OyBzZXQ7IH0KKworICBpbnRlcm5hbCBMaXN0PFRva2VuPiBUb2tlbnMgeyBnZXQ7IHNldDsgfQorCisgIGludGVybmFsIGludCB0b2tlbkl4ID0gMDsKKyAgaW50ZXJuYWwgaW50IGFkZHJlc3NJeCA9IDA7CisgIGludGVybmFsIENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4gaXRlcmF0b3I7CisgIGludGVybmFsIEV4Y2VsV29ya3NoZWV0IHdzOworfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0VwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0VwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyLmNzCmluZGV4IDE3NGYzMDMuLjg1ZDI5N2EgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FcHBsdXNFeGNlbERhdGFQcm92aWRlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIuY3MKQEAgLTEsNDgwICsxLDM2OCBAQAot77u/dXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIgOiBFeGNlbERhdGFQcm92aWRlcgotICAgIHsKLSAgICAgICAgcHVibGljIGNsYXNzIFJhbmdlSW5mbyA6IElSYW5nZUluZm8KLSAgICAgICAgewotICAgICAgICAgICAgaW50ZXJuYWwgRXhjZWxXb3Jrc2hlZXQgX3dzOwotICAgICAgICAgICAgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PiBfdmFsdWVzID0gbnVsbDsKLSAgICAgICAgICAgIGludCBfZnJvbVJvdywgX3RvUm93LCBfZnJvbUNvbCwgX3RvQ29sOwotICAgICAgICAgICAgaW50IF9jZWxsQ291bnQgPSAwOwotICAgICAgICAgICAgRXhjZWxBZGRyZXNzQmFzZSBfYWRkcmVzczsKLSAgICAgICAgICAgIElDZWxsSW5mbyBfY2VsbDsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwogCi0gICAgICAgICAgICBwdWJsaWMgUmFuZ2VJbmZvKEV4Y2VsV29ya3NoZWV0IHdzLCBpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCB0b1JvdywgaW50IHRvQ29sKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF93cyA9IHdzOwotICAgICAgICAgICAgICAgIF9mcm9tUm93ID0gZnJvbVJvdzsKLSAgICAgICAgICAgICAgICBfZnJvbUNvbCA9IGZyb21Db2w7Ci0gICAgICAgICAgICAgICAgX3RvUm93ID0gdG9Sb3c7Ci0gICAgICAgICAgICAgICAgX3RvQ29sID0gdG9Db2w7Ci0gICAgICAgICAgICAgICAgX2FkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZShfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sKTsKLSAgICAgICAgICAgICAgICBfYWRkcmVzcy5fd3MgPSB3cy5OYW1lOwotICAgICAgICAgICAgICAgIF92YWx1ZXMgPSBuZXcgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0Pih3cy5fdmFsdWVzLCBfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sKTsKLSAgICAgICAgICAgICAgICBfY2VsbCA9IG5ldyBDZWxsSW5mbyhfd3MsIF92YWx1ZXMpOwotICAgICAgICAgICAgfQorcHVibGljIGNsYXNzIEVwcGx1c0V4Y2VsRGF0YVByb3ZpZGVyIDogRXhjZWxEYXRhUHJvdmlkZXIgeworICBwdWJsaWMgY2xhc3MgUmFuZ2VJbmZvIDogSVJhbmdlSW5mbyB7CisgICAgaW50ZXJuYWwgRXhjZWxXb3Jrc2hlZXQgX3dzOworICAgIHByaXZhdGUgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PiBfdmFsdWVzOworICAgIHByaXZhdGUgaW50IF9mcm9tUm93LAorICAgICAgICBfdG9Sb3csCisgICAgICAgIF9mcm9tQ29sLAorICAgICAgICBfdG9Db2w7CisgICAgcHJpdmF0ZSBpbnQgX2NlbGxDb3VudDsKKyAgICBwcml2YXRlIEV4Y2VsQWRkcmVzc0Jhc2UgX2FkZHJlc3M7CisgICAgcHJpdmF0ZSBJQ2VsbEluZm8gX2NlbGw7CiAKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgR2V0TkNlbGxzKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChfdG9Sb3cgLSBfZnJvbVJvdykgKyAxKSAqICgoX3RvQ29sIC0gX2Zyb21Db2wpICsgMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sIElzRW1wdHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfY2VsbENvdW50ID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF92YWx1ZXMuTmV4dCgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLlJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB1YmxpYyBib29sIElzTXVsdGkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfY2VsbENvdW50ID09IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdmFsdWVzLk5leHQoKSAmJiBfdmFsdWVzLk5leHQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmFsdWVzLlJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3ZhbHVlcy5SZXNldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChfY2VsbENvdW50ID4gMSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIElDZWxsSW5mbyBDdXJyZW50Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9jZWxsOyB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBFeGNlbFdvcmtzaGVldCBXb3Jrc2hlZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3dzOyB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2UoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvYmplY3QgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yLkN1cnJlbnQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2wgTW92ZU5leHQoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jZWxsQ291bnQrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlcy5Nb3ZlTmV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3ZhbHVlcy5Jbml0KCk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgcHVibGljIGJvb2wgTmV4dENlbGwoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jZWxsQ291bnQrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbHVlcy5Nb3ZlTmV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3I8SUNlbGxJbmZvPiBHZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZXNldCgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBwdWJsaWMgRXhjZWxBZGRyZXNzQmFzZSBBZGRyZXNzCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9hZGRyZXNzOyB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgR2V0VmFsdWUoaW50IHJvdywgaW50IGNvbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3dzLkdldFZhbHVlKHJvdywgY29sKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIG9iamVjdCBHZXRPZmZzZXQoaW50IHJvd09mZnNldCwgaW50IGNvbE9mZnNldCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3ZhbHVlcy5Sb3cgPCBfZnJvbVJvdyB8fCBfdmFsdWVzLkNvbHVtbiA8IF9mcm9tQ29sKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF93cy5HZXRWYWx1ZShfZnJvbVJvdyArIHJvd09mZnNldCwgX2Zyb21Db2wgKyBjb2xPZmZzZXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3dzLkdldFZhbHVlKF92YWx1ZXMuUm93ICsgcm93T2Zmc2V0LCBfdmFsdWVzLkNvbHVtbiArIGNvbE9mZnNldCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGNsYXNzIENlbGxJbmZvIDogSUNlbGxJbmZvCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsV29ya3NoZWV0IF93czsKLSAgICAgICAgICAgIENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4gX3ZhbHVlczsKLSAgICAgICAgICAgIGludGVybmFsIENlbGxJbmZvKEV4Y2VsV29ya3NoZWV0IHdzLCBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+IHZhbHVlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfd3MgPSB3czsKLSAgICAgICAgICAgICAgICBfdmFsdWVzID0gdmFsdWVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIHN0cmluZyBBZGRyZXNzCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF92YWx1ZXMuQ2VsbEFkZHJlc3M7IH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBSb3cKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3ZhbHVlcy5Sb3c7IH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGludCBDb2x1bW4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gX3ZhbHVlcy5Db2x1bW47IH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHN0cmluZyBGb3JtdWxhCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0IAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF93cy5HZXRGb3JtdWxhKF92YWx1ZXMuUm93LCBfdmFsdWVzLkNvbHVtbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgb2JqZWN0IFZhbHVlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF92YWx1ZXMuVmFsdWU7IH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgcHVibGljIGRvdWJsZSBWYWx1ZURvdWJsZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShfdmFsdWVzLlZhbHVlLCB0cnVlKTsgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHVibGljIGRvdWJsZSBWYWx1ZURvdWJsZUxvZ2ljYWwKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXQgeyByZXR1cm4gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoX3ZhbHVlcy5WYWx1ZSwgZmFsc2UpOyB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdWJsaWMgYm9vbCBJc0hpZGRlblJvdwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldCAKLSAgICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgICAgICB2YXIgcm93PV93cy5fdmFsdWVzLkdldFZhbHVlKF92YWx1ZXMuUm93LCAwKSBhcyBSb3dJbnRlcm5hbDsKLSAgICAgICAgICAgICAgICAgICAgaWYocm93ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb3cuSGlkZGVuIHx8IHJvdy5IZWlnaHQ9PTA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sIElzRXhjZWxFcnJvcgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldCB7IHJldHVybiBFeGNlbEVycm9yVmFsdWUuVmFsdWVzLklzRXJyb3JWYWx1ZShfdmFsdWVzLlZhbHVlKTsgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgSUxpc3Q8VG9rZW4+IFRva2VucwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldCAKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfd3MuX2Zvcm11bGFUb2tlbnMuR2V0VmFsdWUoX3ZhbHVlcy5Sb3csIF92YWx1ZXMuQ29sdW1uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgY2xhc3MgTmFtZUluZm8gOiBFeGNlbERhdGFQcm92aWRlci5JTmFtZUluZm8KLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHVsb25nIElkIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgV29ya3NoZWV0IHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9Ci0gICAgICAgICAgICBwdWJsaWMgc3RyaW5nIEZvcm11bGEgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgcHVibGljIElMaXN0PFRva2VuPiBUb2tlbnMgeyBnZXQ7IGludGVybmFsIHNldDsgfQotICAgICAgICAgICAgcHVibGljIG9iamVjdCBWYWx1ZSB7IGdldDsgc2V0OyB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEV4Y2VsUGFja2FnZSBfcGFja2FnZTsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfY3VycmVudFdvcmtzaGVldDsKLSAgICAgICAgcHJpdmF0ZSBSYW5nZUFkZHJlc3NGYWN0b3J5IF9yYW5nZUFkZHJlc3NGYWN0b3J5OwotICAgICAgICBwcml2YXRlIERpY3Rpb25hcnk8dWxvbmcsIElOYW1lSW5mbz4gX25hbWVzPW5ldyBEaWN0aW9uYXJ5PHVsb25nLElOYW1lSW5mbz4oKTsKLQotICAgICAgICBwdWJsaWMgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIoRXhjZWxQYWNrYWdlIHBhY2thZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYWNrYWdlID0gcGFja2FnZTsKLQotICAgICAgICAgICAgX3JhbmdlQWRkcmVzc0ZhY3RvcnkgPSBuZXcgUmFuZ2VBZGRyZXNzRmFjdG9yeSh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBFeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uIEdldFdvcmtzaGVldE5hbWVzKHN0cmluZyB3b3Jrc2hlZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cz1fcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3dvcmtzaGVldF07Ci0gICAgICAgICAgICBpZiAod3MgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gd3MuTmFtZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbiBHZXRXb3JrYm9va05hbWVWYWx1ZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3BhY2thZ2UuV29ya2Jvb2suTmFtZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSVJhbmdlSW5mbyBHZXRSYW5nZShzdHJpbmcgd29ya3NoZWV0LCBpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCB0b1JvdywgaW50IHRvQ29sKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXRDdXJyZW50V29ya3NoZWV0KHdvcmtzaGVldCk7Ci0gICAgICAgICAgICB2YXIgd3NOYW1lID0gc3RyaW5nLklzTnVsbE9yRW1wdHkod29ya3NoZWV0KSA/IF9jdXJyZW50V29ya3NoZWV0Lk5hbWUgOiB3b3Jrc2hlZXQ7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3dzTmFtZV07Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlSW5mbyh3cywgZnJvbVJvdywgZnJvbUNvbCwgdG9Sb3csIHRvQ29sKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSVJhbmdlSW5mbyBHZXRSYW5nZShzdHJpbmcgd29ya3NoZWV0LCBpbnQgcm93LCBpbnQgY29sdW1uLCBzdHJpbmcgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGFkZHIgPSBuZXcgRXhjZWxBZGRyZXNzKHdvcmtzaGVldCwgYWRkcmVzcyk7Ci0gICAgICAgICAgICBpZiAoYWRkci5UYWJsZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZHIuU2V0UkNGcm9tVGFibGUoX3BhY2thZ2UsIG5ldyBFeGNlbEFkZHJlc3NCYXNlKHJvdywgY29sdW1uLCByb3csIGNvbHVtbikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9TZXRDdXJyZW50V29ya3NoZWV0KGFkZHIuV29ya1NoZWV0KTsgCi0gICAgICAgICAgICB2YXIgd3NOYW1lID0gc3RyaW5nLklzTnVsbE9yRW1wdHkoYWRkci5Xb3JrU2hlZXQpID8gX2N1cnJlbnRXb3Jrc2hlZXQuTmFtZSA6IGFkZHIuV29ya1NoZWV0OwotICAgICAgICAgICAgdmFyIHdzID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3c05hbWVdOwotICAgICAgICAgICAgLy9yZXR1cm4gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4od3MuX3ZhbHVlcywgYWRkci5fZnJvbVJvdywgYWRkci5fZnJvbUNvbCwgYWRkci5fdG9Sb3csIGFkZHIuX3RvQ29sKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2VJbmZvKHdzLCBhZGRyLl9mcm9tUm93LCBhZGRyLl9mcm9tQ29sLCBhZGRyLl90b1JvdywgYWRkci5fdG9Db2wpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBJTmFtZUluZm8gR2V0TmFtZShzdHJpbmcgd29ya3NoZWV0LCBzdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxOYW1lZFJhbmdlIG5hbWVJdGVtOwotICAgICAgICAgICAgdWxvbmcgaWQ7ICAgICAgICAgICAgCi0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCB3czsKLSAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh3b3Jrc2hlZXQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKF9wYWNrYWdlLldvcmtib29rLk5hbWVzLkNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZUl0ZW0gPSBfcGFja2FnZS5Xb3JrYm9vay5OYW1lc1tuYW1lXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdzID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3cyA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbd29ya3NoZWV0XTsKLSAgICAgICAgICAgICAgICBpZiAod3MgIT1udWxsICYmIHdzLk5hbWVzLkNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZUl0ZW0gPSB3cy5OYW1lc1tuYW1lXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoX3BhY2thZ2UuV29ya2Jvb2suTmFtZXMuQ29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuYW1lSXRlbSA9IF9wYWNrYWdlLldvcmtib29rLk5hbWVzW25hbWVdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZCA9IEV4Y2VsQWRkcmVzc0Jhc2UuR2V0Q2VsbElEKG5hbWVJdGVtLkxvY2FsU2hlZXRJZCwgbmFtZUl0ZW0uSW5kZXgsIDApOwotCi0gICAgICAgICAgICBpZiAoX25hbWVzLkNvbnRhaW5zS2V5KGlkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX25hbWVzW2lkXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgbmkgPSBuZXcgTmFtZUluZm8oKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgSWQgPSBpZCwKLSAgICAgICAgICAgICAgICAgICAgTmFtZSA9IG5hbWUsCi0gICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldCA9IG5hbWVJdGVtLldvcmtzaGVldD09bnVsbCA/IG5hbWVJdGVtLl93cyA6IG5hbWVJdGVtLldvcmtzaGVldC5OYW1lLCAKLSAgICAgICAgICAgICAgICAgICAgRm9ybXVsYSA9IG5hbWVJdGVtLkZvcm11bGEKLSAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgIGlmIChuYW1lSXRlbS5fZnJvbVJvdyA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuaS5WYWx1ZSA9IG5ldyBSYW5nZUluZm8obmFtZUl0ZW0uV29ya3NoZWV0ID8/IHdzLCBuYW1lSXRlbS5fZnJvbVJvdywgbmFtZUl0ZW0uX2Zyb21Db2wsIG5hbWVJdGVtLl90b1JvdywgbmFtZUl0ZW0uX3RvQ29sKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmkuVmFsdWUgPSBuYW1lSXRlbS5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgX25hbWVzLkFkZChpZCwgbmkpOwotICAgICAgICAgICAgICAgIHJldHVybiBuaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgSUVudW1lcmFibGU8b2JqZWN0PiBHZXRSYW5nZVZhbHVlcyhzdHJpbmcgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgU2V0Q3VycmVudFdvcmtzaGVldChFeGNlbEFkZHJlc3NJbmZvLlBhcnNlKGFkZHJlc3MpKTsKLSAgICAgICAgICAgIHZhciBhZGRyID0gbmV3IEV4Y2VsQWRkcmVzcyhhZGRyZXNzKTsKLSAgICAgICAgICAgIHZhciB3c05hbWUgPSBzdHJpbmcuSXNOdWxsT3JFbXB0eShhZGRyLldvcmtTaGVldCkgPyBfY3VycmVudFdvcmtzaGVldC5OYW1lIDogYWRkci5Xb3JrU2hlZXQ7Ci0gICAgICAgICAgICB2YXIgd3MgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3dzTmFtZV07Ci0gICAgICAgICAgICByZXR1cm4gKG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KHdzLl92YWx1ZXMsIGFkZHIuX2Zyb21Sb3csIGFkZHIuX2Zyb21Db2wsIGFkZHIuX3RvUm93LCBhZGRyLl90b0NvbCkpOwotICAgICAgICB9Ci0KLQotICAgICAgICBwdWJsaWMgb2JqZWN0IEdldFZhbHVlKGludCByb3csIGludCBjb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY3VycmVudFdvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKHJvdywgY29sdW1uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIElzTWVyZ2VkKGludCByb3csIGludCBjb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vcmV0dXJuIF9jdXJyZW50V29ya3NoZWV0Ll9mbGFncy5HZXRGbGFnVmFsdWUocm93LCBjb2x1bW4sIENlbGxGbGFncy5NZXJnZWQpOwotICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50V29ya3NoZWV0Lk1lcmdlZENlbGxzW3JvdywgY29sdW1uXSAhPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2wgSXNIaWRkZW4oaW50IHJvdywgaW50IGNvbHVtbikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50V29ya3NoZWV0LkNvbHVtbihjb2x1bW4pLkhpZGRlbiB8fCBfY3VycmVudFdvcmtzaGVldC5Db2x1bW4oY29sdW1uKS5XaWR0aCA9PSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgX2N1cnJlbnRXb3Jrc2hlZXQuUm93KHJvdykuSGlkZGVuIHx8IF9jdXJyZW50V29ya3NoZWV0LlJvdyhjb2x1bW4pLkhlaWdodCA9PSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBHZXRDZWxsVmFsdWUoc3RyaW5nIHNoZWV0TmFtZSwgaW50IHJvdywgaW50IGNvbCkKLSAgICAgICAgewotICAgICAgICAgICAgU2V0Q3VycmVudFdvcmtzaGVldChzaGVldE5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50V29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUocm93LCBjb2wpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIEV4Y2VsQ2VsbEFkZHJlc3MgR2V0RGltZW5zaW9uRW5kKHN0cmluZyB3b3Jrc2hlZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsQ2VsbEFkZHJlc3MgYWRkcmVzcyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRyZXNzID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3b3Jrc2hlZXRdLkRpbWVuc2lvbi5FbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaHt9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBhZGRyZXNzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEN1cnJlbnRXb3Jrc2hlZXQoRXhjZWxBZGRyZXNzSW5mbyBhZGRyZXNzSW5mbykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFkZHJlc3NJbmZvLldvcmtzaGVldElzU3BlY2lmaWVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jdXJyZW50V29ya3NoZWV0ID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1thZGRyZXNzSW5mby5Xb3Jrc2hlZXRdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoX2N1cnJlbnRXb3Jrc2hlZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY3VycmVudFdvcmtzaGVldCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHMuRmlyc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBTZXRDdXJyZW50V29ya3NoZWV0KHN0cmluZyB3b3Jrc2hlZXROYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHdvcmtzaGVldE5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jdXJyZW50V29ya3NoZWV0ID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3b3Jrc2hlZXROYW1lXTsgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2N1cnJlbnRXb3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7IAotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEV4Y2VsTWF4Q29sdW1ucwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gRXhjZWxQYWNrYWdlLk1heENvbHVtbnM7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgRXhjZWxNYXhSb3dzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBFeGNlbFBhY2thZ2UuTWF4Um93czsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBHZXRSYW5nZUZvcm11bGEoc3RyaW5nIHdvcmtzaGVldE5hbWUsIGludCByb3csIGludCBjb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldEN1cnJlbnRXb3Jrc2hlZXQod29ya3NoZWV0TmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gX2N1cnJlbnRXb3Jrc2hlZXQuR2V0Rm9ybXVsYShyb3csIGNvbHVtbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IEdldFJhbmdlVmFsdWUoc3RyaW5nIHdvcmtzaGVldE5hbWUsIGludCByb3csIGludCBjb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldEN1cnJlbnRXb3Jrc2hlZXQod29ya3NoZWV0TmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gX2N1cnJlbnRXb3Jrc2hlZXQuR2V0VmFsdWUocm93LCBjb2x1bW4pOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgR2V0Rm9ybWF0KG9iamVjdCB2YWx1ZSwgc3RyaW5nIGZvcm1hdCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHN0eWxlcyA9IF9wYWNrYWdlLldvcmtib29rLlN0eWxlczsKLSAgICAgICAgICAgIEV4Y2VsTnVtYmVyRm9ybWF0WG1sLkV4Y2VsRm9ybWF0VHJhbnNsYXRvciBmdD1udWxsOwotICAgICAgICAgICAgZm9yZWFjaCh2YXIgZiBpbiBzdHlsZXMuTnVtYmVyRm9ybWF0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihmLkZvcm1hdD09Zm9ybWF0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZnQ9Zi5Gb3JtYXRUcmFuc2xhdG9yOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihmdD09bnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmdD1uZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwuRXhjZWxGb3JtYXRUcmFuc2xhdG9yKGZvcm1hdCwgLTEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEV4Y2VsUmFuZ2VCYXNlLkZvcm1hdFZhbHVlKHZhbHVlLCBmdCxmb3JtYXQsIGZ0Lk5ldEZvcm1hdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIExpc3Q8TGV4aWNhbEFuYWx5c2lzLlRva2VuPiBHZXRSYW5nZUZvcm11bGFUb2tlbnMoc3RyaW5nIHdvcmtzaGVldE5hbWUsIGludCByb3csIGludCBjb2x1bW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3dvcmtzaGVldE5hbWVdLl9mb3JtdWxhVG9rZW5zLkdldFZhbHVlKHJvdywgY29sdW1uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzUm93SGlkZGVuKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBpbnQgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYiA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbd29ya3NoZWV0TmFtZV0uUm93KHJvdykuSGVpZ2h0ID09IDAgfHwgCi0gICAgICAgICAgICAgICAgICAgIF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbd29ya3NoZWV0TmFtZV0uUm93KHJvdykuSGlkZGVuOwotCi0gICAgICAgICAgICByZXR1cm4gYjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlc2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgX25hbWVzID0gbmV3IERpY3Rpb25hcnk8dWxvbmcsIElOYW1lSW5mbz4oKTsgLy9SZXNldCBuYW1lIGNhY2hlLiAgICAgICAgICAgIAotICAgICAgICB9CisgICAgcHVibGljIFJhbmdlSW5mbyhFeGNlbFdvcmtzaGVldCB3cywgaW50IGZyb21Sb3csIGludCBmcm9tQ29sLCBpbnQgdG9Sb3csIGludCB0b0NvbCkgeworICAgICAgX3dzID0gd3M7CisgICAgICBfZnJvbVJvdyA9IGZyb21Sb3c7CisgICAgICBfZnJvbUNvbCA9IGZyb21Db2w7CisgICAgICBfdG9Sb3cgPSB0b1JvdzsKKyAgICAgIF90b0NvbCA9IHRvQ29sOworICAgICAgX2FkZHJlc3MgPSBuZXcoX2Zyb21Sb3csIF9mcm9tQ29sLCBfdG9Sb3csIF90b0NvbCk7CisgICAgICBfYWRkcmVzcy5fd3MgPSB3cy5OYW1lOworICAgICAgX3ZhbHVlcyA9IG5ldyh3cy5fdmFsdWVzLCBfZnJvbVJvdywgX2Zyb21Db2wsIF90b1JvdywgX3RvQ29sKTsKKyAgICAgIF9jZWxsID0gbmV3IENlbGxJbmZvKF93cywgX3ZhbHVlcyk7CiAgICAgfQorCisgICAgcHVibGljIGludCBHZXROQ2VsbHMoKSB7CisgICAgICByZXR1cm4gKChfdG9Sb3cgLSBfZnJvbVJvdykgKyAxKSAqICgoX3RvQ29sIC0gX2Zyb21Db2wpICsgMSk7CisgICAgfQorCisgICAgcHVibGljIGJvb2wgSXNFbXB0eSB7CisgICAgICBnZXQgeworICAgICAgICBpZiAoX2NlbGxDb3VudCA+IDApIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF92YWx1ZXMuTmV4dCgpKSB7CisgICAgICAgICAgX3ZhbHVlcy5SZXNldCgpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbCBJc011bHRpIHsKKyAgICAgIGdldCB7CisgICAgICAgIGlmIChfY2VsbENvdW50ID09IDApIHsKKyAgICAgICAgICBpZiAoX3ZhbHVlcy5OZXh0KCkgJiYgX3ZhbHVlcy5OZXh0KCkpIHsKKyAgICAgICAgICAgIF92YWx1ZXMuUmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBfdmFsdWVzLlJlc2V0KCk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChfY2VsbENvdW50ID4gMSkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSUNlbGxJbmZvIEN1cnJlbnQgPT4gX2NlbGw7CisKKyAgICBwdWJsaWMgRXhjZWxXb3Jrc2hlZXQgV29ya3NoZWV0IHsKKyAgICAgIGdldCB7IHJldHVybiBfd3M7IH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkge30KKworICAgIG9iamVjdCBJRW51bWVyYXRvci5DdXJyZW50IHsKKyAgICAgIGdldCB7IHJldHVybiB0aGlzOyB9CisgICAgfQorCisgICAgcHVibGljIGJvb2wgTW92ZU5leHQoKSB7CisgICAgICBfY2VsbENvdW50Kys7CisgICAgICByZXR1cm4gX3ZhbHVlcy5Nb3ZlTmV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIFJlc2V0KCkgeworICAgICAgX3ZhbHVlcy5Jbml0KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2wgTmV4dENlbGwoKSB7CisgICAgICBfY2VsbENvdW50Kys7CisgICAgICByZXR1cm4gX3ZhbHVlcy5Nb3ZlTmV4dCgpOworICAgIH0KKworICAgIHB1YmxpYyBJRW51bWVyYXRvcjxJQ2VsbEluZm8+IEdldEVudW1lcmF0b3IoKSB7CisgICAgICBSZXNldCgpOworICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgSUVudW1lcmF0b3IgSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpIHsKKyAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBFeGNlbEFkZHJlc3NCYXNlIEFkZHJlc3MgeworICAgICAgZ2V0IHsgcmV0dXJuIF9hZGRyZXNzOyB9CisgICAgfQorCisgICAgcHVibGljIG9iamVjdCBHZXRWYWx1ZShpbnQgcm93LCBpbnQgY29sKSB7CisgICAgICByZXR1cm4gX3dzLkdldFZhbHVlKHJvdywgY29sKTsKKyAgICB9CisKKyAgICBwdWJsaWMgb2JqZWN0IEdldE9mZnNldChpbnQgcm93T2Zmc2V0LCBpbnQgY29sT2Zmc2V0KSB7CisgICAgICBpZiAoX3ZhbHVlcy5Sb3cgPCBfZnJvbVJvdyB8fCBfdmFsdWVzLkNvbHVtbiA8IF9mcm9tQ29sKSB7CisgICAgICAgIHJldHVybiBfd3MuR2V0VmFsdWUoX2Zyb21Sb3cgKyByb3dPZmZzZXQsIF9mcm9tQ29sICsgY29sT2Zmc2V0KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfd3MuR2V0VmFsdWUoX3ZhbHVlcy5Sb3cgKyByb3dPZmZzZXQsIF92YWx1ZXMuQ29sdW1uICsgY29sT2Zmc2V0KTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgY2xhc3MgQ2VsbEluZm8gOiBJQ2VsbEluZm8geworICAgIHByaXZhdGUgRXhjZWxXb3Jrc2hlZXQgX3dzOworICAgIHByaXZhdGUgQ2VsbHNTdG9yZUVudW1lcmF0b3I8b2JqZWN0PiBfdmFsdWVzOworCisgICAgaW50ZXJuYWwgQ2VsbEluZm8oRXhjZWxXb3Jrc2hlZXQgd3MsIENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4gdmFsdWVzKSB7CisgICAgICBfd3MgPSB3czsKKyAgICAgIF92YWx1ZXMgPSB2YWx1ZXM7CisgICAgfQorCisgICAgcHVibGljIHN0cmluZyBBZGRyZXNzID0+IF92YWx1ZXMuQ2VsbEFkZHJlc3M7CisKKyAgICBwdWJsaWMgaW50IFJvdyA9PiBfdmFsdWVzLlJvdzsKKworICAgIHB1YmxpYyBpbnQgQ29sdW1uID0+IF92YWx1ZXMuQ29sdW1uOworCisgICAgcHVibGljIHN0cmluZyBGb3JtdWxhID0+IF93cy5HZXRGb3JtdWxhKF92YWx1ZXMuUm93LCBfdmFsdWVzLkNvbHVtbik7CisKKyAgICBwdWJsaWMgb2JqZWN0IFZhbHVlID0+IF92YWx1ZXMuVmFsdWU7CisKKyAgICBwdWJsaWMgZG91YmxlIFZhbHVlRG91YmxlID0+IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKF92YWx1ZXMuVmFsdWUsIHRydWUpOworCisgICAgcHVibGljIGRvdWJsZSBWYWx1ZURvdWJsZUxvZ2ljYWwgPT4gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoX3ZhbHVlcy5WYWx1ZSk7CisKKyAgICBwdWJsaWMgYm9vbCBJc0hpZGRlblJvdyB7CisgICAgICBnZXQgeworICAgICAgICB2YXIgcm93ID0gX3dzLl92YWx1ZXMuR2V0VmFsdWUoX3ZhbHVlcy5Sb3csIDApIGFzIFJvd0ludGVybmFsOworICAgICAgICBpZiAocm93ICE9IG51bGwpIHsKKyAgICAgICAgICByZXR1cm4gcm93LkhpZGRlbiB8fCByb3cuSGVpZ2h0ID09IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sIElzRXhjZWxFcnJvciA9PiBFeGNlbEVycm9yVmFsdWUuVmFsdWVzLklzRXJyb3JWYWx1ZShfdmFsdWVzLlZhbHVlKTsKKworICAgIHB1YmxpYyBJTGlzdDxUb2tlbj4gVG9rZW5zID0+IF93cy5fZm9ybXVsYVRva2Vucy5HZXRWYWx1ZShfdmFsdWVzLlJvdywgX3ZhbHVlcy5Db2x1bW4pOworICB9CisKKyAgcHVibGljIGNsYXNzIE5hbWVJbmZvIDogSU5hbWVJbmZvIHsKKyAgICBwdWJsaWMgdWxvbmcgSWQgeyBnZXQ7IHNldDsgfQorCisgICAgcHVibGljIHN0cmluZyBXb3Jrc2hlZXQgeyBnZXQ7IHNldDsgfQorCisgICAgcHVibGljIHN0cmluZyBOYW1lIHsgZ2V0OyBzZXQ7IH0KKworICAgIHB1YmxpYyBzdHJpbmcgRm9ybXVsYSB7IGdldDsgc2V0OyB9CisKKyAgICBwdWJsaWMgSUxpc3Q8VG9rZW4+IFRva2VucyB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgICBwdWJsaWMgb2JqZWN0IFZhbHVlIHsgZ2V0OyBzZXQ7IH0KKyAgfQorCisgIHByaXZhdGUgcmVhZG9ubHkgRXhjZWxQYWNrYWdlIF9wYWNrYWdlOworICBwcml2YXRlIEV4Y2VsV29ya3NoZWV0IF9jdXJyZW50V29ya3NoZWV0OworICBwcml2YXRlIFJhbmdlQWRkcmVzc0ZhY3RvcnkgX3JhbmdlQWRkcmVzc0ZhY3Rvcnk7CisgIHByaXZhdGUgRGljdGlvbmFyeTx1bG9uZywgSU5hbWVJbmZvPiBfbmFtZXMgPSBuZXcoKTsKKworICBwdWJsaWMgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIoRXhjZWxQYWNrYWdlIHBhY2thZ2UpIHsKKyAgICBfcGFja2FnZSA9IHBhY2thZ2U7CisKKyAgICBfcmFuZ2VBZGRyZXNzRmFjdG9yeSA9IG5ldyh0aGlzKTsKKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBFeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uIEdldFdvcmtzaGVldE5hbWVzKHN0cmluZyB3b3Jrc2hlZXQpIHsKKyAgICB2YXIgd3MgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3dvcmtzaGVldF07CisgICAgaWYgKHdzICE9IG51bGwpIHsKKyAgICAgIHJldHVybiB3cy5OYW1lczsKKyAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbiBHZXRXb3JrYm9va05hbWVWYWx1ZXMoKSB7CisgICAgcmV0dXJuIF9wYWNrYWdlLldvcmtib29rLk5hbWVzOworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIElSYW5nZUluZm8gR2V0UmFuZ2UoCisgICAgICBzdHJpbmcgd29ya3NoZWV0LAorICAgICAgaW50IGZyb21Sb3csCisgICAgICBpbnQgZnJvbUNvbCwKKyAgICAgIGludCB0b1JvdywKKyAgICAgIGludCB0b0NvbCkgeworICAgIFNldEN1cnJlbnRXb3Jrc2hlZXQod29ya3NoZWV0KTsKKyAgICB2YXIgd3NOYW1lID0gc3RyaW5nLklzTnVsbE9yRW1wdHkod29ya3NoZWV0KSA/IF9jdXJyZW50V29ya3NoZWV0Lk5hbWUgOiB3b3Jrc2hlZXQ7CisgICAgdmFyIHdzID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3c05hbWVdOworICAgIHJldHVybiBuZXcgUmFuZ2VJbmZvKHdzLCBmcm9tUm93LCBmcm9tQ29sLCB0b1JvdywgdG9Db2wpOworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIElSYW5nZUluZm8gR2V0UmFuZ2Uoc3RyaW5nIHdvcmtzaGVldCwgaW50IHJvdywgaW50IGNvbHVtbiwgc3RyaW5nIGFkZHJlc3MpIHsKKyAgICB2YXIgYWRkciA9IG5ldyBFeGNlbEFkZHJlc3Mod29ya3NoZWV0LCBhZGRyZXNzKTsKKyAgICBpZiAoYWRkci5UYWJsZSAhPSBudWxsKSB7CisgICAgICBhZGRyLlNldFJjRnJvbVRhYmxlKF9wYWNrYWdlLCBuZXcocm93LCBjb2x1bW4sIHJvdywgY29sdW1uKSk7CisgICAgfQorICAgIC8vU2V0Q3VycmVudFdvcmtzaGVldChhZGRyLldvcmtTaGVldCk7CisgICAgdmFyIHdzTmFtZSA9IHN0cmluZy5Jc051bGxPckVtcHR5KGFkZHIuV29ya1NoZWV0KSA/IF9jdXJyZW50V29ya3NoZWV0Lk5hbWUgOiBhZGRyLldvcmtTaGVldDsKKyAgICB2YXIgd3MgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3dzTmFtZV07CisgICAgLy9yZXR1cm4gbmV3IENlbGxzU3RvcmVFbnVtZXJhdG9yPG9iamVjdD4od3MuX3ZhbHVlcywgYWRkci5fZnJvbVJvdywgYWRkci5fZnJvbUNvbCwgYWRkci5fdG9Sb3csIGFkZHIuX3RvQ29sKTsKKyAgICByZXR1cm4gbmV3IFJhbmdlSW5mbyh3cywgYWRkci5fZnJvbVJvdywgYWRkci5fZnJvbUNvbCwgYWRkci5fdG9Sb3csIGFkZHIuX3RvQ29sKTsKKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBJTmFtZUluZm8gR2V0TmFtZShzdHJpbmcgd29ya3NoZWV0LCBzdHJpbmcgbmFtZSkgeworICAgIEV4Y2VsTmFtZWRSYW5nZSBuYW1lSXRlbTsKKyAgICB1bG9uZyBpZDsKKyAgICBFeGNlbFdvcmtzaGVldCB3czsKKyAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkod29ya3NoZWV0KSkgeworICAgICAgaWYgKF9wYWNrYWdlLldvcmtib29rLk5hbWVzLkNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICAgIG5hbWVJdGVtID0gX3BhY2thZ2UuV29ya2Jvb2suTmFtZXNbbmFtZV07CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIHdzID0gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgd3MgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3dvcmtzaGVldF07CisgICAgICBpZiAod3MgIT0gbnVsbCAmJiB3cy5OYW1lcy5Db250YWluc0tleShuYW1lKSkgeworICAgICAgICBuYW1lSXRlbSA9IHdzLk5hbWVzW25hbWVdOworICAgICAgfSBlbHNlIGlmIChfcGFja2FnZS5Xb3JrYm9vay5OYW1lcy5Db250YWluc0tleShuYW1lKSkgeworICAgICAgICBuYW1lSXRlbSA9IF9wYWNrYWdlLldvcmtib29rLk5hbWVzW25hbWVdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorICAgIGlkID0gRXhjZWxDZWxsQmFzZS5HZXRDZWxsSWQobmFtZUl0ZW0uTG9jYWxTaGVldElkLCBuYW1lSXRlbS5JbmRleCwgMCk7CisKKyAgICBpZiAoX25hbWVzLkNvbnRhaW5zS2V5KGlkKSkgeworICAgICAgcmV0dXJuIF9uYW1lc1tpZF07CisgICAgfQorICAgIHZhciBuaSA9IG5ldyBOYW1lSW5mbyB7CisgICAgICBJZCA9IGlkLAorICAgICAgTmFtZSA9IG5hbWUsCisgICAgICBXb3Jrc2hlZXQgPSBuYW1lSXRlbS5Xb3Jrc2hlZXQgPT0gbnVsbCA/IG5hbWVJdGVtLl93cyA6IG5hbWVJdGVtLldvcmtzaGVldC5OYW1lLAorICAgICAgRm9ybXVsYSA9IG5hbWVJdGVtLkZvcm11bGEsCisgICAgfTsKKyAgICBpZiAobmFtZUl0ZW0uX2Zyb21Sb3cgPiAwKSB7CisgICAgICBuaS5WYWx1ZSA9IG5ldyBSYW5nZUluZm8oCisgICAgICAgICAgbmFtZUl0ZW0uV29ya3NoZWV0ID8/IHdzLAorICAgICAgICAgIG5hbWVJdGVtLl9mcm9tUm93LAorICAgICAgICAgIG5hbWVJdGVtLl9mcm9tQ29sLAorICAgICAgICAgIG5hbWVJdGVtLl90b1JvdywKKyAgICAgICAgICBuYW1lSXRlbS5fdG9Db2wpOworICAgIH0gZWxzZSB7CisgICAgICBuaS5WYWx1ZSA9IG5hbWVJdGVtLlZhbHVlOworICAgIH0KKyAgICBfbmFtZXMuQWRkKGlkLCBuaSk7CisgICAgcmV0dXJuIG5pOworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIElFbnVtZXJhYmxlPG9iamVjdD4gR2V0UmFuZ2VWYWx1ZXMoc3RyaW5nIGFkZHJlc3MpIHsKKyAgICBTZXRDdXJyZW50V29ya3NoZWV0KEV4Y2VsQWRkcmVzc0luZm8uUGFyc2UoYWRkcmVzcykpOworICAgIHZhciBhZGRyID0gbmV3IEV4Y2VsQWRkcmVzcyhhZGRyZXNzKTsKKyAgICB2YXIgd3NOYW1lID0gc3RyaW5nLklzTnVsbE9yRW1wdHkoYWRkci5Xb3JrU2hlZXQpID8gX2N1cnJlbnRXb3Jrc2hlZXQuTmFtZSA6IGFkZHIuV29ya1NoZWV0OworICAgIHZhciB3cyA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbd3NOYW1lXTsKKyAgICByZXR1cm4gKG5ldyBDZWxsc1N0b3JlRW51bWVyYXRvcjxvYmplY3Q+KAorICAgICAgICAgICAgd3MuX3ZhbHVlcywKKyAgICAgICAgICAgIGFkZHIuX2Zyb21Sb3csCisgICAgICAgICAgICBhZGRyLl9mcm9tQ29sLAorICAgICAgICAgICAgYWRkci5fdG9Sb3csCisgICAgICAgICAgICBhZGRyLl90b0NvbCkpOworICB9CisKKyAgcHVibGljIG9iamVjdCBHZXRWYWx1ZShpbnQgcm93LCBpbnQgY29sdW1uKSB7CisgICAgcmV0dXJuIF9jdXJyZW50V29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUocm93LCBjb2x1bW4pOworICB9CisKKyAgcHVibGljIGJvb2wgSXNNZXJnZWQoaW50IHJvdywgaW50IGNvbHVtbikgeworICAgIC8vcmV0dXJuIF9jdXJyZW50V29ya3NoZWV0Ll9mbGFncy5HZXRGbGFnVmFsdWUocm93LCBjb2x1bW4sIENlbGxGbGFncy5NZXJnZWQpOworICAgIHJldHVybiBfY3VycmVudFdvcmtzaGVldC5NZXJnZWRDZWxsc1tyb3csIGNvbHVtbl0gIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBib29sIElzSGlkZGVuKGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICByZXR1cm4gX2N1cnJlbnRXb3Jrc2hlZXQuQ29sdW1uKGNvbHVtbikuSGlkZGVuCisgICAgICAgIHx8IF9jdXJyZW50V29ya3NoZWV0LkNvbHVtbihjb2x1bW4pLldpZHRoID09IDAKKyAgICAgICAgfHwgX2N1cnJlbnRXb3Jrc2hlZXQuUm93KHJvdykuSGlkZGVuCisgICAgICAgIHx8IF9jdXJyZW50V29ya3NoZWV0LlJvdyhjb2x1bW4pLkhlaWdodCA9PSAwOworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBHZXRDZWxsVmFsdWUoc3RyaW5nIHNoZWV0TmFtZSwgaW50IHJvdywgaW50IGNvbCkgeworICAgIFNldEN1cnJlbnRXb3Jrc2hlZXQoc2hlZXROYW1lKTsKKyAgICByZXR1cm4gX2N1cnJlbnRXb3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShyb3csIGNvbCk7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgRXhjZWxDZWxsQWRkcmVzcyBHZXREaW1lbnNpb25FbmQoc3RyaW5nIHdvcmtzaGVldCkgeworICAgIEV4Y2VsQ2VsbEFkZHJlc3MgYWRkcmVzcyA9IG51bGw7CisgICAgdHJ5IHsKKyAgICAgIGFkZHJlc3MgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3dvcmtzaGVldF0uRGltZW5zaW9uLkVuZDsKKyAgICB9IGNhdGNoIHt9CisKKyAgICByZXR1cm4gYWRkcmVzczsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBTZXRDdXJyZW50V29ya3NoZWV0KEV4Y2VsQWRkcmVzc0luZm8gYWRkcmVzc0luZm8pIHsKKyAgICBpZiAoYWRkcmVzc0luZm8uV29ya3NoZWV0SXNTcGVjaWZpZWQpIHsKKyAgICAgIF9jdXJyZW50V29ya3NoZWV0ID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1thZGRyZXNzSW5mby5Xb3Jrc2hlZXRdOworICAgIH0gZWxzZSBpZiAoX2N1cnJlbnRXb3Jrc2hlZXQgPT0gbnVsbCkgeworICAgICAgX2N1cnJlbnRXb3Jrc2hlZXQgPSBfcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIFNldEN1cnJlbnRXb3Jrc2hlZXQoc3RyaW5nIHdvcmtzaGVldE5hbWUpIHsKKyAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHdvcmtzaGVldE5hbWUpKSB7CisgICAgICBfY3VycmVudFdvcmtzaGVldCA9IF9wYWNrYWdlLldvcmtib29rLldvcmtzaGVldHNbd29ya3NoZWV0TmFtZV07CisgICAgfSBlbHNlIHsKKyAgICAgIF9jdXJyZW50V29ya3NoZWV0ID0gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5GaXJzdCgpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBpbnQgRXhjZWxNYXhDb2x1bW5zID0+IEV4Y2VsUGFja2FnZS5NYXhDb2x1bW5zOworCisgIHB1YmxpYyBvdmVycmlkZSBpbnQgRXhjZWxNYXhSb3dzID0+IEV4Y2VsUGFja2FnZS5NYXhSb3dzOworCisgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgR2V0UmFuZ2VGb3JtdWxhKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7CisgICAgU2V0Q3VycmVudFdvcmtzaGVldCh3b3Jrc2hlZXROYW1lKTsKKyAgICByZXR1cm4gX2N1cnJlbnRXb3Jrc2hlZXQuR2V0Rm9ybXVsYShyb3csIGNvbHVtbik7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IEdldFJhbmdlVmFsdWUoc3RyaW5nIHdvcmtzaGVldE5hbWUsIGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICBTZXRDdXJyZW50V29ya3NoZWV0KHdvcmtzaGVldE5hbWUpOworICAgIHJldHVybiBfY3VycmVudFdvcmtzaGVldC5HZXRWYWx1ZShyb3csIGNvbHVtbik7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIEdldEZvcm1hdChvYmplY3QgdmFsdWUsIHN0cmluZyBmb3JtYXQpIHsKKyAgICB2YXIgc3R5bGVzID0gX3BhY2thZ2UuV29ya2Jvb2suU3R5bGVzOworICAgIEV4Y2VsTnVtYmVyRm9ybWF0WG1sLkV4Y2VsRm9ybWF0VHJhbnNsYXRvciBmdCA9IG51bGw7CisgICAgZm9yZWFjaCAodmFyIGYgaW4gc3R5bGVzLk51bWJlckZvcm1hdHMpIHsKKyAgICAgIGlmIChmLkZvcm1hdCA9PSBmb3JtYXQpIHsKKyAgICAgICAgZnQgPSBmLkZvcm1hdFRyYW5zbGF0b3I7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoZnQgPT0gbnVsbCkgeworICAgICAgZnQgPSBuZXcoZm9ybWF0LCAtMSk7CisgICAgfQorICAgIHJldHVybiBFeGNlbFJhbmdlQmFzZS5Gb3JtYXRWYWx1ZSh2YWx1ZSwgZnQsIGZvcm1hdCwgZnQuTmV0Rm9ybWF0KTsKKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBMaXN0PFRva2VuPiBHZXRSYW5nZUZvcm11bGFUb2tlbnMoc3RyaW5nIHdvcmtzaGVldE5hbWUsIGludCByb3csIGludCBjb2x1bW4pIHsKKyAgICByZXR1cm4gX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3b3Jrc2hlZXROYW1lXS5fZm9ybXVsYVRva2Vucy5HZXRWYWx1ZShyb3csIGNvbHVtbik7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc1Jvd0hpZGRlbihzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IHJvdykgeworICAgIHZhciBiID0KKyAgICAgICAgX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3b3Jrc2hlZXROYW1lXS5Sb3cocm93KS5IZWlnaHQgPT0gMAorICAgICAgICAgICAgfHwgX3BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0c1t3b3Jrc2hlZXROYW1lXS5Sb3cocm93KS5IaWRkZW47CisKKyAgICByZXR1cm4gYjsKKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFJlc2V0KCkgeworICAgIF9uYW1lcyA9IG5ldygpOyAvL1Jlc2V0IG5hbWUgY2FjaGUuCisgIH0KIH0KLSAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXBwbHVzTmFtZVZhbHVlUHJvdmlkZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXBwbHVzTmFtZVZhbHVlUHJvdmlkZXIuY3MKaW5kZXggYTQwNzkwZS4uNjBiZWNlYyAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0VwcGx1c05hbWVWYWx1ZVByb3ZpZGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FcHBsdXNOYW1lVmFsdWVQcm92aWRlci5jcwpAQCAtMSw0MyArMSwyOSBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK++7v25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZwotewotICAgIHB1YmxpYyBjbGFzcyBFcHBsdXNOYW1lVmFsdWVQcm92aWRlciA6IElOYW1lVmFsdWVQcm92aWRlcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbERhdGFQcm92aWRlciBfZXhjZWxEYXRhUHJvdmlkZXI7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbiBfdmFsdWVzOworcHVibGljIGNsYXNzIEVwcGx1c05hbWVWYWx1ZVByb3ZpZGVyIDogSU5hbWVWYWx1ZVByb3ZpZGVyIHsKKyAgcHJpdmF0ZSBFeGNlbERhdGFQcm92aWRlciBfZXhjZWxEYXRhUHJvdmlkZXI7CisgIHByaXZhdGUgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbiBfdmFsdWVzOwogCi0gICAgICAgIHB1YmxpYyBFcHBsdXNOYW1lVmFsdWVQcm92aWRlcihFeGNlbERhdGFQcm92aWRlciBleGNlbERhdGFQcm92aWRlcikKLSAgICAgICAgewotICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyID0gZXhjZWxEYXRhUHJvdmlkZXI7Ci0gICAgICAgICAgICBfdmFsdWVzID0gX2V4Y2VsRGF0YVByb3ZpZGVyLkdldFdvcmtib29rTmFtZVZhbHVlcygpOwotICAgICAgICB9CisgIHB1YmxpYyBFcHBsdXNOYW1lVmFsdWVQcm92aWRlcihFeGNlbERhdGFQcm92aWRlciBleGNlbERhdGFQcm92aWRlcikgeworICAgIF9leGNlbERhdGFQcm92aWRlciA9IGV4Y2VsRGF0YVByb3ZpZGVyOworICAgIF92YWx1ZXMgPSBfZXhjZWxEYXRhUHJvdmlkZXIuR2V0V29ya2Jvb2tOYW1lVmFsdWVzKCk7CisgIH0KIAotICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIElzTmFtZWRWYWx1ZShzdHJpbmcga2V5LCBzdHJpbmcgd3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHdzIT1udWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB3c05hbWVzID0gX2V4Y2VsRGF0YVByb3ZpZGVyLkdldFdvcmtzaGVldE5hbWVzKHdzKTsKLSAgICAgICAgICAgICAgICBpZih3c05hbWVzIT1udWxsICYmIHdzTmFtZXMuQ29udGFpbnNLZXkoa2V5KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBfdmFsdWVzICE9IG51bGwgJiYgX3ZhbHVlcy5Db250YWluc0tleShrZXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEdldE5hbWVkVmFsdWUoc3RyaW5nIGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF92YWx1ZXNba2V5XTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgUmVsb2FkKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3ZhbHVlcyA9IF9leGNlbERhdGFQcm92aWRlci5HZXRXb3JrYm9va05hbWVWYWx1ZXMoKTsKLSAgICAgICAgfQorICBwdWJsaWMgdmlydHVhbCBib29sIElzTmFtZWRWYWx1ZShzdHJpbmcga2V5LCBzdHJpbmcgd3MpIHsKKyAgICBpZiAod3MgIT0gbnVsbCkgeworICAgICAgdmFyIHdzTmFtZXMgPSBfZXhjZWxEYXRhUHJvdmlkZXIuR2V0V29ya3NoZWV0TmFtZXMod3MpOworICAgICAgaWYgKHdzTmFtZXMgIT0gbnVsbCAmJiB3c05hbWVzLkNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CiAgICAgfQorICAgIHJldHVybiBfdmFsdWVzICE9IG51bGwgJiYgX3ZhbHVlcy5Db250YWluc0tleShrZXkpOworICB9CisKKyAgcHVibGljIHZpcnR1YWwgb2JqZWN0IEdldE5hbWVkVmFsdWUoc3RyaW5nIGtleSkgeworICAgIHJldHVybiBfdmFsdWVzW2tleV07CisgIH0KKworICBwdWJsaWMgdmlydHVhbCB2b2lkIFJlbG9hZCgpIHsKKyAgICBfdmFsdWVzID0gX2V4Y2VsRGF0YVByb3ZpZGVyLkdldFdvcmtib29rTmFtZVZhbHVlcygpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRXhjZWxDZWxsU3RhdGUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRXhjZWxDZWxsU3RhdGUuY3MKaW5kZXggN2E2NTU2ZC4uMzU1MWI4YSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0V4Y2VsQ2VsbFN0YXRlLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9FeGNlbENlbGxTdGF0ZS5jcwpAQCAtMTMsMzMgKzEzLDI5IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsCi17Ci0gICAgW0ZsYWdzXQotICAgIHB1YmxpYyBlbnVtIEV4Y2VsQ2VsbFN0YXRlCi0gICAgewotICAgICAgICBIaWRkZW5DZWxsID0gMSwKLSAgICAgICAgQ29udGFpbnNFcnJvciA9IDIsCi0gICAgICAgIElzUmVzdWx0T2ZTdWJ0b3RhbCA9IDQKLSAgICB9Cit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsOworCitbRmxhZ3NdCitwdWJsaWMgZW51bSBFeGNlbENlbGxTdGF0ZSB7CisgIEhpZGRlbkNlbGwgPSAxLAorICBDb250YWluc0Vycm9yID0gMiwKKyAgSXNSZXN1bHRPZlN1YnRvdGFsID0gNCwKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRDb2xsZWN0aW9uVXRpbC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRDb2xsZWN0aW9uVXRpbC5jcwppbmRleCA3Mzc1ZWNmLi4zYWJkNTE0IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50Q29sbGVjdGlvblV0aWwuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Bcmd1bWVudENvbGxlY3Rpb25VdGlsLmNzCkBAIC0xMyw3MyArMTMsNzEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCi17Ci0gICAgcHVibGljIGNsYXNzIEFyZ3VtZW50Q29sbGVjdGlvblV0aWwKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlciBfZG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlcjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBPYmplY3RFbnVtZXJhYmxlQXJnQ29udmVydGVyIF9vYmplY3RFbnVtZXJhYmxlQXJnQ29udmVydGVyOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwogCi0gICAgICAgIHB1YmxpYyBBcmd1bWVudENvbGxlY3Rpb25VdGlsKCkKLSAgICAgICAgICAgIDogdGhpcyhuZXcgRG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlcigpLCBuZXcgT2JqZWN0RW51bWVyYWJsZUFyZ0NvbnZlcnRlcigpKQotICAgICAgICB7CitwdWJsaWMgY2xhc3MgQXJndW1lbnRDb2xsZWN0aW9uVXRpbCB7CisgIHByaXZhdGUgcmVhZG9ubHkgRG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlciBfZG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlcjsKKyAgcHJpdmF0ZSByZWFkb25seSBPYmplY3RFbnVtZXJhYmxlQXJnQ29udmVydGVyIF9vYmplY3RFbnVtZXJhYmxlQXJnQ29udmVydGVyOwogCi0gICAgICAgIH0KKyAgcHVibGljIEFyZ3VtZW50Q29sbGVjdGlvblV0aWwoKQorICAgICAgOiB0aGlzKG5ldygpLCBuZXcoKSkge30KIAotICAgICAgICBwdWJsaWMgQXJndW1lbnRDb2xsZWN0aW9uVXRpbCgKLSAgICAgICAgICAgIERvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIgZG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlciwgCi0gICAgICAgICAgICBPYmplY3RFbnVtZXJhYmxlQXJnQ29udmVydGVyIG9iamVjdEVudW1lcmFibGVBcmdDb252ZXJ0ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9kb3VibGVFbnVtZXJhYmxlQXJnQ29udmVydGVyID0gZG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlcjsKLSAgICAgICAgICAgIF9vYmplY3RFbnVtZXJhYmxlQXJnQ29udmVydGVyID0gb2JqZWN0RW51bWVyYWJsZUFyZ0NvbnZlcnRlcjsKLSAgICAgICAgfQorICBwdWJsaWMgQXJndW1lbnRDb2xsZWN0aW9uVXRpbCgKKyAgICAgIERvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIgZG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlciwKKyAgICAgIE9iamVjdEVudW1lcmFibGVBcmdDb252ZXJ0ZXIgb2JqZWN0RW51bWVyYWJsZUFyZ0NvbnZlcnRlcikgeworICAgIF9kb3VibGVFbnVtZXJhYmxlQXJnQ29udmVydGVyID0gZG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlcjsKKyAgICBfb2JqZWN0RW51bWVyYWJsZUFyZ0NvbnZlcnRlciA9IG9iamVjdEVudW1lcmFibGVBcmdDb252ZXJ0ZXI7CisgIH0KIAotICAgICAgICBwdWJsaWMgdmlydHVhbCBJRW51bWVyYWJsZTxkb3VibGU+IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoYm9vbCBpZ25vcmVIaWRkZW4sIGJvb2wgaWdub3JlRXJyb3JzLCBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfZG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlci5Db252ZXJ0QXJncyhpZ25vcmVIaWRkZW4sIGlnbm9yZUVycm9ycywgYXJndW1lbnRzLCBjb250ZXh0KTsKLSAgICAgICAgfQorICBwdWJsaWMgdmlydHVhbCBJRW51bWVyYWJsZTxkb3VibGU+IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoCisgICAgICBib29sIGlnbm9yZUhpZGRlbiwKKyAgICAgIGJvb2wgaWdub3JlRXJyb3JzLAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHJldHVybiBfZG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlci5Db252ZXJ0QXJncygKKyAgICAgICAgaWdub3JlSGlkZGVuLAorICAgICAgICBpZ25vcmVFcnJvcnMsCisgICAgICAgIGFyZ3VtZW50cywKKyAgICAgICAgY29udGV4dCk7CisgIH0KIAotICAgICAgICBwdWJsaWMgdmlydHVhbCBJRW51bWVyYWJsZTxvYmplY3Q+IEFyZ3NUb09iamVjdEVudW1lcmFibGUoYm9vbCBpZ25vcmVIaWRkZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX29iamVjdEVudW1lcmFibGVBcmdDb252ZXJ0ZXIuQ29udmVydEFyZ3MoaWdub3JlSGlkZGVuLCBhcmd1bWVudHMsIGNvbnRleHQpOwotICAgICAgICB9CisgIHB1YmxpYyB2aXJ0dWFsIElFbnVtZXJhYmxlPG9iamVjdD4gQXJnc1RvT2JqZWN0RW51bWVyYWJsZSgKKyAgICAgIGJvb2wgaWdub3JlSGlkZGVuLAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHJldHVybiBfb2JqZWN0RW51bWVyYWJsZUFyZ0NvbnZlcnRlci5Db252ZXJ0QXJncyhpZ25vcmVIaWRkZW4sIGFyZ3VtZW50cywgY29udGV4dCk7CisgIH0KIAotICAgICAgICBwdWJsaWMgdmlydHVhbCBkb3VibGUgQ2FsY3VsYXRlQ29sbGVjdGlvbihJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBjb2xsZWN0aW9uLCBkb3VibGUgcmVzdWx0LCBGdW5jPEZ1bmN0aW9uQXJndW1lbnQsIGRvdWJsZSwgZG91YmxlPiBhY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGNvbGxlY3Rpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0uVmFsdWUgaXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBDYWxjdWxhdGVDb2xsZWN0aW9uKChJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PilpdGVtLlZhbHVlLCByZXN1bHQsIGFjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFjdGlvbihpdGVtLCByZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KKyAgcHVibGljIHZpcnR1YWwgZG91YmxlIENhbGN1bGF0ZUNvbGxlY3Rpb24oCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBjb2xsZWN0aW9uLAorICAgICAgZG91YmxlIHJlc3VsdCwKKyAgICAgIEZ1bmM8RnVuY3Rpb25Bcmd1bWVudCwgZG91YmxlLCBkb3VibGU+IGFjdGlvbikgeworICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGNvbGxlY3Rpb24pIHsKKyAgICAgIGlmIChpdGVtLlZhbHVlIGlzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KSB7CisgICAgICAgIHJlc3VsdCA9IENhbGN1bGF0ZUNvbGxlY3Rpb24oKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KWl0ZW0uVmFsdWUsIHJlc3VsdCwgYWN0aW9uKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdCA9IGFjdGlvbihpdGVtLCByZXN1bHQpOworICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50UGFyc2VyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Bcmd1bWVudFBhcnNlci5jcwppbmRleCBjZGFkOGIxLi5kMTk4ZGVhIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50UGFyc2VyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRQYXJzZXIuY3MKQEAgLTEsMzYgKzEsMzAgQEAKLe+7vyAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorKgorKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKLSAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAotICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAotICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAotICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KLSAqCi0gKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAotICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CisqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKKyogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAorKgorKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgorKgorKiBDb2RlIGNoYW5nZSBub3RlczoKKyoKKyogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucwotewotICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBcmd1bWVudFBhcnNlcgotICAgIHsKLSAgICAgICAgcHVibGljIGFic3RyYWN0IG9iamVjdCBQYXJzZShvYmplY3Qgb2JqKTsKLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7CisKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBcmd1bWVudFBhcnNlciB7CisgIHB1YmxpYyBhYnN0cmFjdCBvYmplY3QgUGFyc2Uob2JqZWN0IG9iaik7CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50UGFyc2VyRmFjdG9yeS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRQYXJzZXJGYWN0b3J5LmNzCmluZGV4IDk5NzE3M2QuLjgxN2Y4NWEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRQYXJzZXJGYWN0b3J5LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRQYXJzZXJGYWN0b3J5LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpAQCAtNyw0NCArNywzOCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucwotewotICAgIHB1YmxpYyBjbGFzcyBBcmd1bWVudFBhcnNlckZhY3RvcnkKLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIEFyZ3VtZW50UGFyc2VyIENyZWF0ZUFyZ3VtZW50UGFyc2VyKERhdGFUeXBlIGRhdGFUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGRhdGFUeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuSW50ZWdlcjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRBcmd1bWVudFBhcnNlcigpOwotICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuQm9vbGVhbjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCb29sQXJndW1lbnRQYXJzZXIoKTsKLSAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkRlY2ltYWw6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlQXJndW1lbnRQYXJzZXIoKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigibm9uIHN1cHBvcnRlZCBhcmd1bWVudCBwYXJzZXIgdHlwZSAiICsgZGF0YVR5cGUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKKworcHVibGljIGNsYXNzIEFyZ3VtZW50UGFyc2VyRmFjdG9yeSB7CisgIHB1YmxpYyB2aXJ0dWFsIEFyZ3VtZW50UGFyc2VyIENyZWF0ZUFyZ3VtZW50UGFyc2VyKERhdGFUeXBlIGRhdGFUeXBlKSB7CisgICAgc3dpdGNoIChkYXRhVHlwZSkgeworICAgICAgY2FzZSBEYXRhVHlwZS5JbnRlZ2VyOgorICAgICAgICByZXR1cm4gbmV3IEludEFyZ3VtZW50UGFyc2VyKCk7CisgICAgICBjYXNlIERhdGFUeXBlLkJvb2xlYW46CisgICAgICAgIHJldHVybiBuZXcgQm9vbEFyZ3VtZW50UGFyc2VyKCk7CisgICAgICBjYXNlIERhdGFUeXBlLkRlY2ltYWw6CisgICAgICAgIHJldHVybiBuZXcgRG91YmxlQXJndW1lbnRQYXJzZXIoKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJub24gc3VwcG9ydGVkIGFyZ3VtZW50IHBhcnNlciB0eXBlICIgKyBkYXRhVHlwZSk7CiAgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0FyZ3VtZW50UGFyc2Vycy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRQYXJzZXJzLmNzCmluZGV4IGE4Y2E4MzguLjFjNGQxMGUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRQYXJzZXJzLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQXJndW1lbnRQYXJzZXJzLmNzCkBAIC0xLDUgKzEsNCBAQAot77u/dXNpbmcgU3lzdGVtOwotLyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KK++7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpAQCAtOCw2MCArNyw0OSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCi17Ci0gICAgcHVibGljIGNsYXNzIEFyZ3VtZW50UGFyc2VycwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IF9zeW5jUm9vdCA9IG5ldyBvYmplY3QoKTsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBEaWN0aW9uYXJ5PERhdGFUeXBlLCBBcmd1bWVudFBhcnNlcj4gX3BhcnNlcnMgPSBuZXcgRGljdGlvbmFyeTxEYXRhVHlwZSwgQXJndW1lbnRQYXJzZXI+KCk7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQXJndW1lbnRQYXJzZXJGYWN0b3J5IF9wYXJzZXJGYWN0b3J5OworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwogCi0gICAgICAgIHB1YmxpYyBBcmd1bWVudFBhcnNlcnMoKQotICAgICAgICAgICAgOiB0aGlzKG5ldyBBcmd1bWVudFBhcnNlckZhY3RvcnkoKSkKLSAgICAgICAgeworcHVibGljIGNsYXNzIEFyZ3VtZW50UGFyc2VycyB7CisgIHByaXZhdGUgc3RhdGljIG9iamVjdCBfc3luY1Jvb3QgPSBuZXcoKTsKKyAgcHJpdmF0ZSByZWFkb25seSBEaWN0aW9uYXJ5PERhdGFUeXBlLCBBcmd1bWVudFBhcnNlcj4gX3BhcnNlcnMgPSBuZXcoKTsKKyAgcHJpdmF0ZSByZWFkb25seSBBcmd1bWVudFBhcnNlckZhY3RvcnkgX3BhcnNlckZhY3Rvcnk7CiAKKyAgcHVibGljIEFyZ3VtZW50UGFyc2VycygpCisgICAgICA6IHRoaXMobmV3KCkpIHt9CisKKyAgcHVibGljIEFyZ3VtZW50UGFyc2VycyhBcmd1bWVudFBhcnNlckZhY3RvcnkgZmFjdG9yeSkgeworICAgIFJlcXVpcmUuVGhhdChmYWN0b3J5KS5OYW1lZCgiYXJndW1lbnRQYXJzZXJmYWN0b3J5IikuSXNOb3ROdWxsKCk7CisgICAgX3BhcnNlckZhY3RvcnkgPSBmYWN0b3J5OworICB9CisKKyAgcHVibGljIEFyZ3VtZW50UGFyc2VyIEdldFBhcnNlcihEYXRhVHlwZSBkYXRhVHlwZSkgeworICAgIGlmICghX3BhcnNlcnMuQ29udGFpbnNLZXkoZGF0YVR5cGUpKSB7CisgICAgICBsb2NrIChfc3luY1Jvb3QpIHsKKyAgICAgICAgaWYgKCFfcGFyc2Vycy5Db250YWluc0tleShkYXRhVHlwZSkpIHsKKyAgICAgICAgICBfcGFyc2Vycy5BZGQoZGF0YVR5cGUsIF9wYXJzZXJGYWN0b3J5LkNyZWF0ZUFyZ3VtZW50UGFyc2VyKGRhdGFUeXBlKSk7CiAgICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQXJndW1lbnRQYXJzZXJzKEFyZ3VtZW50UGFyc2VyRmFjdG9yeSBmYWN0b3J5KQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQoZmFjdG9yeSkuTmFtZWQoImFyZ3VtZW50UGFyc2VyZmFjdG9yeSIpLklzTm90TnVsbCgpOwotICAgICAgICAgICAgX3BhcnNlckZhY3RvcnkgPSBmYWN0b3J5OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEFyZ3VtZW50UGFyc2VyIEdldFBhcnNlcihEYXRhVHlwZSBkYXRhVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFfcGFyc2Vycy5Db250YWluc0tleShkYXRhVHlwZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9jayAoX3N5bmNSb290KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFfcGFyc2Vycy5Db250YWluc0tleShkYXRhVHlwZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJzZXJzLkFkZChkYXRhVHlwZSwgX3BhcnNlckZhY3RvcnkuQ3JlYXRlQXJndW1lbnRQYXJzZXIoZGF0YVR5cGUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBfcGFyc2Vyc1tkYXRhVHlwZV07Ci0gICAgICAgIH0KKyAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIF9wYXJzZXJzW2RhdGFUeXBlXTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Cb29sQXJndW1lbnRQYXJzZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Jvb2xBcmd1bWVudFBhcnNlci5jcwppbmRleCAwM2U2ZGFkLi5mNDkyNTgwIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Jvb2xBcmd1bWVudFBhcnNlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Jvb2xBcmd1bWVudFBhcnNlci5jcwpAQCAtNyw0NyArNyw0NyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucwotewotICAgIHB1YmxpYyBjbGFzcyBCb29sQXJndW1lbnRQYXJzZXIgOiBBcmd1bWVudFBhcnNlcgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBQYXJzZShvYmplY3Qgb2JqKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob2JqIGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHIgPSAoKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pb2JqKS5GaXJzdE9yRGVmYXVsdCgpOwotICAgICAgICAgICAgICAgIG9iaiA9IChyID09IG51bGwgPyBudWxsIDogci5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIGlmIChvYmogaXMgYm9vbCkgcmV0dXJuIChib29sKW9iajsKLSAgICAgICAgICAgIGlmIChvYmouSXNOdW1lcmljKCkpIHJldHVybiBDb252ZXJ0LlRvQm9vbGVhbihvYmopOwotICAgICAgICAgICAgYm9vbCByZXN1bHQ7Ci0gICAgICAgICAgICBpZiAoYm9vbC5UcnlQYXJzZShvYmouVG9TdHJpbmcoKSwgb3V0IHJlc3VsdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKKworcHVibGljIGNsYXNzIEJvb2xBcmd1bWVudFBhcnNlciA6IEFyZ3VtZW50UGFyc2VyIHsKKyAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBQYXJzZShvYmplY3Qgb2JqKSB7CisgICAgaWYgKG9iaiBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSB7CisgICAgICB2YXIgciA9ICgoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbylvYmopLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICBvYmogPSAociA9PSBudWxsID8gbnVsbCA6IHIuVmFsdWUpOwogICAgIH0KKyAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG9iaiBpcyBib29sKSB7CisgICAgICByZXR1cm4gKGJvb2wpb2JqOworICAgIH0KKyAgICBpZiAob2JqLklzTnVtZXJpYygpKSB7CisgICAgICByZXR1cm4gQ29udmVydC5Ub0Jvb2xlYW4ob2JqKTsKKyAgICB9CisgICAgYm9vbCByZXN1bHQ7CisgICAgaWYgKGJvb2wuVHJ5UGFyc2Uob2JqLlRvU3RyaW5nKCksIG91dCByZXN1bHQpKSB7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0J1aWx0SW5GdW5jdGlvbnMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0J1aWx0SW5GdW5jdGlvbnMuY3MKaW5kZXggYWE0YmNiMS4uYzdkNTZiMiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9CdWlsdEluRnVuY3Rpb25zLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQnVpbHRJbkZ1bmN0aW9ucy5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKQEAgLTcsMTg4ICs3LDE5NiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2U7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZTsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTG9naWNhbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5OdW1lcmljOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuSW5mb3JtYXRpb247Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICBwdWJsaWMgY2xhc3MgQnVpbHRJbkZ1bmN0aW9ucyA6IEZ1bmN0aW9uc01vZHVsZQotICAgIHsKLSAgICAgICAgcHVibGljIEJ1aWx0SW5GdW5jdGlvbnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUZXh0Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImxlbiJdID0gbmV3IExlbigpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJsb3dlciJdID0gbmV3IExvd2VyKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInVwcGVyIl0gPSBuZXcgVXBwZXIoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sibGVmdCJdID0gbmV3IExlZnQoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sicmlnaHQiXSA9IG5ldyBSaWdodCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJtaWQiXSA9IG5ldyBNaWQoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sicmVwbGFjZSJdID0gbmV3IFJlcGxhY2UoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sicmVwdCJdID0gbmV3IFJlcHQoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sic3Vic3RpdHV0ZSJdID0gbmV3IFN1YnN0aXR1dGUoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siY29uY2F0ZW5hdGUiXSA9IG5ldyBDb25jYXRlbmF0ZSgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJjaGFyIl0gPSBuZXcgQ2hhckZ1bmN0aW9uKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImV4YWN0Il0gPSBuZXcgRXhhY3QoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siZmluZCJdID0gbmV3IEZpbmQoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siZml4ZWQiXSA9IG5ldyBGaXhlZCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJwcm9wZXIiXSA9IG5ldyBQcm9wZXIoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sidGV4dCJdID0gbmV3IFRleHQuVGV4dCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJ0Il0gPSBuZXcgVCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJoeXBlcmxpbmsiXSA9IG5ldyBIeXBlcmxpbmsoKTsKLSAgICAgICAgICAgIC8vIE51bWJlcnMKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siaW50Il0gPSBuZXcgQ0ludCgpOwotICAgICAgICAgICAgLy8gTWF0aAotICAgICAgICAgICAgRnVuY3Rpb25zWyJhYnMiXSA9IG5ldyBBYnMoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siYXNpbiJdID0gbmV3IEFzaW4oKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siYXNpbmgiXSA9IG5ldyBBc2luaCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJjb3MiXSA9IG5ldyBDb3MoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siY29zaCJdID0gbmV3IENvc2goKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sicG93ZXIiXSA9IG5ldyBQb3dlcigpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJzaWduIl0gPSBuZXcgU2lnbigpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJzcXJ0Il0gPSBuZXcgU3FydCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJzcXJ0cGkiXSA9IG5ldyBTcXJ0UGkoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sicGkiXSA9IG5ldyBQaSgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJwcm9kdWN0Il0gPSBuZXcgUHJvZHVjdCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJjZWlsaW5nIl0gPSBuZXcgQ2VpbGluZygpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJjb3VudCJdID0gbmV3IENvdW50KCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImNvdW50YSJdID0gbmV3IENvdW50QSgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJjb3VudGJsYW5rIl0gPSBuZXcgQ291bnRCbGFuaygpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJjb3VudGlmIl0gPSBuZXcgQ291bnRJZigpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJjb3VudGlmcyJdID0gbmV3IENvdW50SWZzKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImZhY3QiXSA9IG5ldyBGYWN0KCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImZsb29yIl0gPSBuZXcgRmxvb3IoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sic2luIl0gPSBuZXcgU2luKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInNpbmgiXSA9IG5ldyBTaW5oKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInN1bSJdID0gbmV3IFN1bSgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJzdW1pZiJdID0gbmV3IFN1bUlmKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInN1bWlmcyJdID0gbmV3IFN1bUlmcygpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJzdW1wcm9kdWN0Il0gPSBuZXcgU3VtUHJvZHVjdCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJzdW1zcSJdID0gbmV3IFN1bXNxKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInN0ZGV2Il0gPSBuZXcgU3RkZXYoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sic3RkZXZwIl0gPSBuZXcgU3RkZXZQKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInN0ZGV2LnMiXSA9IG5ldyBTdGRldigpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJzdGRldi5wIl0gPSBuZXcgU3RkZXZQKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInN1YnRvdGFsIl0gPSBuZXcgU3VidG90YWwoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siZXhwIl0gPSBuZXcgRXhwKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImxvZyJdID0gbmV3IExvZygpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJsb2cxMCJdID0gbmV3IExvZzEwKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImxuIl0gPSBuZXcgTG4oKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sibWF4Il0gPSBuZXcgTWF4KCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbIm1heGEiXSA9IG5ldyBNYXhhKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbIm1lZGlhbiJdID0gbmV3IE1lZGlhbigpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJtaW4iXSA9IG5ldyBNaW4oKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sibWluYSJdID0gbmV3IE1pbmEoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sibW9kIl0gPSBuZXcgTW9kKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImF2ZXJhZ2UiXSA9IG5ldyBBdmVyYWdlKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImF2ZXJhZ2VhIl0gPSBuZXcgQXZlcmFnZUEoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siYXZlcmFnZWlmIl0gPSBuZXcgQXZlcmFnZUlmKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImF2ZXJhZ2VpZnMiXSA9IG5ldyBBdmVyYWdlSWZzKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInJvdW5kIl0gPSBuZXcgUm91bmQoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sicm91bmRkb3duIl0gPSBuZXcgUm91bmRkb3duKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInJvdW5kdXAiXSA9IG5ldyBSb3VuZHVwKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInJhbmQiXSA9IG5ldyBSYW5kKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInJhbmRiZXR3ZWVuIl0gPSBuZXcgUmFuZEJldHdlZW4oKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sicXVvdGllbnQiXSA9IG5ldyBRdW90aWVudCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJ0cnVuYyJdID0gbmV3IFRydW5jKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInRhbiJdID0gbmV3IFRhbigpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJ0YW5oIl0gPSBuZXcgVGFuaCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJhdGFuIl0gPSBuZXcgQXRhbigpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJhdGFuMiJdID0gbmV3IEF0YW4yKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImF0YW5oIl0gPSBuZXcgQXRhbmgoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siYWNvcyJdID0gbmV3IEFjb3MoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siYWNvc2giXSA9IG5ldyBBY29zaCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJ2YXIiXSA9IG5ldyBWYXIoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sidmFycCJdID0gbmV3IFZhclAoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sibGFyZ2UiXSA9IG5ldyBMYXJnZSgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJzbWFsbCJdID0gbmV3IFNtYWxsKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImRlZ3JlZXMiXSA9IG5ldyBEZWdyZWVzKCk7Ci0gICAgICAgICAgICAvLyBJbmZvcm1hdGlvbgotICAgICAgICAgICAgRnVuY3Rpb25zWyJpc2JsYW5rIl0gPSBuZXcgSXNCbGFuaygpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJpc251bWJlciJdID0gbmV3IElzTnVtYmVyKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImlzdGV4dCJdID0gbmV3IElzVGV4dCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJpc25vbnRleHQiXSA9IG5ldyBJc05vblRleHQoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siaXNlcnJvciJdID0gbmV3IElzRXJyb3IoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siaXNlcnIiXSA9IG5ldyBJc0VycigpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJlcnJvci50eXBlIl0gPSBuZXcgRXJyb3JUeXBlKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImlzZXZlbiJdID0gbmV3IElzRXZlbigpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJpc29kZCJdID0gbmV3IElzT2RkKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImlzbG9naWNhbCJdID0gbmV3IElzTG9naWNhbCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJpc25hIl0gPSBuZXcgSXNOYSgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJuYSJdID0gbmV3IE5hKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbIm4iXSA9IG5ldyBOKCk7Ci0gICAgICAgICAgICAvLyBMb2dpY2FsCi0gICAgICAgICAgICBGdW5jdGlvbnNbImlmIl0gPSBuZXcgSWYoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siaWZlcnJvciJdID0gbmV3IElmRXJyb3IoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siaWZuYSJdID0gbmV3IElmTmEoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sibm90Il0gPSBuZXcgTm90KCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImFuZCJdID0gbmV3IEFuZCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJvciJdID0gbmV3IE9yKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInRydWUiXSA9IG5ldyBUcnVlKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImZhbHNlIl0gPSBuZXcgRmFsc2UoKTsKLSAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBhbmQgbG9va3VwCi0gICAgICAgICAgICBGdW5jdGlvbnNbImFkZHJlc3MiXSA9IG5ldyBBZGRyZXNzKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImhsb29rdXAiXSA9IG5ldyBITG9va3VwKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInZsb29rdXAiXSA9IG5ldyBWTG9va3VwKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImxvb2t1cCJdID0gbmV3IExvb2t1cCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJtYXRjaCJdID0gbmV3IE1hdGNoKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInJvdyJdID0gbmV3IFJvdygpe1NraXBBcmd1bWVudEV2YWx1YXRpb24gPSB0cnVlfTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sicm93cyJdID0gbmV3IFJvd3MoKXtTa2lwQXJndW1lbnRFdmFsdWF0aW9uID0gdHJ1ZX07Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImNvbHVtbiJdID0gbmV3IENvbHVtbigpe1NraXBBcmd1bWVudEV2YWx1YXRpb24gPSB0cnVlfTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siY29sdW1ucyJdID0gbmV3IENvbHVtbnMoKXtTa2lwQXJndW1lbnRFdmFsdWF0aW9uID0gdHJ1ZX07Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImNob29zZSJdID0gbmV3IENob29zZSgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJpbmRleCJdID0gbmV3IEluZGV4KCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImluZGlyZWN0Il0gPSBuZXcgSW5kaXJlY3QoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sib2Zmc2V0Il0gPSBuZXcgT2Zmc2V0KCl7U2tpcEFyZ3VtZW50RXZhbHVhdGlvbiA9IHRydWV9OwotICAgICAgICAgICAgLy8gRGF0ZQotICAgICAgICAgICAgRnVuY3Rpb25zWyJkYXRlIl0gPSBuZXcgRGF0ZSgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJ0b2RheSJdID0gbmV3IFRvZGF5KCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbIm5vdyJdID0gbmV3IE5vdygpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJkYXkiXSA9IG5ldyBEYXkoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sibW9udGgiXSA9IG5ldyBNb250aCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJ5ZWFyIl0gPSBuZXcgWWVhcigpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJ0aW1lIl0gPSBuZXcgVGltZSgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJob3VyIl0gPSBuZXcgSG91cigpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJtaW51dGUiXSA9IG5ldyBNaW51dGUoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1sic2Vjb25kIl0gPSBuZXcgU2Vjb25kKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbIndlZWtudW0iXSA9IG5ldyBXZWVrbnVtKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbIndlZWtkYXkiXSA9IG5ldyBXZWVrZGF5KCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImRheXMzNjAiXSA9IG5ldyBEYXlzMzYwKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbInllYXJmcmFjIl0gPSBuZXcgWWVhcmZyYWMoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siZWRhdGUiXSA9IG5ldyBFZGF0ZSgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJlb21vbnRoIl0gPSBuZXcgRW9tb250aCgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJpc293ZWVrbnVtIl0gPSBuZXcgSXNvV2Vla051bSgpOwotICAgICAgICAgICAgRnVuY3Rpb25zWyJ3b3JrZGF5Il0gPSBuZXcgV29ya2RheSgpOwotICAgICAgICAgICAgLy8gRGF0YWJhc2UKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siZGdldCJdID0gbmV3IERnZXQoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siZGNvdW50Il0gPSBuZXcgRGNvdW50KCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImRjb3VudGEiXSA9IG5ldyBEY291bnRBKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImRtYXgiXSA9IG5ldyBEbWF4KCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImRtaW4iXSA9IG5ldyBEbWluKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImRzdW0iXSA9IG5ldyBEc3VtKCk7Ci0gICAgICAgICAgICBGdW5jdGlvbnNbImRhdmVyYWdlIl0gPSBuZXcgRGF2ZXJhZ2UoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siZHZhciJdID0gbmV3IER2YXIoKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uc1siZHZhcnAiXSA9IG5ldyBEdmFycCgpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOworCitwdWJsaWMgY2xhc3MgQnVpbHRJbkZ1bmN0aW9ucyA6IEZ1bmN0aW9uc01vZHVsZSB7CisgIHB1YmxpYyBCdWlsdEluRnVuY3Rpb25zKCkgeworICAgIC8vIFRleHQKKyAgICBGdW5jdGlvbnNbImxlbiJdID0gbmV3IExlbigpOworICAgIEZ1bmN0aW9uc1sibG93ZXIiXSA9IG5ldyBMb3dlcigpOworICAgIEZ1bmN0aW9uc1sidXBwZXIiXSA9IG5ldyBVcHBlcigpOworICAgIEZ1bmN0aW9uc1sibGVmdCJdID0gbmV3IExlZnQoKTsKKyAgICBGdW5jdGlvbnNbInJpZ2h0Il0gPSBuZXcgUmlnaHQoKTsKKyAgICBGdW5jdGlvbnNbIm1pZCJdID0gbmV3IE1pZCgpOworICAgIEZ1bmN0aW9uc1sicmVwbGFjZSJdID0gbmV3IFJlcGxhY2UoKTsKKyAgICBGdW5jdGlvbnNbInJlcHQiXSA9IG5ldyBSZXB0KCk7CisgICAgRnVuY3Rpb25zWyJzdWJzdGl0dXRlIl0gPSBuZXcgU3Vic3RpdHV0ZSgpOworICAgIEZ1bmN0aW9uc1siY29uY2F0ZW5hdGUiXSA9IG5ldyBDb25jYXRlbmF0ZSgpOworICAgIEZ1bmN0aW9uc1siY2hhciJdID0gbmV3IENoYXJGdW5jdGlvbigpOworICAgIEZ1bmN0aW9uc1siZXhhY3QiXSA9IG5ldyBFeGFjdCgpOworICAgIEZ1bmN0aW9uc1siZmluZCJdID0gbmV3IEZpbmQoKTsKKyAgICBGdW5jdGlvbnNbImZpeGVkIl0gPSBuZXcgRml4ZWQoKTsKKyAgICBGdW5jdGlvbnNbInByb3BlciJdID0gbmV3IFByb3BlcigpOworICAgIEZ1bmN0aW9uc1sidGV4dCJdID0gbmV3IFRleHQuVGV4dCgpOworICAgIEZ1bmN0aW9uc1sidCJdID0gbmV3IFQoKTsKKyAgICBGdW5jdGlvbnNbImh5cGVybGluayJdID0gbmV3IEh5cGVybGluaygpOworICAgIC8vIE51bWJlcnMKKyAgICBGdW5jdGlvbnNbImludCJdID0gbmV3IENJbnQoKTsKKyAgICAvLyBNYXRoCisgICAgRnVuY3Rpb25zWyJhYnMiXSA9IG5ldyBBYnMoKTsKKyAgICBGdW5jdGlvbnNbImFzaW4iXSA9IG5ldyBBc2luKCk7CisgICAgRnVuY3Rpb25zWyJhc2luaCJdID0gbmV3IEFzaW5oKCk7CisgICAgRnVuY3Rpb25zWyJjb3MiXSA9IG5ldyBDb3MoKTsKKyAgICBGdW5jdGlvbnNbImNvc2giXSA9IG5ldyBDb3NoKCk7CisgICAgRnVuY3Rpb25zWyJwb3dlciJdID0gbmV3IFBvd2VyKCk7CisgICAgRnVuY3Rpb25zWyJzaWduIl0gPSBuZXcgU2lnbigpOworICAgIEZ1bmN0aW9uc1sic3FydCJdID0gbmV3IFNxcnQoKTsKKyAgICBGdW5jdGlvbnNbInNxcnRwaSJdID0gbmV3IFNxcnRQaSgpOworICAgIEZ1bmN0aW9uc1sicGkiXSA9IG5ldyBQaSgpOworICAgIEZ1bmN0aW9uc1sicHJvZHVjdCJdID0gbmV3IFByb2R1Y3QoKTsKKyAgICBGdW5jdGlvbnNbImNlaWxpbmciXSA9IG5ldyBDZWlsaW5nKCk7CisgICAgRnVuY3Rpb25zWyJjb3VudCJdID0gbmV3IENvdW50KCk7CisgICAgRnVuY3Rpb25zWyJjb3VudGEiXSA9IG5ldyBDb3VudEEoKTsKKyAgICBGdW5jdGlvbnNbImNvdW50YmxhbmsiXSA9IG5ldyBDb3VudEJsYW5rKCk7CisgICAgRnVuY3Rpb25zWyJjb3VudGlmIl0gPSBuZXcgQ291bnRJZigpOworICAgIEZ1bmN0aW9uc1siY291bnRpZnMiXSA9IG5ldyBDb3VudElmcygpOworICAgIEZ1bmN0aW9uc1siZmFjdCJdID0gbmV3IEZhY3QoKTsKKyAgICBGdW5jdGlvbnNbImZsb29yIl0gPSBuZXcgRmxvb3IoKTsKKyAgICBGdW5jdGlvbnNbInNpbiJdID0gbmV3IFNpbigpOworICAgIEZ1bmN0aW9uc1sic2luaCJdID0gbmV3IFNpbmgoKTsKKyAgICBGdW5jdGlvbnNbInN1bSJdID0gbmV3IFN1bSgpOworICAgIEZ1bmN0aW9uc1sic3VtaWYiXSA9IG5ldyBTdW1JZigpOworICAgIEZ1bmN0aW9uc1sic3VtaWZzIl0gPSBuZXcgU3VtSWZzKCk7CisgICAgRnVuY3Rpb25zWyJzdW1wcm9kdWN0Il0gPSBuZXcgU3VtUHJvZHVjdCgpOworICAgIEZ1bmN0aW9uc1sic3Vtc3EiXSA9IG5ldyBTdW1zcSgpOworICAgIEZ1bmN0aW9uc1sic3RkZXYiXSA9IG5ldyBTdGRldigpOworICAgIEZ1bmN0aW9uc1sic3RkZXZwIl0gPSBuZXcgU3RkZXZQKCk7CisgICAgRnVuY3Rpb25zWyJzdGRldi5zIl0gPSBuZXcgU3RkZXYoKTsKKyAgICBGdW5jdGlvbnNbInN0ZGV2LnAiXSA9IG5ldyBTdGRldlAoKTsKKyAgICBGdW5jdGlvbnNbInN1YnRvdGFsIl0gPSBuZXcgU3VidG90YWwoKTsKKyAgICBGdW5jdGlvbnNbImV4cCJdID0gbmV3IEV4cCgpOworICAgIEZ1bmN0aW9uc1sibG9nIl0gPSBuZXcgTG9nKCk7CisgICAgRnVuY3Rpb25zWyJsb2cxMCJdID0gbmV3IExvZzEwKCk7CisgICAgRnVuY3Rpb25zWyJsbiJdID0gbmV3IExuKCk7CisgICAgRnVuY3Rpb25zWyJtYXgiXSA9IG5ldyBNYXgoKTsKKyAgICBGdW5jdGlvbnNbIm1heGEiXSA9IG5ldyBNYXhhKCk7CisgICAgRnVuY3Rpb25zWyJtZWRpYW4iXSA9IG5ldyBNZWRpYW4oKTsKKyAgICBGdW5jdGlvbnNbIm1pbiJdID0gbmV3IE1pbigpOworICAgIEZ1bmN0aW9uc1sibWluYSJdID0gbmV3IE1pbmEoKTsKKyAgICBGdW5jdGlvbnNbIm1vZCJdID0gbmV3IE1vZCgpOworICAgIEZ1bmN0aW9uc1siYXZlcmFnZSJdID0gbmV3IEF2ZXJhZ2UoKTsKKyAgICBGdW5jdGlvbnNbImF2ZXJhZ2VhIl0gPSBuZXcgQXZlcmFnZUEoKTsKKyAgICBGdW5jdGlvbnNbImF2ZXJhZ2VpZiJdID0gbmV3IEF2ZXJhZ2VJZigpOworICAgIEZ1bmN0aW9uc1siYXZlcmFnZWlmcyJdID0gbmV3IEF2ZXJhZ2VJZnMoKTsKKyAgICBGdW5jdGlvbnNbInJvdW5kIl0gPSBuZXcgUm91bmQoKTsKKyAgICBGdW5jdGlvbnNbInJvdW5kZG93biJdID0gbmV3IFJvdW5kZG93bigpOworICAgIEZ1bmN0aW9uc1sicm91bmR1cCJdID0gbmV3IFJvdW5kdXAoKTsKKyAgICBGdW5jdGlvbnNbInJhbmQiXSA9IG5ldyBSYW5kKCk7CisgICAgRnVuY3Rpb25zWyJyYW5kYmV0d2VlbiJdID0gbmV3IFJhbmRCZXR3ZWVuKCk7CisgICAgRnVuY3Rpb25zWyJxdW90aWVudCJdID0gbmV3IFF1b3RpZW50KCk7CisgICAgRnVuY3Rpb25zWyJ0cnVuYyJdID0gbmV3IFRydW5jKCk7CisgICAgRnVuY3Rpb25zWyJ0YW4iXSA9IG5ldyBUYW4oKTsKKyAgICBGdW5jdGlvbnNbInRhbmgiXSA9IG5ldyBUYW5oKCk7CisgICAgRnVuY3Rpb25zWyJhdGFuIl0gPSBuZXcgQXRhbigpOworICAgIEZ1bmN0aW9uc1siYXRhbjIiXSA9IG5ldyBBdGFuMigpOworICAgIEZ1bmN0aW9uc1siYXRhbmgiXSA9IG5ldyBBdGFuaCgpOworICAgIEZ1bmN0aW9uc1siYWNvcyJdID0gbmV3IEFjb3MoKTsKKyAgICBGdW5jdGlvbnNbImFjb3NoIl0gPSBuZXcgQWNvc2goKTsKKyAgICBGdW5jdGlvbnNbInZhciJdID0gbmV3IFZhcigpOworICAgIEZ1bmN0aW9uc1sidmFycCJdID0gbmV3IFZhclAoKTsKKyAgICBGdW5jdGlvbnNbImxhcmdlIl0gPSBuZXcgTGFyZ2UoKTsKKyAgICBGdW5jdGlvbnNbInNtYWxsIl0gPSBuZXcgU21hbGwoKTsKKyAgICBGdW5jdGlvbnNbImRlZ3JlZXMiXSA9IG5ldyBEZWdyZWVzKCk7CisgICAgLy8gSW5mb3JtYXRpb24KKyAgICBGdW5jdGlvbnNbImlzYmxhbmsiXSA9IG5ldyBJc0JsYW5rKCk7CisgICAgRnVuY3Rpb25zWyJpc251bWJlciJdID0gbmV3IElzTnVtYmVyKCk7CisgICAgRnVuY3Rpb25zWyJpc3RleHQiXSA9IG5ldyBJc1RleHQoKTsKKyAgICBGdW5jdGlvbnNbImlzbm9udGV4dCJdID0gbmV3IElzTm9uVGV4dCgpOworICAgIEZ1bmN0aW9uc1siaXNlcnJvciJdID0gbmV3IElzRXJyb3IoKTsKKyAgICBGdW5jdGlvbnNbImlzZXJyIl0gPSBuZXcgSXNFcnIoKTsKKyAgICBGdW5jdGlvbnNbImVycm9yLnR5cGUiXSA9IG5ldyBFcnJvclR5cGUoKTsKKyAgICBGdW5jdGlvbnNbImlzZXZlbiJdID0gbmV3IElzRXZlbigpOworICAgIEZ1bmN0aW9uc1siaXNvZGQiXSA9IG5ldyBJc09kZCgpOworICAgIEZ1bmN0aW9uc1siaXNsb2dpY2FsIl0gPSBuZXcgSXNMb2dpY2FsKCk7CisgICAgRnVuY3Rpb25zWyJpc25hIl0gPSBuZXcgSXNOYSgpOworICAgIEZ1bmN0aW9uc1sibmEiXSA9IG5ldyBOYSgpOworICAgIEZ1bmN0aW9uc1sibiJdID0gbmV3IE4oKTsKKyAgICAvLyBMb2dpY2FsCisgICAgRnVuY3Rpb25zWyJpZiJdID0gbmV3IElmKCk7CisgICAgRnVuY3Rpb25zWyJpZmVycm9yIl0gPSBuZXcgSWZFcnJvcigpOworICAgIEZ1bmN0aW9uc1siaWZuYSJdID0gbmV3IElmTmEoKTsKKyAgICBGdW5jdGlvbnNbIm5vdCJdID0gbmV3IE5vdCgpOworICAgIEZ1bmN0aW9uc1siYW5kIl0gPSBuZXcgQW5kKCk7CisgICAgRnVuY3Rpb25zWyJvciJdID0gbmV3IE9yKCk7CisgICAgRnVuY3Rpb25zWyJ0cnVlIl0gPSBuZXcgVHJ1ZSgpOworICAgIEZ1bmN0aW9uc1siZmFsc2UiXSA9IG5ldyBGYWxzZSgpOworICAgIC8vIFJlZmVyZW5jZSBhbmQgbG9va3VwCisgICAgRnVuY3Rpb25zWyJhZGRyZXNzIl0gPSBuZXcgQWRkcmVzcygpOworICAgIEZ1bmN0aW9uc1siaGxvb2t1cCJdID0gbmV3IEhMb29rdXAoKTsKKyAgICBGdW5jdGlvbnNbInZsb29rdXAiXSA9IG5ldyBWTG9va3VwKCk7CisgICAgRnVuY3Rpb25zWyJsb29rdXAiXSA9IG5ldyBMb29rdXAoKTsKKyAgICBGdW5jdGlvbnNbIm1hdGNoIl0gPSBuZXcgTWF0Y2goKTsKKyAgICBGdW5jdGlvbnNbInJvdyJdID0gbmV3IFJvdyB7CisgICAgICBTa2lwQXJndW1lbnRFdmFsdWF0aW9uID0gdHJ1ZSwKKyAgICB9OworICAgIEZ1bmN0aW9uc1sicm93cyJdID0gbmV3IFJvd3MgeworICAgICAgU2tpcEFyZ3VtZW50RXZhbHVhdGlvbiA9IHRydWUsCisgICAgfTsKKyAgICBGdW5jdGlvbnNbImNvbHVtbiJdID0gbmV3IENvbHVtbiB7CisgICAgICBTa2lwQXJndW1lbnRFdmFsdWF0aW9uID0gdHJ1ZSwKKyAgICB9OworICAgIEZ1bmN0aW9uc1siY29sdW1ucyJdID0gbmV3IENvbHVtbnMgeworICAgICAgU2tpcEFyZ3VtZW50RXZhbHVhdGlvbiA9IHRydWUsCisgICAgfTsKKyAgICBGdW5jdGlvbnNbImNob29zZSJdID0gbmV3IENob29zZSgpOworICAgIEZ1bmN0aW9uc1siaW5kZXgiXSA9IG5ldyBJbmRleCgpOworICAgIEZ1bmN0aW9uc1siaW5kaXJlY3QiXSA9IG5ldyBJbmRpcmVjdCgpOworICAgIEZ1bmN0aW9uc1sib2Zmc2V0Il0gPSBuZXcgT2Zmc2V0IHsKKyAgICAgIFNraXBBcmd1bWVudEV2YWx1YXRpb24gPSB0cnVlLAorICAgIH07CisgICAgLy8gRGF0ZQorICAgIEZ1bmN0aW9uc1siZGF0ZSJdID0gbmV3IERhdGUoKTsKKyAgICBGdW5jdGlvbnNbInRvZGF5Il0gPSBuZXcgVG9kYXkoKTsKKyAgICBGdW5jdGlvbnNbIm5vdyJdID0gbmV3IE5vdygpOworICAgIEZ1bmN0aW9uc1siZGF5Il0gPSBuZXcgRGF5KCk7CisgICAgRnVuY3Rpb25zWyJtb250aCJdID0gbmV3IE1vbnRoKCk7CisgICAgRnVuY3Rpb25zWyJ5ZWFyIl0gPSBuZXcgWWVhcigpOworICAgIEZ1bmN0aW9uc1sidGltZSJdID0gbmV3IFRpbWUoKTsKKyAgICBGdW5jdGlvbnNbImhvdXIiXSA9IG5ldyBIb3VyKCk7CisgICAgRnVuY3Rpb25zWyJtaW51dGUiXSA9IG5ldyBNaW51dGUoKTsKKyAgICBGdW5jdGlvbnNbInNlY29uZCJdID0gbmV3IFNlY29uZCgpOworICAgIEZ1bmN0aW9uc1sid2Vla251bSJdID0gbmV3IFdlZWtudW0oKTsKKyAgICBGdW5jdGlvbnNbIndlZWtkYXkiXSA9IG5ldyBXZWVrZGF5KCk7CisgICAgRnVuY3Rpb25zWyJkYXlzMzYwIl0gPSBuZXcgRGF5czM2MCgpOworICAgIEZ1bmN0aW9uc1sieWVhcmZyYWMiXSA9IG5ldyBZZWFyZnJhYygpOworICAgIEZ1bmN0aW9uc1siZWRhdGUiXSA9IG5ldyBFZGF0ZSgpOworICAgIEZ1bmN0aW9uc1siZW9tb250aCJdID0gbmV3IEVvbW9udGgoKTsKKyAgICBGdW5jdGlvbnNbImlzb3dlZWtudW0iXSA9IG5ldyBJc29XZWVrTnVtKCk7CisgICAgRnVuY3Rpb25zWyJ3b3JrZGF5Il0gPSBuZXcgV29ya2RheSgpOworICAgIC8vIERhdGFiYXNlCisgICAgRnVuY3Rpb25zWyJkZ2V0Il0gPSBuZXcgRGdldCgpOworICAgIEZ1bmN0aW9uc1siZGNvdW50Il0gPSBuZXcgRGNvdW50KCk7CisgICAgRnVuY3Rpb25zWyJkY291bnRhIl0gPSBuZXcgRGNvdW50QSgpOworICAgIEZ1bmN0aW9uc1siZG1heCJdID0gbmV3IERtYXgoKTsKKyAgICBGdW5jdGlvbnNbImRtaW4iXSA9IG5ldyBEbWluKCk7CisgICAgRnVuY3Rpb25zWyJkc3VtIl0gPSBuZXcgRHN1bSgpOworICAgIEZ1bmN0aW9uc1siZGF2ZXJhZ2UiXSA9IG5ldyBEYXZlcmFnZSgpOworICAgIEZ1bmN0aW9uc1siZHZhciJdID0gbmV3IER2YXIoKTsKKyAgICBGdW5jdGlvbnNbImR2YXJwIl0gPSBuZXcgRHZhcnAoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9DZWxsU3RhdGVIZWxwZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0NlbGxTdGF0ZUhlbHBlci5jcwppbmRleCAxYWYyMGNhLi5lNDYxOTE5IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0NlbGxTdGF0ZUhlbHBlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0NlbGxTdGF0ZUhlbHBlci5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKQEAgLTcsNDYgKzcsNTEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucwotewotICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBDZWxsU3RhdGVIZWxwZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgSXNTdWJUb3RhbChFeGNlbERhdGFQcm92aWRlci5JQ2VsbEluZm8gYykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHRva2VucyA9IGMuVG9rZW5zOwotICAgICAgICAgICAgaWYgKHRva2VucyA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gYy5Ub2tlbnMuQW55KHRva2VuID0+IAotICAgICAgICAgICAgICAgIHRva2VuLlRva2VuVHlwZSA9PSBMZXhpY2FsQW5hbHlzaXMuVG9rZW5UeXBlLkZ1bmN0aW9uIAotICAgICAgICAgICAgICAgICYmIHRva2VuLlZhbHVlLkVxdWFscygiU1VCVE9UQUwiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKIAotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBTaG91bGRJZ25vcmUoYm9vbCBpZ25vcmVIaWRkZW5WYWx1ZXMsIEV4Y2VsRGF0YVByb3ZpZGVyLklDZWxsSW5mbyBjLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKGlnbm9yZUhpZGRlblZhbHVlcyAmJiBjLklzSGlkZGVuUm93KSB8fCAoY29udGV4dC5TY29wZXMuQ3VycmVudC5Jc1N1YnRvdGFsICYmIElzU3ViVG90YWwoYykpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJvb2wgU2hvdWxkSWdub3JlKGJvb2wgaWdub3JlSGlkZGVuVmFsdWVzLCBGdW5jdGlvbkFyZ3VtZW50IGFyZywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChpZ25vcmVIaWRkZW5WYWx1ZXMgJiYgYXJnLkV4Y2VsU3RhdGVGbGFnSXNTZXQoRXhjZWxDZWxsU3RhdGUuSGlkZGVuQ2VsbCkpOwotICAgICAgICB9CitpbnRlcm5hbCBzdGF0aWMgY2xhc3MgQ2VsbFN0YXRlSGVscGVyIHsKKyAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBJc1N1YlRvdGFsKEV4Y2VsRGF0YVByb3ZpZGVyLklDZWxsSW5mbyBjKSB7CisgICAgdmFyIHRva2VucyA9IGMuVG9rZW5zOworICAgIGlmICh0b2tlbnMgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICByZXR1cm4gYy5Ub2tlbnMuQW55KHRva2VuID0+CisgICAgICAgIHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuRnVuY3Rpb24KKyAgICAgICAgICAgICYmIHRva2VuLlZhbHVlLkVxdWFscygiU1VCVE9UQUwiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSk7CisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBTaG91bGRJZ25vcmUoCisgICAgICBib29sIGlnbm9yZUhpZGRlblZhbHVlcywKKyAgICAgIEV4Y2VsRGF0YVByb3ZpZGVyLklDZWxsSW5mbyBjLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHJldHVybiAoaWdub3JlSGlkZGVuVmFsdWVzICYmIGMuSXNIaWRkZW5Sb3cpCisgICAgICAgIHx8IChjb250ZXh0LlNjb3Blcy5DdXJyZW50LklzU3VidG90YWwgJiYgSXNTdWJUb3RhbChjKSk7CisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBTaG91bGRJZ25vcmUoCisgICAgICBib29sIGlnbm9yZUhpZGRlblZhbHVlcywKKyAgICAgIEZ1bmN0aW9uQXJndW1lbnQgYXJnLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHJldHVybiAoaWdub3JlSGlkZGVuVmFsdWVzICYmIGFyZy5FeGNlbFN0YXRlRmxhZ0lzU2V0KEV4Y2VsQ2VsbFN0YXRlLkhpZGRlbkNlbGwpKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Db2xsZWN0aW9uRmxhdHRlbmVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Db2xsZWN0aW9uRmxhdHRlbmVyLmNzCmluZGV4IGMxM2Q3NTkuLjA0ZWVhYjMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQ29sbGVjdGlvbkZsYXR0ZW5lci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0NvbGxlY3Rpb25GbGF0dGVuZXIuY3MKQEAgLTcsNTAgKzcsNDYgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCi17Ci0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25GbGF0dGVuZXI8VD4KLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIElFbnVtZXJhYmxlPFQ+IEZ1bmNBcmdzVG9GbGF0RW51bWVyYWJsZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIEFjdGlvbjxGdW5jdGlvbkFyZ3VtZW50LCBJTGlzdDxUPj4gY29udmVydEZ1bmMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhcmdMaXN0ID0gbmV3IExpc3Q8VD4oKTsKLSAgICAgICAgICAgIEZ1bmNBcmdzVG9GbGF0RW51bWVyYWJsZShhcmd1bWVudHMsIGFyZ0xpc3QsIGNvbnZlcnRGdW5jKTsKLSAgICAgICAgICAgIHJldHVybiBhcmdMaXN0OwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIEZ1bmNBcmdzVG9GbGF0RW51bWVyYWJsZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIExpc3Q8VD4gYXJnTGlzdCwgQWN0aW9uPEZ1bmN0aW9uQXJndW1lbnQsIElMaXN0PFQ+PiBjb252ZXJ0RnVuYykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiBhcmd1bWVudHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZ1bmNBcmdzVG9GbGF0RW51bWVyYWJsZSgoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pYXJnLlZhbHVlLCBhcmdMaXN0LCBjb252ZXJ0RnVuYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRGdW5jKGFyZywgYXJnTGlzdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvbkZsYXR0ZW5lcjxUPiB7CisgIHB1YmxpYyB2aXJ0dWFsIElFbnVtZXJhYmxlPFQ+IEZ1bmNBcmdzVG9GbGF0RW51bWVyYWJsZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIEFjdGlvbjxGdW5jdGlvbkFyZ3VtZW50LCBJTGlzdDxUPj4gY29udmVydEZ1bmMpIHsKKyAgICB2YXIgYXJnTGlzdCA9IG5ldyBMaXN0PFQ+KCk7CisgICAgRnVuY0FyZ3NUb0ZsYXRFbnVtZXJhYmxlKGFyZ3VtZW50cywgYXJnTGlzdCwgY29udmVydEZ1bmMpOworICAgIHJldHVybiBhcmdMaXN0OworICB9CisKKyAgcHJpdmF0ZSB2b2lkIEZ1bmNBcmdzVG9GbGF0RW51bWVyYWJsZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIExpc3Q8VD4gYXJnTGlzdCwKKyAgICAgIEFjdGlvbjxGdW5jdGlvbkFyZ3VtZW50LCBJTGlzdDxUPj4gY29udmVydEZ1bmMpIHsKKyAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykgeworICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PikgeworICAgICAgICBGdW5jQXJnc1RvRmxhdEVudW1lcmFibGUoKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KWFyZy5WYWx1ZSwgYXJnTGlzdCwgY29udmVydEZ1bmMpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udmVydEZ1bmMoYXJnLCBhcmdMaXN0KTsKKyAgICAgIH0KICAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQ29tcGlsZVJlc3VsdFZhbGlkYXRvci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQ29tcGlsZVJlc3VsdFZhbGlkYXRvci5jcwppbmRleCAyNTgyZjgwLi5lOTM2Nzk4IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0NvbXBpbGVSZXN1bHRWYWxpZGF0b3IuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Db21waWxlUmVzdWx0VmFsaWRhdG9yLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpAQCAtNyw0MCArNywzNSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTI2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCi17Ci0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBpbGVSZXN1bHRWYWxpZGF0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIFZhbGlkYXRlKG9iamVjdCBvYmopOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwogCi0gICAgICAgIHByaXZhdGUgc3RhdGljIENvbXBpbGVSZXN1bHRWYWxpZGF0b3IgX2VtcHR5OwotICAgICAgICBwdWJsaWMgc3RhdGljIENvbXBpbGVSZXN1bHRWYWxpZGF0b3IgRW1wdHkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9lbXB0eSA/PyAoX2VtcHR5ID0gbmV3IEVtcHR5Q29tcGlsZVJlc3VsdFZhbGlkYXRvcigpKTsgfQotICAgICAgICB9Ci0gICAgfQorcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBpbGVSZXN1bHRWYWxpZGF0b3IgeworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBWYWxpZGF0ZShvYmplY3Qgb2JqKTsKIAotICAgIGludGVybmFsIGNsYXNzIEVtcHR5Q29tcGlsZVJlc3VsdFZhbGlkYXRvciA6IENvbXBpbGVSZXN1bHRWYWxpZGF0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFZhbGlkYXRlKG9iamVjdCBvYmopCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGVtcHR5IHZhbGlkYXRvciAtIGRvIG5vdGhpbmcKLSAgICAgICAgfQotICAgIH0KKyAgcHJpdmF0ZSBzdGF0aWMgQ29tcGlsZVJlc3VsdFZhbGlkYXRvciBfZW1wdHk7CisKKyAgcHVibGljIHN0YXRpYyBDb21waWxlUmVzdWx0VmFsaWRhdG9yIEVtcHR5ID0+CisgICAgX2VtcHR5ID8/IChfZW1wdHkgPSBuZXcgRW1wdHlDb21waWxlUmVzdWx0VmFsaWRhdG9yKCkpOworfQorCitpbnRlcm5hbCBjbGFzcyBFbXB0eUNvbXBpbGVSZXN1bHRWYWxpZGF0b3IgOiBDb21waWxlUmVzdWx0VmFsaWRhdG9yIHsKKyAgcHVibGljIG92ZXJyaWRlIHZvaWQgVmFsaWRhdGUob2JqZWN0IG9iaikgeworICAgIC8vIGVtcHR5IHZhbGlkYXRvciAtIGRvIG5vdGhpbmcKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Db21waWxlUmVzdWx0VmFsaWRhdG9ycy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvQ29tcGlsZVJlc3VsdFZhbGlkYXRvcnMuY3MKaW5kZXggODJkY2NiZi4uNDBmNzRjNSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Db21waWxlUmVzdWx0VmFsaWRhdG9ycy5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0NvbXBpbGVSZXN1bHRWYWxpZGF0b3JzLmNzCkBAIC03LDQ5ICs3LDQxIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMjYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCi17Ci0gICAgcHVibGljIGNsYXNzIENvbXBpbGVSZXN1bHRWYWxpZGF0b3JzCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8RGF0YVR5cGUsIENvbXBpbGVSZXN1bHRWYWxpZGF0b3I+IF92YWxpZGF0b3JzID0gbmV3IERpY3Rpb25hcnk8RGF0YVR5cGUsIENvbXBpbGVSZXN1bHRWYWxpZGF0b3I+KCk7IAorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwogCi0gICAgICAgIHByaXZhdGUgQ29tcGlsZVJlc3VsdFZhbGlkYXRvciBDcmVhdGVPckdldChEYXRhVHlwZSBkYXRhVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF92YWxpZGF0b3JzLkNvbnRhaW5zS2V5KGRhdGFUeXBlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3ZhbGlkYXRvcnNbZGF0YVR5cGVdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRhdGFUeXBlID09IERhdGFUeXBlLkRlY2ltYWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF92YWxpZGF0b3JzW0RhdGFUeXBlLkRlY2ltYWxdID0gbmV3IERlY2ltYWxDb21waWxlUmVzdWx0VmFsaWRhdG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ29tcGlsZVJlc3VsdFZhbGlkYXRvci5FbXB0eTsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIENvbXBpbGVSZXN1bHRWYWxpZGF0b3JzIHsKKyAgcHJpdmF0ZSByZWFkb25seSBEaWN0aW9uYXJ5PERhdGFUeXBlLCBDb21waWxlUmVzdWx0VmFsaWRhdG9yPiBfdmFsaWRhdG9ycyA9IG5ldygpOwogCi0gICAgICAgIHB1YmxpYyBDb21waWxlUmVzdWx0VmFsaWRhdG9yIEdldFZhbGlkYXRvcihEYXRhVHlwZSBkYXRhVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZU9yR2V0KGRhdGFUeXBlKTsKLSAgICAgICAgfQorICBwcml2YXRlIENvbXBpbGVSZXN1bHRWYWxpZGF0b3IgQ3JlYXRlT3JHZXQoRGF0YVR5cGUgZGF0YVR5cGUpIHsKKyAgICBpZiAoX3ZhbGlkYXRvcnMuQ29udGFpbnNLZXkoZGF0YVR5cGUpKSB7CisgICAgICByZXR1cm4gX3ZhbGlkYXRvcnNbZGF0YVR5cGVdOwogICAgIH0KKyAgICBpZiAoZGF0YVR5cGUgPT0gRGF0YVR5cGUuRGVjaW1hbCkgeworICAgICAgcmV0dXJuIF92YWxpZGF0b3JzW0RhdGFUeXBlLkRlY2ltYWxdID0gbmV3IERlY2ltYWxDb21waWxlUmVzdWx0VmFsaWRhdG9yKCk7CisgICAgfQorICAgIHJldHVybiBDb21waWxlUmVzdWx0VmFsaWRhdG9yLkVtcHR5OworICB9CisKKyAgcHVibGljIENvbXBpbGVSZXN1bHRWYWxpZGF0b3IgR2V0VmFsaWRhdG9yKERhdGFUeXBlIGRhdGFUeXBlKSB7CisgICAgcmV0dXJuIENyZWF0ZU9yR2V0KGRhdGFUeXBlKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EU3VtLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EU3VtLmNzCmluZGV4IGY2MDQyNTMuLjU1MjI1MzkgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRFN1bS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RTdW0uY3MKQEAgLTcsNDggKzcsNDMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wNC0xOQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKLXsKLSAgICBwdWJsaWMgY2xhc3MgRHN1bSA6IERhdGFiYXNlRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBEc3VtKCkKLSAgICAgICAgICAgIDogdGhpcyhuZXcgUm93TWF0Y2hlcigpKQotICAgICAgICB7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2U7CiAKLSAgICAgICAgfQorcHVibGljIGNsYXNzIERzdW0gOiBEYXRhYmFzZUZ1bmN0aW9uIHsKKyAgcHVibGljIERzdW0oKQorICAgICAgOiB0aGlzKG5ldygpKSB7fQogCi0gICAgICAgIHB1YmxpYyBEc3VtKFJvd01hdGNoZXIgcm93TWF0Y2hlcikKLSAgICAgICAgICAgIDogYmFzZShyb3dNYXRjaGVyKQotICAgICAgICB7CisgIHB1YmxpYyBEc3VtKFJvd01hdGNoZXIgcm93TWF0Y2hlcikKKyAgICAgIDogYmFzZShyb3dNYXRjaGVyKSB7fQogCi0gICAgICAgIH0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7Ci0gICAgICAgICAgICB2YXIgdmFsdWVzID0gR2V0TWF0Y2hpbmdWYWx1ZXMoYXJndW1lbnRzLCBjb250ZXh0KTsKLSAgICAgICAgICAgIGlmICghdmFsdWVzLkFueSgpKSByZXR1cm4gQ3JlYXRlUmVzdWx0KDBkLCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodmFsdWVzLlN1bSgpLCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgfQorICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7CisgICAgdmFyIHZhbHVlcyA9IEdldE1hdGNoaW5nVmFsdWVzKGFyZ3VtZW50cywgY29udGV4dCk7CisgICAgaWYgKCF2YWx1ZXMuQW55KCkpIHsKKyAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoMGQsIERhdGFUeXBlLkludGVnZXIpOwogICAgIH0KKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbHVlcy5TdW0oKSwgRGF0YVR5cGUuSW50ZWdlcik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRGF0YWJhc2VGdW5jdGlvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRGF0YWJhc2VGdW5jdGlvbi5jcwppbmRleCA4ZTc0NjM1Li5mNjg2ZjhlIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RhdGFiYXNlRnVuY3Rpb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EYXRhYmFzZUZ1bmN0aW9uLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpAQCAtNyw2NyArNyw2MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTE5CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKLXsKLSAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YWJhc2VGdW5jdGlvbiA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBSb3dNYXRjaGVyIFJvd01hdGNoZXIgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2U7CiAKLSAgICAgICAgcHVibGljIERhdGFiYXNlRnVuY3Rpb24oKQotICAgICAgICAgICAgOiB0aGlzKG5ldyBSb3dNYXRjaGVyKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIAotICAgICAgICB9CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YWJhc2VGdW5jdGlvbiA6IEV4Y2VsRnVuY3Rpb24geworICBwcm90ZWN0ZWQgUm93TWF0Y2hlciBSb3dNYXRjaGVyIHsgZ2V0OyBwcml2YXRlIHNldDsgfQogCi0gICAgICAgIHB1YmxpYyBEYXRhYmFzZUZ1bmN0aW9uKFJvd01hdGNoZXIgcm93TWF0Y2hlcikKLSAgICAgICAgewotICAgICAgICAgICAgUm93TWF0Y2hlciA9IHJvd01hdGNoZXI7Ci0gICAgICAgIH0KKyAgcHVibGljIERhdGFiYXNlRnVuY3Rpb24oKQorICAgICAgOiB0aGlzKG5ldygpKSB7fQogCi0gICAgICAgIHByb3RlY3RlZCBJRW51bWVyYWJsZTxkb3VibGU+IEdldE1hdGNoaW5nVmFsdWVzKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGRiQWRkcmVzcyA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWVBc1JhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3M7Ci0gICAgICAgICAgICAvL3ZhciBmaWVsZCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgIHZhciBmaWVsZCA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMSkuVmFsdWU7Ci0gICAgICAgICAgICB2YXIgY3JpdGVyaWFSYW5nZSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMikuVmFsdWVBc1JhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3M7CisgIHB1YmxpYyBEYXRhYmFzZUZ1bmN0aW9uKFJvd01hdGNoZXIgcm93TWF0Y2hlcikgeworICAgIFJvd01hdGNoZXIgPSByb3dNYXRjaGVyOworICB9CiAKLSAgICAgICAgICAgIHZhciBkYiA9IG5ldyBFeGNlbERhdGFiYXNlKGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIsIGRiQWRkcmVzcyk7Ci0gICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhKGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIsIGNyaXRlcmlhUmFuZ2UpOwotICAgICAgICAgICAgdmFyIHZhbHVlcyA9IG5ldyBMaXN0PGRvdWJsZT4oKTsKKyAgcHJvdGVjdGVkIElFbnVtZXJhYmxlPGRvdWJsZT4gR2V0TWF0Y2hpbmdWYWx1ZXMoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgdmFyIGRiQWRkcmVzcyA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWVBc1JhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3M7CisgICAgLy92YXIgZmllbGQgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgdmFyIGZpZWxkID0gYXJndW1lbnRzLkVsZW1lbnRBdCgxKS5WYWx1ZTsKKyAgICB2YXIgY3JpdGVyaWFSYW5nZSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMikuVmFsdWVBc1JhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3M7CiAKLSAgICAgICAgICAgIHdoaWxlIChkYi5IYXNNb3JlUm93cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZGF0YVJvdyA9IGRiLlJlYWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIVJvd01hdGNoZXIuSXNNYXRjaChkYXRhUm93LCBjcml0ZXJpYSkpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIHZhciBjYW5kaWRhdGUgPSBDb252ZXJ0VXRpbC5Jc051bWVyaWMoZmllbGQpID8gZGF0YVJvd1soaW50KUNvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGZpZWxkKV0gOiBkYXRhUm93W2ZpZWxkLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKV07Ci0gICAgICAgICAgICAgICAgaWYgKENvbnZlcnRVdGlsLklzTnVtZXJpYyhjYW5kaWRhdGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzLkFkZChDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShjYW5kaWRhdGUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWVzOwotICAgICAgICB9CisgICAgdmFyIGRiID0gbmV3IEV4Y2VsRGF0YWJhc2UoY29udGV4dC5FeGNlbERhdGFQcm92aWRlciwgZGJBZGRyZXNzKTsKKyAgICB2YXIgY3JpdGVyaWEgPSBuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhKGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIsIGNyaXRlcmlhUmFuZ2UpOworICAgIHZhciB2YWx1ZXMgPSBuZXcgTGlzdDxkb3VibGU+KCk7CisKKyAgICB3aGlsZSAoZGIuSGFzTW9yZVJvd3MpIHsKKyAgICAgIHZhciBkYXRhUm93ID0gZGIuUmVhZCgpOworICAgICAgaWYgKCFSb3dNYXRjaGVyLklzTWF0Y2goZGF0YVJvdywgY3JpdGVyaWEpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdmFyIGNhbmRpZGF0ZSA9IENvbnZlcnRVdGlsLklzTnVtZXJpYyhmaWVsZCkKKyAgICAgICAgICA/IGRhdGFSb3dbKGludClDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShmaWVsZCldCisgICAgICAgICAgOiBkYXRhUm93W2ZpZWxkLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKV07CisgICAgICBpZiAoQ29udmVydFV0aWwuSXNOdW1lcmljKGNhbmRpZGF0ZSkpIHsKKyAgICAgICAgdmFsdWVzLkFkZChDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShjYW5kaWRhdGUpKTsKKyAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIHZhbHVlczsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EYXZlcmFnZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRGF2ZXJhZ2UuY3MKaW5kZXggYTMyZGU2Yy4uMjFhODkwYSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EYXZlcmFnZS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RhdmVyYWdlLmNzCkBAIC03LDQ4ICs3LDQzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDQtMTkKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlCi17Ci0gICAgcHVibGljIGNsYXNzIERhdmVyYWdlIDogRGF0YWJhc2VGdW5jdGlvbgotICAgIHsKLSAgICAgICAgIHB1YmxpYyBEYXZlcmFnZSgpCi0gICAgICAgICAgICA6IHRoaXMobmV3IFJvd01hdGNoZXIoKSkKLSAgICAgICAgeworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlOwogCi0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBEYXZlcmFnZSA6IERhdGFiYXNlRnVuY3Rpb24geworICBwdWJsaWMgRGF2ZXJhZ2UoKQorICAgICAgOiB0aGlzKG5ldygpKSB7fQogCi0gICAgICAgICBwdWJsaWMgRGF2ZXJhZ2UoUm93TWF0Y2hlciByb3dNYXRjaGVyKQotICAgICAgICAgICAgOiBiYXNlKHJvd01hdGNoZXIpCi0gICAgICAgIHsKKyAgcHVibGljIERhdmVyYWdlKFJvd01hdGNoZXIgcm93TWF0Y2hlcikKKyAgICAgIDogYmFzZShyb3dNYXRjaGVyKSB7fQogCi0gICAgICAgIH0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7Ci0gICAgICAgICAgICB2YXIgdmFsdWVzID0gR2V0TWF0Y2hpbmdWYWx1ZXMoYXJndW1lbnRzLCBjb250ZXh0KTsKLSAgICAgICAgICAgIGlmICghdmFsdWVzLkFueSgpKSByZXR1cm4gQ3JlYXRlUmVzdWx0KDBkLCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodmFsdWVzLkF2ZXJhZ2UoKSwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDMpOworICAgIHZhciB2YWx1ZXMgPSBHZXRNYXRjaGluZ1ZhbHVlcyhhcmd1bWVudHMsIGNvbnRleHQpOworICAgIGlmICghdmFsdWVzLkFueSgpKSB7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KDBkLCBEYXRhVHlwZS5JbnRlZ2VyKTsKICAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWx1ZXMuQXZlcmFnZSgpLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EY291bnQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0Rjb3VudC5jcwppbmRleCBhMzU0YWY0Li4yYWQzMWZhIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0Rjb3VudC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0Rjb3VudC5jcwpAQCAtNyw4OCArNyw3MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTA2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZQotewotICAgIHB1YmxpYyBjbGFzcyBEY291bnQgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJvd01hdGNoZXIgX3Jvd01hdGNoZXI7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2U7CiAKLSAgICAgICAgcHVibGljIERjb3VudCgpCi0gICAgICAgICAgICA6IHRoaXMobmV3IFJvd01hdGNoZXIoKSkKLSAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBEY291bnQgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHJpdmF0ZSByZWFkb25seSBSb3dNYXRjaGVyIF9yb3dNYXRjaGVyOwogCi0gICAgICAgIHB1YmxpYyBEY291bnQoUm93TWF0Y2hlciByb3dNYXRjaGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcm93TWF0Y2hlciA9IHJvd01hdGNoZXI7Ci0gICAgICAgIH0KKyAgcHVibGljIERjb3VudCgpCisgICAgICA6IHRoaXMobmV3KCkpIHt9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgZGJBZGRyZXNzID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKLSAgICAgICAgICAgIHN0cmluZyBmaWVsZCA9IG51bGw7Ci0gICAgICAgICAgICBzdHJpbmcgY3JpdGVyaWFSYW5nZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPT0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcml0ZXJpYVJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgxKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgICAgICBjcml0ZXJpYVJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICB2YXIgZGIgPSBuZXcgRXhjZWxEYXRhYmFzZShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLCBkYkFkZHJlc3MpOwotICAgICAgICAgICAgdmFyIGNyaXRlcmlhID0gbmV3IEV4Y2VsRGF0YWJhc2VDcml0ZXJpYShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLCBjcml0ZXJpYVJhbmdlKTsKKyAgcHVibGljIERjb3VudChSb3dNYXRjaGVyIHJvd01hdGNoZXIpIHsKKyAgICBfcm93TWF0Y2hlciA9IHJvd01hdGNoZXI7CisgIH0KIAotICAgICAgICAgICAgdmFyIG5IaXRzID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChkYi5IYXNNb3JlUm93cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZGF0YVJvdyA9IGRiLlJlYWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoX3Jvd01hdGNoZXIuSXNNYXRjaChkYXRhUm93LCBjcml0ZXJpYSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIGZpZWxkbmFtZSBpcyBzdXBwbGllZCwgY291bnQgb25seSB0aGlzIHJvdyBpZiB0aGUgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHN1cHBsaWVkIGZpZWxkIGlzIG51bWVyaWMuCi0gICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZmllbGQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FuZGlkYXRlID0gZGF0YVJvd1tmaWVsZF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29udmVydFV0aWwuSXNOdW1lcmljKGNhbmRpZGF0ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbkhpdHMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGZpZWxkbmFtZSB3YXMgc3VwcGxpZWQsIGFsd2F5cyBjb3VudCBtYXRjaGluZyByb3cuCi0gICAgICAgICAgICAgICAgICAgICAgICBuSGl0cysrOyAgICAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQobkhpdHMsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICB2YXIgZGJBZGRyZXNzID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKKyAgICBzdHJpbmcgZmllbGQgPSBudWxsOworICAgIHN0cmluZyBjcml0ZXJpYVJhbmdlID0gbnVsbDsKKyAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPT0gMikgeworICAgICAgY3JpdGVyaWFSYW5nZSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMSkuVmFsdWVBc1JhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3M7CisgICAgfSBlbHNlIHsKKyAgICAgIGZpZWxkID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgY3JpdGVyaWFSYW5nZSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMikuVmFsdWVBc1JhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3M7CiAgICAgfQorICAgIHZhciBkYiA9IG5ldyBFeGNlbERhdGFiYXNlKGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIsIGRiQWRkcmVzcyk7CisgICAgdmFyIGNyaXRlcmlhID0gbmV3IEV4Y2VsRGF0YWJhc2VDcml0ZXJpYShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLCBjcml0ZXJpYVJhbmdlKTsKKworICAgIHZhciBuSGl0cyA9IDA7CisgICAgd2hpbGUgKGRiLkhhc01vcmVSb3dzKSB7CisgICAgICB2YXIgZGF0YVJvdyA9IGRiLlJlYWQoKTsKKyAgICAgIGlmIChfcm93TWF0Y2hlci5Jc01hdGNoKGRhdGFSb3csIGNyaXRlcmlhKSkgeworICAgICAgICAvLyBpZiBhIGZpZWxkbmFtZSBpcyBzdXBwbGllZCwgY291bnQgb25seSB0aGlzIHJvdyBpZiB0aGUgdmFsdWUKKyAgICAgICAgLy8gb2YgdGhlIHN1cHBsaWVkIGZpZWxkIGlzIG51bWVyaWMuCisgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZmllbGQpKSB7CisgICAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IGRhdGFSb3dbZmllbGRdOworICAgICAgICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWMoY2FuZGlkYXRlKSkgeworICAgICAgICAgICAgbkhpdHMrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gbm8gZmllbGRuYW1lIHdhcyBzdXBwbGllZCwgYWx3YXlzIGNvdW50IG1hdGNoaW5nIHJvdy4KKyAgICAgICAgICBuSGl0cysrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQobkhpdHMsIERhdGFUeXBlLkludGVnZXIpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0Rjb3VudEEuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0Rjb3VudEEuY3MKaW5kZXggYjkwYTViNS4uMDMxNjk1MCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EY291bnRBLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRGNvdW50QS5jcwpAQCAtNyw5NCArNyw3NiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTA2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZQotewotICAgIHB1YmxpYyBjbGFzcyBEY291bnRBIDogRGF0YWJhc2VGdW5jdGlvbgotICAgIHsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZTsKIAotICAgICAgICBwdWJsaWMgRGNvdW50QSgpCi0gICAgICAgICAgICA6IHRoaXMobmV3IFJvd01hdGNoZXIoKSkKLSAgICAgICAgeworcHVibGljIGNsYXNzIERjb3VudEEgOiBEYXRhYmFzZUZ1bmN0aW9uIHsKKyAgcHVibGljIERjb3VudEEoKQorICAgICAgOiB0aGlzKG5ldygpKSB7fQogCi0gICAgICAgIH0KKyAgcHVibGljIERjb3VudEEoUm93TWF0Y2hlciByb3dNYXRjaGVyKQorICAgICAgOiBiYXNlKHJvd01hdGNoZXIpIHt9CiAKLSAgICAgICAgcHVibGljIERjb3VudEEoUm93TWF0Y2hlciByb3dNYXRjaGVyKQotICAgICAgICAgICAgOiBiYXNlKHJvd01hdGNoZXIpCi0gICAgICAgIHsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgZGJBZGRyZXNzID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKLSAgICAgICAgICAgIHN0cmluZyBmaWVsZCA9IG51bGw7Ci0gICAgICAgICAgICBzdHJpbmcgY3JpdGVyaWFSYW5nZSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPT0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjcml0ZXJpYVJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgxKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgICAgICBjcml0ZXJpYVJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBkYiA9IG5ldyBFeGNlbERhdGFiYXNlKGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIsIGRiQWRkcmVzcyk7Ci0gICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhKGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIsIGNyaXRlcmlhUmFuZ2UpOwotCi0gICAgICAgICAgICB2YXIgbkhpdHMgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGRiLkhhc01vcmVSb3dzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBkYXRhUm93ID0gZGIuUmVhZCgpOwotICAgICAgICAgICAgICAgIGlmIChSb3dNYXRjaGVyLklzTWF0Y2goZGF0YVJvdywgY3JpdGVyaWEpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSBmaWVsZG5hbWUgaXMgc3VwcGxpZWQsIGNvdW50IG9ubHkgdGhpcyByb3cgaWYgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBzdXBwbGllZCBmaWVsZCBpcyBub3QgYmxhbmsuCi0gICAgICAgICAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZmllbGQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FuZGlkYXRlID0gZGF0YVJvd1tmaWVsZF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2hvdWxkQ291bnQoY2FuZGlkYXRlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSGl0cysrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gZmllbGRuYW1lIHdhcyBzdXBwbGllZCwgYWx3YXlzIGNvdW50IG1hdGNoaW5nIHJvdy4KLSAgICAgICAgICAgICAgICAgICAgICAgIG5IaXRzKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KG5IaXRzLCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbCBTaG91bGRDb3VudChvYmplY3QgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZS5Ub1N0cmluZygpKSk7Ci0gICAgICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgIHZhciBkYkFkZHJlc3MgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlQXNSYW5nZUluZm8uQWRkcmVzcy5BZGRyZXNzOworICAgIHN0cmluZyBmaWVsZCA9IG51bGw7CisgICAgc3RyaW5nIGNyaXRlcmlhUmFuZ2UgPSBudWxsOworICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA9PSAyKSB7CisgICAgICBjcml0ZXJpYVJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgxKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKKyAgICB9IGVsc2UgeworICAgICAgZmllbGQgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICBjcml0ZXJpYVJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKICAgICB9CisgICAgdmFyIGRiID0gbmV3IEV4Y2VsRGF0YWJhc2UoY29udGV4dC5FeGNlbERhdGFQcm92aWRlciwgZGJBZGRyZXNzKTsKKyAgICB2YXIgY3JpdGVyaWEgPSBuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhKGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIsIGNyaXRlcmlhUmFuZ2UpOworCisgICAgdmFyIG5IaXRzID0gMDsKKyAgICB3aGlsZSAoZGIuSGFzTW9yZVJvd3MpIHsKKyAgICAgIHZhciBkYXRhUm93ID0gZGIuUmVhZCgpOworICAgICAgaWYgKFJvd01hdGNoZXIuSXNNYXRjaChkYXRhUm93LCBjcml0ZXJpYSkpIHsKKyAgICAgICAgLy8gaWYgYSBmaWVsZG5hbWUgaXMgc3VwcGxpZWQsIGNvdW50IG9ubHkgdGhpcyByb3cgaWYgdGhlIHZhbHVlCisgICAgICAgIC8vIG9mIHRoZSBzdXBwbGllZCBmaWVsZCBpcyBub3QgYmxhbmsuCisgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkoZmllbGQpKSB7CisgICAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IGRhdGFSb3dbZmllbGRdOworICAgICAgICAgIGlmIChTaG91bGRDb3VudChjYW5kaWRhdGUpKSB7CisgICAgICAgICAgICBuSGl0cysrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBubyBmaWVsZG5hbWUgd2FzIHN1cHBsaWVkLCBhbHdheXMgY291bnQgbWF0Y2hpbmcgcm93LgorICAgICAgICAgIG5IaXRzKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChuSGl0cywgRGF0YVR5cGUuSW50ZWdlcik7CisgIH0KKworICBwcml2YXRlIGJvb2wgU2hvdWxkQ291bnQob2JqZWN0IHZhbHVlKSB7CisgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuICghc3RyaW5nLklzTnVsbE9yRW1wdHkodmFsdWUuVG9TdHJpbmcoKSkpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RnZXQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RnZXQuY3MKaW5kZXggYTM1MTM3NC4uZThhYTc5MCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EZ2V0LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRGdldC5jcwpAQCAtNyw2NSArNyw1OSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTA2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlCi17Ci0gICAgcHVibGljIGNsYXNzIERnZXQgOiBEYXRhYmFzZUZ1bmN0aW9uCi0gICAgeworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlOwogCi0gICAgICAgIHB1YmxpYyBEZ2V0KCkKLSAgICAgICAgICAgIDogdGhpcyhuZXcgUm93TWF0Y2hlcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQorcHVibGljIGNsYXNzIERnZXQgOiBEYXRhYmFzZUZ1bmN0aW9uIHsKKyAgcHVibGljIERnZXQoKQorICAgICAgOiB0aGlzKG5ldygpKSB7fQogCi0gICAgICAgIHB1YmxpYyBEZ2V0KFJvd01hdGNoZXIgcm93TWF0Y2hlcikKLSAgICAgICAgICAgIDogYmFzZShyb3dNYXRjaGVyKQotICAgICAgICB7CisgIHB1YmxpYyBEZ2V0KFJvd01hdGNoZXIgcm93TWF0Y2hlcikKKyAgICAgIDogYmFzZShyb3dNYXRjaGVyKSB7fQogCi0gICAgICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDMpOworICAgIHZhciBkYkFkZHJlc3MgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlQXNSYW5nZUluZm8uQWRkcmVzcy5BZGRyZXNzOworICAgIHZhciBmaWVsZCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICB2YXIgY3JpdGVyaWFSYW5nZSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMikuVmFsdWVBc1JhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3M7CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7Ci0gICAgICAgICAgICB2YXIgZGJBZGRyZXNzID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKLSAgICAgICAgICAgIHZhciBmaWVsZCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgIHZhciBjcml0ZXJpYVJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZUFzUmFuZ2VJbmZvLkFkZHJlc3MuQWRkcmVzczsKKyAgICB2YXIgZGIgPSBuZXcgRXhjZWxEYXRhYmFzZShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLCBkYkFkZHJlc3MpOworICAgIHZhciBjcml0ZXJpYSA9IG5ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWEoY29udGV4dC5FeGNlbERhdGFQcm92aWRlciwgY3JpdGVyaWFSYW5nZSk7CiAKLSAgICAgICAgICAgIHZhciBkYiA9IG5ldyBFeGNlbERhdGFiYXNlKGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIsIGRiQWRkcmVzcyk7Ci0gICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhKGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIsIGNyaXRlcmlhUmFuZ2UpOwotCi0gICAgICAgICAgICB2YXIgbkhpdHMgPSAwOwotICAgICAgICAgICAgb2JqZWN0IHJldFZhbCA9IG51bGw7Ci0gICAgICAgICAgICB3aGlsZSAoZGIuSGFzTW9yZVJvd3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGRhdGFSb3cgPSBkYi5SZWFkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFSb3dNYXRjaGVyLklzTWF0Y2goZGF0YVJvdywgY3JpdGVyaWEpKSBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZigrK25IaXRzID4gMSkgcmV0dXJuIENyZWF0ZVJlc3VsdChFeGNlbEVycm9yVmFsdWUuVmFsdWVzLk51bSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7Ci0gICAgICAgICAgICAgICAgcmV0VmFsID0gZGF0YVJvd1tmaWVsZF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHRGYWN0b3J5KCkuQ3JlYXRlKHJldFZhbCk7Ci0gICAgICAgIH0KKyAgICB2YXIgbkhpdHMgPSAwOworICAgIG9iamVjdCByZXRWYWwgPSBudWxsOworICAgIHdoaWxlIChkYi5IYXNNb3JlUm93cykgeworICAgICAgdmFyIGRhdGFSb3cgPSBkYi5SZWFkKCk7CisgICAgICBpZiAoIVJvd01hdGNoZXIuSXNNYXRjaChkYXRhUm93LCBjcml0ZXJpYSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoKytuSGl0cyA+IDEpIHsKKyAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChFeGNlbEVycm9yVmFsdWUuVmFsdWVzLk51bSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7CisgICAgICB9CisgICAgICByZXRWYWwgPSBkYXRhUm93W2ZpZWxkXTsKICAgICB9CisgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0RmFjdG9yeSgpLkNyZWF0ZShyZXRWYWwpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RtYXguY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RtYXguY3MKaW5kZXggYjgxN2I5ZC4uNjJmN2QxYyAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EbWF4LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRG1heC5jcwpAQCAtNyw0OCArNyw0MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTE5CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZQotewotICAgIHB1YmxpYyBjbGFzcyBEbWF4IDogRGF0YWJhc2VGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIERtYXgoKQotICAgICAgICAgICAgOiB0aGlzKG5ldyBSb3dNYXRjaGVyKCkpCi0gICAgICAgIHsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZTsKIAotICAgICAgICB9CitwdWJsaWMgY2xhc3MgRG1heCA6IERhdGFiYXNlRnVuY3Rpb24geworICBwdWJsaWMgRG1heCgpCisgICAgICA6IHRoaXMobmV3KCkpIHt9CiAKLSAgICAgICAgcHVibGljIERtYXgoUm93TWF0Y2hlciByb3dNYXRjaGVyKQotICAgICAgICAgICAgOiBiYXNlKHJvd01hdGNoZXIpCi0gICAgICAgIHsKKyAgcHVibGljIERtYXgoUm93TWF0Y2hlciByb3dNYXRjaGVyKQorICAgICAgOiBiYXNlKHJvd01hdGNoZXIpIHt9CiAKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAzKTsKLSAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBHZXRNYXRjaGluZ1ZhbHVlcyhhcmd1bWVudHMsIGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKCF2YWx1ZXMuQW55KCkpIHJldHVybiBDcmVhdGVSZXN1bHQoMGQsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWx1ZXMuTWF4KCksIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAzKTsKKyAgICB2YXIgdmFsdWVzID0gR2V0TWF0Y2hpbmdWYWx1ZXMoYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICBpZiAoIXZhbHVlcy5BbnkoKSkgeworICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCgwZCwgRGF0YVR5cGUuSW50ZWdlcik7CiAgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQodmFsdWVzLk1heCgpLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EbWluLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EbWluLmNzCmluZGV4IDUzYjk4M2IuLjgyMDM4ODQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRG1pbi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0RtaW4uY3MKQEAgLTcsNDggKzcsNDMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wNC0xOQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKLXsKLSAgICBwdWJsaWMgY2xhc3MgRG1pbiA6IERhdGFiYXNlRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBEbWluKCkKLSAgICAgICAgICAgIDogdGhpcyhuZXcgUm93TWF0Y2hlcigpKQotICAgICAgICB7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2U7CiAKLSAgICAgICAgfQorcHVibGljIGNsYXNzIERtaW4gOiBEYXRhYmFzZUZ1bmN0aW9uIHsKKyAgcHVibGljIERtaW4oKQorICAgICAgOiB0aGlzKG5ldygpKSB7fQogCi0gICAgICAgIHB1YmxpYyBEbWluKFJvd01hdGNoZXIgcm93TWF0Y2hlcikKLSAgICAgICAgICAgIDogYmFzZShyb3dNYXRjaGVyKQotICAgICAgICB7CisgIHB1YmxpYyBEbWluKFJvd01hdGNoZXIgcm93TWF0Y2hlcikKKyAgICAgIDogYmFzZShyb3dNYXRjaGVyKSB7fQogCi0gICAgICAgIH0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7Ci0gICAgICAgICAgICB2YXIgdmFsdWVzID0gR2V0TWF0Y2hpbmdWYWx1ZXMoYXJndW1lbnRzLCBjb250ZXh0KTsKLSAgICAgICAgICAgIGlmICghdmFsdWVzLkFueSgpKSByZXR1cm4gQ3JlYXRlUmVzdWx0KDBkLCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodmFsdWVzLk1pbigpLCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgfQorICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7CisgICAgdmFyIHZhbHVlcyA9IEdldE1hdGNoaW5nVmFsdWVzKGFyZ3VtZW50cywgY29udGV4dCk7CisgICAgaWYgKCF2YWx1ZXMuQW55KCkpIHsKKyAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoMGQsIERhdGFUeXBlLkludGVnZXIpOwogICAgIH0KKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbHVlcy5NaW4oKSwgRGF0YVR5cGUuSW50ZWdlcik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRHZhci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRHZhci5jcwppbmRleCBiZDZiMDljLi5kOTYxYjgyIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0R2YXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EdmFyLmNzCkBAIC03LDUwICs3LDQ0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDQtMTkKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZQotewotICAgIHB1YmxpYyBjbGFzcyBEdmFyIDogRGF0YWJhc2VGdW5jdGlvbgotICAgIHsKLSAgICAgICAgIHB1YmxpYyBEdmFyKCkKLSAgICAgICAgICAgIDogdGhpcyhuZXcgUm93TWF0Y2hlcigpKQotICAgICAgICB7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2U7CiAKLSAgICAgICAgfQorcHVibGljIGNsYXNzIER2YXIgOiBEYXRhYmFzZUZ1bmN0aW9uIHsKKyAgcHVibGljIER2YXIoKQorICAgICAgOiB0aGlzKG5ldygpKSB7fQogCi0gICAgICAgICBwdWJsaWMgRHZhcihSb3dNYXRjaGVyIHJvd01hdGNoZXIpCi0gICAgICAgICAgICA6IGJhc2Uocm93TWF0Y2hlcikKLSAgICAgICAgeworICBwdWJsaWMgRHZhcihSb3dNYXRjaGVyIHJvd01hdGNoZXIpCisgICAgICA6IGJhc2Uocm93TWF0Y2hlcikge30KIAotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7Ci0gICAgICAgICAgICB2YXIgdmFsdWVzID0gR2V0TWF0Y2hpbmdWYWx1ZXMoYXJndW1lbnRzLCBjb250ZXh0KTsKLSAgICAgICAgICAgIGlmICghdmFsdWVzLkFueSgpKSByZXR1cm4gQ3JlYXRlUmVzdWx0KDBkLCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoVmFyTWV0aG9kcy5WYXIodmFsdWVzKSwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDMpOworICAgIHZhciB2YWx1ZXMgPSBHZXRNYXRjaGluZ1ZhbHVlcyhhcmd1bWVudHMsIGNvbnRleHQpOworICAgIGlmICghdmFsdWVzLkFueSgpKSB7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KDBkLCBEYXRhVHlwZS5JbnRlZ2VyKTsKICAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChWYXJNZXRob2RzLlZhcih2YWx1ZXMpLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EdmFycC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRHZhcnAuY3MKaW5kZXggODYwN2Y2ZS4uN2M0M2U4OCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9EdmFycC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0R2YXJwLmNzCkBAIC03LDUwICs3LDQ0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDQtMTkKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZQotewotICAgIHB1YmxpYyBjbGFzcyBEdmFycCA6IERhdGFiYXNlRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgICBwdWJsaWMgRHZhcnAoKQotICAgICAgICAgICAgOiB0aGlzKG5ldyBSb3dNYXRjaGVyKCkpCi0gICAgICAgIHsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZTsKIAotICAgICAgICB9CitwdWJsaWMgY2xhc3MgRHZhcnAgOiBEYXRhYmFzZUZ1bmN0aW9uIHsKKyAgcHVibGljIER2YXJwKCkKKyAgICAgIDogdGhpcyhuZXcoKSkge30KIAotICAgICAgICAgcHVibGljIER2YXJwKFJvd01hdGNoZXIgcm93TWF0Y2hlcikKLSAgICAgICAgICAgIDogYmFzZShyb3dNYXRjaGVyKQotICAgICAgICB7CisgIHB1YmxpYyBEdmFycChSb3dNYXRjaGVyIHJvd01hdGNoZXIpCisgICAgICA6IGJhc2Uocm93TWF0Y2hlcikge30KIAotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7Ci0gICAgICAgICAgICB2YXIgdmFsdWVzID0gR2V0TWF0Y2hpbmdWYWx1ZXMoYXJndW1lbnRzLCBjb250ZXh0KTsKLSAgICAgICAgICAgIGlmICghdmFsdWVzLkFueSgpKSByZXR1cm4gQ3JlYXRlUmVzdWx0KDBkLCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoVmFyTWV0aG9kcy5WYXJQKHZhbHVlcyksIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAzKTsKKyAgICB2YXIgdmFsdWVzID0gR2V0TWF0Y2hpbmdWYWx1ZXMoYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICBpZiAoIXZhbHVlcy5BbnkoKSkgeworICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCgwZCwgRGF0YVR5cGUuSW50ZWdlcik7CiAgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQoVmFyTWV0aG9kcy5WYXJQKHZhbHVlcyksIERhdGFUeXBlLkludGVnZXIpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2UuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2UuY3MKaW5kZXggMjMxZDg3MC4uOTBlM2Y5NyAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9FeGNlbERhdGFiYXNlLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRXhjZWxEYXRhYmFzZS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKQEAgLTcsOTAgKzcsNzUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wNC0wNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxEYXRhYmFzZQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFeGNlbERhdGFQcm92aWRlciBfZGF0YVByb3ZpZGVyOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfZnJvbUNvbDsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3RvQ29sOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfZmllbGRSb3c7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9lbmRSb3c7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF93b3Jrc2hlZXQ7Ci0gICAgICAgIHByaXZhdGUgaW50IF9yb3dJbmRleDsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBMaXN0PEV4Y2VsRGF0YWJhc2VGaWVsZD4gX2ZpZWxkcyA9IG5ldyBMaXN0PEV4Y2VsRGF0YWJhc2VGaWVsZD4oKTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRhYmFzZTsKIAotICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8RXhjZWxEYXRhYmFzZUZpZWxkPiBGaWVsZHMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9maWVsZHM7IH0KLSAgICAgICAgfQorcHVibGljIGNsYXNzIEV4Y2VsRGF0YWJhc2UgeworICBwcml2YXRlIHJlYWRvbmx5IEV4Y2VsRGF0YVByb3ZpZGVyIF9kYXRhUHJvdmlkZXI7CisgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9mcm9tQ29sOworICBwcml2YXRlIHJlYWRvbmx5IGludCBfdG9Db2w7CisgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9maWVsZFJvdzsKKyAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2VuZFJvdzsKKyAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3dvcmtzaGVldDsKKyAgcHJpdmF0ZSBpbnQgX3Jvd0luZGV4OworICBwcml2YXRlIHJlYWRvbmx5IExpc3Q8RXhjZWxEYXRhYmFzZUZpZWxkPiBfZmllbGRzID0gbmV3KCk7CiAKLSAgICAgICAgcHVibGljIEV4Y2VsRGF0YWJhc2UoRXhjZWxEYXRhUHJvdmlkZXIgZGF0YVByb3ZpZGVyLCBzdHJpbmcgcmFuZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9kYXRhUHJvdmlkZXIgPSBkYXRhUHJvdmlkZXI7Ci0gICAgICAgICAgICB2YXIgYWRkcmVzcyA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKHJhbmdlKTsKLSAgICAgICAgICAgIF9mcm9tQ29sID0gYWRkcmVzcy5fZnJvbUNvbDsKLSAgICAgICAgICAgIF90b0NvbCA9IGFkZHJlc3MuX3RvQ29sOwotICAgICAgICAgICAgX2ZpZWxkUm93ID0gYWRkcmVzcy5fZnJvbVJvdzsKLSAgICAgICAgICAgIF9lbmRSb3cgPSBhZGRyZXNzLl90b1JvdzsKLSAgICAgICAgICAgIF93b3Jrc2hlZXQgPSBhZGRyZXNzLldvcmtTaGVldDsKLSAgICAgICAgICAgIF9yb3dJbmRleCA9IF9maWVsZFJvdzsKLSAgICAgICAgICAgIEluaXRpYWxpemUoKTsKLSAgICAgICAgfQorICBwdWJsaWMgSUVudW1lcmFibGU8RXhjZWxEYXRhYmFzZUZpZWxkPiBGaWVsZHMgPT4gX2ZpZWxkczsKIAotICAgICAgICBwcml2YXRlIHZvaWQgSW5pdGlhbGl6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmaWVsZEl4ID0gMDsKLSAgICAgICAgICAgIGZvciAodmFyIGNvbEluZGV4ID0gX2Zyb21Db2w7IGNvbEluZGV4IDw9IF90b0NvbDsgY29sSW5kZXgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgbmFtZU9iaiA9IEdldENlbGxWYWx1ZShfZmllbGRSb3csIGNvbEluZGV4KTsKLSAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IG5hbWVPYmogIT0gbnVsbCA/IG5hbWVPYmouVG9TdHJpbmcoKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpIDogc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgICAgIF9maWVsZHMuQWRkKG5ldyBFeGNlbERhdGFiYXNlRmllbGQobmFtZSwgZmllbGRJeCsrKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgcHVibGljIEV4Y2VsRGF0YWJhc2UoRXhjZWxEYXRhUHJvdmlkZXIgZGF0YVByb3ZpZGVyLCBzdHJpbmcgcmFuZ2UpIHsKKyAgICBfZGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyOworICAgIHZhciBhZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UocmFuZ2UpOworICAgIF9mcm9tQ29sID0gYWRkcmVzcy5fZnJvbUNvbDsKKyAgICBfdG9Db2wgPSBhZGRyZXNzLl90b0NvbDsKKyAgICBfZmllbGRSb3cgPSBhZGRyZXNzLl9mcm9tUm93OworICAgIF9lbmRSb3cgPSBhZGRyZXNzLl90b1JvdzsKKyAgICBfd29ya3NoZWV0ID0gYWRkcmVzcy5Xb3JrU2hlZXQ7CisgICAgX3Jvd0luZGV4ID0gX2ZpZWxkUm93OworICAgIEluaXRpYWxpemUoKTsKKyAgfQogCi0gICAgICAgIHByaXZhdGUgb2JqZWN0IEdldENlbGxWYWx1ZShpbnQgcm93LCBpbnQgY29sKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2RhdGFQcm92aWRlci5HZXRSYW5nZVZhbHVlKF93b3Jrc2hlZXQsIHJvdywgY29sKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIEhhc01vcmVSb3dzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfcm93SW5kZXggPCBfZW5kUm93OyB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRXhjZWxEYXRhYmFzZVJvdyBSZWFkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJldFZhbCA9IG5ldyBFeGNlbERhdGFiYXNlUm93KCk7Ci0gICAgICAgICAgICBfcm93SW5kZXgrKzsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmaWVsZCBpbiBGaWVsZHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGNvbEluZGV4ID0gX2Zyb21Db2wgKyBmaWVsZC5Db2xJbmRleDsKLSAgICAgICAgICAgICAgICB2YXIgdmFsID0gR2V0Q2VsbFZhbHVlKF9yb3dJbmRleCwgY29sSW5kZXgpOwotICAgICAgICAgICAgICAgIHJldFZhbFtmaWVsZC5GaWVsZE5hbWVdID0gdmFsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKLSAgICAgICAgfQorICBwcml2YXRlIHZvaWQgSW5pdGlhbGl6ZSgpIHsKKyAgICB2YXIgZmllbGRJeCA9IDA7CisgICAgZm9yICh2YXIgY29sSW5kZXggPSBfZnJvbUNvbDsgY29sSW5kZXggPD0gX3RvQ29sOyBjb2xJbmRleCsrKSB7CisgICAgICB2YXIgbmFtZU9iaiA9IEdldENlbGxWYWx1ZShfZmllbGRSb3csIGNvbEluZGV4KTsKKyAgICAgIHZhciBuYW1lID0KKyAgICAgICAgICBuYW1lT2JqICE9IG51bGwgPyBuYW1lT2JqLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSA6IHN0cmluZy5FbXB0eTsKKyAgICAgIF9maWVsZHMuQWRkKG5ldyhuYW1lLCBmaWVsZEl4KyspKTsKICAgICB9CisgIH0KKworICBwcml2YXRlIG9iamVjdCBHZXRDZWxsVmFsdWUoaW50IHJvdywgaW50IGNvbCkgeworICAgIHJldHVybiBfZGF0YVByb3ZpZGVyLkdldFJhbmdlVmFsdWUoX3dvcmtzaGVldCwgcm93LCBjb2wpOworICB9CisKKyAgcHVibGljIGJvb2wgSGFzTW9yZVJvd3MgPT4gX3Jvd0luZGV4IDwgX2VuZFJvdzsKKworICBwdWJsaWMgRXhjZWxEYXRhYmFzZVJvdyBSZWFkKCkgeworICAgIHZhciByZXRWYWwgPSBuZXcgRXhjZWxEYXRhYmFzZVJvdygpOworICAgIF9yb3dJbmRleCsrOworICAgIGZvcmVhY2ggKHZhciBmaWVsZCBpbiBGaWVsZHMpIHsKKyAgICAgIHZhciBjb2xJbmRleCA9IF9mcm9tQ29sICsgZmllbGQuQ29sSW5kZXg7CisgICAgICB2YXIgdmFsID0gR2V0Q2VsbFZhbHVlKF9yb3dJbmRleCwgY29sSW5kZXgpOworICAgICAgcmV0VmFsW2ZpZWxkLkZpZWxkTmFtZV0gPSB2YWw7CisgICAgfQorICAgIHJldHVybiByZXRWYWw7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRXhjZWxEYXRhYmFzZUNyaXRlcmlhLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9FeGNlbERhdGFiYXNlQ3JpdGVyaWEuY3MKaW5kZXggNTIyZTgxMC4uZjhiODg0NiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9FeGNlbERhdGFiYXNlQ3JpdGVyaWEuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9FeGNlbERhdGFiYXNlQ3JpdGVyaWEuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorLyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC03LDc3ICs3LDYyIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDQtMDYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlCi17Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YWJhc2VDcml0ZXJpYQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFeGNlbERhdGFQcm92aWRlciBfZGF0YVByb3ZpZGVyOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfZnJvbUNvbDsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3RvQ29sOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfd29ya3NoZWV0OwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBfZmllbGRSb3c7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCwgb2JqZWN0PiBfY3JpdGVyaWFzID0gbmV3IERpY3Rpb25hcnk8RXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQsIG9iamVjdD4oKTsgCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2U7CiAKLSAgICAgICAgcHVibGljIEV4Y2VsRGF0YWJhc2VDcml0ZXJpYShFeGNlbERhdGFQcm92aWRlciBkYXRhUHJvdmlkZXIsIHN0cmluZyByYW5nZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2RhdGFQcm92aWRlciA9IGRhdGFQcm92aWRlcjsKLSAgICAgICAgICAgIHZhciBhZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UocmFuZ2UpOwotICAgICAgICAgICAgX2Zyb21Db2wgPSBhZGRyZXNzLl9mcm9tQ29sOwotICAgICAgICAgICAgX3RvQ29sID0gYWRkcmVzcy5fdG9Db2w7Ci0gICAgICAgICAgICBfd29ya3NoZWV0ID0gYWRkcmVzcy5Xb3JrU2hlZXQ7Ci0gICAgICAgICAgICBfZmllbGRSb3cgPSBhZGRyZXNzLl9mcm9tUm93OwotICAgICAgICAgICAgSW5pdGlhbGl6ZSgpOworcHVibGljIGNsYXNzIEV4Y2VsRGF0YWJhc2VDcml0ZXJpYSB7CisgIHByaXZhdGUgcmVhZG9ubHkgRXhjZWxEYXRhUHJvdmlkZXIgX2RhdGFQcm92aWRlcjsKKyAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2Zyb21Db2w7CisgIHByaXZhdGUgcmVhZG9ubHkgaW50IF90b0NvbDsKKyAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3dvcmtzaGVldDsKKyAgcHJpdmF0ZSByZWFkb25seSBpbnQgX2ZpZWxkUm93OworICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8RXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQsIG9iamVjdD4gX2NyaXRlcmlhcyA9IG5ldygpOworCisgIHB1YmxpYyBFeGNlbERhdGFiYXNlQ3JpdGVyaWEoRXhjZWxEYXRhUHJvdmlkZXIgZGF0YVByb3ZpZGVyLCBzdHJpbmcgcmFuZ2UpIHsKKyAgICBfZGF0YVByb3ZpZGVyID0gZGF0YVByb3ZpZGVyOworICAgIHZhciBhZGRyZXNzID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UocmFuZ2UpOworICAgIF9mcm9tQ29sID0gYWRkcmVzcy5fZnJvbUNvbDsKKyAgICBfdG9Db2wgPSBhZGRyZXNzLl90b0NvbDsKKyAgICBfd29ya3NoZWV0ID0gYWRkcmVzcy5Xb3JrU2hlZXQ7CisgICAgX2ZpZWxkUm93ID0gYWRkcmVzcy5fZnJvbVJvdzsKKyAgICBJbml0aWFsaXplKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgSW5pdGlhbGl6ZSgpIHsKKyAgICBmb3IgKHZhciB4ID0gX2Zyb21Db2w7IHggPD0gX3RvQ29sOyB4KyspIHsKKyAgICAgIHZhciBmaWVsZE9iaiA9IF9kYXRhUHJvdmlkZXIuR2V0Q2VsbFZhbHVlKF93b3Jrc2hlZXQsIF9maWVsZFJvdywgeCk7CisgICAgICB2YXIgdmFsID0gX2RhdGFQcm92aWRlci5HZXRDZWxsVmFsdWUoX3dvcmtzaGVldCwgX2ZpZWxkUm93ICsgMSwgeCk7CisgICAgICBpZiAoZmllbGRPYmogIT0gbnVsbCAmJiB2YWwgIT0gbnVsbCkgeworICAgICAgICBpZiAoZmllbGRPYmogaXMgc3RyaW5nKSB7CisgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkKAorICAgICAgICAgICAgICBmaWVsZE9iai5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgICAgIF9jcml0ZXJpYXMuQWRkKGZpZWxkLCB2YWwpOworICAgICAgICB9IGVsc2UgaWYgKENvbnZlcnRVdGlsLklzTnVtZXJpYyhmaWVsZE9iaikpIHsKKyAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoKGludClmaWVsZE9iaik7CisgICAgICAgICAgX2NyaXRlcmlhcy5BZGQoZmllbGQsIHZhbCk7CiAgICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgSW5pdGlhbGl6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAodmFyIHggPSBfZnJvbUNvbDsgeCA8PSBfdG9Db2w7IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZmllbGRPYmogPSBfZGF0YVByb3ZpZGVyLkdldENlbGxWYWx1ZShfd29ya3NoZWV0LCBfZmllbGRSb3csIHgpOwotICAgICAgICAgICAgICAgIHZhciB2YWwgPSBfZGF0YVByb3ZpZGVyLkdldENlbGxWYWx1ZShfd29ya3NoZWV0LCBfZmllbGRSb3cgKyAxLCB4KTsKLSAgICAgICAgICAgICAgICBpZiAoZmllbGRPYmogIT0gbnVsbCAmJiB2YWwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGZpZWxkT2JqIGlzIHN0cmluZykKLSAgICAgICAgICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZChmaWVsZE9iai5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgX2NyaXRlcmlhcy5BZGQoZmllbGQsIHZhbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQ29udmVydFV0aWwuSXNOdW1lcmljKGZpZWxkT2JqKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkKChpbnQpIGZpZWxkT2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jcml0ZXJpYXMuQWRkKGZpZWxkLCB2YWwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdmlydHVhbCBJRGljdGlvbmFyeTxFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZCwgb2JqZWN0PiBJdGVtcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX2NyaXRlcmlhczsgfQotICAgICAgICB9CisgICAgICB9CiAgICAgfQorICB9CisKKyAgcHVibGljIHZpcnR1YWwgSURpY3Rpb25hcnk8RXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQsIG9iamVjdD4gSXRlbXMgPT4gX2NyaXRlcmlhczsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkLmNzCmluZGV4IGJlYjc3ZDAuLmVlYzE1MWMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9FeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZC5jcwpAQCAtNyw1MSArNyw0MSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTE5CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlCi17Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkCi0gICAgewotICAgICAgICBwdWJsaWMgRXhjZWxEYXRhYmFzZUNyaXRlcmlhRmllbGQoc3RyaW5nIGZpZWxkTmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGROYW1lID0gZmllbGROYW1lOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2U7CiAKLSAgICAgICAgcHVibGljIEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkKGludCBmaWVsZEluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWVsZEluZGV4ID0gZmllbGRJbmRleDsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkIHsKKyAgcHVibGljIEV4Y2VsRGF0YWJhc2VDcml0ZXJpYUZpZWxkKHN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICBGaWVsZE5hbWUgPSBmaWVsZE5hbWU7CisgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShGaWVsZE5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBGaWVsZE5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYmFzZS5Ub1N0cmluZygpOwotICAgICAgICB9CisgIHB1YmxpYyBFeGNlbERhdGFiYXNlQ3JpdGVyaWFGaWVsZChpbnQgZmllbGRJbmRleCkgeworICAgIEZpZWxkSW5kZXggPSBmaWVsZEluZGV4OworICB9CiAKLSAgICAgICAgcHVibGljIHN0cmluZyBGaWVsZE5hbWUgeyBnZXQ7IHByaXZhdGUgc2V0OyB9Ci0KLSAgICAgICAgcHVibGljIGludD8gRmllbGRJbmRleCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKKyAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KEZpZWxkTmFtZSkpIHsKKyAgICAgIHJldHVybiBGaWVsZE5hbWU7CiAgICAgfQorICAgIHJldHVybiBiYXNlLlRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgc3RyaW5nIEZpZWxkTmFtZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICBwdWJsaWMgaW50PyBGaWVsZEluZGV4IHsgZ2V0OyBwcml2YXRlIHNldDsgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9FeGNlbERhdGFiYXNlRmllbGQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2VGaWVsZC5jcwppbmRleCA5Njg3YjNjLi45NTc4NDg2IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2VGaWVsZC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2VGaWVsZC5jcwpAQCAtNywzOCArNywzMSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTA2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlCi17Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRGF0YWJhc2VGaWVsZAotICAgIHsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBzdHJpbmcgRmllbGROYW1lIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotICAgICAgICBwdWJsaWMgaW50IENvbEluZGV4IHsgZ2V0OyBwcml2YXRlIHNldDsgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlOwogCi0gICAgICAgIHB1YmxpYyBFeGNlbERhdGFiYXNlRmllbGQoc3RyaW5nIGZpZWxkTmFtZSwgaW50IGNvbEluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWVsZE5hbWUgPSBmaWVsZE5hbWU7Ci0gICAgICAgICAgICBDb2xJbmRleCA9IGNvbEluZGV4OwotICAgICAgICB9Ci0gICAgfQorcHVibGljIGNsYXNzIEV4Y2VsRGF0YWJhc2VGaWVsZCB7CisgIHB1YmxpYyBzdHJpbmcgRmllbGROYW1lIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgIHB1YmxpYyBpbnQgQ29sSW5kZXggeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgcHVibGljIEV4Y2VsRGF0YWJhc2VGaWVsZChzdHJpbmcgZmllbGROYW1lLCBpbnQgY29sSW5kZXgpIHsKKyAgICBGaWVsZE5hbWUgPSBmaWVsZE5hbWU7CisgICAgQ29sSW5kZXggPSBjb2xJbmRleDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9FeGNlbERhdGFiYXNlUm93LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9FeGNlbERhdGFiYXNlUm93LmNzCmluZGV4IDBhMjE2ZGIuLjdiNjk0Y2YgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvRXhjZWxEYXRhYmFzZVJvdy5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL0V4Y2VsRGF0YWJhc2VSb3cuY3MKQEAgLTcsNTQgKzcsNDMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wNC0xOQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuT3BlcmF0b3JzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxEYXRhYmFzZVJvdwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PGludCwgc3RyaW5nPiBfZmllbGRJbmRleGVzID0gbmV3IERpY3Rpb25hcnk8aW50LCBzdHJpbmc+KCk7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxzdHJpbmcsIG9iamVjdD4gX2l0ZW1zID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+KCk7Ci0gICAgICAgIHByaXZhdGUgaW50IF9jb2xJbmRleCA9IDE7Ci0gICAgICAgIHB1YmxpYyBvYmplY3QgdGhpc1tzdHJpbmcgZmllbGRdCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfaXRlbXNbZmllbGRdOyB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2U7CiAKLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9pdGVtc1tmaWVsZF0gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBfZmllbGRJbmRleGVzW19jb2xJbmRleCsrXSA9IGZpZWxkOwotICAgICAgICAgICAgfQotICAgICAgICB9CitwdWJsaWMgY2xhc3MgRXhjZWxEYXRhYmFzZVJvdyB7CisgIHByaXZhdGUgRGljdGlvbmFyeTxpbnQsIHN0cmluZz4gX2ZpZWxkSW5kZXhlcyA9IG5ldygpOworICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8c3RyaW5nLCBvYmplY3Q+IF9pdGVtcyA9IG5ldygpOworICBwcml2YXRlIGludCBfY29sSW5kZXggPSAxOwogCi0gICAgICAgIHB1YmxpYyBvYmplY3QgdGhpc1tpbnQgaW5kZXhdCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IF9maWVsZEluZGV4ZXNbaW5kZXhdOwotICAgICAgICAgICAgICAgIHJldHVybiBfaXRlbXNbZmllbGRdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKKyAgcHVibGljIG9iamVjdCB0aGlzW3N0cmluZyBmaWVsZF0geworICAgIGdldCA9PiBfaXRlbXNbZmllbGRdOworICAgIHNldCB7CisgICAgICBfaXRlbXNbZmllbGRdID0gdmFsdWU7CisgICAgICBfZmllbGRJbmRleGVzW19jb2xJbmRleCsrXSA9IGZpZWxkOwogICAgIH0KKyAgfQorCisgIHB1YmxpYyBvYmplY3QgdGhpc1tpbnQgaW5kZXhdIHsKKyAgICBnZXQgeworICAgICAgdmFyIGZpZWxkID0gX2ZpZWxkSW5kZXhlc1tpbmRleF07CisgICAgICByZXR1cm4gX2l0ZW1zW2ZpZWxkXTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvUm93TWF0Y2hlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0YWJhc2UvUm93TWF0Y2hlci5jcwppbmRleCBlMGIzMmQ3Li4zNDkzODcyIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGFiYXNlL1Jvd01hdGNoZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRhYmFzZS9Sb3dNYXRjaGVyLmNzCkBAIC03LDg0ICs3LDc2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDQtMDYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OworCiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0YWJhc2UKLXsKLSAgICBwdWJsaWMgY2xhc3MgUm93TWF0Y2hlcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBXaWxkQ2FyZFZhbHVlTWF0Y2hlciBfd2lsZENhcmRWYWx1ZU1hdGNoZXI7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGFiYXNlOwogCi0gICAgICAgIHB1YmxpYyBSb3dNYXRjaGVyKCkKLSAgICAgICAgICAgIDogdGhpcyhuZXcgV2lsZENhcmRWYWx1ZU1hdGNoZXIoKSwgbmV3IE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIAotICAgICAgICB9CitwdWJsaWMgY2xhc3MgUm93TWF0Y2hlciB7CisgIHByaXZhdGUgcmVhZG9ubHkgV2lsZENhcmRWYWx1ZU1hdGNoZXIgX3dpbGRDYXJkVmFsdWVNYXRjaGVyOworICBwcml2YXRlIHJlYWRvbmx5IE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yIF9udW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvcjsKIAotICAgICAgICBwdWJsaWMgUm93TWF0Y2hlcihXaWxkQ2FyZFZhbHVlTWF0Y2hlciB3aWxkQ2FyZFZhbHVlTWF0Y2hlciwgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF93aWxkQ2FyZFZhbHVlTWF0Y2hlciA9IHdpbGRDYXJkVmFsdWVNYXRjaGVyOwotICAgICAgICAgICAgX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yID0gbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3I7Ci0gICAgICAgIH0KKyAgcHVibGljIFJvd01hdGNoZXIoKQorICAgICAgOiB0aGlzKG5ldygpLCBuZXcoKSkge30KIAotICAgICAgICBwdWJsaWMgYm9vbCBJc01hdGNoKEV4Y2VsRGF0YWJhc2VSb3cgcm93LCBFeGNlbERhdGFiYXNlQ3JpdGVyaWEgY3JpdGVyaWEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXRWYWwgPSB0cnVlOwotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGMgaW4gY3JpdGVyaWEuSXRlbXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IGMuS2V5LkZpZWxkSW5kZXguSGFzVmFsdWUgPyByb3dbYy5LZXkuRmllbGRJbmRleC5WYWx1ZV0gOiByb3dbYy5LZXkuRmllbGROYW1lXTsKLSAgICAgICAgICAgICAgICB2YXIgY3JpdCA9IGMuVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5Jc051bWVyaWMoKSAmJiBjcml0LklzTnVtZXJpYygpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoU3lzdGVtLk1hdGguQWJzKENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGNhbmRpZGF0ZSkgLSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShjcml0KSkgPiBkb3VibGUuRXBzaWxvbikgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgY3JpdGVyaWFTdHJpbmcgPSBjcml0LlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghRXZhbHVhdGUoY2FuZGlkYXRlLCBjcml0ZXJpYVN0cmluZykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXRWYWw7Ci0gICAgICAgIH0KKyAgcHVibGljIFJvd01hdGNoZXIoCisgICAgICBXaWxkQ2FyZFZhbHVlTWF0Y2hlciB3aWxkQ2FyZFZhbHVlTWF0Y2hlciwKKyAgICAgIE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yIG51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yKSB7CisgICAgX3dpbGRDYXJkVmFsdWVNYXRjaGVyID0gd2lsZENhcmRWYWx1ZU1hdGNoZXI7CisgICAgX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yID0gbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3I7CisgIH0KIAotICAgICAgICBwcml2YXRlIGJvb2wgRXZhbHVhdGUob2JqZWN0IG9iaiwgc3RyaW5nIGV4cHJlc3Npb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgZG91YmxlPyBjYW5kaWRhdGUgPSBkZWZhdWx0KGRvdWJsZT8pOwotICAgICAgICAgICAgaWYgKENvbnZlcnRVdGlsLklzTnVtZXJpYyhvYmopKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSA9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKG9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlLkhhc1ZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IuRXZhbHVhdGUoY2FuZGlkYXRlLlZhbHVlLCBleHByZXNzaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBfd2lsZENhcmRWYWx1ZU1hdGNoZXIuSXNNYXRjaChleHByZXNzaW9uLCBvYmouVG9TdHJpbmcoKSkgPT0gMDsKKyAgcHVibGljIGJvb2wgSXNNYXRjaChFeGNlbERhdGFiYXNlUm93IHJvdywgRXhjZWxEYXRhYmFzZUNyaXRlcmlhIGNyaXRlcmlhKSB7CisgICAgdmFyIHJldFZhbCA9IHRydWU7CisgICAgZm9yZWFjaCAodmFyIGMgaW4gY3JpdGVyaWEuSXRlbXMpIHsKKyAgICAgIHZhciBjYW5kaWRhdGUgPSBjLktleS5GaWVsZEluZGV4Lkhhc1ZhbHVlCisgICAgICAgICAgPyByb3dbYy5LZXkuRmllbGRJbmRleC5WYWx1ZV0KKyAgICAgICAgICA6IHJvd1tjLktleS5GaWVsZE5hbWVdOworICAgICAgdmFyIGNyaXQgPSBjLlZhbHVlOworICAgICAgaWYgKGNhbmRpZGF0ZS5Jc051bWVyaWMoKSAmJiBjcml0LklzTnVtZXJpYygpKSB7CisgICAgICAgIGlmIChTeXN0ZW0uTWF0aC5BYnMoCisgICAgICAgICAgICAgICAgQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoY2FuZGlkYXRlKSAtIENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGNyaXQpKQorICAgICAgICAgICAgPiBkb3VibGUuRXBzaWxvbikgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIGNyaXRlcmlhU3RyaW5nID0gY3JpdC5Ub1N0cmluZygpOworICAgICAgICBpZiAoIUV2YWx1YXRlKGNhbmRpZGF0ZSwgY3JpdGVyaWFTdHJpbmcpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CiAgICAgfQorICAgIHJldHVybiByZXRWYWw7CisgIH0KKworICBwcml2YXRlIGJvb2wgRXZhbHVhdGUob2JqZWN0IG9iaiwgc3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZG91YmxlPyBjYW5kaWRhdGUgPSBkZWZhdWx0KGRvdWJsZT8pOworICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWMob2JqKSkgeworICAgICAgY2FuZGlkYXRlID0gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUob2JqKTsKKyAgICB9CisgICAgaWYgKGNhbmRpZGF0ZS5IYXNWYWx1ZSkgeworICAgICAgcmV0dXJuIF9udW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvci5FdmFsdWF0ZShjYW5kaWRhdGUuVmFsdWUsIGV4cHJlc3Npb24pOworICAgIH0KKyAgICByZXR1cm4gX3dpbGRDYXJkVmFsdWVNYXRjaGVyLklzTWF0Y2goZXhwcmVzc2lvbiwgb2JqLlRvU3RyaW5nKCkpID09IDA7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRGF0ZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRGF0ZS5jcwppbmRleCBhYTUyMzNlLi5lMmU4YWQ5IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RhdGUuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9EYXRlLmNzCkBAIC03LDQyICs3LDM5IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCi17Ci0gICAgcHVibGljIGNsYXNzIERhdGUgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAzKTsKLSAgICAgICAgICAgIHZhciB5ZWFyID0gQXJnVG9JbnQoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHZhciBtb250aCA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgZGF5ID0gQXJnVG9JbnQoYXJndW1lbnRzLCAyKTsKLSAgICAgICAgICAgIHZhciBkYXRlID0gbmV3IFN5c3RlbS5EYXRlVGltZSh5ZWFyLCAxLCAxKTsKLSAgICAgICAgICAgIG1vbnRoIC09IDE7Ci0gICAgICAgICAgICBkYXRlID0gZGF0ZS5BZGRNb250aHMobW9udGgpOwotICAgICAgICAgICAgZGF0ZSA9IGRhdGUuQWRkRGF5cygoZG91YmxlKShkYXkgLSAxKSk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGRhdGUuVG9PQURhdGUoKSwgRGF0YVR5cGUuRGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWU7CisKK3B1YmxpYyBjbGFzcyBEYXRlIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAzKTsKKyAgICB2YXIgeWVhciA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMCk7CisgICAgdmFyIG1vbnRoID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgZGF5ID0gQXJnVG9JbnQoYXJndW1lbnRzLCAyKTsKKyAgICB2YXIgZGF0ZSA9IG5ldyBTeXN0ZW0uRGF0ZVRpbWUoeWVhciwgMSwgMSk7CisgICAgbW9udGggLT0gMTsKKyAgICBkYXRlID0gZGF0ZS5BZGRNb250aHMobW9udGgpOworICAgIGRhdGUgPSBkYXRlLkFkZERheXMoZGF5IC0gMSk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChkYXRlLlRvT0FEYXRlKCksIERhdGFUeXBlLkRhdGUpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RhdGVQYXJzaW5nRnVuY3Rpb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RhdGVQYXJzaW5nRnVuY3Rpb24uY3MKaW5kZXggMTc1NjY4Ni4uZmJhYzQzYyAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9EYXRlUGFyc2luZ0Z1bmN0aW9uLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRGF0ZVBhcnNpbmdGdW5jdGlvbi5jcwpAQCAtMSwyNiArMSwxNyBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Civvu791c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCi17Ci0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIERhdGVQYXJzaW5nRnVuY3Rpb24gOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgU3lzdGVtLkRhdGVUaW1lIFBhcnNlRGF0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIG9iamVjdCBkYXRlT2JqKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uRGF0ZVRpbWUgZGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5NaW5WYWx1ZTsKLSAgICAgICAgICAgIGlmIChkYXRlT2JqIGlzIHN0cmluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYXRlID0gU3lzdGVtLkRhdGVUaW1lLlBhcnNlKGRhdGVPYmouVG9TdHJpbmcoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGQgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgICAgICBkYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZGF0ZTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lOworCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0ZVBhcnNpbmdGdW5jdGlvbiA6IEV4Y2VsRnVuY3Rpb24geworICBwcm90ZWN0ZWQgU3lzdGVtLkRhdGVUaW1lIFBhcnNlRGF0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIG9iamVjdCBkYXRlT2JqKSB7CisgICAgU3lzdGVtLkRhdGVUaW1lIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuTWluVmFsdWU7CisgICAgaWYgKGRhdGVPYmogaXMgc3RyaW5nKSB7CisgICAgICBkYXRlID0gU3lzdGVtLkRhdGVUaW1lLlBhcnNlKGRhdGVPYmouVG9TdHJpbmcoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBkID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgICBkYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZCk7CiAgICAgfQorICAgIHJldHVybiBkYXRlOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RhdGVTdHJpbmdQYXJzZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RhdGVTdHJpbmdQYXJzZXIuY3MKaW5kZXggMzMxMGQ2NC4uNzQ4NjBiZiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9EYXRlU3RyaW5nUGFyc2VyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRGF0ZVN0cmluZ1BhcnNlci5jcwpAQCAtNywyOSArNywyMiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCi17Ci0gICAgcHVibGljIGNsYXNzIERhdGVTdHJpbmdQYXJzZXIKLSAgICB7Ci0gICAgfQotfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lOworCitwdWJsaWMgY2xhc3MgRGF0ZVN0cmluZ1BhcnNlciB7fQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9EYXRlVmFsdWUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RhdGVWYWx1ZS5jcwppbmRleCAyODQwYzQ5Li4wYjVmMzcyIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RhdGVWYWx1ZS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RhdGVWYWx1ZS5jcwpAQCAtMSwzMiArMSwyNiBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Civvu791c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBEYXRlVmFsdWUgZnVuY3Rpb24sIGp1c3QgdXNpbmcgLk5FVCBidWlsdC1pbgotICAgIC8vLyBmdW5jdGlvbiBTeXN0ZW0uRGF0ZVRpbWUuVHJ5UGFyc2UsIGJhc2VkIG9uIGN1cnJlbnQgY3VsdHVyZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIERhdGVWYWx1ZSA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIGRhdGVTdHJpbmcgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgcmV0dXJuIEV4ZWN1dGUoZGF0ZVN0cmluZyk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZTsKIAotICAgICAgICBpbnRlcm5hbCBDb21waWxlUmVzdWx0IEV4ZWN1dGUoc3RyaW5nIGRhdGVTdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5EYXRlVGltZSByZXN1bHQ7Ci0gICAgICAgICAgICBTeXN0ZW0uRGF0ZVRpbWUuVHJ5UGFyc2UoZGF0ZVN0cmluZywgb3V0IHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICE9IFN5c3RlbS5EYXRlVGltZS5NaW5WYWx1ZSA/Ci0gICAgICAgICAgICAgICAgQ3JlYXRlUmVzdWx0KHJlc3VsdC5Ub09BRGF0ZSgpLCBEYXRhVHlwZS5EYXRlKSA6Ci0gICAgICAgICAgICAgICAgQ3JlYXRlUmVzdWx0KEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSksIERhdGFUeXBlLkV4Y2VsRXJyb3IpOwotICAgICAgICB9Ci0gICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBEYXRlVmFsdWUgZnVuY3Rpb24sIGp1c3QgdXNpbmcgLk5FVCBidWlsdC1pbgorLy8vIGZ1bmN0aW9uIFN5c3RlbS5EYXRlVGltZS5UcnlQYXJzZSwgYmFzZWQgb24gY3VycmVudCBjdWx0dXJlCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIERhdGVWYWx1ZSA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIGRhdGVTdHJpbmcgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApOworICAgIHJldHVybiBFeGVjdXRlKGRhdGVTdHJpbmcpOworICB9CisKKyAgaW50ZXJuYWwgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKHN0cmluZyBkYXRlU3RyaW5nKSB7CisgICAgU3lzdGVtLkRhdGVUaW1lIHJlc3VsdDsKKyAgICBTeXN0ZW0uRGF0ZVRpbWUuVHJ5UGFyc2UoZGF0ZVN0cmluZywgb3V0IHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdCAhPSBTeXN0ZW0uRGF0ZVRpbWUuTWluVmFsdWUKKyAgICAgICAgPyBDcmVhdGVSZXN1bHQocmVzdWx0LlRvT0FEYXRlKCksIERhdGFUeXBlLkRhdGUpCisgICAgICAgIDogQ3JlYXRlUmVzdWx0KEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSksIERhdGFUeXBlLkV4Y2VsRXJyb3IpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RheS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRGF5LmNzCmluZGV4IDQ4YmI0N2EuLmRjNGQzOWMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRGF5LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRGF5LmNzCkBAIC03LDM4ICs3LDM1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCi17Ci0gICAgcHVibGljIGNsYXNzIERheSA6IERhdGVQYXJzaW5nRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIGRhdGVPYmogPSBHZXRGaXJzdFZhbHVlKGFyZ3VtZW50cyk7Ci0gICAgICAgICAgICB2YXIgZGF0ZSA9IFBhcnNlRGF0ZShhcmd1bWVudHMsIGRhdGVPYmopOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lOwogCi0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGRhdGUuRGF5LCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgfQotICAgIH0KK3B1YmxpYyBjbGFzcyBEYXkgOiBEYXRlUGFyc2luZ0Z1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBkYXRlT2JqID0gR2V0Rmlyc3RWYWx1ZShhcmd1bWVudHMpOworICAgIHZhciBkYXRlID0gUGFyc2VEYXRlKGFyZ3VtZW50cywgZGF0ZU9iaik7CisKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGRhdGUuRGF5LCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9EYXlzMzYwLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9EYXlzMzYwLmNzCmluZGV4IDliM2I5YWMuLjIwODEwZWYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRGF5czM2MC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0RheXMzNjAuY3MKQEAgLTEsODEgKzEsNzcgQEAKLe+7v3VzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQotewotICAgIHB1YmxpYyBjbGFzcyBEYXlzMzYwIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBlbnVtIERheXMzNjBDYWxjdHlwZQotICAgICAgICB7Ci0gICAgICAgICAgICBFdXJvcGVhbiwKLSAgICAgICAgICAgIFVzCi0gICAgICAgIH0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgbnVtRGF0ZTEgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHZhciBudW1EYXRlMiA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIGR0MSA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKG51bURhdGUxKTsKLSAgICAgICAgICAgIHZhciBkdDIgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShudW1EYXRlMik7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWU7CiAKLSAgICAgICAgICAgIHZhciBjYWxjVHlwZSA9IERheXMzNjBDYWxjdHlwZS5VczsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA+IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGV1cm9wZWFuID0gQXJnVG9Cb29sKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICAgICAgaWYoZXVyb3BlYW4pIGNhbGNUeXBlID0gRGF5czM2MENhbGN0eXBlLkV1cm9wZWFuOwotICAgICAgICAgICAgfQorcHVibGljIGNsYXNzIERheXMzNjAgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHJpdmF0ZSBlbnVtIERheXMzNjBDYWxjdHlwZSB7CisgICAgRXVyb3BlYW4sCisgICAgVXMsCisgIH0KIAotICAgICAgICAgICAgdmFyIHN0YXJ0WWVhciA9IGR0MS5ZZWFyOwotICAgICAgICAgICAgdmFyIHN0YXJ0TW9udGggPSBkdDEuTW9udGg7Ci0gICAgICAgICAgICB2YXIgc3RhcnREYXkgPSBkdDEuRGF5OwotICAgICAgICAgICAgdmFyIGVuZFllYXIgPSBkdDIuWWVhcjsKLSAgICAgICAgICAgIHZhciBlbmRNb250aCA9IGR0Mi5Nb250aDsKLSAgICAgICAgICAgIHZhciBlbmREYXkgPSBkdDIuRGF5OworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgdmFyIG51bURhdGUxID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgdmFyIG51bURhdGUyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIGR0MSA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKG51bURhdGUxKTsKKyAgICB2YXIgZHQyID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUobnVtRGF0ZTIpOwogCi0gICAgICAgICAgICBpZiAoY2FsY1R5cGUgPT0gRGF5czM2MENhbGN0eXBlLkV1cm9wZWFuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzdGFydERheSA9PSAzMSkgc3RhcnREYXkgPSAzMDsKLSAgICAgICAgICAgICAgICBpZiAoZW5kRGF5ID09IDMxKSBlbmREYXkgPSAzMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgY2FsZW5kYXIgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICAgICAgICAgICAgICB2YXIgbkRheXNJbkZlYiA9IGNhbGVuZGFyLklzTGVhcFllYXIoZHQxLlllYXIpID8gMjkgOiAyODsKLSAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgaW52ZXN0bWVudCBpcyBFT00gYW5kIChEYXRlMSBpcyB0aGUgbGFzdCBkYXkgb2YgRmVicnVhcnkpIGFuZCAoRGF0ZTIgaXMgdGhlIGxhc3QgZGF5IG9mIEZlYnJ1YXJ5KSwgdGhlbiBjaGFuZ2UgRDIgdG8gMzAuCi0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0TW9udGggPT0gMiAmJiBzdGFydERheSA9PSBuRGF5c0luRmViICYmIGVuZE1vbnRoID09IDIgJiYgZW5kRGF5ID09IG5EYXlzSW5GZWIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBlbmREYXkgPSAzMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbnZlc3RtZW50IGlzIEVPTSBhbmQgKERhdGUxIGlzIHRoZSBsYXN0IGRheSBvZiBGZWJydWFyeSksIHRoZW4gY2hhbmdlIEQxIHRvIDMwLgotICAgICAgICAgICAgICAgIGlmIChzdGFydE1vbnRoID09IDIgJiYgc3RhcnREYXkgPT0gbkRheXNJbkZlYikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5ID0gMzA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAvLyBJZiBEMiBpcyAzMSBhbmQgRDEgaXMgMzAgb3IgMzEsIHRoZW4gY2hhbmdlIEQyIHRvIDMwLgotICAgICAgICAgICAgICAgIGlmIChlbmREYXkgPT0gMzEgJiYgKHN0YXJ0RGF5ID09IDMwIHx8IHN0YXJ0RGF5ID09IDMxKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZERheSA9IDMwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgLy8gSWYgRDEgaXMgMzEsIHRoZW4gY2hhbmdlIEQxIHRvIDMwLgotICAgICAgICAgICAgICAgIGlmIChzdGFydERheSA9PSAzMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5ID0gMzA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IChlbmRZZWFyKjEyKjMwICsgZW5kTW9udGgqMzAgKyBlbmREYXkpIC0gKHN0YXJ0WWVhcioxMiozMCArIHN0YXJ0TW9udGgqMzAgKyBzdGFydERheSk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBHZXROdW1XaG9sZU1vbnRocyhTeXN0ZW0uRGF0ZVRpbWUgZHQxLCBTeXN0ZW0uRGF0ZVRpbWUgZHQyKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc3RhcnREYXRlID0gbmV3IFN5c3RlbS5EYXRlVGltZShkdDEuWWVhciwgZHQxLk1vbnRoLCAxKS5BZGRNb250aHMoMSk7Ci0gICAgICAgICAgICB2YXIgZW5kRGF0ZSA9IG5ldyBTeXN0ZW0uRGF0ZVRpbWUoZHQyLlllYXIsIGR0Mi5Nb250aCwgMSk7Ci0gICAgICAgICAgICByZXR1cm4gKChlbmREYXRlLlllYXIgLSBzdGFydERhdGUuWWVhcikqMTIpICsgKGVuZERhdGUuTW9udGggLSBzdGFydERhdGUuTW9udGgpOwotICAgICAgICB9CisgICAgdmFyIGNhbGNUeXBlID0gRGF5czM2MENhbGN0eXBlLlVzOworICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA+IDIpIHsKKyAgICAgIHZhciBldXJvcGVhbiA9IEFyZ1RvQm9vbChhcmd1bWVudHMsIDIpOworICAgICAgaWYgKGV1cm9wZWFuKSB7CisgICAgICAgIGNhbGNUeXBlID0gRGF5czM2MENhbGN0eXBlLkV1cm9wZWFuOworICAgICAgfQogICAgIH0KKworICAgIHZhciBzdGFydFllYXIgPSBkdDEuWWVhcjsKKyAgICB2YXIgc3RhcnRNb250aCA9IGR0MS5Nb250aDsKKyAgICB2YXIgc3RhcnREYXkgPSBkdDEuRGF5OworICAgIHZhciBlbmRZZWFyID0gZHQyLlllYXI7CisgICAgdmFyIGVuZE1vbnRoID0gZHQyLk1vbnRoOworICAgIHZhciBlbmREYXkgPSBkdDIuRGF5OworCisgICAgaWYgKGNhbGNUeXBlID09IERheXMzNjBDYWxjdHlwZS5FdXJvcGVhbikgeworICAgICAgaWYgKHN0YXJ0RGF5ID09IDMxKSB7CisgICAgICAgIHN0YXJ0RGF5ID0gMzA7CisgICAgICB9CisgICAgICBpZiAoZW5kRGF5ID09IDMxKSB7CisgICAgICAgIGVuZERheSA9IDMwOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2YXIgY2FsZW5kYXIgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKKyAgICAgIHZhciBuRGF5c0luRmViID0gY2FsZW5kYXIuSXNMZWFwWWVhcihkdDEuWWVhcikgPyAyOSA6IDI4OworCisgICAgICAvLyBJZiB0aGUgaW52ZXN0bWVudCBpcyBFT00gYW5kIChEYXRlMSBpcyB0aGUgbGFzdCBkYXkgb2YgRmVicnVhcnkpIGFuZCAoRGF0ZTIgaXMgdGhlIGxhc3QgZGF5IG9mIEZlYnJ1YXJ5KSwgdGhlbiBjaGFuZ2UgRDIgdG8gMzAuCisgICAgICBpZiAoc3RhcnRNb250aCA9PSAyICYmIHN0YXJ0RGF5ID09IG5EYXlzSW5GZWIgJiYgZW5kTW9udGggPT0gMiAmJiBlbmREYXkgPT0gbkRheXNJbkZlYikgeworICAgICAgICBlbmREYXkgPSAzMDsKKyAgICAgIH0KKyAgICAgIC8vIElmIHRoZSBpbnZlc3RtZW50IGlzIEVPTSBhbmQgKERhdGUxIGlzIHRoZSBsYXN0IGRheSBvZiBGZWJydWFyeSksIHRoZW4gY2hhbmdlIEQxIHRvIDMwLgorICAgICAgaWYgKHN0YXJ0TW9udGggPT0gMiAmJiBzdGFydERheSA9PSBuRGF5c0luRmViKSB7CisgICAgICAgIHN0YXJ0RGF5ID0gMzA7CisgICAgICB9CisgICAgICAvLyBJZiBEMiBpcyAzMSBhbmQgRDEgaXMgMzAgb3IgMzEsIHRoZW4gY2hhbmdlIEQyIHRvIDMwLgorICAgICAgaWYgKGVuZERheSA9PSAzMSAmJiAoc3RhcnREYXkgPT0gMzAgfHwgc3RhcnREYXkgPT0gMzEpKSB7CisgICAgICAgIGVuZERheSA9IDMwOworICAgICAgfQorICAgICAgLy8gSWYgRDEgaXMgMzEsIHRoZW4gY2hhbmdlIEQxIHRvIDMwLgorICAgICAgaWYgKHN0YXJ0RGF5ID09IDMxKSB7CisgICAgICAgIHN0YXJ0RGF5ID0gMzA7CisgICAgICB9CisgICAgfQorICAgIHZhciByZXN1bHQgPQorICAgICAgICAoZW5kWWVhciAqIDEyICogMzAgKyBlbmRNb250aCAqIDMwICsgZW5kRGF5KQorICAgICAgICAgICAgLSAoc3RhcnRZZWFyICogMTIgKiAzMCArIHN0YXJ0TW9udGggKiAzMCArIHN0YXJ0RGF5KTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuSW50ZWdlcik7CisgIH0KKworICBwcml2YXRlIGludCBHZXROdW1XaG9sZU1vbnRocyhTeXN0ZW0uRGF0ZVRpbWUgZHQxLCBTeXN0ZW0uRGF0ZVRpbWUgZHQyKSB7CisgICAgdmFyIHN0YXJ0RGF0ZSA9IG5ldyBTeXN0ZW0uRGF0ZVRpbWUoZHQxLlllYXIsIGR0MS5Nb250aCwgMSkuQWRkTW9udGhzKDEpOworICAgIHZhciBlbmREYXRlID0gbmV3IFN5c3RlbS5EYXRlVGltZShkdDIuWWVhciwgZHQyLk1vbnRoLCAxKTsKKyAgICByZXR1cm4gKChlbmREYXRlLlllYXIgLSBzdGFydERhdGUuWWVhcikgKiAxMikgKyAoZW5kRGF0ZS5Nb250aCAtIHN0YXJ0RGF0ZS5Nb250aCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRWRhdGUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0VkYXRlLmNzCmluZGV4IGFkNmRhZTIuLjdhMWFmMTAgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRWRhdGUuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9FZGF0ZS5jcwpAQCAtMSwyMSArMSwxNyBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0Owor77u/dXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCi17Ci0gICAgcHVibGljIGNsYXNzIEVkYXRlIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMiwgZUVycm9yVHlwZS5WYWx1ZSk7Ci0gICAgICAgICAgICB2YXIgZGF0ZVNlcmlhbCA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgdmFyIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkYXRlU2VyaWFsKTsKLSAgICAgICAgICAgIHZhciBuTW9udGhzVG9BZGQgPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIHJlc3VsdERhdGUgPSBkYXRlLkFkZE1vbnRocyhuTW9udGhzVG9BZGQpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHREYXRlLlRvT0FEYXRlKCksIERhdGFUeXBlLkRhdGUpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lOworCitwdWJsaWMgY2xhc3MgRWRhdGUgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIsIGVFcnJvclR5cGUuVmFsdWUpOworICAgIHZhciBkYXRlU2VyaWFsID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgdmFyIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkYXRlU2VyaWFsKTsKKyAgICB2YXIgbk1vbnRoc1RvQWRkID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgcmVzdWx0RGF0ZSA9IGRhdGUuQWRkTW9udGhzKG5Nb250aHNUb0FkZCk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHREYXRlLlRvT0FEYXRlKCksIERhdGFUeXBlLkRhdGUpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0VvbW9udGguY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0VvbW9udGguY3MKaW5kZXggZjA1NmE5ZS4uMzM0NTRkYSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Fb21vbnRoLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvRW9tb250aC5jcwpAQCAtMSwyMCArMSwxOCBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0Owor77u/dXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCi17Ci0gICAgcHVibGljIGNsYXNzIEVvbW9udGggOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKLSAgICAgICAgICAgIHZhciBkYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCkpOwotICAgICAgICAgICAgdmFyIG1vbnRoc1RvQWRkID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciByZXN1bHREYXRlID0gbmV3IFN5c3RlbS5EYXRlVGltZShkYXRlLlllYXIsIGRhdGUuTW9udGgsIDEpLkFkZE1vbnRocyhtb250aHNUb0FkZCArIDEpLkFkZERheXMoLTEpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHREYXRlLlRvT0FEYXRlKCksIERhdGFUeXBlLkRhdGUpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lOworCitwdWJsaWMgY2xhc3MgRW9tb250aCA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgdmFyIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKSk7CisgICAgdmFyIG1vbnRoc1RvQWRkID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgcmVzdWx0RGF0ZSA9IG5ldyBTeXN0ZW0uRGF0ZVRpbWUoZGF0ZS5ZZWFyLCBkYXRlLk1vbnRoLCAxKQorICAgICAgICAuQWRkTW9udGhzKG1vbnRoc1RvQWRkICsgMSkKKyAgICAgICAgLkFkZERheXMoLTEpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0RGF0ZS5Ub09BRGF0ZSgpLCBEYXRhVHlwZS5EYXRlKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Ib3VyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Ib3VyLmNzCmluZGV4IDAyMTVhYTMuLjU1MDk4ODkgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvSG91ci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0hvdXIuY3MKQEAgLTEsNSArMSw0IEBACi3vu78KLS8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCivvu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKQEAgLTgsMzkgKzcsMzUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQotewotICAgIHB1YmxpYyBjbGFzcyBIb3VyIDogRGF0ZVBhcnNpbmdGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgZGF0ZU9iaiA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWU7Ci0gICAgICAgICAgICB2YXIgZGF0ZSA9IFBhcnNlRGF0ZShhcmd1bWVudHMsIGRhdGVPYmopOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChkYXRlLkhvdXIsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWU7CiAKLSAgICB9CitwdWJsaWMgY2xhc3MgSG91ciA6IERhdGVQYXJzaW5nRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIGRhdGVPYmogPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlOworICAgIHZhciBkYXRlID0gUGFyc2VEYXRlKGFyZ3VtZW50cywgZGF0ZU9iaik7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChkYXRlLkhvdXIsIERhdGFUeXBlLkludGVnZXIpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0lzb1dlZWtOdW0uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL0lzb1dlZWtOdW0uY3MKaW5kZXggZjQyNDgzZS4uNDViODM4YiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Jc29XZWVrTnVtLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvSXNvV2Vla051bS5jcwpAQCAtMSw1MCArMSw0NyBAQAog77u/dXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQotewotICAgIHB1YmxpYyBjbGFzcyBJc29XZWVrTnVtIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgZGF0ZUludCA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICB2YXIgZGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKGRhdGVJbnQpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChXZWVrTnVtYmVyKGRhdGUpLCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lOwogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoaXMgaW1wbGVtZW50YXRpb24gd2FzIGZvdW5kIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTI4NTE5MS9nZXQtd2Vlay1vZi1kYXRlLWZyb20tbGlucS1xdWVyeQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZyb21EYXRlIj48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwcml2YXRlIGludCBXZWVrTnVtYmVyKFN5c3RlbS5EYXRlVGltZSBmcm9tRGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gR2V0IGphbiAxc3Qgb2YgdGhlIHllYXIKLSAgICAgICAgICAgIHZhciBzdGFydE9mWWVhciA9IGZyb21EYXRlLkFkZERheXMoLWZyb21EYXRlLkRheSArIDEpLkFkZE1vbnRocygtZnJvbURhdGUuTW9udGggKyAxKTsKLSAgICAgICAgICAgIC8vIEdldCBkZWMgMzFzdCBvZiB0aGUgeWVhcgotICAgICAgICAgICAgdmFyIGVuZE9mWWVhciA9IHN0YXJ0T2ZZZWFyLkFkZFllYXJzKDEpLkFkZERheXMoLTEpOwotICAgICAgICAgICAgLy8gSVNPIDg2MDEgd2Vla3Mgc3RhcnQgd2l0aCBNb25kYXkKLSAgICAgICAgICAgIC8vIFRoZSBmaXJzdCB3ZWVrIG9mIGEgeWVhciBpbmNsdWRlcyB0aGUgZmlyc3QgVGh1cnNkYXkKLSAgICAgICAgICAgIC8vIERheU9mV2VlayByZXR1cm5zIDAgZm9yIHN1bmRheSB1cCB0byA2IGZvciBzYXRlcmRheQotICAgICAgICAgICAgaW50W10gaXNvODYwMUNvcnJlY3Rpb24gPSB7IDYsIDcsIDgsIDksIDEwLCA0LCA1IH07Ci0gICAgICAgICAgICBpbnQgbmRzID0gZnJvbURhdGUuU3VidHJhY3Qoc3RhcnRPZlllYXIpLkRheXMgKyBpc284NjAxQ29ycmVjdGlvblsoaW50KXN0YXJ0T2ZZZWFyLkRheU9mV2Vla107Ci0gICAgICAgICAgICBpbnQgd2sgPSBuZHMgLyA3OwotICAgICAgICAgICAgc3dpdGNoICh3aykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiB3ZWVrbnVtYmVyIG9mIGRlYyAzMXN0IG9mIHRoZSBwcmV2aW91cyB5ZWFyCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBXZWVrTnVtYmVyKHN0YXJ0T2ZZZWFyLkFkZERheXMoLTEpKTsKLSAgICAgICAgICAgICAgICBjYXNlIDUzOgotICAgICAgICAgICAgICAgICAgICAvLyBJZiBkZWMgMzFzdCBmYWxscyBiZWZvcmUgdGh1cnNkYXkgaXQgaXMgd2VlayAwMSBvZiBuZXh0IHllYXIKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVuZE9mWWVhci5EYXlPZldlZWsgPCBEYXlPZldlZWsuVGh1cnNkYXkpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiB3azsKLSAgICAgICAgICAgIH0KK3B1YmxpYyBjbGFzcyBJc29XZWVrTnVtIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgZGF0ZUludCA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMCk7CisgICAgdmFyIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkYXRlSW50KTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFdlZWtOdW1iZXIoZGF0ZSksIERhdGFUeXBlLkludGVnZXIpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiB3YXMgZm91bmQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMjg1MTkxL2dldC13ZWVrLW9mLWRhdGUtZnJvbS1saW5xLXF1ZXJ5CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iZnJvbURhdGUiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHByaXZhdGUgaW50IFdlZWtOdW1iZXIoU3lzdGVtLkRhdGVUaW1lIGZyb21EYXRlKSB7CisgICAgLy8gR2V0IGphbiAxc3Qgb2YgdGhlIHllYXIKKyAgICB2YXIgc3RhcnRPZlllYXIgPSBmcm9tRGF0ZS5BZGREYXlzKC1mcm9tRGF0ZS5EYXkgKyAxKS5BZGRNb250aHMoLWZyb21EYXRlLk1vbnRoICsgMSk7CisgICAgLy8gR2V0IGRlYyAzMXN0IG9mIHRoZSB5ZWFyCisgICAgdmFyIGVuZE9mWWVhciA9IHN0YXJ0T2ZZZWFyLkFkZFllYXJzKDEpLkFkZERheXMoLTEpOworICAgIC8vIElTTyA4NjAxIHdlZWtzIHN0YXJ0IHdpdGggTW9uZGF5CisgICAgLy8gVGhlIGZpcnN0IHdlZWsgb2YgYSB5ZWFyIGluY2x1ZGVzIHRoZSBmaXJzdCBUaHVyc2RheQorICAgIC8vIERheU9mV2VlayByZXR1cm5zIDAgZm9yIHN1bmRheSB1cCB0byA2IGZvciBzYXRlcmRheQorICAgIGludFtdIGlzbzg2MDFDb3JyZWN0aW9uID0geyA2LCA3LCA4LCA5LCAxMCwgNCwgNSB9OworICAgIGludCBuZHMgPSBmcm9tRGF0ZS5TdWJ0cmFjdChzdGFydE9mWWVhcikuRGF5cyArIGlzbzg2MDFDb3JyZWN0aW9uWyhpbnQpc3RhcnRPZlllYXIuRGF5T2ZXZWVrXTsKKyAgICBpbnQgd2sgPSBuZHMgLyA3OworICAgIHN3aXRjaCAod2spIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgLy8gUmV0dXJuIHdlZWtudW1iZXIgb2YgZGVjIDMxc3Qgb2YgdGhlIHByZXZpb3VzIHllYXIKKyAgICAgICAgcmV0dXJuIFdlZWtOdW1iZXIoc3RhcnRPZlllYXIuQWRkRGF5cygtMSkpOworICAgICAgY2FzZSA1MzoKKyAgICAgICAgLy8gSWYgZGVjIDMxc3QgZmFsbHMgYmVmb3JlIHRodXJzZGF5IGl0IGlzIHdlZWsgMDEgb2YgbmV4dCB5ZWFyCisgICAgICAgIGlmIChlbmRPZlllYXIuRGF5T2ZXZWVrIDwgRGF5T2ZXZWVrLlRodXJzZGF5KSB7CisgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIHdrOwogICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9NaW51dGUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL01pbnV0ZS5jcwppbmRleCA0Y2EzMzhkLi41NzQyNmQwIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL01pbnV0ZS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL01pbnV0ZS5jcwpAQCAtNyw0NiArNyw0MSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQotewotICAgIHB1YmxpYyBjbGFzcyBNaW51dGUgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBkYXRlT2JqID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZTsKLSAgICAgICAgICAgIFN5c3RlbS5EYXRlVGltZSBkYXRlID0gU3lzdGVtLkRhdGVUaW1lLk1pblZhbHVlOwotICAgICAgICAgICAgaWYgKGRhdGVPYmogaXMgc3RyaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuUGFyc2UoZGF0ZU9iai5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZCA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgICAgIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoZGF0ZS5NaW51dGUsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWU7CisKK3B1YmxpYyBjbGFzcyBNaW51dGUgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBkYXRlT2JqID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZTsKKyAgICBTeXN0ZW0uRGF0ZVRpbWUgZGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5NaW5WYWx1ZTsKKyAgICBpZiAoZGF0ZU9iaiBpcyBzdHJpbmcpIHsKKyAgICAgIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuUGFyc2UoZGF0ZU9iai5Ub1N0cmluZygpKTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIGQgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICAgIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkKTsKICAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChkYXRlLk1pbnV0ZSwgRGF0YVR5cGUuSW50ZWdlcik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvTW9udGguY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL01vbnRoLmNzCmluZGV4IDExMThiMGEuLmM2YWFiYTQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvTW9udGguY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Nb250aC5jcwpAQCAtNywzNyArNywzNSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQotewotICAgIHB1YmxpYyBjbGFzcyBNb250aCA6IERhdGVQYXJzaW5nRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIGRhdGVPYmogPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlOwotICAgICAgICAgICAgdmFyIGRhdGUgPSBQYXJzZURhdGUoYXJndW1lbnRzLCBkYXRlT2JqKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoZGF0ZS5Nb250aCwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWU7CisKK3B1YmxpYyBjbGFzcyBNb250aCA6IERhdGVQYXJzaW5nRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIGRhdGVPYmogPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlOworICAgIHZhciBkYXRlID0gUGFyc2VEYXRlKGFyZ3VtZW50cywgZGF0ZU9iaik7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChkYXRlLk1vbnRoLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9OZXR3b3JrZGF5cy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvTmV0d29ya2RheXMuY3MKaW5kZXggNzYyY2FiMy4uOTNlNDE5ZSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9OZXR3b3JrZGF5cy5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL05ldHdvcmtkYXlzLmNzCkBAIC0xLDI4ICsxLDI0IEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK++7v3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lLldvcmtkYXlzOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQotewotICAgIHB1YmxpYyBjbGFzcyBOZXR3b3JrZGF5cyA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25Bcmd1bWVudHMgPSBhcmd1bWVudHMgYXMgRnVuY3Rpb25Bcmd1bWVudFtdID8/IGFyZ3VtZW50cy5Ub0FycmF5KCk7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhmdW5jdGlvbkFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgc3RhcnREYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoQXJnVG9JbnQoZnVuY3Rpb25Bcmd1bWVudHMsIDApKTsKLSAgICAgICAgICAgIHZhciBlbmREYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoQXJnVG9JbnQoZnVuY3Rpb25Bcmd1bWVudHMsIDEpKTsKLSAgICAgICAgICAgIHZhciBjYWxjdWxhdG9yID0gbmV3IFdvcmtkYXlDYWxjdWxhdG9yKCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gY2FsY3VsYXRvci5DYWxjdWxhdGVOdW1iZXJPZldvcmtkYXlzKHN0YXJ0RGF0ZSwgZW5kRGF0ZSk7Ci0gICAgICAgICAgICBpZiAoZnVuY3Rpb25Bcmd1bWVudHMuTGVuZ3RoID4gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBjYWxjdWxhdG9yLlJlZHVjZVdvcmtkYXlzV2l0aEhvbGlkYXlzKHJlc3VsdCwgZnVuY3Rpb25Bcmd1bWVudHNbMl0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQocmVzdWx0Lk51bWJlck9mV29ya2RheXMsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWU7CisKK3B1YmxpYyBjbGFzcyBOZXR3b3JrZGF5cyA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHZhciBmdW5jdGlvbkFyZ3VtZW50cyA9IGFyZ3VtZW50cyBhcyBGdW5jdGlvbkFyZ3VtZW50W10gPz8gYXJndW1lbnRzLlRvQXJyYXkoKTsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhmdW5jdGlvbkFyZ3VtZW50cywgMik7CisgICAgdmFyIHN0YXJ0RGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKEFyZ1RvSW50KGZ1bmN0aW9uQXJndW1lbnRzLCAwKSk7CisgICAgdmFyIGVuZERhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShBcmdUb0ludChmdW5jdGlvbkFyZ3VtZW50cywgMSkpOworICAgIHZhciBjYWxjdWxhdG9yID0gbmV3IFdvcmtkYXlDYWxjdWxhdG9yKCk7CisgICAgdmFyIHJlc3VsdCA9IGNhbGN1bGF0b3IuQ2FsY3VsYXRlTnVtYmVyT2ZXb3JrZGF5cyhzdGFydERhdGUsIGVuZERhdGUpOworICAgIGlmIChmdW5jdGlvbkFyZ3VtZW50cy5MZW5ndGggPiAyKSB7CisgICAgICByZXN1bHQgPSBjYWxjdWxhdG9yLlJlZHVjZVdvcmtkYXlzV2l0aEhvbGlkYXlzKHJlc3VsdCwgZnVuY3Rpb25Bcmd1bWVudHNbMl0pOwogICAgIH0KKworICAgIHJldHVybiBuZXcocmVzdWx0Lk51bWJlck9mV29ya2RheXMsIERhdGFUeXBlLkludGVnZXIpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL05ldHdvcmtkYXlzSW50bC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvTmV0d29ya2RheXNJbnRsLmNzCmluZGV4IGFjMWM4MGMuLmUzZTE4OTEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvTmV0d29ya2RheXNJbnRsLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvTmV0d29ya2RheXNJbnRsLmNzCkBAIC0xLDQ2ICsxLDM3IEBACiDvu791c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZS5Xb3JrZGF5czsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKLXsKLSAgICBwdWJsaWMgY2xhc3MgTmV0d29ya2RheXNJbnRsIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvbkFyZ3VtZW50cyA9IGFyZ3VtZW50cyBhcyBGdW5jdGlvbkFyZ3VtZW50W10gPz8gYXJndW1lbnRzLlRvQXJyYXkoKTsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGZ1bmN0aW9uQXJndW1lbnRzLCAyKTsKLSAgICAgICAgICAgIHZhciBzdGFydERhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShBcmdUb0ludChmdW5jdGlvbkFyZ3VtZW50cywgMCkpOwotICAgICAgICAgICAgdmFyIGVuZERhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShBcmdUb0ludChmdW5jdGlvbkFyZ3VtZW50cywgMSkpOwotICAgICAgICAgICAgV29ya2RheUNhbGN1bGF0b3IgY2FsY3VsYXRvciA9IG5ldyBXb3JrZGF5Q2FsY3VsYXRvcigpOwotICAgICAgICAgICAgdmFyIHdlZWtkYXlGYWN0b3J5ID0gbmV3IEhvbGlkYXlXZWVrZGF5c0ZhY3RvcnkoKTsKLSAgICAgICAgICAgIGlmIChmdW5jdGlvbkFyZ3VtZW50cy5MZW5ndGggPiAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBob2xpZGF5QXJnID0gZnVuY3Rpb25Bcmd1bWVudHNbMl0uVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goaG9saWRheUFyZy5Ub1N0cmluZygpLCAiXlswMV17N30iKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0b3IgPSBuZXcgV29ya2RheUNhbGN1bGF0b3Iod2Vla2RheUZhY3RvcnkuQ3JlYXRlKGhvbGlkYXlBcmcuVG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChJc051bWVyaWMoaG9saWRheUFyZykpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgaG9saWRheUNvZGUgPSBDb252ZXJ0LlRvSW50MzIoaG9saWRheUFyZyk7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0b3IgPSBuZXcgV29ya2RheUNhbGN1bGF0b3Iod2Vla2RheUZhY3RvcnkuQ3JlYXRlKGhvbGlkYXlDb2RlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChlRXJyb3JUeXBlLlZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gY2FsY3VsYXRvci5DYWxjdWxhdGVOdW1iZXJPZldvcmtkYXlzKHN0YXJ0RGF0ZSwgZW5kRGF0ZSk7Ci0gICAgICAgICAgICBpZiAoZnVuY3Rpb25Bcmd1bWVudHMuTGVuZ3RoID4gMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBjYWxjdWxhdG9yLlJlZHVjZVdvcmtkYXlzV2l0aEhvbGlkYXlzKHJlc3VsdCwgZnVuY3Rpb25Bcmd1bWVudHNbM10pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KHJlc3VsdC5OdW1iZXJPZldvcmtkYXlzLCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lOworCitwdWJsaWMgY2xhc3MgTmV0d29ya2RheXNJbnRsIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgdmFyIGZ1bmN0aW9uQXJndW1lbnRzID0gYXJndW1lbnRzIGFzIEZ1bmN0aW9uQXJndW1lbnRbXSA/PyBhcmd1bWVudHMuVG9BcnJheSgpOworICAgIFZhbGlkYXRlQXJndW1lbnRzKGZ1bmN0aW9uQXJndW1lbnRzLCAyKTsKKyAgICB2YXIgc3RhcnREYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoQXJnVG9JbnQoZnVuY3Rpb25Bcmd1bWVudHMsIDApKTsKKyAgICB2YXIgZW5kRGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKEFyZ1RvSW50KGZ1bmN0aW9uQXJndW1lbnRzLCAxKSk7CisgICAgV29ya2RheUNhbGN1bGF0b3IgY2FsY3VsYXRvciA9IG5ldyBXb3JrZGF5Q2FsY3VsYXRvcigpOworICAgIHZhciB3ZWVrZGF5RmFjdG9yeSA9IG5ldyBIb2xpZGF5V2Vla2RheXNGYWN0b3J5KCk7CisgICAgaWYgKGZ1bmN0aW9uQXJndW1lbnRzLkxlbmd0aCA+IDIpIHsKKyAgICAgIHZhciBob2xpZGF5QXJnID0gZnVuY3Rpb25Bcmd1bWVudHNbMl0uVmFsdWU7CisgICAgICBpZiAoUmVnZXguSXNNYXRjaChob2xpZGF5QXJnLlRvU3RyaW5nKCksICJeWzAxXXs3fSIpKSB7CisgICAgICAgIGNhbGN1bGF0b3IgPSBuZXcod2Vla2RheUZhY3RvcnkuQ3JlYXRlKGhvbGlkYXlBcmcuVG9TdHJpbmcoKSkpOworICAgICAgfSBlbHNlIGlmIChJc051bWVyaWMoaG9saWRheUFyZykpIHsKKyAgICAgICAgdmFyIGhvbGlkYXlDb2RlID0gQ29udmVydC5Ub0ludDMyKGhvbGlkYXlBcmcpOworICAgICAgICBjYWxjdWxhdG9yID0gbmV3KHdlZWtkYXlGYWN0b3J5LkNyZWF0ZShob2xpZGF5Q29kZSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG5ldyhlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgIH0KICAgICB9CisgICAgdmFyIHJlc3VsdCA9IGNhbGN1bGF0b3IuQ2FsY3VsYXRlTnVtYmVyT2ZXb3JrZGF5cyhzdGFydERhdGUsIGVuZERhdGUpOworICAgIGlmIChmdW5jdGlvbkFyZ3VtZW50cy5MZW5ndGggPiAzKSB7CisgICAgICByZXN1bHQgPSBjYWxjdWxhdG9yLlJlZHVjZVdvcmtkYXlzV2l0aEhvbGlkYXlzKHJlc3VsdCwgZnVuY3Rpb25Bcmd1bWVudHNbM10pOworICAgIH0KKyAgICByZXR1cm4gbmV3KHJlc3VsdC5OdW1iZXJPZldvcmtkYXlzLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Ob3cuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL05vdy5jcwppbmRleCBiOTMwNDhlLi5iNGJkMTdkIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL05vdy5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL05vdy5jcwpAQCAtNywzNCArNywzMSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQotewotICAgIHB1YmxpYyBjbGFzcyBOb3cgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uRGF0ZVRpbWUuTm93LlRvT0FEYXRlKCksIERhdGFUeXBlLkRhdGUpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lOworCitwdWJsaWMgY2xhc3MgTm93IDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uRGF0ZVRpbWUuTm93LlRvT0FEYXRlKCksIERhdGFUeXBlLkRhdGUpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1NlY29uZC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvU2Vjb25kLmNzCmluZGV4IDEzN2VhMWQuLjQ0M2U5MTMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvU2Vjb25kLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvU2Vjb25kLmNzCkBAIC03LDM3ICs3LDM1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCi17Ci0gICAgcHVibGljIGNsYXNzIFNlY29uZCA6IERhdGVQYXJzaW5nRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIGRhdGVPYmogPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlOwotICAgICAgICAgICAgU3lzdGVtLkRhdGVUaW1lIGRhdGUgPSBQYXJzZURhdGUoYXJndW1lbnRzLCBkYXRlT2JqKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoZGF0ZS5TZWNvbmQsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lOworCitwdWJsaWMgY2xhc3MgU2Vjb25kIDogRGF0ZVBhcnNpbmdGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgZGF0ZU9iaiA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWU7CisgICAgU3lzdGVtLkRhdGVUaW1lIGRhdGUgPSBQYXJzZURhdGUoYXJndW1lbnRzLCBkYXRlT2JqKTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGRhdGUuU2Vjb25kLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9UaW1lLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9UaW1lLmNzCmluZGV4IGM3ODEzMTcuLmZiMTE0NGUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvVGltZS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1RpbWUuY3MKQEAgLTcsNTggKzcsNDggQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKLXsKLSAgICBwdWJsaWMgY2xhc3MgVGltZSA6IFRpbWVCYXNlRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBUaW1lKCkKLSAgICAgICAgICAgIDogYmFzZSgpCi0gICAgICAgIHsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZTsKIAotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgZmlyc3RBcmcgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZihhcmd1bWVudHMuQ291bnQoKSA9PSAxICYmIFRpbWVTdHJpbmdQYXJzZXIuQ2FuUGFyc2UoZmlyc3RBcmcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBUaW1lU3RyaW5nUGFyc2VyLlBhcnNlKGZpcnN0QXJnKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5UaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7Ci0gICAgICAgICAgICB2YXIgaG91ciA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICB2YXIgbWluID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBzZWMgPSBBcmdUb0ludChhcmd1bWVudHMsIDIpOwotCi0gICAgICAgICAgICBUaHJvd0FyZ3VtZW50RXhjZXB0aW9uSWYoKCkgPT4gc2VjIDwgMCB8fCBzZWMgPiA1OSwgIkludmFsaWQgc2Vjb25kOiAiICsgc2VjKTsKLSAgICAgICAgICAgIFRocm93QXJndW1lbnRFeGNlcHRpb25JZigoKSA9PiBtaW4gPCAwIHx8IG1pbiA+IDU5LCAiSW52YWxpZCBtaW51dGU6ICIgKyBtaW4pOwotICAgICAgICAgICAgVGhyb3dBcmd1bWVudEV4Y2VwdGlvbklmKCgpID0+IG1pbiA8IDAgfHwgaG91ciA+IDIzLCAiSW52YWxpZCBob3VyOiAiICsgaG91cik7Ci0KLQotICAgICAgICAgICAgdmFyIHNlY29uZHNPZlRoaXNUaW1lID0gKGRvdWJsZSkoaG91ciAqIDYwICogNjAgKyBtaW4gKiA2MCArIHNlYyk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KEdldFRpbWVTZXJpYWxOdW1iZXIoc2Vjb25kc09mVGhpc1RpbWUpLCBEYXRhVHlwZS5UaW1lKTsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIFRpbWUgOiBUaW1lQmFzZUZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBmaXJzdEFyZyA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWUuVG9TdHJpbmcoKTsKKyAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPT0gMSAmJiBUaW1lU3RyaW5nUGFyc2VyLkNhblBhcnNlKGZpcnN0QXJnKSkgeworICAgICAgdmFyIHJlc3VsdCA9IFRpbWVTdHJpbmdQYXJzZXIuUGFyc2UoZmlyc3RBcmcpOworICAgICAgcmV0dXJuIG5ldyhyZXN1bHQsIERhdGFUeXBlLlRpbWUpOwogICAgIH0KKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDMpOworICAgIHZhciBob3VyID0gQXJnVG9JbnQoYXJndW1lbnRzLCAwKTsKKyAgICB2YXIgbWluID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgc2VjID0gQXJnVG9JbnQoYXJndW1lbnRzLCAyKTsKKworICAgIFRocm93QXJndW1lbnRFeGNlcHRpb25JZigoKSA9PiBzZWMgPCAwIHx8IHNlYyA+IDU5LCAiSW52YWxpZCBzZWNvbmQ6ICIgKyBzZWMpOworICAgIFRocm93QXJndW1lbnRFeGNlcHRpb25JZigoKSA9PiBtaW4gPCAwIHx8IG1pbiA+IDU5LCAiSW52YWxpZCBtaW51dGU6ICIgKyBtaW4pOworICAgIFRocm93QXJndW1lbnRFeGNlcHRpb25JZigoKSA9PiBtaW4gPCAwIHx8IGhvdXIgPiAyMywgIkludmFsaWQgaG91cjogIiArIGhvdXIpOworCisgICAgdmFyIHNlY29uZHNPZlRoaXNUaW1lID0gKGRvdWJsZSkoaG91ciAqIDYwICogNjAgKyBtaW4gKiA2MCArIHNlYyk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChHZXRUaW1lU2VyaWFsTnVtYmVyKHNlY29uZHNPZlRoaXNUaW1lKSwgRGF0YVR5cGUuVGltZSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvVGltZUJhc2VGdW5jdGlvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvVGltZUJhc2VGdW5jdGlvbi5jcwppbmRleCA1OTM4MmQzLi44NzlmYzY0IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1RpbWVCYXNlRnVuY3Rpb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9UaW1lQmFzZUZ1bmN0aW9uLmNzCkBAIC03LDg1ICs3LDYyIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCi17Ci0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRpbWVCYXNlRnVuY3Rpb24gOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgVGltZUJhc2VGdW5jdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRpbWVTdHJpbmdQYXJzZXIgPSBuZXcgVGltZVN0cmluZ1BhcnNlcigpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWU7CiAKLSAgICAgICAgcHJvdGVjdGVkIFRpbWVTdHJpbmdQYXJzZXIgVGltZVN0cmluZ1BhcnNlcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBwcml2YXRlIHNldDsKLSAgICAgICAgfQorcHVibGljIGFic3RyYWN0IGNsYXNzIFRpbWVCYXNlRnVuY3Rpb24gOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIFRpbWVCYXNlRnVuY3Rpb24oKSB7CisgICAgVGltZVN0cmluZ1BhcnNlciA9IG5ldygpOworICB9CiAKLSAgICAgICAgcHJvdGVjdGVkIGRvdWJsZSBTZXJpYWxOdW1iZXIKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7Ci0gICAgICAgIH0KKyAgcHJvdGVjdGVkIFRpbWVTdHJpbmdQYXJzZXIgVGltZVN0cmluZ1BhcnNlciB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBWYWxpZGF0ZUFuZEluaXRTZXJpYWxOdW1iZXIoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgU2VyaWFsTnVtYmVyID0gKGRvdWJsZSlBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgfQorICBwcm90ZWN0ZWQgZG91YmxlIFNlcmlhbE51bWJlciB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KIAotICAgICAgICBwcm90ZWN0ZWQgZG91YmxlIFNlY29uZHNJbkFEYXkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0eyByZXR1cm4gMjQgKiA2MCAqIDYwOyB9Ci0gICAgICAgIH0KKyAgcHVibGljIHZvaWQgVmFsaWRhdGVBbmRJbml0U2VyaWFsTnVtYmVyKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cykgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgU2VyaWFsTnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgIH0KIAotICAgICAgICBwcm90ZWN0ZWQgZG91YmxlIEdldFRpbWVTZXJpYWxOdW1iZXIoZG91YmxlIHNlY29uZHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzZWNvbmRzIC8gU2Vjb25kc0luQURheTsKLSAgICAgICAgfQorICBwcm90ZWN0ZWQgZG91YmxlIFNlY29uZHNJbkFEYXkgPT4gMjQgKiA2MCAqIDYwOwogCi0gICAgICAgIHByb3RlY3RlZCBkb3VibGUgR2V0U2Vjb25kcyhkb3VibGUgc2VyaWFsTnVtYmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gc2VyaWFsTnVtYmVyICogU2Vjb25kc0luQURheTsKLSAgICAgICAgfQorICBwcm90ZWN0ZWQgZG91YmxlIEdldFRpbWVTZXJpYWxOdW1iZXIoZG91YmxlIHNlY29uZHMpIHsKKyAgICByZXR1cm4gc2Vjb25kcyAvIFNlY29uZHNJbkFEYXk7CisgIH0KIAotICAgICAgICBwcm90ZWN0ZWQgZG91YmxlIEdldEhvdXIoZG91YmxlIHNlcmlhbE51bWJlcikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHNlY29uZHMgPSBHZXRTZWNvbmRzKHNlcmlhbE51bWJlcik7Ci0gICAgICAgICAgICByZXR1cm4gKGludClzZWNvbmRzIC8gKDYwICogNjApOwotICAgICAgICB9CisgIHByb3RlY3RlZCBkb3VibGUgR2V0U2Vjb25kcyhkb3VibGUgc2VyaWFsTnVtYmVyKSB7CisgICAgcmV0dXJuIHNlcmlhbE51bWJlciAqIFNlY29uZHNJbkFEYXk7CisgIH0KIAotICAgICAgICBwcm90ZWN0ZWQgZG91YmxlIEdldE1pbnV0ZShkb3VibGUgc2VyaWFsTnVtYmVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc2Vjb25kcyA9IEdldFNlY29uZHMoc2VyaWFsTnVtYmVyKTsKLSAgICAgICAgICAgIHNlY29uZHMgLT0gR2V0SG91cihzZXJpYWxOdW1iZXIpICogNjAgKiA2MDsKLSAgICAgICAgICAgIHJldHVybiAoc2Vjb25kcyAtIChzZWNvbmRzICUgNjApKSAvIDYwOwotICAgICAgICB9CisgIHByb3RlY3RlZCBkb3VibGUgR2V0SG91cihkb3VibGUgc2VyaWFsTnVtYmVyKSB7CisgICAgdmFyIHNlY29uZHMgPSBHZXRTZWNvbmRzKHNlcmlhbE51bWJlcik7CisgICAgcmV0dXJuIChpbnQpc2Vjb25kcyAvICg2MCAqIDYwKTsKKyAgfQogCi0gICAgICAgIHByb3RlY3RlZCBkb3VibGUgR2V0U2Vjb25kKGRvdWJsZSBzZXJpYWxOdW1iZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBHZXRTZWNvbmRzKHNlcmlhbE51bWJlcikgJSA2MDsKLSAgICAgICAgfQotICAgIH0KKyAgcHJvdGVjdGVkIGRvdWJsZSBHZXRNaW51dGUoZG91YmxlIHNlcmlhbE51bWJlcikgeworICAgIHZhciBzZWNvbmRzID0gR2V0U2Vjb25kcyhzZXJpYWxOdW1iZXIpOworICAgIHNlY29uZHMgLT0gR2V0SG91cihzZXJpYWxOdW1iZXIpICogNjAgKiA2MDsKKyAgICByZXR1cm4gKHNlY29uZHMgLSAoc2Vjb25kcyAlIDYwKSkgLyA2MDsKKyAgfQorCisgIHByb3RlY3RlZCBkb3VibGUgR2V0U2Vjb25kKGRvdWJsZSBzZXJpYWxOdW1iZXIpIHsKKyAgICByZXR1cm4gR2V0U2Vjb25kcyhzZXJpYWxOdW1iZXIpICUgNjA7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvVGltZVN0cmluZ1BhcnNlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvVGltZVN0cmluZ1BhcnNlci5jcwppbmRleCBmOWMyMTNkLi40YTc2ZjZmIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1RpbWVTdHJpbmdQYXJzZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9UaW1lU3RyaW5nUGFyc2VyLmNzCkBAIC03LDEyMiArNywxMTEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCi17Ci0gICAgcHVibGljIGNsYXNzIFRpbWVTdHJpbmdQYXJzZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIFJlZ0V4MjQgPSBAIl5bMC05XXsxLDJ9KFw6WzAtOV17MSwyfSl7MCwyfSQiOwotICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBSZWdFeDEyID0gQCJeWzAtOV17MSwyfShcOlswLTldezEsMn0pezAsMn0oIFBNfCBBTSkkIjsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZTsKIAotICAgICAgICBwcml2YXRlIGRvdWJsZSBHZXRTZXJpYWxOdW1iZXIoaW50IGhvdXIsIGludCBtaW51dGUsIGludCBzZWNvbmQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzZWNvbmRzSW5BRGF5ID0gMjRkICogNjBkICogNjBkOwotICAgICAgICAgICAgcmV0dXJuICgoZG91YmxlKWhvdXIgKiA2MCAqIDYwICsgKGRvdWJsZSltaW51dGUgKiA2MCArIChkb3VibGUpc2Vjb25kKSAvIHNlY29uZHNJbkFEYXk7Ci0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBUaW1lU3RyaW5nUGFyc2VyIHsKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3JlZ0V4MjQgPSBAIl5bMC05XXsxLDJ9KFw6WzAtOV17MSwyfSl7MCwyfSQiOworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfcmVnRXgxMiA9IEAiXlswLTldezEsMn0oXDpbMC05XXsxLDJ9KXswLDJ9KCBQTXwgQU0pJCI7CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIFZhbGlkYXRlVmFsdWVzKGludCBob3VyLCBpbnQgbWludXRlLCBpbnQgc2Vjb25kKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2Vjb25kIDwgMCB8fCBzZWNvbmQgPiA1OSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJJbGxlZ2FsIHZhbHVlIGZvciBzZWNvbmQ6ICIgKyBzZWNvbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1pbnV0ZSA8IDAgfHwgbWludXRlID4gNTkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiSWxsZWdhbCB2YWx1ZSBmb3IgbWludXRlOiAiICsgbWludXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBwcml2YXRlIGRvdWJsZSBHZXRTZXJpYWxOdW1iZXIoaW50IGhvdXIsIGludCBtaW51dGUsIGludCBzZWNvbmQpIHsKKyAgICB2YXIgc2Vjb25kc0luQURheSA9IDI0ZCAqIDYwZCAqIDYwZDsKKyAgICByZXR1cm4gKChkb3VibGUpaG91ciAqIDYwICogNjAgKyAoZG91YmxlKW1pbnV0ZSAqIDYwICsgc2Vjb25kKSAvIHNlY29uZHNJbkFEYXk7CisgIH0KIAotICAgICAgICBwdWJsaWMgdmlydHVhbCBkb3VibGUgUGFyc2Uoc3RyaW5nIGlucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gSW50ZXJuYWxQYXJzZShpbnB1dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdmlydHVhbCBib29sIENhblBhcnNlKHN0cmluZyBpbnB1dCkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLkRhdGVUaW1lIGR0OwotICAgICAgICAgICAgcmV0dXJuIFJlZ2V4LklzTWF0Y2goaW5wdXQsIFJlZ0V4MjQpIHx8IFJlZ2V4LklzTWF0Y2goaW5wdXQsIFJlZ0V4MTIpIHx8IFN5c3RlbS5EYXRlVGltZS5UcnlQYXJzZShpbnB1dCwgb3V0IGR0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZG91YmxlIEludGVybmFsUGFyc2Uoc3RyaW5nIGlucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUmVnZXguSXNNYXRjaChpbnB1dCwgUmVnRXgyNCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlMjRIb3VyVGltZVN0cmluZyhpbnB1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoUmVnZXguSXNNYXRjaChpbnB1dCwgUmVnRXgxMikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlMTJIb3VyVGltZVN0cmluZyhpbnB1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTeXN0ZW0uRGF0ZVRpbWUgZGF0ZVRpbWU7Ci0gICAgICAgICAgICBpZiAoU3lzdGVtLkRhdGVUaW1lLlRyeVBhcnNlKGlucHV0LCBvdXQgZGF0ZVRpbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRTZXJpYWxOdW1iZXIoZGF0ZVRpbWUuSG91ciwgZGF0ZVRpbWUuTWludXRlLCBkYXRlVGltZS5TZWNvbmQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgUGFyc2UxMkhvdXJUaW1lU3RyaW5nKHN0cmluZyBpbnB1dCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGRheVBhcnQgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICBkYXlQYXJ0ID0gaW5wdXQuU3Vic3RyaW5nKGlucHV0Lkxlbmd0aCAtIDIsIDIpOwotICAgICAgICAgICAgaW50IGhvdXI7Ci0gICAgICAgICAgICBpbnQgbWludXRlOwotICAgICAgICAgICAgaW50IHNlY29uZDsKLSAgICAgICAgICAgIEdldFZhbHVlc0Zyb21TdHJpbmcoaW5wdXQsIG91dCBob3VyLCBvdXQgbWludXRlLCBvdXQgc2Vjb25kKTsKLSAgICAgICAgICAgIGlmIChkYXlQYXJ0ID09ICJQTSIpIGhvdXIgKz0gMTI7Ci0gICAgICAgICAgICBWYWxpZGF0ZVZhbHVlcyhob3VyLCBtaW51dGUsIHNlY29uZCk7Ci0gICAgICAgICAgICByZXR1cm4gR2V0U2VyaWFsTnVtYmVyKGhvdXIsIG1pbnV0ZSwgc2Vjb25kKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZG91YmxlIFBhcnNlMjRIb3VyVGltZVN0cmluZyhzdHJpbmcgaW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBob3VyOwotICAgICAgICAgICAgaW50IG1pbnV0ZTsKLSAgICAgICAgICAgIGludCBzZWNvbmQ7Ci0gICAgICAgICAgICBHZXRWYWx1ZXNGcm9tU3RyaW5nKGlucHV0LCBvdXQgaG91ciwgb3V0IG1pbnV0ZSwgb3V0IHNlY29uZCk7Ci0gICAgICAgICAgICBWYWxpZGF0ZVZhbHVlcyhob3VyLCBtaW51dGUsIHNlY29uZCk7Ci0gICAgICAgICAgICByZXR1cm4gR2V0U2VyaWFsTnVtYmVyKGhvdXIsIG1pbnV0ZSwgc2Vjb25kKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgR2V0VmFsdWVzRnJvbVN0cmluZyhzdHJpbmcgaW5wdXQsIG91dCBpbnQgaG91ciwgb3V0IGludCBtaW51dGUsIG91dCBpbnQgc2Vjb25kKQotICAgICAgICB7Ci0gICAgICAgICAgICBob3VyID0gMDsKLSAgICAgICAgICAgIG1pbnV0ZSA9IDA7Ci0gICAgICAgICAgICBzZWNvbmQgPSAwOwotCi0gICAgICAgICAgICB2YXIgaXRlbXMgPSBpbnB1dC5TcGxpdCgnOicpOwotICAgICAgICAgICAgaG91ciA9IGludC5QYXJzZShpdGVtc1swXSk7Ci0gICAgICAgICAgICBpZiAoaXRlbXMuTGVuZ3RoID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtaW51dGUgPSBpbnQuUGFyc2UoaXRlbXNbMV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGl0ZW1zLkxlbmd0aCA+IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHZhbCA9IGl0ZW1zWzJdOwotICAgICAgICAgICAgICAgIHZhbCA9IFJlZ2V4LlJlcGxhY2UodmFsLCAiW14wLTldKyQiLCBzdHJpbmcuRW1wdHkpOwotICAgICAgICAgICAgICAgIHNlY29uZCA9IGludC5QYXJzZSh2YWwpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHByaXZhdGUgdm9pZCBWYWxpZGF0ZVZhbHVlcyhpbnQgaG91ciwgaW50IG1pbnV0ZSwgaW50IHNlY29uZCkgeworICAgIGlmIChzZWNvbmQgPCAwIHx8IHNlY29uZCA+IDU5KSB7CisgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJJbGxlZ2FsIHZhbHVlIGZvciBzZWNvbmQ6ICIgKyBzZWNvbmQpOwogICAgIH0KKyAgICBpZiAobWludXRlIDwgMCB8fCBtaW51dGUgPiA1OSkgeworICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiSWxsZWdhbCB2YWx1ZSBmb3IgbWludXRlOiAiICsgbWludXRlKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdmlydHVhbCBkb3VibGUgUGFyc2Uoc3RyaW5nIGlucHV0KSB7CisgICAgcmV0dXJuIEludGVybmFsUGFyc2UoaW5wdXQpOworICB9CisKKyAgcHVibGljIHZpcnR1YWwgYm9vbCBDYW5QYXJzZShzdHJpbmcgaW5wdXQpIHsKKyAgICBTeXN0ZW0uRGF0ZVRpbWUgZHQ7CisgICAgcmV0dXJuIFJlZ2V4LklzTWF0Y2goaW5wdXQsIF9yZWdFeDI0KQorICAgICAgICB8fCBSZWdleC5Jc01hdGNoKGlucHV0LCBfcmVnRXgxMikKKyAgICAgICAgfHwgU3lzdGVtLkRhdGVUaW1lLlRyeVBhcnNlKGlucHV0LCBvdXQgZHQpOworICB9CisKKyAgcHJpdmF0ZSBkb3VibGUgSW50ZXJuYWxQYXJzZShzdHJpbmcgaW5wdXQpIHsKKyAgICBpZiAoUmVnZXguSXNNYXRjaChpbnB1dCwgX3JlZ0V4MjQpKSB7CisgICAgICByZXR1cm4gUGFyc2UyNEhvdXJUaW1lU3RyaW5nKGlucHV0KTsKKyAgICB9CisgICAgaWYgKFJlZ2V4LklzTWF0Y2goaW5wdXQsIF9yZWdFeDEyKSkgeworICAgICAgcmV0dXJuIFBhcnNlMTJIb3VyVGltZVN0cmluZyhpbnB1dCk7CisgICAgfQorICAgIFN5c3RlbS5EYXRlVGltZSBkYXRlVGltZTsKKyAgICBpZiAoU3lzdGVtLkRhdGVUaW1lLlRyeVBhcnNlKGlucHV0LCBvdXQgZGF0ZVRpbWUpKSB7CisgICAgICByZXR1cm4gR2V0U2VyaWFsTnVtYmVyKGRhdGVUaW1lLkhvdXIsIGRhdGVUaW1lLk1pbnV0ZSwgZGF0ZVRpbWUuU2Vjb25kKTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcHJpdmF0ZSBkb3VibGUgUGFyc2UxMkhvdXJUaW1lU3RyaW5nKHN0cmluZyBpbnB1dCkgeworICAgIHN0cmluZyBkYXlQYXJ0ID0gc3RyaW5nLkVtcHR5OworICAgIGRheVBhcnQgPSBpbnB1dC5TdWJzdHJpbmcoaW5wdXQuTGVuZ3RoIC0gMiwgMik7CisgICAgaW50IGhvdXI7CisgICAgaW50IG1pbnV0ZTsKKyAgICBpbnQgc2Vjb25kOworICAgIEdldFZhbHVlc0Zyb21TdHJpbmcoaW5wdXQsIG91dCBob3VyLCBvdXQgbWludXRlLCBvdXQgc2Vjb25kKTsKKyAgICBpZiAoZGF5UGFydCA9PSAiUE0iKSB7CisgICAgICBob3VyICs9IDEyOworICAgIH0KKyAgICBWYWxpZGF0ZVZhbHVlcyhob3VyLCBtaW51dGUsIHNlY29uZCk7CisgICAgcmV0dXJuIEdldFNlcmlhbE51bWJlcihob3VyLCBtaW51dGUsIHNlY29uZCk7CisgIH0KKworICBwcml2YXRlIGRvdWJsZSBQYXJzZTI0SG91clRpbWVTdHJpbmcoc3RyaW5nIGlucHV0KSB7CisgICAgaW50IGhvdXI7CisgICAgaW50IG1pbnV0ZTsKKyAgICBpbnQgc2Vjb25kOworICAgIEdldFZhbHVlc0Zyb21TdHJpbmcoaW5wdXQsIG91dCBob3VyLCBvdXQgbWludXRlLCBvdXQgc2Vjb25kKTsKKyAgICBWYWxpZGF0ZVZhbHVlcyhob3VyLCBtaW51dGUsIHNlY29uZCk7CisgICAgcmV0dXJuIEdldFNlcmlhbE51bWJlcihob3VyLCBtaW51dGUsIHNlY29uZCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIEdldFZhbHVlc0Zyb21TdHJpbmcoCisgICAgICBzdHJpbmcgaW5wdXQsCisgICAgICBvdXQgaW50IGhvdXIsCisgICAgICBvdXQgaW50IG1pbnV0ZSwKKyAgICAgIG91dCBpbnQgc2Vjb25kKSB7CisgICAgaG91ciA9IDA7CisgICAgbWludXRlID0gMDsKKyAgICBzZWNvbmQgPSAwOworCisgICAgdmFyIGl0ZW1zID0gaW5wdXQuU3BsaXQoJzonKTsKKyAgICBob3VyID0gaW50LlBhcnNlKGl0ZW1zWzBdKTsKKyAgICBpZiAoaXRlbXMuTGVuZ3RoID4gMSkgeworICAgICAgbWludXRlID0gaW50LlBhcnNlKGl0ZW1zWzFdKTsKKyAgICB9CisgICAgaWYgKGl0ZW1zLkxlbmd0aCA+IDIpIHsKKyAgICAgIHZhciB2YWwgPSBpdGVtc1syXTsKKyAgICAgIHZhbCA9IFJlZ2V4LlJlcGxhY2UodmFsLCAiW14wLTldKyQiLCBzdHJpbmcuRW1wdHkpOworICAgICAgc2Vjb25kID0gaW50LlBhcnNlKHZhbCk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1RpbWVWYWx1ZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvVGltZVZhbHVlLmNzCmluZGV4IDg5YTYwMTcuLmFjMjU5YjggMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvVGltZVZhbHVlLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvVGltZVZhbHVlLmNzCkBAIC0xLDM2ICsxLDMyIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Civvu791c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBUaW1lVmFsdWUgZnVuY3Rpb24sIGp1c3QgdXNpbmcgLk5FVCBidWlsdC1pbgotICAgIC8vLyBmdW5jdGlvbiBTeXN0ZW0uRGF0ZVRpbWUuVHJ5UGFyc2UsIGJhc2VkIG9uIGN1cnJlbnQgY3VsdHVyZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIFRpbWVWYWx1ZSA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIGRhdGVTdHJpbmcgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgcmV0dXJuIEV4ZWN1dGUoZGF0ZVN0cmluZyk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZTsKIAotICAgICAgICBpbnRlcm5hbCBDb21waWxlUmVzdWx0IEV4ZWN1dGUoc3RyaW5nIGRhdGVTdHJpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5EYXRlVGltZSByZXN1bHQ7Ci0gICAgICAgICAgICBTeXN0ZW0uRGF0ZVRpbWUuVHJ5UGFyc2UoZGF0ZVN0cmluZywgb3V0IHJlc3VsdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0ICE9IFN5c3RlbS5EYXRlVGltZS5NaW5WYWx1ZSA/Ci0gICAgICAgICAgICAgICAgQ3JlYXRlUmVzdWx0KEdldFRpbWVWYWx1ZShyZXN1bHQpLCBEYXRhVHlwZS5EYXRlKSA6Ci0gICAgICAgICAgICAgICAgQ3JlYXRlUmVzdWx0KEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSksIERhdGFUeXBlLkV4Y2VsRXJyb3IpOwotICAgICAgICB9CisvLy8gPHN1bW1hcnk+CisvLy8gU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIFRpbWVWYWx1ZSBmdW5jdGlvbiwganVzdCB1c2luZyAuTkVUIGJ1aWx0LWluCisvLy8gZnVuY3Rpb24gU3lzdGVtLkRhdGVUaW1lLlRyeVBhcnNlLCBiYXNlZCBvbiBjdXJyZW50IGN1bHR1cmUKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgVGltZVZhbHVlIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgZGF0ZVN0cmluZyA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7CisgICAgcmV0dXJuIEV4ZWN1dGUoZGF0ZVN0cmluZyk7CisgIH0KIAotICAgICAgICBwcml2YXRlIGRvdWJsZSBHZXRUaW1lVmFsdWUoU3lzdGVtLkRhdGVUaW1lIHJlc3VsdCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChpbnQpcmVzdWx0LlRpbWVPZkRheS5Ub3RhbFNlY29uZHMgPT0gMCA/IDBkIDogcmVzdWx0LlRpbWVPZkRheS5Ub3RhbFNlY29uZHMvICgzNjAwICogMjQpOwotICAgICAgICB9Ci0gICAgfQorICBpbnRlcm5hbCBDb21waWxlUmVzdWx0IEV4ZWN1dGUoc3RyaW5nIGRhdGVTdHJpbmcpIHsKKyAgICBTeXN0ZW0uRGF0ZVRpbWUgcmVzdWx0OworICAgIFN5c3RlbS5EYXRlVGltZS5UcnlQYXJzZShkYXRlU3RyaW5nLCBvdXQgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0ICE9IFN5c3RlbS5EYXRlVGltZS5NaW5WYWx1ZQorICAgICAgICA/IENyZWF0ZVJlc3VsdChHZXRUaW1lVmFsdWUocmVzdWx0KSwgRGF0YVR5cGUuRGF0ZSkKKyAgICAgICAgOiBDcmVhdGVSZXN1bHQoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7CisgIH0KKworICBwcml2YXRlIGRvdWJsZSBHZXRUaW1lVmFsdWUoU3lzdGVtLkRhdGVUaW1lIHJlc3VsdCkgeworICAgIHJldHVybiAoaW50KXJlc3VsdC5UaW1lT2ZEYXkuVG90YWxTZWNvbmRzID09IDAKKyAgICAgICAgPyAwZAorICAgICAgICA6IHJlc3VsdC5UaW1lT2ZEYXkuVG90YWxTZWNvbmRzIC8gKDM2MDAgKiAyNCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvVG9kYXkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1RvZGF5LmNzCmluZGV4IDE3MjdlNTEuLmU2ZmY0OGYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvVG9kYXkuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Ub2RheS5jcwpAQCAtNywzNCArNywzMSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQotewotICAgIHB1YmxpYyBjbGFzcyBUb2RheSA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5EYXRlVGltZS5Ub2RheS5Ub09BRGF0ZSgpLCBEYXRhVHlwZS5EYXRlKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZTsKKworcHVibGljIGNsYXNzIFRvZGF5IDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uRGF0ZVRpbWUuVG9kYXkuVG9PQURhdGUoKSwgRGF0YVR5cGUuRGF0ZSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV2Vla2RheS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV2Vla2RheS5jcwppbmRleCBmOWJhN2Q0Li41MzNjZTJhIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dlZWtkYXkuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9XZWVrZGF5LmNzCkBAIC03LDU4ICs3LDU2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCi17Ci0gICAgcHVibGljIGNsYXNzIFdlZWtkYXkgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBzZXJpYWxOdW1iZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHZhciByZXR1cm5UeXBlID0gYXJndW1lbnRzLkNvdW50KCkgPiAxID8gQXJnVG9JbnQoYXJndW1lbnRzLCAxKSA6IDE7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KENhbGN1bGF0ZURheU9mV2VlayhTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShzZXJpYWxOdW1iZXIpLCByZXR1cm5UeXBlKSwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZTsKIAotICAgICAgICBwcml2YXRlIHN0YXRpYyBMaXN0PGludD4gX29uZUJhc2VkU3RhcnRPblN1bmRheSA9IG5ldyBMaXN0PGludD4geyAxLCAyLCAzLCA0LCA1LCA2LCA3IH07Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIExpc3Q8aW50PiBfb25lQmFzZWRTdGFydE9uTW9uZGF5ID0gbmV3IExpc3Q8aW50PiB7IDcsIDEsIDIsIDMsIDQsIDUsIDYgfTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxpbnQ+IF96ZXJvQmFzZWRTdGFydE9uU3VuZGF5ID0gbmV3IExpc3Q8aW50PiB7IDYsIDAsIDEsIDIsIDMsIDQsIDUgfTsKK3B1YmxpYyBjbGFzcyBXZWVrZGF5IDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgc2VyaWFsTnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgdmFyIHJldHVyblR5cGUgPSBhcmd1bWVudHMuQ291bnQoKSA+IDEgPyBBcmdUb0ludChhcmd1bWVudHMsIDEpIDogMTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KAorICAgICAgICBDYWxjdWxhdGVEYXlPZldlZWsoU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoc2VyaWFsTnVtYmVyKSwgcmV0dXJuVHlwZSksCisgICAgICAgIERhdGFUeXBlLkludGVnZXIpOworICB9CiAKLSAgICAgICAgcHJpdmF0ZSBpbnQgQ2FsY3VsYXRlRGF5T2ZXZWVrKFN5c3RlbS5EYXRlVGltZSBkYXRlVGltZSwgaW50IHJldHVyblR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBkYXlJeCA9IChpbnQpZGF0ZVRpbWUuRGF5T2ZXZWVrOwotICAgICAgICAgICAgc3dpdGNoIChyZXR1cm5UeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vbmVCYXNlZFN0YXJ0T25TdW5kYXlbZGF5SXhdOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9vbmVCYXNlZFN0YXJ0T25Nb25kYXlbZGF5SXhdOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF96ZXJvQmFzZWRTdGFydE9uU3VuZGF5W2RheUl4XTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUuTnVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBwcml2YXRlIHN0YXRpYyBMaXN0PGludD4gX29uZUJhc2VkU3RhcnRPblN1bmRheSA9IG5ldygpIHsgMSwgMiwgMywgNCwgNSwgNiwgNyB9OworICBwcml2YXRlIHN0YXRpYyBMaXN0PGludD4gX29uZUJhc2VkU3RhcnRPbk1vbmRheSA9IG5ldygpIHsgNywgMSwgMiwgMywgNCwgNSwgNiB9OworICBwcml2YXRlIHN0YXRpYyBMaXN0PGludD4gX3plcm9CYXNlZFN0YXJ0T25TdW5kYXkgPSBuZXcoKSB7IDYsIDAsIDEsIDIsIDMsIDQsIDUgfTsKKworICBwcml2YXRlIGludCBDYWxjdWxhdGVEYXlPZldlZWsoU3lzdGVtLkRhdGVUaW1lIGRhdGVUaW1lLCBpbnQgcmV0dXJuVHlwZSkgeworICAgIHZhciBkYXlJeCA9IChpbnQpZGF0ZVRpbWUuRGF5T2ZXZWVrOworICAgIHN3aXRjaCAocmV0dXJuVHlwZSkgeworICAgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gX29uZUJhc2VkU3RhcnRPblN1bmRheVtkYXlJeF07CisgICAgICBjYXNlIDI6CisgICAgICAgIHJldHVybiBfb25lQmFzZWRTdGFydE9uTW9uZGF5W2RheUl4XTsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgcmV0dXJuIF96ZXJvQmFzZWRTdGFydE9uU3VuZGF5W2RheUl4XTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5OdW0pOwogICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9XZWVrbnVtLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9XZWVrbnVtLmNzCmluZGV4IDg0YjY2MjkuLmY1YzFiMDUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV2Vla251bS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dlZWtudW0uY3MKQEAgLTIsNjIgKzIsNTcgQEAKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQotewotICAgIHB1YmxpYyBjbGFzcyBXZWVrbnVtIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIEV4cHJlc3Npb25HcmFwaC5Db21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEsIGVFcnJvclR5cGUuVmFsdWUpOwotICAgICAgICAgICAgdmFyIGRhdGVTZXJpYWwgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHZhciBkYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZGF0ZVNlcmlhbCk7Ci0gICAgICAgICAgICB2YXIgc3RhcnREYXkgPSBEYXlPZldlZWsuU3VuZGF5OwotICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgYXJnU3RhcnREYXkgPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoYXJnU3RhcnREYXkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydERheSA9IERheU9mV2Vlay5TdW5kYXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXkgPSBEYXlPZldlZWsuTW9uZGF5OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydERheSA9IERheU9mV2Vlay5UdWVzZGF5OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydERheSA9IERheU9mV2Vlay5XZWRuZXNkYXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5ID0gRGF5T2ZXZWVrLlRodXJzZGF5OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydERheSA9IERheU9mV2Vlay5GcmlkYXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5ID0gRGF5T2ZXZWVrLlNhdHVyZGF5OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkIAotICAgICAgICAgICAgICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5OdW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKERhdGVUaW1lRm9ybWF0SW5mby5DdXJyZW50SW5mbyA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGV4ZWN1dGUgV2Vla251bSBmdW5jdGlvbiBiZWNhdXNlIERhdGVUaW1lRm9ybWF0SW5mby5DdXJyZW50SW5mbyB3YXMgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHdlZWsgPSBEYXRlVGltZUZvcm1hdEluZm8uQ3VycmVudEluZm8uQ2FsZW5kYXIuR2V0V2Vla09mWWVhcihkYXRlLCBDYWxlbmRhcldlZWtSdWxlLkZpcnN0RGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERheSk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHdlZWssIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZTsKKworcHVibGljIGNsYXNzIFdlZWtudW0gOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEsIGVFcnJvclR5cGUuVmFsdWUpOworICAgIHZhciBkYXRlU2VyaWFsID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgdmFyIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkYXRlU2VyaWFsKTsKKyAgICB2YXIgc3RhcnREYXkgPSBEYXlPZldlZWsuU3VuZGF5OworICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA+IDEpIHsKKyAgICAgIHZhciBhcmdTdGFydERheSA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CisgICAgICBzd2l0Y2ggKGFyZ1N0YXJ0RGF5KSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBzdGFydERheSA9IERheU9mV2Vlay5TdW5kYXk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgY2FzZSAxMToKKyAgICAgICAgICBzdGFydERheSA9IERheU9mV2Vlay5Nb25kYXk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgc3RhcnREYXkgPSBEYXlPZldlZWsuVHVlc2RheTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMzoKKyAgICAgICAgICBzdGFydERheSA9IERheU9mV2Vlay5XZWRuZXNkYXk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgc3RhcnREYXkgPSBEYXlPZldlZWsuVGh1cnNkYXk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgc3RhcnREYXkgPSBEYXlPZldlZWsuRnJpZGF5OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE2OgorICAgICAgICAgIHN0YXJ0RGF5ID0gRGF5T2ZXZWVrLlNhdHVyZGF5OworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIC8vIE5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLk51bSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgfQorICAgIGlmIChEYXRlVGltZUZvcm1hdEluZm8uQ3VycmVudEluZm8gPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgIkNvdWxkIG5vdCBleGVjdXRlIFdlZWtudW0gZnVuY3Rpb24gYmVjYXVzZSBEYXRlVGltZUZvcm1hdEluZm8uQ3VycmVudEluZm8gd2FzIG51bGwiKTsKKyAgICB9CisgICAgdmFyIHdlZWsgPSBEYXRlVGltZUZvcm1hdEluZm8uQ3VycmVudEluZm8uQ2FsZW5kYXIuR2V0V2Vla09mWWVhcigKKyAgICAgICAgZGF0ZSwKKyAgICAgICAgQ2FsZW5kYXJXZWVrUnVsZS5GaXJzdERheSwKKyAgICAgICAgc3RhcnREYXkpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQod2VlaywgRGF0YVR5cGUuSW50ZWdlcik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheS5jcwppbmRleCA0MjkxOTFlLi45NDdiYzNlIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dvcmtkYXkuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5LmNzCkBAIC0xLDg4ICsxLDc5IEBACiDvu791c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQotewotICAgIHB1YmxpYyBjbGFzcyBXb3JrZGF5IDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgc3RhcnREYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoQXJnVG9JbnQoYXJndW1lbnRzLCAwKSk7Ci0gICAgICAgICAgICB2YXIgbldvcmtEYXlzID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciByZXN1bHREYXRlID0gU3lzdGVtLkRhdGVUaW1lLk1pblZhbHVlOwotICAgICAgICAgICAgdmFyIHdvcmtkYXlzQ291bnRlZCA9IDA7Ci0gICAgICAgICAgICB2YXIgdG1wRGF0ZSA9IHN0YXJ0RGF0ZTsKLSAgICAgICAgICAgIC8vIGZpcnN0IG1vdmUgZm9yd2FyZCB0byB0aGUgZmlyc3QgbW9uZGF5Ci0gICAgICAgICAgICB3aGlsZSAodG1wRGF0ZS5EYXlPZldlZWsgIT0gRGF5T2ZXZWVrLk1vbmRheSAmJiAobldvcmtEYXlzIC0gd29ya2RheXNDb3VudGVkKSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFJc0hvbGlkYXkodG1wRGF0ZSkpIHdvcmtkYXlzQ291bnRlZCsrOwotICAgICAgICAgICAgICAgIHRtcERhdGUgPSB0bXBEYXRlLkFkZERheXMoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyB0aGVuIGNhbGN1bGF0ZSB3aG9sZSB3ZWVrcwotICAgICAgICAgICAgdmFyIG5XaG9sZVdlZWtzID0gKG5Xb3JrRGF5cyAtIHdvcmtkYXlzQ291bnRlZCkgLyA1OwotICAgICAgICAgICAgdG1wRGF0ZSA9IHRtcERhdGUuQWRkRGF5cyhuV2hvbGVXZWVrcyAqIDcpOwotICAgICAgICAgICAgd29ya2RheXNDb3VudGVkICs9IG5XaG9sZVdlZWtzICogNTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZTsKIAotICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSByZXN0Ci0gICAgICAgICAgICB3aGlsZSAod29ya2RheXNDb3VudGVkIDwgbldvcmtEYXlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcERhdGUgPSB0bXBEYXRlLkFkZERheXMoMSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFJc0hvbGlkYXkodG1wRGF0ZSkpIHdvcmtkYXlzQ291bnRlZCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0RGF0ZSA9IEFkanVzdFJlc3VsdFdpdGhIb2xpZGF5cyh0bXBEYXRlLCBhcmd1bWVudHMpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHREYXRlLlRvT0FEYXRlKCksIERhdGFUeXBlLkRhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTeXN0ZW0uRGF0ZVRpbWUgQWRqdXN0UmVzdWx0V2l0aEhvbGlkYXlzKFN5c3RlbS5EYXRlVGltZSByZXN1bHREYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPT0gMikgcmV0dXJuIHJlc3VsdERhdGU7Ci0gICAgICAgICAgICB2YXIgaG9saWRheXMgPSBhcmd1bWVudHMuRWxlbWVudEF0KDIpLlZhbHVlIGFzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+OwotICAgICAgICAgICAgaWYgKGhvbGlkYXlzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiBob2xpZGF5cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWMoYXJnLlZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVTZXJpYWwgPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShhcmcuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhvbGlkYXlEYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZGF0ZVNlcmlhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUlzSG9saWRheShob2xpZGF5RGF0ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RGF0ZSA9IHJlc3VsdERhdGUuQWRkRGF5cygxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBhcmd1bWVudHMuRWxlbWVudEF0KDIpLlZhbHVlIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87Ci0gICAgICAgICAgICAgICAgaWYgKHJhbmdlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiByYW5nZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbnZlcnRVdGlsLklzTnVtZXJpYyhjZWxsLlZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0ZVNlcmlhbCA9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGNlbGwuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBob2xpZGF5RGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKGRhdGVTZXJpYWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSXNIb2xpZGF5KGhvbGlkYXlEYXRlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdERhdGUgPSByZXN1bHREYXRlLkFkZERheXMoMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdERhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2wgSXNIb2xpZGF5KFN5c3RlbS5EYXRlVGltZSBkYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZGF0ZS5EYXlPZldlZWsgPT0gRGF5T2ZXZWVrLlNhdHVyZGF5IHx8IGRhdGUuRGF5T2ZXZWVrID09IERheU9mV2Vlay5TdW5kYXk7Ci0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBXb3JrZGF5IDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICB2YXIgc3RhcnREYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoQXJnVG9JbnQoYXJndW1lbnRzLCAwKSk7CisgICAgdmFyIG5Xb3JrRGF5cyA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CisgICAgdmFyIHJlc3VsdERhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuTWluVmFsdWU7CisgICAgdmFyIHdvcmtkYXlzQ291bnRlZCA9IDA7CisgICAgdmFyIHRtcERhdGUgPSBzdGFydERhdGU7CisgICAgLy8gZmlyc3QgbW92ZSBmb3J3YXJkIHRvIHRoZSBmaXJzdCBtb25kYXkKKyAgICB3aGlsZSAodG1wRGF0ZS5EYXlPZldlZWsgIT0gRGF5T2ZXZWVrLk1vbmRheSAmJiAobldvcmtEYXlzIC0gd29ya2RheXNDb3VudGVkKSA+IDApIHsKKyAgICAgIGlmICghSXNIb2xpZGF5KHRtcERhdGUpKSB7CisgICAgICAgIHdvcmtkYXlzQ291bnRlZCsrOworICAgICAgfQorICAgICAgdG1wRGF0ZSA9IHRtcERhdGUuQWRkRGF5cygxKTsKICAgICB9CisgICAgLy8gdGhlbiBjYWxjdWxhdGUgd2hvbGUgd2Vla3MKKyAgICB2YXIgbldob2xlV2Vla3MgPSAobldvcmtEYXlzIC0gd29ya2RheXNDb3VudGVkKSAvIDU7CisgICAgdG1wRGF0ZSA9IHRtcERhdGUuQWRkRGF5cyhuV2hvbGVXZWVrcyAqIDcpOworICAgIHdvcmtkYXlzQ291bnRlZCArPSBuV2hvbGVXZWVrcyAqIDU7CisKKyAgICAvLyBjYWxjdWxhdGUgdGhlIHJlc3QKKyAgICB3aGlsZSAod29ya2RheXNDb3VudGVkIDwgbldvcmtEYXlzKSB7CisgICAgICB0bXBEYXRlID0gdG1wRGF0ZS5BZGREYXlzKDEpOworICAgICAgaWYgKCFJc0hvbGlkYXkodG1wRGF0ZSkpIHsKKyAgICAgICAgd29ya2RheXNDb3VudGVkKys7CisgICAgICB9CisgICAgfQorICAgIHJlc3VsdERhdGUgPSBBZGp1c3RSZXN1bHRXaXRoSG9saWRheXModG1wRGF0ZSwgYXJndW1lbnRzKTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdERhdGUuVG9PQURhdGUoKSwgRGF0YVR5cGUuRGF0ZSk7CisgIH0KKworICBwcml2YXRlIFN5c3RlbS5EYXRlVGltZSBBZGp1c3RSZXN1bHRXaXRoSG9saWRheXMoCisgICAgICBTeXN0ZW0uRGF0ZVRpbWUgcmVzdWx0RGF0ZSwKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cykgeworICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA9PSAyKSB7CisgICAgICByZXR1cm4gcmVzdWx0RGF0ZTsKKyAgICB9CisgICAgdmFyIGhvbGlkYXlzID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZSBhcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PjsKKyAgICBpZiAoaG9saWRheXMgIT0gbnVsbCkgeworICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiBob2xpZGF5cykgeworICAgICAgICBpZiAoQ29udmVydFV0aWwuSXNOdW1lcmljKGFyZy5WYWx1ZSkpIHsKKyAgICAgICAgICB2YXIgZGF0ZVNlcmlhbCA9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZy5WYWx1ZSk7CisgICAgICAgICAgdmFyIGhvbGlkYXlEYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZGF0ZVNlcmlhbCk7CisgICAgICAgICAgaWYgKCFJc0hvbGlkYXkoaG9saWRheURhdGUpKSB7CisgICAgICAgICAgICByZXN1bHREYXRlID0gcmVzdWx0RGF0ZS5BZGREYXlzKDEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2YXIgcmFuZ2UgPSBhcmd1bWVudHMuRWxlbWVudEF0KDIpLlZhbHVlIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87CisgICAgICBpZiAocmFuZ2UgIT0gbnVsbCkgeworICAgICAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiByYW5nZSkgeworICAgICAgICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWMoY2VsbC5WYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhciBkYXRlU2VyaWFsID0gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoY2VsbC5WYWx1ZSk7CisgICAgICAgICAgICB2YXIgaG9saWRheURhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkYXRlU2VyaWFsKTsKKyAgICAgICAgICAgIGlmICghSXNIb2xpZGF5KGhvbGlkYXlEYXRlKSkgeworICAgICAgICAgICAgICByZXN1bHREYXRlID0gcmVzdWx0RGF0ZS5BZGREYXlzKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0RGF0ZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbCBJc0hvbGlkYXkoU3lzdGVtLkRhdGVUaW1lIGRhdGUpIHsKKyAgICByZXR1cm4gZGF0ZS5EYXlPZldlZWsgPT0gRGF5T2ZXZWVrLlNhdHVyZGF5IHx8IGRhdGUuRGF5T2ZXZWVrID09IERheU9mV2Vlay5TdW5kYXk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheXMvQWRkaXRpb25hbEhvbGlkYXlEYXlzLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9BZGRpdGlvbmFsSG9saWRheURheXMuY3MKaW5kZXggOWY4OWIzZS4uMzhiZDAyMSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9BZGRpdGlvbmFsSG9saWRheURheXMuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9BZGRpdGlvbmFsSG9saWRheURheXMuY3MKQEAgLTEsNDYgKzEsNDEgQEAKLe+7v3VzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZS5Xb3JrZGF5cwotewotICAgIHB1YmxpYyBjbGFzcyBBZGRpdGlvbmFsSG9saWRheURheXMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRnVuY3Rpb25Bcmd1bWVudCBfaG9saWRheUFyZzsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBMaXN0PFN5c3RlbS5EYXRlVGltZT4gX2hvbGlkYXlEYXRlcyA9IG5ldyBMaXN0PFN5c3RlbS5EYXRlVGltZT4oKTsgCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUuV29ya2RheXM7CiAKLSAgICAgICAgcHVibGljIEFkZGl0aW9uYWxIb2xpZGF5RGF5cyhGdW5jdGlvbkFyZ3VtZW50IGhvbGlkYXlBcmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9ob2xpZGF5QXJnID0gaG9saWRheUFyZzsKLSAgICAgICAgICAgIEluaXRpYWxpemUoKTsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIEFkZGl0aW9uYWxIb2xpZGF5RGF5cyB7CisgIHByaXZhdGUgcmVhZG9ubHkgRnVuY3Rpb25Bcmd1bWVudCBfaG9saWRheUFyZzsKKyAgcHJpdmF0ZSByZWFkb25seSBMaXN0PFN5c3RlbS5EYXRlVGltZT4gX2hvbGlkYXlEYXRlcyA9IG5ldygpOwogCi0gICAgICAgIHB1YmxpYyBJRW51bWVyYWJsZTxTeXN0ZW0uRGF0ZVRpbWU+IEFkZGl0aW9uYWxEYXRlcyA9PiBfaG9saWRheURhdGVzOworICBwdWJsaWMgQWRkaXRpb25hbEhvbGlkYXlEYXlzKEZ1bmN0aW9uQXJndW1lbnQgaG9saWRheUFyZykgeworICAgIF9ob2xpZGF5QXJnID0gaG9saWRheUFyZzsKKyAgICBJbml0aWFsaXplKCk7CisgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgSW5pdGlhbGl6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBob2xpZGF5cyA9IF9ob2xpZGF5QXJnLlZhbHVlIGFzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+OwotICAgICAgICAgICAgaWYgKGhvbGlkYXlzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGhvbGlkYXlEYXRlIGluIGZyb20gYXJnIGluIGhvbGlkYXlzIHdoZXJlIENvbnZlcnRVdGlsLklzTnVtZXJpYyhhcmcuVmFsdWUpIHNlbGVjdCBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShhcmcuVmFsdWUpIGludG8gZGF0ZVNlcmlhbCBzZWxlY3QgU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZGF0ZVNlcmlhbCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfaG9saWRheURhdGVzLkFkZChob2xpZGF5RGF0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHJhbmdlID0gX2hvbGlkYXlBcmcuVmFsdWUgYXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbzsKLSAgICAgICAgICAgIGlmIChyYW5nZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBob2xpZGF5RGF0ZSBpbiBmcm9tIGNlbGwgaW4gcmFuZ2Ugd2hlcmUgQ29udmVydFV0aWwuSXNOdW1lcmljKGNlbGwuVmFsdWUpIHNlbGVjdCBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShjZWxsLlZhbHVlKSBpbnRvIGRhdGVTZXJpYWwgc2VsZWN0IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKGRhdGVTZXJpYWwpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2hvbGlkYXlEYXRlcy5BZGQoaG9saWRheURhdGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWMoX2hvbGlkYXlBcmcuVmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9ob2xpZGF5RGF0ZXMuQWRkKFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKF9ob2xpZGF5QXJnLlZhbHVlKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHB1YmxpYyBJRW51bWVyYWJsZTxTeXN0ZW0uRGF0ZVRpbWU+IEFkZGl0aW9uYWxEYXRlcyA9PiBfaG9saWRheURhdGVzOworCisgIHByaXZhdGUgdm9pZCBJbml0aWFsaXplKCkgeworICAgIHZhciBob2xpZGF5cyA9IF9ob2xpZGF5QXJnLlZhbHVlIGFzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+OworICAgIGlmIChob2xpZGF5cyAhPSBudWxsKSB7CisgICAgICBmb3JlYWNoICh2YXIgaG9saWRheURhdGUgaW4gZnJvbSBhcmcgaW4gaG9saWRheXMKKyAgICAgICAgICB3aGVyZSBDb252ZXJ0VXRpbC5Jc051bWVyaWMoYXJnLlZhbHVlKQorICAgICAgICAgIHNlbGVjdCBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShhcmcuVmFsdWUpIGludG8gZGF0ZVNlcmlhbAorICAgICAgICAgIHNlbGVjdCBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkYXRlU2VyaWFsKSkgeworICAgICAgICBfaG9saWRheURhdGVzLkFkZChob2xpZGF5RGF0ZSk7CisgICAgICB9CiAgICAgfQorICAgIHZhciByYW5nZSA9IF9ob2xpZGF5QXJnLlZhbHVlIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87CisgICAgaWYgKHJhbmdlICE9IG51bGwpIHsKKyAgICAgIGZvcmVhY2ggKHZhciBob2xpZGF5RGF0ZSBpbiBmcm9tIGNlbGwgaW4gcmFuZ2UKKyAgICAgICAgICB3aGVyZSBDb252ZXJ0VXRpbC5Jc051bWVyaWMoY2VsbC5WYWx1ZSkKKyAgICAgICAgICBzZWxlY3QgQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoY2VsbC5WYWx1ZSkgaW50byBkYXRlU2VyaWFsCisgICAgICAgICAgc2VsZWN0IFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKGRhdGVTZXJpYWwpKSB7CisgICAgICAgIF9ob2xpZGF5RGF0ZXMuQWRkKGhvbGlkYXlEYXRlKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKENvbnZlcnRVdGlsLklzTnVtZXJpYyhfaG9saWRheUFyZy5WYWx1ZSkpIHsKKyAgICAgIF9ob2xpZGF5RGF0ZXMuQWRkKFN5c3RlbS5EYXRlVGltZS5Gcm9tT0FEYXRlKENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKF9ob2xpZGF5QXJnLlZhbHVlKSkpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9Ib2xpZGF5V2Vla2RheXMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dvcmtkYXlzL0hvbGlkYXlXZWVrZGF5cy5jcwppbmRleCBkZTE4Y2Q3Li4zZTg2NmIwIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dvcmtkYXlzL0hvbGlkYXlXZWVrZGF5cy5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dvcmtkYXlzL0hvbGlkYXlXZWVrZGF5cy5jcwpAQCAtMSw4NyArMSw3MCBAQAog77u/dXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lLldvcmtkYXlzCi17Ci0gICAgcHVibGljIGNsYXNzIEhvbGlkYXlXZWVrZGF5cwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBMaXN0PERheU9mV2Vlaz4gX2hvbGlkYXlEYXlzID0gbmV3IExpc3Q8RGF5T2ZXZWVrPigpOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lLldvcmtkYXlzOwogCi0gICAgICAgIHB1YmxpYyBIb2xpZGF5V2Vla2RheXMoKQotICAgICAgICAgICAgOnRoaXMoRGF5T2ZXZWVrLlNhdHVyZGF5LCBEYXlPZldlZWsuU3VuZGF5KQotICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQorcHVibGljIGNsYXNzIEhvbGlkYXlXZWVrZGF5cyB7CisgIHByaXZhdGUgcmVhZG9ubHkgTGlzdDxEYXlPZldlZWs+IF9ob2xpZGF5RGF5cyA9IG5ldygpOwogCi0gICAgICAgIHB1YmxpYyBpbnQgTnVtYmVyT2ZXb3JrZGF5c1BlcldlZWsgPT4gNyAtIF9ob2xpZGF5RGF5cy5Db3VudDsKKyAgcHVibGljIEhvbGlkYXlXZWVrZGF5cygpCisgICAgICA6IHRoaXMoRGF5T2ZXZWVrLlNhdHVyZGF5LCBEYXlPZldlZWsuU3VuZGF5KSB7fQogCi0gICAgICAgIHB1YmxpYyBIb2xpZGF5V2Vla2RheXMocGFyYW1zIERheU9mV2Vla1tdIGhvbGlkYXlEYXlzKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgZGF5T2ZXZWVrIGluIGhvbGlkYXlEYXlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9ob2xpZGF5RGF5cy5BZGQoZGF5T2ZXZWVrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBwdWJsaWMgaW50IE51bWJlck9mV29ya2RheXNQZXJXZWVrID0+IDcgLSBfaG9saWRheURheXMuQ291bnQ7CiAKLSAgICAgICAgcHVibGljIGJvb2wgSXNIb2xpZGF5V2Vla2RheShTeXN0ZW0uRGF0ZVRpbWUgZGF0ZVRpbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfaG9saWRheURheXMuQ29udGFpbnMoZGF0ZVRpbWUuRGF5T2ZXZWVrKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTeXN0ZW0uRGF0ZVRpbWUgQWRqdXN0UmVzdWx0V2l0aEhvbGlkYXlzKFN5c3RlbS5EYXRlVGltZSByZXN1bHREYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPT0gMikgcmV0dXJuIHJlc3VsdERhdGU7Ci0gICAgICAgICAgICB2YXIgaG9saWRheXMgPSBhcmd1bWVudHMuRWxlbWVudEF0KDIpLlZhbHVlIGFzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+OwotICAgICAgICAgICAgaWYgKGhvbGlkYXlzICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiBob2xpZGF5cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWMoYXJnLlZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVTZXJpYWwgPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShhcmcuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhvbGlkYXlEYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZGF0ZVNlcmlhbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUlzSG9saWRheVdlZWtkYXkoaG9saWRheURhdGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdERhdGUgPSByZXN1bHREYXRlLkFkZERheXMoMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZSBhcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvOwotICAgICAgICAgICAgICAgIGlmIChyYW5nZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gcmFuZ2UpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWMoY2VsbC5WYWx1ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGVTZXJpYWwgPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShjZWxsLlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaG9saWRheURhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkYXRlU2VyaWFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUlzSG9saWRheVdlZWtkYXkoaG9saWRheURhdGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RGF0ZSA9IHJlc3VsdERhdGUuQWRkRGF5cygxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0RGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTeXN0ZW0uRGF0ZVRpbWUgR2V0TmV4dFdvcmtkYXkoU3lzdGVtLkRhdGVUaW1lIGRhdGUsIFdvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbiBkaXJlY3Rpb24gPSBXb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24uRm9yd2FyZCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGNoYW5nZVBhcmFtID0gKGludClkaXJlY3Rpb247Ci0gICAgICAgICAgICB2YXIgdG1wRGF0ZSA9IGRhdGUuQWRkRGF5cyhjaGFuZ2VQYXJhbSk7Ci0gICAgICAgICAgICB3aGlsZSAoSXNIb2xpZGF5V2Vla2RheSh0bXBEYXRlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0bXBEYXRlID0gdG1wRGF0ZS5BZGREYXlzKGNoYW5nZVBhcmFtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0bXBEYXRlOwotICAgICAgICB9CisgIHB1YmxpYyBIb2xpZGF5V2Vla2RheXMocGFyYW1zIERheU9mV2Vla1tdIGhvbGlkYXlEYXlzKSB7CisgICAgZm9yZWFjaCAodmFyIGRheU9mV2VlayBpbiBob2xpZGF5RGF5cykgeworICAgICAgX2hvbGlkYXlEYXlzLkFkZChkYXlPZldlZWspOwogICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sIElzSG9saWRheVdlZWtkYXkoU3lzdGVtLkRhdGVUaW1lIGRhdGVUaW1lKSB7CisgICAgcmV0dXJuIF9ob2xpZGF5RGF5cy5Db250YWlucyhkYXRlVGltZS5EYXlPZldlZWspOworICB9CisKKyAgcHVibGljIFN5c3RlbS5EYXRlVGltZSBBZGp1c3RSZXN1bHRXaXRoSG9saWRheXMoCisgICAgICBTeXN0ZW0uRGF0ZVRpbWUgcmVzdWx0RGF0ZSwKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cykgeworICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA9PSAyKSB7CisgICAgICByZXR1cm4gcmVzdWx0RGF0ZTsKKyAgICB9CisgICAgdmFyIGhvbGlkYXlzID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZSBhcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PjsKKyAgICBpZiAoaG9saWRheXMgIT0gbnVsbCkgeworICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiBob2xpZGF5cykgeworICAgICAgICBpZiAoQ29udmVydFV0aWwuSXNOdW1lcmljKGFyZy5WYWx1ZSkpIHsKKyAgICAgICAgICB2YXIgZGF0ZVNlcmlhbCA9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZy5WYWx1ZSk7CisgICAgICAgICAgdmFyIGhvbGlkYXlEYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZGF0ZVNlcmlhbCk7CisgICAgICAgICAgaWYgKCFJc0hvbGlkYXlXZWVrZGF5KGhvbGlkYXlEYXRlKSkgeworICAgICAgICAgICAgcmVzdWx0RGF0ZSA9IHJlc3VsdERhdGUuQWRkRGF5cygxKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdmFyIHJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZSBhcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvOworICAgICAgaWYgKHJhbmdlICE9IG51bGwpIHsKKyAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gcmFuZ2UpIHsKKyAgICAgICAgICBpZiAoQ29udmVydFV0aWwuSXNOdW1lcmljKGNlbGwuVmFsdWUpKSB7CisgICAgICAgICAgICB2YXIgZGF0ZVNlcmlhbCA9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGNlbGwuVmFsdWUpOworICAgICAgICAgICAgdmFyIGhvbGlkYXlEYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZGF0ZVNlcmlhbCk7CisgICAgICAgICAgICBpZiAoIUlzSG9saWRheVdlZWtkYXkoaG9saWRheURhdGUpKSB7CisgICAgICAgICAgICAgIHJlc3VsdERhdGUgPSByZXN1bHREYXRlLkFkZERheXMoMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHREYXRlOworICB9CisKKyAgcHVibGljIFN5c3RlbS5EYXRlVGltZSBHZXROZXh0V29ya2RheSgKKyAgICAgIFN5c3RlbS5EYXRlVGltZSBkYXRlLAorICAgICAgV29ya2RheUNhbGN1bGF0aW9uRGlyZWN0aW9uIGRpcmVjdGlvbiA9IFdvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbi5Gb3J3YXJkKSB7CisgICAgdmFyIGNoYW5nZVBhcmFtID0gKGludClkaXJlY3Rpb247CisgICAgdmFyIHRtcERhdGUgPSBkYXRlLkFkZERheXMoY2hhbmdlUGFyYW0pOworICAgIHdoaWxlIChJc0hvbGlkYXlXZWVrZGF5KHRtcERhdGUpKSB7CisgICAgICB0bXBEYXRlID0gdG1wRGF0ZS5BZGREYXlzKGNoYW5nZVBhcmFtKTsKKyAgICB9CisgICAgcmV0dXJuIHRtcERhdGU7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheXMvSG9saWRheVdlZWtkYXlzRmFjdG9yeS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheXMvSG9saWRheVdlZWtkYXlzRmFjdG9yeS5jcwppbmRleCAyYTk0ZTBmLi5jZjE3OTYyIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dvcmtkYXlzL0hvbGlkYXlXZWVrZGF5c0ZhY3RvcnkuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9Ib2xpZGF5V2Vla2RheXNGYWN0b3J5LmNzCkBAIC0xLDc2ICsxLDY3IEBACi3vu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZS5Xb3JrZGF5cwotewotICAgIHB1YmxpYyBjbGFzcyBIb2xpZGF5V2Vla2RheXNGYWN0b3J5Ci0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERheU9mV2Vla1tdIF9kYXlPZldlZWtBcnJheSA9IG5ldyBEYXlPZldlZWtbXQotICAgICAgICB7Ci0gICAgICAgICAgICBEYXlPZldlZWsuTW9uZGF5LCAKLSAgICAgICAgICAgIERheU9mV2Vlay5UdWVzZGF5LCAKLSAgICAgICAgICAgIERheU9mV2Vlay5XZWRuZXNkYXksIAotICAgICAgICAgICAgRGF5T2ZXZWVrLlRodXJzZGF5LAotICAgICAgICAgICAgRGF5T2ZXZWVrLkZyaWRheSwgCi0gICAgICAgICAgICBEYXlPZldlZWsuU2F0dXJkYXksCi0gICAgICAgICAgICBEYXlPZldlZWsuU3VuZGF5Ci0gICAgICAgIH07CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWUuV29ya2RheXM7CiAKLSAgICAgICAgcHVibGljIEhvbGlkYXlXZWVrZGF5cyBDcmVhdGUoc3RyaW5nIHdlZWtkYXlzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihzdHJpbmcuSXNOdWxsT3JFbXB0eSh3ZWVrZGF5cykgfHwgd2Vla2RheXMuTGVuZ3RoICE9IDcpCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHdlZWtkYXkgc3RyaW5nIiwgbmFtZW9mKFdlZWtkYXkpKTsKK3B1YmxpYyBjbGFzcyBIb2xpZGF5V2Vla2RheXNGYWN0b3J5IHsKKyAgcHJpdmF0ZSByZWFkb25seSBEYXlPZldlZWtbXSBfZGF5T2ZXZWVrQXJyYXkgPSB7CisgICAgRGF5T2ZXZWVrLk1vbmRheSwKKyAgICBEYXlPZldlZWsuVHVlc2RheSwKKyAgICBEYXlPZldlZWsuV2VkbmVzZGF5LAorICAgIERheU9mV2Vlay5UaHVyc2RheSwKKyAgICBEYXlPZldlZWsuRnJpZGF5LAorICAgIERheU9mV2Vlay5TYXR1cmRheSwKKyAgICBEYXlPZldlZWsuU3VuZGF5LAorICB9OwogCi0gICAgICAgICAgICB2YXIgcmV0VmFsID0gbmV3IExpc3Q8RGF5T2ZXZWVrPigpOwotICAgICAgICAgICAgdmFyIGFyciA9IHdlZWtkYXlzLlRvQ2hhckFycmF5KCk7Ci0gICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpIDwgYXJyLkxlbmd0aDtpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGNoID0gYXJyW2ldOwotICAgICAgICAgICAgICAgIGlmIChjaCA9PSAnMScpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXRWYWwuQWRkKF9kYXlPZldlZWtBcnJheVtpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBIb2xpZGF5V2Vla2RheXMocmV0VmFsLlRvQXJyYXkoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSG9saWRheVdlZWtkYXlzIENyZWF0ZShpbnQgY29kZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChjb2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIb2xpZGF5V2Vla2RheXMoRGF5T2ZXZWVrLlNhdHVyZGF5LCBEYXlPZldlZWsuU3VuZGF5KTsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSG9saWRheVdlZWtkYXlzKERheU9mV2Vlay5TdW5kYXksIERheU9mV2Vlay5Nb25kYXkpOwotICAgICAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIb2xpZGF5V2Vla2RheXMoRGF5T2ZXZWVrLk1vbmRheSwgRGF5T2ZXZWVrLlR1ZXNkYXkpOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIb2xpZGF5V2Vla2RheXMoRGF5T2ZXZWVrLlR1ZXNkYXksIERheU9mV2Vlay5XZWRuZXNkYXkpOwotICAgICAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIb2xpZGF5V2Vla2RheXMoRGF5T2ZXZWVrLldlZG5lc2RheSwgRGF5T2ZXZWVrLlRodXJzZGF5KTsKLSAgICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSG9saWRheVdlZWtkYXlzKERheU9mV2Vlay5UaHVyc2RheSwgRGF5T2ZXZWVrLkZyaWRheSk7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhvbGlkYXlXZWVrZGF5cyhEYXlPZldlZWsuRnJpZGF5LCBEYXlPZldlZWsuU2F0dXJkYXkpOwotICAgICAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSG9saWRheVdlZWtkYXlzKERheU9mV2Vlay5TdW5kYXkpOwotICAgICAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSG9saWRheVdlZWtkYXlzKERheU9mV2Vlay5Nb25kYXkpOwotICAgICAgICAgICAgICAgIGNhc2UgMTM6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSG9saWRheVdlZWtkYXlzKERheU9mV2Vlay5UdWVzZGF5KTsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhvbGlkYXlXZWVrZGF5cyhEYXlPZldlZWsuV2VkbmVzZGF5KTsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhvbGlkYXlXZWVrZGF5cyhEYXlPZldlZWsuVGh1cnNkYXkpOwotICAgICAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSG9saWRheVdlZWtkYXlzKERheU9mV2Vlay5GcmlkYXkpOwotICAgICAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSG9saWRheVdlZWtkYXlzKERheU9mV2Vlay5TYXR1cmRheSk7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGNvZGUgc3VwcGxpZWQgdG8gSG9saWRheVdlZWtkYXlzRmFjdG9yeTogIiArIGNvZGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHB1YmxpYyBIb2xpZGF5V2Vla2RheXMgQ3JlYXRlKHN0cmluZyB3ZWVrZGF5cykgeworICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh3ZWVrZGF5cykgfHwgd2Vla2RheXMuTGVuZ3RoICE9IDcpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCB3ZWVrZGF5IHN0cmluZyIsIG5hbWVvZihXZWVrZGF5KSk7CiAgICAgfQorCisgICAgdmFyIHJldFZhbCA9IG5ldyBMaXN0PERheU9mV2Vlaz4oKTsKKyAgICB2YXIgYXJyID0gd2Vla2RheXMuVG9DaGFyQXJyYXkoKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5MZW5ndGg7IGkrKykgeworICAgICAgdmFyIGNoID0gYXJyW2ldOworICAgICAgaWYgKGNoID09ICcxJykgeworICAgICAgICByZXRWYWwuQWRkKF9kYXlPZldlZWtBcnJheVtpXSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXcocmV0VmFsLlRvQXJyYXkoKSk7CisgIH0KKworICBwdWJsaWMgSG9saWRheVdlZWtkYXlzIENyZWF0ZShpbnQgY29kZSkgeworICAgIHN3aXRjaCAoY29kZSkgeworICAgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gbmV3KERheU9mV2Vlay5TYXR1cmRheSwgRGF5T2ZXZWVrLlN1bmRheSk7CisgICAgICBjYXNlIDI6CisgICAgICAgIHJldHVybiBuZXcoRGF5T2ZXZWVrLlN1bmRheSwgRGF5T2ZXZWVrLk1vbmRheSk7CisgICAgICBjYXNlIDM6CisgICAgICAgIHJldHVybiBuZXcoRGF5T2ZXZWVrLk1vbmRheSwgRGF5T2ZXZWVrLlR1ZXNkYXkpOworICAgICAgY2FzZSA0OgorICAgICAgICByZXR1cm4gbmV3KERheU9mV2Vlay5UdWVzZGF5LCBEYXlPZldlZWsuV2VkbmVzZGF5KTsKKyAgICAgIGNhc2UgNToKKyAgICAgICAgcmV0dXJuIG5ldyhEYXlPZldlZWsuV2VkbmVzZGF5LCBEYXlPZldlZWsuVGh1cnNkYXkpOworICAgICAgY2FzZSA2OgorICAgICAgICByZXR1cm4gbmV3KERheU9mV2Vlay5UaHVyc2RheSwgRGF5T2ZXZWVrLkZyaWRheSk7CisgICAgICBjYXNlIDc6CisgICAgICAgIHJldHVybiBuZXcoRGF5T2ZXZWVrLkZyaWRheSwgRGF5T2ZXZWVrLlNhdHVyZGF5KTsKKyAgICAgIGNhc2UgMTE6CisgICAgICAgIHJldHVybiBuZXcoRGF5T2ZXZWVrLlN1bmRheSk7CisgICAgICBjYXNlIDEyOgorICAgICAgICByZXR1cm4gbmV3KERheU9mV2Vlay5Nb25kYXkpOworICAgICAgY2FzZSAxMzoKKyAgICAgICAgcmV0dXJuIG5ldyhEYXlPZldlZWsuVHVlc2RheSk7CisgICAgICBjYXNlIDE0OgorICAgICAgICByZXR1cm4gbmV3KERheU9mV2Vlay5XZWRuZXNkYXkpOworICAgICAgY2FzZSAxNToKKyAgICAgICAgcmV0dXJuIG5ldyhEYXlPZldlZWsuVGh1cnNkYXkpOworICAgICAgY2FzZSAxNjoKKyAgICAgICAgcmV0dXJuIG5ldyhEYXlPZldlZWsuRnJpZGF5KTsKKyAgICAgIGNhc2UgMTc6CisgICAgICAgIHJldHVybiBuZXcoRGF5T2ZXZWVrLlNhdHVyZGF5KTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBjb2RlIHN1cHBsaWVkIHRvIEhvbGlkYXlXZWVrZGF5c0ZhY3Rvcnk6ICIgKyBjb2RlKTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheXMvV29ya2RheUNhbGN1bGF0aW9uRGlyZWN0aW9uLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9Xb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24uY3MKaW5kZXggZWUxMGI2NS4uYzBmNTZiNCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9Xb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9Xb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24uY3MKQEAgLTEsMTQgKzEsNiBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkNvbXBpbGVyU2VydmljZXM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK++7v25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZS5Xb3JrZGF5czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lLldvcmtkYXlzCi17Ci0gICAgcHVibGljIGVudW0gV29ya2RheUNhbGN1bGF0aW9uRGlyZWN0aW9uCi0gICAgewotICAgICAgICBGb3J3YXJkID0gMSwKLSAgICAgICAgQmFja3dhcmQgPSAtMQotICAgIH0KK3B1YmxpYyBlbnVtIFdvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbiB7CisgIEZvcndhcmQgPSAxLAorICBCYWNrd2FyZCA9IC0xLAogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9Xb3JrZGF5Q2FsY3VsYXRvci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheXMvV29ya2RheUNhbGN1bGF0b3IuY3MKaW5kZXggY2JmZjU1Ni4uZTA5ZTdiYSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9Xb3JrZGF5Q2FsY3VsYXRvci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dvcmtkYXlzL1dvcmtkYXlDYWxjdWxhdG9yLmNzCkBAIC0xLDEyOCArMSwxMjMgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5OwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZS5Xb3JrZGF5czsKLXVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZS5Xb3JrZGF5cwotewotICAgIHB1YmxpYyBjbGFzcyBXb3JrZGF5Q2FsY3VsYXRvcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBIb2xpZGF5V2Vla2RheXMgX2hvbGlkYXlXZWVrZGF5czsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZS5Xb3JrZGF5czsKIAotICAgICAgICBwdWJsaWMgV29ya2RheUNhbGN1bGF0b3IoKQotICAgICAgICAgICAgOiB0aGlzKG5ldyBIb2xpZGF5V2Vla2RheXMoKSkKLSAgICAgICAge30KK3B1YmxpYyBjbGFzcyBXb3JrZGF5Q2FsY3VsYXRvciB7CisgIHByaXZhdGUgcmVhZG9ubHkgSG9saWRheVdlZWtkYXlzIF9ob2xpZGF5V2Vla2RheXM7CiAKLSAgICAgICAgcHVibGljIFdvcmtkYXlDYWxjdWxhdG9yKEhvbGlkYXlXZWVrZGF5cyBob2xpZGF5V2Vla2RheXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9ob2xpZGF5V2Vla2RheXMgPSBob2xpZGF5V2Vla2RheXM7Ci0gICAgICAgIH0KKyAgcHVibGljIFdvcmtkYXlDYWxjdWxhdG9yKCkKKyAgICAgIDogdGhpcyhuZXcoKSkge30KIAotICAgICAgICBwdWJsaWMgV29ya2RheUNhbGN1bGF0b3JSZXN1bHQgQ2FsY3VsYXRlTnVtYmVyT2ZXb3JrZGF5cyhTeXN0ZW0uRGF0ZVRpbWUgc3RhcnREYXRlLCBTeXN0ZW0uRGF0ZVRpbWUgZW5kRGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGNhbGNEaXJlY3Rpb24gPSBzdGFydERhdGUgPCBlbmREYXRlCi0gICAgICAgICAgICAgICAgPyBXb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24uRm9yd2FyZAotICAgICAgICAgICAgICAgIDogV29ya2RheUNhbGN1bGF0aW9uRGlyZWN0aW9uLkJhY2t3YXJkOwotICAgICAgICAgICAgU3lzdGVtLkRhdGVUaW1lIGNhbGNTdGFydERhdGU7Ci0gICAgICAgICAgICBTeXN0ZW0uRGF0ZVRpbWUgY2FsY0VuZERhdGU7Ci0gICAgICAgICAgICBpZiAoY2FsY0RpcmVjdGlvbiA9PSBXb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24uRm9yd2FyZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYWxjU3RhcnREYXRlID0gc3RhcnREYXRlLkRhdGU7Ci0gICAgICAgICAgICAgICAgY2FsY0VuZERhdGUgPSBlbmREYXRlLkRhdGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FsY1N0YXJ0RGF0ZSA9IGVuZERhdGUuRGF0ZTsKLSAgICAgICAgICAgICAgICBjYWxjRW5kRGF0ZSA9IHN0YXJ0RGF0ZS5EYXRlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIG5XaG9sZVdlZWtzID0gKGludCljYWxjRW5kRGF0ZS5TdWJ0cmFjdChjYWxjU3RhcnREYXRlKS5Ub3RhbERheXMvNzsKLSAgICAgICAgICAgIHZhciB3b3JrZGF5c0NvdW50ZWQgPSBuV2hvbGVXZWVrcypfaG9saWRheVdlZWtkYXlzLk51bWJlck9mV29ya2RheXNQZXJXZWVrOwotICAgICAgICAgICAgaWYgKCFfaG9saWRheVdlZWtkYXlzLklzSG9saWRheVdlZWtkYXkoY2FsY1N0YXJ0RGF0ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd29ya2RheXNDb3VudGVkKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgdG1wRGF0ZSA9IGNhbGNTdGFydERhdGUuQWRkRGF5cyhuV2hvbGVXZWVrcyo3KTsKLSAgICAgICAgICAgIHdoaWxlICh0bXBEYXRlIDwgY2FsY0VuZERhdGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG1wRGF0ZSA9IHRtcERhdGUuQWRkRGF5cygxKTsKLSAgICAgICAgICAgICAgICBpZiAoIV9ob2xpZGF5V2Vla2RheXMuSXNIb2xpZGF5V2Vla2RheSh0bXBEYXRlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdvcmtkYXlzQ291bnRlZCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgV29ya2RheUNhbGN1bGF0b3JSZXN1bHQod29ya2RheXNDb3VudGVkLCBzdGFydERhdGUsIGVuZERhdGUsIGNhbGNEaXJlY3Rpb24pOwotICAgICAgICB9CisgIHB1YmxpYyBXb3JrZGF5Q2FsY3VsYXRvcihIb2xpZGF5V2Vla2RheXMgaG9saWRheVdlZWtkYXlzKSB7CisgICAgX2hvbGlkYXlXZWVrZGF5cyA9IGhvbGlkYXlXZWVrZGF5czsKKyAgfQogCi0gICAgICAgIHB1YmxpYyBXb3JrZGF5Q2FsY3VsYXRvclJlc3VsdCBDYWxjdWxhdGVXb3JrZGF5KFN5c3RlbS5EYXRlVGltZSBzdGFydERhdGUsIGludCBuV29ya0RheXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjYWxjRGlyZWN0aW9uID0gbldvcmtEYXlzID4gMCA/IFdvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbi5Gb3J3YXJkIDogV29ya2RheUNhbGN1bGF0aW9uRGlyZWN0aW9uLkJhY2t3YXJkOwotICAgICAgICAgICAgdmFyIGRpcmVjdGlvbiA9IChpbnQpIGNhbGNEaXJlY3Rpb247Ci0gICAgICAgICAgICBuV29ya0RheXMgKj0gZGlyZWN0aW9uOwotICAgICAgICAgICAgdmFyIHdvcmtkYXlzQ291bnRlZCA9IDA7Ci0gICAgICAgICAgICB2YXIgdG1wRGF0ZSA9IHN0YXJ0RGF0ZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHdob2xlIHdlZWtzCi0gICAgICAgICAgICB2YXIgbldob2xlV2Vla3MgPSBuV29ya0RheXMgLyBfaG9saWRheVdlZWtkYXlzLk51bWJlck9mV29ya2RheXNQZXJXZWVrOwotICAgICAgICAgICAgdG1wRGF0ZSA9IHRtcERhdGUuQWRkRGF5cyhuV2hvbGVXZWVrcyAqIDcgKiBkaXJlY3Rpb24pOwotICAgICAgICAgICAgd29ya2RheXNDb3VudGVkICs9IG5XaG9sZVdlZWtzICogX2hvbGlkYXlXZWVrZGF5cy5OdW1iZXJPZldvcmtkYXlzUGVyV2VlazsKLQotICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSByZXN0Ci0gICAgICAgICAgICB3aGlsZSAod29ya2RheXNDb3VudGVkIDwgbldvcmtEYXlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRtcERhdGUgPSB0bXBEYXRlLkFkZERheXMoZGlyZWN0aW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoIV9ob2xpZGF5V2Vla2RheXMuSXNIb2xpZGF5V2Vla2RheSh0bXBEYXRlKSkgd29ya2RheXNDb3VudGVkKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFdvcmtkYXlDYWxjdWxhdG9yUmVzdWx0KHdvcmtkYXlzQ291bnRlZCwgc3RhcnREYXRlLCB0bXBEYXRlLCBjYWxjRGlyZWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBXb3JrZGF5Q2FsY3VsYXRvclJlc3VsdCBSZWR1Y2VXb3JrZGF5c1dpdGhIb2xpZGF5cyhXb3JrZGF5Q2FsY3VsYXRvclJlc3VsdCBjYWxjdWxhdGVkUmVzdWx0LAotICAgICAgICAgICAgRnVuY3Rpb25Bcmd1bWVudCBob2xpZGF5QXJndW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzdGFydERhdGUgPSBjYWxjdWxhdGVkUmVzdWx0LlN0YXJ0RGF0ZTsKLSAgICAgICAgICAgIHZhciBlbmREYXRlID0gY2FsY3VsYXRlZFJlc3VsdC5FbmREYXRlOwotICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxEYXlzID0gbmV3IEFkZGl0aW9uYWxIb2xpZGF5RGF5cyhob2xpZGF5QXJndW1lbnQpOwotICAgICAgICAgICAgU3lzdGVtLkRhdGVUaW1lIGNhbGNTdGFydERhdGU7Ci0gICAgICAgICAgICBTeXN0ZW0uRGF0ZVRpbWUgY2FsY0VuZERhdGU7Ci0gICAgICAgICAgICBpZiAoc3RhcnREYXRlIDwgZW5kRGF0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYWxjU3RhcnREYXRlID0gc3RhcnREYXRlOwotICAgICAgICAgICAgICAgIGNhbGNFbmREYXRlID0gZW5kRGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYWxjU3RhcnREYXRlID0gZW5kRGF0ZTsKLSAgICAgICAgICAgICAgICBjYWxjRW5kRGF0ZSA9IHN0YXJ0RGF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBuQWRkaXRpb25hbEhvbGlkYXlEYXlzID0gYWRkaXRpb25hbERheXMuQWRkaXRpb25hbERhdGVzLkNvdW50KHggPT4geCA+PSBjYWxjU3RhcnREYXRlICYmIHggPD0gY2FsY0VuZERhdGUgJiYgIV9ob2xpZGF5V2Vla2RheXMuSXNIb2xpZGF5V2Vla2RheSh4KSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFdvcmtkYXlDYWxjdWxhdG9yUmVzdWx0KGNhbGN1bGF0ZWRSZXN1bHQuTnVtYmVyT2ZXb3JrZGF5cyAtIG5BZGRpdGlvbmFsSG9saWRheURheXMsIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgY2FsY3VsYXRlZFJlc3VsdC5EaXJlY3Rpb24pOwotICAgICAgICB9IAotCi0gICAgICAgIHB1YmxpYyBXb3JrZGF5Q2FsY3VsYXRvclJlc3VsdCBBZGp1c3RSZXN1bHRXaXRoSG9saWRheXMoV29ya2RheUNhbGN1bGF0b3JSZXN1bHQgY2FsY3VsYXRlZFJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQXJndW1lbnQgaG9saWRheUFyZ3VtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc3RhcnREYXRlID0gY2FsY3VsYXRlZFJlc3VsdC5TdGFydERhdGU7Ci0gICAgICAgICAgICB2YXIgZW5kRGF0ZSA9IGNhbGN1bGF0ZWRSZXN1bHQuRW5kRGF0ZTsKLSAgICAgICAgICAgIHZhciBkaXJlY3Rpb24gPSBjYWxjdWxhdGVkUmVzdWx0LkRpcmVjdGlvbjsKLSAgICAgICAgICAgIHZhciB3b3JrZGF5c0NvdW50ZWQgPSBjYWxjdWxhdGVkUmVzdWx0Lk51bWJlck9mV29ya2RheXM7Ci0gICAgICAgICAgICB2YXIgYWRkaXRpb25hbERheXMgPSBuZXcgQWRkaXRpb25hbEhvbGlkYXlEYXlzKGhvbGlkYXlBcmd1bWVudCk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgZGF0ZSBpbiBhZGRpdGlvbmFsRGF5cy5BZGRpdGlvbmFsRGF0ZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSBXb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24uRm9yd2FyZCAmJiAoZGF0ZSA8IHN0YXJ0RGF0ZSB8fCBkYXRlID4gZW5kRGF0ZSkpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gV29ya2RheUNhbGN1bGF0aW9uRGlyZWN0aW9uLkJhY2t3YXJkICYmIChkYXRlID4gc3RhcnREYXRlIHx8IGRhdGUgPCBlbmREYXRlKSkgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaWYgKF9ob2xpZGF5V2Vla2RheXMuSXNIb2xpZGF5V2Vla2RheShkYXRlKSkgY29udGludWU7Ci0gICAgICAgICAgICAgICAgdmFyIHRtcERhdGUgPSBfaG9saWRheVdlZWtkYXlzLkdldE5leHRXb3JrZGF5KGVuZERhdGUsIGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGFkZGl0aW9uYWxEYXlzLkFkZGl0aW9uYWxEYXRlcy5Db250YWlucyh0bXBEYXRlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRtcERhdGUgPSBfaG9saWRheVdlZWtkYXlzLkdldE5leHRXb3JrZGF5KHRtcERhdGUsIGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdvcmtkYXlzQ291bnRlZCsrOwotICAgICAgICAgICAgICAgIGVuZERhdGUgPSB0bXBEYXRlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbmV3IFdvcmtkYXlDYWxjdWxhdG9yUmVzdWx0KHdvcmtkYXlzQ291bnRlZCwgY2FsY3VsYXRlZFJlc3VsdC5TdGFydERhdGUsIGVuZERhdGUsIGRpcmVjdGlvbik7Ci0gICAgICAgIH0KKyAgcHVibGljIFdvcmtkYXlDYWxjdWxhdG9yUmVzdWx0IENhbGN1bGF0ZU51bWJlck9mV29ya2RheXMoCisgICAgICBTeXN0ZW0uRGF0ZVRpbWUgc3RhcnREYXRlLAorICAgICAgU3lzdGVtLkRhdGVUaW1lIGVuZERhdGUpIHsKKyAgICB2YXIgY2FsY0RpcmVjdGlvbiA9CisgICAgICAgIHN0YXJ0RGF0ZSA8IGVuZERhdGUKKyAgICAgICAgICAgID8gV29ya2RheUNhbGN1bGF0aW9uRGlyZWN0aW9uLkZvcndhcmQKKyAgICAgICAgICAgIDogV29ya2RheUNhbGN1bGF0aW9uRGlyZWN0aW9uLkJhY2t3YXJkOworICAgIFN5c3RlbS5EYXRlVGltZSBjYWxjU3RhcnREYXRlOworICAgIFN5c3RlbS5EYXRlVGltZSBjYWxjRW5kRGF0ZTsKKyAgICBpZiAoY2FsY0RpcmVjdGlvbiA9PSBXb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24uRm9yd2FyZCkgeworICAgICAgY2FsY1N0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZS5EYXRlOworICAgICAgY2FsY0VuZERhdGUgPSBlbmREYXRlLkRhdGU7CisgICAgfSBlbHNlIHsKKyAgICAgIGNhbGNTdGFydERhdGUgPSBlbmREYXRlLkRhdGU7CisgICAgICBjYWxjRW5kRGF0ZSA9IHN0YXJ0RGF0ZS5EYXRlOwogICAgIH0KKyAgICB2YXIgbldob2xlV2Vla3MgPSAoaW50KWNhbGNFbmREYXRlLlN1YnRyYWN0KGNhbGNTdGFydERhdGUpLlRvdGFsRGF5cyAvIDc7CisgICAgdmFyIHdvcmtkYXlzQ291bnRlZCA9IG5XaG9sZVdlZWtzICogX2hvbGlkYXlXZWVrZGF5cy5OdW1iZXJPZldvcmtkYXlzUGVyV2VlazsKKyAgICBpZiAoIV9ob2xpZGF5V2Vla2RheXMuSXNIb2xpZGF5V2Vla2RheShjYWxjU3RhcnREYXRlKSkgeworICAgICAgd29ya2RheXNDb3VudGVkKys7CisgICAgfQorICAgIHZhciB0bXBEYXRlID0gY2FsY1N0YXJ0RGF0ZS5BZGREYXlzKG5XaG9sZVdlZWtzICogNyk7CisgICAgd2hpbGUgKHRtcERhdGUgPCBjYWxjRW5kRGF0ZSkgeworICAgICAgdG1wRGF0ZSA9IHRtcERhdGUuQWRkRGF5cygxKTsKKyAgICAgIGlmICghX2hvbGlkYXlXZWVrZGF5cy5Jc0hvbGlkYXlXZWVrZGF5KHRtcERhdGUpKSB7CisgICAgICAgIHdvcmtkYXlzQ291bnRlZCsrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbmV3KHdvcmtkYXlzQ291bnRlZCwgc3RhcnREYXRlLCBlbmREYXRlLCBjYWxjRGlyZWN0aW9uKTsKKyAgfQorCisgIHB1YmxpYyBXb3JrZGF5Q2FsY3VsYXRvclJlc3VsdCBDYWxjdWxhdGVXb3JrZGF5KFN5c3RlbS5EYXRlVGltZSBzdGFydERhdGUsIGludCBuV29ya0RheXMpIHsKKyAgICB2YXIgY2FsY0RpcmVjdGlvbiA9CisgICAgICAgIG5Xb3JrRGF5cyA+IDAgPyBXb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24uRm9yd2FyZCA6IFdvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbi5CYWNrd2FyZDsKKyAgICB2YXIgZGlyZWN0aW9uID0gKGludCljYWxjRGlyZWN0aW9uOworICAgIG5Xb3JrRGF5cyAqPSBkaXJlY3Rpb247CisgICAgdmFyIHdvcmtkYXlzQ291bnRlZCA9IDA7CisgICAgdmFyIHRtcERhdGUgPSBzdGFydERhdGU7CisKKyAgICAvLyBjYWxjdWxhdGUgd2hvbGUgd2Vla3MKKyAgICB2YXIgbldob2xlV2Vla3MgPSBuV29ya0RheXMgLyBfaG9saWRheVdlZWtkYXlzLk51bWJlck9mV29ya2RheXNQZXJXZWVrOworICAgIHRtcERhdGUgPSB0bXBEYXRlLkFkZERheXMobldob2xlV2Vla3MgKiA3ICogZGlyZWN0aW9uKTsKKyAgICB3b3JrZGF5c0NvdW50ZWQgKz0gbldob2xlV2Vla3MgKiBfaG9saWRheVdlZWtkYXlzLk51bWJlck9mV29ya2RheXNQZXJXZWVrOworCisgICAgLy8gY2FsY3VsYXRlIHRoZSByZXN0CisgICAgd2hpbGUgKHdvcmtkYXlzQ291bnRlZCA8IG5Xb3JrRGF5cykgeworICAgICAgdG1wRGF0ZSA9IHRtcERhdGUuQWRkRGF5cyhkaXJlY3Rpb24pOworICAgICAgaWYgKCFfaG9saWRheVdlZWtkYXlzLklzSG9saWRheVdlZWtkYXkodG1wRGF0ZSkpIHsKKyAgICAgICAgd29ya2RheXNDb3VudGVkKys7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXcod29ya2RheXNDb3VudGVkLCBzdGFydERhdGUsIHRtcERhdGUsIGNhbGNEaXJlY3Rpb24pOworICB9CisKKyAgcHVibGljIFdvcmtkYXlDYWxjdWxhdG9yUmVzdWx0IFJlZHVjZVdvcmtkYXlzV2l0aEhvbGlkYXlzKAorICAgICAgV29ya2RheUNhbGN1bGF0b3JSZXN1bHQgY2FsY3VsYXRlZFJlc3VsdCwKKyAgICAgIEZ1bmN0aW9uQXJndW1lbnQgaG9saWRheUFyZ3VtZW50KSB7CisgICAgdmFyIHN0YXJ0RGF0ZSA9IGNhbGN1bGF0ZWRSZXN1bHQuU3RhcnREYXRlOworICAgIHZhciBlbmREYXRlID0gY2FsY3VsYXRlZFJlc3VsdC5FbmREYXRlOworICAgIHZhciBhZGRpdGlvbmFsRGF5cyA9IG5ldyBBZGRpdGlvbmFsSG9saWRheURheXMoaG9saWRheUFyZ3VtZW50KTsKKyAgICBTeXN0ZW0uRGF0ZVRpbWUgY2FsY1N0YXJ0RGF0ZTsKKyAgICBTeXN0ZW0uRGF0ZVRpbWUgY2FsY0VuZERhdGU7CisgICAgaWYgKHN0YXJ0RGF0ZSA8IGVuZERhdGUpIHsKKyAgICAgIGNhbGNTdGFydERhdGUgPSBzdGFydERhdGU7CisgICAgICBjYWxjRW5kRGF0ZSA9IGVuZERhdGU7CisgICAgfSBlbHNlIHsKKyAgICAgIGNhbGNTdGFydERhdGUgPSBlbmREYXRlOworICAgICAgY2FsY0VuZERhdGUgPSBzdGFydERhdGU7CisgICAgfQorICAgIHZhciBuQWRkaXRpb25hbEhvbGlkYXlEYXlzID0gYWRkaXRpb25hbERheXMuQWRkaXRpb25hbERhdGVzLkNvdW50KHggPT4KKyAgICAgICAgeCA+PSBjYWxjU3RhcnREYXRlICYmIHggPD0gY2FsY0VuZERhdGUgJiYgIV9ob2xpZGF5V2Vla2RheXMuSXNIb2xpZGF5V2Vla2RheSh4KSk7CisgICAgcmV0dXJuIG5ldygKKyAgICAgICAgY2FsY3VsYXRlZFJlc3VsdC5OdW1iZXJPZldvcmtkYXlzIC0gbkFkZGl0aW9uYWxIb2xpZGF5RGF5cywKKyAgICAgICAgc3RhcnREYXRlLAorICAgICAgICBlbmREYXRlLAorICAgICAgICBjYWxjdWxhdGVkUmVzdWx0LkRpcmVjdGlvbik7CisgIH0KKworICBwdWJsaWMgV29ya2RheUNhbGN1bGF0b3JSZXN1bHQgQWRqdXN0UmVzdWx0V2l0aEhvbGlkYXlzKAorICAgICAgV29ya2RheUNhbGN1bGF0b3JSZXN1bHQgY2FsY3VsYXRlZFJlc3VsdCwKKyAgICAgIEZ1bmN0aW9uQXJndW1lbnQgaG9saWRheUFyZ3VtZW50KSB7CisgICAgdmFyIHN0YXJ0RGF0ZSA9IGNhbGN1bGF0ZWRSZXN1bHQuU3RhcnREYXRlOworICAgIHZhciBlbmREYXRlID0gY2FsY3VsYXRlZFJlc3VsdC5FbmREYXRlOworICAgIHZhciBkaXJlY3Rpb24gPSBjYWxjdWxhdGVkUmVzdWx0LkRpcmVjdGlvbjsKKyAgICB2YXIgd29ya2RheXNDb3VudGVkID0gY2FsY3VsYXRlZFJlc3VsdC5OdW1iZXJPZldvcmtkYXlzOworICAgIHZhciBhZGRpdGlvbmFsRGF5cyA9IG5ldyBBZGRpdGlvbmFsSG9saWRheURheXMoaG9saWRheUFyZ3VtZW50KTsKKyAgICBmb3JlYWNoICh2YXIgZGF0ZSBpbiBhZGRpdGlvbmFsRGF5cy5BZGRpdGlvbmFsRGF0ZXMpIHsKKyAgICAgIGlmIChkaXJlY3Rpb24gPT0gV29ya2RheUNhbGN1bGF0aW9uRGlyZWN0aW9uLkZvcndhcmQKKyAgICAgICAgICAmJiAoZGF0ZSA8IHN0YXJ0RGF0ZSB8fCBkYXRlID4gZW5kRGF0ZSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoZGlyZWN0aW9uID09IFdvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbi5CYWNrd2FyZAorICAgICAgICAgICYmIChkYXRlID4gc3RhcnREYXRlIHx8IGRhdGUgPCBlbmREYXRlKSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChfaG9saWRheVdlZWtkYXlzLklzSG9saWRheVdlZWtkYXkoZGF0ZSkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB2YXIgdG1wRGF0ZSA9IF9ob2xpZGF5V2Vla2RheXMuR2V0TmV4dFdvcmtkYXkoZW5kRGF0ZSwgZGlyZWN0aW9uKTsKKyAgICAgIHdoaWxlIChhZGRpdGlvbmFsRGF5cy5BZGRpdGlvbmFsRGF0ZXMuQ29udGFpbnModG1wRGF0ZSkpIHsKKyAgICAgICAgdG1wRGF0ZSA9IF9ob2xpZGF5V2Vla2RheXMuR2V0TmV4dFdvcmtkYXkodG1wRGF0ZSwgZGlyZWN0aW9uKTsKKyAgICAgIH0KKyAgICAgIHdvcmtkYXlzQ291bnRlZCsrOworICAgICAgZW5kRGF0ZSA9IHRtcERhdGU7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyh3b3JrZGF5c0NvdW50ZWQsIGNhbGN1bGF0ZWRSZXN1bHQuU3RhcnREYXRlLCBlbmREYXRlLCBkaXJlY3Rpb24pOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dvcmtkYXlzL1dvcmtkYXlDYWxjdWxhdG9yUmVzdWx0LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9Xb3JrZGF5cy9Xb3JrZGF5Q2FsY3VsYXRvclJlc3VsdC5jcwppbmRleCA0MjBjNWQ4Li5hNjFhMDVlIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1dvcmtkYXlzL1dvcmtkYXlDYWxjdWxhdG9yUmVzdWx0LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvV29ya2RheXMvV29ya2RheUNhbGN1bGF0b3JSZXN1bHQuY3MKQEAgLTEsMjYgKzEsMjIgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uU2VjdXJpdHkuQ3J5cHRvZ3JhcGh5Llg1MDlDZXJ0aWZpY2F0ZXM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK++7v25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZS5Xb3JrZGF5czsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lLldvcmtkYXlzCi17Ci0gICAgcHVibGljIGNsYXNzIFdvcmtkYXlDYWxjdWxhdG9yUmVzdWx0Ci0gICAgewotICAgICAgICBwdWJsaWMgV29ya2RheUNhbGN1bGF0b3JSZXN1bHQoaW50IG51bWJlck9mV29ya2RheXMsIFN5c3RlbS5EYXRlVGltZSBzdGFydERhdGUsIFN5c3RlbS5EYXRlVGltZSBlbmREYXRlLCBXb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24gZGlyZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBOdW1iZXJPZldvcmtkYXlzID0gbnVtYmVyT2ZXb3JrZGF5czsKLSAgICAgICAgICAgIFN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTsKLSAgICAgICAgICAgIEVuZERhdGUgPSBlbmREYXRlOwotICAgICAgICAgICAgRGlyZWN0aW9uID0gZGlyZWN0aW9uOwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgV29ya2RheUNhbGN1bGF0b3JSZXN1bHQgeworICBwdWJsaWMgV29ya2RheUNhbGN1bGF0b3JSZXN1bHQoCisgICAgICBpbnQgbnVtYmVyT2ZXb3JrZGF5cywKKyAgICAgIFN5c3RlbS5EYXRlVGltZSBzdGFydERhdGUsCisgICAgICBTeXN0ZW0uRGF0ZVRpbWUgZW5kRGF0ZSwKKyAgICAgIFdvcmtkYXlDYWxjdWxhdGlvbkRpcmVjdGlvbiBkaXJlY3Rpb24pIHsKKyAgICBOdW1iZXJPZldvcmtkYXlzID0gbnVtYmVyT2ZXb3JrZGF5czsKKyAgICBTdGFydERhdGUgPSBzdGFydERhdGU7CisgICAgRW5kRGF0ZSA9IGVuZERhdGU7CisgICAgRGlyZWN0aW9uID0gZGlyZWN0aW9uOworICB9CiAKLSAgICAgICAgcHVibGljIGludCBOdW1iZXJPZldvcmtkYXlzIHsgZ2V0OyB9CisgIHB1YmxpYyBpbnQgTnVtYmVyT2ZXb3JrZGF5cyB7IGdldDsgfQogCi0gICAgICAgIHB1YmxpYyBTeXN0ZW0uRGF0ZVRpbWUgU3RhcnREYXRlIHsgZ2V0OyB9CisgIHB1YmxpYyBTeXN0ZW0uRGF0ZVRpbWUgU3RhcnREYXRlIHsgZ2V0OyB9CiAKLSAgICAgICAgcHVibGljIFN5c3RlbS5EYXRlVGltZSBFbmREYXRlIHsgZ2V0OyB9Ci0gICAgICAgIHB1YmxpYyBXb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24gRGlyZWN0aW9uIHsgZ2V0OyBzZXQ7IH0KLSAgICB9CisgIHB1YmxpYyBTeXN0ZW0uRGF0ZVRpbWUgRW5kRGF0ZSB7IGdldDsgfQorCisgIHB1YmxpYyBXb3JrZGF5Q2FsY3VsYXRpb25EaXJlY3Rpb24gRGlyZWN0aW9uIHsgZ2V0OyBzZXQ7IH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvWWVhci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvWWVhci5jcwppbmRleCA0YmRiNTY1Li4xMDNjNDg3IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1llYXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9ZZWFyLmNzCkBAIC03LDQ3ICs3LDQxIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZQotewotICAgIHB1YmxpYyBjbGFzcyBZZWFyIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgZGF0ZU9iaiA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWU7Ci0gICAgICAgICAgICBTeXN0ZW0uRGF0ZVRpbWUgZGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5NaW5WYWx1ZTsKLSAgICAgICAgICAgIGlmIChkYXRlT2JqIGlzIHN0cmluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkYXRlID0gU3lzdGVtLkRhdGVUaW1lLlBhcnNlKGRhdGVPYmouVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGQgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgICAgICBkYXRlID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGRhdGUuWWVhciwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5EYXRlVGltZTsKKworcHVibGljIGNsYXNzIFllYXIgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBkYXRlT2JqID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZTsKKyAgICBTeXN0ZW0uRGF0ZVRpbWUgZGF0ZSA9IFN5c3RlbS5EYXRlVGltZS5NaW5WYWx1ZTsKKyAgICBpZiAoZGF0ZU9iaiBpcyBzdHJpbmcpIHsKKyAgICAgIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuUGFyc2UoZGF0ZU9iai5Ub1N0cmluZygpKTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIGQgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICAgIGRhdGUgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkKTsKICAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChkYXRlLlllYXIsIERhdGFUeXBlLkludGVnZXIpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1llYXJmcmFjLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EYXRlVGltZS9ZZWFyZnJhYy5jcwppbmRleCBmY2YzOWI2Li40NDBjNDZhIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RhdGVUaW1lL1llYXJmcmFjLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGF0ZVRpbWUvWWVhcmZyYWMuY3MKQEAgLTEsODkgKzEsODUgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwor77u/dXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lCi17Ci0gICAgcHVibGljIGNsYXNzIFllYXJmcmFjIDogRXhjZWxGdW5jdGlvbgorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkRhdGVUaW1lOworCitwdWJsaWMgY2xhc3MgWWVhcmZyYWMgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICB2YXIgZnVuY3Rpb25Bcmd1bWVudHMgPSBhcmd1bWVudHMgYXMgRnVuY3Rpb25Bcmd1bWVudFtdID8/IGFyZ3VtZW50cy5Ub0FycmF5KCk7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoZnVuY3Rpb25Bcmd1bWVudHMsIDIpOworICAgIHZhciBkYXRlMU51bSA9IEFyZ1RvRGVjaW1hbChmdW5jdGlvbkFyZ3VtZW50cywgMCk7CisgICAgdmFyIGRhdGUyTnVtID0gQXJnVG9EZWNpbWFsKGZ1bmN0aW9uQXJndW1lbnRzLCAxKTsKKyAgICBpZiAoZGF0ZTFOdW0KKyAgICAgICAgPiBkYXRlMk51bSkgLy9Td2l0Y2ggdG8gbWFrZSBkYXRlMSB0aGUgbG93ZXN0IGRhdGUKICAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25Bcmd1bWVudHMgPSBhcmd1bWVudHMgYXMgRnVuY3Rpb25Bcmd1bWVudFtdID8/IGFyZ3VtZW50cy5Ub0FycmF5KCk7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhmdW5jdGlvbkFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgZGF0ZTFOdW0gPSBBcmdUb0RlY2ltYWwoZnVuY3Rpb25Bcmd1bWVudHMsIDApOwotICAgICAgICAgICAgdmFyIGRhdGUyTnVtID0gQXJnVG9EZWNpbWFsKGZ1bmN0aW9uQXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIGlmIChkYXRlMU51bSA+IGRhdGUyTnVtKSAvL1N3aXRjaCB0byBtYWtlIGRhdGUxIHRoZSBsb3dlc3QgZGF0ZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB0ID0gZGF0ZTFOdW07Ci0gICAgICAgICAgICAgICAgZGF0ZTFOdW0gPSBkYXRlMk51bTsKLSAgICAgICAgICAgICAgICBkYXRlMk51bSA9IHQ7Ci0gICAgICAgICAgICAgICAgdmFyIGZhID0gZnVuY3Rpb25Bcmd1bWVudHNbMV07Ci0gICAgICAgICAgICAgICAgZnVuY3Rpb25Bcmd1bWVudHNbMV0gPSBmdW5jdGlvbkFyZ3VtZW50c1swXTsKLSAgICAgICAgICAgICAgICBmdW5jdGlvbkFyZ3VtZW50c1swXSA9IGZhOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIGRhdGUxID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZGF0ZTFOdW0pOwotICAgICAgICAgICAgdmFyIGRhdGUyID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZGF0ZTJOdW0pOwotCi0gICAgICAgICAgICB2YXIgYmFzaXMgPSAwOwotICAgICAgICAgICAgaWYgKGZ1bmN0aW9uQXJndW1lbnRzLkNvdW50KCkgPiAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJhc2lzID0gQXJnVG9JbnQoZnVuY3Rpb25Bcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uSWYoKCkgPT4gYmFzaXMgPCAwIHx8IGJhc2lzID4gNCwgZUVycm9yVHlwZS5OdW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIGZ1bmMgPSBjb250ZXh0LkNvbmZpZ3VyYXRpb24uRnVuY3Rpb25SZXBvc2l0b3J5LkdldEZ1bmN0aW9uKCJkYXlzMzYwIik7Ci0gICAgICAgICAgICB2YXIgY2FsZW5kYXIgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLSAgICAgICAgICAgIHN3aXRjaCAoYmFzaXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICB2YXIgZDM2MFJlc3VsdCA9IFN5c3RlbS5NYXRoLkFicyhmdW5jLkV4ZWN1dGUoZnVuY3Rpb25Bcmd1bWVudHMsIGNvbnRleHQpLlJlc3VsdE51bWVyaWMpOwotICAgICAgICAgICAgICAgICAgICAvLyByZXByb2R1Y2luZyBleGNlbHMgYmVoYXZpb3VyCi0gICAgICAgICAgICAgICAgICAgIGlmIChkYXRlMS5Nb250aCA9PSAyICYmIGRhdGUyLkRheT09MzEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXlzSW5GZWIgPSBjYWxlbmRhci5Jc0xlYXBZZWFyKGRhdGUxLlllYXIpID8gMjkgOiAyODsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRlMS5EYXkgPT0gZGF5c0luRmViKSBkMzYwUmVzdWx0Kys7ICAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGQzNjBSZXN1bHQgLyAzNjBkLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguQWJzKChkYXRlMiAtIGRhdGUxKS5Ub3RhbERheXMgLyBDYWxjdWxhdGVBY3V0YWxZZWFyKGRhdGUxLCBkYXRlMikpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguQWJzKChkYXRlMiAtIGRhdGUxKS5Ub3RhbERheXMgLyAzNjBkKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkFicygoZGF0ZTIgLSBkYXRlMSkuVG90YWxEYXlzIC8gMzY1ZCksIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBmdW5jdGlvbkFyZ3VtZW50cy5Ub0xpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgYXJncy5BZGQobmV3IEZ1bmN0aW9uQXJndW1lbnQodHJ1ZSkpOwotICAgICAgICAgICAgICAgICAgICBkb3VibGU/IHJlc3VsdCA9IFN5c3RlbS5NYXRoLkFicyhmdW5jLkV4ZWN1dGUoYXJncywgY29udGV4dCkuUmVzdWx0TnVtZXJpYyAvIDM2MGQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdC5WYWx1ZSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGRvdWJsZSBDYWxjdWxhdGVBY3V0YWxZZWFyKFN5c3RlbS5EYXRlVGltZSBkdDEsIFN5c3RlbS5EYXRlVGltZSBkdDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjYWxlbmRhciA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOwotICAgICAgICAgICAgdmFyIHBlclllYXIgPSAwZDsKLSAgICAgICAgICAgIHZhciBuWWVhcnMgPSBkdDIuWWVhciAtIGR0MS5ZZWFyICsgMTsKLSAgICAgICAgICAgIGZvciAodmFyIHkgPSBkdDEuWWVhcjsgeSA8PSBkdDIuWWVhcjsgKyt5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBlclllYXIgKz0gY2FsZW5kYXIuSXNMZWFwWWVhcih5KSA/IDM2NiA6IDM2NTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuZXcgU3lzdGVtLkRhdGVUaW1lKGR0MS5ZZWFyICsgMSwgZHQxLk1vbnRoLCBkdDEuRGF5KSA+PSBkdDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgblllYXJzID0gMTsKLSAgICAgICAgICAgICAgICBwZXJZZWFyID0gMzY1OwotICAgICAgICAgICAgICAgIGlmIChjYWxlbmRhci5Jc0xlYXBZZWFyKGR0MS5ZZWFyKSAmJiBkdDEuTW9udGggPD0gMikKLSAgICAgICAgICAgICAgICAgICAgcGVyWWVhciA9IDM2NjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjYWxlbmRhci5Jc0xlYXBZZWFyKGR0Mi5ZZWFyKSAmJiBkdDIuTW9udGggPiAyKQotICAgICAgICAgICAgICAgICAgICBwZXJZZWFyID0gMzY2OwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGR0Mi5Nb250aCA9PSAyICYmIGR0Mi5EYXkgPT0gMjkpCi0gICAgICAgICAgICAgICAgICAgIHBlclllYXIgPSAzNjY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcGVyWWVhci8oZG91YmxlKSBuWWVhcnM7ICAKLSAgICAgICAgfQorICAgICAgdmFyIHQgPSBkYXRlMU51bTsKKyAgICAgIGRhdGUxTnVtID0gZGF0ZTJOdW07CisgICAgICBkYXRlMk51bSA9IHQ7CisgICAgICB2YXIgZmEgPSBmdW5jdGlvbkFyZ3VtZW50c1sxXTsKKyAgICAgIGZ1bmN0aW9uQXJndW1lbnRzWzFdID0gZnVuY3Rpb25Bcmd1bWVudHNbMF07CisgICAgICBmdW5jdGlvbkFyZ3VtZW50c1swXSA9IGZhOwogICAgIH0KKyAgICB2YXIgZGF0ZTEgPSBTeXN0ZW0uRGF0ZVRpbWUuRnJvbU9BRGF0ZShkYXRlMU51bSk7CisgICAgdmFyIGRhdGUyID0gU3lzdGVtLkRhdGVUaW1lLkZyb21PQURhdGUoZGF0ZTJOdW0pOworCisgICAgdmFyIGJhc2lzID0gMDsKKyAgICBpZiAoZnVuY3Rpb25Bcmd1bWVudHMuQ291bnQoKSA+IDIpIHsKKyAgICAgIGJhc2lzID0gQXJnVG9JbnQoZnVuY3Rpb25Bcmd1bWVudHMsIDIpOworICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiBiYXNpcyA8IDAgfHwgYmFzaXMgPiA0LCBlRXJyb3JUeXBlLk51bSk7CisgICAgfQorICAgIHZhciBmdW5jID0gY29udGV4dC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeS5HZXRGdW5jdGlvbigiZGF5czM2MCIpOworICAgIHZhciBjYWxlbmRhciA9IG5ldyBHcmVnb3JpYW5DYWxlbmRhcigpOworICAgIHN3aXRjaCAoYmFzaXMpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgdmFyIGQzNjBSZXN1bHQgPSBTeXN0ZW0uTWF0aC5BYnMoZnVuYy5FeGVjdXRlKGZ1bmN0aW9uQXJndW1lbnRzLCBjb250ZXh0KS5SZXN1bHROdW1lcmljKTsKKyAgICAgICAgLy8gcmVwcm9kdWNpbmcgZXhjZWxzIGJlaGF2aW91cgorICAgICAgICBpZiAoZGF0ZTEuTW9udGggPT0gMiAmJiBkYXRlMi5EYXkgPT0gMzEpIHsKKyAgICAgICAgICB2YXIgZGF5c0luRmViID0gY2FsZW5kYXIuSXNMZWFwWWVhcihkYXRlMS5ZZWFyKSA/IDI5IDogMjg7CisgICAgICAgICAgaWYgKGRhdGUxLkRheSA9PSBkYXlzSW5GZWIpIHsKKyAgICAgICAgICAgIGQzNjBSZXN1bHQrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChkMzYwUmVzdWx0IC8gMzYwZCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICBjYXNlIDE6CisgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoCisgICAgICAgICAgICBTeXN0ZW0uTWF0aC5BYnMoKGRhdGUyIC0gZGF0ZTEpLlRvdGFsRGF5cyAvIENhbGN1bGF0ZUFjdXRhbFllYXIoZGF0ZTEsIGRhdGUyKSksCisgICAgICAgICAgICBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5BYnMoKGRhdGUyIC0gZGF0ZTEpLlRvdGFsRGF5cyAvIDM2MGQpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5BYnMoKGRhdGUyIC0gZGF0ZTEpLlRvdGFsRGF5cyAvIDM2NWQpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgdmFyIGFyZ3MgPSBmdW5jdGlvbkFyZ3VtZW50cy5Ub0xpc3QoKTsKKyAgICAgICAgYXJncy5BZGQobmV3KHRydWUpKTsKKyAgICAgICAgZG91YmxlPyByZXN1bHQgPSBTeXN0ZW0uTWF0aC5BYnMoZnVuYy5FeGVjdXRlKGFyZ3MsIGNvbnRleHQpLlJlc3VsdE51bWVyaWMgLyAzNjBkKTsKKyAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQuVmFsdWUsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBkb3VibGUgQ2FsY3VsYXRlQWN1dGFsWWVhcihTeXN0ZW0uRGF0ZVRpbWUgZHQxLCBTeXN0ZW0uRGF0ZVRpbWUgZHQyKSB7CisgICAgdmFyIGNhbGVuZGFyID0gbmV3IEdyZWdvcmlhbkNhbGVuZGFyKCk7CisgICAgdmFyIHBlclllYXIgPSAwZDsKKyAgICB2YXIgblllYXJzID0gZHQyLlllYXIgLSBkdDEuWWVhciArIDE7CisgICAgZm9yICh2YXIgeSA9IGR0MS5ZZWFyOyB5IDw9IGR0Mi5ZZWFyOyArK3kpIHsKKyAgICAgIHBlclllYXIgKz0gY2FsZW5kYXIuSXNMZWFwWWVhcih5KSA/IDM2NiA6IDM2NTsKKyAgICB9CisgICAgaWYgKG5ldyBTeXN0ZW0uRGF0ZVRpbWUoZHQxLlllYXIgKyAxLCBkdDEuTW9udGgsIGR0MS5EYXkpID49IGR0MikgeworICAgICAgblllYXJzID0gMTsKKyAgICAgIHBlclllYXIgPSAzNjU7CisgICAgICBpZiAoY2FsZW5kYXIuSXNMZWFwWWVhcihkdDEuWWVhcikgJiYgZHQxLk1vbnRoIDw9IDIpIHsKKyAgICAgICAgcGVyWWVhciA9IDM2NjsKKyAgICAgIH0gZWxzZSBpZiAoY2FsZW5kYXIuSXNMZWFwWWVhcihkdDIuWWVhcikgJiYgZHQyLk1vbnRoID4gMikgeworICAgICAgICBwZXJZZWFyID0gMzY2OworICAgICAgfSBlbHNlIGlmIChkdDIuTW9udGggPT0gMiAmJiBkdDIuRGF5ID09IDI5KSB7CisgICAgICAgIHBlclllYXIgPSAzNjY7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBwZXJZZWFyIC8gblllYXJzOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RlY2ltYWxDb21waWxlUmVzdWx0VmFsaWRhdG9yLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9EZWNpbWFsQ29tcGlsZVJlc3VsdFZhbGlkYXRvci5jcwppbmRleCA1ZWJmODUwLi4yMDhjZmEyIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RlY2ltYWxDb21waWxlUmVzdWx0VmFsaWRhdG9yLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRGVjaW1hbENvbXBpbGVSZXN1bHRWYWxpZGF0b3IuY3MKQEAgLTcsMzkgKzcsMzIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0yNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CisKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucwotewotICAgIHB1YmxpYyBjbGFzcyBEZWNpbWFsQ29tcGlsZVJlc3VsdFZhbGlkYXRvciA6IENvbXBpbGVSZXN1bHRWYWxpZGF0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFZhbGlkYXRlKG9iamVjdCBvYmopCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBudW0gPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShvYmopOwotICAgICAgICAgICAgaWYgKGRvdWJsZS5Jc05hTihudW0pIHx8IGRvdWJsZS5Jc0luZmluaXR5KG51bSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLk51bSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKKworcHVibGljIGNsYXNzIERlY2ltYWxDb21waWxlUmVzdWx0VmFsaWRhdG9yIDogQ29tcGlsZVJlc3VsdFZhbGlkYXRvciB7CisgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFZhbGlkYXRlKG9iamVjdCBvYmopIHsKKyAgICB2YXIgbnVtID0gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUob2JqKTsKKyAgICBpZiAoZG91YmxlLklzTmFOKG51bSkgfHwgZG91YmxlLklzSW5maW5pdHkobnVtKSkgeworICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLk51bSk7CiAgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RvdWJsZUFyZ3VtZW50UGFyc2VyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Eb3VibGVBcmd1bWVudFBhcnNlci5jcwppbmRleCBmNjE0OTA5Li5kOTg3Yzg1IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RvdWJsZUFyZ3VtZW50UGFyc2VyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRG91YmxlQXJndW1lbnRQYXJzZXIuY3MKQEAgLTcsNTMgKzcsNDkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwotdXNpbmcgdXRpbD1PZmZpY2VPcGVuWG1sLlV0aWxzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICBwdWJsaWMgY2xhc3MgRG91YmxlQXJndW1lbnRQYXJzZXIgOiBBcmd1bWVudFBhcnNlcgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBQYXJzZShvYmplY3Qgb2JqKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQob2JqKS5OYW1lZCgiYXJndW1lbnQiKS5Jc05vdE51bGwoKTsKLSAgICAgICAgICAgIGlmIChvYmogaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgcj0oKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pb2JqKS5GaXJzdE9yRGVmYXVsdCgpOwotICAgICAgICAgICAgICAgIHJldHVybiByID09IG51bGwgPyAwIDogci5WYWx1ZURvdWJsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvYmogaXMgZG91YmxlKSByZXR1cm4gb2JqOwotICAgICAgICAgICAgaWYgKG9iai5Jc051bWVyaWMoKSkgcmV0dXJuIHV0aWwuQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUob2JqKTsKLSAgICAgICAgICAgIHZhciBzdHIgPSBvYmogIT0gbnVsbCA/IG9iai5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZShzdHIsQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaC8vIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7Cit1c2luZyB1dGlsID0gT2ZmaWNlT3BlblhtbC5VdGlsczsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOworCitwdWJsaWMgY2xhc3MgRG91YmxlQXJndW1lbnRQYXJzZXIgOiBBcmd1bWVudFBhcnNlciB7CisgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgUGFyc2Uob2JqZWN0IG9iaikgeworICAgIFJlcXVpcmUuVGhhdChvYmopLk5hbWVkKCJhcmd1bWVudCIpLklzTm90TnVsbCgpOworICAgIGlmIChvYmogaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykgeworICAgICAgdmFyIHIgPSAoKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pb2JqKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgcmV0dXJuIHIgPT0gbnVsbCA/IDAgOiByLlZhbHVlRG91YmxlOwogICAgIH0KKyAgICBpZiAob2JqIGlzIGRvdWJsZSkgeworICAgICAgcmV0dXJuIG9iajsKKyAgICB9CisgICAgaWYgKG9iai5Jc051bWVyaWMoKSkgeworICAgICAgcmV0dXJuIHV0aWwuQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUob2JqKTsKKyAgICB9CisgICAgdmFyIHN0ciA9IG9iaiAhPSBudWxsID8gb2JqLlRvU3RyaW5nKCkgOiBzdHJpbmcuRW1wdHk7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiBkb3VibGUuUGFyc2Uoc3RyLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICB9IGNhdGNoIC8vIChFeGNlcHRpb24gZSkKKyAgICB7CisgICAgICB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSkpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Eb3VibGVFbnVtZXJhYmxlQXJnQ29udmVydGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Eb3VibGVFbnVtZXJhYmxlQXJnQ29udmVydGVyLmNzCmluZGV4IDVkMjFiMGMuLjJmZjdhMmMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0RvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIuY3MKQEAgLTcsODMgKzcsNzggQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucwotewotICAgIHB1YmxpYyBjbGFzcyBEb3VibGVFbnVtZXJhYmxlQXJnQ29udmVydGVyIDogQ29sbGVjdGlvbkZsYXR0ZW5lcjxkb3VibGU+Ci0gICAgewotICAgICAgICBwdWJsaWMgdmlydHVhbCBJRW51bWVyYWJsZTxkb3VibGU+IENvbnZlcnRBcmdzKGJvb2wgaWdub3JlSGlkZGVuLCBib29sIGlnbm9yZUVycm9ycywgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmFzZS5GdW5jQXJnc1RvRmxhdEVudW1lcmFibGUoYXJndW1lbnRzLCAoYXJnLCBhcmdMaXN0KSA9PgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5Jc0V4Y2VsUmFuZ2UpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIGFyZy5WYWx1ZUFzUmFuZ2VJbmZvKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpZ25vcmVFcnJvcnMgJiYgY2VsbC5Jc0V4Y2VsRXJyb3IpIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oRXhjZWxFcnJvclZhbHVlLlBhcnNlKGNlbGwuVmFsdWUuVG9TdHJpbmcoKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2VsbFN0YXRlSGVscGVyLlNob3VsZElnbm9yZShpZ25vcmVIaWRkZW4sIGNlbGwsIGNvbnRleHQpICYmIENvbnZlcnRVdGlsLklzTnVtZXJpYyhjZWxsLlZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ0xpc3QuQWRkKGNlbGwuVmFsdWVEb3VibGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZighaWdub3JlRXJyb3JzICYmIGFyZy5WYWx1ZUlzRXhjZWxFcnJvcikgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihhcmcuVmFsdWVBc0V4Y2VsRXJyb3JWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29udmVydFV0aWwuSXNOdW1lcmljKGFyZy5WYWx1ZSkgJiYgIUNlbGxTdGF0ZUhlbHBlci5TaG91bGRJZ25vcmUoaWdub3JlSGlkZGVuLCBhcmcsIGNvbnRleHQpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ0xpc3QuQWRkKENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZy5WYWx1ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKIAotICAgICAgICBwdWJsaWMgdmlydHVhbCBJRW51bWVyYWJsZTxkb3VibGU+IENvbnZlcnRBcmdzSW5jbHVkaW5nT3RoZXJUeXBlcyhJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBiYXNlLkZ1bmNBcmdzVG9GbGF0RW51bWVyYWJsZShhcmd1bWVudHMsIChhcmcsIGFyZ0xpc3QpID0+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy92YXIgY2VsbEluZm8gPSBhcmcuVmFsdWUgYXMgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIuQ2VsbEluZm87Ci0gICAgICAgICAgICAgICAgLy92YXIgdmFsdWUgPSBjZWxsSW5mbyAhPSBudWxsID8gY2VsbEluZm8uVmFsdWUgOiBhcmcuVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pYXJnLlZhbHVlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcmdMaXN0LkFkZChjZWxsLlZhbHVlRG91YmxlTG9naWNhbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBkb3VibGUgfHwgYXJnLlZhbHVlIGlzIGludCB8fCBhcmcuVmFsdWUgaXMgYm9vbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYXJnTGlzdC5BZGQoQ29udmVydC5Ub0RvdWJsZShhcmcuVmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmcuVmFsdWUgaXMgc3RyaW5nKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcmdMaXN0LkFkZCgwZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgIH0KK3B1YmxpYyBjbGFzcyBEb3VibGVFbnVtZXJhYmxlQXJnQ29udmVydGVyIDogQ29sbGVjdGlvbkZsYXR0ZW5lcjxkb3VibGU+IHsKKyAgcHVibGljIHZpcnR1YWwgSUVudW1lcmFibGU8ZG91YmxlPiBDb252ZXJ0QXJncygKKyAgICAgIGJvb2wgaWdub3JlSGlkZGVuLAorICAgICAgYm9vbCBpZ25vcmVFcnJvcnMsCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgcmV0dXJuIGJhc2UuRnVuY0FyZ3NUb0ZsYXRFbnVtZXJhYmxlKAorICAgICAgICBhcmd1bWVudHMsCisgICAgICAgIChhcmcsIGFyZ0xpc3QpID0+IHsKKyAgICAgICAgICBpZiAoYXJnLklzRXhjZWxSYW5nZSkgeworICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gYXJnLlZhbHVlQXNSYW5nZUluZm8pIHsKKyAgICAgICAgICAgICAgaWYgKCFpZ25vcmVFcnJvcnMgJiYgY2VsbC5Jc0V4Y2VsRXJyb3IpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKEV4Y2VsRXJyb3JWYWx1ZS5QYXJzZShjZWxsLlZhbHVlLlRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoIUNlbGxTdGF0ZUhlbHBlci5TaG91bGRJZ25vcmUoaWdub3JlSGlkZGVuLCBjZWxsLCBjb250ZXh0KQorICAgICAgICAgICAgICAgICAgJiYgQ29udmVydFV0aWwuSXNOdW1lcmljKGNlbGwuVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgYXJnTGlzdC5BZGQoY2VsbC5WYWx1ZURvdWJsZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFpZ25vcmVFcnJvcnMgJiYgYXJnLlZhbHVlSXNFeGNlbEVycm9yKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oYXJnLlZhbHVlQXNFeGNlbEVycm9yVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKENvbnZlcnRVdGlsLklzTnVtZXJpYyhhcmcuVmFsdWUpCisgICAgICAgICAgICAgICAgJiYgIUNlbGxTdGF0ZUhlbHBlci5TaG91bGRJZ25vcmUoaWdub3JlSGlkZGVuLCBhcmcsIGNvbnRleHQpKSB7CisgICAgICAgICAgICAgIGFyZ0xpc3QuQWRkKENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZy5WYWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgIH0KKworICBwdWJsaWMgdmlydHVhbCBJRW51bWVyYWJsZTxkb3VibGU+IENvbnZlcnRBcmdzSW5jbHVkaW5nT3RoZXJUeXBlcygKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cykgeworICAgIHJldHVybiBiYXNlLkZ1bmNBcmdzVG9GbGF0RW51bWVyYWJsZSgKKyAgICAgICAgYXJndW1lbnRzLAorICAgICAgICAoYXJnLCBhcmdMaXN0KSA9PiB7CisgICAgICAgICAgLy92YXIgY2VsbEluZm8gPSBhcmcuVmFsdWUgYXMgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIuQ2VsbEluZm87CisgICAgICAgICAgLy92YXIgdmFsdWUgPSBjZWxsSW5mbyAhPSBudWxsID8gY2VsbEluZm8uVmFsdWUgOiBhcmcuVmFsdWU7CisgICAgICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiAoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbylhcmcuVmFsdWUpIHsKKyAgICAgICAgICAgICAgYXJnTGlzdC5BZGQoY2VsbC5WYWx1ZURvdWJsZUxvZ2ljYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYXJnLlZhbHVlIGlzIGRvdWJsZSB8fCBhcmcuVmFsdWUgaXMgaW50IHx8IGFyZy5WYWx1ZSBpcyBib29sKSB7CisgICAgICAgICAgICAgIGFyZ0xpc3QuQWRkKENvbnZlcnQuVG9Eb3VibGUoYXJnLlZhbHVlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5WYWx1ZSBpcyBzdHJpbmcpIHsKKyAgICAgICAgICAgICAgYXJnTGlzdC5BZGQoMGQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRXJyb3JIYW5kbGluZ0Z1bmN0aW9uLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9FcnJvckhhbmRsaW5nRnVuY3Rpb24uY3MKaW5kZXggYmZjNzNlZS4uZmI5NTBhOCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9FcnJvckhhbmRsaW5nRnVuY3Rpb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9FcnJvckhhbmRsaW5nRnVuY3Rpb24uY3MKQEAgLTcsNTQgKzcsNDIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CisKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEJhc2UgY2xhc3MgZm9yIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZXMgYW4gZXJyb3IgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZQotICAgIC8vLyBub3JtYWwgZXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbi4KLSAgICAvLy8gSWYgYW4gZXhjZXB0aW9uIG9jY3VycyBkdXJpbmcgdGhlIEV4ZWN1dGUtY2FsbCB0aGF0IGV4Y2VwdGlvbiB3aWxsIGJlCi0gICAgLy8vIGNhdWdodCBieSB0aGUgY29tcGlsZXIsIHRoZW4gdGhlIEhhbmRsZUVycm9yLW1ldGhvZCB3aWxsIGJlIGNhbGxlZC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFcnJvckhhbmRsaW5nRnVuY3Rpb24gOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgZnVuY3Rpb24gaXMgYW4gRXJyb3JIYW5kbGluZ0Z1bmN0aW9uLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0Vycm9ySGFuZGxpbmdGdW5jdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE1ldGhvZCB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCB0byBoYW5kbGUgdGhlIGVycm9yLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVycm9yQ29kZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIGFic3RyYWN0IENvbXBpbGVSZXN1bHQgSGFuZGxlRXJyb3Ioc3RyaW5nIGVycm9yQ29kZSk7Ci0gICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIEJhc2UgY2xhc3MgZm9yIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZXMgYW4gZXJyb3IgdGhhdCBvY2N1cnMgZHVyaW5nIHRoZQorLy8vIG5vcm1hbCBleGVjdXRpb24gb2YgdGhlIGZ1bmN0aW9uLgorLy8vIElmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIHRoZSBFeGVjdXRlLWNhbGwgdGhhdCBleGNlcHRpb24gd2lsbCBiZQorLy8vIGNhdWdodCBieSB0aGUgY29tcGlsZXIsIHRoZW4gdGhlIEhhbmRsZUVycm9yLW1ldGhvZCB3aWxsIGJlIGNhbGxlZC4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXJyb3JIYW5kbGluZ0Z1bmN0aW9uIDogRXhjZWxGdW5jdGlvbiB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBmdW5jdGlvbiBpcyBhbiBFcnJvckhhbmRsaW5nRnVuY3Rpb24uCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBvdmVycmlkZSBib29sIElzRXJyb3JIYW5kbGluZ0Z1bmN0aW9uID0+IHRydWU7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTWV0aG9kIHRoYXQgc2hvdWxkIGJlIGltcGxlbWVudGVkIHRvIGhhbmRsZSB0aGUgZXJyb3IuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iZXJyb3JDb2RlIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgYWJzdHJhY3QgQ29tcGlsZVJlc3VsdCBIYW5kbGVFcnJvcihzdHJpbmcgZXJyb3JDb2RlKTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRXhjZWxGdW5jdGlvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRXhjZWxGdW5jdGlvbi5jcwppbmRleCAwMWUzNTY4Li5hZDAzY2FlIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0V4Y2VsRnVuY3Rpb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9FeGNlbEZ1bmN0aW9uLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpAQCAtNyw0NDcgKzcsNDMzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEJhc2UgY2xhc3MgZm9yIEV4Y2VsIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgRXhjZWxGdW5jdGlvbigpCi0gICAgICAgICAgICA6IHRoaXMobmV3IEFyZ3VtZW50Q29sbGVjdGlvblV0aWwoKSwgbmV3IEFyZ3VtZW50UGFyc2VycygpLCBuZXcgQ29tcGlsZVJlc3VsdFZhbGlkYXRvcnMoKSkKLSAgICAgICAgeworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwogCi0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBCYXNlIGNsYXNzIGZvciBFeGNlbCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGFic3RyYWN0IGNsYXNzIEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgRXhjZWxGdW5jdGlvbigpCisgICAgICA6IHRoaXMobmV3KCksIG5ldygpLCBuZXcoKSkge30KIAotICAgICAgICBwdWJsaWMgRXhjZWxGdW5jdGlvbigKLSAgICAgICAgICAgIEFyZ3VtZW50Q29sbGVjdGlvblV0aWwgYXJndW1lbnRDb2xsZWN0aW9uVXRpbCwgCi0gICAgICAgICAgICBBcmd1bWVudFBhcnNlcnMgYXJndW1lbnRQYXJzZXJzLAotICAgICAgICAgICAgQ29tcGlsZVJlc3VsdFZhbGlkYXRvcnMgY29tcGlsZVJlc3VsdFZhbGlkYXRvcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9hcmd1bWVudENvbGxlY3Rpb25VdGlsID0gYXJndW1lbnRDb2xsZWN0aW9uVXRpbDsKLSAgICAgICAgICAgIF9hcmd1bWVudFBhcnNlcnMgPSBhcmd1bWVudFBhcnNlcnM7Ci0gICAgICAgICAgICBfY29tcGlsZVJlc3VsdFZhbGlkYXRvcnMgPSBjb21waWxlUmVzdWx0VmFsaWRhdG9yczsKLSAgICAgICAgfQorICBwdWJsaWMgRXhjZWxGdW5jdGlvbigKKyAgICAgIEFyZ3VtZW50Q29sbGVjdGlvblV0aWwgYXJndW1lbnRDb2xsZWN0aW9uVXRpbCwKKyAgICAgIEFyZ3VtZW50UGFyc2VycyBhcmd1bWVudFBhcnNlcnMsCisgICAgICBDb21waWxlUmVzdWx0VmFsaWRhdG9ycyBjb21waWxlUmVzdWx0VmFsaWRhdG9ycykgeworICAgIF9hcmd1bWVudENvbGxlY3Rpb25VdGlsID0gYXJndW1lbnRDb2xsZWN0aW9uVXRpbDsKKyAgICBfYXJndW1lbnRQYXJzZXJzID0gYXJndW1lbnRQYXJzZXJzOworICAgIF9jb21waWxlUmVzdWx0VmFsaWRhdG9ycyA9IGNvbXBpbGVSZXN1bHRWYWxpZGF0b3JzOworICB9CiAKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBBcmd1bWVudENvbGxlY3Rpb25VdGlsIF9hcmd1bWVudENvbGxlY3Rpb25VdGlsOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEFyZ3VtZW50UGFyc2VycyBfYXJndW1lbnRQYXJzZXJzOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IENvbXBpbGVSZXN1bHRWYWxpZGF0b3JzIF9jb21waWxlUmVzdWx0VmFsaWRhdG9yczsKKyAgcHJpdmF0ZSByZWFkb25seSBBcmd1bWVudENvbGxlY3Rpb25VdGlsIF9hcmd1bWVudENvbGxlY3Rpb25VdGlsOworICBwcml2YXRlIHJlYWRvbmx5IEFyZ3VtZW50UGFyc2VycyBfYXJndW1lbnRQYXJzZXJzOworICBwcml2YXRlIHJlYWRvbmx5IENvbXBpbGVSZXN1bHRWYWxpZGF0b3JzIF9jb21waWxlUmVzdWx0VmFsaWRhdG9yczsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPkFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24sIGVhY2ggYXJndW1lbnQgY2FuIGNvbnRhaW4gcHJpbWl0aXZlIHR5cGVzLCBsaXN0cyBvciA8c2VlIGNyZWY9IkV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8iPkV4Y2VsIHJhbmdlczwvc2VlPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGV4dCI+VGhlIDxzZWUgY3JlZj0iUGFyc2luZ0NvbnRleHQiLz4gY29udGFpbnMgdmFyaW91cyBkYXRhIHRoYXQgY2FuIGJlIHVzZWZ1bCBpbiBmdW5jdGlvbnMuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJDb21waWxlUmVzdWx0Ii8+IGNvbnRhaW5pbmcgdGhlIGNhbGN1bGF0ZWQgdmFsdWU8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPkFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24sIGVhY2ggYXJndW1lbnQgY2FuIGNvbnRhaW4gcHJpbWl0aXZlIHR5cGVzLCBsaXN0cyBvciA8c2VlIGNyZWY9IkV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8iPkV4Y2VsIHJhbmdlczwvc2VlPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29udGV4dCI+VGhlIDxzZWUgY3JlZj0iUGFyc2luZ0NvbnRleHQiLz4gY29udGFpbnMgdmFyaW91cyBkYXRhIHRoYXQgY2FuIGJlIHVzZWZ1bCBpbiBmdW5jdGlvbnMuPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPkEgPHNlZSBjcmVmPSJDb21waWxlUmVzdWx0Ii8+IGNvbnRhaW5pbmcgdGhlIGNhbGN1bGF0ZWQgdmFsdWU8L3JldHVybnM+CisgIHB1YmxpYyBhYnN0cmFjdCBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KTsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiBvdmVycmlkZGVuLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIEV4ZWN1dGUgaXMgY2FsbGVkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbnRleHQiPjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQmVmb3JlSW52b2tlKFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiBvdmVycmlkZGVuLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIEV4ZWN1dGUgaXMgY2FsbGVkLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbnRleHQiPjwvcGFyYW0+CisgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgQmVmb3JlSW52b2tlKFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHt9CiAKLSAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBJc0xvb2t1cEZ1Y3Rpb24gCi0gICAgICAgIHsgCi0gICAgICAgICAgICBnZXQgCi0gICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgCi0gICAgICAgICAgICB9IAotICAgICAgICB9CisgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgSXNMb29rdXBGdWN0aW9uID0+IGZhbHNlOwogCi0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgSXNFcnJvckhhbmRsaW5nRnVuY3Rpb24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBVc2VkIGZvciBzb21lIExvb2t1cGZ1bmN0aW9ucyB0byBpbmRpY2F0ZSB0aGF0IGZ1bmN0aW9uIGFyZ3VtZW50cyBzaG91bGQKLSAgICAgICAgLy8vIG5vdCBiZSBjb21waWxlZCBiZWZvcmUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgU2tpcEFyZ3VtZW50RXZhbHVhdGlvbiB7IGdldDsgc2V0OyB9Ci0gICAgICAgIHByb3RlY3RlZCBvYmplY3QgR2V0Rmlyc3RWYWx1ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiB2YWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhcmcgPSAoKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KXZhbCkuRmlyc3RPckRlZmF1bHQoKTsKLSAgICAgICAgICAgIGlmKGFyZy5WYWx1ZSBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vdmFyIHI9KChFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKWFyZyk7Ci0gICAgICAgICAgICAgICAgdmFyIHIgPSBhcmcuVmFsdWVBc1JhbmdlSW5mbzsKLSAgICAgICAgICAgICAgICByZXR1cm4gci5HZXRWYWx1ZShyLkFkZHJlc3MuX2Zyb21Sb3csIHIuQWRkcmVzcy5fZnJvbUNvbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFyZz09bnVsbD9udWxsOmFyZy5WYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGlzIGZ1bmN0aW9ucyB2YWxpZGF0ZXMgdGhhdCB0aGUgc3VwcGxpZWQgPHBhcmFtcmVmIG5hbWU9ImFyZ3VtZW50cyIvPiBjb250YWlucyBhdCBsZWFzdAotICAgICAgICAvLy8gKHRoZSB2YWx1ZSBvZikgPHBhcmFtcmVmIG5hbWU9Im1pbkxlbmd0aCIvPiBlbGVtZW50cy4gSWYgb25lIG9mIHRoZSBhcmd1bWVudHMgaXMgYW4KLSAgICAgICAgLy8vIDxzZWUgY3JlZj0iRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyI+RXhjZWwgcmFuZ2U8L3NlZT4gdGhlIG51bWJlciBvZiBjZWxscyBpbgotICAgICAgICAvLy8gdGhhdCByYW5nZSB3aWxsIGJlIGNvdW50ZWQgYXMgd2VsbC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWluTGVuZ3RoIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVycm9yVHlwZVRvVGhyb3ciPlRoZSA8c2VlIGNyZWY9ImVFcnJvclR5cGUiLz4gb2YgdGhlIDxzZWUgY3JlZj0iRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIi8+IHRoYXQgd2lsbCBiZSB0aHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9Im1pbkxlbmd0aCIvPiBpcyBub3QgbWV0LjwvcGFyYW0+Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIFZhbGlkYXRlQXJndW1lbnRzKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgaW50IG1pbkxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUVycm9yVHlwZSBlcnJvclR5cGVUb1Rocm93KQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQoYXJndW1lbnRzKS5OYW1lZCgiYXJndW1lbnRzIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgbkFyZ3MgPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLkFueSgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQXJncysrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuQXJncyA+PSBtaW5MZW5ndGgpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLklzRXhjZWxSYW5nZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5BcmdzICs9IGFyZy5WYWx1ZUFzUmFuZ2VJbmZvLkdldE5DZWxscygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobkFyZ3MgPj0gbWluTGVuZ3RoKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0sIGVycm9yVHlwZVRvVGhyb3cpOwotICAgICAgICB9CisgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgSXNFcnJvckhhbmRsaW5nRnVuY3Rpb24gPT4gZmFsc2U7CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhpcyBmdW5jdGlvbnMgdmFsaWRhdGVzIHRoYXQgdGhlIHN1cHBsaWVkIDxwYXJhbXJlZiBuYW1lPSJhcmd1bWVudHMiLz4gY29udGFpbnMgYXQgbGVhc3QKLSAgICAgICAgLy8vICh0aGUgdmFsdWUgb2YpIDxwYXJhbXJlZiBuYW1lPSJtaW5MZW5ndGgiLz4gZWxlbWVudHMuIElmIG9uZSBvZiB0aGUgYXJndW1lbnRzIGlzIGFuCi0gICAgICAgIC8vLyA8c2VlIGNyZWY9IkV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8iPkV4Y2VsIHJhbmdlPC9zZWU+IHRoZSBudW1iZXIgb2YgY2VsbHMgaW4KLSAgICAgICAgLy8vIHRoYXQgcmFuZ2Ugd2lsbCBiZSBjb3VudGVkIGFzIHdlbGwuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1pbkxlbmd0aCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPjwvZXhjZXB0aW9uPgotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBWYWxpZGF0ZUFyZ3VtZW50cyhJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIGludCBtaW5MZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlcXVpcmUuVGhhdChhcmd1bWVudHMpLk5hbWVkKCJhcmd1bWVudHMiKS5Jc05vdE51bGwoKTsKLSAgICAgICAgICAgIFRocm93QXJndW1lbnRFeGNlcHRpb25JZigoKSA9PgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIG5BcmdzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5BbnkoKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiBhcmd1bWVudHMpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbkFyZ3MrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobkFyZ3MgPj0gbWluTGVuZ3RoKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5Jc0V4Y2VsUmFuZ2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQXJncyArPSBhcmcuVmFsdWVBc1JhbmdlSW5mby5HZXROQ2VsbHMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5BcmdzID49IG1pbkxlbmd0aCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9LCAiRXhwZWN0aW5nIGF0IGxlYXN0IHswfSBhcmd1bWVudHMiLCBtaW5MZW5ndGguVG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVXNlZCBmb3Igc29tZSBMb29rdXBmdW5jdGlvbnMgdG8gaW5kaWNhdGUgdGhhdCBmdW5jdGlvbiBhcmd1bWVudHMgc2hvdWxkCisgIC8vLyBub3QgYmUgY29tcGlsZWQgYmVmb3JlIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIFNraXBBcmd1bWVudEV2YWx1YXRpb24geyBnZXQ7IHNldDsgfQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBhcmd1bWVudCBhdHQgdGhlIHBvc2l0aW9uIG9mIHRoZSAwLWJhc2VkCi0gICAgICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0iaW5kZXgiLz4gYXMgYW4gaW50ZWdlci4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5kZXgiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5WYWx1ZSBvZiB0aGUgYXJndW1lbnQgYXMgYW4gaW50ZWdlci48L3JldHVybnM+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbiI+PC9leGNlcHRpb24+Ci0gICAgICAgIHByb3RlY3RlZCBpbnQgQXJnVG9JbnQoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBpbnQgaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB2YWwgPSBhcmd1bWVudHMuRWxlbWVudEF0KGluZGV4KS5WYWx1ZUZpcnN0OwotICAgICAgICAgICAgcmV0dXJuIChpbnQpX2FyZ3VtZW50UGFyc2Vycy5HZXRQYXJzZXIoRGF0YVR5cGUuSW50ZWdlcikuUGFyc2UodmFsKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBhcmd1bWVudCBhdHQgdGhlIHBvc2l0aW9uIG9mIHRoZSAwLWJhc2VkCi0gICAgICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0iaW5kZXgiLz4gYXMgYSBzdHJpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VmFsdWUgb2YgdGhlIGFyZ3VtZW50IGFzIGEgc3RyaW5nLjwvcmV0dXJucz4KLSAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBBcmdUb1N0cmluZyhJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIGludCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG9iaiA9IGFyZ3VtZW50cy5FbGVtZW50QXQoaW5kZXgpLlZhbHVlRmlyc3Q7Ci0gICAgICAgICAgICByZXR1cm4gb2JqICE9IG51bGwgPyBvYmouVG9TdHJpbmcoKSA6IHN0cmluZy5FbXB0eTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBhcmd1bWVudCBhdHQgdGhlIHBvc2l0aW9uIG9mIHRoZSAwLWJhc2VkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib2JqIj48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VmFsdWUgb2YgdGhlIGFyZ3VtZW50IGFzIGEgZG91YmxlLjwvcmV0dXJucz4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIj48L2V4Y2VwdGlvbj4KLSAgICAgICAgcHJvdGVjdGVkIGRvdWJsZSBBcmdUb0RlY2ltYWwob2JqZWN0IG9iaikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChkb3VibGUpX2FyZ3VtZW50UGFyc2Vycy5HZXRQYXJzZXIoRGF0YVR5cGUuRGVjaW1hbCkuUGFyc2Uob2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBhcmd1bWVudCBhdHQgdGhlIHBvc2l0aW9uIG9mIHRoZSAwLWJhc2VkCi0gICAgICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0iaW5kZXgiLz4gYXMgYSA8c2VlIGNyZWY9IlN5c3RlbS5Eb3VibGUiLz4uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VmFsdWUgb2YgdGhlIGFyZ3VtZW50IGFzIGFuIGludGVnZXIuPC9yZXR1cm5zPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24iPjwvZXhjZXB0aW9uPgotICAgICAgICBwcm90ZWN0ZWQgZG91YmxlIEFyZ1RvRGVjaW1hbChJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIGludCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFyZ1RvRGVjaW1hbChhcmd1bWVudHMuRWxlbWVudEF0KGluZGV4KS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgZG91YmxlIERpdmlkZShkb3VibGUgbGVmdCwgZG91YmxlIHJpZ2h0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoU3lzdGVtLk1hdGguQWJzKHJpZ2h0IC0gMGQpIDwgZG91YmxlLkVwc2lsb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLkRpdjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGxlZnQvcmlnaHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbCBJc051bWVyaWNTdHJpbmcob2JqZWN0IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZS5Ub1N0cmluZygpKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIFJlZ2V4LklzTWF0Y2godmFsdWUuVG9TdHJpbmcoKSwgQCJeW1xkXSsoXCxbXGRdKT8iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBhcmd1bWVudCBpcyBhIGJvb2xlYW4gdmFsdWUgaXRzIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgICAgIC8vLyBJZiB0aGUgYXJndW1lbnQgaXMgYW4gaW50ZWdlciB2YWx1ZSwgdHJ1ZSB3aWxsIGJlIHJldHVybmVkIGlmIGl0cwotICAgICAgICAvLy8gdmFsdWUgaXMgbm90IDAsIG90aGVyd2lzZSBmYWxzZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5kZXgiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHByb3RlY3RlZCBib29sIEFyZ1RvQm9vbChJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIGludCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG9iaiA9IGFyZ3VtZW50cy5FbGVtZW50QXQoaW5kZXgpLlZhbHVlID8/IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIHJldHVybiAoYm9vbClfYXJndW1lbnRQYXJzZXJzLkdldFBhcnNlcihEYXRhVHlwZS5Cb29sZWFuKS5QYXJzZShvYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhyb3dzIGFuIDxzZWUgY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iLz4gaWYgPHBhcmFtcmVmIG5hbWU9ImNvbmRpdGlvbiIvPiBldmFsdWF0ZXMgdG8gdHJ1ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPjwvZXhjZXB0aW9uPgotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBUaHJvd0FyZ3VtZW50RXhjZXB0aW9uSWYoRnVuYzxib29sPiBjb25kaXRpb24sIHN0cmluZyBtZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29uZGl0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhyb3dzIGFuIDxzZWUgY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iLz4gaWYgPHBhcmFtcmVmIG5hbWU9ImNvbmRpdGlvbiIvPiBldmFsdWF0ZXMgdG8gdHJ1ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmb3JtYXRzIj5Gb3JtYXRzIHRvIHRoZSBtZXNzYWdlIHN0cmluZy48L3BhcmFtPgotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBUaHJvd0FyZ3VtZW50RXhjZXB0aW9uSWYoRnVuYzxib29sPiBjb25kaXRpb24sIHN0cmluZyBtZXNzYWdlLCBwYXJhbXMgb2JqZWN0W10gZm9ybWF0cykKLSAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZSA9IHN0cmluZy5Gb3JtYXQobWVzc2FnZSwgZm9ybWF0cyk7Ci0gICAgICAgICAgICBUaHJvd0FyZ3VtZW50RXhjZXB0aW9uSWYoY29uZGl0aW9uLCBtZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRocm93cyBhbiA8c2VlIGNyZWY9IkV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbiIvPiB3aXRoIHRoZSBnaXZlbiA8cGFyYW1yZWYgbmFtZT0iZXJyb3JUeXBlIi8+IHNldC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlcnJvclR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUgZXJyb3JUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKCJBbiBleGNlbCBmdW5jdGlvbiBlcnJvciBvY2N1cnJlZCIsIEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZXJyb3JUeXBlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaHJvd3MgYW4gPHNlZSBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiIvPiBpZiA8cGFyYW1yZWYgbmFtZT0iY29uZGl0aW9uIi8+IGV2YWx1YXRlcyB0byB0cnVlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbmRpdGlvbiI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlcnJvclR5cGUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbiI+PC9leGNlcHRpb24+Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uSWYoRnVuYzxib29sPiBjb25kaXRpb24sIGVFcnJvclR5cGUgZXJyb3JUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29uZGl0aW9uKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbigiQW4gZXhjZWwgZnVuY3Rpb24gZXJyb3Igb2NjdXJyZWQiLCBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVycm9yVHlwZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGJvb2wgSXNOdW1lcmljKG9iamVjdCB2YWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuICh2YWwuR2V0VHlwZSgpLklzUHJpbWl0aXZlIHx8IHZhbCBpcyBkb3VibGUgfHwgdmFsIGlzIGRlY2ltYWwgIHx8IHZhbCBpcyBTeXN0ZW0uRGF0ZVRpbWUgfHwgdmFsIGlzIFRpbWVTcGFuKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcHJvdGVjdGVkIHZpcnR1YWwgYm9vbCBJc051bWJlcihvYmplY3Qgb2JqKQotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIC8vICAgIHJldHVybiAob2JqIGlzIGludCB8fCBvYmogaXMgZG91YmxlIHx8IG9iaiBpcyBzaG9ydCB8fCBvYmogaXMgZGVjaW1hbCB8fCBvYmogaXMgbG9uZyk7Ci0gICAgICAgIC8vfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEhlbHBlciBtZXRob2QgZm9yIGNvbXBhcmlzb24gb2YgdHdvIGRvdWJsZXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZDEiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZDIiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHByb3RlY3RlZCBib29sIEFyZUVxdWFsKGRvdWJsZSBkMSwgZG91YmxlIGQyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gU3lzdGVtLk1hdGguQWJzKGQxIC0gZDIpIDwgZG91YmxlLkVwc2lsb247Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXaWxsIHJldHVybiB0aGUgYXJndW1lbnRzIGFzIGFuIGVudW1lcmFibGUgb2YgZG91Ymxlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGV4dCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgSUVudW1lcmFibGU8ZG91YmxlPiBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKGZhbHNlLCBhcmd1bWVudHMsIGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gV2lsbCByZXR1cm4gdGhlIGFyZ3VtZW50cyBhcyBhbiBlbnVtZXJhYmxlIG9mIGRvdWJsZXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaWdub3JlSGlkZGVuQ2VsbHMiPklmIGEgY2VsbCBpcyBoaWRkZW4gYW5kIHRoaXMgdmFsdWUgaXMgdHJ1ZSB0aGUgdmFsdWUgb2YgdGhhdCBjZWxsIHdpbGwgYmUgaWdub3JlZDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaWdub3JlRXJyb3JzIj5JZiBhIGNlbGwgY29udGFpbnMgYW4gZXJyb3IsIHRoYXQgZXJyb3Igd2lsbCBiZSBpZ25vcmVkIGlmIHRoaXMgbWV0aG9kIGlzIHNldCB0byB0cnVlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGV4dCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgSUVudW1lcmFibGU8ZG91YmxlPiBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKGJvb2wgaWdub3JlSGlkZGVuQ2VsbHMsIGJvb2wgaWdub3JlRXJyb3JzLCBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRDb2xsZWN0aW9uVXRpbC5BcmdzVG9Eb3VibGVFbnVtZXJhYmxlKGlnbm9yZUhpZGRlbkNlbGxzLCBpZ25vcmVFcnJvcnMsIGFyZ3VtZW50cywgY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXaWxsIHJldHVybiB0aGUgYXJndW1lbnRzIGFzIGFuIGVudW1lcmFibGUgb2YgZG91Ymxlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpZ25vcmVIaWRkZW5DZWxscyI+SWYgYSBjZWxsIGlzIGhpZGRlbiBhbmQgdGhpcyB2YWx1ZSBpcyB0cnVlIHRoZSB2YWx1ZSBvZiB0aGF0IGNlbGwgd2lsbCBiZSBpZ25vcmVkPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGV4dCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgSUVudW1lcmFibGU8ZG91YmxlPiBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKGJvb2wgaWdub3JlSGlkZGVuQ2VsbHMsIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoaWdub3JlSGlkZGVuQ2VsbHMsIHRydWUsIGFyZ3VtZW50cywgY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXaWxsIHJldHVybiB0aGUgYXJndW1lbnRzIGFzIGFuIGVudW1lcmFibGUgb2Ygb2JqZWN0cy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpZ25vcmVIaWRkZW5DZWxscyI+SWYgYSBjZWxsIGlzIGhpZGRlbiBhbmQgdGhpcyB2YWx1ZSBpcyB0cnVlIHRoZSB2YWx1ZSBvZiB0aGF0IGNlbGwgd2lsbCBiZSBpZ25vcmVkPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29udGV4dCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHJvdGVjdGVkIHZpcnR1YWwgSUVudW1lcmFibGU8b2JqZWN0PiBBcmdzVG9PYmplY3RFbnVtZXJhYmxlKGJvb2wgaWdub3JlSGlkZGVuQ2VsbHMsIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudENvbGxlY3Rpb25VdGlsLkFyZ3NUb09iamVjdEVudW1lcmFibGUoaWdub3JlSGlkZGVuQ2VsbHMsIGFyZ3VtZW50cywgY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBVc2UgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgcmVzdWx0IHRvIHJldHVybiBmcm9tIEV4Y2VsIGZ1bmN0aW9ucy4gCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVzdWx0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGFUeXBlIj48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwcm90ZWN0ZWQgQ29tcGlsZVJlc3VsdCBDcmVhdGVSZXN1bHQob2JqZWN0IHJlc3VsdCwgRGF0YVR5cGUgZGF0YVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB2YWxpZGF0b3IgPSBfY29tcGlsZVJlc3VsdFZhbGlkYXRvcnMuR2V0VmFsaWRhdG9yKGRhdGFUeXBlKTsKLSAgICAgICAgICAgIHZhbGlkYXRvci5WYWxpZGF0ZShyZXN1bHQpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KHJlc3VsdCwgZGF0YVR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVXNlIHRoaXMgbWV0aG9kIHRvIGFwcGx5IGEgZnVuY3Rpb24gb24gYSBjb2xsZWN0aW9uIG9mIGFyZ3VtZW50cy4gVGhlIDxwYXJhbXJlZiBuYW1lPSJyZXN1bHQiLz4KLSAgICAgICAgLy8vIHNob3VsZCBiZSBtb2RpZnllZCBpbiB0aGUgc3VwcGxpZWQgPHBhcmFtcmVmIG5hbWU9ImFjdGlvbiIvPiBhbmQgd2lsbCBjb250YWluIHRoZSByZXN1bHQKLSAgICAgICAgLy8vIGFmdGVyIHRoaXMgb3BlcmF0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2xsZWN0aW9uIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJlc3VsdCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhY3Rpb24iPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGRvdWJsZSBDYWxjdWxhdGVDb2xsZWN0aW9uKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGNvbGxlY3Rpb24sIGRvdWJsZSByZXN1bHQsIEZ1bmM8RnVuY3Rpb25Bcmd1bWVudCxkb3VibGUsZG91YmxlPiBhY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRDb2xsZWN0aW9uVXRpbC5DYWxjdWxhdGVDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIHJlc3VsdCwgYWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIGlmIHRoZSBzdXBwbGllZCA8cGFyYW1yZWYgbmFtZT0iYXJnIj5hcmd1bWVudDwvcGFyYW1yZWY+IGNvbnRhaW5zIGFuIEV4Y2VsIGVycm9yCi0gICAgICAgIC8vLyBhbiA8c2VlIGNyZWY9IkV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbiIvPiB3aXRoIHRoYXQgZXJyb3Jjb2RlIHdpbGwgYmUgdGhyb3duCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJnIj48L3BhcmFtPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24iPjwvZXhjZXB0aW9uPgotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBDaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoRnVuY3Rpb25Bcmd1bWVudCBhcmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhcmcuVmFsdWVJc0V4Y2VsRXJyb3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oYXJnLlZhbHVlQXNFeGNlbEVycm9yVmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBzdXBwbGllZCA8cGFyYW1yZWYgbmFtZT0iY2VsbCIvPiBjb250YWlucyBhbiBFeGNlbCBlcnJvcgotICAgICAgICAvLy8gYW4gPHNlZSBjcmVmPSJFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24iLz4gd2l0aCB0aGF0IGVycm9yY29kZSB3aWxsIGJlIHRocm93bgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNlbGwiPjwvcGFyYW0+Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihFeGNlbERhdGFQcm92aWRlci5JQ2VsbEluZm8gY2VsbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNlbGwuSXNFeGNlbEVycm9yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKEV4Y2VsRXJyb3JWYWx1ZS5QYXJzZShjZWxsLlZhbHVlLlRvU3RyaW5nKCkpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgQ29tcGlsZVJlc3VsdCBHZXRSZXN1bHRCeU9iamVjdChvYmplY3QgcmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoSXNOdW1lcmljKHJlc3VsdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc3VsdCBpcyBzdHJpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLlN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoRXhjZWxFcnJvclZhbHVlLlZhbHVlcy5Jc0Vycm9yVmFsdWUocmVzdWx0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRXhjZWxBZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29tcGlsZVJlc3VsdC5FbXB0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5FbnVtZXJhYmxlKTsKLSAgICAgICAgfQorICBwcm90ZWN0ZWQgb2JqZWN0IEdldEZpcnN0VmFsdWUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gdmFsKSB7CisgICAgdmFyIGFyZyA9IHZhbC5GaXJzdE9yRGVmYXVsdCgpOworICAgIGlmIChhcmcuVmFsdWUgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykgeworICAgICAgLy92YXIgcj0oKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pYXJnKTsKKyAgICAgIHZhciByID0gYXJnLlZhbHVlQXNSYW5nZUluZm87CisgICAgICByZXR1cm4gci5HZXRWYWx1ZShyLkFkZHJlc3MuX2Zyb21Sb3csIHIuQWRkcmVzcy5fZnJvbUNvbCk7CiAgICAgfQorICAgIHJldHVybiBhcmcgPT0gbnVsbCA/IG51bGwgOiBhcmcuVmFsdWU7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGZ1bmN0aW9ucyB2YWxpZGF0ZXMgdGhhdCB0aGUgc3VwcGxpZWQgPHBhcmFtcmVmIG5hbWU9ImFyZ3VtZW50cyIvPiBjb250YWlucyBhdCBsZWFzdAorICAvLy8gKHRoZSB2YWx1ZSBvZikgPHBhcmFtcmVmIG5hbWU9Im1pbkxlbmd0aCIvPiBlbGVtZW50cy4gSWYgb25lIG9mIHRoZSBhcmd1bWVudHMgaXMgYW4KKyAgLy8vIDxzZWUgY3JlZj0iRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyI+RXhjZWwgcmFuZ2U8L3NlZT4gdGhlIG51bWJlciBvZiBjZWxscyBpbgorICAvLy8gdGhhdCByYW5nZSB3aWxsIGJlIGNvdW50ZWQgYXMgd2VsbC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibWluTGVuZ3RoIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImVycm9yVHlwZVRvVGhyb3ciPlRoZSA8c2VlIGNyZWY9ImVFcnJvclR5cGUiLz4gb2YgdGhlIDxzZWUgY3JlZj0iRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIi8+IHRoYXQgd2lsbCBiZSB0aHJvd24gaWYgPHBhcmFtcmVmIG5hbWU9Im1pbkxlbmd0aCIvPiBpcyBub3QgbWV0LjwvcGFyYW0+CisgIHByb3RlY3RlZCB2b2lkIFZhbGlkYXRlQXJndW1lbnRzKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgaW50IG1pbkxlbmd0aCwKKyAgICAgIGVFcnJvclR5cGUgZXJyb3JUeXBlVG9UaHJvdykgeworICAgIFJlcXVpcmUuVGhhdChhcmd1bWVudHMpLk5hbWVkKCJhcmd1bWVudHMiKS5Jc05vdE51bGwoKTsKKyAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKAorICAgICAgICAoKSA9PiB7CisgICAgICAgICAgdmFyIG5BcmdzID0gMDsKKyAgICAgICAgICBpZiAoYXJndW1lbnRzLkFueSgpKSB7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykgeworICAgICAgICAgICAgICBuQXJncysrOworICAgICAgICAgICAgICBpZiAobkFyZ3MgPj0gbWluTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChhcmcuSXNFeGNlbFJhbmdlKSB7CisgICAgICAgICAgICAgICAgbkFyZ3MgKz0gYXJnLlZhbHVlQXNSYW5nZUluZm8uR2V0TkNlbGxzKCk7CisgICAgICAgICAgICAgICAgaWYgKG5BcmdzID49IG1pbkxlbmd0aCkgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSwKKyAgICAgICAgZXJyb3JUeXBlVG9UaHJvdyk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGZ1bmN0aW9ucyB2YWxpZGF0ZXMgdGhhdCB0aGUgc3VwcGxpZWQgPHBhcmFtcmVmIG5hbWU9ImFyZ3VtZW50cyIvPiBjb250YWlucyBhdCBsZWFzdAorICAvLy8gKHRoZSB2YWx1ZSBvZikgPHBhcmFtcmVmIG5hbWU9Im1pbkxlbmd0aCIvPiBlbGVtZW50cy4gSWYgb25lIG9mIHRoZSBhcmd1bWVudHMgaXMgYW4KKyAgLy8vIDxzZWUgY3JlZj0iRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyI+RXhjZWwgcmFuZ2U8L3NlZT4gdGhlIG51bWJlciBvZiBjZWxscyBpbgorICAvLy8gdGhhdCByYW5nZSB3aWxsIGJlIGNvdW50ZWQgYXMgd2VsbC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibWluTGVuZ3RoIj48L3BhcmFtPgorICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+PC9leGNlcHRpb24+CisgIHByb3RlY3RlZCB2b2lkIFZhbGlkYXRlQXJndW1lbnRzKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgaW50IG1pbkxlbmd0aCkgeworICAgIFJlcXVpcmUuVGhhdChhcmd1bWVudHMpLk5hbWVkKCJhcmd1bWVudHMiKS5Jc05vdE51bGwoKTsKKyAgICBUaHJvd0FyZ3VtZW50RXhjZXB0aW9uSWYoCisgICAgICAgICgpID0+IHsKKyAgICAgICAgICB2YXIgbkFyZ3MgPSAwOworICAgICAgICAgIGlmIChhcmd1bWVudHMuQW55KCkpIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhcmcgaW4gYXJndW1lbnRzKSB7CisgICAgICAgICAgICAgIG5BcmdzKys7CisgICAgICAgICAgICAgIGlmIChuQXJncyA+PSBtaW5MZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKGFyZy5Jc0V4Y2VsUmFuZ2UpIHsKKyAgICAgICAgICAgICAgICBuQXJncyArPSBhcmcuVmFsdWVBc1JhbmdlSW5mby5HZXROQ2VsbHMoKTsKKyAgICAgICAgICAgICAgICBpZiAobkFyZ3MgPj0gbWluTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9LAorICAgICAgICAiRXhwZWN0aW5nIGF0IGxlYXN0IHswfSBhcmd1bWVudHMiLAorICAgICAgICBtaW5MZW5ndGguVG9TdHJpbmcoKSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQgYXR0IHRoZSBwb3NpdGlvbiBvZiB0aGUgMC1iYXNlZAorICAvLy8gPHBhcmFtcmVmIG5hbWU9ImluZGV4Ii8+IGFzIGFuIGludGVnZXIuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+VmFsdWUgb2YgdGhlIGFyZ3VtZW50IGFzIGFuIGludGVnZXIuPC9yZXR1cm5zPgorICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24iPjwvZXhjZXB0aW9uPgorICBwcm90ZWN0ZWQgaW50IEFyZ1RvSW50KElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgaW50IGluZGV4KSB7CisgICAgdmFyIHZhbCA9IGFyZ3VtZW50cy5FbGVtZW50QXQoaW5kZXgpLlZhbHVlRmlyc3Q7CisgICAgcmV0dXJuIChpbnQpX2FyZ3VtZW50UGFyc2Vycy5HZXRQYXJzZXIoRGF0YVR5cGUuSW50ZWdlcikuUGFyc2UodmFsKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBhcmd1bWVudCBhdHQgdGhlIHBvc2l0aW9uIG9mIHRoZSAwLWJhc2VkCisgIC8vLyA8cGFyYW1yZWYgbmFtZT0iaW5kZXgiLz4gYXMgYSBzdHJpbmcuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+VmFsdWUgb2YgdGhlIGFyZ3VtZW50IGFzIGEgc3RyaW5nLjwvcmV0dXJucz4KKyAgcHJvdGVjdGVkIHN0cmluZyBBcmdUb1N0cmluZyhJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIGludCBpbmRleCkgeworICAgIHZhciBvYmogPSBhcmd1bWVudHMuRWxlbWVudEF0KGluZGV4KS5WYWx1ZUZpcnN0OworICAgIHJldHVybiBvYmogIT0gbnVsbCA/IG9iai5Ub1N0cmluZygpIDogc3RyaW5nLkVtcHR5OworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50IGF0dCB0aGUgcG9zaXRpb24gb2YgdGhlIDAtYmFzZWQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJvYmoiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5WYWx1ZSBvZiB0aGUgYXJndW1lbnQgYXMgYSBkb3VibGUuPC9yZXR1cm5zPgorICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24iPjwvZXhjZXB0aW9uPgorICBwcm90ZWN0ZWQgZG91YmxlIEFyZ1RvRGVjaW1hbChvYmplY3Qgb2JqKSB7CisgICAgcmV0dXJuIChkb3VibGUpX2FyZ3VtZW50UGFyc2Vycy5HZXRQYXJzZXIoRGF0YVR5cGUuRGVjaW1hbCkuUGFyc2Uob2JqKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBhcmd1bWVudCBhdHQgdGhlIHBvc2l0aW9uIG9mIHRoZSAwLWJhc2VkCisgIC8vLyA8cGFyYW1yZWYgbmFtZT0iaW5kZXgiLz4gYXMgYSA8c2VlIGNyZWY9IlN5c3RlbS5Eb3VibGUiLz4uCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+VmFsdWUgb2YgdGhlIGFyZ3VtZW50IGFzIGFuIGludGVnZXIuPC9yZXR1cm5zPgorICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24iPjwvZXhjZXB0aW9uPgorICBwcm90ZWN0ZWQgZG91YmxlIEFyZ1RvRGVjaW1hbChJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIGludCBpbmRleCkgeworICAgIHJldHVybiBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLkVsZW1lbnRBdChpbmRleCkuVmFsdWUpOworICB9CisKKyAgcHJvdGVjdGVkIGRvdWJsZSBEaXZpZGUoZG91YmxlIGxlZnQsIGRvdWJsZSByaWdodCkgeworICAgIGlmIChTeXN0ZW0uTWF0aC5BYnMocmlnaHQgLSAwZCkgPCBkb3VibGUuRXBzaWxvbikgeworICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLkRpdjApOworICAgIH0KKyAgICByZXR1cm4gbGVmdCAvIHJpZ2h0OworICB9CisKKyAgcHJvdGVjdGVkIGJvb2wgSXNOdW1lcmljU3RyaW5nKG9iamVjdCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlLlRvU3RyaW5nKCkpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBSZWdleC5Jc01hdGNoKHZhbHVlLlRvU3RyaW5nKCksIEAiXltcZF0rKFwsW1xkXSk/Iik7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgYXJndW1lbnQgaXMgYSBib29sZWFuIHZhbHVlIGl0cyB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLgorICAvLy8gSWYgdGhlIGFyZ3VtZW50IGlzIGFuIGludGVnZXIgdmFsdWUsIHRydWUgd2lsbCBiZSByZXR1cm5lZCBpZiBpdHMKKyAgLy8vIHZhbHVlIGlzIG5vdCAwLCBvdGhlcndpc2UgZmFsc2UuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnRzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwcm90ZWN0ZWQgYm9vbCBBcmdUb0Jvb2woSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBpbnQgaW5kZXgpIHsKKyAgICB2YXIgb2JqID0gYXJndW1lbnRzLkVsZW1lbnRBdChpbmRleCkuVmFsdWUgPz8gc3RyaW5nLkVtcHR5OworICAgIHJldHVybiAoYm9vbClfYXJndW1lbnRQYXJzZXJzLkdldFBhcnNlcihEYXRhVHlwZS5Cb29sZWFuKS5QYXJzZShvYmopOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhyb3dzIGFuIDxzZWUgY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iLz4gaWYgPHBhcmFtcmVmIG5hbWU9ImNvbmRpdGlvbiIvPiBldmFsdWF0ZXMgdG8gdHJ1ZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+PC9wYXJhbT4KKyAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPjwvZXhjZXB0aW9uPgorICBwcm90ZWN0ZWQgdm9pZCBUaHJvd0FyZ3VtZW50RXhjZXB0aW9uSWYoRnVuYzxib29sPiBjb25kaXRpb24sIHN0cmluZyBtZXNzYWdlKSB7CisgICAgaWYgKGNvbmRpdGlvbigpKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24obWVzc2FnZSk7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhyb3dzIGFuIDxzZWUgY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iLz4gaWYgPHBhcmFtcmVmIG5hbWU9ImNvbmRpdGlvbiIvPiBldmFsdWF0ZXMgdG8gdHJ1ZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb25kaXRpb24iPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmb3JtYXRzIj5Gb3JtYXRzIHRvIHRoZSBtZXNzYWdlIHN0cmluZy48L3BhcmFtPgorICBwcm90ZWN0ZWQgdm9pZCBUaHJvd0FyZ3VtZW50RXhjZXB0aW9uSWYoCisgICAgICBGdW5jPGJvb2w+IGNvbmRpdGlvbiwKKyAgICAgIHN0cmluZyBtZXNzYWdlLAorICAgICAgcGFyYW1zIG9iamVjdFtdIGZvcm1hdHMpIHsKKyAgICBtZXNzYWdlID0gc3RyaW5nLkZvcm1hdChtZXNzYWdlLCBmb3JtYXRzKTsKKyAgICBUaHJvd0FyZ3VtZW50RXhjZXB0aW9uSWYoY29uZGl0aW9uLCBtZXNzYWdlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRocm93cyBhbiA8c2VlIGNyZWY9IkV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbiIvPiB3aXRoIHRoZSBnaXZlbiA8cGFyYW1yZWYgbmFtZT0iZXJyb3JUeXBlIi8+IHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJlcnJvclR5cGUiPjwvcGFyYW0+CisgIHByb3RlY3RlZCB2b2lkIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUgZXJyb3JUeXBlKSB7CisgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbigKKyAgICAgICAgIkFuIGV4Y2VsIGZ1bmN0aW9uIGVycm9yIG9jY3VycmVkIiwKKyAgICAgICAgRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlcnJvclR5cGUpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRocm93cyBhbiA8c2VlIGNyZWY9IkFyZ3VtZW50RXhjZXB0aW9uIi8+IGlmIDxwYXJhbXJlZiBuYW1lPSJjb25kaXRpb24iLz4gZXZhbHVhdGVzIHRvIHRydWUuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29uZGl0aW9uIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImVycm9yVHlwZSI+PC9wYXJhbT4KKyAgLy8vIDxleGNlcHRpb24gY3JlZj0iRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIj48L2V4Y2VwdGlvbj4KKyAgcHJvdGVjdGVkIHZvaWQgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZihGdW5jPGJvb2w+IGNvbmRpdGlvbiwgZUVycm9yVHlwZSBlcnJvclR5cGUpIHsKKyAgICBpZiAoY29uZGl0aW9uKCkpIHsKKyAgICAgIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oCisgICAgICAgICAgIkFuIGV4Y2VsIGZ1bmN0aW9uIGVycm9yIG9jY3VycmVkIiwKKyAgICAgICAgICBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVycm9yVHlwZSkpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBib29sIElzTnVtZXJpYyhvYmplY3QgdmFsKSB7CisgICAgaWYgKHZhbCA9PSBudWxsKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAodmFsLkdldFR5cGUoKS5Jc1ByaW1pdGl2ZQorICAgICAgICAgICAgfHwgdmFsIGlzIGRvdWJsZQorICAgICAgICAgICAgfHwgdmFsIGlzIGRlY2ltYWwKKyAgICAgICAgICAgIHx8IHZhbCBpcyBTeXN0ZW0uRGF0ZVRpbWUKKyAgICAgICAgICAgIHx8IHZhbCBpcyBUaW1lU3Bhbik7CisgIH0KKworICAvL3Byb3RlY3RlZCB2aXJ0dWFsIGJvb2wgSXNOdW1iZXIob2JqZWN0IG9iaikKKyAgLy97CisgIC8vICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAvLyAgICByZXR1cm4gKG9iaiBpcyBpbnQgfHwgb2JqIGlzIGRvdWJsZSB8fCBvYmogaXMgc2hvcnQgfHwgb2JqIGlzIGRlY2ltYWwgfHwgb2JqIGlzIGxvbmcpOworICAvL30KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBIZWxwZXIgbWV0aG9kIGZvciBjb21wYXJpc29uIG9mIHR3byBkb3VibGVzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImQxIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImQyIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwcm90ZWN0ZWQgYm9vbCBBcmVFcXVhbChkb3VibGUgZDEsIGRvdWJsZSBkMikgeworICAgIHJldHVybiBTeXN0ZW0uTWF0aC5BYnMoZDEgLSBkMikgPCBkb3VibGUuRXBzaWxvbjsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFdpbGwgcmV0dXJuIHRoZSBhcmd1bWVudHMgYXMgYW4gZW51bWVyYWJsZSBvZiBkb3VibGVzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFyZ3VtZW50cyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb250ZXh0Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwcm90ZWN0ZWQgdmlydHVhbCBJRW51bWVyYWJsZTxkb3VibGU+IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgcmV0dXJuIEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoZmFsc2UsIGFyZ3VtZW50cywgY29udGV4dCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBXaWxsIHJldHVybiB0aGUgYXJndW1lbnRzIGFzIGFuIGVudW1lcmFibGUgb2YgZG91Ymxlcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpZ25vcmVIaWRkZW5DZWxscyI+SWYgYSBjZWxsIGlzIGhpZGRlbiBhbmQgdGhpcyB2YWx1ZSBpcyB0cnVlIHRoZSB2YWx1ZSBvZiB0aGF0IGNlbGwgd2lsbCBiZSBpZ25vcmVkPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpZ25vcmVFcnJvcnMiPklmIGEgY2VsbCBjb250YWlucyBhbiBlcnJvciwgdGhhdCBlcnJvciB3aWxsIGJlIGlnbm9yZWQgaWYgdGhpcyBtZXRob2QgaXMgc2V0IHRvIHRydWU8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFyZ3VtZW50cyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb250ZXh0Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwcm90ZWN0ZWQgdmlydHVhbCBJRW51bWVyYWJsZTxkb3VibGU+IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoCisgICAgICBib29sIGlnbm9yZUhpZGRlbkNlbGxzLAorICAgICAgYm9vbCBpZ25vcmVFcnJvcnMsCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgcmV0dXJuIF9hcmd1bWVudENvbGxlY3Rpb25VdGlsLkFyZ3NUb0RvdWJsZUVudW1lcmFibGUoCisgICAgICAgIGlnbm9yZUhpZGRlbkNlbGxzLAorICAgICAgICBpZ25vcmVFcnJvcnMsCisgICAgICAgIGFyZ3VtZW50cywKKyAgICAgICAgY29udGV4dCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBXaWxsIHJldHVybiB0aGUgYXJndW1lbnRzIGFzIGFuIGVudW1lcmFibGUgb2YgZG91Ymxlcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpZ25vcmVIaWRkZW5DZWxscyI+SWYgYSBjZWxsIGlzIGhpZGRlbiBhbmQgdGhpcyB2YWx1ZSBpcyB0cnVlIHRoZSB2YWx1ZSBvZiB0aGF0IGNlbGwgd2lsbCBiZSBpZ25vcmVkPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudHMiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29udGV4dCI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHJvdGVjdGVkIHZpcnR1YWwgSUVudW1lcmFibGU8ZG91YmxlPiBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKAorICAgICAgYm9vbCBpZ25vcmVIaWRkZW5DZWxscywKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICByZXR1cm4gQXJnc1RvRG91YmxlRW51bWVyYWJsZShpZ25vcmVIaWRkZW5DZWxscywgdHJ1ZSwgYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFdpbGwgcmV0dXJuIHRoZSBhcmd1bWVudHMgYXMgYW4gZW51bWVyYWJsZSBvZiBvYmplY3RzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Imlnbm9yZUhpZGRlbkNlbGxzIj5JZiBhIGNlbGwgaXMgaGlkZGVuIGFuZCB0aGlzIHZhbHVlIGlzIHRydWUgdGhlIHZhbHVlIG9mIHRoYXQgY2VsbCB3aWxsIGJlIGlnbm9yZWQ8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFyZ3VtZW50cyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb250ZXh0Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwcm90ZWN0ZWQgdmlydHVhbCBJRW51bWVyYWJsZTxvYmplY3Q+IEFyZ3NUb09iamVjdEVudW1lcmFibGUoCisgICAgICBib29sIGlnbm9yZUhpZGRlbkNlbGxzLAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHJldHVybiBfYXJndW1lbnRDb2xsZWN0aW9uVXRpbC5BcmdzVG9PYmplY3RFbnVtZXJhYmxlKGlnbm9yZUhpZGRlbkNlbGxzLCBhcmd1bWVudHMsIGNvbnRleHQpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVXNlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhIHJlc3VsdCB0byByZXR1cm4gZnJvbSBFeGNlbCBmdW5jdGlvbnMuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icmVzdWx0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImRhdGFUeXBlIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwcm90ZWN0ZWQgQ29tcGlsZVJlc3VsdCBDcmVhdGVSZXN1bHQob2JqZWN0IHJlc3VsdCwgRGF0YVR5cGUgZGF0YVR5cGUpIHsKKyAgICB2YXIgdmFsaWRhdG9yID0gX2NvbXBpbGVSZXN1bHRWYWxpZGF0b3JzLkdldFZhbGlkYXRvcihkYXRhVHlwZSk7CisgICAgdmFsaWRhdG9yLlZhbGlkYXRlKHJlc3VsdCk7CisgICAgcmV0dXJuIG5ldyhyZXN1bHQsIGRhdGFUeXBlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFVzZSB0aGlzIG1ldGhvZCB0byBhcHBseSBhIGZ1bmN0aW9uIG9uIGEgY29sbGVjdGlvbiBvZiBhcmd1bWVudHMuIFRoZSA8cGFyYW1yZWYgbmFtZT0icmVzdWx0Ii8+CisgIC8vLyBzaG91bGQgYmUgbW9kaWZ5ZWQgaW4gdGhlIHN1cHBsaWVkIDxwYXJhbXJlZiBuYW1lPSJhY3Rpb24iLz4gYW5kIHdpbGwgY29udGFpbiB0aGUgcmVzdWx0CisgIC8vLyBhZnRlciB0aGlzIG9wZXJhdGlvbiBoYXMgYmVlbiBwZXJmb3JtZWQuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sbGVjdGlvbiI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyZXN1bHQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWN0aW9uIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwcm90ZWN0ZWQgdmlydHVhbCBkb3VibGUgQ2FsY3VsYXRlQ29sbGVjdGlvbigKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGNvbGxlY3Rpb24sCisgICAgICBkb3VibGUgcmVzdWx0LAorICAgICAgRnVuYzxGdW5jdGlvbkFyZ3VtZW50LCBkb3VibGUsIGRvdWJsZT4gYWN0aW9uKSB7CisgICAgcmV0dXJuIF9hcmd1bWVudENvbGxlY3Rpb25VdGlsLkNhbGN1bGF0ZUNvbGxlY3Rpb24oY29sbGVjdGlvbiwgcmVzdWx0LCBhY3Rpb24pOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gaWYgdGhlIHN1cHBsaWVkIDxwYXJhbXJlZiBuYW1lPSJhcmciPmFyZ3VtZW50PC9wYXJhbXJlZj4gY29udGFpbnMgYW4gRXhjZWwgZXJyb3IKKyAgLy8vIGFuIDxzZWUgY3JlZj0iRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIi8+IHdpdGggdGhhdCBlcnJvcmNvZGUgd2lsbCBiZSB0aHJvd24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhcmciPjwvcGFyYW0+CisgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbiI+PC9leGNlcHRpb24+CisgIHByb3RlY3RlZCB2b2lkIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihGdW5jdGlvbkFyZ3VtZW50IGFyZykgeworICAgIGlmIChhcmcuVmFsdWVJc0V4Y2VsRXJyb3IpIHsKKyAgICAgIHRocm93IChuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGFyZy5WYWx1ZUFzRXhjZWxFcnJvclZhbHVlKSk7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhlIHN1cHBsaWVkIDxwYXJhbXJlZiBuYW1lPSJjZWxsIi8+IGNvbnRhaW5zIGFuIEV4Y2VsIGVycm9yCisgIC8vLyBhbiA8c2VlIGNyZWY9IkV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbiIvPiB3aXRoIHRoYXQgZXJyb3Jjb2RlIHdpbGwgYmUgdGhyb3duCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iY2VsbCI+PC9wYXJhbT4KKyAgcHJvdGVjdGVkIHZvaWQgQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKEV4Y2VsRGF0YVByb3ZpZGVyLklDZWxsSW5mbyBjZWxsKSB7CisgICAgaWYgKGNlbGwuSXNFeGNlbEVycm9yKSB7CisgICAgICB0aHJvdyAobmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihFeGNlbEVycm9yVmFsdWUuUGFyc2UoY2VsbC5WYWx1ZS5Ub1N0cmluZygpKSkpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBDb21waWxlUmVzdWx0IEdldFJlc3VsdEJ5T2JqZWN0KG9iamVjdCByZXN1bHQpIHsKKyAgICBpZiAoSXNOdW1lcmljKHJlc3VsdCkpIHsKKyAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICB9CisgICAgaWYgKHJlc3VsdCBpcyBzdHJpbmcpIHsKKyAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5TdHJpbmcpOworICAgIH0KKyAgICBpZiAoRXhjZWxFcnJvclZhbHVlLlZhbHVlcy5Jc0Vycm9yVmFsdWUocmVzdWx0KSkgeworICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkV4Y2VsQWRkcmVzcyk7CisgICAgfQorICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIENvbXBpbGVSZXN1bHQuRW1wdHk7CisgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5FbnVtZXJhYmxlKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9GdW5jdGlvbkFyZ3VtZW50LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9GdW5jdGlvbkFyZ3VtZW50LmNzCmluZGV4IDdlMjI5MDUuLjdkZWM0YjMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRnVuY3Rpb25Bcmd1bWVudC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uQXJndW1lbnQuY3MKQEAgLTcsOTIgKzcsNjMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCi17Ci0gICAgcHVibGljIGNsYXNzIEZ1bmN0aW9uQXJndW1lbnQKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBGdW5jdGlvbkFyZ3VtZW50KG9iamVjdCB2YWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gdmFsOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7CiAKLSAgICAgICAgcHJpdmF0ZSBFeGNlbENlbGxTdGF0ZSBfZXhjZWxDZWxsU3RhdGU7CitwdWJsaWMgY2xhc3MgRnVuY3Rpb25Bcmd1bWVudCB7CisgIHB1YmxpYyBGdW5jdGlvbkFyZ3VtZW50KG9iamVjdCB2YWwpIHsKKyAgICBWYWx1ZSA9IHZhbDsKKyAgfQogCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldEV4Y2VsU3RhdGVGbGFnKEV4Y2VsQ2VsbFN0YXRlIHN0YXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXhjZWxDZWxsU3RhdGUgfD0gc3RhdGU7Ci0gICAgICAgIH0KKyAgcHJpdmF0ZSBFeGNlbENlbGxTdGF0ZSBfZXhjZWxDZWxsU3RhdGU7CiAKLSAgICAgICAgcHVibGljIGJvb2wgRXhjZWxTdGF0ZUZsYWdJc1NldChFeGNlbENlbGxTdGF0ZSBzdGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChfZXhjZWxDZWxsU3RhdGUgJiBzdGF0ZSkgIT0gMDsKLSAgICAgICAgfQorICBwdWJsaWMgdm9pZCBTZXRFeGNlbFN0YXRlRmxhZyhFeGNlbENlbGxTdGF0ZSBzdGF0ZSkgeworICAgIF9leGNlbENlbGxTdGF0ZSB8PSBzdGF0ZTsKKyAgfQogCi0gICAgICAgIHB1YmxpYyBvYmplY3QgVmFsdWUgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgIHB1YmxpYyBib29sIEV4Y2VsU3RhdGVGbGFnSXNTZXQoRXhjZWxDZWxsU3RhdGUgc3RhdGUpIHsKKyAgICByZXR1cm4gKF9leGNlbENlbGxTdGF0ZSAmIHN0YXRlKSAhPSAwOworICB9CiAKLSAgICAgICAgcHVibGljIFR5cGUgVHlwZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gVmFsdWUgIT0gbnVsbCA/IFZhbHVlLkdldFR5cGUoKSA6IG51bGw7IH0KLSAgICAgICAgfQorICBwdWJsaWMgb2JqZWN0IFZhbHVlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQogCi0gICAgICAgIHB1YmxpYyBib29sIElzRXhjZWxSYW5nZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gVmFsdWUgIT0gbnVsbCAmJiBWYWx1ZSBpcyBFcHBsdXNFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvOyB9Ci0gICAgICAgIH0KKyAgcHVibGljIFR5cGUgVHlwZSA9PiBWYWx1ZSAhPSBudWxsID8gVmFsdWUuR2V0VHlwZSgpIDogbnVsbDsKIAotICAgICAgICBwdWJsaWMgYm9vbCBWYWx1ZUlzRXhjZWxFcnJvcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gRXhjZWxFcnJvclZhbHVlLlZhbHVlcy5Jc0Vycm9yVmFsdWUoVmFsdWUpOyB9Ci0gICAgICAgIH0KKyAgcHVibGljIGJvb2wgSXNFeGNlbFJhbmdlID0+IFZhbHVlICE9IG51bGwgJiYgVmFsdWUgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbzsKIAotICAgICAgICBwdWJsaWMgRXhjZWxFcnJvclZhbHVlIFZhbHVlQXNFeGNlbEVycm9yVmFsdWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIEV4Y2VsRXJyb3JWYWx1ZS5QYXJzZShWYWx1ZS5Ub1N0cmluZygpKTsgfQotICAgICAgICB9CisgIHB1YmxpYyBib29sIFZhbHVlSXNFeGNlbEVycm9yID0+IEV4Y2VsRXJyb3JWYWx1ZS5WYWx1ZXMuSXNFcnJvclZhbHVlKFZhbHVlKTsKIAotICAgICAgICBwdWJsaWMgRXBwbHVzRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyBWYWx1ZUFzUmFuZ2VJbmZvCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBWYWx1ZSBhcyBFcHBsdXNFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvOyB9Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIG9iamVjdCBWYWx1ZUZpcnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChWYWx1ZSBpcyBFeGNlbERhdGFQcm92aWRlci5JTmFtZUluZm8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9ICgoRXhjZWxEYXRhUHJvdmlkZXIuSU5hbWVJbmZvKVZhbHVlKS5WYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFyIHYgPSBWYWx1ZSBhcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvOwotICAgICAgICAgICAgICAgIGlmICh2PT1udWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5HZXRWYWx1ZSh2LkFkZHJlc3MuX2Zyb21Sb3csIHYuQWRkcmVzcy5fZnJvbUNvbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHB1YmxpYyBFeGNlbEVycm9yVmFsdWUgVmFsdWVBc0V4Y2VsRXJyb3JWYWx1ZSA9PiBFeGNlbEVycm9yVmFsdWUuUGFyc2UoVmFsdWUuVG9TdHJpbmcoKSk7CiAKKyAgcHVibGljIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8gVmFsdWVBc1JhbmdlSW5mbyA9PiBWYWx1ZSBhcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvOworCisgIHB1YmxpYyBvYmplY3QgVmFsdWVGaXJzdCB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChWYWx1ZSBpcyBFeGNlbERhdGFQcm92aWRlci5JTmFtZUluZm8pIHsKKyAgICAgICAgVmFsdWUgPSAoKEV4Y2VsRGF0YVByb3ZpZGVyLklOYW1lSW5mbylWYWx1ZSkuVmFsdWU7CisgICAgICB9CisgICAgICB2YXIgdiA9IFZhbHVlIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87CisgICAgICBpZiAodiA9PSBudWxsKSB7CisgICAgICAgIHJldHVybiBWYWx1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB2LkdldFZhbHVlKHYuQWRkcmVzcy5fZnJvbVJvdywgdi5BZGRyZXNzLl9mcm9tQ29sKTsKICAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRnVuY3Rpb25OYW1lUHJvdmlkZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uTmFtZVByb3ZpZGVyLmNzCmluZGV4IDUxNGNjNjUuLjAxMmE3YzcgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvRnVuY3Rpb25OYW1lUHJvdmlkZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9GdW5jdGlvbk5hbWVQcm92aWRlci5jcwpAQCAtNyw0NCArNywzMCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICBwdWJsaWMgY2xhc3MgRnVuY3Rpb25OYW1lUHJvdmlkZXIgOiBJRnVuY3Rpb25OYW1lUHJvdmlkZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgRnVuY3Rpb25OYW1lUHJvdmlkZXIoKQotICAgICAgICB7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7CiAKLSAgICAgICAgfQorcHVibGljIGNsYXNzIEZ1bmN0aW9uTmFtZVByb3ZpZGVyIDogSUZ1bmN0aW9uTmFtZVByb3ZpZGVyIHsKKyAgcHJpdmF0ZSBGdW5jdGlvbk5hbWVQcm92aWRlcigpIHt9CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBGdW5jdGlvbk5hbWVQcm92aWRlciBFbXB0eQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gbmV3IEZ1bmN0aW9uTmFtZVByb3ZpZGVyKCk7IH0KLSAgICAgICAgfQorICBwdWJsaWMgc3RhdGljIEZ1bmN0aW9uTmFtZVByb3ZpZGVyIEVtcHR5ID0+IG5ldygpOwogCi0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgSXNGdW5jdGlvbk5hbWUoc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KKyAgcHVibGljIHZpcnR1YWwgYm9vbCBJc0Z1bmN0aW9uTmFtZShzdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9GdW5jdGlvblJlcG9zaXRvcnkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uUmVwb3NpdG9yeS5jcwppbmRleCA4MThjYzU2Li40MmQ3ZjBiIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uUmVwb3NpdG9yeS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uUmVwb3NpdG9yeS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKQEAgLTcsMTM4ICs3LDExNCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICAvLyBVc2VkIHRvIHJlcG9ydCB0aGUgbmFtZXMgb2YgRXhjZWwgZnVuY3Rpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgRVBQbHVzCi0gICAgcHVibGljIGNsYXNzIEZ1bmN0aW9uRXhjZXB0aW9uIDogU3lzdGVtRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBTdW1tYXJ5OgotICAgICAgICAvLyAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN5c3RlbS5GdW5jdGlvbkV4Y2VwdGlvbiBjbGFzcy4KLSAgICAgICAgcHVibGljIEZ1bmN0aW9uRXhjZXB0aW9uKCkKLSAgICAgICAgICAgIDogYmFzZSgpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICAvLwotICAgICAgICAvLyBTdW1tYXJ5OgotICAgICAgICAvLyAgICAgSW5pdGlhbGl6ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN5c3RlbS5GdW5jdGlvbkV4Y2VwdGlvbiBjbGFzcyB3aXRoIGEgc3BlY2lmaWVkCi0gICAgICAgIC8vICAgICBlcnJvciBtZXNzYWdlLgotICAgICAgICAvLwotICAgICAgICAvLyBQYXJhbWV0ZXJzOgotICAgICAgICAvLyAgIG1lc3NhZ2U6Ci0gICAgICAgIC8vICAgICBUaGUgbWVzc2FnZSB0aGF0IGRlc2NyaWJlcyB0aGUgZXJyb3IuCi0gICAgICAgIHB1YmxpYyBGdW5jdGlvbkV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSkKLSAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKKworLy8gVXNlZCB0byByZXBvcnQgdGhlIG5hbWVzIG9mIEV4Y2VsIGZ1bmN0aW9ucyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IEVQUGx1cworcHVibGljIGNsYXNzIEZ1bmN0aW9uRXhjZXB0aW9uIDogU3lzdGVtRXhjZXB0aW9uIHsKKyAgLy8gU3VtbWFyeToKKyAgLy8gICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTeXN0ZW0uRnVuY3Rpb25FeGNlcHRpb24gY2xhc3MuCisgIHB1YmxpYyBGdW5jdGlvbkV4Y2VwdGlvbigpIHt9CisKKyAgLy8KKyAgLy8gU3VtbWFyeToKKyAgLy8gICAgIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTeXN0ZW0uRnVuY3Rpb25FeGNlcHRpb24gY2xhc3Mgd2l0aCBhIHNwZWNpZmllZAorICAvLyAgICAgZXJyb3IgbWVzc2FnZS4KKyAgLy8KKyAgLy8gUGFyYW1ldGVyczoKKyAgLy8gICBtZXNzYWdlOgorICAvLyAgICAgVGhlIG1lc3NhZ2UgdGhhdCBkZXNjcmliZXMgdGhlIGVycm9yLgorICBwdWJsaWMgRnVuY3Rpb25FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCisgICAgICA6IGJhc2UobWVzc2FnZSkge30KK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWNjZXNzaW5nL21vZGlmeWluZyBWQkEgRnVuY3Rpb25zLgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBGdW5jdGlvblJlcG9zaXRvcnkgOiBJRnVuY3Rpb25OYW1lUHJvdmlkZXIgeworICBwcml2YXRlIERpY3Rpb25hcnk8c3RyaW5nLCBFeGNlbEZ1bmN0aW9uPiBfZnVuY3Rpb25zID0gbmV3KFN0cmluZ0NvbXBhcmVyLkludmFyaWFudEN1bHR1cmUpOworCisgIHByaXZhdGUgRnVuY3Rpb25SZXBvc2l0b3J5KCkge30KKworICBwdWJsaWMgc3RhdGljIEZ1bmN0aW9uUmVwb3NpdG9yeSBDcmVhdGUoKSB7CisgICAgdmFyIHJlcG8gPSBuZXcgRnVuY3Rpb25SZXBvc2l0b3J5KCk7CisgICAgcmVwby5Mb2FkTW9kdWxlKG5ldyBCdWlsdEluRnVuY3Rpb25zKCkpOworICAgIHJldHVybiByZXBvOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTG9hZHMgYSBtb2R1bGUgb2YgPHNlZSBjcmVmPSJFeGNlbEZ1bmN0aW9uIi8+cyB0byB0aGUgZnVuY3Rpb24gcmVwb3NpdG9yeS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJtb2R1bGUiPkEgPHNlZSBjcmVmPSJJRnVuY3Rpb25Nb2R1bGUiLz4gdGhhdCBjYW4gYmUgdXNlZCBmb3IgYWRkaW5nIGZ1bmN0aW9uczwvcGFyYW0+CisgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgTG9hZE1vZHVsZShJRnVuY3Rpb25Nb2R1bGUgbW9kdWxlKSB7CisgICAgZm9yZWFjaCAodmFyIGtleSBpbiBtb2R1bGUuRnVuY3Rpb25zLktleXMpIHsKKyAgICAgIHZhciBsb3dlcktleSA9IGtleS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgX2Z1bmN0aW9uc1tsb3dlcktleV0gPSBtb2R1bGUuRnVuY3Rpb25zW2tleV07CiAgICAgfQorICB9CiAKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWNjZXNzaW5nL21vZGlmeWluZyBWQkEgRnVuY3Rpb25zLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEZ1bmN0aW9uUmVwb3NpdG9yeSA6IElGdW5jdGlvbk5hbWVQcm92aWRlcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PHN0cmluZywgRXhjZWxGdW5jdGlvbj4gX2Z1bmN0aW9ucyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgRXhjZWxGdW5jdGlvbj4oU3RyaW5nQ29tcGFyZXIuSW52YXJpYW50Q3VsdHVyZSk7Ci0KLSAgICAgICAgcHJpdmF0ZSBGdW5jdGlvblJlcG9zaXRvcnkoKQotICAgICAgICB7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRnVuY3Rpb25SZXBvc2l0b3J5IENyZWF0ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXBvID0gbmV3IEZ1bmN0aW9uUmVwb3NpdG9yeSgpOwotICAgICAgICAgICAgcmVwby5Mb2FkTW9kdWxlKG5ldyBCdWlsdEluRnVuY3Rpb25zKCkpOwotICAgICAgICAgICAgcmV0dXJuIHJlcG87Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMb2FkcyBhIG1vZHVsZSBvZiA8c2VlIGNyZWY9IkV4Y2VsRnVuY3Rpb24iLz5zIHRvIHRoZSBmdW5jdGlvbiByZXBvc2l0b3J5LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1vZHVsZSI+QSA8c2VlIGNyZWY9IklGdW5jdGlvbk1vZHVsZSIvPiB0aGF0IGNhbiBiZSB1c2VkIGZvciBhZGRpbmcgZnVuY3Rpb25zPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBMb2FkTW9kdWxlKElGdW5jdGlvbk1vZHVsZSBtb2R1bGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBrZXkgaW4gbW9kdWxlLkZ1bmN0aW9ucy5LZXlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBsb3dlcktleSA9IGtleS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgICAgICAgIF9mdW5jdGlvbnNbbG93ZXJLZXldID0gbW9kdWxlLkZ1bmN0aW9uc1trZXldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZpcnR1YWwgRXhjZWxGdW5jdGlvbiBHZXRGdW5jdGlvbihzdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoIV9mdW5jdGlvbnMuQ29udGFpbnNLZXkobmFtZS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBSZXBvcnQgdGhhdCBFeGNlbCBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IEVQUGx1cwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGdW5jdGlvbkV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJFeGNlbCBmdW5jdGlvbiAnezB9JyBpcyBub3Qgc3VwcG9ydGVkIGluIGZvcm11bGFzLiIsIG5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBfZnVuY3Rpb25zW25hbWUuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKV07Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZW1vdmVzIGFsbCBmdW5jdGlvbnMgZnJvbSB0aGUgcmVwb3NpdG9yeQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIENsZWFyKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2Z1bmN0aW9ucy5DbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0aGUgc3VwcGxpZWQgPHBhcmFtcmVmIG5hbWU9Im5hbWUiLz4gZXhpc3RzIGluIHRoZSByZXBvc2l0b3J5LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBib29sIElzRnVuY3Rpb25OYW1lKHN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2Z1bmN0aW9ucy5Db250YWluc0tleShuYW1lLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgbmFtZXMgb2YgYWxsIGltcGxlbWVudGVkIGZ1bmN0aW9ucy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPHN0cmluZz4gRnVuY3Rpb25OYW1lcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX2Z1bmN0aW9ucy5LZXlzOyB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIG9yIHJlcGxhY2VzIGEgZnVuY3Rpb24uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZnVuY3Rpb25OYW1lIj4gQ2FzZS1pbnNlbnNpdGl2ZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0aGF0IHNob3VsZCBiZSBhZGRlZCBvciByZXBsYWNlZC48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZ1bmN0aW9uSW1wbCI+QW4gaW1wbGVtZW50YXRpb24gb2YgYW4gPHNlZSBjcmVmPSJFeGNlbEZ1bmN0aW9uIi8+LjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIEFkZE9yUmVwbGFjZUZ1bmN0aW9uKHN0cmluZyBmdW5jdGlvbk5hbWUsIEV4Y2VsRnVuY3Rpb24gZnVuY3Rpb25JbXBsKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQoZnVuY3Rpb25OYW1lKS5OYW1lZCgiZnVuY3Rpb25OYW1lIikuSXNOb3ROdWxsT3JFbXB0eSgpOwotICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGZ1bmN0aW9uSW1wbCkuTmFtZWQoImZ1bmN0aW9uSW1wbCIpLklzTm90TnVsbCgpOwotICAgICAgICAgICAgdmFyIGZOYW1lID0gZnVuY3Rpb25OYW1lLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICBpZiAoX2Z1bmN0aW9ucy5Db250YWluc0tleShmTmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2Z1bmN0aW9ucy5SZW1vdmUoZk5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2Z1bmN0aW9uc1tmTmFtZV0gPSBmdW5jdGlvbkltcGw7Ci0gICAgICAgIH0KKyAgcHVibGljIHZpcnR1YWwgRXhjZWxGdW5jdGlvbiBHZXRGdW5jdGlvbihzdHJpbmcgbmFtZSkgeworICAgIGlmICghX2Z1bmN0aW9ucy5Db250YWluc0tleShuYW1lLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpKSB7CisgICAgICAvLyBSZXBvcnQgdGhhdCBFeGNlbCBmdW5jdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IEVQUGx1cworICAgICAgdGhyb3cgbmV3IEZ1bmN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgIHN0cmluZy5Gb3JtYXQoIkV4Y2VsIGZ1bmN0aW9uICd7MH0nIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZm9ybXVsYXMuIiwgbmFtZSkpOwogICAgIH0KKyAgICByZXR1cm4gX2Z1bmN0aW9uc1tuYW1lLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSldOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmVtb3ZlcyBhbGwgZnVuY3Rpb25zIGZyb20gdGhlIHJlcG9zaXRvcnkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHZpcnR1YWwgdm9pZCBDbGVhcigpIHsKKyAgICBfZnVuY3Rpb25zLkNsZWFyKCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRoZSBzdXBwbGllZCA8cGFyYW1yZWYgbmFtZT0ibmFtZSIvPiBleGlzdHMgaW4gdGhlIHJlcG9zaXRvcnkuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIGJvb2wgSXNGdW5jdGlvbk5hbWUoc3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gX2Z1bmN0aW9ucy5Db250YWluc0tleShuYW1lLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyB0aGUgbmFtZXMgb2YgYWxsIGltcGxlbWVudGVkIGZ1bmN0aW9ucy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIElFbnVtZXJhYmxlPHN0cmluZz4gRnVuY3Rpb25OYW1lcyA9PiBfZnVuY3Rpb25zLktleXM7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkcyBvciByZXBsYWNlcyBhIGZ1bmN0aW9uLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImZ1bmN0aW9uTmFtZSI+IENhc2UtaW5zZW5zaXRpdmUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgYWRkZWQgb3IgcmVwbGFjZWQuPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmdW5jdGlvbkltcGwiPkFuIGltcGxlbWVudGF0aW9uIG9mIGFuIDxzZWUgY3JlZj0iRXhjZWxGdW5jdGlvbiIvPi48L3BhcmFtPgorICBwdWJsaWMgdm9pZCBBZGRPclJlcGxhY2VGdW5jdGlvbihzdHJpbmcgZnVuY3Rpb25OYW1lLCBFeGNlbEZ1bmN0aW9uIGZ1bmN0aW9uSW1wbCkgeworICAgIFJlcXVpcmUuVGhhdChmdW5jdGlvbk5hbWUpLk5hbWVkKCJmdW5jdGlvbk5hbWUiKS5Jc05vdE51bGxPckVtcHR5KCk7CisgICAgUmVxdWlyZS5UaGF0KGZ1bmN0aW9uSW1wbCkuTmFtZWQoImZ1bmN0aW9uSW1wbCIpLklzTm90TnVsbCgpOworICAgIHZhciBmTmFtZSA9IGZ1bmN0aW9uTmFtZS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgIGlmIChfZnVuY3Rpb25zLkNvbnRhaW5zS2V5KGZOYW1lKSkgeworICAgICAgX2Z1bmN0aW9ucy5SZW1vdmUoZk5hbWUpOworICAgIH0KKyAgICBfZnVuY3Rpb25zW2ZOYW1lXSA9IGZ1bmN0aW9uSW1wbDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9GdW5jdGlvbnNNb2R1bGUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uc01vZHVsZS5jcwppbmRleCBmZjZkNDJiLi41MjI0NTFhIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uc01vZHVsZS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0Z1bmN0aW9uc01vZHVsZS5jcwpAQCAtNywzOCArNywzMSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEJhc2UgY2xhc3MgCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRnVuY3Rpb25zTW9kdWxlIDogSUZ1bmN0aW9uTW9kdWxlCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8c3RyaW5nLCBFeGNlbEZ1bmN0aW9uPiBfZnVuY3Rpb25zID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBFeGNlbEZ1bmN0aW9uPigpOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwogCi0gICAgICAgIHB1YmxpYyBJRGljdGlvbmFyeTxzdHJpbmcsIEV4Y2VsRnVuY3Rpb24+IEZ1bmN0aW9ucwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX2Z1bmN0aW9uczsgfQotICAgICAgICB9Ci0gICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIEJhc2UgY2xhc3MKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRnVuY3Rpb25zTW9kdWxlIDogSUZ1bmN0aW9uTW9kdWxlIHsKKyAgcHJpdmF0ZSByZWFkb25seSBEaWN0aW9uYXJ5PHN0cmluZywgRXhjZWxGdW5jdGlvbj4gX2Z1bmN0aW9ucyA9IG5ldygpOworCisgIHB1YmxpYyBJRGljdGlvbmFyeTxzdHJpbmcsIEV4Y2VsRnVuY3Rpb24+IEZ1bmN0aW9ucyA9PiBfZnVuY3Rpb25zOwogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9IaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9IaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uLmNzCmluZGV4IDJjOWY3NDUuLjgxYjNjYzggMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0hpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24uY3MKQEAgLTcsNzQgKzcsNjQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBCYXNlIGNsYXNzIGZvciBmdW5jdGlvbnMgdGhhdCBuZWVkcyB0byBoYW5kbGUgY2VsbHMgdGhhdCBpcyBub3QgdmlzaWJsZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2V0IHRvIHRydWUgb3IgZmFsc2UgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgZnVuY3Rpb24gc2hvdWxkIGlnbm9yZSBoaWRkZW4gdmFsdWVzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBJZ25vcmVIaWRkZW5WYWx1ZXMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgc2V0OwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7CiAKLSAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIElFbnVtZXJhYmxlPGRvdWJsZT4gQXJnc1RvRG91YmxlRW51bWVyYWJsZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKGFyZ3VtZW50cywgY29udGV4dCwgdHJ1ZSk7Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBCYXNlIGNsYXNzIGZvciBmdW5jdGlvbnMgdGhhdCBuZWVkcyB0byBoYW5kbGUgY2VsbHMgdGhhdCBpcyBub3QgdmlzaWJsZS4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbiA6IEV4Y2VsRnVuY3Rpb24geworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTZXQgdG8gdHJ1ZSBvciBmYWxzZSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBmdW5jdGlvbiBzaG91bGQgaWdub3JlIGhpZGRlbiB2YWx1ZXMuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIElnbm9yZUhpZGRlblZhbHVlcyB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgcHJvdGVjdGVkIElFbnVtZXJhYmxlPGRvdWJsZT4gQXJnc1RvRG91YmxlRW51bWVyYWJsZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQsIGJvb2wgaWdub3JlRXJyb3JzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWFyZ3VtZW50cy5BbnkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRW51bWVyYWJsZS5FbXB0eTxkb3VibGU+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoSWdub3JlSGlkZGVuVmFsdWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBub25IaWRkZW4gPSBhcmd1bWVudHMuV2hlcmUoeCA9PiAheC5FeGNlbFN0YXRlRmxhZ0lzU2V0KEV4Y2VsQ2VsbFN0YXRlLkhpZGRlbkNlbGwpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5BcmdzVG9Eb3VibGVFbnVtZXJhYmxlKElnbm9yZUhpZGRlblZhbHVlcywgbm9uSGlkZGVuLCBjb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBiYXNlLkFyZ3NUb0RvdWJsZUVudW1lcmFibGUoSWdub3JlSGlkZGVuVmFsdWVzLCBpZ25vcmVFcnJvcnMsIGFyZ3VtZW50cywgY29udGV4dCk7Ci0gICAgICAgIH0KKyAgcHJvdGVjdGVkIG92ZXJyaWRlIElFbnVtZXJhYmxlPGRvdWJsZT4gQXJnc1RvRG91YmxlRW51bWVyYWJsZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICByZXR1cm4gQXJnc1RvRG91YmxlRW51bWVyYWJsZShhcmd1bWVudHMsIGNvbnRleHQsIHRydWUpOworICB9CiAKLSAgICAgICAgcHJvdGVjdGVkIGJvb2wgU2hvdWxkSWdub3JlKEV4Y2VsRGF0YVByb3ZpZGVyLklDZWxsSW5mbyBjLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ2VsbFN0YXRlSGVscGVyLlNob3VsZElnbm9yZShJZ25vcmVIaWRkZW5WYWx1ZXMsIGMsIGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCBib29sIFNob3VsZElnbm9yZShGdW5jdGlvbkFyZ3VtZW50IGFyZykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKElnbm9yZUhpZGRlblZhbHVlcyAmJiBhcmcuRXhjZWxTdGF0ZUZsYWdJc1NldChFeGNlbENlbGxTdGF0ZS5IaWRkZW5DZWxsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCisgIHByb3RlY3RlZCBJRW51bWVyYWJsZTxkb3VibGU+IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0LAorICAgICAgYm9vbCBpZ25vcmVFcnJvcnMpIHsKKyAgICBpZiAoIWFyZ3VtZW50cy5BbnkoKSkgeworICAgICAgcmV0dXJuIEVudW1lcmFibGUuRW1wdHk8ZG91YmxlPigpOwogICAgIH0KKyAgICBpZiAoSWdub3JlSGlkZGVuVmFsdWVzKSB7CisgICAgICB2YXIgbm9uSGlkZGVuID0gYXJndW1lbnRzLldoZXJlKHggPT4gIXguRXhjZWxTdGF0ZUZsYWdJc1NldChFeGNlbENlbGxTdGF0ZS5IaWRkZW5DZWxsKSk7CisgICAgICByZXR1cm4gYmFzZS5BcmdzVG9Eb3VibGVFbnVtZXJhYmxlKElnbm9yZUhpZGRlblZhbHVlcywgbm9uSGlkZGVuLCBjb250ZXh0KTsKKyAgICB9CisgICAgcmV0dXJuIGJhc2UuQXJnc1RvRG91YmxlRW51bWVyYWJsZShJZ25vcmVIaWRkZW5WYWx1ZXMsIGlnbm9yZUVycm9ycywgYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgfQorCisgIHByb3RlY3RlZCBib29sIFNob3VsZElnbm9yZShFeGNlbERhdGFQcm92aWRlci5JQ2VsbEluZm8gYywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHJldHVybiBDZWxsU3RhdGVIZWxwZXIuU2hvdWxkSWdub3JlKElnbm9yZUhpZGRlblZhbHVlcywgYywgY29udGV4dCk7CisgIH0KKworICBwcm90ZWN0ZWQgYm9vbCBTaG91bGRJZ25vcmUoRnVuY3Rpb25Bcmd1bWVudCBhcmcpIHsKKyAgICBpZiAoSWdub3JlSGlkZGVuVmFsdWVzICYmIGFyZy5FeGNlbFN0YXRlRmxhZ0lzU2V0KEV4Y2VsQ2VsbFN0YXRlLkhpZGRlbkNlbGwpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0lGdW5jdGlvbk1vZHVsZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSUZ1bmN0aW9uTW9kdWxlLmNzCmluZGV4IDllMzc2MmEuLjZhYjI0OGYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSUZ1bmN0aW9uTW9kdWxlLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSUZ1bmN0aW9uTW9kdWxlLmNzCkBAIC03LDMwICs3LDI2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICBwdWJsaWMgaW50ZXJmYWNlIElGdW5jdGlvbk1vZHVsZQotICAgIHsKLSAgICAgICAgSURpY3Rpb25hcnk8c3RyaW5nLCBFeGNlbEZ1bmN0aW9uPiBGdW5jdGlvbnMgeyBnZXQ7IH0KLSAgICB9Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOworCitwdWJsaWMgaW50ZXJmYWNlIElGdW5jdGlvbk1vZHVsZSB7CisgIElEaWN0aW9uYXJ5PHN0cmluZywgRXhjZWxGdW5jdGlvbj4gRnVuY3Rpb25zIHsgZ2V0OyB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0lGdW5jdGlvbk5hbWVQcm92aWRlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSUZ1bmN0aW9uTmFtZVByb3ZpZGVyLmNzCmluZGV4IGI1YTk5NDAuLjU3MjI4NjIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSUZ1bmN0aW9uTmFtZVByb3ZpZGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSUZ1bmN0aW9uTmFtZVByb3ZpZGVyLmNzCkBAIC03LDMwICs3LDI0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMKLXsKLSAgICBwdWJsaWMgaW50ZXJmYWNlIElGdW5jdGlvbk5hbWVQcm92aWRlcgotICAgIHsKLSAgICAgICAgYm9vbCBJc0Z1bmN0aW9uTmFtZShzdHJpbmcgbmFtZSk7Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOworCitwdWJsaWMgaW50ZXJmYWNlIElGdW5jdGlvbk5hbWVQcm92aWRlciB7CisgIGJvb2wgSXNGdW5jdGlvbk5hbWUoc3RyaW5nIG5hbWUpOwogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9FcnJvclR5cGUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0Vycm9yVHlwZS5jcwppbmRleCBmMzYxZWU3Li45YzU2NWNjIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0Vycm9yVHlwZS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0Vycm9yVHlwZS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKQEAgLTcsNjQgKzcsNjAgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wMS0xNQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5JbmZvcm1hdGlvbgotewotICAgIHB1YmxpYyBjbGFzcyBFcnJvclR5cGUgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBlcnJvciA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCk7Ci0gICAgICAgICAgICB2YXIgaXNFcnJvckZ1bmMgPSBjb250ZXh0LkNvbmZpZ3VyYXRpb24uRnVuY3Rpb25SZXBvc2l0b3J5LkdldEZ1bmN0aW9uKCJpc2Vycm9yIik7Ci0gICAgICAgICAgICB2YXIgaXNFcnJvclJlc3VsdCA9IGlzRXJyb3JGdW5jLkV4ZWN1dGUoYXJndW1lbnRzLCBjb250ZXh0KTsKLSAgICAgICAgICAgIGlmICghKGJvb2wpIGlzRXJyb3JSZXN1bHQuUmVzdWx0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLk5BKSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgZXJyb3JUeXBlID0gZXJyb3IuVmFsdWVBc0V4Y2VsRXJyb3JWYWx1ZTsKLSAgICAgICAgICAgIGludCByZXRWYWx1ZTsKLSAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JUeXBlLlR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLk51bGw6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoMSwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLkRpdjA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoMiwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLlZhbHVlOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KDMsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICAgICAgICAgIGNhc2UgZUVycm9yVHlwZS5SZWY6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoNCwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLk5hbWU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoNSwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLk51bToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCg2LCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgICAgICAgICBjYXNlIGVFcnJvclR5cGUuTkE6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoNywgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgICAgICAgICAgLy8gQnVnIEcwMDA0Ci0gICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLkVycm9yOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KDgsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTkEpLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uOworCitwdWJsaWMgY2xhc3MgRXJyb3JUeXBlIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgZXJyb3IgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApOworICAgIHZhciBpc0Vycm9yRnVuYyA9IGNvbnRleHQuQ29uZmlndXJhdGlvbi5GdW5jdGlvblJlcG9zaXRvcnkuR2V0RnVuY3Rpb24oImlzZXJyb3IiKTsKKyAgICB2YXIgaXNFcnJvclJlc3VsdCA9IGlzRXJyb3JGdW5jLkV4ZWN1dGUoYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICBpZiAoIShib29sKWlzRXJyb3JSZXN1bHQuUmVzdWx0KSB7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5OYSksIERhdGFUeXBlLkV4Y2VsRXJyb3IpOwogICAgIH0KKyAgICB2YXIgZXJyb3JUeXBlID0gZXJyb3IuVmFsdWVBc0V4Y2VsRXJyb3JWYWx1ZTsKKyAgICBpbnQgcmV0VmFsdWU7CisgICAgc3dpdGNoIChlcnJvclR5cGUuVHlwZSkgeworICAgICAgY2FzZSBlRXJyb3JUeXBlLk51bGw6CisgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoMSwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICBjYXNlIGVFcnJvclR5cGUuRGl2MDoKKyAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCgyLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgIGNhc2UgZUVycm9yVHlwZS5WYWx1ZToKKyAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCgzLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgIGNhc2UgZUVycm9yVHlwZS5SZWY6CisgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoNCwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICBjYXNlIGVFcnJvclR5cGUuTmFtZToKKyAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCg1LCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgIGNhc2UgZUVycm9yVHlwZS5OdW06CisgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoNiwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICBjYXNlIGVFcnJvclR5cGUuTmE6CisgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoNywgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAvLyBCdWcgRzAwMDQKKyAgICAgIGNhc2UgZUVycm9yVHlwZS5FcnJvcjoKKyAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCg4LCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTmEpLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0JsYW5rLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0JsYW5rLmNzCmluZGV4IGJmY2E0OTcuLmUyMzE4NDEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNCbGFuay5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzQmxhbmsuY3MKQEAgLTcsNTggKzcsNDkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuSW5mb3JtYXRpb24KLXsKLSAgICBwdWJsaWMgY2xhc3MgSXNCbGFuayA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnRzID09IG51bGwgfHwgYXJndW1lbnRzLkNvdW50KCkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHRydWUsIERhdGFUeXBlLkJvb2xlYW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYXJnLlZhbHVlIGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pCi0gICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHZhciByPShFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKWFyZy5WYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHIuR2V0VmFsdWUoci5BZGRyZXNzLl9mcm9tUm93LCByLkFkZHJlc3MuX2Zyb21Db2wpICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhcmcuVmFsdWUgIT0gbnVsbCAmJiAoYXJnLlZhbHVlLlRvU3RyaW5nKCkgIT0gc3RyaW5nLkVtcHR5KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uOworCitwdWJsaWMgY2xhc3MgSXNCbGFuayA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCB8fCBhcmd1bWVudHMuQ291bnQoKSA9PSAwKSB7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHRydWUsIERhdGFUeXBlLkJvb2xlYW4pOwogICAgIH0KKyAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsKKyAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykgeworICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSB7CisgICAgICAgIHZhciByID0gKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pYXJnLlZhbHVlOworICAgICAgICBpZiAoci5HZXRWYWx1ZShyLkFkZHJlc3MuX2Zyb21Sb3csIHIuQWRkcmVzcy5fZnJvbUNvbCkgIT0gbnVsbCkgeworICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXJnLlZhbHVlICE9IG51bGwgJiYgKGFyZy5WYWx1ZS5Ub1N0cmluZygpICE9IHN0cmluZy5FbXB0eSkpIHsKKyAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuQm9vbGVhbik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNFcnIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzRXJyLmNzCmluZGV4IDg4MGE3MTUuLmVmOTA4MTggMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNFcnIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0Vyci5jcwpAQCAtMSw0MyArMSwzMiBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0Owor77u/dXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uCi17Ci0gICAgcHVibGljIGNsYXNzIElzRXJyIDogRXJyb3JIYW5kbGluZ0Z1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGlzRXJyb3IgPSBuZXcgSXNFcnJvcigpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGlzRXJyb3IuRXhlY3V0ZShhcmd1bWVudHMsIGNvbnRleHQpOwotICAgICAgICAgICAgaWYgKChib29sKSByZXN1bHQuUmVzdWx0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBhcmcgPSBHZXRGaXJzdFZhbHVlKGFyZ3VtZW50cyk7Ci0gICAgICAgICAgICAgICAgaWYgKGFyZyBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSAoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbylhcmc7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBlPXIuR2V0VmFsdWUoci5BZGRyZXNzLl9mcm9tUm93LCByLkFkZHJlc3MuX2Zyb21Db2wpIGFzIEV4Y2VsRXJyb3JWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUgIT1udWxsICYmIGUuVHlwZT09ZUVycm9yVHlwZS5OQSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChmYWxzZSwgRGF0YVR5cGUuQm9vbGVhbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFyZyBpcyBFeGNlbEVycm9yVmFsdWUgJiYgKChFeGNlbEVycm9yVmFsdWUpYXJnKS5UeXBlPT1lRXJyb3JUeXBlLk5BKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5JbmZvcm1hdGlvbjsKIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBIYW5kbGVFcnJvcihzdHJpbmcgZXJyb3JDb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHRydWUsIERhdGFUeXBlLkJvb2xlYW4pOworcHVibGljIGNsYXNzIElzRXJyIDogRXJyb3JIYW5kbGluZ0Z1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICB2YXIgaXNFcnJvciA9IG5ldyBJc0Vycm9yKCk7CisgICAgdmFyIHJlc3VsdCA9IGlzRXJyb3IuRXhlY3V0ZShhcmd1bWVudHMsIGNvbnRleHQpOworICAgIGlmICgoYm9vbClyZXN1bHQuUmVzdWx0KSB7CisgICAgICB2YXIgYXJnID0gR2V0Rmlyc3RWYWx1ZShhcmd1bWVudHMpOworICAgICAgaWYgKGFyZyBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSB7CisgICAgICAgIHZhciByID0gKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pYXJnOworICAgICAgICB2YXIgZSA9IHIuR2V0VmFsdWUoci5BZGRyZXNzLl9mcm9tUm93LCByLkFkZHJlc3MuX2Zyb21Db2wpIGFzIEV4Y2VsRXJyb3JWYWx1ZTsKKyAgICAgICAgaWYgKGUgIT0gbnVsbCAmJiBlLlR5cGUgPT0gZUVycm9yVHlwZS5OYSkgeworICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoZmFsc2UsIERhdGFUeXBlLkJvb2xlYW4pOwogICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXJnIGlzIEV4Y2VsRXJyb3JWYWx1ZSAmJiAoKEV4Y2VsRXJyb3JWYWx1ZSlhcmcpLlR5cGUgPT0gZUVycm9yVHlwZS5OYSkgeworICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoZmFsc2UsIERhdGFUeXBlLkJvb2xlYW4pOworICAgICAgICB9CisgICAgICB9CiAgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBIYW5kbGVFcnJvcihzdHJpbmcgZXJyb3JDb2RlKSB7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh0cnVlLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0Vycm9yLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0Vycm9yLmNzCmluZGV4IGRhODgzZjYuLmQ5ODAyY2YgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNFcnJvci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzRXJyb3IuY3MKQEAgLTcsNjIgKzcsNTIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuSW5mb3JtYXRpb24KLXsKLSAgICBwdWJsaWMgY2xhc3MgSXNFcnJvciA6IEVycm9ySGFuZGxpbmdGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCB8fCBhcmd1bWVudHMuQ291bnQoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoZmFsc2UsIERhdGFUeXBlLkJvb2xlYW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFyZ3VtZW50IGluIGFyZ3VtZW50cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnQuVmFsdWUgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciByID0gKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pYXJndW1lbnQuVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChFeGNlbEVycm9yVmFsdWUuVmFsdWVzLklzRXJyb3JWYWx1ZShyLkdldFZhbHVlKHIuQWRkcmVzcy5fZnJvbVJvdywgci5BZGRyZXNzLl9mcm9tQ29sKSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodHJ1ZSwgRGF0YVR5cGUuQm9vbGVhbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEV4Y2VsRXJyb3JWYWx1ZS5WYWx1ZXMuSXNFcnJvclZhbHVlKGFyZ3VtZW50LlZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh0cnVlLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uOwogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEhhbmRsZUVycm9yKHN0cmluZyBlcnJvckNvZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodHJ1ZSwgRGF0YVR5cGUuQm9vbGVhbik7Ci0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBJc0Vycm9yIDogRXJyb3JIYW5kbGluZ0Z1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBpZiAoYXJndW1lbnRzID09IG51bGwgfHwgYXJndW1lbnRzLkNvdW50KCkgPT0gMCkgeworICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChmYWxzZSwgRGF0YVR5cGUuQm9vbGVhbik7CiAgICAgfQorICAgIGZvcmVhY2ggKHZhciBhcmd1bWVudCBpbiBhcmd1bWVudHMpIHsKKyAgICAgIGlmIChhcmd1bWVudC5WYWx1ZSBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSB7CisgICAgICAgIHZhciByID0gKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pYXJndW1lbnQuVmFsdWU7CisgICAgICAgIGlmIChFeGNlbEVycm9yVmFsdWUuVmFsdWVzLklzRXJyb3JWYWx1ZSgKKyAgICAgICAgICAgIHIuR2V0VmFsdWUoci5BZGRyZXNzLl9mcm9tUm93LCByLkFkZHJlc3MuX2Zyb21Db2wpKSkgeworICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodHJ1ZSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChFeGNlbEVycm9yVmFsdWUuVmFsdWVzLklzRXJyb3JWYWx1ZShhcmd1bWVudC5WYWx1ZSkpIHsKKyAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHRydWUsIERhdGFUeXBlLkJvb2xlYW4pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQoZmFsc2UsIERhdGFUeXBlLkJvb2xlYW4pOworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgSGFuZGxlRXJyb3Ioc3RyaW5nIGVycm9yQ29kZSkgeworICAgIHJldHVybiBDcmVhdGVSZXN1bHQodHJ1ZSwgRGF0YVR5cGUuQm9vbGVhbik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNFdmVuLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0V2ZW4uY3MKaW5kZXggODgzZTVhYS4uYWY4YmY0ZSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0V2ZW4uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0V2ZW4uY3MKQEAgLTEsMjQgKzEsMTkgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK++7v3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiB1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuSW5mb3JtYXRpb24KLXsKLSAgICBwdWJsaWMgY2xhc3MgSXNFdmVuIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgYXJnMSA9IEdldEZpcnN0VmFsdWUoYXJndW1lbnRzKTsvL2FyZ3VtZW50cy5FbGVtZW50QXQoMCk7Ci0gICAgICAgICAgICBpZiAoIUNvbnZlcnRVdGlsLklzTnVtZXJpYyhhcmcxKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBudW1iZXIgPSAoaW50KVN5c3RlbS5NYXRoLkZsb29yKENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZzEpKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQobnVtYmVyICUgMiA9PSAwLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uOworCitwdWJsaWMgY2xhc3MgSXNFdmVuIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgYXJnMSA9IEdldEZpcnN0VmFsdWUoYXJndW1lbnRzKTsgLy9hcmd1bWVudHMuRWxlbWVudEF0KDApOworICAgIGlmICghQ29udmVydFV0aWwuSXNOdW1lcmljKGFyZzEpKSB7CisgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKICAgICB9CisgICAgdmFyIG51bWJlciA9IChpbnQpU3lzdGVtLk1hdGguRmxvb3IoQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoYXJnMSkpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQobnVtYmVyICUgMiA9PSAwLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc0xvZ2ljYWwuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzTG9naWNhbC5jcwppbmRleCAxNTY2NjlkLi5mYmRhNWQ2IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzTG9naWNhbC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzTG9naWNhbC5jcwpAQCAtMSwxOSArMSwxNiBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Civvu791c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uCi17Ci0gICAgcHVibGljIGNsYXNzIElzTG9naWNhbCA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25Bcmd1bWVudHMgPSBhcmd1bWVudHMgYXMgRnVuY3Rpb25Bcmd1bWVudFtdID8/IGFyZ3VtZW50cy5Ub0FycmF5KCk7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhmdW5jdGlvbkFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgdiA9IEdldEZpcnN0VmFsdWUoYXJndW1lbnRzKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodiBpcyBib29sLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5JbmZvcm1hdGlvbjsKKworcHVibGljIGNsYXNzIElzTG9naWNhbCA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHZhciBmdW5jdGlvbkFyZ3VtZW50cyA9IGFyZ3VtZW50cyBhcyBGdW5jdGlvbkFyZ3VtZW50W10gPz8gYXJndW1lbnRzLlRvQXJyYXkoKTsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhmdW5jdGlvbkFyZ3VtZW50cywgMSk7CisgICAgdmFyIHYgPSBHZXRGaXJzdFZhbHVlKGFyZ3VtZW50cyk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2IGlzIGJvb2wsIERhdGFUeXBlLkJvb2xlYW4pOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzTmEuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzTmEuY3MKaW5kZXggN2U4M2YyZS4uODJhZGNmZSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc05hLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNOYS5jcwpAQCAtNyw0NSArNyw0MSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTAxLTE1CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5JbmZvcm1hdGlvbgotewotICAgIHB1YmxpYyBjbGFzcyBJc05hIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCB8fCBhcmd1bWVudHMuQ291bnQoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoZmFsc2UsIERhdGFUeXBlLkJvb2xlYW4pOwotICAgICAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uOwogCi0gICAgICAgICAgICB2YXIgdiA9IEdldEZpcnN0VmFsdWUoYXJndW1lbnRzKTsKLQotICAgICAgICAgICAgaWYgKHYgaXMgRXhjZWxFcnJvclZhbHVlICYmICgoRXhjZWxFcnJvclZhbHVlKXYpLlR5cGU9PWVFcnJvclR5cGUuTkEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh0cnVlLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoZmFsc2UsIERhdGFUeXBlLkJvb2xlYW4pOwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgSXNOYSA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCB8fCBhcmd1bWVudHMuQ291bnQoKSA9PSAwKSB7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKICAgICB9CisKKyAgICB2YXIgdiA9IEdldEZpcnN0VmFsdWUoYXJndW1lbnRzKTsKKworICAgIGlmICh2IGlzIEV4Y2VsRXJyb3JWYWx1ZSAmJiAoKEV4Y2VsRXJyb3JWYWx1ZSl2KS5UeXBlID09IGVFcnJvclR5cGUuTmEpIHsKKyAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodHJ1ZSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQoZmFsc2UsIERhdGFUeXBlLkJvb2xlYW4pOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzTm9uVGV4dC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNOb25UZXh0LmNzCmluZGV4IGU2MWViOTQuLmM4NDAwOGQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNOb25UZXh0LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNOb25UZXh0LmNzCkBAIC03LDM3ICs3LDM3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uCi17Ci0gICAgcHVibGljIGNsYXNzIElzTm9uVGV4dCA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIGZpcnN0QXJnID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKTsKLSAgICAgICAgICAgIGlmIChmaXJzdEFyZy5WYWx1ZSA9PSBudWxsIHx8IGZpcnN0QXJnLlZhbHVlSXNFeGNlbEVycm9yKSByZXR1cm4gQ3JlYXRlUmVzdWx0KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoIShmaXJzdEFyZy5WYWx1ZSBpcyBzdHJpbmcpLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uOworCitwdWJsaWMgY2xhc3MgSXNOb25UZXh0IDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgZmlyc3RBcmcgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApOworICAgIGlmIChmaXJzdEFyZy5WYWx1ZSA9PSBudWxsIHx8IGZpcnN0QXJnLlZhbHVlSXNFeGNlbEVycm9yKSB7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKICAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCghKGZpcnN0QXJnLlZhbHVlIGlzIHN0cmluZyksIERhdGFUeXBlLkJvb2xlYW4pOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzTnVtYmVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc051bWJlci5jcwppbmRleCAyZGRmMzFjLi5lYWM4ZmRkIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzTnVtYmVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNOdW1iZXIuY3MKQEAgLTEsNSArMSw0IEBACi3vu791c2luZyBTeXN0ZW07Ci0vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgor77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC04LDM1ICs3LDMzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uCi17Ci0gICAgcHVibGljIGNsYXNzIElzTnVtYmVyIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgYXJnID0gR2V0Rmlyc3RWYWx1ZShhcmd1bWVudHMpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChJc051bWVyaWMoYXJnKSwgRGF0YVR5cGUuQm9vbGVhbik7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuSW5mb3JtYXRpb247CisKK3B1YmxpYyBjbGFzcyBJc051bWJlciA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIGFyZyA9IEdldEZpcnN0VmFsdWUoYXJndW1lbnRzKTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KElzTnVtZXJpYyhhcmcpLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc09kZC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vSXNPZGQuY3MKaW5kZXggOWIzNDVkMC4uMWUxYWY3ZiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc09kZC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzT2RkLmNzCkBAIC03LDQyICs3LDM4IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5JbmZvcm1hdGlvbgotewotICAgIHB1YmxpYyBjbGFzcyBJc09kZCA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIGFyZzEgPSBHZXRGaXJzdFZhbHVlKGFyZ3VtZW50cyk7Ly9hcmd1bWVudHMuRWxlbWVudEF0KDApOwotICAgICAgICAgICAgaWYgKCFDb252ZXJ0VXRpbC5Jc051bWVyaWMoYXJnMSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgbnVtYmVyID0gKGludClTeXN0ZW0uTWF0aC5GbG9vcihDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShhcmcxKSk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KG51bWJlciAlIDIgPT0gMSwgRGF0YVR5cGUuQm9vbGVhbik7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5JbmZvcm1hdGlvbjsKKworcHVibGljIGNsYXNzIElzT2RkIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgYXJnMSA9IEdldEZpcnN0VmFsdWUoYXJndW1lbnRzKTsgLy9hcmd1bWVudHMuRWxlbWVudEF0KDApOworICAgIGlmICghQ29udmVydFV0aWwuSXNOdW1lcmljKGFyZzEpKSB7CisgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKICAgICB9CisgICAgdmFyIG51bWJlciA9IChpbnQpU3lzdGVtLk1hdGguRmxvb3IoQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoYXJnMSkpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQobnVtYmVyICUgMiA9PSAxLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9Jc1RleHQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzVGV4dC5jcwppbmRleCBkYWUyYzNhLi5iMmQyODhiIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzVGV4dC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL0lzVGV4dC5jcwpAQCAtNywzOSArNywzNiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5JbmZvcm1hdGlvbgotewotICAgIHB1YmxpYyBjbGFzcyBJc1RleHQgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA9PSAxICYmIGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KChHZXRGaXJzdFZhbHVlKGFyZ3VtZW50cykgaXMgc3RyaW5nKSwgRGF0YVR5cGUuQm9vbGVhbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uOworCitwdWJsaWMgY2xhc3MgSXNUZXh0IDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPT0gMSAmJiBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoKEdldEZpcnN0VmFsdWUoYXJndW1lbnRzKSBpcyBzdHJpbmcpLCBEYXRhVHlwZS5Cb29sZWFuKTsKICAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChmYWxzZSwgRGF0YVR5cGUuQm9vbGVhbik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vTi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vTi5jcwppbmRleCAwNDZjN2E0Li4xOGQ2NjY1IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL04uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9OLmNzCkBAIC0xLDM5ICsxLDMxIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Civvu791c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uCi17Ci0gICAgcHVibGljIGNsYXNzIE4gOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmcgPSBHZXRGaXJzdFZhbHVlKGFyZ3VtZW50cyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChhcmcgaXMgYm9vbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgdmFsID0gKGJvb2wpIGFyZyA/IDFkIDogMGQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoSXNOdW1lcmljKGFyZykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHZhbCA9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYXJnIGlzIHN0cmluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KDBkLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGFyZyBpcyBFeGNlbEVycm9yVmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChhcmcsIERhdGFUeXBlLkV4Y2VsRXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkluZm9ybWF0aW9uOworCitwdWJsaWMgY2xhc3MgTiA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIGFyZyA9IEdldEZpcnN0VmFsdWUoYXJndW1lbnRzKTsKKworICAgIGlmIChhcmcgaXMgYm9vbCkgeworICAgICAgdmFyIHZhbCA9IChib29sKWFyZyA/IDFkIDogMGQ7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbCwgRGF0YVR5cGUuRGVjaW1hbCk7CiAgICAgfQorICAgIGlmIChJc051bWVyaWMoYXJnKSkgeworICAgICAgdmFyIHZhbCA9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZyk7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgfQorICAgIGlmIChhcmcgaXMgc3RyaW5nKSB7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KDBkLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICB9CisgICAgaWYgKGFyZyBpcyBFeGNlbEVycm9yVmFsdWUpIHsKKyAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoYXJnLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9OYS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW5mb3JtYXRpb24vTmEuY3MKaW5kZXggN2QyZmMwMy4uOTNiZmJhMiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbmZvcm1hdGlvbi9OYS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0luZm9ybWF0aW9uL05hLmNzCkBAIC0xLDE2ICsxLDEyIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Civvu791c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuSW5mb3JtYXRpb24KLXsKLSAgICBwdWJsaWMgY2xhc3MgTmEgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTkEpLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5JbmZvcm1hdGlvbjsKKworcHVibGljIGNsYXNzIE5hIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTmEpLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbnRBcmd1bWVudFBhcnNlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvSW50QXJndW1lbnRQYXJzZXIuY3MKaW5kZXggNmFlM2EwOS4uYjUxMGQ5MyAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9JbnRBcmd1bWVudFBhcnNlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0ludEFyZ3VtZW50UGFyc2VyLmNzCkBAIC03LDU1ICs3LDQ3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucwotewotICAgIHB1YmxpYyBjbGFzcyBJbnRBcmd1bWVudFBhcnNlciA6IEFyZ3VtZW50UGFyc2VyCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFBhcnNlKG9iamVjdCBvYmopCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlcXVpcmUuVGhhdChvYmopLk5hbWVkKCJhcmd1bWVudCIpLklzTm90TnVsbCgpOwotICAgICAgICAgICAgaW50IHJlc3VsdDsKLSAgICAgICAgICAgIGlmIChvYmogaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgciA9ICgoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbylvYmopLkZpcnN0T3JEZWZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHIgPT0gbnVsbCA/IDAgOiBDb252ZXJ0LlRvSW50MzIoci5WYWx1ZURvdWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgb2JqVHlwZSA9IG9iai5HZXRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAob2JqVHlwZSA9PSB0eXBlb2YoaW50KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGludClvYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2JqVHlwZSA9PSB0eXBlb2YoZG91YmxlKSB8fCBvYmpUeXBlID09IHR5cGVvZihkZWNpbWFsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29udmVydC5Ub0ludDMyKG9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWludC5UcnlQYXJzZShvYmouVG9TdHJpbmcoKSwgb3V0IHJlc3VsdCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KK3VzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKKworcHVibGljIGNsYXNzIEludEFyZ3VtZW50UGFyc2VyIDogQXJndW1lbnRQYXJzZXIgeworICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IFBhcnNlKG9iamVjdCBvYmopIHsKKyAgICBSZXF1aXJlLlRoYXQob2JqKS5OYW1lZCgiYXJndW1lbnQiKS5Jc05vdE51bGwoKTsKKyAgICBpbnQgcmVzdWx0OworICAgIGlmIChvYmogaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykgeworICAgICAgdmFyIHIgPSAoKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pb2JqKS5GaXJzdE9yRGVmYXVsdCgpOworICAgICAgcmV0dXJuIHIgPT0gbnVsbCA/IDAgOiBDb252ZXJ0LlRvSW50MzIoci5WYWx1ZURvdWJsZSk7CiAgICAgfQorICAgIHZhciBvYmpUeXBlID0gb2JqLkdldFR5cGUoKTsKKyAgICBpZiAob2JqVHlwZSA9PSB0eXBlb2YoaW50KSkgeworICAgICAgcmV0dXJuIChpbnQpb2JqOworICAgIH0KKyAgICBpZiAob2JqVHlwZSA9PSB0eXBlb2YoZG91YmxlKSB8fCBvYmpUeXBlID09IHR5cGVvZihkZWNpbWFsKSkgeworICAgICAgcmV0dXJuIENvbnZlcnQuVG9JbnQzMihvYmopOworICAgIH0KKyAgICBpZiAoIWludC5UcnlQYXJzZShvYmouVG9TdHJpbmcoKSwgb3V0IHJlc3VsdCkpIHsKKyAgICAgIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9BbmQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvQW5kLmNzCmluZGV4IDM2M2I0NDcuLmM0ODNhZjUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9BbmQuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL0FuZC5jcwpAQCAtNyw0MiArNywzOCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsCi17Ci0gICAgcHVibGljIGNsYXNzIEFuZCA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBhcmd1bWVudHMuQ291bnQoKTsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghQXJnVG9Cb29sKGFyZ3VtZW50cywgeCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoZmFsc2UsIERhdGFUeXBlLkJvb2xlYW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdCh0cnVlLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWw7CisKK3B1YmxpYyBjbGFzcyBBbmQgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIGZvciAodmFyIHggPSAwOyB4IDwgYXJndW1lbnRzLkNvdW50KCk7IHgrKykgeworICAgICAgaWYgKCFBcmdUb0Jvb2woYXJndW1lbnRzLCB4KSkgeworICAgICAgICByZXR1cm4gbmV3KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIG5ldyh0cnVlLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL0ZhbHNlLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL0ZhbHNlLmNzCmluZGV4IGM1NjhmM2MuLjE3NmQzMWEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9GYWxzZS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvRmFsc2UuY3MKQEAgLTcsMzQgKzcsMzEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTG9naWNhbAotewotICAgIHB1YmxpYyBjbGFzcyBGYWxzZSA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsOworCitwdWJsaWMgY2xhc3MgRmFsc2UgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGZhbHNlLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL0lmLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL0lmLmNzCmluZGV4IDFkYWRmZDMuLmJjNTUyNzIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9JZi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvSWYuY3MKQEAgLTcsMzkgKzcsMzcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTG9naWNhbAotewotICAgIHB1YmxpYyBjbGFzcyBJZiA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDMpOwotICAgICAgICAgICAgdmFyIGNvbmRpdGlvbiA9IEFyZ1RvQm9vbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgdmFyIGZpcnN0U3RhdGVtZW50ID0gYXJndW1lbnRzLkVsZW1lbnRBdCgxKS5WYWx1ZTsKLSAgICAgICAgICAgIHZhciBzZWNvbmRTdGF0ZW1lbnQgPSBhcmd1bWVudHMuRWxlbWVudEF0KDIpLlZhbHVlOwotICAgICAgICAgICAgdmFyIGZhY3RvcnkgPSBuZXcgQ29tcGlsZVJlc3VsdEZhY3RvcnkoKTsKLSAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24gPyBmYWN0b3J5LkNyZWF0ZShmaXJzdFN0YXRlbWVudCkgOiBmYWN0b3J5LkNyZWF0ZShzZWNvbmRTdGF0ZW1lbnQpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWw7CisKK3B1YmxpYyBjbGFzcyBJZiA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7CisgICAgdmFyIGNvbmRpdGlvbiA9IEFyZ1RvQm9vbChhcmd1bWVudHMsIDApOworICAgIHZhciBmaXJzdFN0YXRlbWVudCA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMSkuVmFsdWU7CisgICAgdmFyIHNlY29uZFN0YXRlbWVudCA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMikuVmFsdWU7CisgICAgdmFyIGZhY3RvcnkgPSBuZXcgQ29tcGlsZVJlc3VsdEZhY3RvcnkoKTsKKyAgICByZXR1cm4gY29uZGl0aW9uID8gZmFjdG9yeS5DcmVhdGUoZmlyc3RTdGF0ZW1lbnQpIDogZmFjdG9yeS5DcmVhdGUoc2Vjb25kU3RhdGVtZW50KTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL0lmRXJyb3IuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvSWZFcnJvci5jcwppbmRleCBhNWU1ODAyLi44ZmU5OTkzIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvSWZFcnJvci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvSWZFcnJvci5jcwpAQCAtMSwxOCArMSwxNSBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Civvu791c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWwKLXsKLSAgICBwdWJsaWMgY2xhc3MgSWZFcnJvciA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIGZpcnN0QXJnID0gYXJndW1lbnRzLkZpcnN0KCk7Ci0gICAgICAgICAgICByZXR1cm4gR2V0UmVzdWx0QnlPYmplY3QoZmlyc3RBcmcuVmFsdWUpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWw7CisKK3B1YmxpYyBjbGFzcyBJZkVycm9yIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgZmlyc3RBcmcgPSBhcmd1bWVudHMuRmlyc3QoKTsKKyAgICByZXR1cm4gR2V0UmVzdWx0QnlPYmplY3QoZmlyc3RBcmcuVmFsdWUpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvSWZOYS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9JZk5hLmNzCmluZGV4IDZjM2Q3MTAuLmVjNzQ0MDQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9JZk5hLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9JZk5hLmNzCkBAIC0xLDE4ICsxLDE1IEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK++7v3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTG9naWNhbAotewotICAgIHB1YmxpYyBjbGFzcyBJZk5hIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgZmlyc3RBcmcgPSBhcmd1bWVudHMuRmlyc3QoKTsKLSAgICAgICAgICAgIHJldHVybiBHZXRSZXN1bHRCeU9iamVjdChmaXJzdEFyZy5WYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTG9naWNhbDsKKworcHVibGljIGNsYXNzIElmTmEgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBmaXJzdEFyZyA9IGFyZ3VtZW50cy5GaXJzdCgpOworICAgIHJldHVybiBHZXRSZXN1bHRCeU9iamVjdChmaXJzdEFyZy5WYWx1ZSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9Ob3QuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvTm90LmNzCmluZGV4IDYyY2Q1ZWIuLmFlYzdmNzQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9Ob3QuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL05vdC5jcwpAQCAtNywzNiArNywzMyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsCi17Ci0gICAgcHVibGljIGNsYXNzIE5vdCA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICFBcmdUb0Jvb2woYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkJvb2xlYW4pOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWw7CisKK3B1YmxpYyBjbGFzcyBOb3QgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciByZXN1bHQgPSAhQXJnVG9Cb29sKGFyZ3VtZW50cywgMCk7CisgICAgcmV0dXJuIG5ldyhyZXN1bHQsIERhdGFUeXBlLkJvb2xlYW4pOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvT3IuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvT3IuY3MKaW5kZXggMDg5MDdiZC4uYmNmNmUzMSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9Mb2dpY2FsL09yLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9Pci5jcwpAQCAtNyw0MiArNywzOCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsCi17Ci0gICAgcHVibGljIGNsYXNzIE9yIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGFyZ3VtZW50cy5Db3VudCgpOyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEFyZ1RvQm9vbChhcmd1bWVudHMsIHgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KHRydWUsIERhdGFUeXBlLkJvb2xlYW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChmYWxzZSwgRGF0YVR5cGUuQm9vbGVhbik7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsOworCitwdWJsaWMgY2xhc3MgT3IgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIGZvciAodmFyIHggPSAwOyB4IDwgYXJndW1lbnRzLkNvdW50KCk7IHgrKykgeworICAgICAgaWYgKEFyZ1RvQm9vbChhcmd1bWVudHMsIHgpKSB7CisgICAgICAgIHJldHVybiBuZXcodHJ1ZSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgICB9CiAgICAgfQorICAgIHJldHVybiBuZXcoZmFsc2UsIERhdGFUeXBlLkJvb2xlYW4pOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL0xvZ2ljYWwvVHJ1ZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9UcnVlLmNzCmluZGV4IDJhODVlM2UuLmJiMjNhNjIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9UcnVlLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTG9naWNhbC9UcnVlLmNzCkBAIC03LDM0ICs3LDMxIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWwKLXsKLSAgICBwdWJsaWMgY2xhc3MgVHJ1ZSA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHRydWUsIERhdGFUeXBlLkJvb2xlYW4pOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLkxvZ2ljYWw7CisKK3B1YmxpYyBjbGFzcyBUcnVlIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh0cnVlLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0Ficy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BYnMuY3MKaW5kZXggOGY0MTMzOC4uYWQyOWExNCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0Ficy5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQWJzLmNzCkBAIC03LDQwICs3LDM2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgQWJzIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgdmFsID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICBpZiAodmFsIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWwgKj0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbCwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgQWJzIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgdmFsID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgaWYgKHZhbCA8IDApIHsKKyAgICAgIHZhbCAqPSAtMTsKICAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLkRlY2ltYWwpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQWNvcy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BY29zLmNzCmluZGV4IDZhN2RiMTEuLjA3N2EwMmUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BY29zLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BY29zLmNzCkBAIC03LDM2ICs3LDMzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTEKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgQWNvcyA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIGFyZyA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChNYXRoSGVscGVyLkFyY2NvcyhhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgQWNvcyA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIGFyZyA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQoTWF0aEhlbHBlci5BcmNjb3MoYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BY29zaC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BY29zaC5jcwppbmRleCBhYzNkNTMwLi5jZjA3ZTFiIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQWNvc2guY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0Fjb3NoLmNzCkBAIC03LDM2ICs3LDMzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTEKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgQWNvc2ggOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmcgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoTWF0aEhlbHBlci5IQXJjY29zKGFyZyksIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CisKK3B1YmxpYyBjbGFzcyBBY29zaCA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIGFyZyA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQoTWF0aEhlbHBlci5IQXJjY29zKGFyZyksIERhdGFUeXBlLkRlY2ltYWwpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXNpbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Bc2luLmNzCmluZGV4IDRjYTBhMmYuLjI4ODc2M2MgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Bc2luLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Bc2luLmNzCkBAIC0xLDYgKzEsNiBAQAot77u/dXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCiAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTEwLDMzICsxMCwzMCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTAxLTExCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIEFzaW4gOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmcgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguQXNpbihhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgQXNpbiA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIGFyZyA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguQXNpbihhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0FzaW5oLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0FzaW5oLmNzCmluZGV4IGU3NWQxZjUuLjgwZWJkZmEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Bc2luaC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXNpbmguY3MKQEAgLTcsMzYgKzcsMzMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wMS0xMQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBBc2luaCA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIGFyZyA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChNYXRoSGVscGVyLkhBcmNzaW4oYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKKworcHVibGljIGNsYXNzIEFzaW5oIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChNYXRoSGVscGVyLkhBcmNzaW4oYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdGFuLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F0YW4uY3MKaW5kZXggMzhjNjA5Ni4uOWNjNjBiMCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F0YW4uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F0YW4uY3MKQEAgLTcsMzYgKzcsMzMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBBdGFuIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkF0YW4oYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKKworcHVibGljIGNsYXNzIEF0YW4gOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBhcmcgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkF0YW4oYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdGFuMi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdGFuMi5jcwppbmRleCAzNGU0NDExLi5hNDkwYzFkIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXRhbjIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F0YW4yLmNzCkBAIC03LDM4ICs3LDM1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgQXRhbjIgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKLSAgICAgICAgICAgIHZhciBhcmcxID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICB2YXIgYXJnMiA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgLy8gSGFkIHRvIHN3aXRjaCBvcmRlciBvZiB0aGUgYXJndW1lbnRzIHRvIGdldCB0aGUgc2FtZSByZXN1bHQgYXMgaW4gZXhjZWwgL01BCi0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkF0YW4yKGFyZzIsIGFyZzEpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgQXRhbjIgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgIHZhciBhcmcxID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgdmFyIGFyZzIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAxKTsKKyAgICAvLyBIYWQgdG8gc3dpdGNoIG9yZGVyIG9mIHRoZSBhcmd1bWVudHMgdG8gZ2V0IHRoZSBzYW1lIHJlc3VsdCBhcyBpbiBleGNlbCAvTUEKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkF0YW4yKGFyZzIsIGFyZzEpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F0YW5oLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F0YW5oLmNzCmluZGV4IDc5N2FiNjUuLjMwMmM5N2YgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdGFuaC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXRhbmguY3MKQEAgLTcsMzYgKzcsMzMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wMS0xMQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBBdGFuaCA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIGFyZyA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChNYXRoSGVscGVyLkhBcmN0YW4oYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKKworcHVibGljIGNsYXNzIEF0YW5oIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChNYXRoSGVscGVyLkhBcmN0YW4oYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F2ZXJhZ2UuY3MKaW5kZXggYzVjODc4ZC4uMTU5ZDlkZSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F2ZXJhZ2UuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F2ZXJhZ2UuY3MKQEAgLTcsMTAyICs3LDkxIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgQXZlcmFnZSA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEsIGVFcnJvclR5cGUuRGl2MCk7Ci0gICAgICAgICAgICBkb3VibGUgblZhbHVlcyA9IDBkLCByZXN1bHQgPSAwZDsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhcmcgaW4gYXJndW1lbnRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENhbGN1bGF0ZShhcmcsIGNvbnRleHQsIHJlZiByZXN1bHQsIHJlZiBuVmFsdWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoRGl2aWRlKHJlc3VsdCwgblZhbHVlcyksIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKIAotICAgICAgICBwcml2YXRlIHZvaWQgQ2FsY3VsYXRlKEZ1bmN0aW9uQXJndW1lbnQgYXJnLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0LCByZWYgZG91YmxlIHJldFZhbCwgcmVmIGRvdWJsZSBuVmFsdWVzLCBib29sIGlzSW5BcnJheSA9IGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoU2hvdWxkSWdub3JlKGFyZykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiAoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pYXJnLlZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ2FsY3VsYXRlKGl0ZW0sIGNvbnRleHQsIHJlZiByZXRWYWwsIHJlZiBuVmFsdWVzLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChhcmcuSXNFeGNlbFJhbmdlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjIGluIGFyZy5WYWx1ZUFzUmFuZ2VJbmZvKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFNob3VsZElnbm9yZShjLCBjb250ZXh0KSkgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihjKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFJc051bWVyaWMoYy5WYWx1ZSkpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBuVmFsdWVzKys7Ci0gICAgICAgICAgICAgICAgICAgIHJldFZhbCArPSBjLlZhbHVlRG91YmxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgbnVtZXJpY1ZhbHVlID0gR2V0TnVtZXJpY1ZhbHVlKGFyZy5WYWx1ZSwgaXNJbkFycmF5KTsKLSAgICAgICAgICAgICAgICBpZiAobnVtZXJpY1ZhbHVlLkhhc1ZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgblZhbHVlcysrOwotICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gbnVtZXJpY1ZhbHVlLlZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICgoYXJnLlZhbHVlIGlzIHN0cmluZykgJiYgIUNvbnZlcnRVdGlsLklzTnVtZXJpY1N0cmluZyhhcmcuVmFsdWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0luQXJyYXkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKGFyZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGRvdWJsZT8gR2V0TnVtZXJpY1ZhbHVlKG9iamVjdCBvYmosIGJvb2wgaXNJbkFycmF5KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoSXNOdW1lcmljKG9iaikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKG9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICgob2JqIGlzIGJvb2wpICYmICFpc0luQXJyYXkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKG9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWNTdHJpbmcob2JqKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlLlBhcnNlKG9iai5Ub1N0cmluZygpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KGRvdWJsZT8pOwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgQXZlcmFnZSA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSwgZUVycm9yVHlwZS5EaXYwKTsKKyAgICBkb3VibGUgblZhbHVlcyA9IDBkLAorICAgICAgICByZXN1bHQgPSAwZDsKKyAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykgeworICAgICAgQ2FsY3VsYXRlKGFyZywgY29udGV4dCwgcmVmIHJlc3VsdCwgcmVmIG5WYWx1ZXMpOwogICAgIH0KKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KERpdmlkZShyZXN1bHQsIG5WYWx1ZXMpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBDYWxjdWxhdGUoCisgICAgICBGdW5jdGlvbkFyZ3VtZW50IGFyZywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQsCisgICAgICByZWYgZG91YmxlIHJldFZhbCwKKyAgICAgIHJlZiBkb3VibGUgblZhbHVlcywKKyAgICAgIGJvb2wgaXNJbkFycmF5ID0gZmFsc2UpIHsKKyAgICBpZiAoU2hvdWxkSWdub3JlKGFyZykpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGFyZy5WYWx1ZSBpcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PikgeworICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KWFyZy5WYWx1ZSkgeworICAgICAgICBDYWxjdWxhdGUoaXRlbSwgY29udGV4dCwgcmVmIHJldFZhbCwgcmVmIG5WYWx1ZXMsIHRydWUpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXJnLklzRXhjZWxSYW5nZSkgeworICAgICAgZm9yZWFjaCAodmFyIGMgaW4gYXJnLlZhbHVlQXNSYW5nZUluZm8pIHsKKyAgICAgICAgaWYgKFNob3VsZElnbm9yZShjLCBjb250ZXh0KSkgeworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihjKTsKKyAgICAgICAgaWYgKCFJc051bWVyaWMoYy5WYWx1ZSkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBuVmFsdWVzKys7CisgICAgICAgIHJldFZhbCArPSBjLlZhbHVlRG91YmxlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB2YXIgbnVtZXJpY1ZhbHVlID0gR2V0TnVtZXJpY1ZhbHVlKGFyZy5WYWx1ZSwgaXNJbkFycmF5KTsKKyAgICAgIGlmIChudW1lcmljVmFsdWUuSGFzVmFsdWUpIHsKKyAgICAgICAgblZhbHVlcysrOworICAgICAgICByZXRWYWwgKz0gbnVtZXJpY1ZhbHVlLlZhbHVlOworICAgICAgfSBlbHNlIGlmICgoYXJnLlZhbHVlIGlzIHN0cmluZykgJiYgIUNvbnZlcnRVdGlsLklzTnVtZXJpY1N0cmluZyhhcmcuVmFsdWUpKSB7CisgICAgICAgIGlmICghaXNJbkFycmF5KSB7CisgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5WYWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKGFyZyk7CisgIH0KKworICBwcml2YXRlIGRvdWJsZT8gR2V0TnVtZXJpY1ZhbHVlKG9iamVjdCBvYmosIGJvb2wgaXNJbkFycmF5KSB7CisgICAgaWYgKElzTnVtZXJpYyhvYmopKSB7CisgICAgICByZXR1cm4gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUob2JqKTsKKyAgICB9CisgICAgaWYgKChvYmogaXMgYm9vbCkgJiYgIWlzSW5BcnJheSkgeworICAgICAgcmV0dXJuIENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKG9iaik7CisgICAgfQorICAgIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWNTdHJpbmcob2JqKSkgeworICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZShvYmouVG9TdHJpbmcoKSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgfQorICAgIHJldHVybiBkZWZhdWx0KGRvdWJsZT8pOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXZlcmFnZUEuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXZlcmFnZUEuY3MKaW5kZXggOGRkNWJiOS4uMDBmNTc1ZiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F2ZXJhZ2VBLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlQS5jcwpAQCAtNywxMTggKzcsMTAwIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTQtMDEtMDYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgQXZlcmFnZUEgOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxLCBlRXJyb3JUeXBlLkRpdjApOwotICAgICAgICAgICAgZG91YmxlIG5WYWx1ZXMgPSAwZCwgcmVzdWx0ID0gMGQ7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDYWxjdWxhdGUoYXJnLCBjb250ZXh0LCByZWYgcmVzdWx0LCByZWYgblZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KERpdmlkZShyZXN1bHQsIG5WYWx1ZXMpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIENhbGN1bGF0ZShGdW5jdGlvbkFyZ3VtZW50IGFyZywgUGFyc2luZ0NvbnRleHQgY29udGV4dCwgcmVmIGRvdWJsZSByZXRWYWwsIHJlZiBkb3VibGUgblZhbHVlcywgYm9vbCBpc0luQXJyYXkgPSBmYWxzZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFNob3VsZElnbm9yZShhcmcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcmcuVmFsdWUgaXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KWFyZy5WYWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENhbGN1bGF0ZShpdGVtLCBjb250ZXh0LCByZWYgcmV0VmFsLCByZWYgblZhbHVlcywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYXJnLklzRXhjZWxSYW5nZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgYyBpbiBhcmcuVmFsdWVBc1JhbmdlSW5mbykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChTaG91bGRJZ25vcmUoYywgY29udGV4dCkpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBDaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoYyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChJc051bWVyaWMoYy5WYWx1ZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5WYWx1ZXMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCArPSBjLlZhbHVlRG91YmxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMuVmFsdWUgaXMgYm9vbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgblZhbHVlcysrOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IChib29sKSBjLlZhbHVlID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYy5WYWx1ZSBpcyBzdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5WYWx1ZXMrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgbnVtZXJpY1ZhbHVlID0gR2V0TnVtZXJpY1ZhbHVlKGFyZy5WYWx1ZSwgaXNJbkFycmF5KTsKLSAgICAgICAgICAgICAgICBpZiAobnVtZXJpY1ZhbHVlLkhhc1ZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgblZhbHVlcysrOwotICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gbnVtZXJpY1ZhbHVlLlZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKChhcmcuVmFsdWUgaXMgc3RyaW5nKSAmJiAhQ29udmVydFV0aWwuSXNOdW1lcmljU3RyaW5nKGFyZy5WYWx1ZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbkFycmF5KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuVmFsdWVzKys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsgICAKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihhcmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBkb3VibGU/IEdldE51bWVyaWNWYWx1ZShvYmplY3Qgb2JqLCBib29sIGlzSW5BcnJheSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKElzTnVtZXJpYyhvYmopKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShvYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAob2JqIGlzIGJvb2wpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzSW5BcnJheSkgcmV0dXJuIGRlZmF1bHQoZG91YmxlPyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKG9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChDb252ZXJ0VXRpbC5Jc051bWVyaWNTdHJpbmcob2JqKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZG91YmxlLlBhcnNlKG9iai5Ub1N0cmluZygpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBkZWZhdWx0KGRvdWJsZT8pOwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgQXZlcmFnZUEgOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEsIGVFcnJvclR5cGUuRGl2MCk7CisgICAgZG91YmxlIG5WYWx1ZXMgPSAwZCwKKyAgICAgICAgcmVzdWx0ID0gMGQ7CisgICAgZm9yZWFjaCAodmFyIGFyZyBpbiBhcmd1bWVudHMpIHsKKyAgICAgIENhbGN1bGF0ZShhcmcsIGNvbnRleHQsIHJlZiByZXN1bHQsIHJlZiBuVmFsdWVzKTsKICAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChEaXZpZGUocmVzdWx0LCBuVmFsdWVzKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgQ2FsY3VsYXRlKAorICAgICAgRnVuY3Rpb25Bcmd1bWVudCBhcmcsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0LAorICAgICAgcmVmIGRvdWJsZSByZXRWYWwsCisgICAgICByZWYgZG91YmxlIG5WYWx1ZXMsCisgICAgICBib29sIGlzSW5BcnJheSA9IGZhbHNlKSB7CisgICAgaWYgKFNob3VsZElnbm9yZShhcmcpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChhcmcuVmFsdWUgaXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pIHsKKyAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIChJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PilhcmcuVmFsdWUpIHsKKyAgICAgICAgQ2FsY3VsYXRlKGl0ZW0sIGNvbnRleHQsIHJlZiByZXRWYWwsIHJlZiBuVmFsdWVzLCB0cnVlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGFyZy5Jc0V4Y2VsUmFuZ2UpIHsKKyAgICAgIGZvcmVhY2ggKHZhciBjIGluIGFyZy5WYWx1ZUFzUmFuZ2VJbmZvKSB7CisgICAgICAgIGlmIChTaG91bGRJZ25vcmUoYywgY29udGV4dCkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBDaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoYyk7CisgICAgICAgIGlmIChJc051bWVyaWMoYy5WYWx1ZSkpIHsKKyAgICAgICAgICBuVmFsdWVzKys7CisgICAgICAgICAgcmV0VmFsICs9IGMuVmFsdWVEb3VibGU7CisgICAgICAgIH0gZWxzZSBpZiAoYy5WYWx1ZSBpcyBib29sKSB7CisgICAgICAgICAgblZhbHVlcysrOworICAgICAgICAgIHJldFZhbCArPSAoYm9vbCljLlZhbHVlID8gMSA6IDA7CisgICAgICAgIH0gZWxzZSBpZiAoYy5WYWx1ZSBpcyBzdHJpbmcpIHsKKyAgICAgICAgICBuVmFsdWVzKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdmFyIG51bWVyaWNWYWx1ZSA9IEdldE51bWVyaWNWYWx1ZShhcmcuVmFsdWUsIGlzSW5BcnJheSk7CisgICAgICBpZiAobnVtZXJpY1ZhbHVlLkhhc1ZhbHVlKSB7CisgICAgICAgIG5WYWx1ZXMrKzsKKyAgICAgICAgcmV0VmFsICs9IG51bWVyaWNWYWx1ZS5WYWx1ZTsKKyAgICAgIH0gZWxzZSBpZiAoKGFyZy5WYWx1ZSBpcyBzdHJpbmcpICYmICFDb252ZXJ0VXRpbC5Jc051bWVyaWNTdHJpbmcoYXJnLlZhbHVlKSkgeworICAgICAgICBpZiAoaXNJbkFycmF5KSB7CisgICAgICAgICAgblZhbHVlcysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihhcmcpOworICB9CisKKyAgcHJpdmF0ZSBkb3VibGU/IEdldE51bWVyaWNWYWx1ZShvYmplY3Qgb2JqLCBib29sIGlzSW5BcnJheSkgeworICAgIGlmIChJc051bWVyaWMob2JqKSkgeworICAgICAgcmV0dXJuIENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKG9iaik7CisgICAgfQorICAgIGlmIChvYmogaXMgYm9vbCkgeworICAgICAgaWYgKGlzSW5BcnJheSkgeworICAgICAgICByZXR1cm4gZGVmYXVsdChkb3VibGU/KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShvYmopOworICAgIH0KKyAgICBpZiAoQ29udmVydFV0aWwuSXNOdW1lcmljU3RyaW5nKG9iaikpIHsKKyAgICAgIHJldHVybiBkb3VibGUuUGFyc2Uob2JqLlRvU3RyaW5nKCksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgIH0KKyAgICByZXR1cm4gZGVmYXVsdChkb3VibGU/KTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F2ZXJhZ2VJZi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlSWYuY3MKaW5kZXggMTRlNmI3ZS4uM2I4Mzg1OCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0F2ZXJhZ2VJZi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXZlcmFnZUlmLmNzCkBAIC03LDE1NSArNywxNDIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIHVzaW5nIFJlcXVpcmUgPSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllcy5SZXF1aXJlOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBBdmVyYWdlSWYgOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yIF9udW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvcjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBXaWxkQ2FyZFZhbHVlTWF0Y2hlciBfd2lsZENhcmRWYWx1ZU1hdGNoZXI7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKIAotICAgICAgICBwdWJsaWMgQXZlcmFnZUlmKCkKLSAgICAgICAgICAgIDogdGhpcyhuZXcgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IoKSwgbmV3IFdpbGRDYXJkVmFsdWVNYXRjaGVyKCkpCi0gICAgICAgIHsKK3B1YmxpYyBjbGFzcyBBdmVyYWdlSWYgOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uIHsKKyAgcHJpdmF0ZSByZWFkb25seSBOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvciBfbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3I7CisgIHByaXZhdGUgcmVhZG9ubHkgV2lsZENhcmRWYWx1ZU1hdGNoZXIgX3dpbGRDYXJkVmFsdWVNYXRjaGVyOwogCi0gICAgICAgIH0KKyAgcHVibGljIEF2ZXJhZ2VJZigpCisgICAgICA6IHRoaXMobmV3KCksIG5ldygpKSB7fQogCi0gICAgICAgIHB1YmxpYyBBdmVyYWdlSWYoTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgZXZhbHVhdG9yLCBXaWxkQ2FyZFZhbHVlTWF0Y2hlciB3aWxkQ2FyZFZhbHVlTWF0Y2hlcikKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGV2YWx1YXRvcikuTmFtZWQoImV2YWx1YXRvciIpLklzTm90TnVsbCgpOwotICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGV2YWx1YXRvcikuTmFtZWQoIndpbGRDYXJkVmFsdWVNYXRjaGVyIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICBfbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgPSBldmFsdWF0b3I7Ci0gICAgICAgICAgICBfd2lsZENhcmRWYWx1ZU1hdGNoZXIgPSB3aWxkQ2FyZFZhbHVlTWF0Y2hlcjsKLSAgICAgICAgfQorICBwdWJsaWMgQXZlcmFnZUlmKAorICAgICAgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgZXZhbHVhdG9yLAorICAgICAgV2lsZENhcmRWYWx1ZU1hdGNoZXIgd2lsZENhcmRWYWx1ZU1hdGNoZXIpIHsKKyAgICBSZXF1aXJlLlRoYXQoZXZhbHVhdG9yKS5OYW1lZCgiZXZhbHVhdG9yIikuSXNOb3ROdWxsKCk7CisgICAgUmVxdWlyZS5UaGF0KGV2YWx1YXRvcikuTmFtZWQoIndpbGRDYXJkVmFsdWVNYXRjaGVyIikuSXNOb3ROdWxsKCk7CisgICAgX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yID0gZXZhbHVhdG9yOworICAgIF93aWxkQ2FyZFZhbHVlTWF0Y2hlciA9IHdpbGRDYXJkVmFsdWVNYXRjaGVyOworICB9CiAKLSAgICAgICAgcHJpdmF0ZSBib29sIEV2YWx1YXRlKG9iamVjdCBvYmosIHN0cmluZyBleHByZXNzaW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGU/IGNhbmRpZGF0ZSA9IGRlZmF1bHQoZG91YmxlPyk7Ci0gICAgICAgICAgICBpZiAoSXNOdW1lcmljKG9iaikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUob2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuSGFzVmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9udW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvci5FdmFsdWF0ZShjYW5kaWRhdGUuVmFsdWUsIGV4cHJlc3Npb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gX3dpbGRDYXJkVmFsdWVNYXRjaGVyLklzTWF0Y2goZXhwcmVzc2lvbiwgb2JqLlRvU3RyaW5nKCkpID09IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKLSAgICAgICAgICAgIHZhciBmaXJzdEFyZyA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IGZpcnN0QXJnLlZhbHVlIGFzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+OwotICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCAmJiBmaXJzdEFyZy5Jc0V4Y2VsUmFuZ2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJncyA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCl7IGZpcnN0QXJnIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBhcmd1bWVudHMuRWxlbWVudEF0KDEpLlZhbHVlOwotICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiBjcml0ZXJpYSA9PSBudWxsIHx8IGNyaXRlcmlhLlRvU3RyaW5nKCkuTGVuZ3RoID4gMjU1LCBlRXJyb3JUeXBlLlZhbHVlKTsKLSAgICAgICAgICAgIHZhciByZXRWYWwgPSAwZDsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA+IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHNlY29uZEFyZyA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMik7Ci0gICAgICAgICAgICAgICAgdmFyIGxvb2t1cFJhbmdlID0gc2Vjb25kQXJnLlZhbHVlIGFzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+OwotICAgICAgICAgICAgICAgIGlmIChsb29rdXBSYW5nZSA9PSBudWxsICYmIHNlY29uZEFyZy5Jc0V4Y2VsUmFuZ2UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsb29rdXBSYW5nZSA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCkge3NlY29uZEFyZ307Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldFZhbCA9IENhbGN1bGF0ZVdpdGhMb29rdXBSYW5nZShhcmdzLCBjcml0ZXJpYS5Ub1N0cmluZygpLCBsb29rdXBSYW5nZSwgY29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0VmFsID0gQ2FsY3VsYXRlU2luZ2xlUmFuZ2UoYXJncywgY3JpdGVyaWEuVG9TdHJpbmcoKSwgY29udGV4dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJldFZhbCwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGRvdWJsZSBDYWxjdWxhdGVXaXRoTG9va3VwUmFuZ2UoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gcmFuZ2UsIHN0cmluZyBjcml0ZXJpYSwgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gc3VtUmFuZ2UsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXRWYWwgPSAwZDsKLSAgICAgICAgICAgIHZhciBuTWF0Y2hlcyA9IDA7Ci0gICAgICAgICAgICB2YXIgZmxhdHRlbmVkUmFuZ2UgPSBBcmdzVG9PYmplY3RFbnVtZXJhYmxlKGZhbHNlLCByYW5nZSwgY29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgZmxhdHRlbmVkU3VtUmFuZ2UgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKHN1bVJhbmdlLCBjb250ZXh0KTsKLSAgICAgICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgZmxhdHRlbmVkUmFuZ2UuQ291bnQoKTsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBjYW5kaWRhdGUgPSBmbGF0dGVuZWRTdW1SYW5nZS5FbGVtZW50QXQoeCk7Ci0gICAgICAgICAgICAgICAgaWYgKEV2YWx1YXRlKGZsYXR0ZW5lZFJhbmdlLkVsZW1lbnRBdCh4KSwgY3JpdGVyaWEpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbk1hdGNoZXMrKzsKLSAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IGNhbmRpZGF0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRGl2aWRlKHJldFZhbCwgbk1hdGNoZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgQ2FsY3VsYXRlU2luZ2xlUmFuZ2UoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJncywgc3RyaW5nIGV4cHJlc3Npb24sIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXRWYWwgPSAwZDsKLSAgICAgICAgICAgIHZhciBuTWF0Y2hlcyA9IDA7Ci0gICAgICAgICAgICB2YXIgZmxhdHRlbmRlZFJhbmdlID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZShhcmdzLCBjb250ZXh0KTsKLSAgICAgICAgICAgIHZhciBjYW5kaWRhdGVzID0gZmxhdHRlbmRlZFJhbmdlIGFzIGRvdWJsZVtdID8/IGZsYXR0ZW5kZWRSYW5nZS5Ub0FycmF5KCk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgY2FuZGlkYXRlIGluIGNhbmRpZGF0ZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEV2YWx1YXRlKGNhbmRpZGF0ZSwgZXhwcmVzc2lvbikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gY2FuZGlkYXRlOwotICAgICAgICAgICAgICAgICAgICBuTWF0Y2hlcysrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBEaXZpZGUocmV0VmFsLCBuTWF0Y2hlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGRvdWJsZSBDYWxjdWxhdGUoRnVuY3Rpb25Bcmd1bWVudCBhcmcsIHN0cmluZyBleHByZXNzaW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmV0VmFsID0gMGQ7Ci0gICAgICAgICAgICBpZiAoU2hvdWxkSWdub3JlKGFyZykgfHwgIV9udW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvci5FdmFsdWF0ZShhcmcuVmFsdWUsIGV4cHJlc3Npb24pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoSXNOdW1lcmljKGFyZy5WYWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0VmFsICs9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZy5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2Vsc2UgaWYgKGFyZy5WYWx1ZSBpcyBTeXN0ZW0uRGF0ZVRpbWUpCi0gICAgICAgICAgICAvL3sKLSAgICAgICAgICAgIC8vICAgIHJldFZhbCArPSBDb252ZXJ0LlRvRGF0ZVRpbWUoYXJnLlZhbHVlKS5Ub09BRGF0ZSgpOwotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICBlbHNlIGlmIChhcmcuVmFsdWUgaXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KWFyZy5WYWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldFZhbCArPSBDYWxjdWxhdGUoaXRlbSwgZXhwcmVzc2lvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKLSAgICAgICAgfQorICBwcml2YXRlIGJvb2wgRXZhbHVhdGUob2JqZWN0IG9iaiwgc3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICBkb3VibGU/IGNhbmRpZGF0ZSA9IGRlZmF1bHQoZG91YmxlPyk7CisgICAgaWYgKElzTnVtZXJpYyhvYmopKSB7CisgICAgICBjYW5kaWRhdGUgPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShvYmopOwogICAgIH0KKyAgICBpZiAoY2FuZGlkYXRlLkhhc1ZhbHVlKSB7CisgICAgICByZXR1cm4gX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yLkV2YWx1YXRlKGNhbmRpZGF0ZS5WYWx1ZSwgZXhwcmVzc2lvbik7CisgICAgfQorICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gX3dpbGRDYXJkVmFsdWVNYXRjaGVyLklzTWF0Y2goZXhwcmVzc2lvbiwgb2JqLlRvU3RyaW5nKCkpID09IDA7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgdmFyIGZpcnN0QXJnID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKTsKKyAgICB2YXIgYXJncyA9IGZpcnN0QXJnLlZhbHVlIGFzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+OworICAgIGlmIChhcmdzID09IG51bGwgJiYgZmlyc3RBcmcuSXNFeGNlbFJhbmdlKSB7CisgICAgICBhcmdzID0gbmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4geyBmaXJzdEFyZyB9OworICAgIH0KKyAgICB2YXIgY3JpdGVyaWEgPSBhcmd1bWVudHMuRWxlbWVudEF0KDEpLlZhbHVlOworICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uSWYoCisgICAgICAgICgpID0+IGNyaXRlcmlhID09IG51bGwgfHwgY3JpdGVyaWEuVG9TdHJpbmcoKS5MZW5ndGggPiAyNTUsCisgICAgICAgIGVFcnJvclR5cGUuVmFsdWUpOworICAgIHZhciByZXRWYWwgPSAwZDsKKyAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiAyKSB7CisgICAgICB2YXIgc2Vjb25kQXJnID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKTsKKyAgICAgIHZhciBsb29rdXBSYW5nZSA9IHNlY29uZEFyZy5WYWx1ZSBhcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PjsKKyAgICAgIGlmIChsb29rdXBSYW5nZSA9PSBudWxsICYmIHNlY29uZEFyZy5Jc0V4Y2VsUmFuZ2UpIHsKKyAgICAgICAgbG9va3VwUmFuZ2UgPSBuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PiB7IHNlY29uZEFyZyB9OworICAgICAgfQorICAgICAgcmV0VmFsID0gQ2FsY3VsYXRlV2l0aExvb2t1cFJhbmdlKGFyZ3MsIGNyaXRlcmlhLlRvU3RyaW5nKCksIGxvb2t1cFJhbmdlLCBjb250ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0VmFsID0gQ2FsY3VsYXRlU2luZ2xlUmFuZ2UoYXJncywgY3JpdGVyaWEuVG9TdHJpbmcoKSwgY29udGV4dCk7CisgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmV0VmFsLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQorCisgIHByaXZhdGUgZG91YmxlIENhbGN1bGF0ZVdpdGhMb29rdXBSYW5nZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IHJhbmdlLAorICAgICAgc3RyaW5nIGNyaXRlcmlhLAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gc3VtUmFuZ2UsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgdmFyIHJldFZhbCA9IDBkOworICAgIHZhciBuTWF0Y2hlcyA9IDA7CisgICAgdmFyIGZsYXR0ZW5lZFJhbmdlID0gQXJnc1RvT2JqZWN0RW51bWVyYWJsZShmYWxzZSwgcmFuZ2UsIGNvbnRleHQpOworICAgIHZhciBmbGF0dGVuZWRTdW1SYW5nZSA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoc3VtUmFuZ2UsIGNvbnRleHQpOworICAgIGZvciAodmFyIHggPSAwOyB4IDwgZmxhdHRlbmVkUmFuZ2UuQ291bnQoKTsgeCsrKSB7CisgICAgICB2YXIgY2FuZGlkYXRlID0gZmxhdHRlbmVkU3VtUmFuZ2UuRWxlbWVudEF0KHgpOworICAgICAgaWYgKEV2YWx1YXRlKGZsYXR0ZW5lZFJhbmdlLkVsZW1lbnRBdCh4KSwgY3JpdGVyaWEpKSB7CisgICAgICAgIG5NYXRjaGVzKys7CisgICAgICAgIHJldFZhbCArPSBjYW5kaWRhdGU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBEaXZpZGUocmV0VmFsLCBuTWF0Y2hlcyk7CisgIH0KKworICBwcml2YXRlIGRvdWJsZSBDYWxjdWxhdGVTaW5nbGVSYW5nZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3MsCisgICAgICBzdHJpbmcgZXhwcmVzc2lvbiwKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICB2YXIgcmV0VmFsID0gMGQ7CisgICAgdmFyIG5NYXRjaGVzID0gMDsKKyAgICB2YXIgZmxhdHRlbmRlZFJhbmdlID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZShhcmdzLCBjb250ZXh0KTsKKyAgICB2YXIgY2FuZGlkYXRlcyA9IGZsYXR0ZW5kZWRSYW5nZSBhcyBkb3VibGVbXSA/PyBmbGF0dGVuZGVkUmFuZ2UuVG9BcnJheSgpOworICAgIGZvcmVhY2ggKHZhciBjYW5kaWRhdGUgaW4gY2FuZGlkYXRlcykgeworICAgICAgaWYgKEV2YWx1YXRlKGNhbmRpZGF0ZSwgZXhwcmVzc2lvbikpIHsKKyAgICAgICAgcmV0VmFsICs9IGNhbmRpZGF0ZTsKKyAgICAgICAgbk1hdGNoZXMrKzsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIERpdmlkZShyZXRWYWwsIG5NYXRjaGVzKTsKKyAgfQorCisgIHByaXZhdGUgZG91YmxlIENhbGN1bGF0ZShGdW5jdGlvbkFyZ3VtZW50IGFyZywgc3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICB2YXIgcmV0VmFsID0gMGQ7CisgICAgaWYgKFNob3VsZElnbm9yZShhcmcpIHx8ICFfbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IuRXZhbHVhdGUoYXJnLlZhbHVlLCBleHByZXNzaW9uKSkgeworICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisgICAgaWYgKElzTnVtZXJpYyhhcmcuVmFsdWUpKSB7CisgICAgICByZXRWYWwgKz0gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoYXJnLlZhbHVlKTsKKyAgICB9CisgICAgLy9lbHNlIGlmIChhcmcuVmFsdWUgaXMgU3lzdGVtLkRhdGVUaW1lKQorICAgIC8veworICAgIC8vICAgIHJldFZhbCArPSBDb252ZXJ0LlRvRGF0ZVRpbWUoYXJnLlZhbHVlKS5Ub09BRGF0ZSgpOworICAgIC8vfQorICAgIGVsc2UgaWYgKGFyZy5WYWx1ZSBpcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PikgeworICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KWFyZy5WYWx1ZSkgeworICAgICAgICByZXRWYWwgKz0gQ2FsY3VsYXRlKGl0ZW0sIGV4cHJlc3Npb24pOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0VmFsOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQXZlcmFnZUlmcy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlSWZzLmNzCmluZGV4IDczMzNjZTIuLmEyNDI2NmMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlSWZzLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9BdmVyYWdlSWZzLmNzCkBAIC03LDYwICs3LDYzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDItMDEKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgQXZlcmFnZUlmcyA6IE11bHRpcGxlUmFuZ2VDcml0ZXJpYXNGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvbkFyZ3VtZW50cyA9IGFyZ3VtZW50cyBhcyBGdW5jdGlvbkFyZ3VtZW50W10gPz8gYXJndW1lbnRzLlRvQXJyYXkoKTsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGZ1bmN0aW9uQXJndW1lbnRzLCAzKTsKLSAgICAgICAgICAgIHZhciBzdW1SYW5nZSA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUodHJ1ZSwgbmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4geyBmdW5jdGlvbkFyZ3VtZW50c1swXSB9LCBjb250ZXh0KS5Ub0xpc3QoKTsKLSAgICAgICAgICAgIHZhciBhcmdSYW5nZXMgPSBuZXcgTGlzdDxFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvPigpOwotICAgICAgICAgICAgdmFyIGNyaXRlcmlhcyA9IG5ldyBMaXN0PG9iamVjdD4oKTsKLSAgICAgICAgICAgIGZvciAodmFyIGl4ID0gMTsgaXggPCAzMTsgaXggKz0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25Bcmd1bWVudHMuTGVuZ3RoIDw9IGl4KSBicmVhazsKLSAgICAgICAgICAgICAgICB2YXIgcmFuZ2VJbmZvID0gZnVuY3Rpb25Bcmd1bWVudHNbaXhdLlZhbHVlQXNSYW5nZUluZm87Ci0gICAgICAgICAgICAgICAgYXJnUmFuZ2VzLkFkZChyYW5nZUluZm8pOwotICAgICAgICAgICAgICAgIGlmIChpeCA+IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IHJhbmdlSW5mby5HZXROQ2VsbHMoKSAhPSBhcmdSYW5nZXNbMF0uR2V0TkNlbGxzKCksIGVFcnJvclR5cGUuVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjcml0ZXJpYXMuQWRkKGZ1bmN0aW9uQXJndW1lbnRzW2l4ICsgMV0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSUVudW1lcmFibGU8aW50PiBtYXRjaEluZGV4ZXMgPSBHZXRNYXRjaEluZGV4ZXMoYXJnUmFuZ2VzWzBdLCBjcml0ZXJpYXNbMF0pOwotICAgICAgICAgICAgdmFyIGVudW1lcmFibGUgPSBtYXRjaEluZGV4ZXMgYXMgSUxpc3Q8aW50PiA/PyBtYXRjaEluZGV4ZXMuVG9MaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKHZhciBpeCA9IDE7IGl4IDwgYXJnUmFuZ2VzLkNvdW50ICYmIGVudW1lcmFibGUuQW55KCk7IGl4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGluZGV4ZXMgPSBHZXRNYXRjaEluZGV4ZXMoYXJnUmFuZ2VzW2l4XSwgY3JpdGVyaWFzW2l4XSk7Ci0gICAgICAgICAgICAgICAgbWF0Y2hJbmRleGVzID0gZW51bWVyYWJsZS5JbnRlcnNlY3QoaW5kZXhlcyk7Ci0gICAgICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKIAotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG1hdGNoSW5kZXhlcy5BdmVyYWdlKGluZGV4ID0+IHN1bVJhbmdlW2luZGV4XSk7Ci0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIEF2ZXJhZ2VJZnMgOiBNdWx0aXBsZVJhbmdlQ3JpdGVyaWFzRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHZhciBmdW5jdGlvbkFyZ3VtZW50cyA9IGFyZ3VtZW50cyBhcyBGdW5jdGlvbkFyZ3VtZW50W10gPz8gYXJndW1lbnRzLlRvQXJyYXkoKTsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhmdW5jdGlvbkFyZ3VtZW50cywgMyk7CisgICAgdmFyIHN1bVJhbmdlID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZSgKKyAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICBuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PiB7IGZ1bmN0aW9uQXJndW1lbnRzWzBdIH0sCisgICAgICAgICAgICBjb250ZXh0KQorICAgICAgICAuVG9MaXN0KCk7CisgICAgdmFyIGFyZ1JhbmdlcyA9IG5ldyBMaXN0PEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8+KCk7CisgICAgdmFyIGNyaXRlcmlhcyA9IG5ldyBMaXN0PG9iamVjdD4oKTsKKyAgICBmb3IgKHZhciBpeCA9IDE7IGl4IDwgMzE7IGl4ICs9IDIpIHsKKyAgICAgIGlmIChmdW5jdGlvbkFyZ3VtZW50cy5MZW5ndGggPD0gaXgpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB2YXIgcmFuZ2VJbmZvID0gZnVuY3Rpb25Bcmd1bWVudHNbaXhdLlZhbHVlQXNSYW5nZUluZm87CisgICAgICBhcmdSYW5nZXMuQWRkKHJhbmdlSW5mbyk7CisgICAgICBpZiAoaXggPiAxKSB7CisgICAgICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uSWYoCisgICAgICAgICAgICAoKSA9PiByYW5nZUluZm8uR2V0TkNlbGxzKCkgIT0gYXJnUmFuZ2VzWzBdLkdldE5DZWxscygpLAorICAgICAgICAgICAgZUVycm9yVHlwZS5WYWx1ZSk7CisgICAgICB9CisgICAgICBjcml0ZXJpYXMuQWRkKGZ1bmN0aW9uQXJndW1lbnRzW2l4ICsgMV0uVmFsdWUpOwogICAgIH0KKyAgICBJRW51bWVyYWJsZTxpbnQ+IG1hdGNoSW5kZXhlcyA9IEdldE1hdGNoSW5kZXhlcyhhcmdSYW5nZXNbMF0sIGNyaXRlcmlhc1swXSk7CisgICAgdmFyIGVudW1lcmFibGUgPSBtYXRjaEluZGV4ZXMgYXMgSUxpc3Q8aW50PiA/PyBtYXRjaEluZGV4ZXMuVG9MaXN0KCk7CisgICAgZm9yICh2YXIgaXggPSAxOyBpeCA8IGFyZ1Jhbmdlcy5Db3VudCAmJiBlbnVtZXJhYmxlLkFueSgpOyBpeCsrKSB7CisgICAgICB2YXIgaW5kZXhlcyA9IEdldE1hdGNoSW5kZXhlcyhhcmdSYW5nZXNbaXhdLCBjcml0ZXJpYXNbaXhdKTsKKyAgICAgIG1hdGNoSW5kZXhlcyA9IGVudW1lcmFibGUuSW50ZXJzZWN0KGluZGV4ZXMpOworICAgIH0KKworICAgIHZhciByZXN1bHQgPSBtYXRjaEluZGV4ZXMuQXZlcmFnZShpbmRleCA9PiBzdW1SYW5nZVtpbmRleF0pOworCisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ2VpbGluZy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9DZWlsaW5nLmNzCmluZGV4IGE0NDFkYjIuLjIxNDA4OTEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9DZWlsaW5nLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9DZWlsaW5nLmNzCkBAIC03LDYyICs3LDU0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgQ2VpbGluZyA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgdmFyIHNpZ25pZmljYW5jZSA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgVmFsaWRhdGVOdW1iZXJBbmRTaWduKG51bWJlciwgc2lnbmlmaWNhbmNlKTsKLSAgICAgICAgICAgIGlmIChzaWduaWZpY2FuY2UgPCAxICYmIHNpZ25pZmljYW5jZSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGZsb29yID0gU3lzdGVtLk1hdGguRmxvb3IobnVtYmVyKTsKLSAgICAgICAgICAgICAgICB2YXIgcmVzdCA9IG51bWJlciAtIGZsb29yOwotICAgICAgICAgICAgICAgIHZhciBuU2lnbiA9IChpbnQpKHJlc3QgLyBzaWduaWZpY2FuY2UpICsgMTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGZsb29yICsgKG5TaWduICogc2lnbmlmaWNhbmNlKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzaWduaWZpY2FuY2UgPT0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkNlaWxpbmcobnVtYmVyKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG51bWJlciAtIChudW1iZXIgJSBzaWduaWZpY2FuY2UpICsgc2lnbmlmaWNhbmNlOwotICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIFZhbGlkYXRlTnVtYmVyQW5kU2lnbihkb3VibGUgbnVtYmVyLCBkb3VibGUgc2lnbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG51bWJlciA+IDBkICYmIHNpZ24gPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBzdHJpbmcuRm9ybWF0KCJudW06IHswfSwgc2lnbjogezF9IiwgbnVtYmVyLCBzaWduKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2VpbGluZyBjYW5ub3QgaGFuZGxlIGEgbmVnYXRpdmUgc2lnbmlmaWNhbmNlIHdoZW4gdGhlIG51bWJlciBpcyBwb3NpdGl2ZSIgKyB2YWx1ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9CitwdWJsaWMgY2xhc3MgQ2VpbGluZyA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgIHZhciBzaWduaWZpY2FuY2UgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAxKTsKKyAgICBWYWxpZGF0ZU51bWJlckFuZFNpZ24obnVtYmVyLCBzaWduaWZpY2FuY2UpOworICAgIGlmIChzaWduaWZpY2FuY2UgPCAxICYmIHNpZ25pZmljYW5jZSA+IDApIHsKKyAgICAgIHZhciBmbG9vciA9IFN5c3RlbS5NYXRoLkZsb29yKG51bWJlcik7CisgICAgICB2YXIgcmVzdCA9IG51bWJlciAtIGZsb29yOworICAgICAgdmFyIG5TaWduID0gKGludCkocmVzdCAvIHNpZ25pZmljYW5jZSkgKyAxOworICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChmbG9vciArIChuU2lnbiAqIHNpZ25pZmljYW5jZSksIERhdGFUeXBlLkRlY2ltYWwpOwogICAgIH0KKyAgICBpZiAoc2lnbmlmaWNhbmNlID09IDEpIHsKKyAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguQ2VpbGluZyhudW1iZXIpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICB9CisgICAgdmFyIHJlc3VsdCA9IG51bWJlciAtIChudW1iZXIgJSBzaWduaWZpY2FuY2UpICsgc2lnbmlmaWNhbmNlOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBWYWxpZGF0ZU51bWJlckFuZFNpZ24oZG91YmxlIG51bWJlciwgZG91YmxlIHNpZ24pIHsKKyAgICBpZiAobnVtYmVyID4gMGQgJiYgc2lnbiA8IDApIHsKKyAgICAgIHZhciB2YWx1ZXMgPSBzdHJpbmcuRm9ybWF0KCJudW06IHswfSwgc2lnbjogezF9IiwgbnVtYmVyLCBzaWduKTsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICJDZWlsaW5nIGNhbm5vdCBoYW5kbGUgYSBuZWdhdGl2ZSBzaWduaWZpY2FuY2Ugd2hlbiB0aGUgbnVtYmVyIGlzIHBvc2l0aXZlIiArIHZhbHVlcyk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ29zLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0Nvcy5jcwppbmRleCBlODg5NjE5Li5hNjA1NzA3IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ29zLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3MuY3MKQEAgLTcsMzYgKzcsMzMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBDb3MgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmcgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguQ29zKGFyZyksIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CisKK3B1YmxpYyBjbGFzcyBDb3MgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBhcmcgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkNvcyhhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0Nvc2guY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ29zaC5jcwppbmRleCBmMjk0NDc4Li5iYjE1MzgxIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ29zaC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ29zaC5jcwpAQCAtNywzNiArNywzMyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIENvc2ggOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmcgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguQ29zaChhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgQ29zaCA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIGFyZyA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguQ29zaChhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0NvdW50LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0NvdW50LmNzCmluZGV4IDIxYTU4YzEuLmM1YzQyZGEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3VudC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnQuY3MKQEAgLTcsMTExICs3LDk4IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBDb3VudCA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgZW51bSBJdGVtQ29udGV4dAotICAgICAgICB7Ci0gICAgICAgICAgICBJblJhbmdlLAotICAgICAgICAgICAgSW5BcnJheSwKLSAgICAgICAgICAgIFNpbmdsZUFyZwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBuSXRlbXMgPSAwZDsKLSAgICAgICAgICAgIENhbGN1bGF0ZShhcmd1bWVudHMsIHJlZiBuSXRlbXMsIGNvbnRleHQsIEl0ZW1Db250ZXh0LlNpbmdsZUFyZyk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KG5JdGVtcywgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBDb3VudCA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24geworICBwcml2YXRlIGVudW0gSXRlbUNvbnRleHQgeworICAgIEluUmFuZ2UsCisgICAgSW5BcnJheSwKKyAgICBTaW5nbGVBcmcsCisgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgQ2FsY3VsYXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGl0ZW1zLCByZWYgZG91YmxlIG5JdGVtcywgUGFyc2luZ0NvbnRleHQgY29udGV4dCwgSXRlbUNvbnRleHQgaXRlbUNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGl0ZW1zKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBjcyA9IGl0ZW0uVmFsdWUgYXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbzsKLSAgICAgICAgICAgICAgICBpZiAoY3MgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjIGluIGNzKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKGMsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNob3VsZElnbm9yZShjLCBjb250ZXh0KSA9PSBmYWxzZSAmJiBTaG91bGRDb3VudChjLlZhbHVlLCBJdGVtQ29udGV4dC5JblJhbmdlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSXRlbXMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBpdGVtLlZhbHVlIGFzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+OwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2FsY3VsYXRlKHZhbHVlLCByZWYgbkl0ZW1zLCBjb250ZXh0LCBJdGVtQ29udGV4dC5JbkFycmF5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9DaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoaXRlbSwgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2hvdWxkSWdub3JlKGl0ZW0pID09IGZhbHNlICYmIFNob3VsZENvdW50KGl0ZW0uVmFsdWUsIGl0ZW1Db250ZXh0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSXRlbXMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIG5JdGVtcyA9IDBkOworICAgIENhbGN1bGF0ZShhcmd1bWVudHMsIHJlZiBuSXRlbXMsIGNvbnRleHQsIEl0ZW1Db250ZXh0LlNpbmdsZUFyZyk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChuSXRlbXMsIERhdGFUeXBlLkludGVnZXIpOworICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIF9DaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoRnVuY3Rpb25Bcmd1bWVudCBhcmcsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vaWYgKGNvbnRleHQuU2NvcGVzLkN1cnJlbnQuSXNTdWJ0b3RhbCkKLSAgICAgICAgICAgIC8vewotICAgICAgICAgICAgLy8gICAgQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKGFyZyk7Ci0gICAgICAgICAgICAvL30KKyAgcHJpdmF0ZSB2b2lkIENhbGN1bGF0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGl0ZW1zLAorICAgICAgcmVmIGRvdWJsZSBuSXRlbXMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0LAorICAgICAgSXRlbUNvbnRleHQgaXRlbUNvbnRleHQpIHsKKyAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBpdGVtcykgeworICAgICAgdmFyIGNzID0gaXRlbS5WYWx1ZSBhcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvOworICAgICAgaWYgKGNzICE9IG51bGwpIHsKKyAgICAgICAgZm9yZWFjaCAodmFyIGMgaW4gY3MpIHsKKyAgICAgICAgICBfQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKGMsIGNvbnRleHQpOworICAgICAgICAgIGlmIChTaG91bGRJZ25vcmUoYywgY29udGV4dCkgPT0gZmFsc2UgJiYgU2hvdWxkQ291bnQoYy5WYWx1ZSwgSXRlbUNvbnRleHQuSW5SYW5nZSkpIHsKKyAgICAgICAgICAgIG5JdGVtcysrOworICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBfQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKEV4Y2VsRGF0YVByb3ZpZGVyLklDZWxsSW5mbyBjZWxsLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2lmIChjb250ZXh0LlNjb3Blcy5DdXJyZW50LklzU3VidG90YWwpCi0gICAgICAgICAgICAvL3sKLSAgICAgICAgICAgIC8vICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihjZWxsKTsKLSAgICAgICAgICAgIC8vfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgdmFyIHZhbHVlID0gaXRlbS5WYWx1ZSBhcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PjsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICBDYWxjdWxhdGUodmFsdWUsIHJlZiBuSXRlbXMsIGNvbnRleHQsIEl0ZW1Db250ZXh0LkluQXJyYXkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIF9DaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoaXRlbSwgY29udGV4dCk7CisgICAgICAgICAgaWYgKFNob3VsZElnbm9yZShpdGVtKSA9PSBmYWxzZSAmJiBTaG91bGRDb3VudChpdGVtLlZhbHVlLCBpdGVtQ29udGV4dCkpIHsKKyAgICAgICAgICAgIG5JdGVtcysrOworICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbCBTaG91bGRDb3VudChvYmplY3QgdmFsdWUsIEl0ZW1Db250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoY29udGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIEl0ZW1Db250ZXh0LlNpbmdsZUFyZzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElzTnVtZXJpYyh2YWx1ZSkgfHwgSXNOdW1lcmljU3RyaW5nKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBjYXNlIEl0ZW1Db250ZXh0LkluUmFuZ2U6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJc051bWVyaWModmFsdWUpOwotICAgICAgICAgICAgICAgIGNhc2UgSXRlbUNvbnRleHQuSW5BcnJheToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElzTnVtZXJpYyh2YWx1ZSkgfHwgSXNOdW1lcmljU3RyaW5nKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gSXRlbUNvbnRleHQ6IiArIGNvbnRleHQuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIH0KICAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgX0NoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihGdW5jdGlvbkFyZ3VtZW50IGFyZywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIC8vaWYgKGNvbnRleHQuU2NvcGVzLkN1cnJlbnQuSXNTdWJ0b3RhbCkKKyAgICAvL3sKKyAgICAvLyAgICBDaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoYXJnKTsKKyAgICAvL30KKyAgfQorCisgIHByaXZhdGUgdm9pZCBfQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKAorICAgICAgRXhjZWxEYXRhUHJvdmlkZXIuSUNlbGxJbmZvIGNlbGwsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgLy9pZiAoY29udGV4dC5TY29wZXMuQ3VycmVudC5Jc1N1YnRvdGFsKQorICAgIC8veworICAgIC8vICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihjZWxsKTsKKyAgICAvL30KKyAgfQorCisgIHByaXZhdGUgYm9vbCBTaG91bGRDb3VudChvYmplY3QgdmFsdWUsIEl0ZW1Db250ZXh0IGNvbnRleHQpIHsKKyAgICBzd2l0Y2ggKGNvbnRleHQpIHsKKyAgICAgIGNhc2UgSXRlbUNvbnRleHQuU2luZ2xlQXJnOgorICAgICAgICByZXR1cm4gSXNOdW1lcmljKHZhbHVlKSB8fCBJc051bWVyaWNTdHJpbmcodmFsdWUpOworICAgICAgY2FzZSBJdGVtQ29udGV4dC5JblJhbmdlOgorICAgICAgICByZXR1cm4gSXNOdW1lcmljKHZhbHVlKTsKKyAgICAgIGNhc2UgSXRlbUNvbnRleHQuSW5BcnJheToKKyAgICAgICAgcmV0dXJuIElzTnVtZXJpYyh2YWx1ZSkgfHwgSXNOdW1lcmljU3RyaW5nKHZhbHVlKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBJdGVtQ29udGV4dDoiICsgY29udGV4dCk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnRBLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0NvdW50QS5jcwppbmRleCAwZjQ0YjQ3Li4zZTdmZDNjIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnRBLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3VudEEuY3MKQEAgLTcsOTEgKzcsNzkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBDb3VudEEgOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBuSXRlbXMgPSAwZDsKLSAgICAgICAgICAgIENhbGN1bGF0ZShhcmd1bWVudHMsIGNvbnRleHQsIHJlZiBuSXRlbXMpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChuSXRlbXMsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKIAotICAgICAgICBwcml2YXRlIHZvaWQgQ2FsY3VsYXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGl0ZW1zLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0LCByZWYgZG91YmxlIG5JdGVtcykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gaXRlbXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGNzID0gaXRlbS5WYWx1ZSBhcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvOwotICAgICAgICAgICAgICAgIGlmIChjcyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGMgaW4gY3MpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9DaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoYywgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVNob3VsZElnbm9yZShjLCBjb250ZXh0KSAmJiBTaG91bGRDb3VudChjLlZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSXRlbXMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChpdGVtLlZhbHVlIGlzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ2FsY3VsYXRlKChJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PilpdGVtLlZhbHVlLCBjb250ZXh0LCByZWYgbkl0ZW1zKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX0NoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihpdGVtLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFTaG91bGRJZ25vcmUoaXRlbSkgJiYgU2hvdWxkQ291bnQoaXRlbS5WYWx1ZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5JdGVtcysrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorcHVibGljIGNsYXNzIENvdW50QSA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIG5JdGVtcyA9IDBkOworICAgIENhbGN1bGF0ZShhcmd1bWVudHMsIGNvbnRleHQsIHJlZiBuSXRlbXMpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQobkl0ZW1zLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgfQogCi0gICAgICAgICAgICB9CisgIHByaXZhdGUgdm9pZCBDYWxjdWxhdGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBpdGVtcywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQsCisgICAgICByZWYgZG91YmxlIG5JdGVtcykgeworICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIGl0ZW1zKSB7CisgICAgICB2YXIgY3MgPSBpdGVtLlZhbHVlIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87CisgICAgICBpZiAoY3MgIT0gbnVsbCkgeworICAgICAgICBmb3JlYWNoICh2YXIgYyBpbiBjcykgeworICAgICAgICAgIF9DaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoYywgY29udGV4dCk7CisgICAgICAgICAgaWYgKCFTaG91bGRJZ25vcmUoYywgY29udGV4dCkgJiYgU2hvdWxkQ291bnQoYy5WYWx1ZSkpIHsKKyAgICAgICAgICAgIG5JdGVtcysrOworICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBfQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKEZ1bmN0aW9uQXJndW1lbnQgYXJnLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dC5TY29wZXMuQ3VycmVudC5Jc1N1YnRvdGFsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihhcmcpOwotICAgICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChpdGVtLlZhbHVlIGlzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KSB7CisgICAgICAgIENhbGN1bGF0ZSgoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4paXRlbS5WYWx1ZSwgY29udGV4dCwgcmVmIG5JdGVtcyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBfQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKGl0ZW0sIGNvbnRleHQpOworICAgICAgICBpZiAoIVNob3VsZElnbm9yZShpdGVtKSAmJiBTaG91bGRDb3VudChpdGVtLlZhbHVlKSkgeworICAgICAgICAgIG5JdGVtcysrOwogICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIF9DaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoRXhjZWxEYXRhUHJvdmlkZXIuSUNlbGxJbmZvIGNlbGwsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0LlNjb3Blcy5DdXJyZW50LklzU3VidG90YWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKGNlbGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sIFNob3VsZENvdW50KG9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlLlRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQorICAgICAgfQogICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBfQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKEZ1bmN0aW9uQXJndW1lbnQgYXJnLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgaWYgKGNvbnRleHQuU2NvcGVzLkN1cnJlbnQuSXNTdWJ0b3RhbCkgeworICAgICAgQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKGFyZyk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIF9DaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoCisgICAgICBFeGNlbERhdGFQcm92aWRlci5JQ2VsbEluZm8gY2VsbCwKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBpZiAoY29udGV4dC5TY29wZXMuQ3VycmVudC5Jc1N1YnRvdGFsKSB7CisgICAgICBDaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoY2VsbCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBib29sIFNob3VsZENvdW50KG9iamVjdCB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlLlRvU3RyaW5nKCkpKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0NvdW50QmxhbmsuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnRCbGFuay5jcwppbmRleCBhNTkzMmFjLi4yMzE3NmFlIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnRCbGFuay5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnRCbGFuay5jcwpAQCAtMSwyOCArMSwyNSBAQAot77u/dXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTG9naWNhbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIENvdW50QmxhbmsgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmcgPSBhcmd1bWVudHMuRmlyc3QoKTsKLSAgICAgICAgICAgIGlmKCFhcmcuSXNFeGNlbFJhbmdlKXRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDb3VudEJsYW5rIG9ubHkgc3VwcG9ydCByYW5nZXMgYXMgYXJndW1lbnRzIik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gYXJnLlZhbHVlQXNSYW5nZUluZm8uR2V0TkNlbGxzKCk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiBhcmcuVmFsdWVBc1JhbmdlSW5mbykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIShjZWxsLlZhbHVlID09IG51bGwgfHwgY2VsbC5WYWx1ZSA9PSBzdHJpbmcuRW1wdHkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKKworcHVibGljIGNsYXNzIENvdW50QmxhbmsgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBhcmcgPSBhcmd1bWVudHMuRmlyc3QoKTsKKyAgICBpZiAoIWFyZy5Jc0V4Y2VsUmFuZ2UpIHsKKyAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDb3VudEJsYW5rIG9ubHkgc3VwcG9ydCByYW5nZXMgYXMgYXJndW1lbnRzIik7CiAgICAgfQorICAgIHZhciByZXN1bHQgPSBhcmcuVmFsdWVBc1JhbmdlSW5mby5HZXROQ2VsbHMoKTsKKyAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiBhcmcuVmFsdWVBc1JhbmdlSW5mbykgeworICAgICAgaWYgKCEoY2VsbC5WYWx1ZSA9PSBudWxsIHx8IGNlbGwuVmFsdWUgPT0gc3RyaW5nLkVtcHR5KSkgeworICAgICAgICByZXN1bHQtLTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkludGVnZXIpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnRJZi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3VudElmLmNzCmluZGV4IDAyZjU3YTkuLmU1ZTdmMTQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3VudElmLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3VudElmLmNzCkBAIC0xLDg0ICsxLDY2IEBACi3vu791c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiB1c2luZyBSZXF1aXJlID0gT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXMuUmVxdWlyZTsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgQ291bnRJZiA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFdpbGRDYXJkVmFsdWVNYXRjaGVyIF93aWxkQ2FyZFZhbHVlTWF0Y2hlcjsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwogCi0gICAgICAgIHB1YmxpYyBDb3VudElmKCkKLSAgICAgICAgICAgIDogdGhpcyhuZXcgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IoKSwgbmV3IFdpbGRDYXJkVmFsdWVNYXRjaGVyKCkpCi0gICAgICAgIHsKK3B1YmxpYyBjbGFzcyBDb3VudElmIDogRXhjZWxGdW5jdGlvbiB7CisgIHByaXZhdGUgcmVhZG9ubHkgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yOworICBwcml2YXRlIHJlYWRvbmx5IFdpbGRDYXJkVmFsdWVNYXRjaGVyIF93aWxkQ2FyZFZhbHVlTWF0Y2hlcjsKIAotICAgICAgICB9CisgIHB1YmxpYyBDb3VudElmKCkKKyAgICAgIDogdGhpcyhuZXcoKSwgbmV3KCkpIHt9CiAKLSAgICAgICAgcHVibGljIENvdW50SWYoTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgZXZhbHVhdG9yLCBXaWxkQ2FyZFZhbHVlTWF0Y2hlciB3aWxkQ2FyZFZhbHVlTWF0Y2hlcikKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGV2YWx1YXRvcikuTmFtZWQoImV2YWx1YXRvciIpLklzTm90TnVsbCgpOwotICAgICAgICAgICAgUmVxdWlyZS5UaGF0KHdpbGRDYXJkVmFsdWVNYXRjaGVyKS5OYW1lZCgid2lsZENhcmRWYWx1ZU1hdGNoZXIiKS5Jc05vdE51bGwoKTsKLSAgICAgICAgICAgIF9udW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvciA9IGV2YWx1YXRvcjsKLSAgICAgICAgICAgIF93aWxkQ2FyZFZhbHVlTWF0Y2hlciA9IHdpbGRDYXJkVmFsdWVNYXRjaGVyOwotICAgICAgICB9CisgIHB1YmxpYyBDb3VudElmKE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yIGV2YWx1YXRvciwgV2lsZENhcmRWYWx1ZU1hdGNoZXIgd2lsZENhcmRWYWx1ZU1hdGNoZXIpIHsKKyAgICBSZXF1aXJlLlRoYXQoZXZhbHVhdG9yKS5OYW1lZCgiZXZhbHVhdG9yIikuSXNOb3ROdWxsKCk7CisgICAgUmVxdWlyZS5UaGF0KHdpbGRDYXJkVmFsdWVNYXRjaGVyKS5OYW1lZCgid2lsZENhcmRWYWx1ZU1hdGNoZXIiKS5Jc05vdE51bGwoKTsKKyAgICBfbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgPSBldmFsdWF0b3I7CisgICAgX3dpbGRDYXJkVmFsdWVNYXRjaGVyID0gd2lsZENhcmRWYWx1ZU1hdGNoZXI7CisgIH0KIAotICAgICAgICBwcml2YXRlIGJvb2wgRXZhbHVhdGUob2JqZWN0IG9iaiwgc3RyaW5nIGV4cHJlc3Npb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZT8gY2FuZGlkYXRlID0gZGVmYXVsdChkb3VibGU/KTsKLSAgICAgICAgICAgIGlmIChJc051bWVyaWMob2JqKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYW5kaWRhdGUgPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShvYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZS5IYXNWYWx1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yLkV2YWx1YXRlKGNhbmRpZGF0ZS5WYWx1ZSwgZXhwcmVzc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBfd2lsZENhcmRWYWx1ZU1hdGNoZXIuSXNNYXRjaChleHByZXNzaW9uLCBvYmouVG9TdHJpbmcoKSkgPT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25Bcmd1bWVudHMgPSBhcmd1bWVudHMgYXMgRnVuY3Rpb25Bcmd1bWVudFtdID8/IGFyZ3VtZW50cy5Ub0FycmF5KCk7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhmdW5jdGlvbkFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgcmFuZ2UgPSBmdW5jdGlvbkFyZ3VtZW50cy5FbGVtZW50QXQoMCk7Ci0gICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBBcmdUb1N0cmluZyhmdW5jdGlvbkFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICBkb3VibGUgcmVzdWx0ID0gMGQ7Ci0gICAgICAgICAgICBpZiAocmFuZ2UuSXNFeGNlbFJhbmdlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIHJhbmdlLlZhbHVlQXNSYW5nZUluZm8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoRXZhbHVhdGUoY2VsbC5WYWx1ZSwgY3JpdGVyaWEpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHJhbmdlLlZhbHVlIGlzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhcmcgaW4gKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KSByYW5nZS5WYWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKEV2YWx1YXRlKGFyZy5WYWx1ZSwgY3JpdGVyaWEpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoRXZhbHVhdGUocmFuZ2UuVmFsdWUsIGNyaXRlcmlhKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgfQorICBwcml2YXRlIGJvb2wgRXZhbHVhdGUob2JqZWN0IG9iaiwgc3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICBkb3VibGU/IGNhbmRpZGF0ZSA9IGRlZmF1bHQoZG91YmxlPyk7CisgICAgaWYgKElzTnVtZXJpYyhvYmopKSB7CisgICAgICBjYW5kaWRhdGUgPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShvYmopOwogICAgIH0KKyAgICBpZiAoY2FuZGlkYXRlLkhhc1ZhbHVlKSB7CisgICAgICByZXR1cm4gX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yLkV2YWx1YXRlKGNhbmRpZGF0ZS5WYWx1ZSwgZXhwcmVzc2lvbik7CisgICAgfQorICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gX3dpbGRDYXJkVmFsdWVNYXRjaGVyLklzTWF0Y2goZXhwcmVzc2lvbiwgb2JqLlRvU3RyaW5nKCkpID09IDA7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHZhciBmdW5jdGlvbkFyZ3VtZW50cyA9IGFyZ3VtZW50cyBhcyBGdW5jdGlvbkFyZ3VtZW50W10gPz8gYXJndW1lbnRzLlRvQXJyYXkoKTsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhmdW5jdGlvbkFyZ3VtZW50cywgMik7CisgICAgdmFyIHJhbmdlID0gZnVuY3Rpb25Bcmd1bWVudHMuRWxlbWVudEF0KDApOworICAgIHZhciBjcml0ZXJpYSA9IEFyZ1RvU3RyaW5nKGZ1bmN0aW9uQXJndW1lbnRzLCAxKTsKKyAgICBkb3VibGUgcmVzdWx0ID0gMGQ7CisgICAgaWYgKHJhbmdlLklzRXhjZWxSYW5nZSkgeworICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gcmFuZ2UuVmFsdWVBc1JhbmdlSW5mbykgeworICAgICAgICBpZiAoRXZhbHVhdGUoY2VsbC5WYWx1ZSwgY3JpdGVyaWEpKSB7CisgICAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJhbmdlLlZhbHVlIGlzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KSB7CisgICAgICBmb3JlYWNoICh2YXIgYXJnIGluIChJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PilyYW5nZS5WYWx1ZSkgeworICAgICAgICBpZiAoRXZhbHVhdGUoYXJnLlZhbHVlLCBjcml0ZXJpYSkpIHsKKyAgICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoRXZhbHVhdGUocmFuZ2UuVmFsdWUsIGNyaXRlcmlhKSkgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkludGVnZXIpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnRJZnMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvQ291bnRJZnMuY3MKaW5kZXggMzRlNzUyNi4uZTRiNzQxOCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0NvdW50SWZzLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Db3VudElmcy5jcwpAQCAtNyw2MyArNyw1NiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTAxLTExCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbC5YUGF0aDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKLXVzaW5nIFJlcXVpcmUgPSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllcy5SZXF1aXJlOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBDb3VudElmcyA6IE11bHRpcGxlUmFuZ2VDcml0ZXJpYXNGdW5jdGlvbgotICAgIHsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25Bcmd1bWVudHMgPSBhcmd1bWVudHMgYXMgRnVuY3Rpb25Bcmd1bWVudFtdID8/IGFyZ3VtZW50cy5Ub0FycmF5KCk7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhmdW5jdGlvbkFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgYXJnUmFuZ2VzID0gbmV3IExpc3Q8RXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbz4oKTsKLSAgICAgICAgICAgIHZhciBjcml0ZXJpYXMgPSBuZXcgTGlzdDxvYmplY3Q+KCk7Ci0gICAgICAgICAgICBmb3IgKHZhciBpeCA9IDA7IGl4IDwgMzA7IGl4ICs9MikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25Bcmd1bWVudHMuTGVuZ3RoIDw9IGl4KSBicmVhazsKLSAgICAgICAgICAgICAgICB2YXIgcmFuZ2VJbmZvID0gZnVuY3Rpb25Bcmd1bWVudHNbaXhdLlZhbHVlQXNSYW5nZUluZm87Ci0gICAgICAgICAgICAgICAgYXJnUmFuZ2VzLkFkZChyYW5nZUluZm8pOwotICAgICAgICAgICAgICAgIGlmIChpeCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IHJhbmdlSW5mby5HZXROQ2VsbHMoKSAhPSBhcmdSYW5nZXNbMF0uR2V0TkNlbGxzKCksIGVFcnJvclR5cGUuVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjcml0ZXJpYXMuQWRkKGZ1bmN0aW9uQXJndW1lbnRzW2l4KzFdLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElFbnVtZXJhYmxlPGludD4gbWF0Y2hJbmRleGVzID0gR2V0TWF0Y2hJbmRleGVzKGFyZ1Jhbmdlc1swXSwgY3JpdGVyaWFzWzBdKTsKLSAgICAgICAgICAgIHZhciBlbnVtZXJhYmxlID0gbWF0Y2hJbmRleGVzIGFzIElMaXN0PGludD4gPz8gbWF0Y2hJbmRleGVzLlRvTGlzdCgpOwotICAgICAgICAgICAgZm9yICh2YXIgaXggPSAxOyBpeCA8IGFyZ1Jhbmdlcy5Db3VudCAmJiBlbnVtZXJhYmxlLkFueSgpOyBpeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBpbmRleGVzID0gR2V0TWF0Y2hJbmRleGVzKGFyZ1Jhbmdlc1tpeF0sIGNyaXRlcmlhc1tpeF0pOwotICAgICAgICAgICAgICAgIG1hdGNoSW5kZXhlcyA9IGVudW1lcmFibGUuSW50ZXJzZWN0KGluZGV4ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KChkb3VibGUpbWF0Y2hJbmRleGVzLkNvdW50KCksIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgQ291bnRJZnMgOiBNdWx0aXBsZVJhbmdlQ3JpdGVyaWFzRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHZhciBmdW5jdGlvbkFyZ3VtZW50cyA9IGFyZ3VtZW50cyBhcyBGdW5jdGlvbkFyZ3VtZW50W10gPz8gYXJndW1lbnRzLlRvQXJyYXkoKTsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhmdW5jdGlvbkFyZ3VtZW50cywgMik7CisgICAgdmFyIGFyZ1JhbmdlcyA9IG5ldyBMaXN0PEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8+KCk7CisgICAgdmFyIGNyaXRlcmlhcyA9IG5ldyBMaXN0PG9iamVjdD4oKTsKKyAgICBmb3IgKHZhciBpeCA9IDA7IGl4IDwgMzA7IGl4ICs9IDIpIHsKKyAgICAgIGlmIChmdW5jdGlvbkFyZ3VtZW50cy5MZW5ndGggPD0gaXgpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICB2YXIgcmFuZ2VJbmZvID0gZnVuY3Rpb25Bcmd1bWVudHNbaXhdLlZhbHVlQXNSYW5nZUluZm87CisgICAgICBhcmdSYW5nZXMuQWRkKHJhbmdlSW5mbyk7CisgICAgICBpZiAoaXggPiAwKSB7CisgICAgICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uSWYoCisgICAgICAgICAgICAoKSA9PiByYW5nZUluZm8uR2V0TkNlbGxzKCkgIT0gYXJnUmFuZ2VzWzBdLkdldE5DZWxscygpLAorICAgICAgICAgICAgZUVycm9yVHlwZS5WYWx1ZSk7CisgICAgICB9CisgICAgICBjcml0ZXJpYXMuQWRkKGZ1bmN0aW9uQXJndW1lbnRzW2l4ICsgMV0uVmFsdWUpOwogICAgIH0KKyAgICBJRW51bWVyYWJsZTxpbnQ+IG1hdGNoSW5kZXhlcyA9IEdldE1hdGNoSW5kZXhlcyhhcmdSYW5nZXNbMF0sIGNyaXRlcmlhc1swXSk7CisgICAgdmFyIGVudW1lcmFibGUgPSBtYXRjaEluZGV4ZXMgYXMgSUxpc3Q8aW50PiA/PyBtYXRjaEluZGV4ZXMuVG9MaXN0KCk7CisgICAgZm9yICh2YXIgaXggPSAxOyBpeCA8IGFyZ1Jhbmdlcy5Db3VudCAmJiBlbnVtZXJhYmxlLkFueSgpOyBpeCsrKSB7CisgICAgICB2YXIgaW5kZXhlcyA9IEdldE1hdGNoSW5kZXhlcyhhcmdSYW5nZXNbaXhdLCBjcml0ZXJpYXNbaXhdKTsKKyAgICAgIG1hdGNoSW5kZXhlcyA9IGVudW1lcmFibGUuSW50ZXJzZWN0KGluZGV4ZXMpOworICAgIH0KKworICAgIHJldHVybiBDcmVhdGVSZXN1bHQoKGRvdWJsZSltYXRjaEluZGV4ZXMuQ291bnQoKSwgRGF0YVR5cGUuSW50ZWdlcik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9EZWdyZWVzLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0RlZ3JlZXMuY3MKaW5kZXggODVkMjk3OS4uN2ZhYWU5NyAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0RlZ3JlZXMuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0RlZ3JlZXMuY3MKQEAgLTEsMTkgKzEsMTUgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK++7v3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIERlZ3JlZXMgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBhbmdsZSA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IChhbmdsZSoxODApL1N5c3RlbS5NYXRoLlBJOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CisKK3B1YmxpYyBjbGFzcyBEZWdyZWVzIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgYW5nbGUgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICB2YXIgcmVzdWx0ID0gKGFuZ2xlICogMTgwKSAvIFN5c3RlbS5NYXRoLlBJOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0V4cC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9FeHAuY3MKaW5kZXggODQzYjE3OS4uZGU4ODMwNSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0V4cC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvRXhwLmNzCkBAIC03LDM2ICs3LDMzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXhwIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgbnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkV4cChudW1iZXIpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgRXhwIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgbnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5FeHAobnVtYmVyKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9GYWN0LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0ZhY3QuY3MKaW5kZXggZGE1NDMwMS4uMmJiMjRmNSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0ZhY3QuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0ZhY3QuY3MKQEAgLTEsMjQgKzEsMTkgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK++7v3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIEZhY3QgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBudW1iZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uSWYoKCkgPT4gbnVtYmVyIDwgMCwgZUVycm9yVHlwZS5OQSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gMWQ7Ci0gICAgICAgICAgICBmb3IgKHZhciB4ID0gMTsgeCA8IG51bWJlcjsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCAqPSB4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKKworcHVibGljIGNsYXNzIEZhY3QgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBudW1iZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IG51bWJlciA8IDAsIGVFcnJvclR5cGUuTmEpOworICAgIHZhciByZXN1bHQgPSAxZDsKKyAgICBmb3IgKHZhciB4ID0gMTsgeCA8IG51bWJlcjsgeCsrKSB7CisgICAgICByZXN1bHQgKj0geDsKICAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkludGVnZXIpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvRmxvb3IuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvRmxvb3IuY3MKaW5kZXggMjlkNTdjNy4uY2FhNDNjNSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0Zsb29yLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9GbG9vci5jcwpAQCAtNyw3MCArNyw1OSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIEZsb29yIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgbnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICB2YXIgc2lnbmlmaWNhbmNlID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICBWYWxpZGF0ZU51bWJlckFuZFNpZ24obnVtYmVyLCBzaWduaWZpY2FuY2UpOwotICAgICAgICAgICAgaWYgKHNpZ25pZmljYW5jZSA8IDEgJiYgc2lnbmlmaWNhbmNlID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZmxvb3IgPSBTeXN0ZW0uTWF0aC5GbG9vcihudW1iZXIpOwotICAgICAgICAgICAgICAgIHZhciByZXN0ID0gbnVtYmVyIC0gZmxvb3I7Ci0gICAgICAgICAgICAgICAgdmFyIG5TaWduID0gKGludCkocmVzdCAvIHNpZ25pZmljYW5jZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChmbG9vciArIChuU2lnbiAqIHNpZ25pZmljYW5jZSksIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc2lnbmlmaWNhbmNlID09IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5GbG9vcihudW1iZXIpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgcmVzdWx0OwotICAgICAgICAgICAgICAgIGlmIChudW1iZXIgPiAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbnVtYmVyIC0gKG51bWJlciAlIHNpZ25pZmljYW5jZSkgKyBzaWduaWZpY2FuY2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bWJlciAtIChudW1iZXIgJSBzaWduaWZpY2FuY2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwogCi0gICAgICAgIHByaXZhdGUgdm9pZCBWYWxpZGF0ZU51bWJlckFuZFNpZ24oZG91YmxlIG51bWJlciwgZG91YmxlIHNpZ24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChudW1iZXIgPiAwZCAmJiBzaWduIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgdmFsdWVzID0gc3RyaW5nLkZvcm1hdCgibnVtOiB7MH0sIHNpZ246IHsxfSIsIG51bWJlciwgc2lnbik7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkZsb29yIGNhbm5vdCBoYW5kbGUgYSBuZWdhdGl2ZSBzaWduaWZpY2FuY2Ugd2hlbiB0aGUgbnVtYmVyIGlzIHBvc2l0aXZlIiArIHZhbHVlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBGbG9vciA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgIHZhciBzaWduaWZpY2FuY2UgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAxKTsKKyAgICBWYWxpZGF0ZU51bWJlckFuZFNpZ24obnVtYmVyLCBzaWduaWZpY2FuY2UpOworICAgIGlmIChzaWduaWZpY2FuY2UgPCAxICYmIHNpZ25pZmljYW5jZSA+IDApIHsKKyAgICAgIHZhciBmbG9vciA9IFN5c3RlbS5NYXRoLkZsb29yKG51bWJlcik7CisgICAgICB2YXIgcmVzdCA9IG51bWJlciAtIGZsb29yOworICAgICAgdmFyIG5TaWduID0gKGludCkocmVzdCAvIHNpZ25pZmljYW5jZSk7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGZsb29yICsgKG5TaWduICogc2lnbmlmaWNhbmNlKSwgRGF0YVR5cGUuRGVjaW1hbCk7CiAgICAgfQorICAgIGlmIChzaWduaWZpY2FuY2UgPT0gMSkgeworICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5GbG9vcihudW1iZXIpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICB9CisgICAgZG91YmxlIHJlc3VsdDsKKyAgICBpZiAobnVtYmVyID4gMSkgeworICAgICAgcmVzdWx0ID0gbnVtYmVyIC0gKG51bWJlciAlIHNpZ25pZmljYW5jZSkgKyBzaWduaWZpY2FuY2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdCA9IG51bWJlciAtIChudW1iZXIgJSBzaWduaWZpY2FuY2UpOworICAgIH0KKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgVmFsaWRhdGVOdW1iZXJBbmRTaWduKGRvdWJsZSBudW1iZXIsIGRvdWJsZSBzaWduKSB7CisgICAgaWYgKG51bWJlciA+IDBkICYmIHNpZ24gPCAwKSB7CisgICAgICB2YXIgdmFsdWVzID0gc3RyaW5nLkZvcm1hdCgibnVtOiB7MH0sIHNpZ246IHsxfSIsIG51bWJlciwgc2lnbik7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAiRmxvb3IgY2Fubm90IGhhbmRsZSBhIG5lZ2F0aXZlIHNpZ25pZmljYW5jZSB3aGVuIHRoZSBudW1iZXIgaXMgcG9zaXRpdmUiICsgdmFsdWVzKTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9MYXJnZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9MYXJnZS5jcwppbmRleCBhZGY0ZmU0Li4wMjVjNDdmIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTGFyZ2UuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0xhcmdlLmNzCkBAIC0xLDIyICsxLDE5IEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK++7v3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBMYXJnZSA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApOwotICAgICAgICAgICAgdmFyIGluZGV4ID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKSAtIDE7Ci0gICAgICAgICAgICB2YXIgdmFsdWVzID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZShuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PiB7YXJnc30sIGNvbnRleHQpOwotICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiBpbmRleCA8IDAgfHwgaW5kZXggPj0gdmFsdWVzLkNvdW50KCksIGVFcnJvclR5cGUuTnVtKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSB2YWx1ZXMuT3JkZXJCeURlc2NlbmRpbmcoeCA9PiB4KS5FbGVtZW50QXQoaW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CisKK3B1YmxpYyBjbGFzcyBMYXJnZSA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApOworICAgIHZhciBpbmRleCA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSkgLSAxOworICAgIHZhciB2YWx1ZXMgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+IHsgYXJncyB9LCBjb250ZXh0KTsKKyAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IGluZGV4IDwgMCB8fCBpbmRleCA+PSB2YWx1ZXMuQ291bnQoKSwgZUVycm9yVHlwZS5OdW0pOworICAgIHZhciByZXN1bHQgPSB2YWx1ZXMuT3JkZXJCeURlc2NlbmRpbmcoeCA9PiB4KS5FbGVtZW50QXQoaW5kZXgpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0xuLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0xuLmNzCmluZGV4IDU3NjllZWMuLmU5MzE0N2YgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Mbi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTG4uY3MKQEAgLTEsMTggKzEsMTQgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK++7v3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIExuIDogRXhjZWxGdW5jdGlvbgotewotICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgIHsKLSAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgdmFyIGFyZyA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkxvZyhhcmcsIFN5c3RlbS5NYXRoLkUpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICB9Ci19CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKKworcHVibGljIGNsYXNzIExuIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5Mb2coYXJnLCBTeXN0ZW0uTWF0aC5FKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Mb2cuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTG9nLmNzCmluZGV4IDUzYjAwMDcuLmMzNDhlY2YgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Mb2cuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0xvZy5jcwpAQCAtNyw0MSArNywzOCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIExvZyA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID09IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5Mb2cobnVtYmVyLCAxMGQpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBuZXdCYXNlID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkxvZyhudW1iZXIsIG5ld0Jhc2UpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CisKK3B1YmxpYyBjbGFzcyBMb2cgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBudW1iZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPT0gMSkgeworICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5Mb2cobnVtYmVyLCAxMGQpLCBEYXRhVHlwZS5EZWNpbWFsKTsKICAgICB9CisgICAgdmFyIG5ld0Jhc2UgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAxKTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkxvZyhudW1iZXIsIG5ld0Jhc2UpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0xvZzEwLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL0xvZzEwLmNzCmluZGV4IDI4YzhlYjMuLmM5Zjk0MzEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Mb2cxMC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTG9nMTAuY3MKQEAgLTcsMzYgKzcsMzMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBMb2cxMCA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5Mb2cxMChudW1iZXIpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgTG9nMTAgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBudW1iZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLkxvZzEwKG51bWJlciksIERhdGFUeXBlLkRlY2ltYWwpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTWF0aEhlbHBlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NYXRoSGVscGVyLmNzCmluZGV4IGU0ZTgxM2EuLjZiOTE2M2EgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NYXRoSGVscGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NYXRoSGVscGVyLmNzCkBAIC03LDE1OSArNywxMzIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wMS0xMQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CisKIHVzaW5nIE1hdGhPYmogPSBTeXN0ZW0uTWF0aDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoYW5rcyB0byB0aGUgZ3V5cyBpbiB0aGlzIHRocmVhZDogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yODQwNzk4L2Mtc2hhcnAtbWF0aC1jbGFzcy1xdWVzdGlvbgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXRoSGVscGVyCi0gICAgewotICAgICAgICAvLyBTZWNhbnQgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIFNlYyhkb3VibGUgeCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDEgLyBNYXRoT2JqLkNvcyh4KTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CiAKLSAgICAgICAgLy8gQ29zZWNhbnQKLSAgICAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgQ29zZWMoZG91YmxlIHgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAxIC8gTWF0aE9iai5TaW4oeCk7Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBUaGFua3MgdG8gdGhlIGd1eXMgaW4gdGhpcyB0aHJlYWQ6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjg0MDc5OC9jLXNoYXJwLW1hdGgtY2xhc3MtcXVlc3Rpb24KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgc3RhdGljIGNsYXNzIE1hdGhIZWxwZXIgeworICAvLyBTZWNhbnQKKyAgcHVibGljIHN0YXRpYyBkb3VibGUgU2VjKGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIDEgLyBNYXRoT2JqLkNvcyh4KTsKKyAgfQogCi0gICAgICAgIC8vIENvdGFuZ2VudCAKLSAgICAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgQ290YW4oZG91YmxlIHgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAxIC8gTWF0aE9iai5UYW4oeCk7Ci0gICAgICAgIH0KKyAgLy8gQ29zZWNhbnQKKyAgcHVibGljIHN0YXRpYyBkb3VibGUgQ29zZWMoZG91YmxlIHgpIHsKKyAgICByZXR1cm4gMSAvIE1hdGhPYmouU2luKHgpOworICB9CiAKLSAgICAgICAgLy8gSW52ZXJzZSBTaW5lIAotICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBBcmNzaW4oZG91YmxlIHgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNYXRoT2JqLkF0YW4oeCAvIE1hdGhPYmouU3FydCgteCAqIHggKyAxKSk7Ci0gICAgICAgIH0KKyAgLy8gQ290YW5nZW50CisgIHB1YmxpYyBzdGF0aWMgZG91YmxlIENvdGFuKGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIDEgLyBNYXRoT2JqLlRhbih4KTsKKyAgfQogCi0gICAgICAgIC8vIEludmVyc2UgQ29zaW5lIAotICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBBcmNjb3MoZG91YmxlIHgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNYXRoT2JqLkF0YW4oLXggLyBNYXRoT2JqLlNxcnQoLXggKiB4ICsgMSkpICsgMiAqIE1hdGhPYmouQXRhbigxKTsKLSAgICAgICAgfQorICAvLyBJbnZlcnNlIFNpbmUKKyAgcHVibGljIHN0YXRpYyBkb3VibGUgQXJjc2luKGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIE1hdGhPYmouQXRhbih4IC8gTWF0aE9iai5TcXJ0KC14ICogeCArIDEpKTsKKyAgfQogCisgIC8vIEludmVyc2UgQ29zaW5lCisgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEFyY2Nvcyhkb3VibGUgeCkgeworICAgIHJldHVybiBNYXRoT2JqLkF0YW4oLXggLyBNYXRoT2JqLlNxcnQoLXggKiB4ICsgMSkpICsgMiAqIE1hdGhPYmouQXRhbigxKTsKKyAgfQogCi0gICAgICAgIC8vIEludmVyc2UgU2VjYW50IAotICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBBcmNzZWMoZG91YmxlIHgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAyICogTWF0aE9iai5BdGFuKDEpIC0gTWF0aE9iai5BdGFuKE1hdGhPYmouU2lnbih4KSAvIE1hdGhPYmouU3FydCh4ICogeCAtIDEpKTsKLSAgICAgICAgfQorICAvLyBJbnZlcnNlIFNlY2FudAorICBwdWJsaWMgc3RhdGljIGRvdWJsZSBBcmNzZWMoZG91YmxlIHgpIHsKKyAgICByZXR1cm4gMiAqIE1hdGhPYmouQXRhbigxKSAtIE1hdGhPYmouQXRhbihNYXRoT2JqLlNpZ24oeCkgLyBNYXRoT2JqLlNxcnQoeCAqIHggLSAxKSk7CisgIH0KIAotICAgICAgICAvLyBJbnZlcnNlIENvc2VjYW50IAotICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBBcmNjb3NlYyhkb3VibGUgeCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE1hdGhPYmouQXRhbihNYXRoT2JqLlNpZ24oeCkgLyBNYXRoT2JqLlNxcnQoeCAqIHggLSAxKSk7Ci0gICAgICAgIH0KKyAgLy8gSW52ZXJzZSBDb3NlY2FudAorICBwdWJsaWMgc3RhdGljIGRvdWJsZSBBcmNjb3NlYyhkb3VibGUgeCkgeworICAgIHJldHVybiBNYXRoT2JqLkF0YW4oTWF0aE9iai5TaWduKHgpIC8gTWF0aE9iai5TcXJ0KHggKiB4IC0gMSkpOworICB9CiAKLSAgICAgICAgLy8gSW52ZXJzZSBDb3RhbmdlbnQgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEFyY2NvdGFuKGRvdWJsZSB4KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMiAqIE1hdGhPYmouQXRhbigxKSAtIE1hdGhPYmouQXRhbih4KTsKLSAgICAgICAgfQorICAvLyBJbnZlcnNlIENvdGFuZ2VudAorICBwdWJsaWMgc3RhdGljIGRvdWJsZSBBcmNjb3Rhbihkb3VibGUgeCkgeworICAgIHJldHVybiAyICogTWF0aE9iai5BdGFuKDEpIC0gTWF0aE9iai5BdGFuKHgpOworICB9CiAKLSAgICAgICAgLy8gSHlwZXJib2xpYyBTaW5lIAotICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIU2luKGRvdWJsZSB4KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKE1hdGhPYmouRXhwKHgpIC0gTWF0aE9iai5FeHAoLXgpKSAvIDI7Ci0gICAgICAgIH0KKyAgLy8gSHlwZXJib2xpYyBTaW5lCisgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEhTaW4oZG91YmxlIHgpIHsKKyAgICByZXR1cm4gKE1hdGhPYmouRXhwKHgpIC0gTWF0aE9iai5FeHAoLXgpKSAvIDI7CisgIH0KIAotICAgICAgICAvLyBIeXBlcmJvbGljIENvc2luZSAKLSAgICAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgSENvcyhkb3VibGUgeCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChNYXRoT2JqLkV4cCh4KSArIE1hdGhPYmouRXhwKC14KSkgLyAyOwotICAgICAgICB9CisgIC8vIEh5cGVyYm9saWMgQ29zaW5lCisgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEhDb3MoZG91YmxlIHgpIHsKKyAgICByZXR1cm4gKE1hdGhPYmouRXhwKHgpICsgTWF0aE9iai5FeHAoLXgpKSAvIDI7CisgIH0KIAotICAgICAgICAvLyBIeXBlcmJvbGljIFRhbmdlbnQgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEhUYW4oZG91YmxlIHgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoTWF0aE9iai5FeHAoeCkgLSBNYXRoT2JqLkV4cCgteCkpIC8gKE1hdGhPYmouRXhwKHgpICsgTWF0aE9iai5FeHAoLXgpKTsKLSAgICAgICAgfQorICAvLyBIeXBlcmJvbGljIFRhbmdlbnQKKyAgcHVibGljIHN0YXRpYyBkb3VibGUgSFRhbihkb3VibGUgeCkgeworICAgIHJldHVybiAoTWF0aE9iai5FeHAoeCkgLSBNYXRoT2JqLkV4cCgteCkpIC8gKE1hdGhPYmouRXhwKHgpICsgTWF0aE9iai5FeHAoLXgpKTsKKyAgfQogCi0gICAgICAgIC8vIEh5cGVyYm9saWMgU2VjYW50IAotICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIU2VjKGRvdWJsZSB4KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMiAvIChNYXRoT2JqLkV4cCh4KSArIE1hdGhPYmouRXhwKC14KSk7Ci0gICAgICAgIH0KKyAgLy8gSHlwZXJib2xpYyBTZWNhbnQKKyAgcHVibGljIHN0YXRpYyBkb3VibGUgSFNlYyhkb3VibGUgeCkgeworICAgIHJldHVybiAyIC8gKE1hdGhPYmouRXhwKHgpICsgTWF0aE9iai5FeHAoLXgpKTsKKyAgfQogCi0gICAgICAgIC8vIEh5cGVyYm9saWMgQ29zZWNhbnQgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEhDb3NlYyhkb3VibGUgeCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDIgLyAoTWF0aE9iai5FeHAoeCkgLSBNYXRoT2JqLkV4cCgteCkpOwotICAgICAgICB9CisgIC8vIEh5cGVyYm9saWMgQ29zZWNhbnQKKyAgcHVibGljIHN0YXRpYyBkb3VibGUgSENvc2VjKGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIDIgLyAoTWF0aE9iai5FeHAoeCkgLSBNYXRoT2JqLkV4cCgteCkpOworICB9CiAKLSAgICAgICAgLy8gSHlwZXJib2xpYyBDb3RhbmdlbnQgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEhDb3Rhbihkb3VibGUgeCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChNYXRoT2JqLkV4cCh4KSArIE1hdGhPYmouRXhwKC14KSkgLyAoTWF0aE9iai5FeHAoeCkgLSBNYXRoT2JqLkV4cCgteCkpOwotICAgICAgICB9CisgIC8vIEh5cGVyYm9saWMgQ290YW5nZW50CisgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEhDb3Rhbihkb3VibGUgeCkgeworICAgIHJldHVybiAoTWF0aE9iai5FeHAoeCkgKyBNYXRoT2JqLkV4cCgteCkpIC8gKE1hdGhPYmouRXhwKHgpIC0gTWF0aE9iai5FeHAoLXgpKTsKKyAgfQogCi0gICAgICAgIC8vIEludmVyc2UgSHlwZXJib2xpYyBTaW5lIAotICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQXJjc2luKGRvdWJsZSB4KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTWF0aE9iai5Mb2coeCArIE1hdGhPYmouU3FydCh4ICogeCArIDEpKTsKLSAgICAgICAgfQorICAvLyBJbnZlcnNlIEh5cGVyYm9saWMgU2luZQorICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQXJjc2luKGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIE1hdGhPYmouTG9nKHggKyBNYXRoT2JqLlNxcnQoeCAqIHggKyAxKSk7CisgIH0KIAotICAgICAgICAvLyBJbnZlcnNlIEh5cGVyYm9saWMgQ29zaW5lIAotICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQXJjY29zKGRvdWJsZSB4KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTWF0aE9iai5Mb2coeCArIE1hdGhPYmouU3FydCh4ICogeCAtIDEpKTsKLSAgICAgICAgfQorICAvLyBJbnZlcnNlIEh5cGVyYm9saWMgQ29zaW5lCisgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEhBcmNjb3MoZG91YmxlIHgpIHsKKyAgICByZXR1cm4gTWF0aE9iai5Mb2coeCArIE1hdGhPYmouU3FydCh4ICogeCAtIDEpKTsKKyAgfQogCi0gICAgICAgIC8vIEludmVyc2UgSHlwZXJib2xpYyBUYW5nZW50IAotICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQXJjdGFuKGRvdWJsZSB4KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTWF0aE9iai5Mb2coKDEgKyB4KSAvICgxIC0geCkpIC8gMjsKLSAgICAgICAgfQorICAvLyBJbnZlcnNlIEh5cGVyYm9saWMgVGFuZ2VudAorICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQXJjdGFuKGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIE1hdGhPYmouTG9nKCgxICsgeCkgLyAoMSAtIHgpKSAvIDI7CisgIH0KIAotICAgICAgICAvLyBJbnZlcnNlIEh5cGVyYm9saWMgU2VjYW50IAotICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQXJjc2VjKGRvdWJsZSB4KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTWF0aE9iai5Mb2coKE1hdGhPYmouU3FydCgteCAqIHggKyAxKSArIDEpIC8geCk7Ci0gICAgICAgIH0KKyAgLy8gSW52ZXJzZSBIeXBlcmJvbGljIFNlY2FudAorICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQXJjc2VjKGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIE1hdGhPYmouTG9nKChNYXRoT2JqLlNxcnQoLXggKiB4ICsgMSkgKyAxKSAvIHgpOworICB9CiAKLSAgICAgICAgLy8gSW52ZXJzZSBIeXBlcmJvbGljIENvc2VjYW50IAotICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQXJjY29zZWMoZG91YmxlIHgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBNYXRoT2JqLkxvZygoTWF0aE9iai5TaWduKHgpICogTWF0aE9iai5TcXJ0KHggKiB4ICsgMSkgKyAxKSAvIHgpOwotICAgICAgICB9CisgIC8vIEludmVyc2UgSHlwZXJib2xpYyBDb3NlY2FudAorICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQXJjY29zZWMoZG91YmxlIHgpIHsKKyAgICByZXR1cm4gTWF0aE9iai5Mb2coKE1hdGhPYmouU2lnbih4KSAqIE1hdGhPYmouU3FydCh4ICogeCArIDEpICsgMSkgLyB4KTsKKyAgfQogCi0gICAgICAgIC8vIEludmVyc2UgSHlwZXJib2xpYyBDb3RhbmdlbnQgCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIEhBcmNjb3Rhbihkb3VibGUgeCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIE1hdGhPYmouTG9nKCh4ICsgMSkgLyAoeCAtIDEpKSAvIDI7Ci0gICAgICAgIH0KKyAgLy8gSW52ZXJzZSBIeXBlcmJvbGljIENvdGFuZ2VudAorICBwdWJsaWMgc3RhdGljIGRvdWJsZSBIQXJjY290YW4oZG91YmxlIHgpIHsKKyAgICByZXR1cm4gTWF0aE9iai5Mb2coKHggKyAxKSAvICh4IC0gMSkpIC8gMjsKKyAgfQogCi0gICAgICAgIC8vIExvZ2FyaXRobSB0byBiYXNlIE4gCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIExvZ04oZG91YmxlIHgsIGRvdWJsZSBuKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTWF0aE9iai5Mb2coeCkgLyBNYXRoT2JqLkxvZyhuKTsKLSAgICAgICAgfQotICAgIH0KKyAgLy8gTG9nYXJpdGhtIHRvIGJhc2UgTgorICBwdWJsaWMgc3RhdGljIGRvdWJsZSBMb2dOKGRvdWJsZSB4LCBkb3VibGUgbikgeworICAgIHJldHVybiBNYXRoT2JqLkxvZyh4KSAvIE1hdGhPYmouTG9nKG4pOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTWF4LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01heC5jcwppbmRleCA2ODljNmViLi5jNmRkZjhmIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTWF4LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NYXguY3MKQEAgLTcsMzYgKzcsMzQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBNYXggOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKElnbm9yZUhpZGRlblZhbHVlcywgZmFsc2UsIGFyZ3VtZW50cywgY29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbHVlcy5NYXgoKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKKworcHVibGljIGNsYXNzIE1heCA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIHZhbHVlcyA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoSWdub3JlSGlkZGVuVmFsdWVzLCBmYWxzZSwgYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbHVlcy5NYXgoKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NYXhhLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01heGEuY3MKaW5kZXggY2QxOTY2NC4uMWVmNDkxYSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01heGEuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01heGEuY3MKQEAgLTcsNDkgKzcsNDUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIE1heGEgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIgX2FyZ0NvbnZlcnRlcjsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwogCi0gICAgICAgIHB1YmxpYyBNYXhhKCkKLSAgICAgICAgICAgIDogdGhpcyhuZXcgRG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlcigpKQotICAgICAgICB7CitwdWJsaWMgY2xhc3MgTWF4YSA6IEV4Y2VsRnVuY3Rpb24geworICBwcml2YXRlIHJlYWRvbmx5IERvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIgX2FyZ0NvbnZlcnRlcjsKIAotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBNYXhhKERvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIgYXJnQ29udmVydGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQoYXJnQ29udmVydGVyKS5OYW1lZCgiYXJnQ29udmVydGVyIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICBfYXJnQ29udmVydGVyID0gYXJnQ29udmVydGVyOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIHZhbHVlcyA9IF9hcmdDb252ZXJ0ZXIuQ29udmVydEFyZ3NJbmNsdWRpbmdPdGhlclR5cGVzKGFyZ3VtZW50cyk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbHVlcy5NYXgoKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KLSAgICB9CisgIHB1YmxpYyBNYXhhKCkKKyAgICAgIDogdGhpcyhuZXcoKSkge30KKworICBwdWJsaWMgTWF4YShEb3VibGVFbnVtZXJhYmxlQXJnQ29udmVydGVyIGFyZ0NvbnZlcnRlcikgeworICAgIFJlcXVpcmUuVGhhdChhcmdDb252ZXJ0ZXIpLk5hbWVkKCJhcmdDb252ZXJ0ZXIiKS5Jc05vdE51bGwoKTsKKyAgICBfYXJnQ29udmVydGVyID0gYXJnQ29udmVydGVyOworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciB2YWx1ZXMgPSBfYXJnQ29udmVydGVyLkNvbnZlcnRBcmdzSW5jbHVkaW5nT3RoZXJUeXBlcyhhcmd1bWVudHMpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQodmFsdWVzLk1heCgpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01lZGlhbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NZWRpYW4uY3MKaW5kZXggODBjZDUwMy4uNmVkYzAyMCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01lZGlhbi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTWVkaWFuLmNzCkBAIC03LDQ4ICs3LDQ0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBNZWRpYW4gOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG51bXMgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKGFyZ3VtZW50cywgY29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgYXJyID0gbnVtcy5Ub0FycmF5KCk7Ci0gICAgICAgICAgICBBcnJheS5Tb3J0KGFycik7Ci0gICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IGFyci5MZW5ndGggPT0gMCwgZUVycm9yVHlwZS5OdW0pOwotICAgICAgICAgICAgZG91YmxlIHJlc3VsdDsKLSAgICAgICAgICAgIGlmIChhcnIuTGVuZ3RoICUgMiA9PSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFyclthcnIuTGVuZ3RoIC8gMl07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSBhcnIuTGVuZ3RoLzIgLSAxOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IChhcnJbc3RhcnRJbmRleF0gKyBhcnJbc3RhcnRJbmRleCArIDFdKS8yZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CisKK3B1YmxpYyBjbGFzcyBNZWRpYW4gOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICB2YXIgbnVtcyA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICB2YXIgYXJyID0gbnVtcy5Ub0FycmF5KCk7CisgICAgQXJyYXkuU29ydChhcnIpOworICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uSWYoKCkgPT4gYXJyLkxlbmd0aCA9PSAwLCBlRXJyb3JUeXBlLk51bSk7CisgICAgZG91YmxlIHJlc3VsdDsKKyAgICBpZiAoYXJyLkxlbmd0aCAlIDIgPT0gMSkgeworICAgICAgcmVzdWx0ID0gYXJyW2Fyci5MZW5ndGggLyAyXTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIHN0YXJ0SW5kZXggPSBhcnIuTGVuZ3RoIC8gMiAtIDE7CisgICAgICByZXN1bHQgPSAoYXJyW3N0YXJ0SW5kZXhdICsgYXJyW3N0YXJ0SW5kZXggKyAxXSkgLyAyZDsKICAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTWluLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01pbi5jcwppbmRleCBlZGQ2MjFmLi5mMmI1ZmRmIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTWluLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NaW4uY3MKQEAgLTcsMzYgKzcsMzQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBNaW4gOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKElnbm9yZUhpZGRlblZhbHVlcywgZmFsc2UsIGFyZ3VtZW50cywgY29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbHVlcy5NaW4oKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKKworcHVibGljIGNsYXNzIE1pbiA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIHZhbHVlcyA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoSWdub3JlSGlkZGVuVmFsdWVzLCBmYWxzZSwgYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbHVlcy5NaW4oKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NaW5hLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01pbmEuY3MKaW5kZXggNjVlYmM4Ny4uYTkzNDI0ZiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01pbmEuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01pbmEuY3MKQEAgLTcsNDkgKzcsNDUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIE1pbmEgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIgX2FyZ0NvbnZlcnRlcjsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwogCi0gICAgICAgIHB1YmxpYyBNaW5hKCkKLSAgICAgICAgICAgIDogdGhpcyhuZXcgRG91YmxlRW51bWVyYWJsZUFyZ0NvbnZlcnRlcigpKQotICAgICAgICB7CitwdWJsaWMgY2xhc3MgTWluYSA6IEV4Y2VsRnVuY3Rpb24geworICBwcml2YXRlIHJlYWRvbmx5IERvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIgX2FyZ0NvbnZlcnRlcjsKIAotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBNaW5hKERvdWJsZUVudW1lcmFibGVBcmdDb252ZXJ0ZXIgYXJnQ29udmVydGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQoYXJnQ29udmVydGVyKS5OYW1lZCgiYXJnQ29udmVydGVyIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICBfYXJnQ29udmVydGVyID0gYXJnQ29udmVydGVyOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIHZhbHVlcyA9IF9hcmdDb252ZXJ0ZXIuQ29udmVydEFyZ3NJbmNsdWRpbmdPdGhlclR5cGVzKGFyZ3VtZW50cyk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbHVlcy5NaW4oKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KLSAgICB9CisgIHB1YmxpYyBNaW5hKCkKKyAgICAgIDogdGhpcyhuZXcoKSkge30KKworICBwdWJsaWMgTWluYShEb3VibGVFbnVtZXJhYmxlQXJnQ29udmVydGVyIGFyZ0NvbnZlcnRlcikgeworICAgIFJlcXVpcmUuVGhhdChhcmdDb252ZXJ0ZXIpLk5hbWVkKCJhcmdDb252ZXJ0ZXIiKS5Jc05vdE51bGwoKTsKKyAgICBfYXJnQ29udmVydGVyID0gYXJnQ29udmVydGVyOworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciB2YWx1ZXMgPSBfYXJnQ29udmVydGVyLkNvbnZlcnRBcmdzSW5jbHVkaW5nT3RoZXJUeXBlcyhhcmd1bWVudHMpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQodmFsdWVzLk1pbigpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01vZC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Nb2QuY3MKaW5kZXggNDAyNWQ2Yi4uOTY4ZTFjOCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL01vZC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTW9kLmNzCkBAIC03LDM3ICs3LDM0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgTW9kIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgbjEgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHZhciBuMiA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KG4xICUgbjIsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CisKK3B1YmxpYyBjbGFzcyBNb2QgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgIHZhciBuMSA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgIHZhciBuMiA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDEpOworICAgIHJldHVybiBuZXcobjEgJSBuMiwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NdWx0aXBsZVJhbmdlQ3JpdGVyaWFzRnVuY3Rpb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvTXVsdGlwbGVSYW5nZUNyaXRlcmlhc0Z1bmN0aW9uLmNzCmluZGV4IDRmMjk0NDcuLjVlZmU2ZjAgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9NdWx0aXBsZVJhbmdlQ3JpdGVyaWFzRnVuY3Rpb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL011bHRpcGxlUmFuZ2VDcml0ZXJpYXNGdW5jdGlvbi5jcwpAQCAtNyw4NSArNyw3MiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTAxLTE1CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIHVzaW5nIFJlcXVpcmUgPSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllcy5SZXF1aXJlOwogCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTXVsdGlwbGVSYW5nZUNyaXRlcmlhc0Z1bmN0aW9uIDogRXhjZWxGdW5jdGlvbgotICAgIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNdWx0aXBsZVJhbmdlQ3JpdGVyaWFzRnVuY3Rpb24gOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHJpdmF0ZSByZWFkb25seSBOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvciBfbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3I7CisgIHByaXZhdGUgcmVhZG9ubHkgV2lsZENhcmRWYWx1ZU1hdGNoZXIgX3dpbGRDYXJkVmFsdWVNYXRjaGVyOwogCi0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgX251bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFdpbGRDYXJkVmFsdWVNYXRjaGVyIF93aWxkQ2FyZFZhbHVlTWF0Y2hlcjsKKyAgcHJvdGVjdGVkIE11bHRpcGxlUmFuZ2VDcml0ZXJpYXNGdW5jdGlvbigpCisgICAgICA6IHRoaXMobmV3KCksIG5ldygpKSB7fQogCi0gICAgICAgIHByb3RlY3RlZCBNdWx0aXBsZVJhbmdlQ3JpdGVyaWFzRnVuY3Rpb24oKQotICAgICAgICAgICAgOnRoaXMobmV3IE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yKCksIG5ldyBXaWxkQ2FyZFZhbHVlTWF0Y2hlcigpKQotICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQorICBwcm90ZWN0ZWQgTXVsdGlwbGVSYW5nZUNyaXRlcmlhc0Z1bmN0aW9uKAorICAgICAgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgZXZhbHVhdG9yLAorICAgICAgV2lsZENhcmRWYWx1ZU1hdGNoZXIgd2lsZENhcmRWYWx1ZU1hdGNoZXIpIHsKKyAgICBSZXF1aXJlLlRoYXQoZXZhbHVhdG9yKS5OYW1lZCgiZXZhbHVhdG9yIikuSXNOb3ROdWxsKCk7CisgICAgUmVxdWlyZS5UaGF0KHdpbGRDYXJkVmFsdWVNYXRjaGVyKS5OYW1lZCgid2lsZENhcmRWYWx1ZU1hdGNoZXIiKS5Jc05vdE51bGwoKTsKKyAgICBfbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgPSBldmFsdWF0b3I7CisgICAgX3dpbGRDYXJkVmFsdWVNYXRjaGVyID0gd2lsZENhcmRWYWx1ZU1hdGNoZXI7CisgIH0KIAotICAgICAgICBwcm90ZWN0ZWQgTXVsdGlwbGVSYW5nZUNyaXRlcmlhc0Z1bmN0aW9uKE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yIGV2YWx1YXRvciwgV2lsZENhcmRWYWx1ZU1hdGNoZXIgd2lsZENhcmRWYWx1ZU1hdGNoZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlcXVpcmUuVGhhdChldmFsdWF0b3IpLk5hbWVkKCJldmFsdWF0b3IiKS5Jc05vdE51bGwoKTsKLSAgICAgICAgICAgIFJlcXVpcmUuVGhhdCh3aWxkQ2FyZFZhbHVlTWF0Y2hlcikuTmFtZWQoIndpbGRDYXJkVmFsdWVNYXRjaGVyIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICBfbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgPSBldmFsdWF0b3I7Ci0gICAgICAgICAgICBfd2lsZENhcmRWYWx1ZU1hdGNoZXIgPSB3aWxkQ2FyZFZhbHVlTWF0Y2hlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBib29sIEV2YWx1YXRlKG9iamVjdCBvYmosIG9iamVjdCBleHByZXNzaW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGU/IGNhbmRpZGF0ZSA9IGRlZmF1bHQoZG91YmxlPyk7Ci0gICAgICAgICAgICBpZiAoSXNOdW1lcmljKG9iaikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUob2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuSGFzVmFsdWUgJiYgZXhwcmVzc2lvbiBpcyBzdHJpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9udW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvci5FdmFsdWF0ZShjYW5kaWRhdGUuVmFsdWUsIGV4cHJlc3Npb24uVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiBfd2lsZENhcmRWYWx1ZU1hdGNoZXIuSXNNYXRjaChleHByZXNzaW9uLCBvYmouVG9TdHJpbmcoKSkgPT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBMaXN0PGludD4gR2V0TWF0Y2hJbmRleGVzKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8gcmFuZ2VJbmZvLCBvYmplY3Qgc2VhcmNoZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgTGlzdDxpbnQ+KCk7Ci0gICAgICAgICAgICB2YXIgaW50ZXJuYWxJbmRleCA9IDA7Ci0gICAgICAgICAgICBmb3IgKHZhciByb3cgPSByYW5nZUluZm8uQWRkcmVzcy5fZnJvbVJvdzsgcm93IDw9IHJhbmdlSW5mby5BZGRyZXNzLl90b1Jvdzsgcm93KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICh2YXIgY29sID0gcmFuZ2VJbmZvLkFkZHJlc3MuX2Zyb21Db2w7IGNvbCA8PSByYW5nZUluZm8uQWRkcmVzcy5fdG9Db2w7IGNvbCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IHJhbmdlSW5mby5HZXRWYWx1ZShyb3csIGNvbCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChFdmFsdWF0ZShjYW5kaWRhdGUsIHNlYXJjaGVkKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LkFkZChpbnRlcm5hbEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbEluZGV4Kys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQorICBwcm90ZWN0ZWQgYm9vbCBFdmFsdWF0ZShvYmplY3Qgb2JqLCBvYmplY3QgZXhwcmVzc2lvbikgeworICAgIGRvdWJsZT8gY2FuZGlkYXRlID0gZGVmYXVsdChkb3VibGU/KTsKKyAgICBpZiAoSXNOdW1lcmljKG9iaikpIHsKKyAgICAgIGNhbmRpZGF0ZSA9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKG9iaik7CiAgICAgfQorICAgIGlmIChjYW5kaWRhdGUuSGFzVmFsdWUgJiYgZXhwcmVzc2lvbiBpcyBzdHJpbmcpIHsKKyAgICAgIHJldHVybiBfbnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IuRXZhbHVhdGUoY2FuZGlkYXRlLlZhbHVlLCBleHByZXNzaW9uLlRvU3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIF93aWxkQ2FyZFZhbHVlTWF0Y2hlci5Jc01hdGNoKGV4cHJlc3Npb24sIG9iai5Ub1N0cmluZygpKSA9PSAwOworICB9CisKKyAgcHJvdGVjdGVkIExpc3Q8aW50PiBHZXRNYXRjaEluZGV4ZXMoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyByYW5nZUluZm8sIG9iamVjdCBzZWFyY2hlZCkgeworICAgIHZhciByZXN1bHQgPSBuZXcgTGlzdDxpbnQ+KCk7CisgICAgdmFyIGludGVybmFsSW5kZXggPSAwOworICAgIGZvciAodmFyIHJvdyA9IHJhbmdlSW5mby5BZGRyZXNzLl9mcm9tUm93OyByb3cgPD0gcmFuZ2VJbmZvLkFkZHJlc3MuX3RvUm93OyByb3crKykgeworICAgICAgZm9yICh2YXIgY29sID0gcmFuZ2VJbmZvLkFkZHJlc3MuX2Zyb21Db2w7IGNvbCA8PSByYW5nZUluZm8uQWRkcmVzcy5fdG9Db2w7IGNvbCsrKSB7CisgICAgICAgIHZhciBjYW5kaWRhdGUgPSByYW5nZUluZm8uR2V0VmFsdWUocm93LCBjb2wpOworICAgICAgICBpZiAoRXZhbHVhdGUoY2FuZGlkYXRlLCBzZWFyY2hlZCkpIHsKKyAgICAgICAgICByZXN1bHQuQWRkKGludGVybmFsSW5kZXgpOworICAgICAgICB9CisgICAgICAgIGludGVybmFsSW5kZXgrKzsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1BpLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1BpLmNzCmluZGV4IDI0NGRjZTcuLmM2MDZiNDggMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9QaS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUGkuY3MKQEAgLTcsMzUgKzcsMzIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBQaSA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gU3lzdGVtLk1hdGguUm91bmQoKGRvdWJsZSlTeXN0ZW0uTWF0aC5QSSwgMTQpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CisKK3B1YmxpYyBjbGFzcyBQaSA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHZhciByZXN1bHQgPSBTeXN0ZW0uTWF0aC5Sb3VuZChTeXN0ZW0uTWF0aC5QSSwgMTQpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1Bvd2VyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1Bvd2VyLmNzCmluZGV4IGFiZTdlNjcuLmYwZmQwYTYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Qb3dlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUG93ZXIuY3MKQEAgLTcsMzggKzcsMzUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBQb3dlciA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgdmFyIHBvd2VyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gU3lzdGVtLk1hdGguUG93KG51bWJlciwgcG93ZXIpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CisKK3B1YmxpYyBjbGFzcyBQb3dlciA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgIHZhciBwb3dlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDEpOworICAgIHZhciByZXN1bHQgPSBTeXN0ZW0uTWF0aC5Qb3cobnVtYmVyLCBwb3dlcik7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUHJvZHVjdC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Qcm9kdWN0LmNzCmluZGV4IGQ4YzhjNGUuLjU0MTQ1NTggMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Qcm9kdWN0LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Qcm9kdWN0LmNzCkBAIC03LDg1ICs3LDgzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgUHJvZHVjdCA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IDBkOwotICAgICAgICAgICAgdmFyIGluZGV4ID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChBcmVFcXVhbChyZXN1bHQsIDBkKSAmJiBpbmRleCA8IGFyZ3VtZW50cy5Db3VudCgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IENhbGN1bGF0ZUZpcnN0SXRlbShhcmd1bWVudHMsIGluZGV4KyssIGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzdWx0ID0gQ2FsY3VsYXRlQ29sbGVjdGlvbihhcmd1bWVudHMuU2tpcChpbmRleCksIHJlc3VsdCwgKGFyZywgY3VycmVudCkgPT4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoU2hvdWxkSWdub3JlKGFyZykpIHJldHVybiBjdXJyZW50OwotICAgICAgICAgICAgICAgIGlmIChhcmcuVmFsdWVJc0V4Y2VsRXJyb3IpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihhcmcuVmFsdWVBc0V4Y2VsRXJyb3JWYWx1ZS5UeXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFyZy5Jc0V4Y2VsUmFuZ2UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiBhcmcuVmFsdWVBc1JhbmdlSW5mbykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoU2hvdWxkSWdub3JlKGNlbGwsIGNvbnRleHQpKSByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgKj0gY2VsbC5WYWx1ZURvdWJsZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFyIG9iaiA9IGFyZy5WYWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAob2JqICE9IG51bGwgJiYgSXNOdW1lcmljKG9iaikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gQ29udmVydC5Ub0RvdWJsZShvYmopOwotICAgICAgICAgICAgICAgICAgICBjdXJyZW50ICo9IHZhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CiAKLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgQ2FsY3VsYXRlRmlyc3RJdGVtKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgaW50IGluZGV4LCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZWxlbWVudCA9IGFyZ3VtZW50cy5FbGVtZW50QXQoaW5kZXgpOwotICAgICAgICAgICAgdmFyIGFyZ0xpc3QgPSBuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PiB7IGVsZW1lbnQgfTsKLSAgICAgICAgICAgIHZhciB2YWx1ZUxpc3QgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKGZhbHNlLCBmYWxzZSwgYXJnTGlzdCwgY29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gMGQ7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsdWUgaW4gdmFsdWVMaXN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gMGQgJiYgdmFsdWUgPiAwZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgKj0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIFByb2R1Y3QgOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciByZXN1bHQgPSAwZDsKKyAgICB2YXIgaW5kZXggPSAwOworICAgIHdoaWxlIChBcmVFcXVhbChyZXN1bHQsIDBkKSAmJiBpbmRleCA8IGFyZ3VtZW50cy5Db3VudCgpKSB7CisgICAgICByZXN1bHQgPSBDYWxjdWxhdGVGaXJzdEl0ZW0oYXJndW1lbnRzLCBpbmRleCsrLCBjb250ZXh0KTsKICAgICB9CisgICAgcmVzdWx0ID0gQ2FsY3VsYXRlQ29sbGVjdGlvbigKKyAgICAgICAgYXJndW1lbnRzLlNraXAoaW5kZXgpLAorICAgICAgICByZXN1bHQsCisgICAgICAgIChhcmcsIGN1cnJlbnQpID0+IHsKKyAgICAgICAgICBpZiAoU2hvdWxkSWdub3JlKGFyZykpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50OworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoYXJnLlZhbHVlSXNFeGNlbEVycm9yKSB7CisgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihhcmcuVmFsdWVBc0V4Y2VsRXJyb3JWYWx1ZS5UeXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGFyZy5Jc0V4Y2VsUmFuZ2UpIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIGFyZy5WYWx1ZUFzUmFuZ2VJbmZvKSB7CisgICAgICAgICAgICAgIGlmIChTaG91bGRJZ25vcmUoY2VsbCwgY29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBjdXJyZW50ICo9IGNlbGwuVmFsdWVEb3VibGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICB9CisgICAgICAgICAgdmFyIG9iaiA9IGFyZy5WYWx1ZTsKKyAgICAgICAgICBpZiAob2JqICE9IG51bGwgJiYgSXNOdW1lcmljKG9iaikpIHsKKyAgICAgICAgICAgIHZhciB2YWwgPSBDb252ZXJ0LlRvRG91YmxlKG9iaik7CisgICAgICAgICAgICBjdXJyZW50ICo9IHZhbDsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgIH0pOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQorCisgIHByaXZhdGUgZG91YmxlIENhbGN1bGF0ZUZpcnN0SXRlbSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIGludCBpbmRleCwKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICB2YXIgZWxlbWVudCA9IGFyZ3VtZW50cy5FbGVtZW50QXQoaW5kZXgpOworICAgIHZhciBhcmdMaXN0ID0gbmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4geyBlbGVtZW50IH07CisgICAgdmFyIHZhbHVlTGlzdCA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoZmFsc2UsIGZhbHNlLCBhcmdMaXN0LCBjb250ZXh0KTsKKyAgICB2YXIgcmVzdWx0ID0gMGQ7CisgICAgZm9yZWFjaCAodmFyIHZhbHVlIGluIHZhbHVlTGlzdCkgeworICAgICAgaWYgKHJlc3VsdCA9PSAwZCAmJiB2YWx1ZSA+IDBkKSB7CisgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0ICo9IHZhbHVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUXVvdGllbnQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUXVvdGllbnQuY3MKaW5kZXggZTRmNzMwNy4uODY2ZGRkOSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1F1b3RpZW50LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9RdW90aWVudC5jcwpAQCAtMSwyMSArMSwxNyBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0Owor77u/dXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgUXVvdGllbnQgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKLSAgICAgICAgICAgIHZhciBudW0gPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHZhciBkZW5vbSA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiAoaW50KWRlbm9tID09IDAsIGVFcnJvclR5cGUuRGl2MCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gKGludCkobnVtL2Rlbm9tKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgUXVvdGllbnQgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgIHZhciBudW0gPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICB2YXIgZGVub20gPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAxKTsKKyAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IChpbnQpZGVub20gPT0gMCwgZUVycm9yVHlwZS5EaXYwKTsKKyAgICB2YXIgcmVzdWx0ID0gKGludCkobnVtIC8gZGVub20pOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1JhbmQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUmFuZC5jcwppbmRleCBlMDRlYmY1Li45YmViNzg3IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUmFuZC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUmFuZC5jcwpAQCAtMSwyNCArMSwxNyBAQAog77u/dXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIFJhbmQgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgU2VlZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBTZWVkID0gU2VlZCA+IDUwID8gMCA6IFNlZWQgKyA1OwotICAgICAgICAgICAgdmFyIHZhbCA9IG5ldyBSYW5kb20oU3lzdGVtLkRhdGVUaW1lLk5vdy5NaWxsaXNlY29uZCArIFNlZWQpLk5leHREb3VibGUoKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodmFsLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQotICAgIH0KK3B1YmxpYyBjbGFzcyBSYW5kIDogRXhjZWxGdW5jdGlvbiB7CisgIHByaXZhdGUgc3RhdGljIGludCBTZWVkIHsgZ2V0OyBzZXQ7IH0KKworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFNlZWQgPSBTZWVkID4gNTAgPyAwIDogU2VlZCArIDU7CisgICAgdmFyIHZhbCA9IG5ldyBSYW5kb20oU3lzdGVtLkRhdGVUaW1lLk5vdy5NaWxsaXNlY29uZCArIFNlZWQpLk5leHREb3VibGUoKTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHZhbCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9SYW5kQmV0d2Vlbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9SYW5kQmV0d2Vlbi5jcwppbmRleCAwMjAyMDg1Li41YmI5ZThhIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUmFuZEJldHdlZW4uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1JhbmRCZXR3ZWVuLmNzCkBAIC03LDUzICs3LDQ3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgUmFuZEJldHdlZW4gOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKLSAgICAgICAgICAgIHZhciBsb3cgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHZhciBoaWdoID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgcmFuZCA9IG5ldyBSYW5kKCkuRXhlY3V0ZShuZXcgRnVuY3Rpb25Bcmd1bWVudFswXSwgY29udGV4dCkuUmVzdWx0OwotICAgICAgICAgICAgdmFyIHJhbmRQYXJ0ID0gKENhbHVsYXRlRGlmZihoaWdoLCBsb3cpICogKGRvdWJsZSlyYW5kKSArIDE7Ci0gICAgICAgICAgICByYW5kUGFydCA9IFN5c3RlbS5NYXRoLkZsb29yKHJhbmRQYXJ0KTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQobG93ICsgcmFuZFBhcnQsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKIAotICAgICAgICBwcml2YXRlIGRvdWJsZSBDYWx1bGF0ZURpZmYoZG91YmxlIGhpZ2gsIGRvdWJsZSBsb3cpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChoaWdoID4gMCAmJiBsb3cgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBoaWdoICsgbG93ICogLSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoaGlnaCA8IDAgJiYgbG93IDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGlnaCAqIC0xIC0gbG93ICogLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaGlnaCAtIGxvdzsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIFJhbmRCZXR3ZWVuIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICB2YXIgbG93ID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgdmFyIGhpZ2ggPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgcmFuZCA9IG5ldyBSYW5kKCkuRXhlY3V0ZShuZXcgRnVuY3Rpb25Bcmd1bWVudFswXSwgY29udGV4dCkuUmVzdWx0OworICAgIHZhciByYW5kUGFydCA9IChDYWx1bGF0ZURpZmYoaGlnaCwgbG93KSAqIChkb3VibGUpcmFuZCkgKyAxOworICAgIHJhbmRQYXJ0ID0gU3lzdGVtLk1hdGguRmxvb3IocmFuZFBhcnQpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQobG93ICsgcmFuZFBhcnQsIERhdGFUeXBlLkludGVnZXIpOworICB9CisKKyAgcHJpdmF0ZSBkb3VibGUgQ2FsdWxhdGVEaWZmKGRvdWJsZSBoaWdoLCBkb3VibGUgbG93KSB7CisgICAgaWYgKGhpZ2ggPiAwICYmIGxvdyA8IDApIHsKKyAgICAgIHJldHVybiBoaWdoICsgbG93ICogLTE7CiAgICAgfQorICAgIGlmIChoaWdoIDwgMCAmJiBsb3cgPCAwKSB7CisgICAgICByZXR1cm4gaGlnaCAqIC0xIC0gbG93ICogLTE7CisgICAgfQorICAgIHJldHVybiBoaWdoIC0gbG93OworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUmFuay5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9SYW5rLmNzCmluZGV4IDcwODdiNWYuLmFlNzFiMmMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9SYW5rLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9SYW5rLmNzCkBAIC0xLDY5ICsxLDY2IEBACi3vu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwogdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgUmFuayA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIGJvb2wgX2lzQXZnOwotICAgICAgICBwdWJsaWMgUmFuayhib29sIGlzQXZnPWZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBfaXNBdmc9aXNBdmc7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgbnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICB2YXIgcmVmZXIgPSBhcmd1bWVudHMuRWxlbWVudEF0KDEpOwotICAgICAgICAgICAgYm9vbCBhc2MgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA+IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNjID0gYmFzZS5BcmdUb0Jvb2woYXJndW1lbnRzLCAyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBsID0gbmV3IExpc3Q8ZG91YmxlPigpOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGggeworICBwdWJsaWMgY2xhc3MgUmFuayA6IEV4Y2VsRnVuY3Rpb24geworICAgIGJvb2wgX2lzQXZnOwogCi0gICAgICAgICAgICBmb3JlYWNoICh2YXIgYyBpbiByZWZlci5WYWx1ZUFzUmFuZ2VJbmZvKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB2ID0gVXRpbHMuQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoYy5WYWx1ZSwgZmFsc2UsIHRydWUpOwotICAgICAgICAgICAgICAgIGlmICghZG91YmxlLklzTmFOKHYpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbC5BZGQodik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbC5Tb3J0KCk7Ci0gICAgICAgICAgICBkb3VibGUgaXg7Ci0gICAgICAgICAgICBpZiAoYXNjKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGl4ID0gbC5JbmRleE9mKG51bWJlcikrMTsKLSAgICAgICAgICAgICAgICBpZihfaXNBdmcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgc3QgPSBDb252ZXJ0LlRvSW50MzIoaXgpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAobC5Db3VudCA+IHN0ICYmIGxbc3RdID09IG51bWJlcikgc3QrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0ID4gaXgpIGl4ID0gaXggKyAoKHN0IC0gaXgpIC8gMkQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpeCA9IGwuTGFzdEluZGV4T2YobnVtYmVyKTsKLSAgICAgICAgICAgICAgICBpZiAoX2lzQXZnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0ID0gQ29udmVydC5Ub0ludDMyKGl4KS0xOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMCA8PSBzdCAmJiBsW3N0XSA9PSBudW1iZXIpIHN0LS07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdCsxIDwgaXgpIGl4ID0gaXggLSAoKGl4IC0gc3QgLSAxKSAvIDJEKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaXggPSBsLkNvdW50IC0gaXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXggPD0gMCB8fCBpeD5sLkNvdW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTkEpLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGl4LCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIHB1YmxpYyBSYW5rKGJvb2wgaXNBdmcgPSBmYWxzZSkgeworICAgICAgX2lzQXZnID0gaXNBdmc7CiAgICAgfQorCisgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgICAgdmFyIHJlZmVyID0gYXJndW1lbnRzLkVsZW1lbnRBdCgxKTsKKyAgICAgIGJvb2wgYXNjID0gZmFsc2U7CisgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiAyKSB7CisgICAgICAgIGFzYyA9IGJhc2UuQXJnVG9Cb29sKGFyZ3VtZW50cywgMik7CisgICAgICB9CisgICAgICB2YXIgbCA9IG5ldyBMaXN0PGRvdWJsZT4oKTsKKworICAgICAgZm9yZWFjaCAodmFyIGMgaW4gcmVmZXIuVmFsdWVBc1JhbmdlSW5mbykgeworICAgICAgICB2YXIgdiA9IFV0aWxzLkNvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGMuVmFsdWUsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgaWYgKCFkb3VibGUuSXNOYU4odikpIHsKKyAgICAgICAgICBsLkFkZCh2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbC5Tb3J0KCk7CisgICAgICBkb3VibGUgaXg7CisgICAgICBpZiAoYXNjKSB7CisgICAgICAgIGl4ID0gbC5JbmRleE9mKG51bWJlcikgKyAxOworICAgICAgICBpZiAoX2lzQXZnKSB7CisgICAgICAgICAgaW50IHN0ID0gQ29udmVydC5Ub0ludDMyKGl4KTsKKyAgICAgICAgICB3aGlsZSAobC5Db3VudCA+IHN0ICYmIGxbc3RdID09IG51bWJlcikgeworICAgICAgICAgICAgc3QrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN0ID4gaXgpIHsKKyAgICAgICAgICAgIGl4ID0gaXggKyAoKHN0IC0gaXgpIC8gMkQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaXggPSBsLkxhc3RJbmRleE9mKG51bWJlcik7CisgICAgICAgIGlmIChfaXNBdmcpIHsKKyAgICAgICAgICBpbnQgc3QgPSBDb252ZXJ0LlRvSW50MzIoaXgpIC0gMTsKKyAgICAgICAgICB3aGlsZSAoMCA8PSBzdCAmJiBsW3N0XSA9PSBudW1iZXIpIHsKKyAgICAgICAgICAgIHN0LS07CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzdCArIDEgPCBpeCkgeworICAgICAgICAgICAgaXggPSBpeCAtICgoaXggLSBzdCAtIDEpIC8gMkQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpeCA9IGwuQ291bnQgLSBpeDsKKyAgICAgIH0KKyAgICAgIGlmIChpeCA8PSAwIHx8IGl4ID4gbC5Db3VudCkgeworICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLk5BKSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGl4LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Sb3VuZC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Sb3VuZC5jcwppbmRleCA3ODQwN2ZjLi4xYmRhOTJkIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUm91bmQuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1JvdW5kLmNzCkBAIC03LDQyICs3LDM4IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgUm91bmQgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKLSAgICAgICAgICAgIHZhciBudW1iZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHZhciBuRGlnaXRzID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIGlmIChuRGlnaXRzIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuRGlnaXRzICo9IC0xOwotICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQobnVtYmVyIC0gKG51bWJlciAlIChTeXN0ZW0uTWF0aC5Qb3coMTAsIG5EaWdpdHMpKSksIERhdGFUeXBlLkludGVnZXIpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguUm91bmQobnVtYmVyLCBuRGlnaXRzKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgUm91bmQgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgIHZhciBudW1iZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICB2YXIgbkRpZ2l0cyA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CisgICAgaWYgKG5EaWdpdHMgPCAwKSB7CisgICAgICBuRGlnaXRzICo9IC0xOworICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChudW1iZXIgLSAobnVtYmVyICUgKFN5c3RlbS5NYXRoLlBvdygxMCwgbkRpZ2l0cykpKSwgRGF0YVR5cGUuSW50ZWdlcik7CiAgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguUm91bmQobnVtYmVyLCBuRGlnaXRzKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Sb3VuZGRvd24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUm91bmRkb3duLmNzCmluZGV4IDgyZTlmY2QuLjM5NmMzNTUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9Sb3VuZGRvd24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1JvdW5kZG93bi5jcwpAQCAtNyw2MSArNyw1NCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE0LTAxLTA2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIFJvdW5kZG93biA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgdmFyIG5EZWNpbWFscyA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKIAotICAgICAgICAgICAgdmFyIG5GYWN0b3IgPSBudW1iZXIgPCAwID8gLTEgOiAxOwotICAgICAgICAgICAgbnVtYmVyICo9IG5GYWN0b3I7CitwdWJsaWMgY2xhc3MgUm91bmRkb3duIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICB2YXIgbnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgdmFyIG5EZWNpbWFscyA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CiAKLSAgICAgICAgICAgIGRvdWJsZSByZXN1bHQ7Ci0gICAgICAgICAgICBpZiAobkRlY2ltYWxzID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBSb3VuZERvd25EZWNpbWFsTnVtYmVyKG51bWJlciwgbkRlY2ltYWxzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAoaW50KVN5c3RlbS5NYXRoLkZsb29yKG51bWJlcik7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0IC0gKHJlc3VsdCAlIFN5c3RlbS5NYXRoLlBvdygxMCwgKG5EZWNpbWFscyotMSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0ICogbkZhY3RvciwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KKyAgICB2YXIgbkZhY3RvciA9IG51bWJlciA8IDAgPyAtMSA6IDE7CisgICAgbnVtYmVyICo9IG5GYWN0b3I7CiAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZG91YmxlIFJvdW5kRG93bkRlY2ltYWxOdW1iZXIoZG91YmxlIG51bWJlciwgaW50IG5EZWNpbWFscykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGludGVnZXJQYXJ0ID0gU3lzdGVtLk1hdGguRmxvb3IobnVtYmVyKTsKLSAgICAgICAgICAgIHZhciBkZWNpbWFsUGFydCA9IG51bWJlciAtIGludGVnZXJQYXJ0OwotICAgICAgICAgICAgZGVjaW1hbFBhcnQgPSBTeXN0ZW0uTWF0aC5Qb3coMTBkLCBuRGVjaW1hbHMpKmRlY2ltYWxQYXJ0OwotICAgICAgICAgICAgZGVjaW1hbFBhcnQgPSBTeXN0ZW0uTWF0aC5UcnVuY2F0ZShkZWNpbWFsUGFydCkvU3lzdGVtLk1hdGguUG93KDEwZCwgbkRlY2ltYWxzKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBpbnRlZ2VyUGFydCArIGRlY2ltYWxQYXJ0OwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQorICAgIGRvdWJsZSByZXN1bHQ7CisgICAgaWYgKG5EZWNpbWFscyA+IDApIHsKKyAgICAgIHJlc3VsdCA9IFJvdW5kRG93bkRlY2ltYWxOdW1iZXIobnVtYmVyLCBuRGVjaW1hbHMpOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQgPSAoaW50KVN5c3RlbS5NYXRoLkZsb29yKG51bWJlcik7CisgICAgICByZXN1bHQgPSByZXN1bHQgLSAocmVzdWx0ICUgU3lzdGVtLk1hdGguUG93KDEwLCAobkRlY2ltYWxzICogLTEpKSk7CiAgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0ICogbkZhY3RvciwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBkb3VibGUgUm91bmREb3duRGVjaW1hbE51bWJlcihkb3VibGUgbnVtYmVyLCBpbnQgbkRlY2ltYWxzKSB7CisgICAgdmFyIGludGVnZXJQYXJ0ID0gU3lzdGVtLk1hdGguRmxvb3IobnVtYmVyKTsKKyAgICB2YXIgZGVjaW1hbFBhcnQgPSBudW1iZXIgLSBpbnRlZ2VyUGFydDsKKyAgICBkZWNpbWFsUGFydCA9IFN5c3RlbS5NYXRoLlBvdygxMGQsIG5EZWNpbWFscykgKiBkZWNpbWFsUGFydDsKKyAgICBkZWNpbWFsUGFydCA9IFN5c3RlbS5NYXRoLlRydW5jYXRlKGRlY2ltYWxQYXJ0KSAvIFN5c3RlbS5NYXRoLlBvdygxMGQsIG5EZWNpbWFscyk7CisgICAgdmFyIHJlc3VsdCA9IGludGVnZXJQYXJ0ICsgZGVjaW1hbFBhcnQ7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1JvdW5kdXAuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUm91bmR1cC5jcwppbmRleCA4MGMwMGZmLi5kNDExY2U2IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUm91bmR1cC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvUm91bmR1cC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCisvKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgogICoKICAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKQEAgLTcsNDAgKzcsNDAgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNC0wMS0wNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBSb3VuZHVwIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgbnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICB2YXIgbkRpZ2l0cyA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICBkb3VibGUgcmVzdWx0ID0gKG51bWJlciA+PSAwKSAKLSAgICAgICAgICAgICAgICA/IFN5c3RlbS5NYXRoLkNlaWxpbmcobnVtYmVyICogU3lzdGVtLk1hdGguUG93KDEwLCBuRGlnaXRzKSkgLyBTeXN0ZW0uTWF0aC5Qb3coMTAsIG5EaWdpdHMpCi0gICAgICAgICAgICAgICAgOiBTeXN0ZW0uTWF0aC5GbG9vcihudW1iZXIgKiBTeXN0ZW0uTWF0aC5Qb3coMTAsIG5EaWdpdHMpKSAvIFN5c3RlbS5NYXRoLlBvdygxMCwgbkRpZ2l0cyk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKKworcHVibGljIGNsYXNzIFJvdW5kdXAgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgIHZhciBudW1iZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICB2YXIgbkRpZ2l0cyA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CisgICAgZG91YmxlIHJlc3VsdCA9CisgICAgICAgIChudW1iZXIgPj0gMCkKKyAgICAgICAgICAgID8gU3lzdGVtLk1hdGguQ2VpbGluZyhudW1iZXIgKiBTeXN0ZW0uTWF0aC5Qb3coMTAsIG5EaWdpdHMpKQorICAgICAgICAgICAgICAgIC8gU3lzdGVtLk1hdGguUG93KDEwLCBuRGlnaXRzKQorICAgICAgICAgICAgOiBTeXN0ZW0uTWF0aC5GbG9vcihudW1iZXIgKiBTeXN0ZW0uTWF0aC5Qb3coMTAsIG5EaWdpdHMpKQorICAgICAgICAgICAgICAgIC8gU3lzdGVtLk1hdGguUG93KDEwLCBuRGlnaXRzKTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TaWduLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1NpZ24uY3MKaW5kZXggYTA2MDY4NS4uZTA5YTkxOSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1NpZ24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1NpZ24uY3MKQEAgLTcsNDUgKzcsMzkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBTaWduIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gMGQ7Ci0gICAgICAgICAgICB2YXIgdmFsID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICBpZiAodmFsIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHZhbCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CisKK3B1YmxpYyBjbGFzcyBTaWduIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgcmVzdWx0ID0gMGQ7CisgICAgdmFyIHZhbCA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgIGlmICh2YWwgPCAwKSB7CisgICAgICByZXN1bHQgPSAtMTsKKyAgICB9IGVsc2UgaWYgKHZhbCA+IDApIHsKKyAgICAgIHJlc3VsdCA9IDE7CiAgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1Npbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TaW4uY3MKaW5kZXggMGUzYmMxZi4uNWI1NWVmYSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1Npbi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU2luLmNzCkBAIC03LDM2ICs3LDMzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgU2luIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLlNpbihhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgU2luIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5TaW4oYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TaW5oLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1NpbmguY3MKaW5kZXggZWMxYjY0Ni4uNWNmM2Q4OCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1NpbmguY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1NpbmguY3MKQEAgLTcsMzYgKzcsMzMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBTaW5oIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLlNpbmgoYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKKworcHVibGljIGNsYXNzIFNpbmggOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBhcmcgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLlNpbmgoYXJnKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TbWFsbC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TbWFsbC5jcwppbmRleCA1ZGVmYjEyLi5mMjJlOWZhIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU21hbGwuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1NtYWxsLmNzCkBAIC0xLDIyICsxLDE5IEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK++7v3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBTbWFsbCA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApOwotICAgICAgICAgICAgdmFyIGluZGV4ID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKSAtIDE7Ci0gICAgICAgICAgICB2YXIgdmFsdWVzID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZShuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PiB7IGFyZ3MgfSwgY29udGV4dCk7Ci0gICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IGluZGV4IDwgMCB8fCBpbmRleCA+PSB2YWx1ZXMuQ291bnQoKSwgZUVycm9yVHlwZS5OdW0pOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlcy5PcmRlckJ5KHggPT4geCkuRWxlbWVudEF0KGluZGV4KTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgU21hbGwgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgIHZhciBhcmdzID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKTsKKyAgICB2YXIgaW5kZXggPSBBcmdUb0ludChhcmd1bWVudHMsIDEpIC0gMTsKKyAgICB2YXIgdmFsdWVzID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZShuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PiB7IGFyZ3MgfSwgY29udGV4dCk7CisgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiBpbmRleCA8IDAgfHwgaW5kZXggPj0gdmFsdWVzLkNvdW50KCksIGVFcnJvclR5cGUuTnVtKTsKKyAgICB2YXIgcmVzdWx0ID0gdmFsdWVzLk9yZGVyQnkoeCA9PiB4KS5FbGVtZW50QXQoaW5kZXgpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1NxcnQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3FydC5jcwppbmRleCBjY2FlYmY3Li42MWRmZjgyIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3FydC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3FydC5jcwpAQCAtNywzNyArNywzNCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIFNxcnQgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmcgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBTeXN0ZW0uTWF0aC5TcXJ0KChkb3VibGUpYXJnKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoKGRvdWJsZSlyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CisKK3B1YmxpYyBjbGFzcyBTcXJ0IDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgYXJnID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgdmFyIHJlc3VsdCA9IFN5c3RlbS5NYXRoLlNxcnQoYXJnKTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TcXJ0UGkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3FydFBpLmNzCmluZGV4IGE4N2VkZDMuLmNlYTNlMzIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TcXJ0UGkuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1NxcnRQaS5jcwpAQCAtNywzNiArNywzMyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIFNxcnRQaSA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5TcXJ0KG51bWJlciAqIFN5c3RlbS5NYXRoLlBJKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKKworcHVibGljIGNsYXNzIFNxcnRQaSA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguU3FydChudW1iZXIgKiBTeXN0ZW0uTWF0aC5QSSksIERhdGFUeXBlLkRlY2ltYWwpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3RkZXYuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3RkZXYuY3MKaW5kZXggNDRiZmE0My4uNjI4MzFmYiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N0ZGV2LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdGRldi5jcwpAQCAtNyw1NiArNyw1MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwotdXNpbmcgTWF0aE9iaiA9IFN5c3RlbS5NYXRoOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBNYXRoT2JqID0gU3lzdGVtLk1hdGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIFN0ZGV2IDogSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgdmFsdWVzID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZShhcmd1bWVudHMsIGNvbnRleHQsIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3RhbmRhcmREZXZpYXRpb24odmFsdWVzKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwogCi0gICAgICAgIHByaXZhdGUgZG91YmxlIFN0YW5kYXJkRGV2aWF0aW9uKElFbnVtZXJhYmxlPGRvdWJsZT4gdmFsdWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGUgcmV0ID0gMDsKLSAgICAgICAgICAgIGlmICh2YWx1ZXMuQW55KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIG5WYWx1ZXMgPSB2YWx1ZXMuQ291bnQoKTsKLSAgICAgICAgICAgICAgICBpZihuVmFsdWVzID09IDEpIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5EaXYwKTsKLSAgICAgICAgICAgICAgICAvL0NvbXB1dGUgdGhlIEF2ZXJhZ2UgICAgICAgCi0gICAgICAgICAgICAgICAgZG91YmxlIGF2ZyA9IHZhbHVlcy5BdmVyYWdlKCk7Ci0gICAgICAgICAgICAgICAgLy9QZXJmb3JtIHRoZSBTdW0gb2YgKHZhbHVlLWF2ZylfMl8yICAgICAgIAotICAgICAgICAgICAgICAgIGRvdWJsZSBzdW0gPSB2YWx1ZXMuU3VtKGQgPT4gTWF0aE9iai5Qb3coZCAtIGF2ZywgMikpOwotICAgICAgICAgICAgICAgIC8vUHV0IGl0IGFsbCB0b2dldGhlciAgICAgICAKLSAgICAgICAgICAgICAgICByZXQgPSBNYXRoT2JqLlNxcnQoRGl2aWRlKHN1bSwgKHZhbHVlcy5Db3VudCgpIC0gMSkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0gCitwdWJsaWMgY2xhc3MgU3RkZXYgOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciB2YWx1ZXMgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKGFyZ3VtZW50cywgY29udGV4dCwgZmFsc2UpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3RhbmRhcmREZXZpYXRpb24odmFsdWVzKSwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KIAorICBwcml2YXRlIGRvdWJsZSBTdGFuZGFyZERldmlhdGlvbihJRW51bWVyYWJsZTxkb3VibGU+IHZhbHVlcykgeworICAgIGRvdWJsZSByZXQgPSAwOworICAgIGlmICh2YWx1ZXMuQW55KCkpIHsKKyAgICAgIHZhciBuVmFsdWVzID0gdmFsdWVzLkNvdW50KCk7CisgICAgICBpZiAoblZhbHVlcyA9PSAxKSB7CisgICAgICAgIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5EaXYwKTsKKyAgICAgIH0KKyAgICAgIC8vQ29tcHV0ZSB0aGUgQXZlcmFnZQorICAgICAgZG91YmxlIGF2ZyA9IHZhbHVlcy5BdmVyYWdlKCk7CisgICAgICAvL1BlcmZvcm0gdGhlIFN1bSBvZiAodmFsdWUtYXZnKV8yXzIKKyAgICAgIGRvdWJsZSBzdW0gPSB2YWx1ZXMuU3VtKGQgPT4gTWF0aE9iai5Qb3coZCAtIGF2ZywgMikpOworICAgICAgLy9QdXQgaXQgYWxsIHRvZ2V0aGVyCisgICAgICByZXQgPSBNYXRoT2JqLlNxcnQoRGl2aWRlKHN1bSwgKHZhbHVlcy5Db3VudCgpIC0gMSkpKTsKICAgICB9CisgICAgcmV0dXJuIHJldDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N0ZGV2UC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdGRldlAuY3MKaW5kZXggZjk3MDY1ZC4uMTZlN2I3YSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N0ZGV2UC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3RkZXZQLmNzCkBAIC03LDQyICs3LDM5IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBNYXRoT2JqID0gU3lzdGVtLk1hdGg7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKK3VzaW5nIE1hdGhPYmogPSBTeXN0ZW0uTWF0aDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgU3RkZXZQIDogSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhcmdzID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZShJZ25vcmVIaWRkZW5WYWx1ZXMsIGZhbHNlLCBhcmd1bWVudHMsIGNvbnRleHQpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTdGFuZGFyZERldmlhdGlvbihhcmdzKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwogCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGRvdWJsZSBTdGFuZGFyZERldmlhdGlvbihJRW51bWVyYWJsZTxkb3VibGU+IHZhbHVlcykKLSAgICAgICAgewotICAgICAgICAgICAgZG91YmxlIGF2ZyA9IHZhbHVlcy5BdmVyYWdlKCk7Ci0gICAgICAgICAgICByZXR1cm4gTWF0aE9iai5TcXJ0KHZhbHVlcy5BdmVyYWdlKHYgPT4gTWF0aE9iai5Qb3codiAtIGF2ZywgMikpKTsKLSAgICAgICAgfQotICAgIH0KK3B1YmxpYyBjbGFzcyBTdGRldlAgOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICB2YXIgYXJncyA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoSWdub3JlSGlkZGVuVmFsdWVzLCBmYWxzZSwgYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN0YW5kYXJkRGV2aWF0aW9uKGFyZ3MpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGRvdWJsZSBTdGFuZGFyZERldmlhdGlvbihJRW51bWVyYWJsZTxkb3VibGU+IHZhbHVlcykgeworICAgIGRvdWJsZSBhdmcgPSB2YWx1ZXMuQXZlcmFnZSgpOworICAgIHJldHVybiBNYXRoT2JqLlNxcnQodmFsdWVzLkF2ZXJhZ2UodiA9PiBNYXRoT2JqLlBvdyh2IC0gYXZnLCAyKSkpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VidG90YWwuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VidG90YWwuY3MKaW5kZXggZDAyMDI0ZS4uNDVlMTFlNiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1YnRvdGFsLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdWJ0b3RhbC5jcwpAQCAtNywxMDEgKzcsOTIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBTdWJ0b3RhbCA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgRGljdGlvbmFyeTxpbnQsIEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24+IF9mdW5jdGlvbnMgPSBuZXcgRGljdGlvbmFyeTxpbnQsIEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24+KCk7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgU3VidG90YWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbml0aWFsaXplKCk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwogCi0gICAgICAgIHByaXZhdGUgdm9pZCBJbml0aWFsaXplKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2Z1bmN0aW9uc1sxXSA9IG5ldyBBdmVyYWdlKCk7Ci0gICAgICAgICAgICBfZnVuY3Rpb25zWzJdID0gbmV3IENvdW50KCk7Ci0gICAgICAgICAgICBfZnVuY3Rpb25zWzNdID0gbmV3IENvdW50QSgpOwotICAgICAgICAgICAgX2Z1bmN0aW9uc1s0XSA9IG5ldyBNYXgoKTsKLSAgICAgICAgICAgIF9mdW5jdGlvbnNbNV0gPSBuZXcgTWluKCk7Ci0gICAgICAgICAgICBfZnVuY3Rpb25zWzZdID0gbmV3IFByb2R1Y3QoKTsKLSAgICAgICAgICAgIF9mdW5jdGlvbnNbN10gPSBuZXcgU3RkZXYoKTsKLSAgICAgICAgICAgIF9mdW5jdGlvbnNbOF0gPSBuZXcgU3RkZXZQKCk7Ci0gICAgICAgICAgICBfZnVuY3Rpb25zWzldID0gbmV3IFN1bSgpOwotICAgICAgICAgICAgX2Z1bmN0aW9uc1sxMF0gPSBuZXcgVmFyKCk7Ci0gICAgICAgICAgICBfZnVuY3Rpb25zWzExXSA9IG5ldyBWYXJQKCk7CitwdWJsaWMgY2xhc3MgU3VidG90YWwgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHJpdmF0ZSBEaWN0aW9uYXJ5PGludCwgSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbj4gX2Z1bmN0aW9ucyA9IG5ldygpOwogCi0gICAgICAgICAgICBBZGRIaWRkZW5WYWx1ZUhhbmRsaW5nRnVuY3Rpb24obmV3IEF2ZXJhZ2UoKSwgMTAxKTsKLSAgICAgICAgICAgIEFkZEhpZGRlblZhbHVlSGFuZGxpbmdGdW5jdGlvbihuZXcgQ291bnQoKSwgMTAyKTsKLSAgICAgICAgICAgIEFkZEhpZGRlblZhbHVlSGFuZGxpbmdGdW5jdGlvbihuZXcgQ291bnRBKCksIDEwMyk7Ci0gICAgICAgICAgICBBZGRIaWRkZW5WYWx1ZUhhbmRsaW5nRnVuY3Rpb24obmV3IE1heCgpLCAxMDQpOwotICAgICAgICAgICAgQWRkSGlkZGVuVmFsdWVIYW5kbGluZ0Z1bmN0aW9uKG5ldyBNaW4oKSwgMTA1KTsKLSAgICAgICAgICAgIEFkZEhpZGRlblZhbHVlSGFuZGxpbmdGdW5jdGlvbihuZXcgUHJvZHVjdCgpLCAxMDYpOwotICAgICAgICAgICAgQWRkSGlkZGVuVmFsdWVIYW5kbGluZ0Z1bmN0aW9uKG5ldyBTdGRldigpLCAxMDcpOwotICAgICAgICAgICAgQWRkSGlkZGVuVmFsdWVIYW5kbGluZ0Z1bmN0aW9uKG5ldyBTdGRldlAoKSwgMTA4KTsKLSAgICAgICAgICAgIEFkZEhpZGRlblZhbHVlSGFuZGxpbmdGdW5jdGlvbihuZXcgU3VtKCksIDEwOSk7Ci0gICAgICAgICAgICBBZGRIaWRkZW5WYWx1ZUhhbmRsaW5nRnVuY3Rpb24obmV3IFZhcigpLCAxMTApOwotICAgICAgICAgICAgQWRkSGlkZGVuVmFsdWVIYW5kbGluZ0Z1bmN0aW9uKG5ldyBWYXJQKCksIDExMSk7Ci0gICAgICAgIH0KKyAgcHVibGljIFN1YnRvdGFsKCkgeworICAgIEluaXRpYWxpemUoKTsKKyAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBBZGRIaWRkZW5WYWx1ZUhhbmRsaW5nRnVuY3Rpb24oSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbiBmdW5jLCBpbnQgZnVuY051bSkKLSAgICAgICAgewotICAgICAgICAgICAgZnVuYy5JZ25vcmVIaWRkZW5WYWx1ZXMgPSB0cnVlOwotICAgICAgICAgICAgX2Z1bmN0aW9uc1tmdW5jTnVtXSA9IGZ1bmM7Ci0gICAgICAgIH0KKyAgcHJpdmF0ZSB2b2lkIEluaXRpYWxpemUoKSB7CisgICAgX2Z1bmN0aW9uc1sxXSA9IG5ldyBBdmVyYWdlKCk7CisgICAgX2Z1bmN0aW9uc1syXSA9IG5ldyBDb3VudCgpOworICAgIF9mdW5jdGlvbnNbM10gPSBuZXcgQ291bnRBKCk7CisgICAgX2Z1bmN0aW9uc1s0XSA9IG5ldyBNYXgoKTsKKyAgICBfZnVuY3Rpb25zWzVdID0gbmV3IE1pbigpOworICAgIF9mdW5jdGlvbnNbNl0gPSBuZXcgUHJvZHVjdCgpOworICAgIF9mdW5jdGlvbnNbN10gPSBuZXcgU3RkZXYoKTsKKyAgICBfZnVuY3Rpb25zWzhdID0gbmV3IFN0ZGV2UCgpOworICAgIF9mdW5jdGlvbnNbOV0gPSBuZXcgU3VtKCk7CisgICAgX2Z1bmN0aW9uc1sxMF0gPSBuZXcgVmFyKCk7CisgICAgX2Z1bmN0aW9uc1sxMV0gPSBuZXcgVmFyUCgpOwogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIEJlZm9yZUludm9rZShQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlLkJlZm9yZUludm9rZShjb250ZXh0KTsKLSAgICAgICAgICAgIGNvbnRleHQuU2NvcGVzLkN1cnJlbnQuSXNTdWJ0b3RhbCA9IHRydWU7Ci0gICAgICAgIH0KKyAgICBBZGRIaWRkZW5WYWx1ZUhhbmRsaW5nRnVuY3Rpb24obmV3IEF2ZXJhZ2UoKSwgMTAxKTsKKyAgICBBZGRIaWRkZW5WYWx1ZUhhbmRsaW5nRnVuY3Rpb24obmV3IENvdW50KCksIDEwMik7CisgICAgQWRkSGlkZGVuVmFsdWVIYW5kbGluZ0Z1bmN0aW9uKG5ldyBDb3VudEEoKSwgMTAzKTsKKyAgICBBZGRIaWRkZW5WYWx1ZUhhbmRsaW5nRnVuY3Rpb24obmV3IE1heCgpLCAxMDQpOworICAgIEFkZEhpZGRlblZhbHVlSGFuZGxpbmdGdW5jdGlvbihuZXcgTWluKCksIDEwNSk7CisgICAgQWRkSGlkZGVuVmFsdWVIYW5kbGluZ0Z1bmN0aW9uKG5ldyBQcm9kdWN0KCksIDEwNik7CisgICAgQWRkSGlkZGVuVmFsdWVIYW5kbGluZ0Z1bmN0aW9uKG5ldyBTdGRldigpLCAxMDcpOworICAgIEFkZEhpZGRlblZhbHVlSGFuZGxpbmdGdW5jdGlvbihuZXcgU3RkZXZQKCksIDEwOCk7CisgICAgQWRkSGlkZGVuVmFsdWVIYW5kbGluZ0Z1bmN0aW9uKG5ldyBTdW0oKSwgMTA5KTsKKyAgICBBZGRIaWRkZW5WYWx1ZUhhbmRsaW5nRnVuY3Rpb24obmV3IFZhcigpLCAxMTApOworICAgIEFkZEhpZGRlblZhbHVlSGFuZGxpbmdGdW5jdGlvbihuZXcgVmFyUCgpLCAxMTEpOworICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgZnVuY051bSA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICBpZiAoY29udGV4dC5TY29wZXMuQ3VycmVudC5QYXJlbnQgIT0gbnVsbCAmJiBjb250ZXh0LlNjb3Blcy5DdXJyZW50LlBhcmVudC5Jc1N1YnRvdGFsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoMGQsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIGFjdHVhbEFyZ3MgPSBhcmd1bWVudHMuU2tpcCgxKTsKLSAgICAgICAgICAgIEV4Y2VsRnVuY3Rpb24gZnVuY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgZnVuY3Rpb24gPSBHZXRGdW5jdGlvbkJ5Q2FsY1R5cGUoZnVuY051bSk7Ci0gICAgICAgICAgICB2YXIgY29tcGlsZVJlc3VsdCA9IGZ1bmN0aW9uLkV4ZWN1dGUoYWN0dWFsQXJncywgY29udGV4dCk7Ci0gICAgICAgICAgICBjb21waWxlUmVzdWx0LklzUmVzdWx0T2ZTdWJ0b3RhbCA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gY29tcGlsZVJlc3VsdDsKLSAgICAgICAgfQorICBwcml2YXRlIHZvaWQgQWRkSGlkZGVuVmFsdWVIYW5kbGluZ0Z1bmN0aW9uKEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24gZnVuYywgaW50IGZ1bmNOdW0pIHsKKyAgICBmdW5jLklnbm9yZUhpZGRlblZhbHVlcyA9IHRydWU7CisgICAgX2Z1bmN0aW9uc1tmdW5jTnVtXSA9IGZ1bmM7CisgIH0KIAotICAgICAgICBwcml2YXRlIEV4Y2VsRnVuY3Rpb24gR2V0RnVuY3Rpb25CeUNhbGNUeXBlKGludCBmdW5jTnVtKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9mdW5jdGlvbnMuQ29udGFpbnNLZXkoZnVuY051bSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZnVuY051bSAiICsgZnVuY051bSArICIsIHZhbGlkIHJhbmdlcyBhcmUgMS0xMSBhbmQgMTAxLTExMSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIF9mdW5jdGlvbnNbZnVuY051bV07Ci0gICAgICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIHZvaWQgQmVmb3JlSW52b2tlKFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBiYXNlLkJlZm9yZUludm9rZShjb250ZXh0KTsKKyAgICBjb250ZXh0LlNjb3Blcy5DdXJyZW50LklzU3VidG90YWwgPSB0cnVlOworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgIHZhciBmdW5jTnVtID0gQXJnVG9JbnQoYXJndW1lbnRzLCAwKTsKKyAgICBpZiAoY29udGV4dC5TY29wZXMuQ3VycmVudC5QYXJlbnQgIT0gbnVsbCAmJiBjb250ZXh0LlNjb3Blcy5DdXJyZW50LlBhcmVudC5Jc1N1YnRvdGFsKSB7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KDBkLCBEYXRhVHlwZS5EZWNpbWFsKTsKICAgICB9CisgICAgdmFyIGFjdHVhbEFyZ3MgPSBhcmd1bWVudHMuU2tpcCgxKTsKKyAgICBFeGNlbEZ1bmN0aW9uIGZ1bmN0aW9uID0gbnVsbDsKKyAgICBmdW5jdGlvbiA9IEdldEZ1bmN0aW9uQnlDYWxjVHlwZShmdW5jTnVtKTsKKyAgICB2YXIgY29tcGlsZVJlc3VsdCA9IGZ1bmN0aW9uLkV4ZWN1dGUoYWN0dWFsQXJncywgY29udGV4dCk7CisgICAgY29tcGlsZVJlc3VsdC5Jc1Jlc3VsdE9mU3VidG90YWwgPSB0cnVlOworICAgIHJldHVybiBjb21waWxlUmVzdWx0OworICB9CisKKyAgcHJpdmF0ZSBFeGNlbEZ1bmN0aW9uIEdldEZ1bmN0aW9uQnlDYWxjVHlwZShpbnQgZnVuY051bSkgeworICAgIGlmICghX2Z1bmN0aW9ucy5Db250YWluc0tleShmdW5jTnVtKSkgeworICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5WYWx1ZSk7CisgICAgICAvL3Rocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBmdW5jTnVtICIgKyBmdW5jTnVtICsgIiwgdmFsaWQgcmFuZ2VzIGFyZSAxLTExIGFuZCAxMDEtMTExIik7CisgICAgfQorICAgIHJldHVybiBfZnVuY3Rpb25zW2Z1bmNOdW1dOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VtLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1bS5jcwppbmRleCA0Y2M3ZDI0Li41ZDM1NTBlIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VtLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW0uY3MKQEAgLTcsNzggKzcsNjEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgU3VtIDogSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXRWYWwgPSAwZDsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudHMgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldFZhbCArPSBDYWxjdWxhdGUoYXJnLCBjb250ZXh0KTsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmV0VmFsLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CiAKLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgZG91YmxlIENhbGN1bGF0ZShGdW5jdGlvbkFyZ3VtZW50IGFyZywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJldFZhbCA9IDBkOwotICAgICAgICAgICAgaWYgKFNob3VsZElnbm9yZShhcmcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXJnLlZhbHVlIGlzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIChJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PilhcmcuVmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gQ2FsY3VsYXRlKGl0ZW0sIGNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGFyZy5WYWx1ZSBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjIGluIChFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKWFyZy5WYWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChTaG91bGRJZ25vcmUoYywgY29udGV4dCkgPT0gZmFsc2UpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCArPSBjLlZhbHVlRG91YmxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihhcmcpOwotICAgICAgICAgICAgICAgIHJldFZhbCArPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShhcmcuVmFsdWUsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIFN1bSA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHZhciByZXRWYWwgPSAwZDsKKyAgICBpZiAoYXJndW1lbnRzICE9IG51bGwpIHsKKyAgICAgIGZvcmVhY2ggKHZhciBhcmcgaW4gYXJndW1lbnRzKSB7CisgICAgICAgIHJldFZhbCArPSBDYWxjdWxhdGUoYXJnLCBjb250ZXh0KTsKKyAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXRWYWwsIERhdGFUeXBlLkRlY2ltYWwpOworICB9CisKKyAgcHJpdmF0ZSBkb3VibGUgQ2FsY3VsYXRlKEZ1bmN0aW9uQXJndW1lbnQgYXJnLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgdmFyIHJldFZhbCA9IDBkOworICAgIGlmIChTaG91bGRJZ25vcmUoYXJnKSkgeworICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisgICAgaWYgKGFyZy5WYWx1ZSBpcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PikgeworICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KWFyZy5WYWx1ZSkgeworICAgICAgICByZXRWYWwgKz0gQ2FsY3VsYXRlKGl0ZW0sIGNvbnRleHQpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXJnLlZhbHVlIGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pIHsKKyAgICAgIGZvcmVhY2ggKHZhciBjIGluIChFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKWFyZy5WYWx1ZSkgeworICAgICAgICBpZiAoU2hvdWxkSWdub3JlKGMsIGNvbnRleHQpID09IGZhbHNlKSB7CisgICAgICAgICAgQ2hlY2tGb3JBbmRIYW5kbGVFeGNlbEVycm9yKGMpOworICAgICAgICAgIHJldFZhbCArPSBjLlZhbHVlRG91YmxlOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihhcmcpOworICAgICAgcmV0VmFsICs9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZy5WYWx1ZSwgdHJ1ZSk7CisgICAgfQorICAgIHJldHVybiByZXRWYWw7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW1JZi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW1JZi5jcwppbmRleCAzYzUwZDNlLi4xNzUwYzRlIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VtSWYuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1bUlmLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpAQCAtNywxNzAgKzcsMTYxIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKLXVzaW5nIFV0aWw9T2ZmaWNlT3BlblhtbC5VdGlsczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7Cit1c2luZyBVdGlsID0gT2ZmaWNlT3BlblhtbC5VdGlsczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgU3VtSWYgOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yIF9ldmFsdWF0b3I7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKIAotICAgICAgICBwdWJsaWMgU3VtSWYoKQotICAgICAgICAgICAgOiB0aGlzKG5ldyBOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvcigpKQotICAgICAgICB7CitwdWJsaWMgY2xhc3MgU3VtSWYgOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uIHsKKyAgcHJpdmF0ZSByZWFkb25seSBOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvciBfZXZhbHVhdG9yOwogCi0gICAgICAgIH0KKyAgcHVibGljIFN1bUlmKCkKKyAgICAgIDogdGhpcyhuZXcoKSkge30KIAotICAgICAgICBwdWJsaWMgU3VtSWYoTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgZXZhbHVhdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQoZXZhbHVhdG9yKS5OYW1lZCgiZXZhbHVhdG9yIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICBfZXZhbHVhdG9yID0gZXZhbHVhdG9yOwotICAgICAgICB9CisgIHB1YmxpYyBTdW1JZihOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvciBldmFsdWF0b3IpIHsKKyAgICBSZXF1aXJlLlRoYXQoZXZhbHVhdG9yKS5OYW1lZCgiZXZhbHVhdG9yIikuSXNOb3ROdWxsKCk7CisgICAgX2V2YWx1YXRvciA9IGV2YWx1YXRvcjsKKyAgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87IC8vSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD47Ci0gICAgICAgICAgICB2YXIgY3JpdGVyaWEgPSBhcmd1bWVudHMuRWxlbWVudEF0KDEpLlZhbHVlOwotICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiBjcml0ZXJpYSA9PSBudWxsIHx8IGNyaXRlcmlhLlRvU3RyaW5nKCkuTGVuZ3RoID4gMjU1LCBlRXJyb3JUeXBlLlZhbHVlKTsKLSAgICAgICAgICAgIHZhciByZXRWYWwgPSAwZDsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA+IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHN1bVJhbmdlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZSBhcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvOy8vSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD47Ci0gICAgICAgICAgICAgICAgcmV0VmFsID0gQ2FsY3VsYXRlV2l0aFN1bVJhbmdlKGFyZ3MsIGNyaXRlcmlhLlRvU3RyaW5nKCksIHN1bVJhbmdlLCBjb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gQ2FsY3VsYXRlU2luZ2xlUmFuZ2UoYXJncywgY3JpdGVyaWEuVG9TdHJpbmcoKSwgY29udGV4dCk7ICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IENhbGN1bGF0ZVNpbmdsZVJhbmdlKChhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlIGFzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaWEuVG9TdHJpbmcoKSwgY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXRWYWwsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgQ2FsY3VsYXRlV2l0aFN1bVJhbmdlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IHJhbmdlLCBzdHJpbmcgY3JpdGVyaWEsIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IHN1bVJhbmdlLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmV0VmFsID0gMGQ7Ci0gICAgICAgICAgICB2YXIgZmxhdHRlbmVkUmFuZ2UgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKHJhbmdlLCBjb250ZXh0KTsKLSAgICAgICAgICAgIHZhciBmbGF0dGVuZWRTdW1SYW5nZSA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoc3VtUmFuZ2UsIGNvbnRleHQpOwotICAgICAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBmbGF0dGVuZWRSYW5nZS5Db3VudCgpOyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IGZsYXR0ZW5lZFN1bVJhbmdlLkVsZW1lbnRBdCh4KTsKLSAgICAgICAgICAgICAgICBpZiAoX2V2YWx1YXRvci5FdmFsdWF0ZShmbGF0dGVuZWRSYW5nZS5FbGVtZW50QXQoeCksIGNyaXRlcmlhKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldFZhbCArPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZG91YmxlIENhbGN1bGF0ZVdpdGhTdW1SYW5nZShFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvIHJhbmdlLCBzdHJpbmcgY3JpdGVyaWEsIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8gc3VtUmFuZ2UsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXRWYWwgPSAwZDsKLSAgICAgICAgICAgIGZvcmVhY2godmFyIGNlbGwgaW4gcmFuZ2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9ldmFsdWF0b3IuRXZhbHVhdGUoY2VsbC5WYWx1ZSwgY3JpdGVyaWEpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIG9yID0gY2VsbC5Sb3ctcmFuZ2UuQWRkcmVzcy5fZnJvbVJvdzsKLSAgICAgICAgICAgICAgICAgICAgdmFyIG9jID0gY2VsbC5Db2x1bW4gLSByYW5nZS5BZGRyZXNzLl9mcm9tQ29sOwotICAgICAgICAgICAgICAgICAgICBpZihzdW1SYW5nZS5BZGRyZXNzLl9mcm9tUm93K29yIDw9IHN1bVJhbmdlLkFkZHJlc3MuX3RvUm93ICYmIAotICAgICAgICAgICAgICAgICAgICAgICBzdW1SYW5nZS5BZGRyZXNzLl9mcm9tQ29sK29jIDw9IHN1bVJhbmdlLkFkZHJlc3MuX3RvQ29sKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgdiA9IHN1bVJhbmdlLkdldE9mZnNldChvciwgb2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgaXMgRXhjZWxFcnJvclZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKChFeGNlbEVycm9yVmFsdWUpdikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IFV0aWwuQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUodiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0VmFsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBkb3VibGUgQ2FsY3VsYXRlU2luZ2xlUmFuZ2UoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJncywgc3RyaW5nIGV4cHJlc3Npb24sIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXRWYWwgPSAwZDsKLSAgICAgICAgICAgIHZhciBmbGF0dGVuZGVkUmFuZ2UgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKGFyZ3MsIGNvbnRleHQpOwotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNhbmRpZGF0ZSBpbiBmbGF0dGVuZGVkUmFuZ2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9ldmFsdWF0b3IuRXZhbHVhdGUoY2FuZGlkYXRlLCBleHByZXNzaW9uKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldFZhbCArPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZG91YmxlIENhbGN1bGF0ZVNpbmdsZVJhbmdlKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8gcmFuZ2UsIHN0cmluZyBleHByZXNzaW9uLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmV0VmFsID0gMGQ7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgY2FuZGlkYXRlIGluIHJhbmdlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZXZhbHVhdG9yLkV2YWx1YXRlKGNhbmRpZGF0ZS5WYWx1ZSwgZXhwcmVzc2lvbikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlLklzRXhjZWxFcnJvcikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oKEV4Y2VsRXJyb3JWYWx1ZSljYW5kaWRhdGUuVmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gY2FuZGlkYXRlLlZhbHVlRG91YmxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXRWYWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvL3ByaXZhdGUgZG91YmxlIENhbGN1bGF0ZShGdW5jdGlvbkFyZ3VtZW50IGFyZywgc3RyaW5nIGV4cHJlc3Npb24pCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICB2YXIgcmV0VmFsID0gMGQ7Ci0gICAgICAgIC8vICAgIGlmIChTaG91bGRJZ25vcmUoYXJnKSB8fCAhX2V2YWx1YXRvci5FdmFsdWF0ZShhcmcuVmFsdWUsIGV4cHJlc3Npb24pKQotICAgICAgICAvLyAgICB7Ci0gICAgICAgIC8vICAgICAgICByZXR1cm4gcmV0VmFsOwotICAgICAgICAvLyAgICB9Ci0gICAgICAgIC8vICAgIGlmIChhcmcuVmFsdWUgaXMgZG91YmxlIHx8IGFyZy5WYWx1ZSBpcyBpbnQpCi0gICAgICAgIC8vICAgIHsKLSAgICAgICAgLy8gICAgICAgIHJldFZhbCArPSBDb252ZXJ0LlRvRG91YmxlKGFyZy5WYWx1ZSk7Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy8gICAgZWxzZSBpZiAoYXJnLlZhbHVlIGlzIFN5c3RlbS5EYXRlVGltZSkKLSAgICAgICAgLy8gICAgewotICAgICAgICAvLyAgICAgICAgcmV0VmFsICs9IENvbnZlcnQuVG9EYXRlVGltZShhcmcuVmFsdWUpLlRvT0FEYXRlKCk7Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy8gICAgZWxzZSBpZiAoYXJnLlZhbHVlIGlzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KQotICAgICAgICAvLyAgICB7Ci0gICAgICAgIC8vICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiAoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pYXJnLlZhbHVlKQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIHJldFZhbCArPSBDYWxjdWxhdGUoaXRlbSwgZXhwcmVzc2lvbik7Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy8gICAgcmV0dXJuIHJldFZhbDsKLSAgICAgICAgLy99CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICB2YXIgYXJncyA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWUgYXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbzsgLy9JRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PjsKKyAgICB2YXIgY3JpdGVyaWEgPSBhcmd1bWVudHMuRWxlbWVudEF0KDEpLlZhbHVlOworICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uSWYoCisgICAgICAgICgpID0+IGNyaXRlcmlhID09IG51bGwgfHwgY3JpdGVyaWEuVG9TdHJpbmcoKS5MZW5ndGggPiAyNTUsCisgICAgICAgIGVFcnJvclR5cGUuVmFsdWUpOworICAgIHZhciByZXRWYWwgPSAwZDsKKyAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiAyKSB7CisgICAgICB2YXIgc3VtUmFuZ2UgPSBhcmd1bWVudHMuRWxlbWVudEF0KDIpLlZhbHVlIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87IC8vSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD47CisgICAgICByZXRWYWwgPSBDYWxjdWxhdGVXaXRoU3VtUmFuZ2UoYXJncywgY3JpdGVyaWEuVG9TdHJpbmcoKSwgc3VtUmFuZ2UsIGNvbnRleHQpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoYXJncyAhPSBudWxsKSB7CisgICAgICAgIHJldFZhbCA9IENhbGN1bGF0ZVNpbmdsZVJhbmdlKGFyZ3MsIGNyaXRlcmlhLlRvU3RyaW5nKCksIGNvbnRleHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0VmFsID0gQ2FsY3VsYXRlU2luZ2xlUmFuZ2UoCisgICAgICAgICAgICAoYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZSBhcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiksCisgICAgICAgICAgICBjcml0ZXJpYS5Ub1N0cmluZygpLAorICAgICAgICAgICAgY29udGV4dCk7CisgICAgICB9CiAgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmV0VmFsLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQorCisgIHByaXZhdGUgZG91YmxlIENhbGN1bGF0ZVdpdGhTdW1SYW5nZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IHJhbmdlLAorICAgICAgc3RyaW5nIGNyaXRlcmlhLAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gc3VtUmFuZ2UsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgdmFyIHJldFZhbCA9IDBkOworICAgIHZhciBmbGF0dGVuZWRSYW5nZSA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUocmFuZ2UsIGNvbnRleHQpOworICAgIHZhciBmbGF0dGVuZWRTdW1SYW5nZSA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoc3VtUmFuZ2UsIGNvbnRleHQpOworICAgIGZvciAodmFyIHggPSAwOyB4IDwgZmxhdHRlbmVkUmFuZ2UuQ291bnQoKTsgeCsrKSB7CisgICAgICB2YXIgY2FuZGlkYXRlID0gZmxhdHRlbmVkU3VtUmFuZ2UuRWxlbWVudEF0KHgpOworICAgICAgaWYgKF9ldmFsdWF0b3IuRXZhbHVhdGUoZmxhdHRlbmVkUmFuZ2UuRWxlbWVudEF0KHgpLCBjcml0ZXJpYSkpIHsKKyAgICAgICAgcmV0VmFsICs9IGNhbmRpZGF0ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldFZhbDsKKyAgfQorCisgIHByaXZhdGUgZG91YmxlIENhbGN1bGF0ZVdpdGhTdW1SYW5nZSgKKyAgICAgIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8gcmFuZ2UsCisgICAgICBzdHJpbmcgY3JpdGVyaWEsCisgICAgICBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvIHN1bVJhbmdlLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHZhciByZXRWYWwgPSAwZDsKKyAgICBmb3JlYWNoICh2YXIgY2VsbCBpbiByYW5nZSkgeworICAgICAgaWYgKF9ldmFsdWF0b3IuRXZhbHVhdGUoY2VsbC5WYWx1ZSwgY3JpdGVyaWEpKSB7CisgICAgICAgIHZhciBvciA9IGNlbGwuUm93IC0gcmFuZ2UuQWRkcmVzcy5fZnJvbVJvdzsKKyAgICAgICAgdmFyIG9jID0gY2VsbC5Db2x1bW4gLSByYW5nZS5BZGRyZXNzLl9mcm9tQ29sOworICAgICAgICBpZiAoc3VtUmFuZ2UuQWRkcmVzcy5fZnJvbVJvdyArIG9yIDw9IHN1bVJhbmdlLkFkZHJlc3MuX3RvUm93CisgICAgICAgICAgICAmJiBzdW1SYW5nZS5BZGRyZXNzLl9mcm9tQ29sICsgb2MgPD0gc3VtUmFuZ2UuQWRkcmVzcy5fdG9Db2wpIHsKKyAgICAgICAgICB2YXIgdiA9IHN1bVJhbmdlLkdldE9mZnNldChvciwgb2MpOworICAgICAgICAgIGlmICh2IGlzIEV4Y2VsRXJyb3JWYWx1ZSkgeworICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oKEV4Y2VsRXJyb3JWYWx1ZSl2KSk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldFZhbCArPSBVdGlsLkNvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKHYsIHRydWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXRWYWw7CisgIH0KKworICBwcml2YXRlIGRvdWJsZSBDYWxjdWxhdGVTaW5nbGVSYW5nZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3MsCisgICAgICBzdHJpbmcgZXhwcmVzc2lvbiwKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICB2YXIgcmV0VmFsID0gMGQ7CisgICAgdmFyIGZsYXR0ZW5kZWRSYW5nZSA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoYXJncywgY29udGV4dCk7CisgICAgZm9yZWFjaCAodmFyIGNhbmRpZGF0ZSBpbiBmbGF0dGVuZGVkUmFuZ2UpIHsKKyAgICAgIGlmIChfZXZhbHVhdG9yLkV2YWx1YXRlKGNhbmRpZGF0ZSwgZXhwcmVzc2lvbikpIHsKKyAgICAgICAgcmV0VmFsICs9IGNhbmRpZGF0ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldFZhbDsKKyAgfQorCisgIHByaXZhdGUgZG91YmxlIENhbGN1bGF0ZVNpbmdsZVJhbmdlKAorICAgICAgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyByYW5nZSwKKyAgICAgIHN0cmluZyBleHByZXNzaW9uLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHZhciByZXRWYWwgPSAwZDsKKyAgICBmb3JlYWNoICh2YXIgY2FuZGlkYXRlIGluIHJhbmdlKSB7CisgICAgICBpZiAoX2V2YWx1YXRvci5FdmFsdWF0ZShjYW5kaWRhdGUuVmFsdWUsIGV4cHJlc3Npb24pKSB7CisgICAgICAgIGlmIChjYW5kaWRhdGUuSXNFeGNlbEVycm9yKSB7CisgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oKEV4Y2VsRXJyb3JWYWx1ZSljYW5kaWRhdGUuVmFsdWUpKTsKKyAgICAgICAgfQorICAgICAgICByZXRWYWwgKz0gY2FuZGlkYXRlLlZhbHVlRG91YmxlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0VmFsOworICB9CisKKyAgLy9wcml2YXRlIGRvdWJsZSBDYWxjdWxhdGUoRnVuY3Rpb25Bcmd1bWVudCBhcmcsIHN0cmluZyBleHByZXNzaW9uKQorICAvL3sKKyAgLy8gICAgdmFyIHJldFZhbCA9IDBkOworICAvLyAgICBpZiAoU2hvdWxkSWdub3JlKGFyZykgfHwgIV9ldmFsdWF0b3IuRXZhbHVhdGUoYXJnLlZhbHVlLCBleHByZXNzaW9uKSkKKyAgLy8gICAgeworICAvLyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgLy8gICAgfQorICAvLyAgICBpZiAoYXJnLlZhbHVlIGlzIGRvdWJsZSB8fCBhcmcuVmFsdWUgaXMgaW50KQorICAvLyAgICB7CisgIC8vICAgICAgICByZXRWYWwgKz0gQ29udmVydC5Ub0RvdWJsZShhcmcuVmFsdWUpOworICAvLyAgICB9CisgIC8vICAgIGVsc2UgaWYgKGFyZy5WYWx1ZSBpcyBTeXN0ZW0uRGF0ZVRpbWUpCisgIC8vICAgIHsKKyAgLy8gICAgICAgIHJldFZhbCArPSBDb252ZXJ0LlRvRGF0ZVRpbWUoYXJnLlZhbHVlKS5Ub09BRGF0ZSgpOworICAvLyAgICB9CisgIC8vICAgIGVsc2UgaWYgKGFyZy5WYWx1ZSBpcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PikKKyAgLy8gICAgeworICAvLyAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+KWFyZy5WYWx1ZSkKKyAgLy8gICAgICAgIHsKKyAgLy8gICAgICAgICAgICByZXRWYWwgKz0gQ2FsY3VsYXRlKGl0ZW0sIGV4cHJlc3Npb24pOworICAvLyAgICAgICAgfQorICAvLyAgICB9CisgIC8vICAgIHJldHVybiByZXRWYWw7CisgIC8vfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1bUlmcy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW1JZnMuY3MKaW5kZXggYWVmYWVhMC4uNzJlZDY5NiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1bUlmcy5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VtSWZzLmNzCkBAIC03LDYwICs3LDYzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgU3VtSWZzIDogTXVsdGlwbGVSYW5nZUNyaXRlcmlhc0Z1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJndW1lbnRzID0gYXJndW1lbnRzIGFzIEZ1bmN0aW9uQXJndW1lbnRbXSA/PyBhcmd1bWVudHMuVG9BcnJheSgpOwotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoZnVuY3Rpb25Bcmd1bWVudHMsIDMpOwotICAgICAgICAgICAgdmFyIHN1bVJhbmdlID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZSh0cnVlLCBuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PiB7ZnVuY3Rpb25Bcmd1bWVudHNbMF19LCBjb250ZXh0KS5Ub0xpc3QoKTsKLSAgICAgICAgICAgIHZhciBhcmdSYW5nZXMgPSBuZXcgTGlzdDxFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvPigpOwotICAgICAgICAgICAgdmFyIGNyaXRlcmlhcyA9IG5ldyBMaXN0PG9iamVjdD4oKTsKLSAgICAgICAgICAgIGZvciAodmFyIGl4ID0gMTsgaXggPCAzMTsgaXggKz0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25Bcmd1bWVudHMuTGVuZ3RoIDw9IGl4KSBicmVhazsKLSAgICAgICAgICAgICAgICB2YXIgcmFuZ2VJbmZvID0gZnVuY3Rpb25Bcmd1bWVudHNbaXhdLlZhbHVlQXNSYW5nZUluZm87Ci0gICAgICAgICAgICAgICAgYXJnUmFuZ2VzLkFkZChyYW5nZUluZm8pOwotICAgICAgICAgICAgICAgIGlmIChpeCA+IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IHJhbmdlSW5mby5HZXROQ2VsbHMoKSAhPSBhcmdSYW5nZXNbMF0uR2V0TkNlbGxzKCksIGVFcnJvclR5cGUuVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjcml0ZXJpYXMuQWRkKGZ1bmN0aW9uQXJndW1lbnRzW2l4ICsgMV0uVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSUVudW1lcmFibGU8aW50PiBtYXRjaEluZGV4ZXMgPSBHZXRNYXRjaEluZGV4ZXMoYXJnUmFuZ2VzWzBdLCBjcml0ZXJpYXNbMF0pOwotICAgICAgICAgICAgdmFyIGVudW1lcmFibGUgPSBtYXRjaEluZGV4ZXMgYXMgSUxpc3Q8aW50PiA/PyBtYXRjaEluZGV4ZXMuVG9MaXN0KCk7Ci0gICAgICAgICAgICBmb3IgKHZhciBpeCA9IDE7IGl4IDwgYXJnUmFuZ2VzLkNvdW50ICYmIGVudW1lcmFibGUuQW55KCk7IGl4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGluZGV4ZXMgPSBHZXRNYXRjaEluZGV4ZXMoYXJnUmFuZ2VzW2l4XSwgY3JpdGVyaWFzW2l4XSk7Ci0gICAgICAgICAgICAgICAgbWF0Y2hJbmRleGVzID0gZW51bWVyYWJsZS5JbnRlcnNlY3QoaW5kZXhlcyk7Ci0gICAgICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKIAotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG1hdGNoSW5kZXhlcy5TdW0oaW5kZXggPT4gc3VtUmFuZ2VbaW5kZXhdKTsKLQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgU3VtSWZzIDogTXVsdGlwbGVSYW5nZUNyaXRlcmlhc0Z1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICB2YXIgZnVuY3Rpb25Bcmd1bWVudHMgPSBhcmd1bWVudHMgYXMgRnVuY3Rpb25Bcmd1bWVudFtdID8/IGFyZ3VtZW50cy5Ub0FycmF5KCk7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoZnVuY3Rpb25Bcmd1bWVudHMsIDMpOworICAgIHZhciBzdW1SYW5nZSA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoCisgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgbmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4geyBmdW5jdGlvbkFyZ3VtZW50c1swXSB9LAorICAgICAgICAgICAgY29udGV4dCkKKyAgICAgICAgLlRvTGlzdCgpOworICAgIHZhciBhcmdSYW5nZXMgPSBuZXcgTGlzdDxFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvPigpOworICAgIHZhciBjcml0ZXJpYXMgPSBuZXcgTGlzdDxvYmplY3Q+KCk7CisgICAgZm9yICh2YXIgaXggPSAxOyBpeCA8IDMxOyBpeCArPSAyKSB7CisgICAgICBpZiAoZnVuY3Rpb25Bcmd1bWVudHMuTGVuZ3RoIDw9IGl4KSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgdmFyIHJhbmdlSW5mbyA9IGZ1bmN0aW9uQXJndW1lbnRzW2l4XS5WYWx1ZUFzUmFuZ2VJbmZvOworICAgICAgYXJnUmFuZ2VzLkFkZChyYW5nZUluZm8pOworICAgICAgaWYgKGl4ID4gMSkgeworICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKAorICAgICAgICAgICAgKCkgPT4gcmFuZ2VJbmZvLkdldE5DZWxscygpICE9IGFyZ1Jhbmdlc1swXS5HZXROQ2VsbHMoKSwKKyAgICAgICAgICAgIGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgfQorICAgICAgY3JpdGVyaWFzLkFkZChmdW5jdGlvbkFyZ3VtZW50c1tpeCArIDFdLlZhbHVlKTsKICAgICB9CisgICAgSUVudW1lcmFibGU8aW50PiBtYXRjaEluZGV4ZXMgPSBHZXRNYXRjaEluZGV4ZXMoYXJnUmFuZ2VzWzBdLCBjcml0ZXJpYXNbMF0pOworICAgIHZhciBlbnVtZXJhYmxlID0gbWF0Y2hJbmRleGVzIGFzIElMaXN0PGludD4gPz8gbWF0Y2hJbmRleGVzLlRvTGlzdCgpOworICAgIGZvciAodmFyIGl4ID0gMTsgaXggPCBhcmdSYW5nZXMuQ291bnQgJiYgZW51bWVyYWJsZS5BbnkoKTsgaXgrKykgeworICAgICAgdmFyIGluZGV4ZXMgPSBHZXRNYXRjaEluZGV4ZXMoYXJnUmFuZ2VzW2l4XSwgY3JpdGVyaWFzW2l4XSk7CisgICAgICBtYXRjaEluZGV4ZXMgPSBlbnVtZXJhYmxlLkludGVyc2VjdChpbmRleGVzKTsKKyAgICB9CisKKyAgICB2YXIgcmVzdWx0ID0gbWF0Y2hJbmRleGVzLlN1bShpbmRleCA9PiBzdW1SYW5nZVtpbmRleF0pOworCisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3VtUHJvZHVjdC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW1Qcm9kdWN0LmNzCmluZGV4IDVlZTZkZTUuLjY5ODVlYjcgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW1Qcm9kdWN0LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW1Qcm9kdWN0LmNzCkBAIC03LDEwMCArNyw4MCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIFN1bVByb2R1Y3QgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIGRvdWJsZSByZXN1bHQgPSAwZDsKLSAgICAgICAgICAgIExpc3Q8TGlzdDxkb3VibGU+PiByZXN1bHRzID0gbmV3IExpc3Q8TGlzdDxkb3VibGU+PigpOwotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGFyZyBpbiBhcmd1bWVudHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0cy5BZGQobmV3IExpc3Q8ZG91YmxlPigpKTsKLSAgICAgICAgICAgICAgICB2YXIgY3VycmVudFJlc3VsdCA9IHJlc3VsdHMuTGFzdCgpOwotICAgICAgICAgICAgICAgIGlmIChhcmcuVmFsdWUgaXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgdmFsIGluIChJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PilhcmcuVmFsdWUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZFZhbHVlKHZhbC5WYWx1ZSwgY3VycmVudFJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoYXJnLlZhbHVlIGlzIEZ1bmN0aW9uQXJndW1lbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBZGRWYWx1ZShhcmcuVmFsdWUsIGN1cnJlbnRSZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChhcmcuSXNFeGNlbFJhbmdlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIHI9YXJnLlZhbHVlQXNSYW5nZUluZm87Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHIuQWRkcmVzcy5fZnJvbUNvbDsgY29sIDw9IHIuQWRkcmVzcy5fdG9Db2w7IGNvbCsrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCByb3cgPSByLkFkZHJlc3MuX2Zyb21Sb3c7IHJvdyA8PSByLkFkZHJlc3MuX3RvUm93OyByb3crKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRWYWx1ZShyLkdldFZhbHVlKHJvdyxjb2wpLCBjdXJyZW50UmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgYWxsIHN1cHBsaWVkIGxpc3RzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoCi0gICAgICAgICAgICB2YXIgYXJyYXlMZW5ndGggPSByZXN1bHRzLkZpcnN0KCkuQ291bnQ7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgbGlzdCBpbiByZXN1bHRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChsaXN0LkNvdW50ICE9IGFycmF5TGVuZ3RoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXhjZWxGdW5jdGlvbkV4Y2VwdGlvbigiQWxsIHN1cHBsaWVkIGFycmF5cyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIiwgRXhjZWxFcnJvckNvZGVzLlZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHZhciByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgYXJyYXlMZW5ndGg7IHJvd0luZGV4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHJvd1Jlc3VsdCA9IDE7Ci0gICAgICAgICAgICAgICAgZm9yICh2YXIgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IHJlc3VsdHMuQ291bnQ7IGNvbEluZGV4KyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByb3dSZXN1bHQgKj0gcmVzdWx0c1tjb2xJbmRleF1bcm93SW5kZXhdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHQgKz0gcm93UmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKIAotICAgICAgICBwcml2YXRlIHZvaWQgQWRkVmFsdWUob2JqZWN0IGNvbnZlcnRWYWwsIExpc3Q8ZG91YmxlPiBjdXJyZW50UmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoSXNOdW1lcmljKGNvbnZlcnRWYWwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGN1cnJlbnRSZXN1bHQuQWRkKENvbnZlcnQuVG9Eb3VibGUoY29udmVydFZhbCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoY29udmVydFZhbCBpcyBFeGNlbEVycm9yVmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oKEV4Y2VsRXJyb3JWYWx1ZSljb252ZXJ0VmFsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY3VycmVudFJlc3VsdC5BZGQoMGQpOwotICAgICAgICAgICAgfQorcHVibGljIGNsYXNzIFN1bVByb2R1Y3QgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIGRvdWJsZSByZXN1bHQgPSAwZDsKKyAgICBMaXN0PExpc3Q8ZG91YmxlPj4gcmVzdWx0cyA9IG5ldyBMaXN0PExpc3Q8ZG91YmxlPj4oKTsKKyAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykgeworICAgICAgcmVzdWx0cy5BZGQobmV3KCkpOworICAgICAgdmFyIGN1cnJlbnRSZXN1bHQgPSByZXN1bHRzLkxhc3QoKTsKKyAgICAgIGlmIChhcmcuVmFsdWUgaXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pIHsKKyAgICAgICAgZm9yZWFjaCAodmFyIHZhbCBpbiAoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pYXJnLlZhbHVlKSB7CisgICAgICAgICAgQWRkVmFsdWUodmFsLlZhbHVlLCBjdXJyZW50UmVzdWx0KTsKICAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChhcmcuVmFsdWUgaXMgRnVuY3Rpb25Bcmd1bWVudCkgeworICAgICAgICBBZGRWYWx1ZShhcmcuVmFsdWUsIGN1cnJlbnRSZXN1bHQpOworICAgICAgfSBlbHNlIGlmIChhcmcuSXNFeGNlbFJhbmdlKSB7CisgICAgICAgIHZhciByID0gYXJnLlZhbHVlQXNSYW5nZUluZm87CisgICAgICAgIGZvciAoaW50IGNvbCA9IHIuQWRkcmVzcy5fZnJvbUNvbDsgY29sIDw9IHIuQWRkcmVzcy5fdG9Db2w7IGNvbCsrKSB7CisgICAgICAgICAgZm9yIChpbnQgcm93ID0gci5BZGRyZXNzLl9mcm9tUm93OyByb3cgPD0gci5BZGRyZXNzLl90b1Jvdzsgcm93KyspIHsKKyAgICAgICAgICAgIEFkZFZhbHVlKHIuR2V0VmFsdWUocm93LCBjb2wpLCBjdXJyZW50UmVzdWx0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9CisgICAgLy8gVmFsaWRhdGUgdGhhdCBhbGwgc3VwcGxpZWQgbGlzdHMgaGF2ZSB0aGUgc2FtZSBsZW5ndGgKKyAgICB2YXIgYXJyYXlMZW5ndGggPSByZXN1bHRzLkZpcnN0KCkuQ291bnQ7CisgICAgZm9yZWFjaCAodmFyIGxpc3QgaW4gcmVzdWx0cykgeworICAgICAgaWYgKGxpc3QuQ291bnQgIT0gYXJyYXlMZW5ndGgpIHsKKyAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpKTsKKyAgICAgICAgLy90aHJvdyBuZXcgRXhjZWxGdW5jdGlvbkV4Y2VwdGlvbigiQWxsIHN1cHBsaWVkIGFycmF5cyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIiwgRXhjZWxFcnJvckNvZGVzLlZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yICh2YXIgcm93SW5kZXggPSAwOyByb3dJbmRleCA8IGFycmF5TGVuZ3RoOyByb3dJbmRleCsrKSB7CisgICAgICBkb3VibGUgcm93UmVzdWx0ID0gMTsKKyAgICAgIGZvciAodmFyIGNvbEluZGV4ID0gMDsgY29sSW5kZXggPCByZXN1bHRzLkNvdW50OyBjb2xJbmRleCsrKSB7CisgICAgICAgIHJvd1Jlc3VsdCAqPSByZXN1bHRzW2NvbEluZGV4XVtyb3dJbmRleF07CisgICAgICB9CisgICAgICByZXN1bHQgKz0gcm93UmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgQWRkVmFsdWUob2JqZWN0IGNvbnZlcnRWYWwsIExpc3Q8ZG91YmxlPiBjdXJyZW50UmVzdWx0KSB7CisgICAgaWYgKElzTnVtZXJpYyhjb252ZXJ0VmFsKSkgeworICAgICAgY3VycmVudFJlc3VsdC5BZGQoQ29udmVydC5Ub0RvdWJsZShjb252ZXJ0VmFsKSk7CisgICAgfSBlbHNlIGlmIChjb252ZXJ0VmFsIGlzIEV4Y2VsRXJyb3JWYWx1ZSkgeworICAgICAgdGhyb3cgKG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oKEV4Y2VsRXJyb3JWYWx1ZSljb252ZXJ0VmFsKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGN1cnJlbnRSZXN1bHQuQWRkKDBkKTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW1zcS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9TdW1zcS5jcwppbmRleCAyYTRhMDc3Li45YmI1NmQzIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvU3Vtc3EuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1N1bXNxLmNzCkBAIC0xLDY5ICsxLDUwIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Civvu791c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgU3Vtc3EgOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJldFZhbCA9IDBkOwotICAgICAgICAgICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhcmcgaW4gYXJndW1lbnRzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IENhbGN1bGF0ZShhcmcsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmV0VmFsLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CiAKLQotICAgICAgICBwcml2YXRlIGRvdWJsZSBDYWxjdWxhdGUoRnVuY3Rpb25Bcmd1bWVudCBhcmcsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQsIGJvb2wgaXNJbkFycmF5ID0gZmFsc2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXRWYWwgPSAwZDsKLSAgICAgICAgICAgIGlmIChTaG91bGRJZ25vcmUoYXJnKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFyZy5WYWx1ZSBpcyBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiAoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pYXJnLlZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IENhbGN1bGF0ZShpdGVtLCBjb250ZXh0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGNzID0gYXJnLlZhbHVlIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87Ci0gICAgICAgICAgICAgICAgaWYgKGNzICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgYyBpbiBjcykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNob3VsZElnbm9yZShjLCBjb250ZXh0KSA9PSBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IFN5c3RlbS5NYXRoLlBvdyhjLlZhbHVlRG91YmxlLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoYXJnKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKElzTnVtZXJpY1N0cmluZyhhcmcuVmFsdWUpICYmICFpc0luQXJyYXkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZy5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLk1hdGguUG93KHZhbHVlLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2YXIgaWdub3JlQm9vbCA9IGlzSW5BcnJheTsKLSAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IFN5c3RlbS5NYXRoLlBvdyhDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShhcmcuVmFsdWUsIGlnbm9yZUJvb2wpLCAyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0VmFsOwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgU3Vtc3EgOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICB2YXIgcmV0VmFsID0gMGQ7CisgICAgaWYgKGFyZ3VtZW50cyAhPSBudWxsKSB7CisgICAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykgeworICAgICAgICByZXRWYWwgKz0gQ2FsY3VsYXRlKGFyZywgY29udGV4dCk7CisgICAgICB9CiAgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmV0VmFsLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQorCisgIHByaXZhdGUgZG91YmxlIENhbGN1bGF0ZShGdW5jdGlvbkFyZ3VtZW50IGFyZywgUGFyc2luZ0NvbnRleHQgY29udGV4dCwgYm9vbCBpc0luQXJyYXkgPSBmYWxzZSkgeworICAgIHZhciByZXRWYWwgPSAwZDsKKyAgICBpZiAoU2hvdWxkSWdub3JlKGFyZykpIHsKKyAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorICAgIGlmIChhcmcuVmFsdWUgaXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4pIHsKKyAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIChJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PilhcmcuVmFsdWUpIHsKKyAgICAgICAgcmV0VmFsICs9IENhbGN1bGF0ZShpdGVtLCBjb250ZXh0LCB0cnVlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdmFyIGNzID0gYXJnLlZhbHVlIGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87CisgICAgICBpZiAoY3MgIT0gbnVsbCkgeworICAgICAgICBmb3JlYWNoICh2YXIgYyBpbiBjcykgeworICAgICAgICAgIGlmIChTaG91bGRJZ25vcmUoYywgY29udGV4dCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIENoZWNrRm9yQW5kSGFuZGxlRXhjZWxFcnJvcihjKTsKKyAgICAgICAgICAgIHJldFZhbCArPSBTeXN0ZW0uTWF0aC5Qb3coYy5WYWx1ZURvdWJsZSwgMik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBDaGVja0ZvckFuZEhhbmRsZUV4Y2VsRXJyb3IoYXJnKTsKKyAgICAgICAgaWYgKElzTnVtZXJpY1N0cmluZyhhcmcuVmFsdWUpICYmICFpc0luQXJyYXkpIHsKKyAgICAgICAgICB2YXIgdmFsdWUgPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShhcmcuVmFsdWUpOworICAgICAgICAgIHJldHVybiBTeXN0ZW0uTWF0aC5Qb3codmFsdWUsIDIpOworICAgICAgICB9CisgICAgICAgIHZhciBpZ25vcmVCb29sID0gaXNJbkFycmF5OworICAgICAgICByZXRWYWwgKz0gU3lzdGVtLk1hdGguUG93KENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKGFyZy5WYWx1ZSwgaWdub3JlQm9vbCksIDIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0VmFsOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVGFuLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1Rhbi5jcwppbmRleCBiMTViYWI2Li5kZDg1NjUyIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVGFuLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9UYW4uY3MKQEAgLTcsMzYgKzcsMzMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBUYW4gOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmcgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguVGFuKGFyZyksIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGg7CisKK3B1YmxpYyBjbGFzcyBUYW4gOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBhcmcgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KFN5c3RlbS5NYXRoLlRhbihhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1RhbmguY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVGFuaC5jcwppbmRleCA2YjIzMzNiLi5lMmU0ZjE0IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVGFuaC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVGFuaC5jcwpAQCAtNywzNiArNywzMyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoCi17Ci0gICAgcHVibGljIGNsYXNzIFRhbmggOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmcgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguVGFuaChhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgVGFuaCA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIGFyZyA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQoU3lzdGVtLk1hdGguVGFuaChhcmcpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1RydW5jLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1RydW5jLmNzCmluZGV4IGZjMjFmZWEuLjM3MzAzODIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9UcnVuYy5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVHJ1bmMuY3MKQEAgLTcsNDMgKzcsMzkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNC0wMS0wNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBUcnVuYyA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIG51bWJlciA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID09IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5UcnVuY2F0ZShudW1iZXIpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBuRGlnaXRzID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBmdW5jID0gY29udGV4dC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeS5HZXRGdW5jdGlvbigicm91bmRkb3duIik7Ci0gICAgICAgICAgICByZXR1cm4gZnVuYy5FeGVjdXRlKGFyZ3VtZW50cywgY29udGV4dCk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgVHJ1bmMgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBudW1iZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPT0gMSkgeworICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChTeXN0ZW0uTWF0aC5UcnVuY2F0ZShudW1iZXIpLCBEYXRhVHlwZS5EZWNpbWFsKTsKICAgICB9CisgICAgdmFyIG5EaWdpdHMgPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOworICAgIHZhciBmdW5jID0gY29udGV4dC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeS5HZXRGdW5jdGlvbigicm91bmRkb3duIik7CisgICAgcmV0dXJuIGZ1bmMuRXhlY3V0ZShhcmd1bWVudHMsIGNvbnRleHQpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVmFyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1Zhci5jcwppbmRleCBjMThlN2M1Li5iMzJiMTY1IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVmFyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9WYXIuY3MKQEAgLTcsMzcgKzcsMzMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIHB1YmxpYyBjbGFzcyBWYXIgOiBIaWRkZW5WYWx1ZXNIYW5kbGluZ0Z1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gQXJnc1RvRG91YmxlRW51bWVyYWJsZShJZ25vcmVIaWRkZW5WYWx1ZXMsIGZhbHNlLCBhcmd1bWVudHMsIGNvbnRleHQpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KFZhck1ldGhvZHMuVmFyKGFyZ3MpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgVmFyIDogSGlkZGVuVmFsdWVzSGFuZGxpbmdGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgYXJncyA9IEFyZ3NUb0RvdWJsZUVudW1lcmFibGUoSWdub3JlSGlkZGVuVmFsdWVzLCBmYWxzZSwgYXJndW1lbnRzLCBjb250ZXh0KTsKKyAgICByZXR1cm4gbmV3KFZhck1ldGhvZHMuVmFyKGFyZ3MpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9NYXRoL1Zhck1ldGhvZHMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVmFyTWV0aG9kcy5jcwppbmRleCBlNDhkY2I5Li5kMTJkZGY4IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVmFyTWV0aG9kcy5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVmFyTWV0aG9kcy5jcwpAQCAtNyw1MiArNyw0NSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTA0LTE5CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aAotewotICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBWYXJNZXRob2RzCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBkb3VibGUgRGl2aWRlKGRvdWJsZSBsZWZ0LCBkb3VibGUgcmlnaHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChTeXN0ZW0uTWF0aC5BYnMocmlnaHQgLSAwZCkgPCBkb3VibGUuRXBzaWxvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUuRGl2MCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbGVmdCAvIHJpZ2h0OwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKIAotICAgICAgICBwdWJsaWMgc3RhdGljIGRvdWJsZSBWYXIoSUVudW1lcmFibGU8ZG91YmxlPiBhcmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGUgYXZnID0gYXJncy5BdmVyYWdlKCk7Ci0gICAgICAgICAgICBkb3VibGUgZCA9IGFyZ3MuQWdncmVnYXRlKDAuMCwgKHRvdGFsLCBuZXh0KSA9PiB0b3RhbCArPSBTeXN0ZW0uTWF0aC5Qb3cobmV4dCAtIGF2ZywgMikpOwotICAgICAgICAgICAgcmV0dXJuIERpdmlkZShkLCAoYXJncy5Db3VudCgpIC0gMSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBkb3VibGUgVmFyUChJRW51bWVyYWJsZTxkb3VibGU+IGFyZ3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZSBhdmcgPSBhcmdzLkF2ZXJhZ2UoKTsKLSAgICAgICAgICAgIGRvdWJsZSBkID0gYXJncy5BZ2dyZWdhdGUoMC4wLCAodG90YWwsIG5leHQpID0+IHRvdGFsICs9IFN5c3RlbS5NYXRoLlBvdyhuZXh0IC0gYXZnLCAyKSk7Ci0gICAgICAgICAgICByZXR1cm4gRGl2aWRlKGQsIGFyZ3MuQ291bnQoKSk7IAotICAgICAgICB9CitpbnRlcm5hbCBzdGF0aWMgY2xhc3MgVmFyTWV0aG9kcyB7CisgIHByaXZhdGUgc3RhdGljIGRvdWJsZSBEaXZpZGUoZG91YmxlIGxlZnQsIGRvdWJsZSByaWdodCkgeworICAgIGlmIChTeXN0ZW0uTWF0aC5BYnMocmlnaHQgLSAwZCkgPCBkb3VibGUuRXBzaWxvbikgeworICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLkRpdjApOwogICAgIH0KKyAgICByZXR1cm4gbGVmdCAvIHJpZ2h0OworICB9CisKKyAgcHVibGljIHN0YXRpYyBkb3VibGUgVmFyKElFbnVtZXJhYmxlPGRvdWJsZT4gYXJncykgeworICAgIGRvdWJsZSBhdmcgPSBhcmdzLkF2ZXJhZ2UoKTsKKyAgICBkb3VibGUgZCA9IGFyZ3MuQWdncmVnYXRlKDAuMCwgKHRvdGFsLCBuZXh0KSA9PiB0b3RhbCArPSBTeXN0ZW0uTWF0aC5Qb3cobmV4dCAtIGF2ZywgMikpOworICAgIHJldHVybiBEaXZpZGUoZCwgKGFyZ3MuQ291bnQoKSAtIDEpKTsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZG91YmxlIFZhclAoSUVudW1lcmFibGU8ZG91YmxlPiBhcmdzKSB7CisgICAgZG91YmxlIGF2ZyA9IGFyZ3MuQXZlcmFnZSgpOworICAgIGRvdWJsZSBkID0gYXJncy5BZ2dyZWdhdGUoMC4wLCAodG90YWwsIG5leHQpID0+IHRvdGFsICs9IFN5c3RlbS5NYXRoLlBvdyhuZXh0IC0gYXZnLCAyKSk7CisgICAgcmV0dXJuIERpdmlkZShkLCBhcmdzLkNvdW50KCkpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL01hdGgvVmFyUC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9WYXJQLmNzCmluZGV4IDE1OWZlMTguLjFhZmFiOTIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9WYXJQLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTWF0aC9WYXJQLmNzCkBAIC03LDM2ICs3LDMzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk1hdGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgVmFyUCA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKElnbm9yZUhpZGRlblZhbHVlcywgZmFsc2UsIGFyZ3VtZW50cywgY29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoVmFyTWV0aG9kcy5WYXJQKGFyZ3MpLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOworCitwdWJsaWMgY2xhc3MgVmFyUCA6IEhpZGRlblZhbHVlc0hhbmRsaW5nRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIGFyZ3MgPSBBcmdzVG9Eb3VibGVFbnVtZXJhYmxlKElnbm9yZUhpZGRlblZhbHVlcywgZmFsc2UsIGFyZ3VtZW50cywgY29udGV4dCk7CisgICAgcmV0dXJuIG5ldyhWYXJNZXRob2RzLlZhclAoYXJncyksIERhdGFUeXBlLkRlY2ltYWwpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL051bWVyaWMvQ0ludC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTnVtZXJpYy9DSW50LmNzCmluZGV4IDFlNmY2YWYuLjA0ODJkZTggMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTnVtZXJpYy9DSW50LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvTnVtZXJpYy9DSW50LmNzCkBAIC03LDM3ICs3LDMzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk51bWVyaWMKLXsKLSAgICBwdWJsaWMgY2xhc3MgQ0ludCA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIG51bSA9IEFyZ1RvRGVjaW1hbChhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCgoaW50KVN5c3RlbS5NYXRoLkZsb29yKG51bSksIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9Ci0gICAgfQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLk51bWVyaWM7CisKK3B1YmxpYyBjbGFzcyBDSW50IDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgbnVtID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCgoaW50KVN5c3RlbS5NYXRoLkZsb29yKG51bSksIERhdGFUeXBlLkludGVnZXIpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL09iamVjdEVudW1lcmFibGVBcmdDb252ZXJ0ZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL09iamVjdEVudW1lcmFibGVBcmdDb252ZXJ0ZXIuY3MKaW5kZXggZDZmYzdiYS4uNzFjNTI1MiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9PYmplY3RFbnVtZXJhYmxlQXJnQ29udmVydGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvT2JqZWN0RW51bWVyYWJsZUFyZ0NvbnZlcnRlci5jcwpAQCAtNyw1MiArNyw0MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zCi17Ci0gICAgcHVibGljIGNsYXNzIE9iamVjdEVudW1lcmFibGVBcmdDb252ZXJ0ZXIgOiBDb2xsZWN0aW9uRmxhdHRlbmVyPG9iamVjdD4KLSAgICB7Ci0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIElFbnVtZXJhYmxlPG9iamVjdD4gQ29udmVydEFyZ3MoYm9vbCBpZ25vcmVIaWRkZW4sIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJhc2UuRnVuY0FyZ3NUb0ZsYXRFbnVtZXJhYmxlKGFyZ3VtZW50cywgKGFyZywgYXJnTGlzdCkgPT4KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhcmcuVmFsdWUgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGNlbGwgaW4gKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pYXJnLlZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2VsbFN0YXRlSGVscGVyLlNob3VsZElnbm9yZShpZ25vcmVIaWRkZW4sIGNlbGwsIGNvbnRleHQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnTGlzdC5BZGQoY2VsbC5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICBhcmdMaXN0LkFkZChhcmcuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgIDsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKIAotICAgICAgICB9Ci0gICAgfQorcHVibGljIGNsYXNzIE9iamVjdEVudW1lcmFibGVBcmdDb252ZXJ0ZXIgOiBDb2xsZWN0aW9uRmxhdHRlbmVyPG9iamVjdD4geworICBwdWJsaWMgdmlydHVhbCBJRW51bWVyYWJsZTxvYmplY3Q+IENvbnZlcnRBcmdzKAorICAgICAgYm9vbCBpZ25vcmVIaWRkZW4sCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgcmV0dXJuIGJhc2UuRnVuY0FyZ3NUb0ZsYXRFbnVtZXJhYmxlKAorICAgICAgICBhcmd1bWVudHMsCisgICAgICAgIChhcmcsIGFyZ0xpc3QpID0+IHsKKyAgICAgICAgICBpZiAoYXJnLlZhbHVlIGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pIHsKKyAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjZWxsIGluIChFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKWFyZy5WYWx1ZSkgeworICAgICAgICAgICAgICBpZiAoIUNlbGxTdGF0ZUhlbHBlci5TaG91bGRJZ25vcmUoaWdub3JlSGlkZGVuLCBjZWxsLCBjb250ZXh0KSkgeworICAgICAgICAgICAgICAgIGFyZ0xpc3QuQWRkKGNlbGwuVmFsdWUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFyZ0xpc3QuQWRkKGFyZy5WYWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQWRkcmVzcy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0FkZHJlc3MuY3MKaW5kZXggYTgwZDRhNS4uM2Q3NTUyNSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQWRkcmVzcy5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9BZGRyZXNzLmNzCkBAIC03LDY1ICs3LDU4IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAotewotICAgIHB1YmxpYyBjbGFzcyBBZGRyZXNzIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgcm93ID0gQXJnVG9JbnQoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHZhciBjb2wgPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiByb3cgPCAwICYmIGNvbCA8IDAsIGVFcnJvclR5cGUuVmFsdWUpOwotICAgICAgICAgICAgdmFyIHJlZmVyZW5jZVR5cGUgPSBFeGNlbFJlZmVyZW5jZVR5cGUuQWJzb2x1dGVSb3dBbmRDb2x1bW47Ci0gICAgICAgICAgICB2YXIgd29ya3NoZWV0U3BlYyA9IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA+IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGFyZzMgPSBBcmdUb0ludChhcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uSWYoKCkgPT4gYXJnMyA8IDEgfHwgYXJnMyA+IDQsIGVFcnJvclR5cGUuVmFsdWUpOwotICAgICAgICAgICAgICAgIHJlZmVyZW5jZVR5cGUgPSAoRXhjZWxSZWZlcmVuY2VUeXBlKUFyZ1RvSW50KGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiAzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBmb3VydGhBcmcgPSBhcmd1bWVudHMuRWxlbWVudEF0KDMpLlZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChmb3VydGhBcmcgaXMgYm9vbCAmJiAhKGJvb2wpZm91cnRoQXJnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkV4Y2VsZm9ybXVsYXBhcnNlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSBSMUMxIGZvcm1hdCEiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiA0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBmaWZ0aEFyZyA9IGFyZ3VtZW50cy5FbGVtZW50QXQoNCkuVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGZpZnRoQXJnIGlzIHN0cmluZyAmJiAhc3RyaW5nLklzTnVsbE9yRW1wdHkoZmlmdGhBcmcuVG9TdHJpbmcoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3b3Jrc2hlZXRTcGVjID0gZmlmdGhBcmcgKyAiISI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHRyYW5zbGF0b3IgPSBuZXcgSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yKGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIsIHJlZmVyZW5jZVR5cGUpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh3b3Jrc2hlZXRTcGVjICsgdHJhbnNsYXRvci5Ub0FkZHJlc3MoY29sLCByb3cpLCBEYXRhVHlwZS5FeGNlbEFkZHJlc3MpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwOworCitwdWJsaWMgY2xhc3MgQWRkcmVzcyA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7CisgICAgdmFyIHJvdyA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMCk7CisgICAgdmFyIGNvbCA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CisgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiByb3cgPCAwICYmIGNvbCA8IDAsIGVFcnJvclR5cGUuVmFsdWUpOworICAgIHZhciByZWZlcmVuY2VUeXBlID0gRXhjZWxSZWZlcmVuY2VUeXBlLkFic29sdXRlUm93QW5kQ29sdW1uOworICAgIHZhciB3b3Jrc2hlZXRTcGVjID0gc3RyaW5nLkVtcHR5OworICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA+IDIpIHsKKyAgICAgIHZhciBhcmczID0gQXJnVG9JbnQoYXJndW1lbnRzLCAyKTsKKyAgICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uSWYoKCkgPT4gYXJnMyA8IDEgfHwgYXJnMyA+IDQsIGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgcmVmZXJlbmNlVHlwZSA9IChFeGNlbFJlZmVyZW5jZVR5cGUpQXJnVG9JbnQoYXJndW1lbnRzLCAyKTsKICAgICB9CisgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID4gMykgeworICAgICAgdmFyIGZvdXJ0aEFyZyA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMykuVmFsdWU7CisgICAgICBpZiAoZm91cnRoQXJnIGlzIGJvb2wgJiYgIShib29sKWZvdXJ0aEFyZykgeworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiRXhjZWxmb3JtdWxhcGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgdGhlIFIxQzEgZm9ybWF0ISIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiA0KSB7CisgICAgICB2YXIgZmlmdGhBcmcgPSBhcmd1bWVudHMuRWxlbWVudEF0KDQpLlZhbHVlOworICAgICAgaWYgKGZpZnRoQXJnIGlzIHN0cmluZyAmJiAhc3RyaW5nLklzTnVsbE9yRW1wdHkoZmlmdGhBcmcuVG9TdHJpbmcoKSkpIHsKKyAgICAgICAgd29ya3NoZWV0U3BlYyA9IGZpZnRoQXJnICsgIiEiOworICAgICAgfQorICAgIH0KKyAgICB2YXIgdHJhbnNsYXRvciA9IG5ldyBJbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IoY29udGV4dC5FeGNlbERhdGFQcm92aWRlciwgcmVmZXJlbmNlVHlwZSk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh3b3Jrc2hlZXRTcGVjICsgdHJhbnNsYXRvci5Ub0FkZHJlc3MoY29sLCByb3cpLCBEYXRhVHlwZS5FeGNlbEFkZHJlc3MpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9BcnJheUxvb2t1cE5hdmlnYXRvci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0FycmF5TG9va3VwTmF2aWdhdG9yLmNzCmluZGV4IGZkOTY1OWQuLmU1NTg0NjIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0FycmF5TG9va3VwTmF2aWdhdG9yLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0FycmF5TG9va3VwTmF2aWdhdG9yLmNzCkBAIC0xLDc4ICsxLDU5IEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Civvu791c2luZyBTeXN0ZW0uTGlucTsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwCi17Ci0gICAgcHVibGljIGNsYXNzIEFycmF5TG9va3VwTmF2aWdhdG9yIDogTG9va3VwTmF2aWdhdG9yCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZ1bmN0aW9uQXJndW1lbnRbXSBfYXJyYXlEYXRhOwotICAgICAgICBwcml2YXRlIGludCBfaW5kZXggPSAwOwotICAgICAgICBwcml2YXRlIG9iamVjdCBfY3VycmVudFZhbHVlOwotIAotICAgICAgICBwdWJsaWMgQXJyYXlMb29rdXBOYXZpZ2F0b3IoTG9va3VwRGlyZWN0aW9uIGRpcmVjdGlvbiwgTG9va3VwQXJndW1lbnRzIGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgcGFyc2luZ0NvbnRleHQpCi0gICAgICAgICAgICA6IGJhc2UoZGlyZWN0aW9uLCBhcmd1bWVudHMsIHBhcnNpbmdDb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQoYXJndW1lbnRzKS5OYW1lZCgiYXJndW1lbnRzIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQoYXJndW1lbnRzLkRhdGFBcnJheSkuTmFtZWQoImFyZ3VtZW50cy5EYXRhQXJyYXkiKS5Jc05vdE51bGwoKTsKLSAgICAgICAgICAgIF9hcnJheURhdGEgPSBhcmd1bWVudHMuRGF0YUFycmF5LlRvQXJyYXkoKTsKLSAgICAgICAgICAgIEluaXRpYWxpemUoKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cDsKIAotICAgICAgICBwcml2YXRlIHZvaWQgSW5pdGlhbGl6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChBcmd1bWVudHMuTG9va3VwSW5kZXggPj0gX2FycmF5RGF0YS5MZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlJlZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXRDdXJyZW50VmFsdWUoKTsKK3B1YmxpYyBjbGFzcyBBcnJheUxvb2t1cE5hdmlnYXRvciA6IExvb2t1cE5hdmlnYXRvciB7CisgIHByaXZhdGUgcmVhZG9ubHkgRnVuY3Rpb25Bcmd1bWVudFtdIF9hcnJheURhdGE7CisgIHByaXZhdGUgaW50IF9pbmRleDsKKyAgcHJpdmF0ZSBvYmplY3QgX2N1cnJlbnRWYWx1ZTsKIAotICAgICAgICB9CisgIHB1YmxpYyBBcnJheUxvb2t1cE5hdmlnYXRvcigKKyAgICAgIExvb2t1cERpcmVjdGlvbiBkaXJlY3Rpb24sCisgICAgICBMb29rdXBBcmd1bWVudHMgYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgcGFyc2luZ0NvbnRleHQpCisgICAgICA6IGJhc2UoZGlyZWN0aW9uLCBhcmd1bWVudHMsIHBhcnNpbmdDb250ZXh0KSB7CisgICAgUmVxdWlyZS5UaGF0KGFyZ3VtZW50cykuTmFtZWQoImFyZ3VtZW50cyIpLklzTm90TnVsbCgpOworICAgIFJlcXVpcmUuVGhhdChhcmd1bWVudHMuRGF0YUFycmF5KS5OYW1lZCgiYXJndW1lbnRzLkRhdGFBcnJheSIpLklzTm90TnVsbCgpOworICAgIF9hcnJheURhdGEgPSBhcmd1bWVudHMuRGF0YUFycmF5LlRvQXJyYXkoKTsKKyAgICBJbml0aWFsaXplKCk7CisgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEluZGV4Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfaW5kZXg7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBTZXRDdXJyZW50VmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfY3VycmVudFZhbHVlID0gX2FycmF5RGF0YVtfaW5kZXhdOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sIEhhc05leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoRGlyZWN0aW9uID09IExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2luZGV4IDwgKF9hcnJheURhdGEuTGVuZ3RoIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgTW92ZU5leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIUhhc05leHQoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKERpcmVjdGlvbiA9PSBMb29rdXBEaXJlY3Rpb24uVmVydGljYWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2luZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXRDdXJyZW50VmFsdWUoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBDdXJyZW50VmFsdWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9hcnJheURhdGFbX2luZGV4XS5WYWx1ZTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBHZXRMb29rdXBWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfYXJyYXlEYXRhW19pbmRleF0uVmFsdWU7Ci0gICAgICAgIH0KKyAgcHJpdmF0ZSB2b2lkIEluaXRpYWxpemUoKSB7CisgICAgaWYgKEFyZ3VtZW50cy5Mb29rdXBJbmRleCA+PSBfYXJyYXlEYXRhLkxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlJlZik7CiAgICAgfQorICAgIFNldEN1cnJlbnRWYWx1ZSgpOworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIGludCBJbmRleCA9PiBfaW5kZXg7CisKKyAgcHJpdmF0ZSB2b2lkIFNldEN1cnJlbnRWYWx1ZSgpIHsKKyAgICBfY3VycmVudFZhbHVlID0gX2FycmF5RGF0YVtfaW5kZXhdOworICB9CisKKyAgcHJpdmF0ZSBib29sIEhhc05leHQoKSB7CisgICAgaWYgKERpcmVjdGlvbiA9PSBMb29rdXBEaXJlY3Rpb24uVmVydGljYWwpIHsKKyAgICAgIHJldHVybiBfaW5kZXggPCAoX2FycmF5RGF0YS5MZW5ndGggLSAxKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIGJvb2wgTW92ZU5leHQoKSB7CisgICAgaWYgKCFIYXNOZXh0KCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKERpcmVjdGlvbiA9PSBMb29rdXBEaXJlY3Rpb24uVmVydGljYWwpIHsKKyAgICAgIF9pbmRleCsrOworICAgIH0KKyAgICBTZXRDdXJyZW50VmFsdWUoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgQ3VycmVudFZhbHVlID0+IF9hcnJheURhdGFbX2luZGV4XS5WYWx1ZTsKKworICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IEdldExvb2t1cFZhbHVlKCkgeworICAgIHJldHVybiBfYXJyYXlEYXRhW19pbmRleF0uVmFsdWU7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0Nob29zZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0Nob29zZS5jcwppbmRleCA0OTFjNmM2Li41OTk0NjdiIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9DaG9vc2UuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQ2hvb3NlLmNzCkBAIC03LDQxICs3LDM4IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAotewotICAgIHB1YmxpYyBjbGFzcyBDaG9vc2UgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKLSAgICAgICAgICAgIHZhciBpbmRleCA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICB2YXIgaXRlbXMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGFyZ3VtZW50cy5Db3VudCgpOyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXRlbXMuQWRkKGFyZ3VtZW50cy5FbGVtZW50QXQoeCkuVmFsdWVGaXJzdC5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoaXRlbXNbaW5kZXhdLCBEYXRhVHlwZS5TdHJpbmcpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwOworCitwdWJsaWMgY2xhc3MgQ2hvb3NlIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICB2YXIgaW5kZXggPSBBcmdUb0ludChhcmd1bWVudHMsIDApOworICAgIHZhciBpdGVtcyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IGFyZ3VtZW50cy5Db3VudCgpOyB4KyspIHsKKyAgICAgIGl0ZW1zLkFkZChhcmd1bWVudHMuRWxlbWVudEF0KHgpLlZhbHVlRmlyc3QuVG9TdHJpbmcoKSk7CiAgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQoaXRlbXNbaW5kZXhdLCBEYXRhVHlwZS5TdHJpbmcpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Db2x1bW4uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Db2x1bW4uY3MKaW5kZXggMzhlOTM2MC4uYzJiNDM2NiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQ29sdW1uLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0NvbHVtbi5jcwpAQCAtNyw0NiArNyw0MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAotewotICAgIHB1YmxpYyBjbGFzcyBDb2x1bW4gOiBMb29rdXBGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCB8fCBhcmd1bWVudHMuQ291bnQoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoY29udGV4dC5TY29wZXMuQ3VycmVudC5BZGRyZXNzLkZyb21Db2wsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHJhbmdlQWRkcmVzcyA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICBpZiAoIUV4Y2VsQWRkcmVzc1V0aWwuSXNWYWxpZEFkZHJlc3MocmFuZ2VBZGRyZXNzKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkFuIGludmFsaWQgYXJndW1lbnQgd2FzIHN1cHBsaWVkIik7Ci0gICAgICAgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIpOwotICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBmYWN0b3J5LkNyZWF0ZShyYW5nZUFkZHJlc3MpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChhZGRyZXNzLkZyb21Db2wsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwOworCitwdWJsaWMgY2xhc3MgQ29sdW1uIDogTG9va3VwRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCB8fCBhcmd1bWVudHMuQ291bnQoKSA9PSAwKSB7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGNvbnRleHQuU2NvcGVzLkN1cnJlbnQuQWRkcmVzcy5Gcm9tQ29sLCBEYXRhVHlwZS5JbnRlZ2VyKTsKICAgICB9CisgICAgdmFyIHJhbmdlQWRkcmVzcyA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7CisgICAgaWYgKCFFeGNlbEFkZHJlc3NVdGlsLklzVmFsaWRBZGRyZXNzKHJhbmdlQWRkcmVzcykpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQW4gaW52YWxpZCBhcmd1bWVudCB3YXMgc3VwcGxpZWQiKTsKKyAgICB9CisgICAgdmFyIGZhY3RvcnkgPSBuZXcgUmFuZ2VBZGRyZXNzRmFjdG9yeShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyKTsKKyAgICB2YXIgYWRkcmVzcyA9IGZhY3RvcnkuQ3JlYXRlKHJhbmdlQWRkcmVzcyk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChhZGRyZXNzLkZyb21Db2wsIERhdGFUeXBlLkludGVnZXIpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Db2x1bW5zLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvQ29sdW1ucy5jcwppbmRleCBkN2VmZjhhLi4yNzg2NGJiIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Db2x1bW5zLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0NvbHVtbnMuY3MKQEAgLTcsNTMgKzcsNDUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwotdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKLXsKLSAgICBwdWJsaWMgY2xhc3MgQ29sdW1ucyA6IExvb2t1cEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciByPWFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWVBc1JhbmdlSW5mbzsKLSAgICAgICAgICAgIGlmIChyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyLkFkZHJlc3MuX3RvQ29sIC0gci5BZGRyZXNzLl9mcm9tQ29sICsgMSwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAoRXhjZWxBZGRyZXNzVXRpbC5Jc1ZhbGlkQWRkcmVzcyhyYW5nZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IGZhY3RvcnkuQ3JlYXRlKHJhbmdlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChhZGRyZXNzLlRvQ29sIC0gYWRkcmVzcy5Gcm9tQ29sICsgMSwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJhbmdlIHN1cHBsaWVkIik7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXA7CisKK3B1YmxpYyBjbGFzcyBDb2x1bW5zIDogTG9va3VwRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIHIgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlQXNSYW5nZUluZm87CisgICAgaWYgKHIgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyLkFkZHJlc3MuX3RvQ29sIC0gci5BZGRyZXNzLl9mcm9tQ29sICsgMSwgRGF0YVR5cGUuSW50ZWdlcik7CiAgICAgfQorICAgIHZhciByYW5nZSA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7CisgICAgaWYgKEV4Y2VsQWRkcmVzc1V0aWwuSXNWYWxpZEFkZHJlc3MocmFuZ2UpKSB7CisgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIpOworICAgICAgdmFyIGFkZHJlc3MgPSBmYWN0b3J5LkNyZWF0ZShyYW5nZSk7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGFkZHJlc3MuVG9Db2wgLSBhZGRyZXNzLkZyb21Db2wgKyAxLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJhbmdlIHN1cHBsaWVkIik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0V4Y2VsTG9va3VwTmF2aWdhdG9yLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvRXhjZWxMb29rdXBOYXZpZ2F0b3IuY3MKaW5kZXggMzZhNWVhNS4uMTI0ZmIzZSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvRXhjZWxMb29rdXBOYXZpZ2F0b3IuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvRXhjZWxMb29rdXBOYXZpZ2F0b3IuY3MKQEAgLTcsMTE5ICs3LDEwMCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOworCiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwCi17Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsTG9va3VwTmF2aWdhdG9yIDogTG9va3VwTmF2aWdhdG9yCi0gICAgewotICAgICAgICBwcml2YXRlIGludCBfY3VycmVudFJvdzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgX2N1cnJlbnRDb2w7Ci0gICAgICAgIHByaXZhdGUgb2JqZWN0IF9jdXJyZW50VmFsdWU7Ci0gICAgICAgIHByaXZhdGUgUmFuZ2VBZGRyZXNzIF9yYW5nZUFkZHJlc3M7Ci0gICAgICAgIHByaXZhdGUgaW50IF9pbmRleDsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXA7CiAKLSAgICAgICAgcHVibGljIEV4Y2VsTG9va3VwTmF2aWdhdG9yKExvb2t1cERpcmVjdGlvbiBkaXJlY3Rpb24sIExvb2t1cEFyZ3VtZW50cyBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IHBhcnNpbmdDb250ZXh0KQotICAgICAgICAgICAgOiBiYXNlKGRpcmVjdGlvbiwgYXJndW1lbnRzLCBwYXJzaW5nQ29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgSW5pdGlhbGl6ZSgpOwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgRXhjZWxMb29rdXBOYXZpZ2F0b3IgOiBMb29rdXBOYXZpZ2F0b3IgeworICBwcml2YXRlIGludCBfY3VycmVudFJvdzsKKyAgcHJpdmF0ZSBpbnQgX2N1cnJlbnRDb2w7CisgIHByaXZhdGUgb2JqZWN0IF9jdXJyZW50VmFsdWU7CisgIHByaXZhdGUgUmFuZ2VBZGRyZXNzIF9yYW5nZUFkZHJlc3M7CisgIHByaXZhdGUgaW50IF9pbmRleDsKIAotICAgICAgICBwcml2YXRlIHZvaWQgSW5pdGlhbGl6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9pbmRleCA9IDA7Ci0gICAgICAgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KFBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyKTsKLSAgICAgICAgICAgIGlmIChBcmd1bWVudHMuUmFuZ2VJbmZvID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3JhbmdlQWRkcmVzcyA9IGZhY3RvcnkuQ3JlYXRlKFBhcnNpbmdDb250ZXh0LlNjb3Blcy5DdXJyZW50LkFkZHJlc3MuV29ya3NoZWV0LCBBcmd1bWVudHMuUmFuZ2VBZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcmFuZ2VBZGRyZXNzID0gZmFjdG9yeS5DcmVhdGUoQXJndW1lbnRzLlJhbmdlSW5mby5BZGRyZXNzLldvcmtTaGVldCwgQXJndW1lbnRzLlJhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2N1cnJlbnRDb2wgPSBfcmFuZ2VBZGRyZXNzLkZyb21Db2w7Ci0gICAgICAgICAgICBfY3VycmVudFJvdyA9IF9yYW5nZUFkZHJlc3MuRnJvbVJvdzsKLSAgICAgICAgICAgIFNldEN1cnJlbnRWYWx1ZSgpOwotICAgICAgICB9CisgIHB1YmxpYyBFeGNlbExvb2t1cE5hdmlnYXRvcigKKyAgICAgIExvb2t1cERpcmVjdGlvbiBkaXJlY3Rpb24sCisgICAgICBMb29rdXBBcmd1bWVudHMgYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgcGFyc2luZ0NvbnRleHQpCisgICAgICA6IGJhc2UoZGlyZWN0aW9uLCBhcmd1bWVudHMsIHBhcnNpbmdDb250ZXh0KSB7CisgICAgSW5pdGlhbGl6ZSgpOworICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEN1cnJlbnRWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jdXJyZW50VmFsdWUgPSBQYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlci5HZXRDZWxsVmFsdWUoX3JhbmdlQWRkcmVzcy5Xb3Jrc2hlZXQsIF9jdXJyZW50Um93LCBfY3VycmVudENvbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2wgSGFzTmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChEaXJlY3Rpb24gPT0gTG9va3VwRGlyZWN0aW9uLlZlcnRpY2FsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY3VycmVudFJvdyA8IF9yYW5nZUFkZHJlc3MuVG9Sb3c7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9jdXJyZW50Q29sIDwgX3JhbmdlQWRkcmVzcy5Ub0NvbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgSW5kZXgKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9pbmRleDsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgTW92ZU5leHQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIUhhc05leHQoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgaWYgKERpcmVjdGlvbiA9PSBMb29rdXBEaXJlY3Rpb24uVmVydGljYWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2N1cnJlbnRSb3crKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY3VycmVudENvbCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2luZGV4Kys7Ci0gICAgICAgICAgICBTZXRDdXJyZW50VmFsdWUoKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIG9iamVjdCBDdXJyZW50VmFsdWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9jdXJyZW50VmFsdWU7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgR2V0TG9va3VwVmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcm93ID0gX2N1cnJlbnRSb3c7Ci0gICAgICAgICAgICB2YXIgY29sID0gX2N1cnJlbnRDb2w7Ci0gICAgICAgICAgICBpZiAoRGlyZWN0aW9uID09IExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb2wgKz0gQXJndW1lbnRzLkxvb2t1cEluZGV4IC0gMTsKLSAgICAgICAgICAgICAgICByb3cgKz0gQXJndW1lbnRzLkxvb2t1cE9mZnNldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByb3cgKz0gQXJndW1lbnRzLkxvb2t1cEluZGV4IC0gMTsKLSAgICAgICAgICAgICAgICBjb2wgKz0gQXJndW1lbnRzLkxvb2t1cE9mZnNldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBQYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlci5HZXRDZWxsVmFsdWUoX3JhbmdlQWRkcmVzcy5Xb3Jrc2hlZXQsIHJvdywgY29sKTsgCi0gICAgICAgIH0KKyAgcHJpdmF0ZSB2b2lkIEluaXRpYWxpemUoKSB7CisgICAgX2luZGV4ID0gMDsKKyAgICB2YXIgZmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KFBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyKTsKKyAgICBpZiAoQXJndW1lbnRzLlJhbmdlSW5mbyA9PSBudWxsKSB7CisgICAgICBfcmFuZ2VBZGRyZXNzID0gZmFjdG9yeS5DcmVhdGUoCisgICAgICAgICAgUGFyc2luZ0NvbnRleHQuU2NvcGVzLkN1cnJlbnQuQWRkcmVzcy5Xb3Jrc2hlZXQsCisgICAgICAgICAgQXJndW1lbnRzLlJhbmdlQWRkcmVzcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9yYW5nZUFkZHJlc3MgPSBmYWN0b3J5LkNyZWF0ZSgKKyAgICAgICAgICBBcmd1bWVudHMuUmFuZ2VJbmZvLkFkZHJlc3MuV29ya1NoZWV0LAorICAgICAgICAgIEFyZ3VtZW50cy5SYW5nZUluZm8uQWRkcmVzcy5BZGRyZXNzKTsKICAgICB9CisgICAgX2N1cnJlbnRDb2wgPSBfcmFuZ2VBZGRyZXNzLkZyb21Db2w7CisgICAgX2N1cnJlbnRSb3cgPSBfcmFuZ2VBZGRyZXNzLkZyb21Sb3c7CisgICAgU2V0Q3VycmVudFZhbHVlKCk7CisgIH0KKworICBwcml2YXRlIHZvaWQgU2V0Q3VycmVudFZhbHVlKCkgeworICAgIF9jdXJyZW50VmFsdWUgPSBQYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlci5HZXRDZWxsVmFsdWUoCisgICAgICAgIF9yYW5nZUFkZHJlc3MuV29ya3NoZWV0LAorICAgICAgICBfY3VycmVudFJvdywKKyAgICAgICAgX2N1cnJlbnRDb2wpOworICB9CisKKyAgcHJpdmF0ZSBib29sIEhhc05leHQoKSB7CisgICAgaWYgKERpcmVjdGlvbiA9PSBMb29rdXBEaXJlY3Rpb24uVmVydGljYWwpIHsKKyAgICAgIHJldHVybiBfY3VycmVudFJvdyA8IF9yYW5nZUFkZHJlc3MuVG9Sb3c7CisgICAgfQorICAgIHJldHVybiBfY3VycmVudENvbCA8IF9yYW5nZUFkZHJlc3MuVG9Db2w7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgaW50IEluZGV4ID0+IF9pbmRleDsKKworICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBNb3ZlTmV4dCgpIHsKKyAgICBpZiAoIUhhc05leHQoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoRGlyZWN0aW9uID09IExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCkgeworICAgICAgX2N1cnJlbnRSb3crKzsKKyAgICB9IGVsc2UgeworICAgICAgX2N1cnJlbnRDb2wrKzsKKyAgICB9CisgICAgX2luZGV4Kys7CisgICAgU2V0Q3VycmVudFZhbHVlKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IEN1cnJlbnRWYWx1ZSA9PiBfY3VycmVudFZhbHVlOworCisgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgR2V0TG9va3VwVmFsdWUoKSB7CisgICAgdmFyIHJvdyA9IF9jdXJyZW50Um93OworICAgIHZhciBjb2wgPSBfY3VycmVudENvbDsKKyAgICBpZiAoRGlyZWN0aW9uID09IExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCkgeworICAgICAgY29sICs9IEFyZ3VtZW50cy5Mb29rdXBJbmRleCAtIDE7CisgICAgICByb3cgKz0gQXJndW1lbnRzLkxvb2t1cE9mZnNldDsKKyAgICB9IGVsc2UgeworICAgICAgcm93ICs9IEFyZ3VtZW50cy5Mb29rdXBJbmRleCAtIDE7CisgICAgICBjb2wgKz0gQXJndW1lbnRzLkxvb2t1cE9mZnNldDsKKyAgICB9CisgICAgcmV0dXJuIFBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLkdldENlbGxWYWx1ZShfcmFuZ2VBZGRyZXNzLldvcmtzaGVldCwgcm93LCBjb2wpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9ITG9va3VwLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvSExvb2t1cC5jcwppbmRleCAwZGMzOWI4Li5hMmVjNmEzIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9ITG9va3VwLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0hMb29rdXAuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKiBDb3B5cmlnaHQgKEMpIDIwMTEgIEphbiBLw6RsbG1hbgorLyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC03LDM5ICs3LDM1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKLXsKLSAgICBwdWJsaWMgY2xhc3MgSExvb2t1cCA6IExvb2t1cEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAzKTsKLSAgICAgICAgICAgIHZhciBsb29rdXBBcmdzID0gbmV3IExvb2t1cEFyZ3VtZW50cyhhcmd1bWVudHMpOwotICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiBsb29rdXBBcmdzLkxvb2t1cEluZGV4IDwgMSwgZUVycm9yVHlwZS5WYWx1ZSk7Ci0gICAgICAgICAgICB2YXIgbmF2aWdhdG9yID0gTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5DcmVhdGUoTG9va3VwRGlyZWN0aW9uLkhvcml6b250YWwsIGxvb2t1cEFyZ3MsIGNvbnRleHQpOwotICAgICAgICAgICAgcmV0dXJuIExvb2t1cChuYXZpZ2F0b3IsIGxvb2t1cEFyZ3MpOwotICAgICAgICB9Ci0gICAgfQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cDsKKworcHVibGljIGNsYXNzIEhMb29rdXAgOiBMb29rdXBGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAzKTsKKyAgICB2YXIgbG9va3VwQXJncyA9IG5ldyBMb29rdXBBcmd1bWVudHMoYXJndW1lbnRzKTsKKyAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IGxvb2t1cEFyZ3MuTG9va3VwSW5kZXggPCAxLCBlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICB2YXIgbmF2aWdhdG9yID0gTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5DcmVhdGUoTG9va3VwRGlyZWN0aW9uLkhvcml6b250YWwsIGxvb2t1cEFyZ3MsIGNvbnRleHQpOworICAgIHJldHVybiBMb29rdXAobmF2aWdhdG9yLCBsb29rdXBBcmdzKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvSW5kZXguY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9JbmRleC5jcwppbmRleCA0ZDk3NjExLi43Yzg0MzFkIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9JbmRleC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9JbmRleC5jcwpAQCAtMSw1NiArMSw0OSBAQAog77u/dXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwCi17Ci0gICAgcHVibGljIGNsYXNzIEluZGV4IDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgYXJnMSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IGFyZzEuVmFsdWUgYXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD47Ci0gICAgICAgICAgICB2YXIgY3JmID0gbmV3IENvbXBpbGVSZXN1bHRGYWN0b3J5KCk7Ci0gICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gYXJncy5Db3VudCgpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlJlZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhciBjYW5kaWRhdGUgPSBhcmdzLkVsZW1lbnRBdChpbmRleCAtIDEpOwotICAgICAgICAgICAgICAgIC8vQ29tbWVudGVkIEpLLUNhbiBiZSBhbnkgZGF0YSB0eXBlCi0gICAgICAgICAgICAgICAgLy9pZiAoIUlzTnVtYmVyKGNhbmRpZGF0ZS5WYWx1ZSkpCi0gICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgLy8gICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKLSAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICAvL3JldHVybiBDcmVhdGVSZXN1bHQoQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUoY2FuZGlkYXRlLlZhbHVlKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNyZi5DcmVhdGUoY2FuZGlkYXRlLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcmcxLklzRXhjZWxSYW5nZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgcm93ID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHZhciBjb2wgPSBhcmd1bWVudHMuQ291bnQoKT4yID8gQXJnVG9JbnQoYXJndW1lbnRzLCAyKSA6IDE7Ci0gICAgICAgICAgICAgICAgdmFyIHJpPWFyZzEuVmFsdWVBc1JhbmdlSW5mbzsKLSAgICAgICAgICAgICAgICBpZiAocm93ID4gcmkuQWRkcmVzcy5fdG9Sb3cgLSByaS5BZGRyZXNzLl9mcm9tUm93ICsgMSB8fAotICAgICAgICAgICAgICAgICAgICBjb2wgPiByaS5BZGRyZXNzLl90b0NvbCAtIHJpLkFkZHJlc3MuX2Zyb21Db2wgKyAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5SZWYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YXIgY2FuZGlkYXRlID0gcmkuR2V0T2Zmc2V0KHJvdy0xLCBjb2wtMSk7Ci0gICAgICAgICAgICAgICAgLy9Db21tZW50ZWQgSkstQ2FuIGJlIGFueSBkYXRhIHR5cGUKLSAgICAgICAgICAgICAgICAvL2lmICghSXNOdW1iZXIoY2FuZGlkYXRlLlZhbHVlKSkgICAKLSAgICAgICAgICAgICAgICAvL3sKLSAgICAgICAgICAgICAgICAvLyAgICB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUuVmFsdWUpOwotICAgICAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgICAgIHJldHVybiBjcmYuQ3JlYXRlKGNhbmRpZGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cDsKKworcHVibGljIGNsYXNzIEluZGV4IDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICB2YXIgYXJnMSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCk7CisgICAgdmFyIGFyZ3MgPSBhcmcxLlZhbHVlIGFzIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+OworICAgIHZhciBjcmYgPSBuZXcgQ29tcGlsZVJlc3VsdEZhY3RvcnkoKTsKKyAgICBpZiAoYXJncyAhPSBudWxsKSB7CisgICAgICB2YXIgaW5kZXggPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOworICAgICAgaWYgKGluZGV4ID4gYXJncy5Db3VudCgpKSB7CisgICAgICAgIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5SZWYpOworICAgICAgfQorICAgICAgdmFyIGNhbmRpZGF0ZSA9IGFyZ3MuRWxlbWVudEF0KGluZGV4IC0gMSk7CisgICAgICAvL0NvbW1lbnRlZCBKSy1DYW4gYmUgYW55IGRhdGEgdHlwZQorICAgICAgLy9pZiAoIUlzTnVtYmVyKGNhbmRpZGF0ZS5WYWx1ZSkpCisgICAgICAvL3sKKyAgICAgIC8vICAgIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5WYWx1ZSk7CisgICAgICAvL30KKyAgICAgIC8vcmV0dXJuIENyZWF0ZVJlc3VsdChDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShjYW5kaWRhdGUuVmFsdWUpLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgIHJldHVybiBjcmYuQ3JlYXRlKGNhbmRpZGF0ZS5WYWx1ZSk7CiAgICAgfQorICAgIGlmIChhcmcxLklzRXhjZWxSYW5nZSkgeworICAgICAgdmFyIHJvdyA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CisgICAgICB2YXIgY29sID0gYXJndW1lbnRzLkNvdW50KCkgPiAyID8gQXJnVG9JbnQoYXJndW1lbnRzLCAyKSA6IDE7CisgICAgICB2YXIgcmkgPSBhcmcxLlZhbHVlQXNSYW5nZUluZm87CisgICAgICBpZiAocm93ID4gcmkuQWRkcmVzcy5fdG9Sb3cgLSByaS5BZGRyZXNzLl9mcm9tUm93ICsgMQorICAgICAgICAgIHx8IGNvbCA+IHJpLkFkZHJlc3MuX3RvQ29sIC0gcmkuQWRkcmVzcy5fZnJvbUNvbCArIDEpIHsKKyAgICAgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5SZWYpOworICAgICAgfQorICAgICAgdmFyIGNhbmRpZGF0ZSA9IHJpLkdldE9mZnNldChyb3cgLSAxLCBjb2wgLSAxKTsKKyAgICAgIC8vQ29tbWVudGVkIEpLLUNhbiBiZSBhbnkgZGF0YSB0eXBlCisgICAgICAvL2lmICghSXNOdW1iZXIoY2FuZGlkYXRlLlZhbHVlKSkKKyAgICAgIC8veworICAgICAgLy8gICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgIC8vfQorICAgICAgcmV0dXJuIGNyZi5DcmVhdGUoY2FuZGlkYXRlKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0luZGlyZWN0LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvSW5kaXJlY3QuY3MKaW5kZXggYWY4NWEwNi4uYWU4MDE3OCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvSW5kaXJlY3QuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvSW5kaXJlY3QuY3MKQEAgLTcsNDkgKzcsNDQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNC0wNC0xMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwCi17Ci0gICAgcHVibGljIGNsYXNzIEluZGlyZWN0IDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgYWRkcmVzcyA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICB2YXIgYWRyID0gbmV3IEV4Y2VsQWRkcmVzcyhhZGRyZXNzKTsKLSAgICAgICAgICAgIHZhciB3cyA9IGFkci5Xb3JrU2hlZXQ7Ci0gICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkod3MpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdzID0gY29udGV4dC5TY29wZXMuQ3VycmVudC5BZGRyZXNzLldvcmtzaGVldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLkdldFJhbmdlKHdzLCBhZHIuX2Zyb21Sb3csIGFkci5fZnJvbUNvbCwgYWRkcmVzcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0LklzRW1wdHkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQnVnIDE1MjkwCi0gICAgICAgICAgICAgICAgdmFyIG5hbWVkVmFsdWVFeHByID0gbmV3IE5hbWVkVmFsdWVFeHByZXNzaW9uKGFkZHJlc3MsIGNvbnRleHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBuYW1lZFZhbHVlRXhwci5Db21waWxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5FbnVtZXJhYmxlKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cDsKKworcHVibGljIGNsYXNzIEluZGlyZWN0IDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgYWRkcmVzcyA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7CisgICAgdmFyIGFkciA9IG5ldyBFeGNlbEFkZHJlc3MoYWRkcmVzcyk7CisgICAgdmFyIHdzID0gYWRyLldvcmtTaGVldDsKKyAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkod3MpKSB7CisgICAgICB3cyA9IGNvbnRleHQuU2NvcGVzLkN1cnJlbnQuQWRkcmVzcy5Xb3Jrc2hlZXQ7CiAgICAgfQorICAgIHZhciByZXN1bHQgPSBjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLkdldFJhbmdlKHdzLCBhZHIuX2Zyb21Sb3csIGFkci5fZnJvbUNvbCwgYWRkcmVzcyk7CisgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KSB7CisgICAgICAvLyBCdWcgMTUyOTAKKyAgICAgIHZhciBuYW1lZFZhbHVlRXhwciA9IG5ldyBOYW1lZFZhbHVlRXhwcmVzc2lvbihhZGRyZXNzLCBjb250ZXh0KTsKKyAgICAgIHJldHVybiBuYW1lZFZhbHVlRXhwci5Db21waWxlKCk7CisgICAgfQorICAgIHJldHVybiBuZXcocmVzdWx0LCBEYXRhVHlwZS5FbnVtZXJhYmxlKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwLmNzCmluZGV4IDg3Y2YzMTkuLjhmZWU3NTIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXAuY3MKQEAgLTcsOTIgKzcsOTQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKLXVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAotewotICAgIHB1YmxpYyBjbGFzcyBMb29rdXAgOiBMb29rdXBGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICBpZiAoSGF2ZVR3b1Jhbmdlcyhhcmd1bWVudHMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBIYW5kbGVUd29SYW5nZXMoYXJndW1lbnRzLCBjb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBIYW5kbGVTaW5nbGVSYW5nZShhcmd1bWVudHMsIGNvbnRleHQpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwOwogCi0gICAgICAgIHByaXZhdGUgYm9vbCBIYXZlVHdvUmFuZ2VzKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID09IDIpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIHJldHVybiAoRXhjZWxBZGRyZXNzVXRpbC5Jc1ZhbGlkQWRkcmVzcyhhcmd1bWVudHMuRWxlbWVudEF0KDIpLlZhbHVlLlRvU3RyaW5nKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQ29tcGlsZVJlc3VsdCBIYW5kbGVTaW5nbGVSYW5nZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzZWFyY2hlZFZhbHVlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZTsKLSAgICAgICAgICAgIFJlcXVpcmUuVGhhdChhcmd1bWVudHMuRWxlbWVudEF0KDEpLlZhbHVlKS5OYW1lZCgiZmlyc3RBZGRyZXNzIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICB2YXIgZmlyc3RBZGRyZXNzID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciByYW5nZUFkZHJlc3NGYWN0b3J5ID0gbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkoY29udGV4dC5FeGNlbERhdGFQcm92aWRlcik7Ci0gICAgICAgICAgICB2YXIgYWRkcmVzcyA9IHJhbmdlQWRkcmVzc0ZhY3RvcnkuQ3JlYXRlKGZpcnN0QWRkcmVzcyk7Ci0gICAgICAgICAgICB2YXIgblJvd3MgPSBhZGRyZXNzLlRvUm93IC0gYWRkcmVzcy5Gcm9tUm93OwotICAgICAgICAgICAgdmFyIG5Db2xzID0gYWRkcmVzcy5Ub0NvbCAtIGFkZHJlc3MuRnJvbUNvbDsKLSAgICAgICAgICAgIHZhciBsb29rdXBJbmRleCA9IG5Db2xzICsgMTsKLSAgICAgICAgICAgIHZhciBsb29rdXBEaXJlY3Rpb24gPSBMb29rdXBEaXJlY3Rpb24uVmVydGljYWw7Ci0gICAgICAgICAgICBpZiAobkNvbHMgPiBuUm93cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb29rdXBJbmRleCA9IG5Sb3dzICsgMTsKLSAgICAgICAgICAgICAgICBsb29rdXBEaXJlY3Rpb24gPSBMb29rdXBEaXJlY3Rpb24uSG9yaXpvbnRhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBsb29rdXBBcmdzID0gbmV3IExvb2t1cEFyZ3VtZW50cyhzZWFyY2hlZFZhbHVlLCBmaXJzdEFkZHJlc3MsIGxvb2t1cEluZGV4LCAwLCB0cnVlKTsKLSAgICAgICAgICAgIHZhciBuYXZpZ2F0b3IgPSBMb29rdXBOYXZpZ2F0b3JGYWN0b3J5LkNyZWF0ZShsb29rdXBEaXJlY3Rpb24sIGxvb2t1cEFyZ3MsIGNvbnRleHQpOwotICAgICAgICAgICAgcmV0dXJuIExvb2t1cChuYXZpZ2F0b3IsIGxvb2t1cEFyZ3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBDb21waWxlUmVzdWx0IEhhbmRsZVR3b1JhbmdlcyhJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzZWFyY2hlZFZhbHVlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZTsKLSAgICAgICAgICAgIFJlcXVpcmUuVGhhdChhcmd1bWVudHMuRWxlbWVudEF0KDEpLlZhbHVlKS5OYW1lZCgiZmlyc3RBZGRyZXNzIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQoYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZSkuTmFtZWQoInNlY29uZEFkZHJlc3MiKS5Jc05vdE51bGwoKTsKLSAgICAgICAgICAgIHZhciBmaXJzdEFkZHJlc3MgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIHNlY29uZEFkZHJlc3MgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgdmFyIHJhbmdlQWRkcmVzc0ZhY3RvcnkgPSBuZXcgUmFuZ2VBZGRyZXNzRmFjdG9yeShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyKTsKLSAgICAgICAgICAgIHZhciBhZGRyZXNzMSA9IHJhbmdlQWRkcmVzc0ZhY3RvcnkuQ3JlYXRlKGZpcnN0QWRkcmVzcyk7Ci0gICAgICAgICAgICB2YXIgYWRkcmVzczIgPSByYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZShzZWNvbmRBZGRyZXNzKTsKLSAgICAgICAgICAgIHZhciBsb29rdXBJbmRleCA9IChhZGRyZXNzMi5Gcm9tQ29sIC0gYWRkcmVzczEuRnJvbUNvbCkgKyAxOwotICAgICAgICAgICAgdmFyIGxvb2t1cE9mZnNldCA9IGFkZHJlc3MyLkZyb21Sb3cgLSBhZGRyZXNzMS5Gcm9tUm93OwotICAgICAgICAgICAgdmFyIGxvb2t1cERpcmVjdGlvbiA9IEdldExvb2t1cERpcmVjdGlvbihhZGRyZXNzMSk7Ci0gICAgICAgICAgICBpZiAobG9va3VwRGlyZWN0aW9uID09IExvb2t1cERpcmVjdGlvbi5Ib3Jpem9udGFsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvb2t1cEluZGV4ID0gKGFkZHJlc3MyLkZyb21Sb3cgLSBhZGRyZXNzMS5Gcm9tUm93KSArIDE7Ci0gICAgICAgICAgICAgICAgbG9va3VwT2Zmc2V0ID0gYWRkcmVzczIuRnJvbUNvbCAtIGFkZHJlc3MxLkZyb21Db2w7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgbG9va3VwQXJncyA9IG5ldyBMb29rdXBBcmd1bWVudHMoc2VhcmNoZWRWYWx1ZSwgZmlyc3RBZGRyZXNzLCBsb29rdXBJbmRleCwgbG9va3VwT2Zmc2V0LCAgdHJ1ZSk7Ci0gICAgICAgICAgICB2YXIgbmF2aWdhdG9yID0gTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5DcmVhdGUobG9va3VwRGlyZWN0aW9uLCBsb29rdXBBcmdzLCBjb250ZXh0KTsKLSAgICAgICAgICAgIHJldHVybiBMb29rdXAobmF2aWdhdG9yLCBsb29rdXBBcmdzKTsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIExvb2t1cCA6IExvb2t1cEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgIGlmIChIYXZlVHdvUmFuZ2VzKGFyZ3VtZW50cykpIHsKKyAgICAgIHJldHVybiBIYW5kbGVUd29SYW5nZXMoYXJndW1lbnRzLCBjb250ZXh0KTsKICAgICB9CisgICAgcmV0dXJuIEhhbmRsZVNpbmdsZVJhbmdlKGFyZ3VtZW50cywgY29udGV4dCk7CisgIH0KKworICBwcml2YXRlIGJvb2wgSGF2ZVR3b1JhbmdlcyhJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMpIHsKKyAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPT0gMikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKEV4Y2VsQWRkcmVzc1V0aWwuSXNWYWxpZEFkZHJlc3MoYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZS5Ub1N0cmluZygpKSk7CisgIH0KKworICBwcml2YXRlIENvbXBpbGVSZXN1bHQgSGFuZGxlU2luZ2xlUmFuZ2UoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgdmFyIHNlYXJjaGVkVmFsdWUgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlOworICAgIFJlcXVpcmUuVGhhdChhcmd1bWVudHMuRWxlbWVudEF0KDEpLlZhbHVlKS5OYW1lZCgiZmlyc3RBZGRyZXNzIikuSXNOb3ROdWxsKCk7CisgICAgdmFyIGZpcnN0QWRkcmVzcyA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIHJhbmdlQWRkcmVzc0ZhY3RvcnkgPSBuZXcgUmFuZ2VBZGRyZXNzRmFjdG9yeShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyKTsKKyAgICB2YXIgYWRkcmVzcyA9IHJhbmdlQWRkcmVzc0ZhY3RvcnkuQ3JlYXRlKGZpcnN0QWRkcmVzcyk7CisgICAgdmFyIG5Sb3dzID0gYWRkcmVzcy5Ub1JvdyAtIGFkZHJlc3MuRnJvbVJvdzsKKyAgICB2YXIgbkNvbHMgPSBhZGRyZXNzLlRvQ29sIC0gYWRkcmVzcy5Gcm9tQ29sOworICAgIHZhciBsb29rdXBJbmRleCA9IG5Db2xzICsgMTsKKyAgICB2YXIgbG9va3VwRGlyZWN0aW9uID0gTG9va3VwRGlyZWN0aW9uLlZlcnRpY2FsOworICAgIGlmIChuQ29scyA+IG5Sb3dzKSB7CisgICAgICBsb29rdXBJbmRleCA9IG5Sb3dzICsgMTsKKyAgICAgIGxvb2t1cERpcmVjdGlvbiA9IExvb2t1cERpcmVjdGlvbi5Ib3Jpem9udGFsOworICAgIH0KKyAgICB2YXIgbG9va3VwQXJncyA9IG5ldyBMb29rdXBBcmd1bWVudHMoc2VhcmNoZWRWYWx1ZSwgZmlyc3RBZGRyZXNzLCBsb29rdXBJbmRleCwgMCwgdHJ1ZSk7CisgICAgdmFyIG5hdmlnYXRvciA9IExvb2t1cE5hdmlnYXRvckZhY3RvcnkuQ3JlYXRlKGxvb2t1cERpcmVjdGlvbiwgbG9va3VwQXJncywgY29udGV4dCk7CisgICAgcmV0dXJuIExvb2t1cChuYXZpZ2F0b3IsIGxvb2t1cEFyZ3MpOworICB9CisKKyAgcHJpdmF0ZSBDb21waWxlUmVzdWx0IEhhbmRsZVR3b1JhbmdlcygKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICB2YXIgc2VhcmNoZWRWYWx1ZSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWU7CisgICAgUmVxdWlyZS5UaGF0KGFyZ3VtZW50cy5FbGVtZW50QXQoMSkuVmFsdWUpLk5hbWVkKCJmaXJzdEFkZHJlc3MiKS5Jc05vdE51bGwoKTsKKyAgICBSZXF1aXJlLlRoYXQoYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZSkuTmFtZWQoInNlY29uZEFkZHJlc3MiKS5Jc05vdE51bGwoKTsKKyAgICB2YXIgZmlyc3RBZGRyZXNzID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgc2Vjb25kQWRkcmVzcyA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMik7CisgICAgdmFyIHJhbmdlQWRkcmVzc0ZhY3RvcnkgPSBuZXcgUmFuZ2VBZGRyZXNzRmFjdG9yeShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyKTsKKyAgICB2YXIgYWRkcmVzczEgPSByYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZShmaXJzdEFkZHJlc3MpOworICAgIHZhciBhZGRyZXNzMiA9IHJhbmdlQWRkcmVzc0ZhY3RvcnkuQ3JlYXRlKHNlY29uZEFkZHJlc3MpOworICAgIHZhciBsb29rdXBJbmRleCA9IChhZGRyZXNzMi5Gcm9tQ29sIC0gYWRkcmVzczEuRnJvbUNvbCkgKyAxOworICAgIHZhciBsb29rdXBPZmZzZXQgPSBhZGRyZXNzMi5Gcm9tUm93IC0gYWRkcmVzczEuRnJvbVJvdzsKKyAgICB2YXIgbG9va3VwRGlyZWN0aW9uID0gR2V0TG9va3VwRGlyZWN0aW9uKGFkZHJlc3MxKTsKKyAgICBpZiAobG9va3VwRGlyZWN0aW9uID09IExvb2t1cERpcmVjdGlvbi5Ib3Jpem9udGFsKSB7CisgICAgICBsb29rdXBJbmRleCA9IChhZGRyZXNzMi5Gcm9tUm93IC0gYWRkcmVzczEuRnJvbVJvdykgKyAxOworICAgICAgbG9va3VwT2Zmc2V0ID0gYWRkcmVzczIuRnJvbUNvbCAtIGFkZHJlc3MxLkZyb21Db2w7CisgICAgfQorICAgIHZhciBsb29rdXBBcmdzID0gbmV3IExvb2t1cEFyZ3VtZW50cygKKyAgICAgICAgc2VhcmNoZWRWYWx1ZSwKKyAgICAgICAgZmlyc3RBZGRyZXNzLAorICAgICAgICBsb29rdXBJbmRleCwKKyAgICAgICAgbG9va3VwT2Zmc2V0LAorICAgICAgICB0cnVlKTsKKyAgICB2YXIgbmF2aWdhdG9yID0gTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5DcmVhdGUobG9va3VwRGlyZWN0aW9uLCBsb29rdXBBcmdzLCBjb250ZXh0KTsKKyAgICByZXR1cm4gTG9va3VwKG5hdmlnYXRvciwgbG9va3VwQXJncyk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cEFyZ3VtZW50cy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cEFyZ3VtZW50cy5jcwppbmRleCA4NDYwNDVmLi44YmVkODJkIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBBcmd1bWVudHMuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwQXJndW1lbnRzLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpAQCAtNywxMDYgKzcsOTcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwCi17Ci0gICAgcHVibGljIGNsYXNzIExvb2t1cEFyZ3VtZW50cwotICAgIHsKLSAgICAgICAgcHVibGljIGVudW0gTG9va3VwQXJndW1lbnREYXRhVHlwZQotICAgICAgICB7Ci0gICAgICAgICAgICBFeGNlbFJhbmdlLAotICAgICAgICAgICAgRGF0YUFycmF5Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXA7CiAKLSAgICAgICAgcHVibGljIExvb2t1cEFyZ3VtZW50cyhJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMpCi0gICAgICAgICAgICA6IHRoaXMoYXJndW1lbnRzLCBuZXcgQXJndW1lbnRQYXJzZXJzKCkpCi0gICAgICAgIHsKK3B1YmxpYyBjbGFzcyBMb29rdXBBcmd1bWVudHMgeworICBwdWJsaWMgZW51bSBMb29rdXBBcmd1bWVudERhdGFUeXBlIHsKKyAgICBFeGNlbFJhbmdlLAorICAgIERhdGFBcnJheSwKKyAgfQogCi0gICAgICAgIH0KKyAgcHVibGljIExvb2t1cEFyZ3VtZW50cyhJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMpCisgICAgICA6IHRoaXMoYXJndW1lbnRzLCBuZXcoKSkge30KIAotICAgICAgICBwdWJsaWMgTG9va3VwQXJndW1lbnRzKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgQXJndW1lbnRQYXJzZXJzIGFyZ3VtZW50UGFyc2VycykKLSAgICAgICAgewotICAgICAgICAgICAgX2FyZ3VtZW50UGFyc2VycyA9IGFyZ3VtZW50UGFyc2VyczsKLSAgICAgICAgICAgIFNlYXJjaGVkVmFsdWUgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlOwotICAgICAgICAgICAgdmFyIGFyZzEgPSBhcmd1bWVudHMuRWxlbWVudEF0KDEpLlZhbHVlOwotICAgICAgICAgICAgdmFyIGRhdGFBcnJheSA9IGFyZzEgYXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD47Ci0gICAgICAgICAgICBpZiAoZGF0YUFycmF5ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGF0YUFycmF5ID0gZGF0YUFycmF5OwotICAgICAgICAgICAgICAgIEFyZ3VtZW50RGF0YVR5cGUgPSBMb29rdXBBcmd1bWVudERhdGFUeXBlLkRhdGFBcnJheTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL2lmIChhcmcxIGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklOYW1lSW5mbykgYXJnMSA9ICgoRXhjZWxEYXRhUHJvdmlkZXIuSU5hbWVJbmZvKSBhcmcxKS5WYWx1ZTsKLSAgICAgICAgICAgICAgICB2YXIgcmFuZ2VJbmZvID0gYXJnMSBhcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvOwotICAgICAgICAgICAgICAgIGlmIChyYW5nZUluZm8gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFJhbmdlQWRkcmVzcyA9IHN0cmluZy5Jc051bGxPckVtcHR5KHJhbmdlSW5mby5BZGRyZXNzLldvcmtTaGVldCkgPyByYW5nZUluZm8uQWRkcmVzcy5BZGRyZXNzIDogIiciICsgcmFuZ2VJbmZvLkFkZHJlc3MuV29ya1NoZWV0ICsgIichIiArIHJhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgICAgIFJhbmdlSW5mbyA9IHJhbmdlSW5mbzsKLSAgICAgICAgICAgICAgICAgICAgQXJndW1lbnREYXRhVHlwZSA9IExvb2t1cEFyZ3VtZW50RGF0YVR5cGUuRXhjZWxSYW5nZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUmFuZ2VBZGRyZXNzID0gYXJnMS5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBBcmd1bWVudERhdGFUeXBlID0gTG9va3VwQXJndW1lbnREYXRhVHlwZS5FeGNlbFJhbmdlOwotICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgTG9va3VwSW5kZXggPSAoaW50KV9hcmd1bWVudFBhcnNlcnMuR2V0UGFyc2VyKERhdGFUeXBlLkludGVnZXIpLlBhcnNlKGFyZ3VtZW50cy5FbGVtZW50QXQoMikuVmFsdWUpOwotICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID4gMykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSYW5nZUxvb2t1cCA9IChib29sKV9hcmd1bWVudFBhcnNlcnMuR2V0UGFyc2VyKERhdGFUeXBlLkJvb2xlYW4pLlBhcnNlKGFyZ3VtZW50cy5FbGVtZW50QXQoMykuVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJhbmdlTG9va3VwID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMb29rdXBBcmd1bWVudHMob2JqZWN0IHNlYXJjaGVkVmFsdWUsIHN0cmluZyByYW5nZUFkZHJlc3MsIGludCBsb29rdXBJbmRleCwgaW50IGxvb2t1cE9mZnNldCwgYm9vbCByYW5nZUxvb2t1cCkKLSAgICAgICAgewotICAgICAgICAgICAgU2VhcmNoZWRWYWx1ZSA9IHNlYXJjaGVkVmFsdWU7Ci0gICAgICAgICAgICBSYW5nZUFkZHJlc3MgPSByYW5nZUFkZHJlc3M7Ci0gICAgICAgICAgICBMb29rdXBJbmRleCA9IGxvb2t1cEluZGV4OwotICAgICAgICAgICAgTG9va3VwT2Zmc2V0ID0gbG9va3VwT2Zmc2V0OwotICAgICAgICAgICAgUmFuZ2VMb29rdXAgPSByYW5nZUxvb2t1cDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQXJndW1lbnRQYXJzZXJzIF9hcmd1bWVudFBhcnNlcnM7Ci0KLSAgICAgICAgcHVibGljIG9iamVjdCBTZWFyY2hlZFZhbHVlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotCi0gICAgICAgIHB1YmxpYyBzdHJpbmcgUmFuZ2VBZGRyZXNzIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgTG9va3VwSW5kZXggeyBnZXQ7IHByaXZhdGUgc2V0OyB9Ci0KLSAgICAgICAgcHVibGljIGludCBMb29rdXBPZmZzZXQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9Ci0KLSAgICAgICAgcHVibGljIGJvb2wgUmFuZ2VMb29rdXAgeyBnZXQ7IHByaXZhdGUgc2V0OyB9Ci0KLSAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IERhdGFBcnJheSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KLQotICAgICAgICBwdWJsaWMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyBSYW5nZUluZm8geyBnZXQ7IHByaXZhdGUgc2V0OyB9Ci0KLSAgICAgICAgcHVibGljIExvb2t1cEFyZ3VtZW50RGF0YVR5cGUgQXJndW1lbnREYXRhVHlwZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0gCisgIHB1YmxpYyBMb29rdXBBcmd1bWVudHMoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBBcmd1bWVudFBhcnNlcnMgYXJndW1lbnRQYXJzZXJzKSB7CisgICAgX2FyZ3VtZW50UGFyc2VycyA9IGFyZ3VtZW50UGFyc2VyczsKKyAgICBTZWFyY2hlZFZhbHVlID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZTsKKyAgICB2YXIgYXJnMSA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMSkuVmFsdWU7CisgICAgdmFyIGRhdGFBcnJheSA9IGFyZzEgYXMgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD47CisgICAgaWYgKGRhdGFBcnJheSAhPSBudWxsKSB7CisgICAgICBEYXRhQXJyYXkgPSBkYXRhQXJyYXk7CisgICAgICBBcmd1bWVudERhdGFUeXBlID0gTG9va3VwQXJndW1lbnREYXRhVHlwZS5EYXRhQXJyYXk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vaWYgKGFyZzEgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSU5hbWVJbmZvKSBhcmcxID0gKChFeGNlbERhdGFQcm92aWRlci5JTmFtZUluZm8pIGFyZzEpLlZhbHVlOworICAgICAgdmFyIHJhbmdlSW5mbyA9IGFyZzEgYXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbzsKKyAgICAgIGlmIChyYW5nZUluZm8gIT0gbnVsbCkgeworICAgICAgICBSYW5nZUFkZHJlc3MgPSBzdHJpbmcuSXNOdWxsT3JFbXB0eShyYW5nZUluZm8uQWRkcmVzcy5Xb3JrU2hlZXQpCisgICAgICAgICAgICA/IHJhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3MKKyAgICAgICAgICAgIDogIiciICsgcmFuZ2VJbmZvLkFkZHJlc3MuV29ya1NoZWV0ICsgIichIiArIHJhbmdlSW5mby5BZGRyZXNzLkFkZHJlc3M7CisgICAgICAgIFJhbmdlSW5mbyA9IHJhbmdlSW5mbzsKKyAgICAgICAgQXJndW1lbnREYXRhVHlwZSA9IExvb2t1cEFyZ3VtZW50RGF0YVR5cGUuRXhjZWxSYW5nZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFJhbmdlQWRkcmVzcyA9IGFyZzEuVG9TdHJpbmcoKTsKKyAgICAgICAgQXJndW1lbnREYXRhVHlwZSA9IExvb2t1cEFyZ3VtZW50RGF0YVR5cGUuRXhjZWxSYW5nZTsKKyAgICAgIH0KICAgICB9CisgICAgTG9va3VwSW5kZXggPSAoaW50KQorICAgICAgX2FyZ3VtZW50UGFyc2Vycy5HZXRQYXJzZXIoRGF0YVR5cGUuSW50ZWdlcikuUGFyc2UoYXJndW1lbnRzLkVsZW1lbnRBdCgyKS5WYWx1ZSk7CisgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID4gMykgeworICAgICAgUmFuZ2VMb29rdXAgPSAoYm9vbCkKKyAgICAgICAgX2FyZ3VtZW50UGFyc2Vycy5HZXRQYXJzZXIoRGF0YVR5cGUuQm9vbGVhbikuUGFyc2UoYXJndW1lbnRzLkVsZW1lbnRBdCgzKS5WYWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFJhbmdlTG9va3VwID0gdHJ1ZTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgTG9va3VwQXJndW1lbnRzKAorICAgICAgb2JqZWN0IHNlYXJjaGVkVmFsdWUsCisgICAgICBzdHJpbmcgcmFuZ2VBZGRyZXNzLAorICAgICAgaW50IGxvb2t1cEluZGV4LAorICAgICAgaW50IGxvb2t1cE9mZnNldCwKKyAgICAgIGJvb2wgcmFuZ2VMb29rdXApIHsKKyAgICBTZWFyY2hlZFZhbHVlID0gc2VhcmNoZWRWYWx1ZTsKKyAgICBSYW5nZUFkZHJlc3MgPSByYW5nZUFkZHJlc3M7CisgICAgTG9va3VwSW5kZXggPSBsb29rdXBJbmRleDsKKyAgICBMb29rdXBPZmZzZXQgPSBsb29rdXBPZmZzZXQ7CisgICAgUmFuZ2VMb29rdXAgPSByYW5nZUxvb2t1cDsKKyAgfQorCisgIHByaXZhdGUgcmVhZG9ubHkgQXJndW1lbnRQYXJzZXJzIF9hcmd1bWVudFBhcnNlcnM7CisKKyAgcHVibGljIG9iamVjdCBTZWFyY2hlZFZhbHVlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgIHB1YmxpYyBzdHJpbmcgUmFuZ2VBZGRyZXNzIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgIHB1YmxpYyBpbnQgTG9va3VwSW5kZXggeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgcHVibGljIGludCBMb29rdXBPZmZzZXQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgcHVibGljIGJvb2wgUmFuZ2VMb29rdXAgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgcHVibGljIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IERhdGFBcnJheSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICBwdWJsaWMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbyBSYW5nZUluZm8geyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgcHVibGljIExvb2t1cEFyZ3VtZW50RGF0YVR5cGUgQXJndW1lbnREYXRhVHlwZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cERpcmVjdGlvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cERpcmVjdGlvbi5jcwppbmRleCBlZTVhN2Q2Li5hYmI1NjRjIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBEaXJlY3Rpb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwRGlyZWN0aW9uLmNzCkBAIC03LDMxICs3LDI1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwCi17Ci0gICAgcHVibGljIGVudW0gTG9va3VwRGlyZWN0aW9uCi0gICAgewotICAgICAgICBWZXJ0aWNhbCwKLSAgICAgICAgSG9yaXpvbnRhbAotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXA7CisKK3B1YmxpYyBlbnVtIExvb2t1cERpcmVjdGlvbiB7CisgIFZlcnRpY2FsLAorICBIb3Jpem9udGFsLAogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwRnVuY3Rpb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBGdW5jdGlvbi5jcwppbmRleCA4MDBkNTUzLi44NGYyMGQ4IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBGdW5jdGlvbi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBGdW5jdGlvbi5jcwpAQCAtNywxMTEgKzcsODQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CisKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAotewotICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb29rdXBGdW5jdGlvbiA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVmFsdWVNYXRjaGVyIF92YWx1ZU1hdGNoZXI7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQ29tcGlsZVJlc3VsdEZhY3RvcnkgX2NvbXBpbGVSZXN1bHRGYWN0b3J5OworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cDsKIAotICAgICAgICBwdWJsaWMgTG9va3VwRnVuY3Rpb24oKQotICAgICAgICAgICAgOiB0aGlzKG5ldyBMb29rdXBWYWx1ZU1hdGNoZXIoKSwgbmV3IENvbXBpbGVSZXN1bHRGYWN0b3J5KCkpCi0gICAgICAgIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb29rdXBGdW5jdGlvbiA6IEV4Y2VsRnVuY3Rpb24geworICBwcml2YXRlIHJlYWRvbmx5IFZhbHVlTWF0Y2hlciBfdmFsdWVNYXRjaGVyOworICBwcml2YXRlIHJlYWRvbmx5IENvbXBpbGVSZXN1bHRGYWN0b3J5IF9jb21waWxlUmVzdWx0RmFjdG9yeTsKIAotICAgICAgICB9CisgIHB1YmxpYyBMb29rdXBGdW5jdGlvbigpCisgICAgICA6IHRoaXMobmV3IExvb2t1cFZhbHVlTWF0Y2hlcigpLCBuZXcoKSkge30KIAotICAgICAgICBwdWJsaWMgTG9va3VwRnVuY3Rpb24oVmFsdWVNYXRjaGVyIHZhbHVlTWF0Y2hlciwgQ29tcGlsZVJlc3VsdEZhY3RvcnkgY29tcGlsZVJlc3VsdEZhY3RvcnkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF92YWx1ZU1hdGNoZXIgPSB2YWx1ZU1hdGNoZXI7Ci0gICAgICAgICAgICBfY29tcGlsZVJlc3VsdEZhY3RvcnkgPSBjb21waWxlUmVzdWx0RmFjdG9yeTsKLSAgICAgICAgfQorICBwdWJsaWMgTG9va3VwRnVuY3Rpb24oVmFsdWVNYXRjaGVyIHZhbHVlTWF0Y2hlciwgQ29tcGlsZVJlc3VsdEZhY3RvcnkgY29tcGlsZVJlc3VsdEZhY3RvcnkpIHsKKyAgICBfdmFsdWVNYXRjaGVyID0gdmFsdWVNYXRjaGVyOworICAgIF9jb21waWxlUmVzdWx0RmFjdG9yeSA9IGNvbXBpbGVSZXN1bHRGYWN0b3J5OworICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNMb29rdXBGdWN0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHB1YmxpYyBvdmVycmlkZSBib29sIElzTG9va3VwRnVjdGlvbiA9PiB0cnVlOwogCi0gICAgICAgIHByb3RlY3RlZCBpbnQgSXNNYXRjaChvYmplY3QgbzEsIG9iamVjdCBvMikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF92YWx1ZU1hdGNoZXIuSXNNYXRjaChvMSwgbzIpOwotICAgICAgICB9CisgIHByb3RlY3RlZCBpbnQgSXNNYXRjaChvYmplY3QgbzEsIG9iamVjdCBvMikgeworICAgIHJldHVybiBfdmFsdWVNYXRjaGVyLklzTWF0Y2gobzEsIG8yKTsKKyAgfQogCi0gICAgICAgIHByb3RlY3RlZCBMb29rdXBEaXJlY3Rpb24gR2V0TG9va3VwRGlyZWN0aW9uKFJhbmdlQWRkcmVzcyByYW5nZUFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBuUm93cyA9IHJhbmdlQWRkcmVzcy5Ub1JvdyAtIHJhbmdlQWRkcmVzcy5Gcm9tUm93OwotICAgICAgICAgICAgdmFyIG5Db2xzID0gcmFuZ2VBZGRyZXNzLlRvQ29sIC0gcmFuZ2VBZGRyZXNzLkZyb21Db2w7Ci0gICAgICAgICAgICByZXR1cm4gbkNvbHMgPiBuUm93cyA/IExvb2t1cERpcmVjdGlvbi5Ib3Jpem9udGFsIDogTG9va3VwRGlyZWN0aW9uLlZlcnRpY2FsOwotICAgICAgICB9CisgIHByb3RlY3RlZCBMb29rdXBEaXJlY3Rpb24gR2V0TG9va3VwRGlyZWN0aW9uKFJhbmdlQWRkcmVzcyByYW5nZUFkZHJlc3MpIHsKKyAgICB2YXIgblJvd3MgPSByYW5nZUFkZHJlc3MuVG9Sb3cgLSByYW5nZUFkZHJlc3MuRnJvbVJvdzsKKyAgICB2YXIgbkNvbHMgPSByYW5nZUFkZHJlc3MuVG9Db2wgLSByYW5nZUFkZHJlc3MuRnJvbUNvbDsKKyAgICByZXR1cm4gbkNvbHMgPiBuUm93cyA/IExvb2t1cERpcmVjdGlvbi5Ib3Jpem9udGFsIDogTG9va3VwRGlyZWN0aW9uLlZlcnRpY2FsOworICB9CiAKLSAgICAgICAgcHJvdGVjdGVkIENvbXBpbGVSZXN1bHQgTG9va3VwKExvb2t1cE5hdmlnYXRvciBuYXZpZ2F0b3IsIExvb2t1cEFyZ3VtZW50cyBsb29rdXBBcmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICBvYmplY3QgbGFzdFZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgIG9iamVjdCBsYXN0TG9va3VwVmFsdWUgPSBudWxsOwotICAgICAgICAgICAgaW50PyBsYXN0TWF0Y2hSZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgaWYgKGxvb2t1cEFyZ3MuU2VhcmNoZWRWYWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTkEpLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIG1hdGNoUmVzdWx0ID0gSXNNYXRjaChuYXZpZ2F0b3IuQ3VycmVudFZhbHVlLCBsb29rdXBBcmdzLlNlYXJjaGVkVmFsdWUpOwotICAgICAgICAgICAgICAgIGlmIChtYXRjaFJlc3VsdCAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RWYWx1ZSAhPSBudWxsICYmIG5hdmlnYXRvci5DdXJyZW50VmFsdWUgPT0gbnVsbCkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAobG9va3VwQXJncy5SYW5nZUxvb2t1cCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RWYWx1ZSA9PSBudWxsICYmIG1hdGNoUmVzdWx0ID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLk5BKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0VmFsdWUgIT0gbnVsbCAmJiBtYXRjaFJlc3VsdCA+IDAgJiYgbGFzdE1hdGNoUmVzdWx0IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbXBpbGVSZXN1bHRGYWN0b3J5LkNyZWF0ZShsYXN0TG9va3VwVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE1hdGNoUmVzdWx0ID0gbWF0Y2hSZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0VmFsdWUgPSBuYXZpZ2F0b3IuQ3VycmVudFZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdExvb2t1cFZhbHVlID0gbmF2aWdhdG9yLkdldExvb2t1cFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb21waWxlUmVzdWx0RmFjdG9yeS5DcmVhdGUobmF2aWdhdG9yLkdldExvb2t1cFZhbHVlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChuYXZpZ2F0b3IuTW92ZU5leHQoKSk7Ci0KLSAgICAgICAgICAgIGlmIChsb29rdXBBcmdzLlJhbmdlTG9va3VwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY29tcGlsZVJlc3VsdEZhY3RvcnkuQ3JlYXRlKGxhc3RMb29rdXBWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLk5BKSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7Ci0gICAgICAgIH0KKyAgcHJvdGVjdGVkIENvbXBpbGVSZXN1bHQgTG9va3VwKExvb2t1cE5hdmlnYXRvciBuYXZpZ2F0b3IsIExvb2t1cEFyZ3VtZW50cyBsb29rdXBBcmdzKSB7CisgICAgb2JqZWN0IGxhc3RWYWx1ZSA9IG51bGw7CisgICAgb2JqZWN0IGxhc3RMb29rdXBWYWx1ZSA9IG51bGw7CisgICAgaW50PyBsYXN0TWF0Y2hSZXN1bHQgPSBudWxsOworICAgIGlmIChsb29rdXBBcmdzLlNlYXJjaGVkVmFsdWUgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIG5ldyhFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTmEpLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKICAgICB9CisgICAgZG8geworICAgICAgdmFyIG1hdGNoUmVzdWx0ID0gSXNNYXRjaChuYXZpZ2F0b3IuQ3VycmVudFZhbHVlLCBsb29rdXBBcmdzLlNlYXJjaGVkVmFsdWUpOworICAgICAgaWYgKG1hdGNoUmVzdWx0ICE9IDApIHsKKyAgICAgICAgaWYgKGxhc3RWYWx1ZSAhPSBudWxsICYmIG5hdmlnYXRvci5DdXJyZW50VmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvb2t1cEFyZ3MuUmFuZ2VMb29rdXApIHsKKyAgICAgICAgICBpZiAobGFzdFZhbHVlID09IG51bGwgJiYgbWF0Y2hSZXN1bHQgPiAwKSB7CisgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLk5hKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGxhc3RWYWx1ZSAhPSBudWxsICYmIG1hdGNoUmVzdWx0ID4gMCAmJiBsYXN0TWF0Y2hSZXN1bHQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gX2NvbXBpbGVSZXN1bHRGYWN0b3J5LkNyZWF0ZShsYXN0TG9va3VwVmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgICBsYXN0TWF0Y2hSZXN1bHQgPSBtYXRjaFJlc3VsdDsKKyAgICAgICAgICBsYXN0VmFsdWUgPSBuYXZpZ2F0b3IuQ3VycmVudFZhbHVlOworICAgICAgICAgIGxhc3RMb29rdXBWYWx1ZSA9IG5hdmlnYXRvci5HZXRMb29rdXBWYWx1ZSgpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gX2NvbXBpbGVSZXN1bHRGYWN0b3J5LkNyZWF0ZShuYXZpZ2F0b3IuR2V0TG9va3VwVmFsdWUoKSk7CisgICAgICB9CisgICAgfSB3aGlsZSAobmF2aWdhdG9yLk1vdmVOZXh0KCkpOworCisgICAgaWYgKGxvb2t1cEFyZ3MuUmFuZ2VMb29rdXApIHsKKyAgICAgIHJldHVybiBfY29tcGlsZVJlc3VsdEZhY3RvcnkuQ3JlYXRlKGxhc3RMb29rdXBWYWx1ZSk7CisgICAgfQorICAgIHJldHVybiBuZXcoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLk5hKSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cE5hdmlnYXRvci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cE5hdmlnYXRvci5jcwppbmRleCA4ZWYyM2Q1Li5mOTNjZmJlIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBOYXZpZ2F0b3IuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwTmF2aWdhdG9yLmNzCkBAIC03LDYwICs3LDUxIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OworCiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKLXsKLSAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTG9va3VwTmF2aWdhdG9yCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgTG9va3VwRGlyZWN0aW9uIERpcmVjdGlvbjsKLSAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IExvb2t1cEFyZ3VtZW50cyBBcmd1bWVudHM7Ci0gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBQYXJzaW5nQ29udGV4dCBQYXJzaW5nQ29udGV4dDsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXA7CiAKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBMb29rdXBOYXZpZ2F0b3IgeworICBwcm90ZWN0ZWQgcmVhZG9ubHkgTG9va3VwRGlyZWN0aW9uIERpcmVjdGlvbjsKKyAgcHJvdGVjdGVkIHJlYWRvbmx5IExvb2t1cEFyZ3VtZW50cyBBcmd1bWVudHM7CisgIHByb3RlY3RlZCByZWFkb25seSBQYXJzaW5nQ29udGV4dCBQYXJzaW5nQ29udGV4dDsKIAorICBwdWJsaWMgTG9va3VwTmF2aWdhdG9yKAorICAgICAgTG9va3VwRGlyZWN0aW9uIGRpcmVjdGlvbiwKKyAgICAgIExvb2t1cEFyZ3VtZW50cyBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkgeworICAgIFJlcXVpcmUuVGhhdChhcmd1bWVudHMpLk5hbWVkKCJhcmd1bWVudHMiKS5Jc05vdE51bGwoKTsKKyAgICBSZXF1aXJlLlRoYXQocGFyc2luZ0NvbnRleHQpLk5hbWVkKCJwYXJzaW5nQ29udGV4dCIpLklzTm90TnVsbCgpOworICAgIFJlcXVpcmUKKyAgICAgICAgLlRoYXQocGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIpCisgICAgICAgIC5OYW1lZCgicGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIiKQorICAgICAgICAuSXNOb3ROdWxsKCk7CisgICAgRGlyZWN0aW9uID0gZGlyZWN0aW9uOworICAgIEFyZ3VtZW50cyA9IGFyZ3VtZW50czsKKyAgICBQYXJzaW5nQ29udGV4dCA9IHBhcnNpbmdDb250ZXh0OworICB9CiAKLSAgICAgICAgcHVibGljIExvb2t1cE5hdmlnYXRvcihMb29rdXBEaXJlY3Rpb24gZGlyZWN0aW9uLCBMb29rdXBBcmd1bWVudHMgYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGFyZ3VtZW50cykuTmFtZWQoImFyZ3VtZW50cyIpLklzTm90TnVsbCgpOwotICAgICAgICAgICAgUmVxdWlyZS5UaGF0KHBhcnNpbmdDb250ZXh0KS5OYW1lZCgicGFyc2luZ0NvbnRleHQiKS5Jc05vdE51bGwoKTsKLSAgICAgICAgICAgIFJlcXVpcmUuVGhhdChwYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlcikuTmFtZWQoInBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICBEaXJlY3Rpb24gPSBkaXJlY3Rpb247Ci0gICAgICAgICAgICBBcmd1bWVudHMgPSBhcmd1bWVudHM7Ci0gICAgICAgICAgICBQYXJzaW5nQ29udGV4dCA9IHBhcnNpbmdDb250ZXh0OwotICAgICAgICB9CisgIHB1YmxpYyBhYnN0cmFjdCBpbnQgSW5kZXggeyBnZXQ7IH0KIAotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IEluZGV4Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgfQorICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBNb3ZlTmV4dCgpOwogCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIE1vdmVOZXh0KCk7CisgIHB1YmxpYyBhYnN0cmFjdCBvYmplY3QgQ3VycmVudFZhbHVlIHsgZ2V0OyB9CiAKLSAgICAgICAgcHVibGljIGFic3RyYWN0IG9iamVjdCBDdXJyZW50VmFsdWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGFic3RyYWN0IG9iamVjdCBHZXRMb29rdXBWYWx1ZSgpOwotICAgIH0KKyAgcHVibGljIGFic3RyYWN0IG9iamVjdCBHZXRMb29rdXBWYWx1ZSgpOwogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL0xvb2t1cE5hdmlnYXRvckZhY3RvcnkuY3MKaW5kZXggMmE2ODkwMC4uZDQ0NDUyNSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Mb29rdXBOYXZpZ2F0b3JGYWN0b3J5LmNzCkBAIC0xLDIzICsxLDE4IEBACiDvu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKLXsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExvb2t1cE5hdmlnYXRvckZhY3RvcnkKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgTG9va3VwTmF2aWdhdG9yIENyZWF0ZShMb29rdXBEaXJlY3Rpb24gZGlyZWN0aW9uLCBMb29rdXBBcmd1bWVudHMgYXJncywgUGFyc2luZ0NvbnRleHQgcGFyc2luZ0NvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhcmdzLkFyZ3VtZW50RGF0YVR5cGUgPT0gTG9va3VwQXJndW1lbnRzLkxvb2t1cEFyZ3VtZW50RGF0YVR5cGUuRXhjZWxSYW5nZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsTG9va3VwTmF2aWdhdG9yKGRpcmVjdGlvbiwgYXJncywgcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYXJncy5Bcmd1bWVudERhdGFUeXBlID09IExvb2t1cEFyZ3VtZW50cy5Mb29rdXBBcmd1bWVudERhdGFUeXBlLkRhdGFBcnJheSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFycmF5TG9va3VwTmF2aWdhdG9yKGRpcmVjdGlvbiwgYXJncywgcGFyc2luZ0NvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiSW52YWxpZCBhcmd1bWVudCBkYXRhdHlwZSIpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwOworCitwdWJsaWMgc3RhdGljIGNsYXNzIExvb2t1cE5hdmlnYXRvckZhY3RvcnkgeworICBwdWJsaWMgc3RhdGljIExvb2t1cE5hdmlnYXRvciBDcmVhdGUoCisgICAgICBMb29rdXBEaXJlY3Rpb24gZGlyZWN0aW9uLAorICAgICAgTG9va3VwQXJndW1lbnRzIGFyZ3MsCisgICAgICBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkgeworICAgIGlmIChhcmdzLkFyZ3VtZW50RGF0YVR5cGUgPT0gTG9va3VwQXJndW1lbnRzLkxvb2t1cEFyZ3VtZW50RGF0YVR5cGUuRXhjZWxSYW5nZSkgeworICAgICAgcmV0dXJuIG5ldyBFeGNlbExvb2t1cE5hdmlnYXRvcihkaXJlY3Rpb24sIGFyZ3MsIHBhcnNpbmdDb250ZXh0KTsKICAgICB9CisgICAgaWYgKGFyZ3MuQXJndW1lbnREYXRhVHlwZSA9PSBMb29rdXBBcmd1bWVudHMuTG9va3VwQXJndW1lbnREYXRhVHlwZS5EYXRhQXJyYXkpIHsKKyAgICAgIHJldHVybiBuZXcgQXJyYXlMb29rdXBOYXZpZ2F0b3IoZGlyZWN0aW9uLCBhcmdzLCBwYXJzaW5nQ29udGV4dCk7CisgICAgfQorICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oIkludmFsaWQgYXJndW1lbnQgZGF0YXR5cGUiKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvTWF0Y2guY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9NYXRjaC5jcwppbmRleCBhMzcyMThlLi4zNmYyNGZjIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9NYXRjaC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9NYXRjaC5jcwpAQCAtNyw5OSArNyw4NCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKLXsKLSAgICBwdWJsaWMgY2xhc3MgTWF0Y2ggOiBMb29rdXBGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBlbnVtIE1hdGNoVHlwZQotICAgICAgICB7Ci0gICAgICAgICAgICBDbG9zZXN0QWJvdmUgPSAtMSwKLSAgICAgICAgICAgIEV4YWN0TWF0Y2ggPSAwLAotICAgICAgICAgICAgQ2xvc2VzdEJlbG93ID0gMQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cDsKKworcHVibGljIGNsYXNzIE1hdGNoIDogTG9va3VwRnVuY3Rpb24geworICBwcml2YXRlIGVudW0gTWF0Y2hUeXBlIHsKKyAgICBDbG9zZXN0QWJvdmUgPSAtMSwKKyAgICBFeGFjdE1hdGNoID0gMCwKKyAgICBDbG9zZXN0QmVsb3cgPSAxLAorICB9CisKKyAgcHVibGljIE1hdGNoKCkKKyAgICAgIDogYmFzZShuZXcgV2lsZENhcmRWYWx1ZU1hdGNoZXIoKSwgbmV3KCkpIHt9CisKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworCisgICAgdmFyIHNlYXJjaGVkVmFsdWUgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlOworICAgIHZhciBhZGRyZXNzID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgcmFuZ2VBZGRyZXNzRmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIpOworICAgIHZhciByYW5nZUFkZHJlc3MgPSByYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZShhZGRyZXNzKTsKKyAgICB2YXIgbWF0Y2hUeXBlID0gR2V0TWF0Y2hUeXBlKGFyZ3VtZW50cyk7CisgICAgdmFyIGFyZ3MgPSBuZXcgTG9va3VwQXJndW1lbnRzKHNlYXJjaGVkVmFsdWUsIGFkZHJlc3MsIDAsIDAsIGZhbHNlKTsKKyAgICB2YXIgbG9va3VwRGlyZWN0aW9uID0gR2V0TG9va3VwRGlyZWN0aW9uKHJhbmdlQWRkcmVzcyk7CisgICAgdmFyIG5hdmlnYXRvciA9IExvb2t1cE5hdmlnYXRvckZhY3RvcnkuQ3JlYXRlKGxvb2t1cERpcmVjdGlvbiwgYXJncywgY29udGV4dCk7CisgICAgaW50PyBsYXN0TWF0Y2hSZXN1bHQgPSBkZWZhdWx0KGludD8pOworICAgIGRvIHsKKyAgICAgIHZhciBtYXRjaFJlc3VsdCA9IElzTWF0Y2gobmF2aWdhdG9yLkN1cnJlbnRWYWx1ZSwgc2VhcmNoZWRWYWx1ZSk7CisgICAgICBpZiAobWF0Y2hUeXBlID09IE1hdGNoVHlwZS5DbG9zZXN0QmVsb3cgJiYgbWF0Y2hSZXN1bHQgPj0gMCkgeworICAgICAgICBpZiAoIWxhc3RNYXRjaFJlc3VsdC5IYXNWYWx1ZSAmJiBtYXRjaFJlc3VsdCA+IDApIHsKKyAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZy4gVGhpcyBoYXBwZW5zIG9ubHkgaWYgdGhlIGZpcnN0IGl0ZW0gaXMKKyAgICAgICAgICAvLyBiZWxvdyB0aGUgc2VhcmNoZWQgdmFsdWUuCiAgICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWF0Y2goKQotICAgICAgICAgICAgOiBiYXNlKG5ldyBXaWxkQ2FyZFZhbHVlTWF0Y2hlcigpLCBuZXcgQ29tcGlsZVJlc3VsdEZhY3RvcnkoKSkKLSAgICAgICAgewotCisgICAgICAgIHZhciBpbmRleCA9IG1hdGNoUmVzdWx0ID09IDAgPyBuYXZpZ2F0b3IuSW5kZXggKyAxIDogbmF2aWdhdG9yLkluZGV4OworICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGluZGV4LCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgIH0KKyAgICAgIGlmIChtYXRjaFR5cGUgPT0gTWF0Y2hUeXBlLkNsb3Nlc3RBYm92ZSAmJiBtYXRjaFJlc3VsdCA8PSAwKSB7CisgICAgICAgIGlmICghbGFzdE1hdGNoUmVzdWx0Lkhhc1ZhbHVlICYmIG1hdGNoUmVzdWx0IDwgMCkgeworICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nLiBUaGlzIGhhcHBlbnMgb25seSBpZiB0aGUgZmlyc3QgaXRlbSBpcworICAgICAgICAgIC8vIGFib3ZlIHRoZSBzZWFyY2hlZCB2YWx1ZQogICAgICAgICB9CisgICAgICAgIHZhciBpbmRleCA9IG1hdGNoUmVzdWx0ID09IDAgPyBuYXZpZ2F0b3IuSW5kZXggKyAxIDogbmF2aWdhdG9yLkluZGV4OworICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGluZGV4LCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgIH0KKyAgICAgIGlmIChtYXRjaFR5cGUgPT0gTWF0Y2hUeXBlLkV4YWN0TWF0Y2ggJiYgbWF0Y2hSZXN1bHQgPT0gMCkgeworICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KG5hdmlnYXRvci5JbmRleCArIDEsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgfQorICAgICAgbGFzdE1hdGNoUmVzdWx0ID0gbWF0Y2hSZXN1bHQ7CisgICAgfSB3aGlsZSAobmF2aWdhdG9yLk1vdmVOZXh0KCkpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQobnVsbCwgRGF0YVR5cGUuSW50ZWdlcik7CisgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKLQotICAgICAgICAgICAgdmFyIHNlYXJjaGVkVmFsdWUgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlOwotICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIHJhbmdlQWRkcmVzc0ZhY3RvcnkgPSBuZXcgUmFuZ2VBZGRyZXNzRmFjdG9yeShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyKTsKLSAgICAgICAgICAgIHZhciByYW5nZUFkZHJlc3MgPSByYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZShhZGRyZXNzKTsKLSAgICAgICAgICAgIHZhciBtYXRjaFR5cGUgPSBHZXRNYXRjaFR5cGUoYXJndW1lbnRzKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gbmV3IExvb2t1cEFyZ3VtZW50cyhzZWFyY2hlZFZhbHVlLCBhZGRyZXNzLCAwLCAwLCBmYWxzZSk7Ci0gICAgICAgICAgICB2YXIgbG9va3VwRGlyZWN0aW9uID0gR2V0TG9va3VwRGlyZWN0aW9uKHJhbmdlQWRkcmVzcyk7Ci0gICAgICAgICAgICB2YXIgbmF2aWdhdG9yID0gTG9va3VwTmF2aWdhdG9yRmFjdG9yeS5DcmVhdGUobG9va3VwRGlyZWN0aW9uLCBhcmdzLCBjb250ZXh0KTsKLSAgICAgICAgICAgIGludD8gbGFzdE1hdGNoUmVzdWx0ID0gZGVmYXVsdChpbnQ/KTsKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIG1hdGNoUmVzdWx0ID0gSXNNYXRjaChuYXZpZ2F0b3IuQ3VycmVudFZhbHVlLCBzZWFyY2hlZFZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hUeXBlID09IE1hdGNoVHlwZS5DbG9zZXN0QmVsb3cgJiYgbWF0Y2hSZXN1bHQgPj0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbGFzdE1hdGNoUmVzdWx0Lkhhc1ZhbHVlICYmIG1hdGNoUmVzdWx0ID4gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcuIFRoaXMgaGFwcGVucyBvbmx5IGlmIHRoZSBmaXJzdCBpdGVtIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWxvdyB0aGUgc2VhcmNoZWQgdmFsdWUuCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gbWF0Y2hSZXN1bHQgPT0gMCA/IG5hdmlnYXRvci5JbmRleCArIDEgOiBuYXZpZ2F0b3IuSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoaW5kZXgsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobWF0Y2hUeXBlID09IE1hdGNoVHlwZS5DbG9zZXN0QWJvdmUgJiYgbWF0Y2hSZXN1bHQgPD0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbGFzdE1hdGNoUmVzdWx0Lkhhc1ZhbHVlICYmIG1hdGNoUmVzdWx0IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcuIFRoaXMgaGFwcGVucyBvbmx5IGlmIHRoZSBmaXJzdCBpdGVtIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhYm92ZSB0aGUgc2VhcmNoZWQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBtYXRjaFJlc3VsdCA9PSAwID8gbmF2aWdhdG9yLkluZGV4ICsgMSA6IG5hdmlnYXRvci5JbmRleDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChpbmRleCwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtYXRjaFR5cGUgPT0gTWF0Y2hUeXBlLkV4YWN0TWF0Y2ggJiYgbWF0Y2hSZXN1bHQgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQobmF2aWdhdG9yLkluZGV4ICsgMSwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxhc3RNYXRjaFJlc3VsdCA9IG1hdGNoUmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKG5hdmlnYXRvci5Nb3ZlTmV4dCgpKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQobnVsbCwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE1hdGNoVHlwZSBHZXRNYXRjaFR5cGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWF0Y2hUeXBlID0gTWF0Y2hUeXBlLkNsb3Nlc3RCZWxvdzsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA+IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWF0Y2hUeXBlID0gKE1hdGNoVHlwZSlBcmdUb0ludChhcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1hdGNoVHlwZTsKLSAgICAgICAgfQorICBwcml2YXRlIE1hdGNoVHlwZSBHZXRNYXRjaFR5cGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzKSB7CisgICAgdmFyIG1hdGNoVHlwZSA9IE1hdGNoVHlwZS5DbG9zZXN0QmVsb3c7CisgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID4gMikgeworICAgICAgbWF0Y2hUeXBlID0gKE1hdGNoVHlwZSlBcmdUb0ludChhcmd1bWVudHMsIDIpOwogICAgIH0KKyAgICByZXR1cm4gbWF0Y2hUeXBlOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9PZmZzZXQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9PZmZzZXQuY3MKaW5kZXggMjE2Zjc5ZS4uOGExNjA4MCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvT2Zmc2V0LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL09mZnNldC5jcwpAQCAtNyw3NCArNyw3MCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE1LTAxLTExCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKLXsKLSAgICBwdWJsaWMgY2xhc3MgT2Zmc2V0IDogTG9va3VwRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuY3Rpb25Bcmd1bWVudHMgPSBhcmd1bWVudHMgYXMgRnVuY3Rpb25Bcmd1bWVudFtdID8/IGFyZ3VtZW50cy5Ub0FycmF5KCk7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhmdW5jdGlvbkFyZ3VtZW50cywgMyk7Ci0gICAgICAgICAgICB2YXIgc3RhcnRSYW5nZSA9IEFyZ1RvU3RyaW5nKGZ1bmN0aW9uQXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHZhciByb3dPZmZzZXQgPSBBcmdUb0ludChmdW5jdGlvbkFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgY29sT2Zmc2V0ID0gQXJnVG9JbnQoZnVuY3Rpb25Bcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgaW50IHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKLSAgICAgICAgICAgIGlmIChmdW5jdGlvbkFyZ3VtZW50cy5MZW5ndGggPiAzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhlaWdodCA9IEFyZ1RvSW50KGZ1bmN0aW9uQXJndW1lbnRzLCAzKTsKLSAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IGhlaWdodCA9PSAwLCBlRXJyb3JUeXBlLlJlZik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZnVuY3Rpb25Bcmd1bWVudHMuTGVuZ3RoID4gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aWR0aCA9IEFyZ1RvSW50KGZ1bmN0aW9uQXJndW1lbnRzLCA0KTsKLSAgICAgICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IHdpZHRoID09IDAsIGVFcnJvclR5cGUuUmVmKTsKLSAgICAgICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXA7CiAKLSAgICAgICAgICAgIHZhciBhZHIgPSBuZXcgRXhjZWxBZGRyZXNzKHN0YXJ0UmFuZ2UpOwotICAgICAgICAgICAgdmFyIHdzID0gYWRyLldvcmtTaGVldDsKLQotICAgICAgICAgICAgdmFyIGZyb21Sb3cgPSBhZHIuX2Zyb21Sb3cgKyByb3dPZmZzZXQ7Ci0gICAgICAgICAgICB2YXIgZnJvbUNvbCA9IGFkci5fZnJvbUNvbCArIGNvbE9mZnNldDsKLSAgICAgICAgICAgIHZhciB0b1JvdyA9IChoZWlnaHQgIT0gMCA/IGhlaWdodCA6IGFkci5fdG9Sb3cpICsgcm93T2Zmc2V0OwotICAgICAgICAgICAgdmFyIHRvQ29sID0gKHdpZHRoICE9IDAgPyB3aWR0aCA6IGFkci5fdG9Db2wpICsgY29sT2Zmc2V0OwotCi0gICAgICAgICAgICB2YXIgbmV3UmFuZ2UgPSBjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLkdldFJhbmdlKHdzLCBmcm9tUm93LCBmcm9tQ29sLCB0b1JvdywgdG9Db2wpOwotICAgICAgICAgICAgaWYgKCFuZXdSYW5nZS5Jc011bHRpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChuZXdSYW5nZS5Jc0VtcHR5KSByZXR1cm4gQ29tcGlsZVJlc3VsdC5FbXB0eTsKLSAgICAgICAgICAgICAgICB2YXIgdmFsID0gbmV3UmFuZ2UuR2V0VmFsdWUoZnJvbVJvdywgZnJvbUNvbCk7Ci0gICAgICAgICAgICAgICAgaWYgKElzTnVtZXJpYyh2YWwpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodmFsIGlzIEV4Y2VsRXJyb3JWYWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQodmFsLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLlN0cmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KG5ld1JhbmdlLCBEYXRhVHlwZS5FbnVtZXJhYmxlKTsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIE9mZnNldCA6IExvb2t1cEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICB2YXIgZnVuY3Rpb25Bcmd1bWVudHMgPSBhcmd1bWVudHMgYXMgRnVuY3Rpb25Bcmd1bWVudFtdID8/IGFyZ3VtZW50cy5Ub0FycmF5KCk7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoZnVuY3Rpb25Bcmd1bWVudHMsIDMpOworICAgIHZhciBzdGFydFJhbmdlID0gQXJnVG9TdHJpbmcoZnVuY3Rpb25Bcmd1bWVudHMsIDApOworICAgIHZhciByb3dPZmZzZXQgPSBBcmdUb0ludChmdW5jdGlvbkFyZ3VtZW50cywgMSk7CisgICAgdmFyIGNvbE9mZnNldCA9IEFyZ1RvSW50KGZ1bmN0aW9uQXJndW1lbnRzLCAyKTsKKyAgICBpbnQgd2lkdGggPSAwLAorICAgICAgICBoZWlnaHQgPSAwOworICAgIGlmIChmdW5jdGlvbkFyZ3VtZW50cy5MZW5ndGggPiAzKSB7CisgICAgICBoZWlnaHQgPSBBcmdUb0ludChmdW5jdGlvbkFyZ3VtZW50cywgMyk7CisgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IGhlaWdodCA9PSAwLCBlRXJyb3JUeXBlLlJlZik7CiAgICAgfQorICAgIGlmIChmdW5jdGlvbkFyZ3VtZW50cy5MZW5ndGggPiA0KSB7CisgICAgICB3aWR0aCA9IEFyZ1RvSW50KGZ1bmN0aW9uQXJndW1lbnRzLCA0KTsKKyAgICAgIFRocm93RXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uSWYoKCkgPT4gd2lkdGggPT0gMCwgZUVycm9yVHlwZS5SZWYpOworICAgIH0KKworICAgIHZhciBhZHIgPSBuZXcgRXhjZWxBZGRyZXNzKHN0YXJ0UmFuZ2UpOworICAgIHZhciB3cyA9IGFkci5Xb3JrU2hlZXQ7CisKKyAgICB2YXIgZnJvbVJvdyA9IGFkci5fZnJvbVJvdyArIHJvd09mZnNldDsKKyAgICB2YXIgZnJvbUNvbCA9IGFkci5fZnJvbUNvbCArIGNvbE9mZnNldDsKKyAgICB2YXIgdG9Sb3cgPSAoaGVpZ2h0ICE9IDAgPyBoZWlnaHQgOiBhZHIuX3RvUm93KSArIHJvd09mZnNldDsKKyAgICB2YXIgdG9Db2wgPSAod2lkdGggIT0gMCA/IHdpZHRoIDogYWRyLl90b0NvbCkgKyBjb2xPZmZzZXQ7CisKKyAgICB2YXIgbmV3UmFuZ2UgPSBjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLkdldFJhbmdlKHdzLCBmcm9tUm93LCBmcm9tQ29sLCB0b1JvdywgdG9Db2wpOworICAgIGlmICghbmV3UmFuZ2UuSXNNdWx0aSkgeworICAgICAgaWYgKG5ld1JhbmdlLklzRW1wdHkpIHsKKyAgICAgICAgcmV0dXJuIENvbXBpbGVSZXN1bHQuRW1wdHk7CisgICAgICB9CisgICAgICB2YXIgdmFsID0gbmV3UmFuZ2UuR2V0VmFsdWUoZnJvbVJvdywgZnJvbUNvbCk7CisgICAgICBpZiAoSXNOdW1lcmljKHZhbCkpIHsKKyAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgfQorICAgICAgaWYgKHZhbCBpcyBFeGNlbEVycm9yVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLkV4Y2VsRXJyb3IpOworICAgICAgfQorICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLlN0cmluZyk7CisgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQobmV3UmFuZ2UsIERhdGFUeXBlLkVudW1lcmFibGUpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Sb3cuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Sb3cuY3MKaW5kZXggN2IxOGNlMS4uNWIyMGE1YiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvUm93LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL1Jvdy5jcwpAQCAtNyw0NiArNyw0MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cAotewotICAgIHB1YmxpYyBjbGFzcyBSb3cgOiBMb29rdXBGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCB8fCBhcmd1bWVudHMuQ291bnQoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoY29udGV4dC5TY29wZXMuQ3VycmVudC5BZGRyZXNzLkZyb21Sb3csIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHJhbmdlQWRkcmVzcyA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICBpZiAoIUV4Y2VsQWRkcmVzc1V0aWwuSXNWYWxpZEFkZHJlc3MocmFuZ2VBZGRyZXNzKSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkFuIGludmFsaWQgYXJndW1lbnQgd2FzIHN1cHBsaWVkIik7Ci0gICAgICAgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIpOwotICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSBmYWN0b3J5LkNyZWF0ZShyYW5nZUFkZHJlc3MpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChhZGRyZXNzLkZyb21Sb3csIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwOworCitwdWJsaWMgY2xhc3MgUm93IDogTG9va3VwRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCB8fCBhcmd1bWVudHMuQ291bnQoKSA9PSAwKSB7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGNvbnRleHQuU2NvcGVzLkN1cnJlbnQuQWRkcmVzcy5Gcm9tUm93LCBEYXRhVHlwZS5JbnRlZ2VyKTsKICAgICB9CisgICAgdmFyIHJhbmdlQWRkcmVzcyA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7CisgICAgaWYgKCFFeGNlbEFkZHJlc3NVdGlsLklzVmFsaWRBZGRyZXNzKHJhbmdlQWRkcmVzcykpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiQW4gaW52YWxpZCBhcmd1bWVudCB3YXMgc3VwcGxpZWQiKTsKKyAgICB9CisgICAgdmFyIGZhY3RvcnkgPSBuZXcgUmFuZ2VBZGRyZXNzRmFjdG9yeShjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyKTsKKyAgICB2YXIgYWRkcmVzcyA9IGZhY3RvcnkuQ3JlYXRlKHJhbmdlQWRkcmVzcyk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChhZGRyZXNzLkZyb21Sb3csIERhdGFUeXBlLkludGVnZXIpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Sb3dzLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvUm93cy5jcwppbmRleCBhYjNkNTgwLi45NGY1MjAzIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9Sb3dzLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL1Jvd3MuY3MKQEAgLTcsNTMgKzcsNDUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwotdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXAKLXsKLSAgICBwdWJsaWMgY2xhc3MgUm93cyA6IExvb2t1cEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciByPWFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWVBc1JhbmdlSW5mbzsKLSAgICAgICAgICAgIGlmIChyICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyLkFkZHJlc3MuX3RvUm93IC0gci5BZGRyZXNzLl9mcm9tUm93ICsgMSwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAoRXhjZWxBZGRyZXNzVXRpbC5Jc1ZhbGlkQWRkcmVzcyhyYW5nZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICB2YXIgYWRkcmVzcyA9IGZhY3RvcnkuQ3JlYXRlKHJhbmdlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChhZGRyZXNzLlRvUm93IC0gYWRkcmVzcy5Gcm9tUm93ICsgMSwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJhbmdlIHN1cHBsaWVkIik7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5SZWZBbmRMb29rdXA7CisKK3B1YmxpYyBjbGFzcyBSb3dzIDogTG9va3VwRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIHIgPSBhcmd1bWVudHMuRWxlbWVudEF0KDApLlZhbHVlQXNSYW5nZUluZm87CisgICAgaWYgKHIgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyLkFkZHJlc3MuX3RvUm93IC0gci5BZGRyZXNzLl9mcm9tUm93ICsgMSwgRGF0YVR5cGUuSW50ZWdlcik7CiAgICAgfQorICAgIHZhciByYW5nZSA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7CisgICAgaWYgKEV4Y2VsQWRkcmVzc1V0aWwuSXNWYWxpZEFkZHJlc3MocmFuZ2UpKSB7CisgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIpOworICAgICAgdmFyIGFkZHJlc3MgPSBmYWN0b3J5LkNyZWF0ZShyYW5nZSk7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KGFkZHJlc3MuVG9Sb3cgLSBhZGRyZXNzLkZyb21Sb3cgKyAxLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJhbmdlIHN1cHBsaWVkIik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL1ZMb29rdXAuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1JlZkFuZExvb2t1cC9WTG9va3VwLmNzCmluZGV4IGExZjg3YjUuLjU1OTcxNWEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvUmVmQW5kTG9va3VwL1ZMb29rdXAuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9SZWZBbmRMb29rdXAvVkxvb2t1cC5jcwpAQCAtNyw1MSArNyw0NSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uRGlhZ25vc3RpY3M7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuUmVmQW5kTG9va3VwCi17Ci0gICAgcHVibGljIGNsYXNzIFZMb29rdXAgOiBMb29rdXBGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0b3B3YXRjaCBzdyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoY29udGV4dC5EZWJ1ZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdyA9IG5ldyBTdG9wd2F0Y2goKTsKLSAgICAgICAgICAgICAgICBzdy5TdGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAzKTsKLSAgICAgICAgICAgIHZhciBsb29rdXBBcmdzID0gbmV3IExvb2t1cEFyZ3VtZW50cyhhcmd1bWVudHMpOwotICAgICAgICAgICAgdmFyIG5hdmlnYXRvciA9IExvb2t1cE5hdmlnYXRvckZhY3RvcnkuQ3JlYXRlKExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCwgbG9va3VwQXJncywgY29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gTG9va3VwKG5hdmlnYXRvciwgbG9va3VwQXJncyk7Ci0gICAgICAgICAgICBpZiAoY29udGV4dC5EZWJ1ZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdy5TdG9wKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5Db25maWd1cmF0aW9uLkxvZ2dlci5Mb2dGdW5jdGlvbigiVkxPT0tVUCIsIHN3LkVsYXBzZWRNaWxsaXNlY29uZHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlJlZkFuZExvb2t1cDsKKworcHVibGljIGNsYXNzIFZMb29rdXAgOiBMb29rdXBGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgU3RvcHdhdGNoIHN3ID0gbnVsbDsKKyAgICBpZiAoY29udGV4dC5EZWJ1ZykgeworICAgICAgc3cgPSBuZXcoKTsKKyAgICAgIHN3LlN0YXJ0KCk7CiAgICAgfQorICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7CisgICAgdmFyIGxvb2t1cEFyZ3MgPSBuZXcgTG9va3VwQXJndW1lbnRzKGFyZ3VtZW50cyk7CisgICAgdmFyIG5hdmlnYXRvciA9IExvb2t1cE5hdmlnYXRvckZhY3RvcnkuQ3JlYXRlKExvb2t1cERpcmVjdGlvbi5WZXJ0aWNhbCwgbG9va3VwQXJncywgY29udGV4dCk7CisgICAgdmFyIHJlc3VsdCA9IExvb2t1cChuYXZpZ2F0b3IsIGxvb2t1cEFyZ3MpOworICAgIGlmIChjb250ZXh0LkRlYnVnKSB7CisgICAgICBzdy5TdG9wKCk7CisgICAgICBjb250ZXh0LkNvbmZpZ3VyYXRpb24uTG9nZ2VyLkxvZ0Z1bmN0aW9uKCJWTE9PS1VQIiwgc3cuRWxhcHNlZE1pbGxpc2Vjb25kcyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9DU3RyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0NTdHIuY3MKaW5kZXggYjY0ZGE3MC4uMjM1MGM2YyAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0NTdHIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0NTdHIuY3MKQEAgLTcsMzUgKzcsMzIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dAotewotICAgIHB1YmxpYyBjbGFzcyBDU3RyIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCksIERhdGFUeXBlLlN0cmluZyk7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dDsKKworcHVibGljIGNsYXNzIENTdHIgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQoQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKSwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0NoYXJGdW5jdGlvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9DaGFyRnVuY3Rpb24uY3MKaW5kZXggYWMyMWYzNC4uMjMxNDc5YSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0NoYXJGdW5jdGlvbi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvQ2hhckZ1bmN0aW9uLmNzCkBAIC0xLDE5ICsxLDE1IEBACi3vu791c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK++7v3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Ci17Ci0gICAgcHVibGljIGNsYXNzIENoYXJGdW5jdGlvbiA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIG51bWJlciA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICBUaHJvd0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbklmKCgpID0+IG51bWJlciA8IDEgfHwgbnVtYmVyID4gMjU1LCBlRXJyb3JUeXBlLlZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoKChjaGFyKSBudW1iZXIpLlRvU3RyaW5nKCksIERhdGFUeXBlLlN0cmluZyk7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dDsKKworcHVibGljIGNsYXNzIENoYXJGdW5jdGlvbiA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIG51bWJlciA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMCk7CisgICAgVGhyb3dFeGNlbEVycm9yVmFsdWVFeGNlcHRpb25JZigoKSA9PiBudW1iZXIgPCAxIHx8IG51bWJlciA+IDI1NSwgZUVycm9yVHlwZS5WYWx1ZSk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCgoKGNoYXIpbnVtYmVyKS5Ub1N0cmluZygpLCBEYXRhVHlwZS5TdHJpbmcpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvQ29uY2F0ZW5hdGUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvQ29uY2F0ZW5hdGUuY3MKaW5kZXggOTEwMjE5NS4uOWEyMjQyMiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0NvbmNhdGVuYXRlLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9Db25jYXRlbmF0ZS5jcwpAQCAtNyw0NyArNyw0MiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKIHVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Ci17Ci0gICAgcHVibGljIGNsYXNzIENvbmNhdGVuYXRlIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhcmd1bWVudHMgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHN0cmluZy5FbXB0eSwgRGF0YVR5cGUuU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgdiA9IGFyZy5WYWx1ZUZpcnN0OwotICAgICAgICAgICAgICAgIGlmICh2ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQodik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChzYi5Ub1N0cmluZygpLCBEYXRhVHlwZS5TdHJpbmcpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dDsKKworcHVibGljIGNsYXNzIENvbmNhdGVuYXRlIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgaWYgKGFyZ3VtZW50cyA9PSBudWxsKSB7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHN0cmluZy5FbXB0eSwgRGF0YVR5cGUuU3RyaW5nKTsKICAgICB9CisgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBmb3JlYWNoICh2YXIgYXJnIGluIGFyZ3VtZW50cykgeworICAgICAgdmFyIHYgPSBhcmcuVmFsdWVGaXJzdDsKKyAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgc2IuQXBwZW5kKHYpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHNiLlRvU3RyaW5nKCksIERhdGFUeXBlLlN0cmluZyk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9FeGFjdC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9FeGFjdC5jcwppbmRleCAxY2FjZmZmLi40MWQ2YTNlIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvRXhhY3QuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0V4YWN0LmNzCkBAIC03LDQ4ICs3LDQ4IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXhhY3QgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKLSAgICAgICAgICAgIHZhciB2YWwxID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZUZpcnN0OwotICAgICAgICAgICAgdmFyIHZhbDIgPSBhcmd1bWVudHMuRWxlbWVudEF0KDEpLlZhbHVlRmlyc3Q7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dDsKIAotICAgICAgICAgICAgaWYgKHZhbDEgPT0gbnVsbCAmJiB2YWwyID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh0cnVlLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCh2YWwxID09IG51bGwgJiYgdmFsMiAhPSBudWxsKSB8fCAodmFsMSAhPSBudWxsICYmIHZhbDIgPT0gbnVsbCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChmYWxzZSwgRGF0YVR5cGUuQm9vbGVhbik7Ci0gICAgICAgICAgICB9CitwdWJsaWMgY2xhc3MgRXhhY3QgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOworICAgIHZhciB2YWwxID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZUZpcnN0OworICAgIHZhciB2YWwyID0gYXJndW1lbnRzLkVsZW1lbnRBdCgxKS5WYWx1ZUZpcnN0OwogCi0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gc3RyaW5nLkNvbXBhcmUodmFsMS5Ub1N0cmluZygpLCB2YWwyLlRvU3RyaW5nKCksIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCA9PSAwLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgfQorICAgIGlmICh2YWwxID09IG51bGwgJiYgdmFsMiA9PSBudWxsKSB7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHRydWUsIERhdGFUeXBlLkJvb2xlYW4pOwogICAgIH0KKyAgICBpZiAoKHZhbDEgPT0gbnVsbCAmJiB2YWwyICE9IG51bGwpIHx8ICh2YWwxICE9IG51bGwgJiYgdmFsMiA9PSBudWxsKSkgeworICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChmYWxzZSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgfQorCisgICAgdmFyIHJlc3VsdCA9IHN0cmluZy5Db21wYXJlKAorICAgICAgICB2YWwxLlRvU3RyaW5nKCksCisgICAgICAgIHZhbDIuVG9TdHJpbmcoKSwKKyAgICAgICAgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCA9PSAwLCBEYXRhVHlwZS5Cb29sZWFuKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0ZpbmQuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvRmluZC5jcwppbmRleCBlZDYyMmQwLi4xYThjMjU1IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvRmluZC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvRmluZC5jcwpAQCAtNyw1MCArNyw0NyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Ci17Ci0gICAgcHVibGljIGNsYXNzIEZpbmQgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQXJndW1lbnRzID0gYXJndW1lbnRzIGFzIEZ1bmN0aW9uQXJndW1lbnRbXSA/PyBhcmd1bWVudHMuVG9BcnJheSgpOwotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoZnVuY3Rpb25Bcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgdmFyIHNlYXJjaCA9IEFyZ1RvU3RyaW5nKGZ1bmN0aW9uQXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHZhciBzZWFyY2hJbiA9IEFyZ1RvU3RyaW5nKGZ1bmN0aW9uQXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBzdGFydEluZGV4ID0gMDsKLSAgICAgICAgICAgIGlmIChmdW5jdGlvbkFyZ3VtZW50cy5Db3VudCgpID4gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdGFydEluZGV4ID0gQXJnVG9JbnQoZnVuY3Rpb25Bcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHNlYXJjaEluLkluZGV4T2Yoc2VhcmNoLCBzdGFydEluZGV4LCBTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuVmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEFkZGluZyAxIGJlY2F1c2UgRXhjZWwgdXNlcyAxLWJhc2VkIGluZGV4Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCArIDEsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dDsKKworcHVibGljIGNsYXNzIEZpbmQgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICB2YXIgZnVuY3Rpb25Bcmd1bWVudHMgPSBhcmd1bWVudHMgYXMgRnVuY3Rpb25Bcmd1bWVudFtdID8/IGFyZ3VtZW50cy5Ub0FycmF5KCk7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoZnVuY3Rpb25Bcmd1bWVudHMsIDIpOworICAgIHZhciBzZWFyY2ggPSBBcmdUb1N0cmluZyhmdW5jdGlvbkFyZ3VtZW50cywgMCk7CisgICAgdmFyIHNlYXJjaEluID0gQXJnVG9TdHJpbmcoZnVuY3Rpb25Bcmd1bWVudHMsIDEpOworICAgIHZhciBzdGFydEluZGV4ID0gMDsKKyAgICBpZiAoZnVuY3Rpb25Bcmd1bWVudHMuQ291bnQoKSA+IDIpIHsKKyAgICAgIHN0YXJ0SW5kZXggPSBBcmdUb0ludChmdW5jdGlvbkFyZ3VtZW50cywgMik7CiAgICAgfQorICAgIHZhciByZXN1bHQgPSBzZWFyY2hJbi5JbmRleE9mKHNlYXJjaCwgc3RhcnRJbmRleCwgU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsKTsKKyAgICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgICB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSkpOworICAgIH0KKyAgICAvLyBBZGRpbmcgMSBiZWNhdXNlIEV4Y2VsIHVzZXMgMS1iYXNlZCBpbmRleAorICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0ICsgMSwgRGF0YVR5cGUuSW50ZWdlcik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9GaXhlZC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9GaXhlZC5jcwppbmRleCBjODUyOTU5Li40ZWFiNzAwIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvRml4ZWQuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0ZpeGVkLmNzCkBAIC0xLDM3ICsxLDMxIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK++7v3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Ci17Ci0gICAgcHVibGljIGNsYXNzIEZpeGVkIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgbnVtYmVyID0gQXJnVG9EZWNpbWFsKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICB2YXIgbkRlY2ltYWxzID0gMjsKLSAgICAgICAgICAgIHZhciBub0NvbW1hcyA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuRGVjaW1hbHMgPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5Db3VudCgpID4gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBub0NvbW1hcyA9IEFyZ1RvQm9vbChhcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIGZvcm1hdCA9IChub0NvbW1hcyA/ICJGIiA6ICJOIikgKyBuRGVjaW1hbHMuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICBpZiAobkRlY2ltYWxzIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBudW1iZXIgPSBudW1iZXIgLSAobnVtYmVyICUgKFN5c3RlbS5NYXRoLlBvdygxMCwgbkRlY2ltYWxzICogLTEpKSk7Ci0gICAgICAgICAgICAgICAgbnVtYmVyID0gU3lzdGVtLk1hdGguRmxvb3IobnVtYmVyKTsKLSAgICAgICAgICAgICAgICBmb3JtYXQgPSBub0NvbW1hcyA/ICJGMCIgOiAiTjAiOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHJldFZhbCA9IG51bWJlci5Ub1N0cmluZyhmb3JtYXQpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXRWYWwsIERhdGFUeXBlLlN0cmluZyk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0OworCitwdWJsaWMgY2xhc3MgRml4ZWQgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHZhciBudW1iZXIgPSBBcmdUb0RlY2ltYWwoYXJndW1lbnRzLCAwKTsKKyAgICB2YXIgbkRlY2ltYWxzID0gMjsKKyAgICB2YXIgbm9Db21tYXMgPSBmYWxzZTsKKyAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiAxKSB7CisgICAgICBuRGVjaW1hbHMgPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOwogICAgIH0KKyAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiAyKSB7CisgICAgICBub0NvbW1hcyA9IEFyZ1RvQm9vbChhcmd1bWVudHMsIDIpOworICAgIH0KKyAgICB2YXIgZm9ybWF0ID0gKG5vQ29tbWFzID8gIkYiIDogIk4iKSArIG5EZWNpbWFscy5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICBpZiAobkRlY2ltYWxzIDwgMCkgeworICAgICAgbnVtYmVyID0gbnVtYmVyIC0gKG51bWJlciAlIChTeXN0ZW0uTWF0aC5Qb3coMTAsIG5EZWNpbWFscyAqIC0xKSkpOworICAgICAgbnVtYmVyID0gU3lzdGVtLk1hdGguRmxvb3IobnVtYmVyKTsKKyAgICAgIGZvcm1hdCA9IG5vQ29tbWFzID8gIkYwIiA6ICJOMCI7CisgICAgfQorICAgIHZhciByZXRWYWwgPSBudW1iZXIuVG9TdHJpbmcoZm9ybWF0KTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJldFZhbCwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0h5cGVybGluay5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9IeXBlcmxpbmsuY3MKaW5kZXggZTJkMTg0YS4uMTYzNWY0MyAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0h5cGVybGluay5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvSHlwZXJsaW5rLmNzCkBAIC03LDM5ICs3LDM2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTUtMDEtMTAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKLXsKLSAgICBwdWJsaWMgY2xhc3MgSHlwZXJsaW5rIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICBpZiAoYXJndW1lbnRzLkNvdW50KCkgPiAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAxKSwgRGF0YVR5cGUuU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKSwgRGF0YVR5cGUuU3RyaW5nKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQ7CisKK3B1YmxpYyBjbGFzcyBIeXBlcmxpbmsgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIGlmIChhcmd1bWVudHMuQ291bnQoKSA+IDEpIHsKKyAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAxKSwgRGF0YVR5cGUuU3RyaW5nKTsKICAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApLCBEYXRhVHlwZS5TdHJpbmcpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvTGVmdC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9MZWZ0LmNzCmluZGV4IGZkZGZlMzkuLmJkYmJjNzQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9MZWZ0LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9MZWZ0LmNzCkBAIC03LDM3ICs3LDM0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKLXsKLSAgICBwdWJsaWMgY2xhc3MgTGVmdCA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgdmFyIHN0ciA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICB2YXIgbGVuZ3RoID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoc3RyLlN1YnN0cmluZygwLCBsZW5ndGgpLCBEYXRhVHlwZS5TdHJpbmcpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQ7CisKK3B1YmxpYyBjbGFzcyBMZWZ0IDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICB2YXIgc3RyID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKTsKKyAgICB2YXIgbGVuZ3RoID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHN0ci5TdWJzdHJpbmcoMCwgbGVuZ3RoKSwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0xlbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9MZW4uY3MKaW5kZXggMzU3MjUyYi4uZDVjZTc4NSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0xlbi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvTGVuLmNzCkBAIC03LDM2ICs3LDM1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKLXsKLSAgICBwdWJsaWMgY2xhc3MgTGVuIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLkZpcnN0KCkuVmFsdWVGaXJzdC5Ub1N0cmluZygpLkxlbmd0aDsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoQ29udmVydC5Ub0RvdWJsZShsZW5ndGgpLCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0OworCitwdWJsaWMgY2xhc3MgTGVuIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLkZpcnN0KCkuVmFsdWVGaXJzdC5Ub1N0cmluZygpLkxlbmd0aDsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KENvbnZlcnQuVG9Eb3VibGUobGVuZ3RoKSwgRGF0YVR5cGUuSW50ZWdlcik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9Mb3dlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9Mb3dlci5jcwppbmRleCAyNDRkODZkLi5iOWU1MWUyIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvTG93ZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L0xvd2VyLmNzCkBAIC03LDM1ICs3LDMzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKLXsKLSAgICBwdWJsaWMgY2xhc3MgTG93ZXIgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoYXJndW1lbnRzLkZpcnN0KCkuVmFsdWVGaXJzdC5Ub1N0cmluZygpLlRvTG93ZXIoKSwgRGF0YVR5cGUuU3RyaW5nKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0OworCitwdWJsaWMgY2xhc3MgTG93ZXIgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQoYXJndW1lbnRzLkZpcnN0KCkuVmFsdWVGaXJzdC5Ub1N0cmluZygpLlRvTG93ZXIoKSwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L01pZC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9NaWQuY3MKaW5kZXggM2Y3ZGE3YS4uOGJiZDBlNiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L01pZC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvTWlkLmNzCkBAIC03LDUxICs3LDQ2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKLXsKLSAgICBwdWJsaWMgY2xhc3MgTWlkIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7Ci0gICAgICAgICAgICB2YXIgdGV4dCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICB2YXIgc3RhcnRJeCA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgbGVuZ3RoID0gQXJnVG9JbnQoYXJndW1lbnRzLCAyKTsKLSAgICAgICAgICAgIGlmKHN0YXJ0SXg8PTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJBcmd1bWVudCBzdGFydCBjYW4ndCBiZSBsZXNzIHRoYW4gMSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vQWxsb3cgb3ZlcmZsb3dpbmcgc3RhcnQgYW5kIGxlbmd0aAotICAgICAgICAgICAgaWYgKHN0YXJ0SXggPiB0ZXh0Lkxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KCIiLCBEYXRhVHlwZS5TdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0ZXh0LlN1YnN0cmluZyhzdGFydEl4IC0gMSwgc3RhcnRJeCAtIDEgKyBsZW5ndGggPCB0ZXh0Lkxlbmd0aCA/IGxlbmd0aCA6IHRleHQuTGVuZ3RoIC0gc3RhcnRJeCArIDEpOwotICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5TdHJpbmcpOwotICAgICAgICAgICAgfQotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dDsKKworcHVibGljIGNsYXNzIE1pZCA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMyk7CisgICAgdmFyIHRleHQgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApOworICAgIHZhciBzdGFydEl4ID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgbGVuZ3RoID0gQXJnVG9JbnQoYXJndW1lbnRzLCAyKTsKKyAgICBpZiAoc3RhcnRJeCA8PSAwKSB7CisgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJBcmd1bWVudCBzdGFydCBjYW4ndCBiZSBsZXNzIHRoYW4gMSIpKTsKICAgICB9CisgICAgLy9BbGxvdyBvdmVyZmxvd2luZyBzdGFydCBhbmQgbGVuZ3RoCisgICAgaWYgKHN0YXJ0SXggPiB0ZXh0Lkxlbmd0aCkgeworICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCgiIiwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICB9CisgICAgdmFyIHJlc3VsdCA9IHRleHQuU3Vic3RyaW5nKAorICAgICAgICBzdGFydEl4IC0gMSwKKyAgICAgICAgc3RhcnRJeCAtIDEgKyBsZW5ndGggPCB0ZXh0Lkxlbmd0aCA/IGxlbmd0aCA6IHRleHQuTGVuZ3RoIC0gc3RhcnRJeCArIDEpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5TdHJpbmcpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvUHJvcGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1Byb3Blci5jcwppbmRleCBhNjA0NGQzLi5hMzM2NzQ2IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvUHJvcGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9Qcm9wZXIuY3MKQEAgLTcsNTEgKzcsNDUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uTGlucTsKIHVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Ci17Ci0gICAgcHVibGljIGNsYXNzIFByb3BlciA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgdmFyIHRleHQgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICB2YXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgdmFyIHByZXZpb3VzQ2hhciA9ICcuJzsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjaCBpbiB0ZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghY2hhci5Jc0xldHRlcihwcmV2aW91c0NoYXIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGNoLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLlRvVXBwZXJJbnZhcmlhbnQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByZXZpb3VzQ2hhciA9IGNoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChzYi5Ub1N0cmluZygpLCBEYXRhVHlwZS5TdHJpbmcpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dDsKKworcHVibGljIGNsYXNzIFByb3BlciA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIHRleHQgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICB2YXIgcHJldmlvdXNDaGFyID0gJy4nOworICAgIGZvcmVhY2ggKHZhciBjaCBpbiB0ZXh0KSB7CisgICAgICBpZiAoIWNoYXIuSXNMZXR0ZXIocHJldmlvdXNDaGFyKSkgeworICAgICAgICBzYi5BcHBlbmQoY2guVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkuVG9VcHBlckludmFyaWFudCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLkFwcGVuZChjaCk7CisgICAgICB9CisgICAgICBwcmV2aW91c0NoYXIgPSBjaDsKICAgICB9CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChzYi5Ub1N0cmluZygpLCBEYXRhVHlwZS5TdHJpbmcpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvUmVwbGFjZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9SZXBsYWNlLmNzCmluZGV4IGMyODNjNWQuLjM3Y2NjMmMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9SZXBsYWNlLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9SZXBsYWNlLmNzCkBAIC03LDU0ICs3LDQ5IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKLXsKLSAgICBwdWJsaWMgY2xhc3MgUmVwbGFjZSA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDQpOwotICAgICAgICAgICAgdmFyIG9sZFRleHQgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApOwotICAgICAgICAgICAgdmFyIHN0YXJ0UG9zID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBuQ2hhcnNUb1JlcGxhY2UgPSBBcmdUb0ludChhcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgdmFyIG5ld1RleHQgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDMpOwotICAgICAgICAgICAgdmFyIGZpcnN0UGFydCA9IEdldEZpcnN0UGFydChvbGRUZXh0LCBzdGFydFBvcyk7Ci0gICAgICAgICAgICB2YXIgbGFzdFBhcnQgPSBHZXRMYXN0UGFydChvbGRUZXh0LCBzdGFydFBvcywgbkNoYXJzVG9SZXBsYWNlKTsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBzdHJpbmcuQ29uY2F0KGZpcnN0UGFydCwgbmV3VGV4dCwgbGFzdFBhcnQpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLlN0cmluZyk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0OwogCi0gICAgICAgIHByaXZhdGUgc3RyaW5nIEdldEZpcnN0UGFydChzdHJpbmcgdGV4dCwgaW50IHN0YXJ0UG9zKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dC5TdWJzdHJpbmcoMCwgc3RhcnRQb3MgLSAxKTsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIFJlcGxhY2UgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDQpOworICAgIHZhciBvbGRUZXh0ID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKTsKKyAgICB2YXIgc3RhcnRQb3MgPSBBcmdUb0ludChhcmd1bWVudHMsIDEpOworICAgIHZhciBuQ2hhcnNUb1JlcGxhY2UgPSBBcmdUb0ludChhcmd1bWVudHMsIDIpOworICAgIHZhciBuZXdUZXh0ID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAzKTsKKyAgICB2YXIgZmlyc3RQYXJ0ID0gR2V0Rmlyc3RQYXJ0KG9sZFRleHQsIHN0YXJ0UG9zKTsKKyAgICB2YXIgbGFzdFBhcnQgPSBHZXRMYXN0UGFydChvbGRUZXh0LCBzdGFydFBvcywgbkNoYXJzVG9SZXBsYWNlKTsKKyAgICB2YXIgcmVzdWx0ID0gc3RyaW5nLkNvbmNhdChmaXJzdFBhcnQsIG5ld1RleHQsIGxhc3RQYXJ0KTsKKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgfQogCi0gICAgICAgIHByaXZhdGUgc3RyaW5nIEdldExhc3RQYXJ0KHN0cmluZyB0ZXh0LCBpbnQgc3RhcnRQb3MsIGludCBuQ2hhcmFjdGVyc1RvUmVwbGFjZSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHN0YXJ0SXggPSBzdGFydFBvcyAtMTsKLSAgICAgICAgICAgIHN0YXJ0SXggKz0gbkNoYXJhY3RlcnNUb1JlcGxhY2U7Ci0gICAgICAgICAgICByZXR1cm4gdGV4dC5TdWJzdHJpbmcoc3RhcnRJeCwgdGV4dC5MZW5ndGggLSBzdGFydEl4KTsKLSAgICAgICAgfQotICAgIH0KKyAgcHJpdmF0ZSBzdHJpbmcgR2V0Rmlyc3RQYXJ0KHN0cmluZyB0ZXh0LCBpbnQgc3RhcnRQb3MpIHsKKyAgICByZXR1cm4gdGV4dC5TdWJzdHJpbmcoMCwgc3RhcnRQb3MgLSAxKTsKKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIEdldExhc3RQYXJ0KHN0cmluZyB0ZXh0LCBpbnQgc3RhcnRQb3MsIGludCBuQ2hhcmFjdGVyc1RvUmVwbGFjZSkgeworICAgIGludCBzdGFydEl4ID0gc3RhcnRQb3MgLSAxOworICAgIHN0YXJ0SXggKz0gbkNoYXJhY3RlcnNUb1JlcGxhY2U7CisgICAgcmV0dXJuIHRleHQuU3Vic3RyaW5nKHN0YXJ0SXgsIHRleHQuTGVuZ3RoIC0gc3RhcnRJeCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9SZXB0LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1JlcHQuY3MKaW5kZXggMmRhZmJkNy4uMWY3Y2M1YyAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1JlcHQuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1JlcHQuY3MKQEAgLTcsNDIgKzcsMzkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxNS0wMS0xMAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7CiB1c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dAotewotICAgIHB1YmxpYyBjbGFzcyBSZXB0IDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgc3RyID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHZhciBuID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IG47IHgrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzYi5BcHBlbmQoc3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoc2IuVG9TdHJpbmcoKSwgRGF0YVR5cGUuU3RyaW5nKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQ7CisKK3B1YmxpYyBjbGFzcyBSZXB0IDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICB2YXIgc3RyID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKTsKKyAgICB2YXIgbiA9IEFyZ1RvSW50KGFyZ3VtZW50cywgMSk7CisgICAgdmFyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICBmb3IgKHZhciB4ID0gMDsgeCA8IG47IHgrKykgeworICAgICAgc2IuQXBwZW5kKHN0cik7CiAgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQoc2IuVG9TdHJpbmcoKSwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1JpZ2h0LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1JpZ2h0LmNzCmluZGV4IDc0OGU1MWQuLmY3OGVmZDkgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9SaWdodC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvUmlnaHQuY3MKQEAgLTcsMzggKzcsMzUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dAotewotICAgIHB1YmxpYyBjbGFzcyBSaWdodCA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgdmFyIHN0ciA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICB2YXIgbGVuZ3RoID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciBzdGFydEl4ID0gc3RyLkxlbmd0aCAtIGxlbmd0aDsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoc3RyLlN1YnN0cmluZyhzdGFydEl4LCBzdHIuTGVuZ3RoIC0gc3RhcnRJeCksIERhdGFUeXBlLlN0cmluZyk7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dDsKKworcHVibGljIGNsYXNzIFJpZ2h0IDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICB2YXIgc3RyID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKTsKKyAgICB2YXIgbGVuZ3RoID0gQXJnVG9JbnQoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgc3RhcnRJeCA9IHN0ci5MZW5ndGggLSBsZW5ndGg7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChzdHIuU3Vic3RyaW5nKHN0YXJ0SXgsIHN0ci5MZW5ndGggLSBzdGFydEl4KSwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1NlYXJjaC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9TZWFyY2guY3MKaW5kZXggMDU1MjhjZC4uYTZkMzhiYSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1NlYXJjaC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvU2VhcmNoLmNzCkBAIC03LDQ5ICs3LDQ2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTYtMDMtMjgKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKLXsKLSAgICBwdWJsaWMgY2xhc3MgU2VhcmNoIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmdW5jdGlvbkFyZ3VtZW50cyA9IGFyZ3VtZW50cyBhcyBGdW5jdGlvbkFyZ3VtZW50W10gPz8gYXJndW1lbnRzLlRvQXJyYXkoKTsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGZ1bmN0aW9uQXJndW1lbnRzLCAyKTsKLSAgICAgICAgICAgIHZhciBzZWFyY2ggPSBBcmdUb1N0cmluZyhmdW5jdGlvbkFyZ3VtZW50cywgMCk7Ci0gICAgICAgICAgICB2YXIgc2VhcmNoSW4gPSBBcmdUb1N0cmluZyhmdW5jdGlvbkFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgc3RhcnRJbmRleCA9IDA7Ci0gICAgICAgICAgICBpZiAoZnVuY3Rpb25Bcmd1bWVudHMuQ291bnQoKSA+IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RhcnRJbmRleCA9IEFyZ1RvSW50KGZ1bmN0aW9uQXJndW1lbnRzLCAyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBzZWFyY2hJbi5JbmRleE9mKHNlYXJjaCwgc3RhcnRJbmRleCwgU3lzdGVtLlN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSksIERhdGFUeXBlLkV4Y2VsRXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQWRkaW5nIDEgYmVjYXVzZSBFeGNlbCB1c2VzIDEtYmFzZWQgaW5kZXgKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0ICsgMSwgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0OworCitwdWJsaWMgY2xhc3MgU2VhcmNoIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgdmFyIGZ1bmN0aW9uQXJndW1lbnRzID0gYXJndW1lbnRzIGFzIEZ1bmN0aW9uQXJndW1lbnRbXSA/PyBhcmd1bWVudHMuVG9BcnJheSgpOworICAgIFZhbGlkYXRlQXJndW1lbnRzKGZ1bmN0aW9uQXJndW1lbnRzLCAyKTsKKyAgICB2YXIgc2VhcmNoID0gQXJnVG9TdHJpbmcoZnVuY3Rpb25Bcmd1bWVudHMsIDApOworICAgIHZhciBzZWFyY2hJbiA9IEFyZ1RvU3RyaW5nKGZ1bmN0aW9uQXJndW1lbnRzLCAxKTsKKyAgICB2YXIgc3RhcnRJbmRleCA9IDA7CisgICAgaWYgKGZ1bmN0aW9uQXJndW1lbnRzLkNvdW50KCkgPiAyKSB7CisgICAgICBzdGFydEluZGV4ID0gQXJnVG9JbnQoZnVuY3Rpb25Bcmd1bWVudHMsIDIpOwogICAgIH0KKyAgICB2YXIgcmVzdWx0ID0gc2VhcmNoSW4uSW5kZXhPZihzZWFyY2gsIHN0YXJ0SW5kZXgsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbElnbm9yZUNhc2UpOworICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7CisgICAgfQorICAgIC8vIEFkZGluZyAxIGJlY2F1c2UgRXhjZWwgdXNlcyAxLWJhc2VkIGluZGV4CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQgKyAxLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1N1YnN0aXR1dGUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvU3Vic3RpdHV0ZS5jcwppbmRleCBjMDA5N2UyLi4yMmQ4ODdlIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvU3Vic3RpdHV0ZS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvU3Vic3RpdHV0ZS5jcwpAQCAtNywzOSArNywzNiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDEzLTEyLTAzCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0Ci17Ci0gICAgcHVibGljIGNsYXNzIFN1YnN0aXR1dGUgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAzKTsKLSAgICAgICAgICAgIHZhciB0ZXh0ID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKTsKLSAgICAgICAgICAgIHZhciBmaW5kID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciByZXBsYWNlV2l0aCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMik7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGV4dC5SZXBsYWNlKGZpbmQsIHJlcGxhY2VXaXRoKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5TdHJpbmcpOwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQ7CisKK3B1YmxpYyBjbGFzcyBTdWJzdGl0dXRlIDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAzKTsKKyAgICB2YXIgdGV4dCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMCk7CisgICAgdmFyIGZpbmQgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDEpOworICAgIHZhciByZXBsYWNlV2l0aCA9IEFyZ1RvU3RyaW5nKGFyZ3VtZW50cywgMik7CisgICAgdmFyIHJlc3VsdCA9IHRleHQuUmVwbGFjZShmaW5kLCByZXBsYWNlV2l0aCk7CisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLlN0cmluZyk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9ULmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1QuY3MKaW5kZXggNzE3OTg5MS4uNjQ2YjkwYiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1QuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1QuY3MKQEAgLTcsMzcgKzcsMzcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkCQkgICAgICAgICAgICAgICAgMjAxMy0xMi0wMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dAotewotICAgIHB1YmxpYyBjbGFzcyBUIDogRXhjZWxGdW5jdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZShJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7Ci0gICAgICAgICAgICB2YXIgdmFsID0gYXJndW1lbnRzLkVsZW1lbnRBdCgwKS5WYWx1ZUZpcnN0OwotICAgICAgICAgICAgaWYgKHZhbCBpcyBzdHJpbmcpIHJldHVybiBDcmVhdGVSZXN1bHQodmFsLCBEYXRhVHlwZS5TdHJpbmcpOwotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChzdHJpbmcuRW1wdHksIERhdGFUeXBlLlN0cmluZyk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0OworCitwdWJsaWMgY2xhc3MgVCA6IEV4Y2VsRnVuY3Rpb24geworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKAorICAgICAgSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIFZhbGlkYXRlQXJndW1lbnRzKGFyZ3VtZW50cywgMSk7CisgICAgdmFyIHZhbCA9IGFyZ3VtZW50cy5FbGVtZW50QXQoMCkuVmFsdWVGaXJzdDsKKyAgICBpZiAodmFsIGlzIHN0cmluZykgeworICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdCh2YWwsIERhdGFUeXBlLlN0cmluZyk7CiAgICAgfQorICAgIHJldHVybiBDcmVhdGVSZXN1bHQoc3RyaW5nLkVtcHR5LCBEYXRhVHlwZS5TdHJpbmcpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvVGV4dC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9UZXh0LmNzCmluZGV4IDNkN2JhMzYuLjAwYWU3ZmMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9UZXh0LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9UZXh0LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyogQ29weXJpZ2h0IChDKSAyMDExICBKYW4gS8OkbGxtYW4KKy8qIENvcHlyaWdodCAoQykgMjAxMSAgSmFuIEvDpGxsbWFuCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwpAQCAtNyw0MiArNyw0MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbiAgIAkJICAgICAgICAgICAgQWRkZWQJCSAgICAgICAgICAgICAgICAyMDE0LTAxLTE3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKLXsKLSAgICBwdWJsaWMgY2xhc3MgVGV4dCA6IEV4Y2VsRnVuY3Rpb24KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoSUVudW1lcmFibGU8RnVuY3Rpb25Bcmd1bWVudD4gYXJndW1lbnRzLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDIpOwotICAgICAgICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLkZpcnN0KCkuVmFsdWVGaXJzdDsKLSAgICAgICAgICAgIHZhciBmb3JtYXQgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDEpOwotICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0LlJlcGxhY2UoU3lzdGVtLkdsb2JhbGl6YXRpb24uQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUuTnVtYmVyRm9ybWF0Lk51bWJlckRlY2ltYWxTZXBhcmF0b3IsICIuIik7Ci0gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQuUmVwbGFjZShTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZS5OdW1iZXJGb3JtYXQuTnVtYmVyR3JvdXBTZXBhcmF0b3IuUmVwbGFjZSgoY2hhcikxNjAsJyAnKSwgIiwiKTsgLy9TcGVjaWFsIGhhbmRsaW5nIGZvciBOby1CcmVhayBTcGFjZQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQ7CiAKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBjb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLkdldEZvcm1hdCh2YWx1ZSwgZm9ybWF0KTsKK3B1YmxpYyBjbGFzcyBUZXh0IDogRXhjZWxGdW5jdGlvbiB7CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAyKTsKKyAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMuRmlyc3QoKS5WYWx1ZUZpcnN0OworICAgIHZhciBmb3JtYXQgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDEpOworICAgIGZvcm1hdCA9IGZvcm1hdC5SZXBsYWNlKEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlLk51bWJlckZvcm1hdC5OdW1iZXJEZWNpbWFsU2VwYXJhdG9yLCAiLiIpOworICAgIGZvcm1hdCA9IGZvcm1hdC5SZXBsYWNlKAorICAgICAgICBDdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZS5OdW1iZXJGb3JtYXQuTnVtYmVyR3JvdXBTZXBhcmF0b3IuUmVwbGFjZSgoY2hhcikxNjAsICcgJyksCisgICAgICAgICIsIik7IC8vU3BlY2lhbCBoYW5kbGluZyBmb3IgTm8tQnJlYWsgU3BhY2UKIAotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLlN0cmluZyk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgdmFyIHJlc3VsdCA9IGNvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIuR2V0Rm9ybWF0KHZhbHVlLCBmb3JtYXQpOworCisgICAgcmV0dXJuIENyZWF0ZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLlN0cmluZyk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9VcHBlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9VcHBlci5jcwppbmRleCA1MzI4YWNkLi5jNDBlNmY0IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvVXBwZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1VwcGVyLmNzCkBAIC03LDM1ICs3LDMzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZAkJICAgICAgICAgICAgICAgIDIwMTMtMTItMDMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKLXsKLSAgICBwdWJsaWMgY2xhc3MgVXBwZXIgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoYXJndW1lbnRzLkZpcnN0KCkuVmFsdWVGaXJzdC5Ub1N0cmluZygpLlRvVXBwZXIoKSwgRGF0YVR5cGUuU3RyaW5nKTsKLSAgICAgICAgfQotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5UZXh0OworCitwdWJsaWMgY2xhc3MgVXBwZXIgOiBFeGNlbEZ1bmN0aW9uIHsKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgRXhlY3V0ZSgKKyAgICAgIElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywKKyAgICAgIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBWYWxpZGF0ZUFyZ3VtZW50cyhhcmd1bWVudHMsIDEpOworICAgIHJldHVybiBDcmVhdGVSZXN1bHQoYXJndW1lbnRzLkZpcnN0KCkuVmFsdWVGaXJzdC5Ub1N0cmluZygpLlRvVXBwZXIoKSwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1ZhbHVlLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL0Z1bmN0aW9ucy9UZXh0L1ZhbHVlLmNzCmluZGV4IGE2YjNlMjQuLjNhZDRmYzggMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9GdW5jdGlvbnMvVGV4dC9WYWx1ZS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvRnVuY3Rpb25zL1RleHQvVmFsdWUuY3MKQEAgLTEsNjAgKzEsNjIgQEAKLe+7v3VzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuRGF0ZVRpbWU7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zLlRleHQKLXsKLSAgICBwdWJsaWMgY2xhc3MgVmFsdWUgOiBFeGNlbEZ1bmN0aW9uCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfZ3JvdXBTZXBhcmF0b3IgPSBDdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZS5OdW1iZXJGb3JtYXQuTnVtYmVyR3JvdXBTZXBhcmF0b3I7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9kZWNpbWFsU2VwYXJhdG9yID0gQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUuTnVtYmVyRm9ybWF0Lk51bWJlckRlY2ltYWxTZXBhcmF0b3I7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF90aW1lU2VwYXJhdG9yID0gQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUuRGF0ZVRpbWVGb3JtYXQuVGltZVNlcGFyYXRvcjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3Nob3J0VGltZVBhdHRlcm4gPSBDdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZS5EYXRlVGltZUZvcm1hdC5TaG9ydFRpbWVQYXR0ZXJuOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERhdGVWYWx1ZSBfZGF0ZVZhbHVlRnVuYyA9IG5ldyBEYXRlVmFsdWUoKTsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUaW1lVmFsdWUgX3RpbWVWYWx1ZUZ1bmMgPSBuZXcgVGltZVZhbHVlKCk7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuVGV4dDsKIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBFeGVjdXRlKElFbnVtZXJhYmxlPEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3VtZW50cywgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKLSAgICAgICAgICAgIHZhciB2YWwgPSBBcmdUb1N0cmluZyhhcmd1bWVudHMsIDApLlRyaW1FbmQoJyAnKTsKLSAgICAgICAgICAgIGRvdWJsZSByZXN1bHQgPSAwZDsKLSAgICAgICAgICAgIGlmIChSZWdleC5Jc01hdGNoKHZhbCwgJCJeW1xcZF0qKHtSZWdleC5Fc2NhcGUoX2dyb3VwU2VwYXJhdG9yKX0/W1xcZF0qKT8oe1JlZ2V4LkVzY2FwZShfZGVjaW1hbFNlcGFyYXRvcil9W1xcZF0qKT9bID8lID9dPyQiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsLkVuZHNXaXRoKCIlIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwuVHJpbUVuZCgnJScpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkb3VibGUuUGFyc2UodmFsKSAvIDEwMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZG91YmxlLlBhcnNlKHZhbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2UodmFsLCBOdW1iZXJTdHlsZXMuRmxvYXQsIEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlLCBvdXQgcmVzdWx0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgdGltZVNlcGFyYXRvciA9IFJlZ2V4LkVzY2FwZShfdGltZVNlcGFyYXRvcik7Ci0gICAgICAgICAgICBpZiAoUmVnZXguSXNNYXRjaCh2YWwsIEAiXltcZF17MSwyfSIgKyB0aW1lU2VwYXJhdG9yICsgQCJbXGRdezJ9KCIgKyB0aW1lU2VwYXJhdG9yICsgQCJbXGRdezJ9KT8kIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHRpbWVSZXN1bHQgPSBfdGltZVZhbHVlRnVuYy5FeGVjdXRlKHZhbCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVSZXN1bHQuRGF0YVR5cGUgPT0gRGF0YVR5cGUuRGF0ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lUmVzdWx0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBkYXRlUmVzdWx0ID0gX2RhdGVWYWx1ZUZ1bmMuRXhlY3V0ZSh2YWwpOwotICAgICAgICAgICAgaWYgKGRhdGVSZXN1bHQuRGF0YVR5cGUgPT0gRGF0YVR5cGUuRGF0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZVJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7Ci0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBWYWx1ZSA6IEV4Y2VsRnVuY3Rpb24geworICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBfZ3JvdXBTZXBhcmF0b3IgPSBDdWx0dXJlSW5mbworICAgICAgLkN1cnJlbnRDdWx0dXJlCisgICAgICAuTnVtYmVyRm9ybWF0CisgICAgICAuTnVtYmVyR3JvdXBTZXBhcmF0b3I7CisgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF9kZWNpbWFsU2VwYXJhdG9yID0gQ3VsdHVyZUluZm8KKyAgICAgIC5DdXJyZW50Q3VsdHVyZQorICAgICAgLk51bWJlckZvcm1hdAorICAgICAgLk51bWJlckRlY2ltYWxTZXBhcmF0b3I7CisgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIF90aW1lU2VwYXJhdG9yID0gQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUuRGF0ZVRpbWVGb3JtYXQuVGltZVNlcGFyYXRvcjsKKyAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgX3Nob3J0VGltZVBhdHRlcm4gPSBDdWx0dXJlSW5mbworICAgICAgLkN1cnJlbnRDdWx0dXJlCisgICAgICAuRGF0ZVRpbWVGb3JtYXQKKyAgICAgIC5TaG9ydFRpbWVQYXR0ZXJuOworICBwcml2YXRlIHJlYWRvbmx5IERhdGVWYWx1ZSBfZGF0ZVZhbHVlRnVuYyA9IG5ldygpOworICBwcml2YXRlIHJlYWRvbmx5IFRpbWVWYWx1ZSBfdGltZVZhbHVlRnVuYyA9IG5ldygpOworCisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IEV4ZWN1dGUoCisgICAgICBJRW51bWVyYWJsZTxGdW5jdGlvbkFyZ3VtZW50PiBhcmd1bWVudHMsCisgICAgICBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgVmFsaWRhdGVBcmd1bWVudHMoYXJndW1lbnRzLCAxKTsKKyAgICB2YXIgdmFsID0gQXJnVG9TdHJpbmcoYXJndW1lbnRzLCAwKS5UcmltRW5kKCcgJyk7CisgICAgZG91YmxlIHJlc3VsdCA9IDBkOworICAgIGlmIChSZWdleC5Jc01hdGNoKAorICAgICAgICB2YWwsCisgICAgICAgICQiXltcXGRdKih7UmVnZXguRXNjYXBlKF9ncm91cFNlcGFyYXRvcil9P1tcXGRdKik/KHtSZWdleC5Fc2NhcGUoX2RlY2ltYWxTZXBhcmF0b3IpCisgICAgICAgIH1bXFxkXSopP1sgPyUgP10/JCIpKSB7CisgICAgICBpZiAodmFsLkVuZHNXaXRoKCIlIikpIHsKKyAgICAgICAgdmFsID0gdmFsLlRyaW1FbmQoJyUnKTsKKyAgICAgICAgcmVzdWx0ID0gZG91YmxlLlBhcnNlKHZhbCkgLyAxMDA7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBkb3VibGUuUGFyc2UodmFsKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDcmVhdGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5EZWNpbWFsKTsKICAgICB9CisgICAgaWYgKGRvdWJsZS5UcnlQYXJzZSh2YWwsIE51bWJlclN0eWxlcy5GbG9hdCwgQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmUsIG91dCByZXN1bHQpKSB7CisgICAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgfQorICAgIHZhciB0aW1lU2VwYXJhdG9yID0gUmVnZXguRXNjYXBlKF90aW1lU2VwYXJhdG9yKTsKKyAgICBpZiAoUmVnZXguSXNNYXRjaCgKKyAgICAgICAgdmFsLAorICAgICAgICBAIl5bXGRdezEsMn0iICsgdGltZVNlcGFyYXRvciArIEAiW1xkXXsyfSgiICsgdGltZVNlcGFyYXRvciArIEAiW1xkXXsyfSk/JCIpKSB7CisgICAgICB2YXIgdGltZVJlc3VsdCA9IF90aW1lVmFsdWVGdW5jLkV4ZWN1dGUodmFsKTsKKyAgICAgIGlmICh0aW1lUmVzdWx0LkRhdGFUeXBlID09IERhdGFUeXBlLkRhdGUpIHsKKyAgICAgICAgcmV0dXJuIHRpbWVSZXN1bHQ7CisgICAgICB9CisgICAgfQorICAgIHZhciBkYXRlUmVzdWx0ID0gX2RhdGVWYWx1ZUZ1bmMuRXhlY3V0ZSh2YWwpOworICAgIGlmIChkYXRlUmVzdWx0LkRhdGFUeXBlID09IERhdGFUeXBlLkRhdGUpIHsKKyAgICAgIHJldHVybiBkYXRlUmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gQ3JlYXRlUmVzdWx0KEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSksIERhdGFUeXBlLkV4Y2VsRXJyb3IpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvT3BlcmF0b3JzL0lPcGVyYXRvci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvSU9wZXJhdG9yLmNzCmluZGV4IDYzZjc4NTEuLjc5NzVjYzEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvSU9wZXJhdG9yLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvSU9wZXJhdG9yLmNzCkBAIC0xMywzNSArMTMsMzAgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKKwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLk9wZXJhdG9ycwotewotICAgIHB1YmxpYyBpbnRlcmZhY2UgSU9wZXJhdG9yCi0gICAgewotICAgICAgICBPcGVyYXRvcnMgT3BlcmF0b3IgeyBnZXQ7IH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLk9wZXJhdG9yczsKIAotICAgICAgICBDb21waWxlUmVzdWx0IEFwcGx5KENvbXBpbGVSZXN1bHQgbGVmdCwgQ29tcGlsZVJlc3VsdCByaWdodCk7CitwdWJsaWMgaW50ZXJmYWNlIElPcGVyYXRvciB7CisgIE9wZXJhdG9ycyBPcGVyYXRvciB7IGdldDsgfQogCi0gICAgICAgIGludCBQcmVjZWRlbmNlIHsgZ2V0OyB9Ci0gICAgfQorICBDb21waWxlUmVzdWx0IEFwcGx5KENvbXBpbGVSZXN1bHQgbGVmdCwgQ29tcGlsZVJlc3VsdCByaWdodCk7CisKKyAgaW50IFByZWNlZGVuY2UgeyBnZXQ7IH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvT3BlcmF0b3IuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvT3BlcmF0b3JzL09wZXJhdG9yLmNzCmluZGV4IGQ1M2E0YWMuLjkxMzRiM2MgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvT3BlcmF0b3IuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL09wZXJhdG9ycy9PcGVyYXRvci5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMzgzICsxMywzODYgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnMKLXsKLSAgICBwdWJsaWMgY2xhc3MgT3BlcmF0b3IgOiBJT3BlcmF0b3IKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgY29uc3QgaW50IFByZWNlZGVuY2VQZXJjZW50ID0gMjsKLSAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgUHJlY2VkZW5jZUV4cCA9IDQ7Ci0gICAgICAgIHByaXZhdGUgY29uc3QgaW50IFByZWNlZGVuY2VNdWx0aXBseURldmlkZSA9IDY7Ci0gICAgICAgIHByaXZhdGUgY29uc3QgaW50IFByZWNlZGVuY2VJbnRlZ2VyRGl2aXNpb24gPSA4OwotICAgICAgICBwcml2YXRlIGNvbnN0IGludCBQcmVjZWRlbmNlTW9kdWx1cyA9IDEwOwotICAgICAgICBwcml2YXRlIGNvbnN0IGludCBQcmVjZWRlbmNlQWRkU3VidHJhY3QgPSAxMjsKLSAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgUHJlY2VkZW5jZUNvbmNhdCA9IDE1OwotICAgICAgICBwcml2YXRlIGNvbnN0IGludCBQcmVjZWRlbmNlQ29tcGFyaXNvbiA9IDI1OworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuT3BlcmF0b3JzOwogCi0gICAgICAgIHByaXZhdGUgT3BlcmF0b3IoKSB7IH0KK3B1YmxpYyBjbGFzcyBPcGVyYXRvciA6IElPcGVyYXRvciB7CisgIHByaXZhdGUgY29uc3QgaW50IF9wcmVjZWRlbmNlUGVyY2VudCA9IDI7CisgIHByaXZhdGUgY29uc3QgaW50IF9wcmVjZWRlbmNlRXhwID0gNDsKKyAgcHJpdmF0ZSBjb25zdCBpbnQgX3ByZWNlZGVuY2VNdWx0aXBseURldmlkZSA9IDY7CisgIHByaXZhdGUgY29uc3QgaW50IF9wcmVjZWRlbmNlSW50ZWdlckRpdmlzaW9uID0gODsKKyAgcHJpdmF0ZSBjb25zdCBpbnQgX3ByZWNlZGVuY2VNb2R1bHVzID0gMTA7CisgIHByaXZhdGUgY29uc3QgaW50IF9wcmVjZWRlbmNlQWRkU3VidHJhY3QgPSAxMjsKKyAgcHJpdmF0ZSBjb25zdCBpbnQgX3ByZWNlZGVuY2VDb25jYXQgPSAxNTsKKyAgcHJpdmF0ZSBjb25zdCBpbnQgX3ByZWNlZGVuY2VDb21wYXJpc29uID0gMjU7CiAKLSAgICAgICAgcHJpdmF0ZSBPcGVyYXRvcihPcGVyYXRvcnMgQG9wZXJhdG9yLCBpbnQgcHJlY2VkZW5jZSwgRnVuYzxDb21waWxlUmVzdWx0LCBDb21waWxlUmVzdWx0LCBDb21waWxlUmVzdWx0PiBpbXBsZW1lbnRhdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgX2ltcGxlbWVudGF0aW9uID0gaW1wbGVtZW50YXRpb247Ci0gICAgICAgICAgICBfcHJlY2VkZW5jZSA9IHByZWNlZGVuY2U7Ci0gICAgICAgICAgICBfb3BlcmF0b3IgPSBAb3BlcmF0b3I7Ci0gICAgICAgIH0KKyAgcHJpdmF0ZSBPcGVyYXRvcigpIHt9CiAKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGdW5jPENvbXBpbGVSZXN1bHQsIENvbXBpbGVSZXN1bHQsIENvbXBpbGVSZXN1bHQ+IF9pbXBsZW1lbnRhdGlvbjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnQgX3ByZWNlZGVuY2U7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgT3BlcmF0b3JzIF9vcGVyYXRvcjsKKyAgcHJpdmF0ZSBPcGVyYXRvcigKKyAgICAgIE9wZXJhdG9ycyBAb3BlcmF0b3IsCisgICAgICBpbnQgcHJlY2VkZW5jZSwKKyAgICAgIEZ1bmM8Q29tcGlsZVJlc3VsdCwgQ29tcGlsZVJlc3VsdCwgQ29tcGlsZVJlc3VsdD4gaW1wbGVtZW50YXRpb24pIHsKKyAgICBfaW1wbGVtZW50YXRpb24gPSBpbXBsZW1lbnRhdGlvbjsKKyAgICBfcHJlY2VkZW5jZSA9IHByZWNlZGVuY2U7CisgICAgX29wZXJhdG9yID0gQG9wZXJhdG9yOworICB9CiAKLSAgICAgICAgaW50IElPcGVyYXRvci5QcmVjZWRlbmNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfcHJlY2VkZW5jZTsgfQotICAgICAgICB9CisgIHByaXZhdGUgcmVhZG9ubHkgRnVuYzxDb21waWxlUmVzdWx0LCBDb21waWxlUmVzdWx0LCBDb21waWxlUmVzdWx0PiBfaW1wbGVtZW50YXRpb247CisgIHByaXZhdGUgcmVhZG9ubHkgaW50IF9wcmVjZWRlbmNlOworICBwcml2YXRlIHJlYWRvbmx5IE9wZXJhdG9ycyBfb3BlcmF0b3I7CiAKLSAgICAgICAgT3BlcmF0b3JzIElPcGVyYXRvci5PcGVyYXRvcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX29wZXJhdG9yOyB9Ci0gICAgICAgIH0KKyAgaW50IElPcGVyYXRvci5QcmVjZWRlbmNlID0+IF9wcmVjZWRlbmNlOwogCi0gICAgICAgIHB1YmxpYyBDb21waWxlUmVzdWx0IEFwcGx5KENvbXBpbGVSZXN1bHQgbGVmdCwgQ29tcGlsZVJlc3VsdCByaWdodCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxlZnQuUmVzdWx0IGlzIEV4Y2VsRXJyb3JWYWx1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQobGVmdC5SZXN1bHQsIERhdGFUeXBlLkV4Y2VsRXJyb3IpOwotICAgICAgICAgICAgICAgIC8vdGhyb3cobmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbigoRXhjZWxFcnJvclZhbHVlKWxlZnQuUmVzdWx0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChyaWdodC5SZXN1bHQgaXMgRXhjZWxFcnJvclZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChyaWdodC5SZXN1bHQsIERhdGFUeXBlLkV4Y2VsRXJyb3IpOwotICAgICAgICAgICAgICAgIC8vdGhyb3cobmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbigoRXhjZWxFcnJvclZhbHVlKXJpZ2h0LlJlc3VsdCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIF9pbXBsZW1lbnRhdGlvbihsZWZ0LCByaWdodCk7Ci0gICAgICAgIH0KKyAgT3BlcmF0b3JzIElPcGVyYXRvci5PcGVyYXRvciB7CisgICAgZ2V0IHsgcmV0dXJuIF9vcGVyYXRvcjsgfQorICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAiT3BlcmF0b3I6ICIgKyBfb3BlcmF0b3I7Ci0gICAgICAgIH0KKyAgcHVibGljIENvbXBpbGVSZXN1bHQgQXBwbHkoQ29tcGlsZVJlc3VsdCBsZWZ0LCBDb21waWxlUmVzdWx0IHJpZ2h0KSB7CisgICAgaWYgKGxlZnQuUmVzdWx0IGlzIEV4Y2VsRXJyb3JWYWx1ZSkgeworICAgICAgcmV0dXJuIG5ldyhsZWZ0LlJlc3VsdCwgRGF0YVR5cGUuRXhjZWxFcnJvcik7CisgICAgICAvL3Rocm93KG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oKEV4Y2VsRXJyb3JWYWx1ZSlsZWZ0LlJlc3VsdCkpOworICAgIH0KKyAgICBpZiAocmlnaHQuUmVzdWx0IGlzIEV4Y2VsRXJyb3JWYWx1ZSkgeworICAgICAgcmV0dXJuIG5ldyhyaWdodC5SZXN1bHQsIERhdGFUeXBlLkV4Y2VsRXJyb3IpOworICAgICAgLy90aHJvdyhuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKChFeGNlbEVycm9yVmFsdWUpcmlnaHQuUmVzdWx0KSk7CisgICAgfQorICAgIHJldHVybiBfaW1wbGVtZW50YXRpb24obGVmdCwgcmlnaHQpOworICB9CiAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSU9wZXJhdG9yIF9wbHVzOwotICAgICAgICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBQbHVzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfcGx1cyA/PyAoX3BsdXMgPSBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLlBsdXMsIFByZWNlZGVuY2VBZGRTdWJ0cmFjdCwgKGwsIHIpID0+Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsID0gbCA9PSBudWxsIHx8IGwuUmVzdWx0ID09IG51bGwgPyBuZXcgQ29tcGlsZVJlc3VsdCgwLCBEYXRhVHlwZS5JbnRlZ2VyKSA6IGw7Ci0gICAgICAgICAgICAgICAgICAgIHIgPSByID09IG51bGwgfHwgci5SZXN1bHQgPT0gbnVsbCA/IG5ldyBDb21waWxlUmVzdWx0KDAsIERhdGFUeXBlLkludGVnZXIpIDogcjsKKyAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKKyAgICByZXR1cm4gIk9wZXJhdG9yOiAiICsgX29wZXJhdG9yOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgSU9wZXJhdG9yIF9wbHVzOworCisgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIFBsdXMgeworICAgIGdldCB7CisgICAgICByZXR1cm4gX3BsdXMKKyAgICAgICAgICA/PyAoX3BsdXMgPSBuZXcgT3BlcmF0b3IoCisgICAgICAgICAgICAgICAgICBPcGVyYXRvcnMuUGx1cywKKyAgICAgICAgICAgICAgICAgIF9wcmVjZWRlbmNlQWRkU3VidHJhY3QsCisgICAgICAgICAgICAgICAgICAobCwgcikgPT4geworICAgICAgICAgICAgICAgICAgICBsID0gbCA9PSBudWxsIHx8IGwuUmVzdWx0ID09IG51bGwgPyBuZXcoMCwgRGF0YVR5cGUuSW50ZWdlcikgOiBsOworICAgICAgICAgICAgICAgICAgICByID0gciA9PSBudWxsIHx8IHIuUmVzdWx0ID09IG51bGwgPyBuZXcoMCwgRGF0YVR5cGUuSW50ZWdlcikgOiByOwogICAgICAgICAgICAgICAgICAgICBFeGNlbEVycm9yVmFsdWUgZXJyb3JWYWw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChFaXRoZXJJc0Vycm9yKGwsIHIsIG91dCBlcnJvclZhbCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChlcnJvclZhbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChFaXRoZXJJc0Vycm9yKGwsIHIsIG91dCBlcnJvclZhbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3KGVycm9yVmFsKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobC5EYXRhVHlwZSA9PSBEYXRhVHlwZS5JbnRlZ2VyICYmIHIuRGF0YVR5cGUgPT0gRGF0YVR5cGUuSW50ZWdlcikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGwuUmVzdWx0TnVtZXJpYyArIHIuUmVzdWx0TnVtZXJpYywgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsLkRhdGFUeXBlID09IERhdGFUeXBlLkludGVnZXIgJiYgci5EYXRhVHlwZSA9PSBEYXRhVHlwZS5JbnRlZ2VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyhsLlJlc3VsdE51bWVyaWMgKyByLlJlc3VsdE51bWVyaWMsIERhdGFUeXBlLkludGVnZXIpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChsLklzTnVtZXJpYyB8fCBsLklzTnVtZXJpY1N0cmluZyB8fCBsLlJlc3VsdCBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoci5Jc051bWVyaWMgfHwgci5Jc051bWVyaWNTdHJpbmcgfHwgci5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChsLlJlc3VsdE51bWVyaWMgKyByLlJlc3VsdE51bWVyaWMsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGwuSXNOdW1lcmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGwuSXNOdW1lcmljU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGwuUmVzdWx0IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoci5Jc051bWVyaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgci5Jc051bWVyaWNTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgci5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3KGwuUmVzdWx0TnVtZXJpYyArIHIuUmVzdWx0TnVtZXJpYywgRGF0YVR5cGUuRGVjaW1hbCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGVFcnJvclR5cGUuVmFsdWUpOwotICAgICAgICAgICAgICAgIH0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3KGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgICAgICAgfSkpOworICAgIH0KKyAgfQogCi0gICAgICAgIHByaXZhdGUgc3RhdGljIElPcGVyYXRvciBfbWludXM7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIE1pbnVzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfbWludXMgPz8gKF9taW51cyA9IG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuTWludXMsIFByZWNlZGVuY2VBZGRTdWJ0cmFjdCwgKGwsIHIpID0+Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsID0gbCA9PSBudWxsIHx8IGwuUmVzdWx0ID09IG51bGwgPyBuZXcgQ29tcGlsZVJlc3VsdCgwLCBEYXRhVHlwZS5JbnRlZ2VyKSA6IGw7Ci0gICAgICAgICAgICAgICAgICAgIHIgPSByID09IG51bGwgfHwgci5SZXN1bHQgPT0gbnVsbCA/IG5ldyBDb21waWxlUmVzdWx0KDAsIERhdGFUeXBlLkludGVnZXIpIDogcjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGwuRGF0YVR5cGUgPT0gRGF0YVR5cGUuSW50ZWdlciAmJiByLkRhdGFUeXBlID09IERhdGFUeXBlLkludGVnZXIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChsLlJlc3VsdE51bWVyaWMgLSByLlJlc3VsdE51bWVyaWMsIERhdGFUeXBlLkludGVnZXIpOworICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX21pbnVzOworCisgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIE1pbnVzIHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIF9taW51cworICAgICAgICAgID8/IChfbWludXMgPSBuZXcgT3BlcmF0b3IoCisgICAgICAgICAgICAgICAgICBPcGVyYXRvcnMuTWludXMsCisgICAgICAgICAgICAgICAgICBfcHJlY2VkZW5jZUFkZFN1YnRyYWN0LAorICAgICAgICAgICAgICAgICAgKGwsIHIpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbCA9IGwgPT0gbnVsbCB8fCBsLlJlc3VsdCA9PSBudWxsID8gbmV3KDAsIERhdGFUeXBlLkludGVnZXIpIDogbDsKKyAgICAgICAgICAgICAgICAgICAgciA9IHIgPT0gbnVsbCB8fCByLlJlc3VsdCA9PSBudWxsID8gbmV3KDAsIERhdGFUeXBlLkludGVnZXIpIDogcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGwuRGF0YVR5cGUgPT0gRGF0YVR5cGUuSW50ZWdlciAmJiByLkRhdGFUeXBlID09IERhdGFUeXBlLkludGVnZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3KGwuUmVzdWx0TnVtZXJpYyAtIHIuUmVzdWx0TnVtZXJpYywgRGF0YVR5cGUuSW50ZWdlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGwuSXNOdW1lcmljIHx8IGwuSXNOdW1lcmljU3RyaW5nIHx8IGwuUmVzdWx0IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyLklzTnVtZXJpYyB8fCByLklzTnVtZXJpY1N0cmluZyB8fCByLlJlc3VsdCBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGwuUmVzdWx0TnVtZXJpYyAtIHIuUmVzdWx0TnVtZXJpYywgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgobC5Jc051bWVyaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbC5Jc051bWVyaWNTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbC5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIChyLklzTnVtZXJpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByLklzTnVtZXJpY1N0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByLlJlc3VsdCBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSkgeworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcobC5SZXN1bHROdW1lcmljIC0gci5SZXN1bHROdW1lcmljLCBEYXRhVHlwZS5EZWNpbWFsKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChlRXJyb3JUeXBlLlZhbHVlKTsKLSAgICAgICAgICAgICAgICB9KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyhlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICB9CisgIH0KIAotICAgICAgICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX211bHRpcGx5OwotICAgICAgICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBNdWx0aXBseQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX211bHRpcGx5ID8/IChfbXVsdGlwbHkgPSBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLk11bHRpcGx5LCBQcmVjZWRlbmNlTXVsdGlwbHlEZXZpZGUsIChsLCByKSA9PgotICAgICAgICAgICAgICAgIHsKKyAgcHJpdmF0ZSBzdGF0aWMgSU9wZXJhdG9yIF9tdWx0aXBseTsKKworICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBNdWx0aXBseSB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBfbXVsdGlwbHkKKyAgICAgICAgICA/PyAoX211bHRpcGx5ID0gbmV3IE9wZXJhdG9yKAorICAgICAgICAgICAgICAgICAgT3BlcmF0b3JzLk11bHRpcGx5LAorICAgICAgICAgICAgICAgICAgX3ByZWNlZGVuY2VNdWx0aXBseURldmlkZSwKKyAgICAgICAgICAgICAgICAgIChsLCByKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgIGwgPSBsID8/IG5ldyBDb21waWxlUmVzdWx0KDAsIERhdGFUeXBlLkludGVnZXIpOwogICAgICAgICAgICAgICAgICAgICByID0gciA/PyBuZXcgQ29tcGlsZVJlc3VsdCgwLCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGwuRGF0YVR5cGUgPT0gRGF0YVR5cGUuSW50ZWdlciAmJiByLkRhdGFUeXBlID09IERhdGFUeXBlLkludGVnZXIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChsLlJlc3VsdE51bWVyaWMqci5SZXN1bHROdW1lcmljLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGwuRGF0YVR5cGUgPT0gRGF0YVR5cGUuSW50ZWdlciAmJiByLkRhdGFUeXBlID09IERhdGFUeXBlLkludGVnZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3KGwuUmVzdWx0TnVtZXJpYyAqIHIuUmVzdWx0TnVtZXJpYywgRGF0YVR5cGUuSW50ZWdlcik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGwuSXNOdW1lcmljIHx8IGwuSXNOdW1lcmljU3RyaW5nIHx8IGwuUmVzdWx0IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyLklzTnVtZXJpYyB8fCByLklzTnVtZXJpY1N0cmluZyB8fCByLlJlc3VsdCBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGwuUmVzdWx0TnVtZXJpYypyLlJlc3VsdE51bWVyaWMsIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoKGwuSXNOdW1lcmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGwuSXNOdW1lcmljU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGwuUmVzdWx0IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoci5Jc051bWVyaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgci5Jc051bWVyaWNTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgci5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykpIHsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3KGwuUmVzdWx0TnVtZXJpYyAqIHIuUmVzdWx0TnVtZXJpYywgRGF0YVR5cGUuRGVjaW1hbCk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGVFcnJvclR5cGUuVmFsdWUpOwotICAgICAgICAgICAgICAgIH0pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3KGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgICAgICAgfSkpOworICAgIH0KKyAgfQogCi0gICAgICAgIHByaXZhdGUgc3RhdGljIElPcGVyYXRvciBfZGl2aWRlOwotICAgICAgICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBEaXZpZGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9kaXZpZGUgPz8gKF9kaXZpZGUgPSBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLkRpdmlkZSwgUHJlY2VkZW5jZU11bHRpcGx5RGV2aWRlLCAobCwgcikgPT4KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKGwuSXNOdW1lcmljIHx8IGwuSXNOdW1lcmljU3RyaW5nIHx8IGwuUmVzdWx0IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhKHIuSXNOdW1lcmljIHx8IHIuSXNOdW1lcmljU3RyaW5nIHx8IHIuUmVzdWx0IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoZUVycm9yVHlwZS5WYWx1ZSk7CisgIHByaXZhdGUgc3RhdGljIElPcGVyYXRvciBfZGl2aWRlOworCisgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIERpdmlkZSB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBfZGl2aWRlCisgICAgICAgICAgPz8gKF9kaXZpZGUgPSBuZXcgT3BlcmF0b3IoCisgICAgICAgICAgICAgICAgICBPcGVyYXRvcnMuRGl2aWRlLAorICAgICAgICAgICAgICAgICAgX3ByZWNlZGVuY2VNdWx0aXBseURldmlkZSwKKyAgICAgICAgICAgICAgICAgIChsLCByKSA9PiB7CisgICAgICAgICAgICAgICAgICAgIGlmICghKGwuSXNOdW1lcmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGwuSXNOdW1lcmljU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGwuUmVzdWx0IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhKHIuSXNOdW1lcmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHIuSXNOdW1lcmljU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHIuUmVzdWx0IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyhlRXJyb3JUeXBlLlZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdCA9IGwuUmVzdWx0TnVtZXJpYzsKICAgICAgICAgICAgICAgICAgICAgdmFyIHJpZ2h0ID0gci5SZXN1bHROdW1lcmljOwotICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5BYnMocmlnaHQgLSAwZCkgPCBkb3VibGUuRXBzaWxvbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGVFcnJvclR5cGUuRGl2MCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChNYXRoLkFicyhyaWdodCAtIDBkKSA8IGRvdWJsZS5FcHNpbG9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyhlRXJyb3JUeXBlLkRpdjApOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChsLklzTnVtZXJpYyB8fCBsLklzTnVtZXJpY1N0cmluZyB8fCBsLlJlc3VsdCBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoci5Jc051bWVyaWMgfHwgci5Jc051bWVyaWNTdHJpbmcgfHwgci5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChsZWZ0L3JpZ2h0LCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChsLklzTnVtZXJpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBsLklzTnVtZXJpY1N0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBsLlJlc3VsdCBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHIuSXNOdW1lcmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHIuSXNOdW1lcmljU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHIuUmVzdWx0IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyhsZWZ0IC8gcmlnaHQsIERhdGFUeXBlLkRlY2ltYWwpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChlRXJyb3JUeXBlLlZhbHVlKTsKLSAgICAgICAgICAgICAgICB9KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBFeHAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuRXhwb25lbnRpYXRpb24sIFByZWNlZGVuY2VFeHAsIChsLCByKSA9PgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobCA9PSBudWxsICYmIHIgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoZUVycm9yVHlwZS5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsID0gbCA/PyBuZXcgQ29tcGlsZVJlc3VsdCgwLCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHIgPSByID8/IG5ldyBDb21waWxlUmVzdWx0KDAsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsLklzTnVtZXJpYyB8fCBsLlJlc3VsdCBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSAmJiAoci5Jc051bWVyaWMgfHwgci5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KE1hdGguUG93KGwuUmVzdWx0TnVtZXJpYywgci5SZXN1bHROdW1lcmljKSwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoMGQsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIENvbmNhdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9wZXJhdG9yKE9wZXJhdG9ycy5Db25jYXQsIFByZWNlZGVuY2VDb25jYXQsIChsLCByKSA9PgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsID0gbCA/PyBuZXcgQ29tcGlsZVJlc3VsdChzdHJpbmcuRW1wdHksIERhdGFUeXBlLlN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByID0gciA/PyBuZXcgQ29tcGlsZVJlc3VsdChzdHJpbmcuRW1wdHksIERhdGFUeXBlLlN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbFN0ciA9IGwuUmVzdWx0ICE9IG51bGwgPyBsLlJlc3VsdFZhbHVlLlRvU3RyaW5nKCkgOiBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgclN0ciA9IHIuUmVzdWx0ICE9IG51bGwgPyByLlJlc3VsdFZhbHVlLlRvU3RyaW5nKCkgOiBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoc3RyaW5nLkNvbmNhdChsU3RyLCByU3RyKSwgRGF0YVR5cGUuU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX2dyZWF0ZXJUaGFuOwotICAgICAgICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBHcmVhdGVyVGhhbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3JldHVybiBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLkdyZWF0ZXJUaGFuLCBQcmVjZWRlbmNlQ29tcGFyaXNvbiwgKGwsIHIpID0+IG5ldyBDb21waWxlUmVzdWx0KENvbXBhcmUobCwgcikgPiAwLCBEYXRhVHlwZS5Cb29sZWFuKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9ncmVhdGVyVGhhbiA/PwotICAgICAgICAgICAgICAgICAgICAgICAoX2dyZWF0ZXJUaGFuID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuTGVzc1RoYW5PckVxdWFsLCBQcmVjZWRlbmNlQ29tcGFyaXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobCwgcikgPT4gQ29tcGFyZShsLCByLCAoY29tcFJlcykgPT4gY29tcFJlcyA+IDApKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX2VxOwotICAgICAgICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBFcQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3JldHVybiBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLkVxdWFscywgUHJlY2VkZW5jZUNvbXBhcmlzb24sIChsLCByKSA9PiBuZXcgQ29tcGlsZVJlc3VsdChDb21wYXJlKGwsIHIpID09IDAsIERhdGFUeXBlLkJvb2xlYW4pKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2VxID8/Ci0gICAgICAgICAgICAgICAgICAgICAgIChfZXEgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9wZXJhdG9yKE9wZXJhdG9ycy5MZXNzVGhhbk9yRXF1YWwsIFByZWNlZGVuY2VDb21wYXJpc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsLCByKSA9PiBDb21wYXJlKGwsIHIsIChjb21wUmVzKSA9PiBjb21wUmVzID09IDApKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX25vdEVxdWFsc1RvOwotICAgICAgICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBOb3RFcXVhbHNUbwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3JldHVybiBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLk5vdEVxdWFsVG8sIFByZWNlZGVuY2VDb21wYXJpc29uLCAobCwgcikgPT4gbmV3IENvbXBpbGVSZXN1bHQoQ29tcGFyZShsLCByKSAhPSAwLCBEYXRhVHlwZS5Cb29sZWFuKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9ub3RFcXVhbHNUbyA/PwotICAgICAgICAgICAgICAgICAgICAgICAoX25vdEVxdWFsc1RvID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuTGVzc1RoYW5PckVxdWFsLCBQcmVjZWRlbmNlQ29tcGFyaXNvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobCwgcikgPT4gQ29tcGFyZShsLCByLCAoY29tcFJlcykgPT4gY29tcFJlcyAhPSAwKSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSU9wZXJhdG9yIF9ncmVhdGVyVGhhbk9yRXF1YWw7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIEdyZWF0ZXJUaGFuT3JFcXVhbAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3JldHVybiBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLkdyZWF0ZXJUaGFuT3JFcXVhbCwgUHJlY2VkZW5jZUNvbXBhcmlzb24sIChsLCByKSA9PiBuZXcgQ29tcGlsZVJlc3VsdChDb21wYXJlKGwsIHIpID49IDAsIERhdGFUeXBlLkJvb2xlYW4pKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2dyZWF0ZXJUaGFuT3JFcXVhbCA/PwotICAgICAgICAgICAgICAgICAgICAgICAoX2dyZWF0ZXJUaGFuT3JFcXVhbCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLkxlc3NUaGFuT3JFcXVhbCwgUHJlY2VkZW5jZUNvbXBhcmlzb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGwsIHIpID0+IENvbXBhcmUobCwgciwgKGNvbXBSZXMpID0+IGNvbXBSZXMgPj0gMCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIElPcGVyYXRvciBfbGVzc1RoYW47Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIExlc3NUaGFuCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vcmV0dXJuIG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuTGVzc1RoYW4sIFByZWNlZGVuY2VDb21wYXJpc29uLCAobCwgcikgPT4gbmV3IENvbXBpbGVSZXN1bHQoQ29tcGFyZShsLCByKSA8IDAsIERhdGFUeXBlLkJvb2xlYW4pKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2xlc3NUaGFuID8/Ci0gICAgICAgICAgICAgICAgICAgICAgIChfbGVzc1RoYW4gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9wZXJhdG9yKE9wZXJhdG9ycy5MZXNzVGhhbk9yRXF1YWwsIFByZWNlZGVuY2VDb21wYXJpc29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsLCByKSA9PiBDb21wYXJlKGwsIHIsIChjb21wUmVzKSA9PiBjb21wUmVzIDwgMCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIExlc3NUaGFuT3JFcXVhbAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3JldHVybiBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLkxlc3NUaGFuT3JFcXVhbCwgUHJlY2VkZW5jZUNvbXBhcmlzb24sIChsLCByKSA9PiBuZXcgQ29tcGlsZVJlc3VsdChDb21wYXJlKGwsIHIpIDw9IDAsIERhdGFUeXBlLkJvb2xlYW4pKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9wZXJhdG9yKE9wZXJhdG9ycy5MZXNzVGhhbk9yRXF1YWwsIFByZWNlZGVuY2VDb21wYXJpc29uLCAobCwgcikgPT4gQ29tcGFyZShsLCByLCAoY29tcFJlcykgPT4gY29tcFJlcyA8PSAwKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX3BlcmNlbnQ7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIFBlcmNlbnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9wZXJjZW50ID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfcGVyY2VudCA9IG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuUGVyY2VudCwgUHJlY2VkZW5jZVBlcmNlbnQsIChsLCByKSA9PgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBsID8/IG5ldyBDb21waWxlUmVzdWx0KDAsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSByID8/IG5ldyBDb21waWxlUmVzdWx0KDAsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsLkRhdGFUeXBlID09IERhdGFUeXBlLkludGVnZXIgJiYgci5EYXRhVHlwZSA9PSBEYXRhVHlwZS5JbnRlZ2VyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGwuUmVzdWx0TnVtZXJpYyAqIHIuUmVzdWx0TnVtZXJpYywgRGF0YVR5cGUuSW50ZWdlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChsLklzTnVtZXJpYyB8fCBsLlJlc3VsdCBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSAmJiAoci5Jc051bWVyaWMgfHwgci5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQobC5SZXN1bHROdW1lcmljICogci5SZXN1bHROdW1lcmljLCBEYXRhVHlwZS5EZWNpbWFsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGVFcnJvclR5cGUuVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfcGVyY2VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBHZXRPYmpGcm9tT3RoZXIoQ29tcGlsZVJlc3VsdCBvYmosIENvbXBpbGVSZXN1bHQgb3RoZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvYmouUmVzdWx0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG90aGVyLkRhdGFUeXBlID09IERhdGFUeXBlLlN0cmluZykgcmV0dXJuIHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgICAgICBlbHNlIHJldHVybiAwZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBvYmouUmVzdWx0VmFsdWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBDb21waWxlUmVzdWx0IENvbXBhcmUoQ29tcGlsZVJlc3VsdCBsLCBDb21waWxlUmVzdWx0IHIsIEZ1bmM8aW50LCBib29sPiBjb21wYXJpc29uICkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxFcnJvclZhbHVlIGVycm9yVmFsOwotICAgICAgICAgICAgaWYgKEVpdGhlcklzRXJyb3IobCwgciwgb3V0IGVycm9yVmFsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoZXJyb3JWYWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb2JqZWN0IGxlZnQsIHJpZ2h0OwotICAgICAgICAgICAgbGVmdCA9IEdldE9iakZyb21PdGhlcihsLCByKTsKLSAgICAgICAgICAgIHJpZ2h0ID0gR2V0T2JqRnJvbU90aGVyKHIsIGwpOwotICAgICAgICAgICAgaWYgKENvbnZlcnRVdGlsLklzTnVtZXJpYyhsZWZ0KSAmJiBDb252ZXJ0VXRpbC5Jc051bWVyaWMocmlnaHQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBsbnVtID0gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUobGVmdCk7Ci0gICAgICAgICAgICAgICAgdmFyIHJudW0gPSBDb252ZXJ0VXRpbC5HZXRWYWx1ZURvdWJsZShyaWdodCk7Ci0gICAgICAgICAgICAgICAgaWYgKE1hdGguQWJzKGxudW0gLSBybnVtKSA8IGRvdWJsZS5FcHNpbG9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KGNvbXBhcmlzb24oMCksIERhdGFUeXBlLkJvb2xlYW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YXIgY29tcGFyaXNvblJlc3VsdCA9IGxudW0uQ29tcGFyZVRvKHJudW0pOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChjb21wYXJpc29uKGNvbXBhcmlzb25SZXN1bHQpLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgY29tcGFyaXNvblJlc3VsdCA9IENvbXBhcmVTdHJpbmcobGVmdCwgcmlnaHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChjb21wYXJpc29uKGNvbXBhcmlzb25SZXN1bHQpLCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBDb21wYXJlU3RyaW5nKG9iamVjdCBsLCBvYmplY3QgcikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHNsID0gKGwgPz8gIiIpLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB2YXIgc3IgPSAociA/PyAiIikuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uU3RyaW5nLkNvbXBhcmUoc2wsIHNyLCBTeXN0ZW0uU3RyaW5nQ29tcGFyaXNvbi5PcmRpbmFsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgIEVpdGhlcklzRXJyb3IoQ29tcGlsZVJlc3VsdCBsLCBDb21waWxlUmVzdWx0IHIsIG91dCBFeGNlbEVycm9yVmFsdWUgZXJyb3JWYWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsLkRhdGFUeXBlID09IERhdGFUeXBlLkV4Y2VsRXJyb3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyb3JWYWwgPSAoRXhjZWxFcnJvclZhbHVlKSBsLlJlc3VsdDsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyLkRhdGFUeXBlID09IERhdGFUeXBlLkV4Y2VsRXJyb3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXJyb3JWYWwgPSAoRXhjZWxFcnJvclZhbHVlKSByLlJlc3VsdDsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVycm9yVmFsID0gbnVsbDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3KGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgICAgICAgfSkpOwogICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIEV4cCB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiBuZXcgT3BlcmF0b3IoCisgICAgICAgICAgT3BlcmF0b3JzLkV4cG9uZW50aWF0aW9uLAorICAgICAgICAgIF9wcmVjZWRlbmNlRXhwLAorICAgICAgICAgIChsLCByKSA9PiB7CisgICAgICAgICAgICBpZiAobCA9PSBudWxsICYmIHIgPT0gbnVsbCkgeworICAgICAgICAgICAgICByZXR1cm4gbmV3KGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbCA9IGwgPz8gbmV3IENvbXBpbGVSZXN1bHQoMCwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICByID0gciA/PyBuZXcgQ29tcGlsZVJlc3VsdCgwLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgICAgIGlmICgobC5Jc051bWVyaWMgfHwgbC5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykKKyAgICAgICAgICAgICAgICAmJiAoci5Jc051bWVyaWMgfHwgci5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIG5ldyhNYXRoLlBvdyhsLlJlc3VsdE51bWVyaWMsIHIuUmVzdWx0TnVtZXJpYyksIERhdGFUeXBlLkRlY2ltYWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldygwZCwgRGF0YVR5cGUuRGVjaW1hbCk7CisgICAgICAgICAgfSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBJT3BlcmF0b3IgQ29uY2F0IHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIG5ldyBPcGVyYXRvcigKKyAgICAgICAgICBPcGVyYXRvcnMuQ29uY2F0LAorICAgICAgICAgIF9wcmVjZWRlbmNlQ29uY2F0LAorICAgICAgICAgIChsLCByKSA9PiB7CisgICAgICAgICAgICBsID0gbCA/PyBuZXcgQ29tcGlsZVJlc3VsdChzdHJpbmcuRW1wdHksIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgICAgICByID0gciA/PyBuZXcgQ29tcGlsZVJlc3VsdChzdHJpbmcuRW1wdHksIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgICAgICB2YXIgbFN0ciA9IGwuUmVzdWx0ICE9IG51bGwgPyBsLlJlc3VsdFZhbHVlLlRvU3RyaW5nKCkgOiBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICB2YXIgclN0ciA9IHIuUmVzdWx0ICE9IG51bGwgPyByLlJlc3VsdFZhbHVlLlRvU3RyaW5nKCkgOiBzdHJpbmcuRW1wdHk7CisgICAgICAgICAgICByZXR1cm4gbmV3KHN0cmluZy5Db25jYXQobFN0ciwgclN0ciksIERhdGFUeXBlLlN0cmluZyk7CisgICAgICAgICAgfSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgSU9wZXJhdG9yIF9ncmVhdGVyVGhhbjsKKworICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBHcmVhdGVyVGhhbiB7CisgICAgZ2V0IHsKKyAgICAgIC8vcmV0dXJuIG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuR3JlYXRlclRoYW4sIFByZWNlZGVuY2VDb21wYXJpc29uLCAobCwgcikgPT4gbmV3IENvbXBpbGVSZXN1bHQoQ29tcGFyZShsLCByKSA+IDAsIERhdGFUeXBlLkJvb2xlYW4pKTsKKyAgICAgIHJldHVybiBfZ3JlYXRlclRoYW4KKyAgICAgICAgICA/PyAoX2dyZWF0ZXJUaGFuID0gbmV3IE9wZXJhdG9yKAorICAgICAgICAgICAgICAgICAgT3BlcmF0b3JzLkxlc3NUaGFuT3JFcXVhbCwKKyAgICAgICAgICAgICAgICAgIF9wcmVjZWRlbmNlQ29tcGFyaXNvbiwKKyAgICAgICAgICAgICAgICAgIChsLCByKSA9PiBDb21wYXJlKGwsIHIsIGNvbXBSZXMgPT4gY29tcFJlcyA+IDApKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgSU9wZXJhdG9yIF9lcTsKKworICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBFcSB7CisgICAgZ2V0IHsKKyAgICAgIC8vcmV0dXJuIG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuRXF1YWxzLCBQcmVjZWRlbmNlQ29tcGFyaXNvbiwgKGwsIHIpID0+IG5ldyBDb21waWxlUmVzdWx0KENvbXBhcmUobCwgcikgPT0gMCwgRGF0YVR5cGUuQm9vbGVhbikpOworICAgICAgcmV0dXJuIF9lcQorICAgICAgICAgID8/IChfZXEgPSBuZXcgT3BlcmF0b3IoCisgICAgICAgICAgICAgICAgICBPcGVyYXRvcnMuTGVzc1RoYW5PckVxdWFsLAorICAgICAgICAgICAgICAgICAgX3ByZWNlZGVuY2VDb21wYXJpc29uLAorICAgICAgICAgICAgICAgICAgKGwsIHIpID0+IENvbXBhcmUobCwgciwgY29tcFJlcyA9PiBjb21wUmVzID09IDApKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgSU9wZXJhdG9yIF9ub3RFcXVhbHNUbzsKKworICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBOb3RFcXVhbHNUbyB7CisgICAgZ2V0IHsKKyAgICAgIC8vcmV0dXJuIG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuTm90RXF1YWxUbywgUHJlY2VkZW5jZUNvbXBhcmlzb24sIChsLCByKSA9PiBuZXcgQ29tcGlsZVJlc3VsdChDb21wYXJlKGwsIHIpICE9IDAsIERhdGFUeXBlLkJvb2xlYW4pKTsKKyAgICAgIHJldHVybiBfbm90RXF1YWxzVG8KKyAgICAgICAgICA/PyAoX25vdEVxdWFsc1RvID0gbmV3IE9wZXJhdG9yKAorICAgICAgICAgICAgICAgICAgT3BlcmF0b3JzLkxlc3NUaGFuT3JFcXVhbCwKKyAgICAgICAgICAgICAgICAgIF9wcmVjZWRlbmNlQ29tcGFyaXNvbiwKKyAgICAgICAgICAgICAgICAgIChsLCByKSA9PiBDb21wYXJlKGwsIHIsIGNvbXBSZXMgPT4gY29tcFJlcyAhPSAwKSkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIElPcGVyYXRvciBfZ3JlYXRlclRoYW5PckVxdWFsOworCisgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIEdyZWF0ZXJUaGFuT3JFcXVhbCB7CisgICAgZ2V0IHsKKyAgICAgIC8vcmV0dXJuIG5ldyBPcGVyYXRvcihPcGVyYXRvcnMuR3JlYXRlclRoYW5PckVxdWFsLCBQcmVjZWRlbmNlQ29tcGFyaXNvbiwgKGwsIHIpID0+IG5ldyBDb21waWxlUmVzdWx0KENvbXBhcmUobCwgcikgPj0gMCwgRGF0YVR5cGUuQm9vbGVhbikpOworICAgICAgcmV0dXJuIF9ncmVhdGVyVGhhbk9yRXF1YWwKKyAgICAgICAgICA/PyAoX2dyZWF0ZXJUaGFuT3JFcXVhbCA9IG5ldyBPcGVyYXRvcigKKyAgICAgICAgICAgICAgICAgIE9wZXJhdG9ycy5MZXNzVGhhbk9yRXF1YWwsCisgICAgICAgICAgICAgICAgICBfcHJlY2VkZW5jZUNvbXBhcmlzb24sCisgICAgICAgICAgICAgICAgICAobCwgcikgPT4gQ29tcGFyZShsLCByLCBjb21wUmVzID0+IGNvbXBSZXMgPj0gMCkpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX2xlc3NUaGFuOworCisgIHB1YmxpYyBzdGF0aWMgSU9wZXJhdG9yIExlc3NUaGFuIHsKKyAgICBnZXQgeworICAgICAgLy9yZXR1cm4gbmV3IE9wZXJhdG9yKE9wZXJhdG9ycy5MZXNzVGhhbiwgUHJlY2VkZW5jZUNvbXBhcmlzb24sIChsLCByKSA9PiBuZXcgQ29tcGlsZVJlc3VsdChDb21wYXJlKGwsIHIpIDwgMCwgRGF0YVR5cGUuQm9vbGVhbikpOworICAgICAgcmV0dXJuIF9sZXNzVGhhbgorICAgICAgICAgID8/IChfbGVzc1RoYW4gPSBuZXcgT3BlcmF0b3IoCisgICAgICAgICAgICAgICAgICBPcGVyYXRvcnMuTGVzc1RoYW5PckVxdWFsLAorICAgICAgICAgICAgICAgICAgX3ByZWNlZGVuY2VDb21wYXJpc29uLAorICAgICAgICAgICAgICAgICAgKGwsIHIpID0+IENvbXBhcmUobCwgciwgY29tcFJlcyA9PiBjb21wUmVzIDwgMCkpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIElPcGVyYXRvciBMZXNzVGhhbk9yRXF1YWwgeworICAgIGdldCB7CisgICAgICAvL3JldHVybiBuZXcgT3BlcmF0b3IoT3BlcmF0b3JzLkxlc3NUaGFuT3JFcXVhbCwgUHJlY2VkZW5jZUNvbXBhcmlzb24sIChsLCByKSA9PiBuZXcgQ29tcGlsZVJlc3VsdChDb21wYXJlKGwsIHIpIDw9IDAsIERhdGFUeXBlLkJvb2xlYW4pKTsKKyAgICAgIHJldHVybiBuZXcgT3BlcmF0b3IoCisgICAgICAgICAgT3BlcmF0b3JzLkxlc3NUaGFuT3JFcXVhbCwKKyAgICAgICAgICBfcHJlY2VkZW5jZUNvbXBhcmlzb24sCisgICAgICAgICAgKGwsIHIpID0+IENvbXBhcmUobCwgciwgY29tcFJlcyA9PiBjb21wUmVzIDw9IDApKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBJT3BlcmF0b3IgX3BlcmNlbnQ7CisKKyAgcHVibGljIHN0YXRpYyBJT3BlcmF0b3IgUGVyY2VudCB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfcGVyY2VudCA9PSBudWxsKSB7CisgICAgICAgIF9wZXJjZW50ID0gbmV3IE9wZXJhdG9yKAorICAgICAgICAgICAgT3BlcmF0b3JzLlBlcmNlbnQsCisgICAgICAgICAgICBfcHJlY2VkZW5jZVBlcmNlbnQsCisgICAgICAgICAgICAobCwgcikgPT4geworICAgICAgICAgICAgICBsID0gbCA/PyBuZXcgQ29tcGlsZVJlc3VsdCgwLCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgICAgICAgICAgICAgciA9IHIgPz8gbmV3IENvbXBpbGVSZXN1bHQoMCwgRGF0YVR5cGUuSW50ZWdlcik7CisgICAgICAgICAgICAgIGlmIChsLkRhdGFUeXBlID09IERhdGFUeXBlLkludGVnZXIgJiYgci5EYXRhVHlwZSA9PSBEYXRhVHlwZS5JbnRlZ2VyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyhsLlJlc3VsdE51bWVyaWMgKiByLlJlc3VsdE51bWVyaWMsIERhdGFUeXBlLkludGVnZXIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmICgobC5Jc051bWVyaWMgfHwgbC5SZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykKKyAgICAgICAgICAgICAgICAgICYmIChyLklzTnVtZXJpYyB8fCByLlJlc3VsdCBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcobC5SZXN1bHROdW1lcmljICogci5SZXN1bHROdW1lcmljLCBEYXRhVHlwZS5EZWNpbWFsKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICByZXR1cm4gbmV3KGVFcnJvclR5cGUuVmFsdWUpOworICAgICAgICAgICAgfSk7CisgICAgICB9CisgICAgICByZXR1cm4gX3BlcmNlbnQ7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IEdldE9iakZyb21PdGhlcihDb21waWxlUmVzdWx0IG9iaiwgQ29tcGlsZVJlc3VsdCBvdGhlcikgeworICAgIGlmIChvYmouUmVzdWx0ID09IG51bGwpIHsKKyAgICAgIGlmIChvdGhlci5EYXRhVHlwZSA9PSBEYXRhVHlwZS5TdHJpbmcpIHsKKyAgICAgICAgcmV0dXJuIHN0cmluZy5FbXB0eTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAwZDsKKyAgICB9CisgICAgcmV0dXJuIG9iai5SZXN1bHRWYWx1ZTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIENvbXBpbGVSZXN1bHQgQ29tcGFyZSgKKyAgICAgIENvbXBpbGVSZXN1bHQgbCwKKyAgICAgIENvbXBpbGVSZXN1bHQgciwKKyAgICAgIEZ1bmM8aW50LCBib29sPiBjb21wYXJpc29uKSB7CisgICAgRXhjZWxFcnJvclZhbHVlIGVycm9yVmFsOworICAgIGlmIChFaXRoZXJJc0Vycm9yKGwsIHIsIG91dCBlcnJvclZhbCkpIHsKKyAgICAgIHJldHVybiBuZXcoZXJyb3JWYWwpOworICAgIH0KKyAgICBvYmplY3QgbGVmdCwKKyAgICAgICAgcmlnaHQ7CisgICAgbGVmdCA9IEdldE9iakZyb21PdGhlcihsLCByKTsKKyAgICByaWdodCA9IEdldE9iakZyb21PdGhlcihyLCBsKTsKKyAgICBpZiAoQ29udmVydFV0aWwuSXNOdW1lcmljKGxlZnQpICYmIENvbnZlcnRVdGlsLklzTnVtZXJpYyhyaWdodCkpIHsKKyAgICAgIHZhciBsbnVtID0gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUobGVmdCk7CisgICAgICB2YXIgcm51bSA9IENvbnZlcnRVdGlsLkdldFZhbHVlRG91YmxlKHJpZ2h0KTsKKyAgICAgIGlmIChNYXRoLkFicyhsbnVtIC0gcm51bSkgPCBkb3VibGUuRXBzaWxvbikgeworICAgICAgICByZXR1cm4gbmV3KGNvbXBhcmlzb24oMCksIERhdGFUeXBlLkJvb2xlYW4pOworICAgICAgfQorICAgICAgdmFyIGNvbXBhcmlzb25SZXN1bHQgPSBsbnVtLkNvbXBhcmVUbyhybnVtKTsKKyAgICAgIHJldHVybiBuZXcoY29tcGFyaXNvbihjb21wYXJpc29uUmVzdWx0KSwgRGF0YVR5cGUuQm9vbGVhbik7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBjb21wYXJpc29uUmVzdWx0ID0gQ29tcGFyZVN0cmluZyhsZWZ0LCByaWdodCk7CisgICAgICByZXR1cm4gbmV3KGNvbXBhcmlzb24oY29tcGFyaXNvblJlc3VsdCksIERhdGFUeXBlLkJvb2xlYW4pOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGludCBDb21wYXJlU3RyaW5nKG9iamVjdCBsLCBvYmplY3QgcikgeworICAgIHZhciBzbCA9IChsID8/ICIiKS5Ub1N0cmluZygpOworICAgIHZhciBzciA9IChyID8/ICIiKS5Ub1N0cmluZygpOworICAgIHJldHVybiBTdHJpbmcuQ29tcGFyZShzbCwgc3IsIFN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sIEVpdGhlcklzRXJyb3IoCisgICAgICBDb21waWxlUmVzdWx0IGwsCisgICAgICBDb21waWxlUmVzdWx0IHIsCisgICAgICBvdXQgRXhjZWxFcnJvclZhbHVlIGVycm9yVmFsKSB7CisgICAgaWYgKGwuRGF0YVR5cGUgPT0gRGF0YVR5cGUuRXhjZWxFcnJvcikgeworICAgICAgZXJyb3JWYWwgPSAoRXhjZWxFcnJvclZhbHVlKWwuUmVzdWx0OworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChyLkRhdGFUeXBlID09IERhdGFUeXBlLkV4Y2VsRXJyb3IpIHsKKyAgICAgIGVycm9yVmFsID0gKEV4Y2VsRXJyb3JWYWx1ZSlyLlJlc3VsdDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBlcnJvclZhbCA9IG51bGw7CisgICAgcmV0dXJuIGZhbHNlOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvT3BlcmF0b3JzL09wZXJhdG9ycy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvT3BlcmF0b3JzLmNzCmluZGV4IGI1YjQ3NzQuLjA0YzA3ZTUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvT3BlcmF0b3JzLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvT3BlcmF0b3JzLmNzCkBAIC0xMyw0NSArMTMsMzkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuT3BlcmF0b3JzCi17Ci0gICAgcHVibGljIGVudW0gT3BlcmF0b3JzCi0gICAgewotICAgICAgICBVbmRlZmluZWQsCi0gICAgICAgIENvbmNhdCwKLSAgICAgICAgUGx1cywKLSAgICAgICAgTWludXMsCi0gICAgICAgIE11bHRpcGx5LAotICAgICAgICBEaXZpZGUsCi0gICAgICAgIE1vZHVsdXMsCi0gICAgICAgIFBlcmNlbnQsCi0gICAgICAgIEVxdWFscywKLSAgICAgICAgR3JlYXRlclRoYW4sCi0gICAgICAgIEdyZWF0ZXJUaGFuT3JFcXVhbCwKLSAgICAgICAgTGVzc1RoYW4sCi0gICAgICAgIExlc3NUaGFuT3JFcXVhbCwKLSAgICAgICAgTm90RXF1YWxUbywKLSAgICAgICAgSW50ZWdlckRpdmlzaW9uLAotICAgICAgICBFeHBvbmVudGlhdGlvbgotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLk9wZXJhdG9yczsKKworcHVibGljIGVudW0gT3BlcmF0b3JzIHsKKyAgVW5kZWZpbmVkLAorICBDb25jYXQsCisgIFBsdXMsCisgIE1pbnVzLAorICBNdWx0aXBseSwKKyAgRGl2aWRlLAorICBNb2R1bHVzLAorICBQZXJjZW50LAorICBFcXVhbHMsCisgIEdyZWF0ZXJUaGFuLAorICBHcmVhdGVyVGhhbk9yRXF1YWwsCisgIExlc3NUaGFuLAorICBMZXNzVGhhbk9yRXF1YWwsCisgIE5vdEVxdWFsVG8sCisgIEludGVnZXJEaXZpc2lvbiwKKyAgRXhwb25lbnRpYXRpb24sCiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvT3BlcmF0b3JzL09wZXJhdG9yc0RpY3QuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWwvT3BlcmF0b3JzL09wZXJhdG9yc0RpY3QuY3MKaW5kZXggMmVhMzRmYi4uMmYxY2Y5OSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsL09wZXJhdG9ycy9PcGVyYXRvcnNEaWN0LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbC9PcGVyYXRvcnMvT3BlcmF0b3JzRGljdC5jcwpAQCAtMTMsNTggKzEzLDUwIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuT3BlcmF0b3JzCi17Ci0gICAgcHVibGljIGNsYXNzIE9wZXJhdG9yc0RpY3QgOiBEaWN0aW9uYXJ5PHN0cmluZywgSU9wZXJhdG9yPgotICAgIHsKLSAgICAgICAgcHVibGljIE9wZXJhdG9yc0RpY3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGQoIisiLCBPcGVyYXRvci5QbHVzKTsKLSAgICAgICAgICAgIEFkZCgiLSIsIE9wZXJhdG9yLk1pbnVzKTsKLSAgICAgICAgICAgIEFkZCgiKiIsIE9wZXJhdG9yLk11bHRpcGx5KTsKLSAgICAgICAgICAgIEFkZCgiLyIsIE9wZXJhdG9yLkRpdmlkZSk7Ci0gICAgICAgICAgICBBZGQoIl4iLCBPcGVyYXRvci5FeHApOwotICAgICAgICAgICAgQWRkKCI9IiwgT3BlcmF0b3IuRXEpOwotICAgICAgICAgICAgQWRkKCI+IiwgT3BlcmF0b3IuR3JlYXRlclRoYW4pOwotICAgICAgICAgICAgQWRkKCI+PSIsIE9wZXJhdG9yLkdyZWF0ZXJUaGFuT3JFcXVhbCk7Ci0gICAgICAgICAgICBBZGQoIjwiLCBPcGVyYXRvci5MZXNzVGhhbik7Ci0gICAgICAgICAgICBBZGQoIjw9IiwgT3BlcmF0b3IuTGVzc1RoYW5PckVxdWFsKTsKLSAgICAgICAgICAgIEFkZCgiPD4iLCBPcGVyYXRvci5Ob3RFcXVhbHNUbyk7Ci0gICAgICAgICAgICBBZGQoIiYiLCBPcGVyYXRvci5Db25jYXQpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnM7CiAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSURpY3Rpb25hcnk8c3RyaW5nLCBJT3BlcmF0b3I+IF9pbnN0YW5jZTsKK3B1YmxpYyBjbGFzcyBPcGVyYXRvcnNEaWN0IDogRGljdGlvbmFyeTxzdHJpbmcsIElPcGVyYXRvcj4geworICBwdWJsaWMgT3BlcmF0b3JzRGljdCgpIHsKKyAgICBBZGQoIisiLCBPcGVyYXRvci5QbHVzKTsKKyAgICBBZGQoIi0iLCBPcGVyYXRvci5NaW51cyk7CisgICAgQWRkKCIqIiwgT3BlcmF0b3IuTXVsdGlwbHkpOworICAgIEFkZCgiLyIsIE9wZXJhdG9yLkRpdmlkZSk7CisgICAgQWRkKCJeIiwgT3BlcmF0b3IuRXhwKTsKKyAgICBBZGQoIj0iLCBPcGVyYXRvci5FcSk7CisgICAgQWRkKCI+IiwgT3BlcmF0b3IuR3JlYXRlclRoYW4pOworICAgIEFkZCgiPj0iLCBPcGVyYXRvci5HcmVhdGVyVGhhbk9yRXF1YWwpOworICAgIEFkZCgiPCIsIE9wZXJhdG9yLkxlc3NUaGFuKTsKKyAgICBBZGQoIjw9IiwgT3BlcmF0b3IuTGVzc1RoYW5PckVxdWFsKTsKKyAgICBBZGQoIjw+IiwgT3BlcmF0b3IuTm90RXF1YWxzVG8pOworICAgIEFkZCgiJiIsIE9wZXJhdG9yLkNvbmNhdCk7CisgIH0KIAotICAgICAgICBwdWJsaWMgc3RhdGljIElEaWN0aW9uYXJ5PHN0cmluZywgSU9wZXJhdG9yPiBJbnN0YW5jZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9pbnN0YW5jZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2luc3RhbmNlID0gbmV3IE9wZXJhdG9yc0RpY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9pbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBwcml2YXRlIHN0YXRpYyBJRGljdGlvbmFyeTxzdHJpbmcsIElPcGVyYXRvcj4gX2luc3RhbmNlOworCisgIHB1YmxpYyBzdGF0aWMgSURpY3Rpb25hcnk8c3RyaW5nLCBJT3BlcmF0b3I+IEluc3RhbmNlIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9pbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgIF9pbnN0YW5jZSA9IG5ldyBPcGVyYXRvcnNEaWN0KCk7CisgICAgICB9CisgICAgICByZXR1cm4gX2luc3RhbmNlOwogICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsQ2FsY3VsYXRpb25PcHRpb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxDYWxjdWxhdGlvbk9wdGlvbi5jcwppbmRleCBjNjQyNzEwLi5hOTRkNWVmIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxDYWxjdWxhdGlvbk9wdGlvbi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxDYWxjdWxhdGlvbk9wdGlvbi5jcwpAQCAtMSwxNiArMSw5IEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Civvu79uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxDYWxjdWxhdGlvbk9wdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICBBbGxvd0NpcmN1bGFyZVJlZmVyZW5jZXMgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbCBBbGxvd0NpcmN1bGFyZVJlZmVyZW5jZXMgeyBnZXQ7IHNldDsgfQotICAgIH0KK3B1YmxpYyBjbGFzcyBFeGNlbENhbGN1bGF0aW9uT3B0aW9uIHsKKyAgcHVibGljIEV4Y2VsQ2FsY3VsYXRpb25PcHRpb24oKSB7CisgICAgQWxsb3dDaXJjdWxhcmVSZWZlcmVuY2VzID0gZmFsc2U7CisgIH0KKworICBwdWJsaWMgYm9vbCBBbGxvd0NpcmN1bGFyZVJlZmVyZW5jZXMgeyBnZXQ7IHNldDsgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsQ2VsbC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbENlbGwuY3MKaW5kZXggYTU2MGIwOC4uYWVkZDQ5YyAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsQ2VsbC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxDZWxsLmNzCkBAIC0xLDI2ICsxLDE4IEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Civvu79uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxDZWxsCi0gICAgewotICAgICAgICBwdWJsaWMgRXhjZWxDZWxsKG9iamVjdCB2YWwsIHN0cmluZyBmb3JtdWxhLCBpbnQgY29sSW5kZXgsIGludCByb3dJbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSB2YWw7Ci0gICAgICAgICAgICBGb3JtdWxhID0gZm9ybXVsYTsKLSAgICAgICAgICAgIENvbEluZGV4ID0gY29sSW5kZXg7Ci0gICAgICAgICAgICBSb3dJbmRleCA9IHJvd0luZGV4OwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgRXhjZWxDZWxsIHsKKyAgcHVibGljIEV4Y2VsQ2VsbChvYmplY3QgdmFsLCBzdHJpbmcgZm9ybXVsYSwgaW50IGNvbEluZGV4LCBpbnQgcm93SW5kZXgpIHsKKyAgICBWYWx1ZSA9IHZhbDsKKyAgICBGb3JtdWxhID0gZm9ybXVsYTsKKyAgICBDb2xJbmRleCA9IGNvbEluZGV4OworICAgIFJvd0luZGV4ID0gcm93SW5kZXg7CisgIH0KIAotICAgICAgICBwdWJsaWMgaW50IENvbEluZGV4IHsgZ2V0OyBwcml2YXRlIHNldDsgfQorICBwdWJsaWMgaW50IENvbEluZGV4IHsgZ2V0OyBwcml2YXRlIHNldDsgfQogCi0gICAgICAgIHB1YmxpYyBpbnQgUm93SW5kZXggeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgIHB1YmxpYyBpbnQgUm93SW5kZXggeyBnZXQ7IHByaXZhdGUgc2V0OyB9CiAKLSAgICAgICAgcHVibGljIG9iamVjdCBWYWx1ZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgcHVibGljIG9iamVjdCBWYWx1ZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KIAotICAgICAgICBwdWJsaWMgc3RyaW5nIEZvcm11bGEgeyBnZXQ7IHByaXZhdGUgc2V0OyB9Ci0gICAgfQorICBwdWJsaWMgc3RyaW5nIEZvcm11bGEgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxEYXRhUHJvdmlkZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxEYXRhUHJvdmlkZXIuY3MKaW5kZXggMTdmMTI1Ny4uMmMzM2VjZSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsRGF0YVByb3ZpZGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbERhdGFQcm92aWRlci5jcwpAQCAtMSwxMjMgKzEsMTUzIEBACi3vu791c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNsYXNzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCB0byBiZSBhYmxlIHRvIGRlbGl2ZXIgZXhjZWwgZGF0YQotICAgIC8vLyB0byB0aGUgZm9ybXVsYSBwYXJzZXIuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhjZWxEYXRhUHJvdmlkZXIKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgcmFuZ2Ugb2YgY2VsbHMgaW4gYSB3b3Jrc2hlZXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgSVJhbmdlSW5mbyA6IElFbnVtZXJhdG9yPElDZWxsSW5mbz4sIElFbnVtZXJhYmxlPElDZWxsSW5mbz4KLSAgICAgICAgewotICAgICAgICAgICAgYm9vbCBJc0VtcHR5IHsgZ2V0OyB9Ci0gICAgICAgICAgICBib29sIElzTXVsdGkgeyBnZXQ7IH0KLSAgICAgICAgICAgIGludCBHZXROQ2VsbHMoKTsKLSAgICAgICAgICAgIEV4Y2VsQWRkcmVzc0Jhc2UgQWRkcmVzcyB7IGdldDsgfQotICAgICAgICAgICAgb2JqZWN0IEdldFZhbHVlKGludCByb3csIGludCBjb2wpOwotICAgICAgICAgICAgb2JqZWN0IEdldE9mZnNldChpbnQgcm93T2Zmc2V0LCBpbnQgY29sT2Zmc2V0KTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwogCi0gICAgICAgICAgICBFeGNlbFdvcmtzaGVldCBXb3Jrc2hlZXQgeyBnZXQ7IH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbmZvcm1hdGlvbiBhbmQgaGVscCBtZXRob2RzIGFib3V0IGEgY2VsbAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIElDZWxsSW5mbwotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcgQWRkcmVzcyB7IGdldDsgfQotICAgICAgICAgICAgaW50IFJvdyB7IGdldDsgfQotICAgICAgICAgICAgaW50IENvbHVtbiB7IGdldDsgfQotICAgICAgICAgICAgc3RyaW5nIEZvcm11bGEgeyBnZXQ7ICB9Ci0gICAgICAgICAgICBvYmplY3QgVmFsdWUgeyBnZXQ7IH0KLSAgICAgICAgICAgIGRvdWJsZSBWYWx1ZURvdWJsZSB7IGdldDsgfQotICAgICAgICAgICAgZG91YmxlIFZhbHVlRG91YmxlTG9naWNhbCB7IGdldDsgfQotICAgICAgICAgICAgYm9vbCBJc0hpZGRlblJvdyB7IGdldDsgfQotICAgICAgICAgICAgYm9vbCBJc0V4Y2VsRXJyb3IgeyBnZXQ7IH0KLSAgICAgICAgICAgIElMaXN0PFRva2VuPiBUb2tlbnMgeyBnZXQ7IH0gICAKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIElOYW1lSW5mbwotICAgICAgICB7Ci0gICAgICAgICAgICB1bG9uZyBJZCB7IGdldDsgc2V0OyB9Ci0gICAgICAgICAgICBzdHJpbmcgV29ya3NoZWV0IHtnZXQ7IHNldDt9Ci0gICAgICAgICAgICBzdHJpbmcgTmFtZSB7IGdldDsgc2V0OyB9Ci0gICAgICAgICAgICBzdHJpbmcgRm9ybXVsYSB7IGdldDsgc2V0OyB9Ci0gICAgICAgICAgICBJTGlzdDxUb2tlbj4gVG9rZW5zIHsgZ2V0OyB9Ci0gICAgICAgICAgICBvYmplY3QgVmFsdWUgeyBnZXQ7IHNldDsgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCB3b3Jrc2hlZXQgbmFtZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIGFic3RyYWN0IEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24gR2V0V29ya3NoZWV0TmFtZXMoc3RyaW5nIHdvcmtzaGVldCk7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgYWxsIGRlZmluZWQgbmFtZXMgaW4gYSB3b3JrYm9vawotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgRXhjZWxOYW1lZFJhbmdlQ29sbGVjdGlvbiBHZXRXb3JrYm9va05hbWVWYWx1ZXMoKTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB2YWx1ZXMgZnJvbSB0aGUgcmVxdWlyZWQgcmFuZ2UuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0TmFtZSI+VGhlIG5hbWUgb2YgdGhlIHdvcmtzaGVldDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij5Sb3c8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbHVtbiI+Q29sdW1uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5UaGUgcmVmZXJlbmNlIGFkZHJlc3M8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSVJhbmdlSW5mbyBHZXRSYW5nZShzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IHJvdywgaW50IGNvbHVtbiwgc3RyaW5nIGFkZHJlc3MpOwotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSU5hbWVJbmZvIEdldE5hbWUoc3RyaW5nIHdvcmtzaGVldCwgc3RyaW5nIG5hbWUpOworLy8vIDxzdW1tYXJ5PgorLy8vIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIGltcGxlbWVudGVkIHRvIGJlIGFibGUgdG8gZGVsaXZlciBleGNlbCBkYXRhCisvLy8gdG8gdGhlIGZvcm11bGEgcGFyc2VyLgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeGNlbERhdGFQcm92aWRlciB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgcmFuZ2Ugb2YgY2VsbHMgaW4gYSB3b3Jrc2hlZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnRlcmZhY2UgSVJhbmdlSW5mbyA6IElFbnVtZXJhdG9yPElDZWxsSW5mbz4sIElFbnVtZXJhYmxlPElDZWxsSW5mbz4geworICAgIGJvb2wgSXNFbXB0eSB7IGdldDsgfQogCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBJRW51bWVyYWJsZTxvYmplY3Q+IEdldFJhbmdlVmFsdWVzKHN0cmluZyBhZGRyZXNzKTsKKyAgICBib29sIElzTXVsdGkgeyBnZXQ7IH0KIAotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgc3RyaW5nIEdldFJhbmdlRm9ybXVsYShzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IHJvdywgaW50IGNvbHVtbik7Ci0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBMaXN0PFRva2VuPiBHZXRSYW5nZUZvcm11bGFUb2tlbnMoc3RyaW5nIHdvcmtzaGVldE5hbWUsIGludCByb3csIGludCBjb2x1bW4pOwotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBJc1Jvd0hpZGRlbihzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IHJvdyk7Ci0gICAgICAgIC8vLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8vLyBSZXR1cm5zIGEgc2luZ2xlIGNlbGwgdmFsdWUKLSAgICAgICAgLy8vLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICAvL3B1YmxpYyBhYnN0cmFjdCBvYmplY3QgR2V0Q2VsbFZhbHVlKGludCBzaGVldElELCBzdHJpbmcgYWRkcmVzcyk7CisgICAgaW50IEdldE5DZWxscygpOwogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgYSBzaW5nbGUgY2VsbCB2YWx1ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNoZWV0TmFtZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IEdldENlbGxWYWx1ZShzdHJpbmcgc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sKTsKKyAgICBFeGNlbEFkZHJlc3NCYXNlIEFkZHJlc3MgeyBnZXQ7IH0KIAotICAgICAgICAvLy8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vLy8gU2V0cyB0aGUgdmFsdWUgb24gdGhlIGNlbGwKLSAgICAgICAgLy8vLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vLy8gPHBhcmFtIG5hbWU9InZhbHVlIj48L3BhcmFtPgotICAgICAgICAvL3B1YmxpYyBhYnN0cmFjdCB2b2lkIFNldENlbGxWYWx1ZShzdHJpbmcgYWRkcmVzcywgb2JqZWN0IHZhbHVlKTsKKyAgICBvYmplY3QgR2V0VmFsdWUoaW50IHJvdywgaW50IGNvbCk7CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgbG93ZXN0IHJpZ2h0bW9zdCBjZWxsIG9uIHRoZSB3b3Jrc2hlZXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0id29ya3NoZWV0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgRXhjZWxDZWxsQWRkcmVzcyBHZXREaW1lbnNpb25FbmQoc3RyaW5nIHdvcmtzaGVldCk7CisgICAgb2JqZWN0IEdldE9mZnNldChpbnQgcm93T2Zmc2V0LCBpbnQgY29sT2Zmc2V0KTsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBNYXggbnVtYmVyIG9mIGNvbHVtbnMgaW4gYSB3b3Jrc2hlZXQgdGhhdCB0aGUgRXhjZWwgZGF0YSBwcm92aWRlciBjYW4gaGFuZGxlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IEV4Y2VsTWF4Q29sdW1ucyB7IGdldDsgfQorICAgIEV4Y2VsV29ya3NoZWV0IFdvcmtzaGVldCB7IGdldDsgfQorICB9CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTWF4IG51bWJlciBvZiByb3dzIGluIGEgd29ya3NoZWV0IHRoYXQgdGhlIEV4Y2VsIGRhdGEgcHJvdmlkZXIgY2FuIGhhbmRsZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgaW50IEV4Y2VsTWF4Um93cyB7IGdldDsgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbmZvcm1hdGlvbiBhbmQgaGVscCBtZXRob2RzIGFib3V0IGEgY2VsbAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50ZXJmYWNlIElDZWxsSW5mbyB7CisgICAgc3RyaW5nIEFkZHJlc3MgeyBnZXQ7IH0KIAotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgb2JqZWN0IEdldFJhbmdlVmFsdWUoc3RyaW5nIHdvcmtzaGVldE5hbWUsIGludCByb3csIGludCBjb2x1bW4pOwotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgc3RyaW5nIEdldEZvcm1hdChvYmplY3QgdmFsdWUsIHN0cmluZyBmb3JtYXQpOworICAgIGludCBSb3cgeyBnZXQ7IH0KIAotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZXNldCgpOwotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSVJhbmdlSW5mbyBHZXRSYW5nZShzdHJpbmcgd29ya3NoZWV0LCBpbnQgZnJvbVJvdywgaW50IGZyb21Db2wsIGludCB0b1JvdywgaW50IHRvQ29sKTsKLSAgICB9CisgICAgaW50IENvbHVtbiB7IGdldDsgfQorCisgICAgc3RyaW5nIEZvcm11bGEgeyBnZXQ7IH0KKworICAgIG9iamVjdCBWYWx1ZSB7IGdldDsgfQorCisgICAgZG91YmxlIFZhbHVlRG91YmxlIHsgZ2V0OyB9CisKKyAgICBkb3VibGUgVmFsdWVEb3VibGVMb2dpY2FsIHsgZ2V0OyB9CisKKyAgICBib29sIElzSGlkZGVuUm93IHsgZ2V0OyB9CisKKyAgICBib29sIElzRXhjZWxFcnJvciB7IGdldDsgfQorCisgICAgSUxpc3Q8VG9rZW4+IFRva2VucyB7IGdldDsgfQorICB9CisKKyAgcHVibGljIGludGVyZmFjZSBJTmFtZUluZm8geworICAgIHVsb25nIElkIHsgZ2V0OyBzZXQ7IH0KKworICAgIHN0cmluZyBXb3Jrc2hlZXQgeyBnZXQ7IHNldDsgfQorCisgICAgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQorCisgICAgc3RyaW5nIEZvcm11bGEgeyBnZXQ7IHNldDsgfQorCisgICAgSUxpc3Q8VG9rZW4+IFRva2VucyB7IGdldDsgfQorCisgICAgb2JqZWN0IFZhbHVlIHsgZ2V0OyBzZXQ7IH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgdGhlIG5hbWVzIG9mIGFsbCB3b3Jrc2hlZXQgbmFtZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIGFic3RyYWN0IEV4Y2VsTmFtZWRSYW5nZUNvbGxlY3Rpb24gR2V0V29ya3NoZWV0TmFtZXMoc3RyaW5nIHdvcmtzaGVldCk7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyBhbGwgZGVmaW5lZCBuYW1lcyBpbiBhIHdvcmtib29rCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBhYnN0cmFjdCBFeGNlbE5hbWVkUmFuZ2VDb2xsZWN0aW9uIEdldFdvcmtib29rTmFtZVZhbHVlcygpOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgdmFsdWVzIGZyb20gdGhlIHJlcXVpcmVkIHJhbmdlLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldE5hbWUiPlRoZSBuYW1lIG9mIHRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+Um93PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2x1bW4iPkNvbHVtbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIHJlZmVyZW5jZSBhZGRyZXNzPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIGFic3RyYWN0IElSYW5nZUluZm8gR2V0UmFuZ2Uoc3RyaW5nIHdvcmtzaGVldE5hbWUsIGludCByb3csIGludCBjb2x1bW4sIHN0cmluZyBhZGRyZXNzKTsKKworICBwdWJsaWMgYWJzdHJhY3QgSU5hbWVJbmZvIEdldE5hbWUoc3RyaW5nIHdvcmtzaGVldCwgc3RyaW5nIG5hbWUpOworCisgIHB1YmxpYyBhYnN0cmFjdCBJRW51bWVyYWJsZTxvYmplY3Q+IEdldFJhbmdlVmFsdWVzKHN0cmluZyBhZGRyZXNzKTsKKworICBwdWJsaWMgYWJzdHJhY3Qgc3RyaW5nIEdldFJhbmdlRm9ybXVsYShzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IHJvdywgaW50IGNvbHVtbik7CisKKyAgcHVibGljIGFic3RyYWN0IExpc3Q8VG9rZW4+IEdldFJhbmdlRm9ybXVsYVRva2VucyhzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IHJvdywgaW50IGNvbHVtbik7CisKKyAgcHVibGljIGFic3RyYWN0IGJvb2wgSXNSb3dIaWRkZW4oc3RyaW5nIHdvcmtzaGVldE5hbWUsIGludCByb3cpOworCisgIC8vLy8vIDxzdW1tYXJ5PgorICAvLy8vLyBSZXR1cm5zIGEgc2luZ2xlIGNlbGwgdmFsdWUKKyAgLy8vLy8gPC9zdW1tYXJ5PgorICAvLy8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KKyAgLy8vLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICAvL3B1YmxpYyBhYnN0cmFjdCBvYmplY3QgR2V0Q2VsbFZhbHVlKGludCBzaGVldElELCBzdHJpbmcgYWRkcmVzcyk7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyBhIHNpbmdsZSBjZWxsIHZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ic2hlZXROYW1lIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2wiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBhYnN0cmFjdCBvYmplY3QgR2V0Q2VsbFZhbHVlKHN0cmluZyBzaGVldE5hbWUsIGludCByb3csIGludCBjb2wpOworCisgIC8vLy8vIDxzdW1tYXJ5PgorICAvLy8vLyBTZXRzIHRoZSB2YWx1ZSBvbiB0aGUgY2VsbAorICAvLy8vLyA8L3N1bW1hcnk+CisgIC8vLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPjwvcGFyYW0+CisgIC8vcHVibGljIGFic3RyYWN0IHZvaWQgU2V0Q2VsbFZhbHVlKHN0cmluZyBhZGRyZXNzLCBvYmplY3QgdmFsdWUpOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGxvd2VzdCByaWdodG1vc3QgY2VsbCBvbiB0aGUgd29ya3NoZWV0LgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldCI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIGFic3RyYWN0IEV4Y2VsQ2VsbEFkZHJlc3MgR2V0RGltZW5zaW9uRW5kKHN0cmluZyB3b3Jrc2hlZXQpOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE1heCBudW1iZXIgb2YgY29sdW1ucyBpbiBhIHdvcmtzaGVldCB0aGF0IHRoZSBFeGNlbCBkYXRhIHByb3ZpZGVyIGNhbiBoYW5kbGUuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBhYnN0cmFjdCBpbnQgRXhjZWxNYXhDb2x1bW5zIHsgZ2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTWF4IG51bWJlciBvZiByb3dzIGluIGEgd29ya3NoZWV0IHRoYXQgdGhlIEV4Y2VsIGRhdGEgcHJvdmlkZXIgY2FuIGhhbmRsZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYWJzdHJhY3QgaW50IEV4Y2VsTWF4Um93cyB7IGdldDsgfQorCisgIHB1YmxpYyBhYnN0cmFjdCBvYmplY3QgR2V0UmFuZ2VWYWx1ZShzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IHJvdywgaW50IGNvbHVtbik7CisKKyAgcHVibGljIGFic3RyYWN0IHN0cmluZyBHZXRGb3JtYXQob2JqZWN0IHZhbHVlLCBzdHJpbmcgZm9ybWF0KTsKKworICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBSZXNldCgpOworCisgIHB1YmxpYyBhYnN0cmFjdCBJUmFuZ2VJbmZvIEdldFJhbmdlKAorICAgICAgc3RyaW5nIHdvcmtzaGVldCwKKyAgICAgIGludCBmcm9tUm93LAorICAgICAgaW50IGZyb21Db2wsCisgICAgICBpbnQgdG9Sb3csCisgICAgICBpbnQgdG9Db2wpOwogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0FkZHJlc3NUcmFuc2xhdG9yLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0FkZHJlc3NUcmFuc2xhdG9yLmNzCmluZGV4IDdmMTMzNzkuLjc4MTY4NTQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9BZGRyZXNzVHJhbnNsYXRvci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvQWRkcmVzc1RyYW5zbGF0b3IuY3MKQEAgLTEzLDExOSArMTMsMTA0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gSGFuZGxlcyB0cmFuc2xhdGlvbnMgZnJvbSBTcHJlYWRzaGVldCBhZGRyZXNzZXMgdG8gMC1iYXNlZCBudW1lcmljIGluZGV4LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEFkZHJlc3NUcmFuc2xhdG9yCi0gICAgewotICAgICAgICBwdWJsaWMgZW51bSBSYW5nZUNhbGN1bGF0aW9uQmVoYXZpb3VyCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpcnN0UGFydCwKLSAgICAgICAgICAgIExhc3RQYXJ0Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwogCi0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRXhjZWxEYXRhUHJvdmlkZXIgX2V4Y2VsRGF0YVByb3ZpZGVyOworLy8vIDxzdW1tYXJ5PgorLy8vIEhhbmRsZXMgdHJhbnNsYXRpb25zIGZyb20gU3ByZWFkc2hlZXQgYWRkcmVzc2VzIHRvIDAtYmFzZWQgbnVtZXJpYyBpbmRleC4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgQWRkcmVzc1RyYW5zbGF0b3IgeworICBwdWJsaWMgZW51bSBSYW5nZUNhbGN1bGF0aW9uQmVoYXZpb3VyIHsKKyAgICBGaXJzdFBhcnQsCisgICAgTGFzdFBhcnQsCisgIH0KIAotICAgICAgICBwdWJsaWMgQWRkcmVzc1RyYW5zbGF0b3IoRXhjZWxEYXRhUHJvdmlkZXIgZXhjZWxEYXRhUHJvdmlkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlcXVpcmUuVGhhdChleGNlbERhdGFQcm92aWRlcikuTmFtZWQoImV4Y2VsRGF0YVByb3ZpZGVyIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIgPSBleGNlbERhdGFQcm92aWRlcjsKLSAgICAgICAgfQorICBwcml2YXRlIHJlYWRvbmx5IEV4Y2VsRGF0YVByb3ZpZGVyIF9leGNlbERhdGFQcm92aWRlcjsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUcmFuc2xhdGVzIGFuIGFkZHJlc3MgaW4gZm9ybWF0ICJBMSIgdG8gY29sLSBhbmQgcm93aW5kZXguCi0gICAgICAgIC8vLyAKLSAgICAgICAgLy8vIElmIHRoZSBzdXBwbGllZCBhZGRyZXNzIGlzIGEgcmFuZ2UsIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBwYXJ0IHdpbGwgYmUgY2FsY3VsYXRlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgVG9Db2xBbmRSb3coc3RyaW5nIGFkZHJlc3MsIG91dCBpbnQgY29sLCBvdXQgaW50IHJvdykKLSAgICAgICAgewotICAgICAgICAgICAgVG9Db2xBbmRSb3coYWRkcmVzcywgb3V0IGNvbCwgb3V0IHJvdywgUmFuZ2VDYWxjdWxhdGlvbkJlaGF2aW91ci5GaXJzdFBhcnQpOwotICAgICAgICB9CisgIHB1YmxpYyBBZGRyZXNzVHJhbnNsYXRvcihFeGNlbERhdGFQcm92aWRlciBleGNlbERhdGFQcm92aWRlcikgeworICAgIFJlcXVpcmUuVGhhdChleGNlbERhdGFQcm92aWRlcikuTmFtZWQoImV4Y2VsRGF0YVByb3ZpZGVyIikuSXNOb3ROdWxsKCk7CisgICAgX2V4Y2VsRGF0YVByb3ZpZGVyID0gZXhjZWxEYXRhUHJvdmlkZXI7CisgIH0KIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUcmFuc2xhdGVzIGFuIGFkZHJlc3MgaW4gZm9ybWF0ICJBMSIgdG8gY29sLSBhbmQgcm93aW5kZXguCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2wiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImJlaGF2aW91ciI+PC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBUb0NvbEFuZFJvdyhzdHJpbmcgYWRkcmVzcywgb3V0IGludCBjb2wsIG91dCBpbnQgcm93LCBSYW5nZUNhbGN1bGF0aW9uQmVoYXZpb3VyIGJlaGF2aW91cikKLSAgICAgICAgewotICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MuVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgIHZhciBhbHBoYVBhcnQgPSBHZXRBbHBoYVBhcnQoYWRkcmVzcyk7Ci0gICAgICAgICAgICBjb2wgPSAwOwotICAgICAgICAgICAgdmFyIG5MZXR0ZXJzSW5BbHBoYWJldCA9IDI2OwotICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBhbHBoYVBhcnQuTGVuZ3RoOyB4KyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHBvcyA9IGFscGhhUGFydC5MZW5ndGggLSB4IC0gMTsKLSAgICAgICAgICAgICAgICB2YXIgY3VycmVudE51bWVyaWNWYWx1ZSA9IEdldE51bWVyaWNBbHBoYVZhbHVlKGFscGhhUGFydFt4XSk7Ci0gICAgICAgICAgICAgICAgY29sICs9IChuTGV0dGVyc0luQWxwaGFiZXQgKiBwb3MgKiBjdXJyZW50TnVtZXJpY1ZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAocG9zID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb2wgKz0gY3VycmVudE51bWVyaWNWYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL2NvbC0tOwotICAgICAgICAgICAgLy9yb3cgPSBHZXRJbnRQYXJ0KGFkZHJlc3MpIC0gMSA/PyBHZXRSb3dJbmRleEJ5QmVoYXZpb3VyKGJlaGF2aW91cik7Ci0gICAgICAgICAgICByb3cgPSBHZXRJbnRQYXJ0KGFkZHJlc3MpID8/IEdldFJvd0luZGV4QnlCZWhhdmlvdXIoYmVoYXZpb3VyKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHJhbnNsYXRlcyBhbiBhZGRyZXNzIGluIGZvcm1hdCAiQTEiIHRvIGNvbC0gYW5kIHJvd2luZGV4LgorICAvLy8KKyAgLy8vIElmIHRoZSBzdXBwbGllZCBhZGRyZXNzIGlzIGEgcmFuZ2UsIHRoZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBwYXJ0IHdpbGwgYmUgY2FsY3VsYXRlZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImNvbCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyb3ciPjwvcGFyYW0+CisgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgVG9Db2xBbmRSb3coc3RyaW5nIGFkZHJlc3MsIG91dCBpbnQgY29sLCBvdXQgaW50IHJvdykgeworICAgIFRvQ29sQW5kUm93KGFkZHJlc3MsIG91dCBjb2wsIG91dCByb3csIFJhbmdlQ2FsY3VsYXRpb25CZWhhdmlvdXIuRmlyc3RQYXJ0KTsKKyAgfQogCi0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBHZXRSb3dJbmRleEJ5QmVoYXZpb3VyKFJhbmdlQ2FsY3VsYXRpb25CZWhhdmlvdXIgYmVoYXZpb3VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYmVoYXZpb3VyID09IFJhbmdlQ2FsY3VsYXRpb25CZWhhdmlvdXIuRmlyc3RQYXJ0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIF9leGNlbERhdGFQcm92aWRlci5FeGNlbE1heFJvd3M7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBHZXROdW1lcmljQWxwaGFWYWx1ZShjaGFyIGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KWMgLSA2NDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RyaW5nIEdldEFscGhhUGFydChzdHJpbmcgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFJlZ2V4Lk1hdGNoKGFkZHJlc3MsICJbQS1aXSsiKS5WYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50PyBHZXRJbnRQYXJ0KHN0cmluZyBhZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUmVnZXguSXNNYXRjaChhZGRyZXNzLCAiWzAtOV0rIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGludC5QYXJzZShSZWdleC5NYXRjaChhZGRyZXNzLCAiWzAtOV0rIikuVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHJhbnNsYXRlcyBhbiBhZGRyZXNzIGluIGZvcm1hdCAiQTEiIHRvIGNvbC0gYW5kIHJvd2luZGV4LgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InJvdyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJiZWhhdmlvdXIiPjwvcGFyYW0+CisgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgVG9Db2xBbmRSb3coCisgICAgICBzdHJpbmcgYWRkcmVzcywKKyAgICAgIG91dCBpbnQgY29sLAorICAgICAgb3V0IGludCByb3csCisgICAgICBSYW5nZUNhbGN1bGF0aW9uQmVoYXZpb3VyIGJlaGF2aW91cikgeworICAgIGFkZHJlc3MgPSBhZGRyZXNzLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgdmFyIGFscGhhUGFydCA9IEdldEFscGhhUGFydChhZGRyZXNzKTsKKyAgICBjb2wgPSAwOworICAgIHZhciBuTGV0dGVyc0luQWxwaGFiZXQgPSAyNjsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IGFscGhhUGFydC5MZW5ndGg7IHgrKykgeworICAgICAgdmFyIHBvcyA9IGFscGhhUGFydC5MZW5ndGggLSB4IC0gMTsKKyAgICAgIHZhciBjdXJyZW50TnVtZXJpY1ZhbHVlID0gR2V0TnVtZXJpY0FscGhhVmFsdWUoYWxwaGFQYXJ0W3hdKTsKKyAgICAgIGNvbCArPSAobkxldHRlcnNJbkFscGhhYmV0ICogcG9zICogY3VycmVudE51bWVyaWNWYWx1ZSk7CisgICAgICBpZiAocG9zID09IDApIHsKKyAgICAgICAgY29sICs9IGN1cnJlbnROdW1lcmljVmFsdWU7CisgICAgICB9CiAgICAgfQorICAgIC8vY29sLS07CisgICAgLy9yb3cgPSBHZXRJbnRQYXJ0KGFkZHJlc3MpIC0gMSA/PyBHZXRSb3dJbmRleEJ5QmVoYXZpb3VyKGJlaGF2aW91cik7CisgICAgcm93ID0gR2V0SW50UGFydChhZGRyZXNzKSA/PyBHZXRSb3dJbmRleEJ5QmVoYXZpb3VyKGJlaGF2aW91cik7CisgIH0KKworICBwcml2YXRlIGludCBHZXRSb3dJbmRleEJ5QmVoYXZpb3VyKFJhbmdlQ2FsY3VsYXRpb25CZWhhdmlvdXIgYmVoYXZpb3VyKSB7CisgICAgaWYgKGJlaGF2aW91ciA9PSBSYW5nZUNhbGN1bGF0aW9uQmVoYXZpb3VyLkZpcnN0UGFydCkgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiBfZXhjZWxEYXRhUHJvdmlkZXIuRXhjZWxNYXhSb3dzOworICB9CisKKyAgcHJpdmF0ZSBpbnQgR2V0TnVtZXJpY0FscGhhVmFsdWUoY2hhciBjKSB7CisgICAgcmV0dXJuIGMgLSA2NDsKKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIEdldEFscGhhUGFydChzdHJpbmcgYWRkcmVzcykgeworICAgIHJldHVybiBSZWdleC5NYXRjaChhZGRyZXNzLCAiW0EtWl0rIikuVmFsdWU7CisgIH0KKworICBwcml2YXRlIGludD8gR2V0SW50UGFydChzdHJpbmcgYWRkcmVzcykgeworICAgIGlmIChSZWdleC5Jc01hdGNoKGFkZHJlc3MsICJbMC05XSsiKSkgeworICAgICAgcmV0dXJuIGludC5QYXJzZShSZWdleC5NYXRjaChhZGRyZXNzLCAiWzAtOV0rIikuVmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0NlbGxSZWZlcmVuY2VQcm92aWRlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9DZWxsUmVmZXJlbmNlUHJvdmlkZXIuY3MKaW5kZXggNzdjYTA4My4uNTkwZDNlMCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0NlbGxSZWZlcmVuY2VQcm92aWRlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvQ2VsbFJlZmVyZW5jZVByb3ZpZGVyLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw1NyArMTMsNTEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzCi17Ci0gICAgcHVibGljIGNsYXNzIENlbGxSZWZlcmVuY2VQcm92aWRlcgotICAgIHsKLSAgICAgICAgcHVibGljIHZpcnR1YWwgSUVudW1lcmFibGU8c3RyaW5nPiBHZXRSZWZlcmVuY2VkQWRkcmVzc2VzKHN0cmluZyBjZWxsRm9ybXVsYSwgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdENlbGxzID0gbmV3IExpc3Q8c3RyaW5nPigpOwotICAgICAgICAgICAgdmFyIHIgPSBjb250ZXh0LkNvbmZpZ3VyYXRpb24uTGV4ZXIuVG9rZW5pemUoY2VsbEZvcm11bGEsIGNvbnRleHQuU2NvcGVzLkN1cnJlbnQuQWRkcmVzcy5Xb3Jrc2hlZXQpOwotICAgICAgICAgICAgdmFyIHRvQWRkcmVzc2VzID0gci5XaGVyZSh4ID0+IHguVG9rZW5UeXBlID09IFRva2VuVHlwZS5FeGNlbEFkZHJlc3MpOwotICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRvQWRkcmVzcyBpbiB0b0FkZHJlc3NlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgcmFuZ2VBZGRyZXNzID0gY29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZSh0b0FkZHJlc3MuVmFsdWUpOwotICAgICAgICAgICAgICAgIHZhciByYW5nZUNlbGxzID0gbmV3IExpc3Q8c3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGlmIChyYW5nZUFkZHJlc3MuRnJvbVJvdyA8IHJhbmdlQWRkcmVzcy5Ub1JvdyB8fCByYW5nZUFkZHJlc3MuRnJvbUNvbCA8IHJhbmdlQWRkcmVzcy5Ub0NvbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGNvbCA9IHJhbmdlQWRkcmVzcy5Gcm9tQ29sOyBjb2wgPD0gcmFuZ2VBZGRyZXNzLlRvQ29sOyBjb2wrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcm93ID0gcmFuZ2VBZGRyZXNzLkZyb21Sb3c7IHJvdyA8PSByYW5nZUFkZHJlc3MuVG9Sb3c7IHJvdysrKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENlbGxzLkFkZChjb250ZXh0LlJhbmdlQWRkcmVzc0ZhY3RvcnkuQ3JlYXRlKGNvbCwgcm93KS5BZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByYW5nZUNlbGxzLkFkZCh0b0FkZHJlc3MuVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXN1bHRDZWxscy5BZGRSYW5nZShyYW5nZUNlbGxzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHRDZWxsczsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOworCitwdWJsaWMgY2xhc3MgQ2VsbFJlZmVyZW5jZVByb3ZpZGVyIHsKKyAgcHVibGljIHZpcnR1YWwgSUVudW1lcmFibGU8c3RyaW5nPiBHZXRSZWZlcmVuY2VkQWRkcmVzc2VzKAorICAgICAgc3RyaW5nIGNlbGxGb3JtdWxhLAorICAgICAgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHZhciByZXN1bHRDZWxscyA9IG5ldyBMaXN0PHN0cmluZz4oKTsKKyAgICB2YXIgciA9IGNvbnRleHQuQ29uZmlndXJhdGlvbi5MZXhlci5Ub2tlbml6ZSgKKyAgICAgICAgY2VsbEZvcm11bGEsCisgICAgICAgIGNvbnRleHQuU2NvcGVzLkN1cnJlbnQuQWRkcmVzcy5Xb3Jrc2hlZXQpOworICAgIHZhciB0b0FkZHJlc3NlcyA9IHIuV2hlcmUoeCA9PiB4LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuRXhjZWxBZGRyZXNzKTsKKyAgICBmb3JlYWNoICh2YXIgdG9BZGRyZXNzIGluIHRvQWRkcmVzc2VzKSB7CisgICAgICB2YXIgcmFuZ2VBZGRyZXNzID0gY29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZSh0b0FkZHJlc3MuVmFsdWUpOworICAgICAgdmFyIHJhbmdlQ2VsbHMgPSBuZXcgTGlzdDxzdHJpbmc+KCk7CisgICAgICBpZiAocmFuZ2VBZGRyZXNzLkZyb21Sb3cgPCByYW5nZUFkZHJlc3MuVG9Sb3cgfHwgcmFuZ2VBZGRyZXNzLkZyb21Db2wgPCByYW5nZUFkZHJlc3MuVG9Db2wpIHsKKyAgICAgICAgZm9yICh2YXIgY29sID0gcmFuZ2VBZGRyZXNzLkZyb21Db2w7IGNvbCA8PSByYW5nZUFkZHJlc3MuVG9Db2w7IGNvbCsrKSB7CisgICAgICAgICAgZm9yICh2YXIgcm93ID0gcmFuZ2VBZGRyZXNzLkZyb21Sb3c7IHJvdyA8PSByYW5nZUFkZHJlc3MuVG9Sb3c7IHJvdysrKSB7CisgICAgICAgICAgICByZXN1bHRDZWxscy5BZGQoY29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZShjb2wsIHJvdykuQWRkcmVzcyk7CisgICAgICAgICAgfQogICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByYW5nZUNlbGxzLkFkZCh0b0FkZHJlc3MuVmFsdWUpOworICAgICAgfQorICAgICAgcmVzdWx0Q2VsbHMuQWRkUmFuZ2UocmFuZ2VDZWxscyk7CiAgICAgfQorICAgIHJldHVybiByZXN1bHRDZWxsczsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4Y2VsQWRkcmVzc0luZm8uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRXhjZWxBZGRyZXNzSW5mby5jcwppbmRleCBmOGFlOWZhLi5hZmJhMmMxIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRXhjZWxBZGRyZXNzSW5mby5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRXhjZWxBZGRyZXNzSW5mby5jcwpAQCAtMTMsODIgKzEzLDU5IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CisKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcwotewotICAgIHB1YmxpYyBjbGFzcyBFeGNlbEFkZHJlc3NJbmZvCi0gICAgewotICAgICAgICBwcml2YXRlIEV4Y2VsQWRkcmVzc0luZm8oc3RyaW5nIGFkZHJlc3MpIAotICAgICAgICB7ICAgCi0gICAgICAgICAgICB2YXIgYWRkcmVzc09uU2hlZXQgPSBhZGRyZXNzOwotICAgICAgICAgICAgV29ya3NoZWV0ID0gc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgaWYgKGFkZHJlc3MuQ29udGFpbnMoIiEiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgd29ya3NoZWV0QXJyID0gYWRkcmVzcy5TcGxpdCgnIScpOwotICAgICAgICAgICAgICAgIFdvcmtzaGVldCA9IHdvcmtzaGVldEFyclswXTsKLSAgICAgICAgICAgICAgICBhZGRyZXNzT25TaGVldCA9IHdvcmtzaGVldEFyclsxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhZGRyZXNzT25TaGVldC5Db250YWlucygiOiIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByYW5nZUFyciA9IGFkZHJlc3NPblNoZWV0LlNwbGl0KCc6Jyk7Ci0gICAgICAgICAgICAgICAgU3RhcnRDZWxsID0gcmFuZ2VBcnJbMF07Ci0gICAgICAgICAgICAgICAgRW5kQ2VsbCA9IHJhbmdlQXJyWzFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0YXJ0Q2VsbCA9IGFkZHJlc3NPblNoZWV0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQWRkcmVzc09uU2hlZXQgPSBhZGRyZXNzT25TaGVldDsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBFeGNlbEFkZHJlc3NJbmZvIFBhcnNlKHN0cmluZyBhZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQoYWRkcmVzcykuTmFtZWQoImFkZHJlc3MiKS5Jc05vdE51bGxPckVtcHR5KCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQWRkcmVzc0luZm8oYWRkcmVzcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RyaW5nIFdvcmtzaGVldCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KLQotICAgICAgICBwdWJsaWMgYm9vbCBXb3Jrc2hlZXRJc1NwZWNpZmllZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIXN0cmluZy5Jc051bGxPckVtcHR5KFdvcmtzaGVldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbCBJc011bHRpcGxlQ2VsbHMgCi0gICAgICAgIHsgCi0gICAgICAgICAgICBnZXQgCi0gICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgIHJldHVybiAhc3RyaW5nLklzTnVsbE9yRW1wdHkoRW5kQ2VsbCk7IAotICAgICAgICAgICAgfSAKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdHJpbmcgU3RhcnRDZWxsIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotCi0gICAgICAgIHB1YmxpYyBzdHJpbmcgRW5kQ2VsbCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KLQotICAgICAgICBwdWJsaWMgc3RyaW5nIEFkZHJlc3NPblNoZWV0IHsgZ2V0OyBwcml2YXRlIHNldDsgfQorcHVibGljIGNsYXNzIEV4Y2VsQWRkcmVzc0luZm8geworICBwcml2YXRlIEV4Y2VsQWRkcmVzc0luZm8oc3RyaW5nIGFkZHJlc3MpIHsKKyAgICB2YXIgYWRkcmVzc09uU2hlZXQgPSBhZGRyZXNzOworICAgIFdvcmtzaGVldCA9IHN0cmluZy5FbXB0eTsKKyAgICBpZiAoYWRkcmVzcy5Db250YWlucygiISIpKSB7CisgICAgICB2YXIgd29ya3NoZWV0QXJyID0gYWRkcmVzcy5TcGxpdCgnIScpOworICAgICAgV29ya3NoZWV0ID0gd29ya3NoZWV0QXJyWzBdOworICAgICAgYWRkcmVzc09uU2hlZXQgPSB3b3Jrc2hlZXRBcnJbMV07CiAgICAgfQorICAgIGlmIChhZGRyZXNzT25TaGVldC5Db250YWlucygiOiIpKSB7CisgICAgICB2YXIgcmFuZ2VBcnIgPSBhZGRyZXNzT25TaGVldC5TcGxpdCgnOicpOworICAgICAgU3RhcnRDZWxsID0gcmFuZ2VBcnJbMF07CisgICAgICBFbmRDZWxsID0gcmFuZ2VBcnJbMV07CisgICAgfSBlbHNlIHsKKyAgICAgIFN0YXJ0Q2VsbCA9IGFkZHJlc3NPblNoZWV0OworICAgIH0KKyAgICBBZGRyZXNzT25TaGVldCA9IGFkZHJlc3NPblNoZWV0OworICB9CisKKyAgcHVibGljIHN0YXRpYyBFeGNlbEFkZHJlc3NJbmZvIFBhcnNlKHN0cmluZyBhZGRyZXNzKSB7CisgICAgUmVxdWlyZS5UaGF0KGFkZHJlc3MpLk5hbWVkKCJhZGRyZXNzIikuSXNOb3ROdWxsT3JFbXB0eSgpOworICAgIHJldHVybiBuZXcoYWRkcmVzcyk7CisgIH0KKworICBwdWJsaWMgc3RyaW5nIFdvcmtzaGVldCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICBwdWJsaWMgYm9vbCBXb3Jrc2hlZXRJc1NwZWNpZmllZCA9PiAhc3RyaW5nLklzTnVsbE9yRW1wdHkoV29ya3NoZWV0KTsKKworICBwdWJsaWMgYm9vbCBJc011bHRpcGxlQ2VsbHMgPT4gIXN0cmluZy5Jc051bGxPckVtcHR5KEVuZENlbGwpOworCisgIHB1YmxpYyBzdHJpbmcgU3RhcnRDZWxsIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgIHB1YmxpYyBzdHJpbmcgRW5kQ2VsbCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICBwdWJsaWMgc3RyaW5nIEFkZHJlc3NPblNoZWV0IHsgZ2V0OyBwcml2YXRlIHNldDsgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4Y2VsQWRkcmVzc1V0aWwuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRXhjZWxBZGRyZXNzVXRpbC5jcwppbmRleCA3MWEzMDFmLi43NWFkNjY1IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRXhjZWxBZGRyZXNzVXRpbC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRXhjZWxBZGRyZXNzVXRpbC5jcwpAQCAtMTMsNTkgKzEzLDQ1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzCi17Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlbEFkZHJlc3NVdGlsCi0gICAgewotICAgICAgICBzdGF0aWMgY2hhcltdIFNoZWV0TmFtZUludmFsaWRDaGFycyA9IG5ldyBjaGFyW10geyAnPycsICc6JywgJyonLCAnLycsICdcXCcgfTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sIElzVmFsaWRBZGRyZXNzKHN0cmluZyB0b2tlbikKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGl4OwotICAgICAgICAgICAgaWYgKHRva2VuWzBdID09ICdcJycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXggPSB0b2tlbi5MYXN0SW5kZXhPZignXCcnKTsKLSAgICAgICAgICAgICAgICBpZiAoaXggPiAwICYmIGl4IDwgdG9rZW4uTGVuZ3RoIC0gMSAmJiB0b2tlbltpeCArIDFdID09ICchJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi5JbmRleE9mQW55KFNoZWV0TmFtZUludmFsaWRDaGFycywgMSwgaXggLSAxKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuLlN1YnN0cmluZyhpeCArIDIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoKGl4ID0gdG9rZW4uSW5kZXhPZignIScpKSA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHRva2VuLkluZGV4T2ZBbnkoU2hlZXROYW1lSW52YWxpZENoYXJzLCAwLCB0b2tlbi5JbmRleE9mKCchJykpID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5TdWJzdHJpbmcodG9rZW4uSW5kZXhPZignIScpICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT2ZmaWNlT3BlblhtbC5FeGNlbEFkZHJlc3MuSXNWYWxpZEFkZHJlc3ModG9rZW4pOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CisKK3B1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZWxBZGRyZXNzVXRpbCB7CisgIHByaXZhdGUgc3RhdGljIGNoYXJbXSBTaGVldE5hbWVJbnZhbGlkQ2hhcnMgPSB7ICc/JywgJzonLCAnKicsICcvJywgJ1xcJyB9OworCisgIHB1YmxpYyBzdGF0aWMgYm9vbCBJc1ZhbGlkQWRkcmVzcyhzdHJpbmcgdG9rZW4pIHsKKyAgICBpbnQgaXg7CisgICAgaWYgKHRva2VuWzBdID09ICdcJycpIHsKKyAgICAgIGl4ID0gdG9rZW4uTGFzdEluZGV4T2YoJ1wnJyk7CisgICAgICBpZiAoaXggPiAwICYmIGl4IDwgdG9rZW4uTGVuZ3RoIC0gMSAmJiB0b2tlbltpeCArIDFdID09ICchJykgeworICAgICAgICBpZiAodG9rZW4uSW5kZXhPZkFueShTaGVldE5hbWVJbnZhbGlkQ2hhcnMsIDEsIGl4IC0gMSkgPiAwKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CisgICAgICAgIHRva2VuID0gdG9rZW4uU3Vic3RyaW5nKGl4ICsgMik7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIGlmICgoaXggPSB0b2tlbi5JbmRleE9mKCchJykpID4gMSkgeworICAgICAgaWYgKHRva2VuLkluZGV4T2ZBbnkoU2hlZXROYW1lSW52YWxpZENoYXJzLCAwLCB0b2tlbi5JbmRleE9mKCchJykpID4gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICB0b2tlbiA9IHRva2VuLlN1YnN0cmluZyh0b2tlbi5JbmRleE9mKCchJykgKyAxKTsKICAgICB9CisgICAgcmV0dXJuIEV4Y2VsQ2VsbEJhc2UuSXNWYWxpZEFkZHJlc3ModG9rZW4pOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRXhjZWxSZWZlcmVuY2VUeXBlLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4Y2VsUmVmZXJlbmNlVHlwZS5jcwppbmRleCBlYjg3MjM2Li45NjUxYTM1IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRXhjZWxSZWZlcmVuY2VUeXBlLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9FeGNlbFJlZmVyZW5jZVR5cGUuY3MKQEAgLTEzLDMzICsxMywyNyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcwotewotICAgIHB1YmxpYyBlbnVtIEV4Y2VsUmVmZXJlbmNlVHlwZQotICAgIHsKLSAgICAgICAgQWJzb2x1dGVSb3dBbmRDb2x1bW4gPSAxLAotICAgICAgICBBYnNvbHV0ZVJvd1JlbGF0aXZlQ29sdW1uID0gMiwKLSAgICAgICAgUmVsYXRpdmVSb3dBYnNvbHV0Q29sdW1uID0gMywKLSAgICAgICAgUmVsYXRpdmVSb3dBbmRDb2x1bW4gPSA0Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CisKK3B1YmxpYyBlbnVtIEV4Y2VsUmVmZXJlbmNlVHlwZSB7CisgIEFic29sdXRlUm93QW5kQ29sdW1uID0gMSwKKyAgQWJzb2x1dGVSb3dSZWxhdGl2ZUNvbHVtbiA9IDIsCisgIFJlbGF0aXZlUm93QWJzb2x1dENvbHVtbiA9IDMsCisgIFJlbGF0aXZlUm93QW5kQ29sdW1uID0gNCwKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9FeHByZXNzaW9uRXZhbHVhdG9yLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4cHJlc3Npb25FdmFsdWF0b3IuY3MKaW5kZXggOTJkMmU2MS4uNTNjZjI4OCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4cHJlc3Npb25FdmFsdWF0b3IuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0V4cHJlc3Npb25FdmFsdWF0b3IuY3MKQEAgLTEzLDEzMyArMTMsMTE2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuT3BlcmF0b3JzOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcwotewotICAgIHB1YmxpYyBjbGFzcyBFeHByZXNzaW9uRXZhbHVhdG9yCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFdpbGRDYXJkVmFsdWVNYXRjaGVyIF93aWxkQ2FyZFZhbHVlTWF0Y2hlcjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBDb21waWxlUmVzdWx0RmFjdG9yeSBfY29tcGlsZVJlc3VsdEZhY3Rvcnk7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKIAotICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbkV2YWx1YXRvcigpCi0gICAgICAgICAgICA6IHRoaXMobmV3IFdpbGRDYXJkVmFsdWVNYXRjaGVyKCksIG5ldyBDb21waWxlUmVzdWx0RmFjdG9yeSgpKQotICAgICAgICB7CitwdWJsaWMgY2xhc3MgRXhwcmVzc2lvbkV2YWx1YXRvciB7CisgIHByaXZhdGUgcmVhZG9ubHkgV2lsZENhcmRWYWx1ZU1hdGNoZXIgX3dpbGRDYXJkVmFsdWVNYXRjaGVyOworICBwcml2YXRlIHJlYWRvbmx5IENvbXBpbGVSZXN1bHRGYWN0b3J5IF9jb21waWxlUmVzdWx0RmFjdG9yeTsKIAotICAgICAgICB9CisgIHB1YmxpYyBFeHByZXNzaW9uRXZhbHVhdG9yKCkKKyAgICAgIDogdGhpcyhuZXcoKSwgbmV3KCkpIHt9CiAKLSAgICAgICAgcHVibGljIEV4cHJlc3Npb25FdmFsdWF0b3IoV2lsZENhcmRWYWx1ZU1hdGNoZXIgd2lsZENhcmRWYWx1ZU1hdGNoZXIsIENvbXBpbGVSZXN1bHRGYWN0b3J5IGNvbXBpbGVSZXN1bHRGYWN0b3J5KQotICAgICAgICB7Ci0gICAgICAgICAgICBfd2lsZENhcmRWYWx1ZU1hdGNoZXIgPSB3aWxkQ2FyZFZhbHVlTWF0Y2hlcjsKLSAgICAgICAgICAgIF9jb21waWxlUmVzdWx0RmFjdG9yeSA9IGNvbXBpbGVSZXN1bHRGYWN0b3J5OwotICAgICAgICB9CisgIHB1YmxpYyBFeHByZXNzaW9uRXZhbHVhdG9yKAorICAgICAgV2lsZENhcmRWYWx1ZU1hdGNoZXIgd2lsZENhcmRWYWx1ZU1hdGNoZXIsCisgICAgICBDb21waWxlUmVzdWx0RmFjdG9yeSBjb21waWxlUmVzdWx0RmFjdG9yeSkgeworICAgIF93aWxkQ2FyZFZhbHVlTWF0Y2hlciA9IHdpbGRDYXJkVmFsdWVNYXRjaGVyOworICAgIF9jb21waWxlUmVzdWx0RmFjdG9yeSA9IGNvbXBpbGVSZXN1bHRGYWN0b3J5OworICB9CiAKLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0Tm9uQWxwaGFudW1lcmljU3RhcnRDaGFycyhzdHJpbmcgZXhwcmVzc2lvbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShleHByZXNzaW9uKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoUmVnZXguSXNNYXRjaChleHByZXNzaW9uLCBAIl4oW15hLXpBLVowLTldezJ9KSIpKSByZXR1cm4gZXhwcmVzc2lvbi5TdWJzdHJpbmcoMCwgMik7Ci0gICAgICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goZXhwcmVzc2lvbiwgQCJeKFteYS16QS1aMC05XXsxfSkiKSkgcmV0dXJuIGV4cHJlc3Npb24uU3Vic3RyaW5nKDAsIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2wgRXZhbHVhdGVPcGVyYXRvcihvYmplY3QgbGVmdCwgb2JqZWN0IHJpZ2h0LCBJT3BlcmF0b3Igb3ApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBsZWZ0UmVzdWx0ID0gX2NvbXBpbGVSZXN1bHRGYWN0b3J5LkNyZWF0ZShsZWZ0KTsKLSAgICAgICAgICAgIHZhciByaWdodFJlc3VsdCA9IF9jb21waWxlUmVzdWx0RmFjdG9yeS5DcmVhdGUocmlnaHQpOwotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9wLkFwcGx5KGxlZnRSZXN1bHQsIHJpZ2h0UmVzdWx0KTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQuRGF0YVR5cGUgIT0gRGF0YVR5cGUuQm9vbGVhbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgb3BlcmF0b3IgaW4gZXhwcmVzc2lvbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChib29sKXJlc3VsdC5SZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbCBUcnlDb252ZXJ0VG9Eb3VibGUob2JqZWN0IG9wLCBvdXQgZG91YmxlIGQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvcCBpcyBkb3VibGUgfHwgb3AgaXMgaW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGQgPSBDb252ZXJ0LlRvRG91YmxlKG9wKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG9wIGlzIERhdGVUaW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGQgPSAoKERhdGVUaW1lKSBvcCkuVG9PQURhdGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKG9wICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZShvcC5Ub1N0cmluZygpLCBvdXQgZCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkID0gMDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIEV2YWx1YXRlKG9iamVjdCBsZWZ0LCBzdHJpbmcgZXhwcmVzc2lvbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gc3RyaW5nLkVtcHR5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0ID09IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgb3BlcmF0b3JDYW5kaWRhdGUgPSBHZXROb25BbHBoYW51bWVyaWNTdGFydENoYXJzKGV4cHJlc3Npb24pOwotICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShvcGVyYXRvckNhbmRpZGF0ZSkgJiYgb3BlcmF0b3JDYW5kaWRhdGUgIT0gIi0iKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElPcGVyYXRvciBvcDsKLSAgICAgICAgICAgICAgICBpZiAoT3BlcmF0b3JzRGljdC5JbnN0YW5jZS5UcnlHZXRWYWx1ZShvcGVyYXRvckNhbmRpZGF0ZSwgb3V0IG9wKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciByaWdodCA9IGV4cHJlc3Npb24uUmVwbGFjZShvcGVyYXRvckNhbmRpZGF0ZSwgc3RyaW5nLkVtcHR5KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBzdHJpbmcuRW1wdHkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcC5PcGVyYXRvciA9PSBPcGVyYXRvcnMuRXF1YWxzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0ID09IG51bGwgXiByaWdodCA9PSBzdHJpbmcuRW1wdHkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcC5PcGVyYXRvciA9PSBPcGVyYXRvcnMuTm90RXF1YWxUbzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkb3VibGUgbGVmdE51bSwgcmlnaHROdW07Ci0gICAgICAgICAgICAgICAgICAgIERhdGVUaW1lIGRhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2wgbGVmdElzTnVtZXJpYyA9IFRyeUNvbnZlcnRUb0RvdWJsZShsZWZ0LCBvdXQgbGVmdE51bSk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2wgcmlnaHRJc051bWVyaWMgPSBkb3VibGUuVHJ5UGFyc2UocmlnaHQsIG91dCByaWdodE51bSk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2wgcmlnaHRJc0RhdGUgPSBEYXRlVGltZS5UcnlQYXJzZShyaWdodCwgb3V0IGRhdGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobGVmdElzTnVtZXJpYyAmJiByaWdodElzTnVtZXJpYykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFdmFsdWF0ZU9wZXJhdG9yKGxlZnROdW0sIHJpZ2h0TnVtLCBvcCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnRJc051bWVyaWMgJiYgcmlnaHRJc0RhdGUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFdmFsdWF0ZU9wZXJhdG9yKGxlZnROdW0sIGRhdGUuVG9PQURhdGUoKSwgb3ApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0SXNOdW1lcmljICE9IHJpZ2h0SXNOdW1lcmljKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3AuT3BlcmF0b3IgPT0gT3BlcmF0b3JzLk5vdEVxdWFsVG87Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV2YWx1YXRlT3BlcmF0b3IobGVmdCwgcmlnaHQsIG9wKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX3dpbGRDYXJkVmFsdWVNYXRjaGVyLklzTWF0Y2goZXhwcmVzc2lvbiwgbGVmdCkgPT0gMDsKLSAgICAgICAgfQorICBwcml2YXRlIHN0cmluZyBHZXROb25BbHBoYW51bWVyaWNTdGFydENoYXJzKHN0cmluZyBleHByZXNzaW9uKSB7CisgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShleHByZXNzaW9uKSkgeworICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goZXhwcmVzc2lvbiwgIl4oW15hLXpBLVowLTldezJ9KSIpKSB7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uLlN1YnN0cmluZygwLCAyKTsKKyAgICAgIH0KKyAgICAgIGlmIChSZWdleC5Jc01hdGNoKGV4cHJlc3Npb24sICJeKFteYS16QS1aMC05XXsxfSkiKSkgeworICAgICAgICByZXR1cm4gZXhwcmVzc2lvbi5TdWJzdHJpbmcoMCwgMSk7CisgICAgICB9CiAgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHJpdmF0ZSBib29sIEV2YWx1YXRlT3BlcmF0b3Iob2JqZWN0IGxlZnQsIG9iamVjdCByaWdodCwgSU9wZXJhdG9yIG9wKSB7CisgICAgdmFyIGxlZnRSZXN1bHQgPSBfY29tcGlsZVJlc3VsdEZhY3RvcnkuQ3JlYXRlKGxlZnQpOworICAgIHZhciByaWdodFJlc3VsdCA9IF9jb21waWxlUmVzdWx0RmFjdG9yeS5DcmVhdGUocmlnaHQpOworICAgIHZhciByZXN1bHQgPSBvcC5BcHBseShsZWZ0UmVzdWx0LCByaWdodFJlc3VsdCk7CisgICAgaWYgKHJlc3VsdC5EYXRhVHlwZSAhPSBEYXRhVHlwZS5Cb29sZWFuKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgb3BlcmF0b3IgaW4gZXhwcmVzc2lvbiIpOworICAgIH0KKyAgICByZXR1cm4gKGJvb2wpcmVzdWx0LlJlc3VsdDsKKyAgfQorCisgIHB1YmxpYyBib29sIFRyeUNvbnZlcnRUb0RvdWJsZShvYmplY3Qgb3AsIG91dCBkb3VibGUgZCkgeworICAgIGlmIChvcCBpcyBkb3VibGUgfHwgb3AgaXMgaW50KSB7CisgICAgICBkID0gQ29udmVydC5Ub0RvdWJsZShvcCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG9wIGlzIERhdGVUaW1lKSB7CisgICAgICBkID0gKChEYXRlVGltZSlvcCkuVG9PQURhdGUoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAob3AgIT0gbnVsbCkgeworICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZShvcC5Ub1N0cmluZygpLCBvdXQgZCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIGQgPSAwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBib29sIEV2YWx1YXRlKG9iamVjdCBsZWZ0LCBzdHJpbmcgZXhwcmVzc2lvbikgeworICAgIGlmIChleHByZXNzaW9uID09IHN0cmluZy5FbXB0eSkgeworICAgICAgcmV0dXJuIGxlZnQgPT0gbnVsbDsKKyAgICB9CisgICAgdmFyIG9wZXJhdG9yQ2FuZGlkYXRlID0gR2V0Tm9uQWxwaGFudW1lcmljU3RhcnRDaGFycyhleHByZXNzaW9uKTsKKyAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KG9wZXJhdG9yQ2FuZGlkYXRlKSAmJiBvcGVyYXRvckNhbmRpZGF0ZSAhPSAiLSIpIHsKKyAgICAgIElPcGVyYXRvciBvcDsKKyAgICAgIGlmIChPcGVyYXRvcnNEaWN0Lkluc3RhbmNlLlRyeUdldFZhbHVlKG9wZXJhdG9yQ2FuZGlkYXRlLCBvdXQgb3ApKSB7CisgICAgICAgIHZhciByaWdodCA9IGV4cHJlc3Npb24uUmVwbGFjZShvcGVyYXRvckNhbmRpZGF0ZSwgc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCAmJiByaWdodCA9PSBzdHJpbmcuRW1wdHkpIHsKKyAgICAgICAgICByZXR1cm4gb3AuT3BlcmF0b3IgPT0gT3BlcmF0b3JzLkVxdWFsczsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVmdCA9PSBudWxsIF4gcmlnaHQgPT0gc3RyaW5nLkVtcHR5KSB7CisgICAgICAgICAgcmV0dXJuIG9wLk9wZXJhdG9yID09IE9wZXJhdG9ycy5Ob3RFcXVhbFRvOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBsZWZ0TnVtLAorICAgICAgICAgICAgcmlnaHROdW07CisgICAgICAgIERhdGVUaW1lIGRhdGU7CisgICAgICAgIGJvb2wgbGVmdElzTnVtZXJpYyA9IFRyeUNvbnZlcnRUb0RvdWJsZShsZWZ0LCBvdXQgbGVmdE51bSk7CisgICAgICAgIGJvb2wgcmlnaHRJc051bWVyaWMgPSBkb3VibGUuVHJ5UGFyc2UocmlnaHQsIG91dCByaWdodE51bSk7CisgICAgICAgIGJvb2wgcmlnaHRJc0RhdGUgPSBEYXRlVGltZS5UcnlQYXJzZShyaWdodCwgb3V0IGRhdGUpOworICAgICAgICBpZiAobGVmdElzTnVtZXJpYyAmJiByaWdodElzTnVtZXJpYykgeworICAgICAgICAgIHJldHVybiBFdmFsdWF0ZU9wZXJhdG9yKGxlZnROdW0sIHJpZ2h0TnVtLCBvcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlZnRJc051bWVyaWMgJiYgcmlnaHRJc0RhdGUpIHsKKyAgICAgICAgICByZXR1cm4gRXZhbHVhdGVPcGVyYXRvcihsZWZ0TnVtLCBkYXRlLlRvT0FEYXRlKCksIG9wKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVmdElzTnVtZXJpYyAhPSByaWdodElzTnVtZXJpYykgeworICAgICAgICAgIHJldHVybiBvcC5PcGVyYXRvciA9PSBPcGVyYXRvcnMuTm90RXF1YWxUbzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRXZhbHVhdGVPcGVyYXRvcihsZWZ0LCByaWdodCwgb3ApOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX3dpbGRDYXJkVmFsdWVNYXRjaGVyLklzTWF0Y2goZXhwcmVzc2lvbiwgbGVmdCkgPT0gMDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0Zvcm11bGFEZXBlbmRlbmNpZXMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRm9ybXVsYURlcGVuZGVuY2llcy5jcwppbmRleCAzMDI1YWE5Li5iNWJjMGNmIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRm9ybXVsYURlcGVuZGVuY2llcy5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRm9ybXVsYURlcGVuZGVuY2llcy5jcwpAQCAtMTMsNzAgKzEzLDU5IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXMKLXsKLSAgICBwdWJsaWMgY2xhc3MgRm9ybXVsYURlcGVuZGVuY2llcwotICAgIHsKLSAgICAgICAgcHVibGljIEZvcm11bGFEZXBlbmRlbmNpZXMoKQotICAgICAgICAgICAgOiB0aGlzKG5ldyBGb3JtdWxhRGVwZW5kZW5jeUZhY3RvcnkoKSkKLSAgICAgICAgeworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CiAKLSAgICAgICAgfQorcHVibGljIGNsYXNzIEZvcm11bGFEZXBlbmRlbmNpZXMgeworICBwdWJsaWMgRm9ybXVsYURlcGVuZGVuY2llcygpCisgICAgICA6IHRoaXMobmV3KCkpIHt9CiAKLSAgICAgICAgcHVibGljIEZvcm11bGFEZXBlbmRlbmNpZXMoRm9ybXVsYURlcGVuZGVuY3lGYWN0b3J5IGZvcm11bGFEZXBlbmRlbmN5RmFjdG9yeSkKLSAgICAgICAgewotICAgICAgICAgICAgX2Zvcm11bGFEZXBlbmRlbmN5RmFjdG9yeSA9IGZvcm11bGFEZXBlbmRlbmN5RmFjdG9yeTsKLSAgICAgICAgfQorICBwdWJsaWMgRm9ybXVsYURlcGVuZGVuY2llcyhGb3JtdWxhRGVwZW5kZW5jeUZhY3RvcnkgZm9ybXVsYURlcGVuZGVuY3lGYWN0b3J5KSB7CisgICAgX2Zvcm11bGFEZXBlbmRlbmN5RmFjdG9yeSA9IGZvcm11bGFEZXBlbmRlbmN5RmFjdG9yeTsKKyAgfQogCi0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRm9ybXVsYURlcGVuZGVuY3lGYWN0b3J5IF9mb3JtdWxhRGVwZW5kZW5jeUZhY3Rvcnk7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxzdHJpbmcsIEZvcm11bGFEZXBlbmRlbmN5PiBfZGVwZW5kZW5jaWVzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBGb3JtdWxhRGVwZW5kZW5jeT4oKTsKKyAgcHJpdmF0ZSByZWFkb25seSBGb3JtdWxhRGVwZW5kZW5jeUZhY3RvcnkgX2Zvcm11bGFEZXBlbmRlbmN5RmFjdG9yeTsKKyAgcHJpdmF0ZSByZWFkb25seSBEaWN0aW9uYXJ5PHN0cmluZywgRm9ybXVsYURlcGVuZGVuY3k+IF9kZXBlbmRlbmNpZXMgPSBuZXcoKTsKIAotICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8S2V5VmFsdWVQYWlyPHN0cmluZywgRm9ybXVsYURlcGVuZGVuY3k+PiBEZXBlbmRlbmNpZXMgeyBnZXQgeyByZXR1cm4gX2RlcGVuZGVuY2llczsgfSB9CisgIHB1YmxpYyBJRW51bWVyYWJsZTxLZXlWYWx1ZVBhaXI8c3RyaW5nLCBGb3JtdWxhRGVwZW5kZW5jeT4+IERlcGVuZGVuY2llcyA9PiBfZGVwZW5kZW5jaWVzOwogCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZEZvcm11bGFTY29wZShQYXJzaW5nU2NvcGUgcGFyc2luZ1Njb3BlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL3ZhciBkZXBlbmRlbmN5ID0gX2Zvcm11bGFEZXBlbmRlbmN5RmFjdG9yeS5DcmVhdGUocGFyc2luZ1Njb3BlKTsKLSAgICAgICAgICAgIC8vdmFyIGFkZHJlc3MgPSBwYXJzaW5nU2NvcGUuQWRkcmVzcy5Ub1N0cmluZygpOwotICAgICAgICAgICAgLy9pZiAoIV9kZXBlbmRlbmNpZXMuQ29udGFpbnNLZXkoYWRkcmVzcykpCi0gICAgICAgICAgICAvL3sKLSAgICAgICAgICAgIC8vICAgIF9kZXBlbmRlbmNpZXMuQWRkKGFkZHJlc3MsIGRlcGVuZGVuY3kpOwotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAvL2lmIChwYXJzaW5nU2NvcGUuUGFyZW50ICE9IG51bGwpCi0gICAgICAgICAgICAvL3sKLSAgICAgICAgICAgIC8vICAgIHZhciBwYXJlbnRBZGRyZXNzID0gcGFyc2luZ1Njb3BlLlBhcmVudC5BZGRyZXNzLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAvLyAgICBpZiAoX2RlcGVuZGVuY2llcy5Db250YWluc0tleShwYXJlbnRBZGRyZXNzKSkKLSAgICAgICAgICAgIC8vICAgIHsKLSAgICAgICAgICAgIC8vICAgICAgICB2YXIgcGFyZW50ID0gX2RlcGVuZGVuY2llc1twYXJlbnRBZGRyZXNzXTsKLSAgICAgICAgICAgIC8vICAgICAgICBwYXJlbnQuQWRkUmVmZXJlbmNlVG8ocGFyc2luZ1Njb3BlLkFkZHJlc3MpOwotICAgICAgICAgICAgLy8gICAgICAgIGRlcGVuZGVuY3kuQWRkUmVmZXJlbmNlRnJvbShwYXJlbnQuQWRkcmVzcyk7Ci0gICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgfQorICBwdWJsaWMgdm9pZCBBZGRGb3JtdWxhU2NvcGUoUGFyc2luZ1Njb3BlIHBhcnNpbmdTY29wZSkgeworICAgIC8vdmFyIGRlcGVuZGVuY3kgPSBfZm9ybXVsYURlcGVuZGVuY3lGYWN0b3J5LkNyZWF0ZShwYXJzaW5nU2NvcGUpOworICAgIC8vdmFyIGFkZHJlc3MgPSBwYXJzaW5nU2NvcGUuQWRkcmVzcy5Ub1N0cmluZygpOworICAgIC8vaWYgKCFfZGVwZW5kZW5jaWVzLkNvbnRhaW5zS2V5KGFkZHJlc3MpKQorICAgIC8veworICAgIC8vICAgIF9kZXBlbmRlbmNpZXMuQWRkKGFkZHJlc3MsIGRlcGVuZGVuY3kpOworICAgIC8vfQorICAgIC8vaWYgKHBhcnNpbmdTY29wZS5QYXJlbnQgIT0gbnVsbCkKKyAgICAvL3sKKyAgICAvLyAgICB2YXIgcGFyZW50QWRkcmVzcyA9IHBhcnNpbmdTY29wZS5QYXJlbnQuQWRkcmVzcy5Ub1N0cmluZygpOworICAgIC8vICAgIGlmIChfZGVwZW5kZW5jaWVzLkNvbnRhaW5zS2V5KHBhcmVudEFkZHJlc3MpKQorICAgIC8vICAgIHsKKyAgICAvLyAgICAgICAgdmFyIHBhcmVudCA9IF9kZXBlbmRlbmNpZXNbcGFyZW50QWRkcmVzc107CisgICAgLy8gICAgICAgIHBhcmVudC5BZGRSZWZlcmVuY2VUbyhwYXJzaW5nU2NvcGUuQWRkcmVzcyk7CisgICAgLy8gICAgICAgIGRlcGVuZGVuY3kuQWRkUmVmZXJlbmNlRnJvbShwYXJlbnQuQWRkcmVzcyk7CisgICAgLy8gICAgfQorICAgIC8vfQorICB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZGVwZW5kZW5jaWVzLkNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9CisgIHB1YmxpYyB2b2lkIENsZWFyKCkgeworICAgIF9kZXBlbmRlbmNpZXMuQ2xlYXIoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0Zvcm11bGFEZXBlbmRlbmN5LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0Zvcm11bGFEZXBlbmRlbmN5LmNzCmluZGV4IGRhNmZiOWQuLmMzMzcwMTkgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9Gb3JtdWxhRGVwZW5kZW5jeS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRm9ybXVsYURlcGVuZGVuY3kuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDYwICsxMyw1NSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzCi17Ci0gICAgcHVibGljIGNsYXNzIEZvcm11bGFEZXBlbmRlbmN5Ci0gICAgewotICAgICAgICBwdWJsaWMgRm9ybXVsYURlcGVuZGVuY3koUGFyc2luZ1Njb3BlIHNjb3BlKQotCSAgICB7ICAgCi0gICAgICAgICAgICBTY29wZUlkID0gc2NvcGUuU2NvcGVJZDsKLSAgICAgICAgICAgIEFkZHJlc3MgPSBzY29wZS5BZGRyZXNzOwotCSAgICB9Ci0gICAgICAgIHB1YmxpYyBHdWlkIFNjb3BlSWQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKIAotICAgICAgICBwdWJsaWMgUmFuZ2VBZGRyZXNzIEFkZHJlc3MgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CitwdWJsaWMgY2xhc3MgRm9ybXVsYURlcGVuZGVuY3kgeworICBwdWJsaWMgRm9ybXVsYURlcGVuZGVuY3koUGFyc2luZ1Njb3BlIHNjb3BlKSB7CisgICAgU2NvcGVJZCA9IHNjb3BlLlNjb3BlSWQ7CisgICAgQWRkcmVzcyA9IHNjb3BlLkFkZHJlc3M7CisgIH0KIAotICAgICAgICBwcml2YXRlIExpc3Q8UmFuZ2VBZGRyZXNzPiBfcmVmZXJlbmNlZEJ5ID0gbmV3IExpc3Q8UmFuZ2VBZGRyZXNzPigpOworICBwdWJsaWMgR3VpZCBTY29wZUlkIHsgZ2V0OyBwcml2YXRlIHNldDsgfQogCi0gICAgICAgIHByaXZhdGUgTGlzdDxSYW5nZUFkZHJlc3M+IF9yZWZlcmVuY2VzID0gbmV3IExpc3Q8UmFuZ2VBZGRyZXNzPigpOworICBwdWJsaWMgUmFuZ2VBZGRyZXNzIEFkZHJlc3MgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CiAKLSAgICAgICAgcHVibGljIHZpcnR1YWwgdm9pZCBBZGRSZWZlcmVuY2VGcm9tKFJhbmdlQWRkcmVzcyByYW5nZUFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChBZGRyZXNzLkNvbGxpZGVzV2l0aChyYW5nZUFkZHJlc3MpIHx8IF9yZWZlcmVuY2VzLkV4aXN0cyh4ID0+IHguQ29sbGlkZXNXaXRoKHJhbmdlQWRkcmVzcykpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBDaXJjdWxhclJlZmVyZW5jZUV4Y2VwdGlvbigiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGF0ICIgKyByYW5nZUFkZHJlc3MuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfcmVmZXJlbmNlZEJ5LkFkZChyYW5nZUFkZHJlc3MpOwotICAgICAgICB9CisgIHByaXZhdGUgTGlzdDxSYW5nZUFkZHJlc3M+IF9yZWZlcmVuY2VkQnkgPSBuZXcoKTsKIAotICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEFkZFJlZmVyZW5jZVRvKFJhbmdlQWRkcmVzcyByYW5nZUFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChBZGRyZXNzLkNvbGxpZGVzV2l0aChyYW5nZUFkZHJlc3MpIHx8IF9yZWZlcmVuY2VkQnkuRXhpc3RzKHggPT4geC5Db2xsaWRlc1dpdGgocmFuZ2VBZGRyZXNzKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgYXQgIiArIHJhbmdlQWRkcmVzcy5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9yZWZlcmVuY2VzLkFkZChyYW5nZUFkZHJlc3MpOwotICAgICAgICB9CisgIHByaXZhdGUgTGlzdDxSYW5nZUFkZHJlc3M+IF9yZWZlcmVuY2VzID0gbmV3KCk7CisKKyAgcHVibGljIHZpcnR1YWwgdm9pZCBBZGRSZWZlcmVuY2VGcm9tKFJhbmdlQWRkcmVzcyByYW5nZUFkZHJlc3MpIHsKKyAgICBpZiAoQWRkcmVzcy5Db2xsaWRlc1dpdGgocmFuZ2VBZGRyZXNzKQorICAgICAgICB8fCBfcmVmZXJlbmNlcy5FeGlzdHMoeCA9PiB4LkNvbGxpZGVzV2l0aChyYW5nZUFkZHJlc3MpKSkgeworICAgICAgdGhyb3cgbmV3IENpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uKCJDaXJjdWxhciByZWZlcmVuY2UgZGV0ZWN0ZWQgYXQgIiArIHJhbmdlQWRkcmVzcyk7CiAgICAgfQorICAgIF9yZWZlcmVuY2VkQnkuQWRkKHJhbmdlQWRkcmVzcyk7CisgIH0KKworICBwdWJsaWMgdmlydHVhbCB2b2lkIEFkZFJlZmVyZW5jZVRvKFJhbmdlQWRkcmVzcyByYW5nZUFkZHJlc3MpIHsKKyAgICBpZiAoQWRkcmVzcy5Db2xsaWRlc1dpdGgocmFuZ2VBZGRyZXNzKQorICAgICAgICB8fCBfcmVmZXJlbmNlZEJ5LkV4aXN0cyh4ID0+IHguQ29sbGlkZXNXaXRoKHJhbmdlQWRkcmVzcykpKSB7CisgICAgICB0aHJvdyBuZXcgQ2lyY3VsYXJSZWZlcmVuY2VFeGNlcHRpb24oIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCBhdCAiICsgcmFuZ2VBZGRyZXNzKTsKKyAgICB9CisgICAgX3JlZmVyZW5jZXMuQWRkKHJhbmdlQWRkcmVzcyk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9Gb3JtdWxhRGVwZW5kZW5jeUZhY3RvcnkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvRm9ybXVsYURlcGVuZGVuY3lGYWN0b3J5LmNzCmluZGV4IGE2ZTYyMDUuLjllYjFmNmQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9Gb3JtdWxhRGVwZW5kZW5jeUZhY3RvcnkuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0Zvcm11bGFEZXBlbmRlbmN5RmFjdG9yeS5jcwpAQCAtMTMsMzMgKzEzLDI2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzCi17Ci0gICAgcHVibGljIGNsYXNzIEZvcm11bGFEZXBlbmRlbmN5RmFjdG9yeQotICAgIHsKLSAgICAgICAgcHVibGljIHZpcnR1YWwgRm9ybXVsYURlcGVuZGVuY3kgQ3JlYXRlKFBhcnNpbmdTY29wZSBzY29wZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtdWxhRGVwZW5kZW5jeShzY29wZSk7Ci0gICAgICAgIH0KLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKKworcHVibGljIGNsYXNzIEZvcm11bGFEZXBlbmRlbmN5RmFjdG9yeSB7CisgIHB1YmxpYyB2aXJ0dWFsIEZvcm11bGFEZXBlbmRlbmN5IENyZWF0ZShQYXJzaW5nU2NvcGUgc2NvcGUpIHsKKyAgICByZXR1cm4gbmV3KHNjb3BlKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0luZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9JbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IuY3MKaW5kZXggZDFkZTc1NC4uMjM4NzQzYSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0luZGV4VG9BZGRyZXNzVHJhbnNsYXRvci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw5MCArMTMsNzQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7CisKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcwotewotICAgIHB1YmxpYyBjbGFzcyBJbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBJbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IoRXhjZWxEYXRhUHJvdmlkZXIgZXhjZWxEYXRhUHJvdmlkZXIpCi0gICAgICAgICAgICA6IHRoaXMoZXhjZWxEYXRhUHJvdmlkZXIsIEV4Y2VsUmVmZXJlbmNlVHlwZS5BYnNvbHV0ZVJvd0FuZENvbHVtbikKLSAgICAgICAgeworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CiAKLSAgICAgICAgfQorcHVibGljIGNsYXNzIEluZGV4VG9BZGRyZXNzVHJhbnNsYXRvciB7CisgIHB1YmxpYyBJbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IoRXhjZWxEYXRhUHJvdmlkZXIgZXhjZWxEYXRhUHJvdmlkZXIpCisgICAgICA6IHRoaXMoZXhjZWxEYXRhUHJvdmlkZXIsIEV4Y2VsUmVmZXJlbmNlVHlwZS5BYnNvbHV0ZVJvd0FuZENvbHVtbikge30KIAotICAgICAgICBwdWJsaWMgSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yKEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLCBFeGNlbFJlZmVyZW5jZVR5cGUgcmVmZXJlbmNlVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGV4Y2VsRGF0YVByb3ZpZGVyKS5OYW1lZCgiZXhjZWxEYXRhUHJvdmlkZXIiKS5Jc05vdE51bGwoKTsKLSAgICAgICAgICAgIF9leGNlbERhdGFQcm92aWRlciA9IGV4Y2VsRGF0YVByb3ZpZGVyOwotICAgICAgICAgICAgX2V4Y2VsUmVmZXJlbmNlVHlwZSA9IHJlZmVyZW5jZVR5cGU7Ci0gICAgICAgIH0KKyAgcHVibGljIEluZGV4VG9BZGRyZXNzVHJhbnNsYXRvcigKKyAgICAgIEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLAorICAgICAgRXhjZWxSZWZlcmVuY2VUeXBlIHJlZmVyZW5jZVR5cGUpIHsKKyAgICBSZXF1aXJlLlRoYXQoZXhjZWxEYXRhUHJvdmlkZXIpLk5hbWVkKCJleGNlbERhdGFQcm92aWRlciIpLklzTm90TnVsbCgpOworICAgIF9leGNlbERhdGFQcm92aWRlciA9IGV4Y2VsRGF0YVByb3ZpZGVyOworICAgIF9leGNlbFJlZmVyZW5jZVR5cGUgPSByZWZlcmVuY2VUeXBlOworICB9CiAKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFeGNlbERhdGFQcm92aWRlciBfZXhjZWxEYXRhUHJvdmlkZXI7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRXhjZWxSZWZlcmVuY2VUeXBlIF9leGNlbFJlZmVyZW5jZVR5cGU7CisgIHByaXZhdGUgcmVhZG9ubHkgRXhjZWxEYXRhUHJvdmlkZXIgX2V4Y2VsRGF0YVByb3ZpZGVyOworICBwcml2YXRlIHJlYWRvbmx5IEV4Y2VsUmVmZXJlbmNlVHlwZSBfZXhjZWxSZWZlcmVuY2VUeXBlOwogCi0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldENvbHVtbkxldHRlcihpbnQgaUNvbHVtbk51bWJlciwgYm9vbCBmaXhlZENvbCkKLSAgICAgICAgewotCi0gICAgICAgICAgICBpZiAoaUNvbHVtbk51bWJlciA8IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXhjZXB0aW9uKCJDb2x1bW4gbnVtYmVyIGlzIG91dCBvZiByYW5nZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAiI1JFRiEiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdHJpbmcgc0NvbCA9ICIiOwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzQ29sID0gKChjaGFyKSgnQScgKyAoKGlDb2x1bW5OdW1iZXIgLSAxKSAlIDI2KSkpICsgc0NvbDsKLSAgICAgICAgICAgICAgICBpQ29sdW1uTnVtYmVyID0gKGlDb2x1bW5OdW1iZXIgLSAoKGlDb2x1bW5OdW1iZXIgLSAxKSAlIDI2KSkgLyAyNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChpQ29sdW1uTnVtYmVyID4gMCk7Ci0gICAgICAgICAgICByZXR1cm4gZml4ZWRDb2wgPyAiJCIgKyBzQ29sIDogc0NvbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdHJpbmcgVG9BZGRyZXNzKGludCBjb2wsIGludCByb3cpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmaXhlZENvbCA9IF9leGNlbFJlZmVyZW5jZVR5cGUgPT0gRXhjZWxSZWZlcmVuY2VUeXBlLkFic29sdXRlUm93QW5kQ29sdW1uIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBfZXhjZWxSZWZlcmVuY2VUeXBlID09IEV4Y2VsUmVmZXJlbmNlVHlwZS5SZWxhdGl2ZVJvd0Fic29sdXRDb2x1bW47Ci0gICAgICAgICAgICB2YXIgY29sU3RyaW5nID0gR2V0Q29sdW1uTGV0dGVyKGNvbCwgZml4ZWRDb2wpOwotICAgICAgICAgICAgcmV0dXJuIGNvbFN0cmluZyArIEdldFJvd051bWJlcihyb3cpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgR2V0Um93TnVtYmVyKGludCByb3dObykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJldFZhbCA9IHJvd05vIDwgKF9leGNlbERhdGFQcm92aWRlci5FeGNlbE1heFJvd3MpID8gcm93Tm8uVG9TdHJpbmcoKSA6IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkocmV0VmFsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKF9leGNlbFJlZmVyZW5jZVR5cGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEV4Y2VsUmVmZXJlbmNlVHlwZS5BYnNvbHV0ZVJvd0FuZENvbHVtbjoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBFeGNlbFJlZmVyZW5jZVR5cGUuQWJzb2x1dGVSb3dSZWxhdGl2ZUNvbHVtbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiJCIgKyByZXRWYWw7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXRWYWw7Ci0gICAgICAgIH0KKyAgcHJvdGVjdGVkIGludGVybmFsIHN0YXRpYyBzdHJpbmcgR2V0Q29sdW1uTGV0dGVyKGludCBpQ29sdW1uTnVtYmVyLCBib29sIGZpeGVkQ29sKSB7CisgICAgaWYgKGlDb2x1bW5OdW1iZXIgPCAxKSB7CisgICAgICAvL3Rocm93IG5ldyBFeGNlcHRpb24oIkNvbHVtbiBudW1iZXIgaXMgb3V0IG9mIHJhbmdlIik7CisgICAgICByZXR1cm4gIiNSRUYhIjsKICAgICB9CisKKyAgICBzdHJpbmcgc0NvbCA9ICIiOworICAgIGRvIHsKKyAgICAgIHNDb2wgPSAoKGNoYXIpKCdBJyArICgoaUNvbHVtbk51bWJlciAtIDEpICUgMjYpKSkgKyBzQ29sOworICAgICAgaUNvbHVtbk51bWJlciA9IChpQ29sdW1uTnVtYmVyIC0gKChpQ29sdW1uTnVtYmVyIC0gMSkgJSAyNikpIC8gMjY7CisgICAgfSB3aGlsZSAoaUNvbHVtbk51bWJlciA+IDApOworICAgIHJldHVybiBmaXhlZENvbCA/ICIkIiArIHNDb2wgOiBzQ29sOworICB9CisKKyAgcHVibGljIHN0cmluZyBUb0FkZHJlc3MoaW50IGNvbCwgaW50IHJvdykgeworICAgIHZhciBmaXhlZENvbCA9CisgICAgICAgIF9leGNlbFJlZmVyZW5jZVR5cGUgPT0gRXhjZWxSZWZlcmVuY2VUeXBlLkFic29sdXRlUm93QW5kQ29sdW1uCisgICAgICAgICAgICB8fCBfZXhjZWxSZWZlcmVuY2VUeXBlID09IEV4Y2VsUmVmZXJlbmNlVHlwZS5SZWxhdGl2ZVJvd0Fic29sdXRDb2x1bW47CisgICAgdmFyIGNvbFN0cmluZyA9IEdldENvbHVtbkxldHRlcihjb2wsIGZpeGVkQ29sKTsKKyAgICByZXR1cm4gY29sU3RyaW5nICsgR2V0Um93TnVtYmVyKHJvdyk7CisgIH0KKworICBwcml2YXRlIHN0cmluZyBHZXRSb3dOdW1iZXIoaW50IHJvd05vKSB7CisgICAgdmFyIHJldFZhbCA9IHJvd05vIDwgKF9leGNlbERhdGFQcm92aWRlci5FeGNlbE1heFJvd3MpID8gcm93Tm8uVG9TdHJpbmcoKSA6IHN0cmluZy5FbXB0eTsKKyAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHJldFZhbCkpIHsKKyAgICAgIHN3aXRjaCAoX2V4Y2VsUmVmZXJlbmNlVHlwZSkgeworICAgICAgICBjYXNlIEV4Y2VsUmVmZXJlbmNlVHlwZS5BYnNvbHV0ZVJvd0FuZENvbHVtbjoKKyAgICAgICAgY2FzZSBFeGNlbFJlZmVyZW5jZVR5cGUuQWJzb2x1dGVSb3dSZWxhdGl2ZUNvbHVtbjoKKyAgICAgICAgICByZXR1cm4gIiQiICsgcmV0VmFsOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXRWYWw7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9Mb29rdXBWYWx1ZU1hdGNoZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvTG9va3VwVmFsdWVNYXRjaGVyLmNzCmluZGV4IDQxMjAwY2EuLmQyZTBmM2UgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9Mb29rdXBWYWx1ZU1hdGNoZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL0xvb2t1cFZhbHVlTWF0Y2hlci5jcwpAQCAtMSwxNSArMSw3IEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Civvu79uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXMKLXsKLSAgICBwdWJsaWMgY2xhc3MgTG9va3VwVmFsdWVNYXRjaGVyIDogVmFsdWVNYXRjaGVyCi0gICAgewotICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgaW50IENvbXBhcmVPYmplY3RUb1N0cmluZyhvYmplY3QgbzEsIHN0cmluZyBvMikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEluY29tcGF0aWJsZU9wZXJhbmRzOwotICAgICAgICB9Ci0gICAgfQorcHVibGljIGNsYXNzIExvb2t1cFZhbHVlTWF0Y2hlciA6IFZhbHVlTWF0Y2hlciB7CisgIHByb3RlY3RlZCBvdmVycmlkZSBpbnQgQ29tcGFyZU9iamVjdFRvU3RyaW5nKG9iamVjdCBvMSwgc3RyaW5nIG8yKSB7CisgICAgcmV0dXJuIEluY29tcGF0aWJsZU9wZXJhbmRzOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IuY3MKaW5kZXggYjVhMTA5NC4uMzFiNmYyYSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL051bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9OdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvci5jcwpAQCAtMTMsMTAxICsxMyw4NyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwogdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXMKLXsKLSAgICBwdWJsaWMgY2xhc3MgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgVmFsdWVNYXRjaGVyIF92YWx1ZU1hdGNoZXI7Ci0gICAgICAgIHByaXZhdGUgQ29tcGlsZVJlc3VsdEZhY3RvcnkgX2NvbXBpbGVSZXN1bHRGYWN0b3J5OworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CiAKLSAgICAgICAgcHVibGljIE51bWVyaWNFeHByZXNzaW9uRXZhbHVhdG9yKCkKLSAgICAgICAgICAgIDogdGhpcyhuZXcgVmFsdWVNYXRjaGVyKCksIG5ldyBDb21waWxlUmVzdWx0RmFjdG9yeSgpKQotICAgICAgICB7CitwdWJsaWMgY2xhc3MgTnVtZXJpY0V4cHJlc3Npb25FdmFsdWF0b3IgeworICBwcml2YXRlIFZhbHVlTWF0Y2hlciBfdmFsdWVNYXRjaGVyOworICBwcml2YXRlIENvbXBpbGVSZXN1bHRGYWN0b3J5IF9jb21waWxlUmVzdWx0RmFjdG9yeTsKIAotICAgICAgICB9CisgIHB1YmxpYyBOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvcigpCisgICAgICA6IHRoaXMobmV3KCksIG5ldygpKSB7fQogCi0gICAgICAgIHB1YmxpYyBOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvcihWYWx1ZU1hdGNoZXIgdmFsdWVNYXRjaGVyLCBDb21waWxlUmVzdWx0RmFjdG9yeSBjb21waWxlUmVzdWx0RmFjdG9yeSkKLSAgICAgICAgewotICAgICAgICAgICAgX3ZhbHVlTWF0Y2hlciA9IHZhbHVlTWF0Y2hlcjsKLSAgICAgICAgICAgIF9jb21waWxlUmVzdWx0RmFjdG9yeSA9IGNvbXBpbGVSZXN1bHRGYWN0b3J5OwotICAgICAgICB9CisgIHB1YmxpYyBOdW1lcmljRXhwcmVzc2lvbkV2YWx1YXRvcigKKyAgICAgIFZhbHVlTWF0Y2hlciB2YWx1ZU1hdGNoZXIsCisgICAgICBDb21waWxlUmVzdWx0RmFjdG9yeSBjb21waWxlUmVzdWx0RmFjdG9yeSkgeworICAgIF92YWx1ZU1hdGNoZXIgPSB2YWx1ZU1hdGNoZXI7CisgICAgX2NvbXBpbGVSZXN1bHRGYWN0b3J5ID0gY29tcGlsZVJlc3VsdEZhY3Rvcnk7CisgIH0KIAotICAgICAgICBwcml2YXRlIHN0cmluZyBHZXROb25OdW1lcmljU3RhcnRDaGFycyhzdHJpbmcgZXhwcmVzc2lvbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShleHByZXNzaW9uKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoUmVnZXguSXNNYXRjaChleHByZXNzaW9uLCBAIl4oW15cZF17Mn0pIikpIHJldHVybiBleHByZXNzaW9uLlN1YnN0cmluZygwLCAyKTsKLSAgICAgICAgICAgICAgICBpZiAoUmVnZXguSXNNYXRjaChleHByZXNzaW9uLCBAIl4oW15cZF17MX0pIikpIHJldHVybiBleHByZXNzaW9uLlN1YnN0cmluZygwLCAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGRvdWJsZT8gT3BlcmFuZEFzRG91YmxlKG9iamVjdCBvcCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG9wIGlzIGRvdWJsZSB8fCBvcCBpcyBpbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbnZlcnQuVG9Eb3VibGUob3ApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9wICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIG91dHB1dDsKLSAgICAgICAgICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKG9wLlRvU3RyaW5nKCksIG91dCBvdXRwdXQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIEV2YWx1YXRlKG9iamVjdCBsZWZ0LCBzdHJpbmcgZXhwcmVzc2lvbikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG9wZXJhdG9yQ2FuZGlkYXRlID0gR2V0Tm9uTnVtZXJpY1N0YXJ0Q2hhcnMoZXhwcmVzc2lvbik7Ci0gICAgICAgICAgICB2YXIgbGVmdE51bSA9IE9wZXJhbmRBc0RvdWJsZShsZWZ0KTsKLSAgICAgICAgICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkob3BlcmF0b3JDYW5kaWRhdGUpICYmIGxlZnROdW0gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJT3BlcmF0b3Igb3A7Ci0gICAgICAgICAgICAgICAgaWYgKE9wZXJhdG9yc0RpY3QuSW5zdGFuY2UuVHJ5R2V0VmFsdWUob3BlcmF0b3JDYW5kaWRhdGUsIG91dCBvcCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgbnVtZXJpY0NhbmRpZGF0ZSA9IGV4cHJlc3Npb24uUmVwbGFjZShvcGVyYXRvckNhbmRpZGF0ZSwgc3RyaW5nLkVtcHR5KTsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2UobnVtZXJpY0NhbmRpZGF0ZSwgb3V0IGQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGVmdFJlc3VsdCA9IF9jb21waWxlUmVzdWx0RmFjdG9yeS5DcmVhdGUobGVmdE51bSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmlnaHRSZXN1bHQgPSBfY29tcGlsZVJlc3VsdEZhY3RvcnkuQ3JlYXRlKGQpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9wLkFwcGx5KGxlZnRSZXN1bHQsIHJpZ2h0UmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuRGF0YVR5cGUgIT0gRGF0YVR5cGUuQm9vbGVhbikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgb3BlcmF0b3IgaW4gZXhwcmVzc2lvbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChib29sKXJlc3VsdC5SZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX3ZhbHVlTWF0Y2hlci5Jc01hdGNoKGxlZnQsIGV4cHJlc3Npb24pID09IDA7Ci0gICAgICAgIH0KKyAgcHJpdmF0ZSBzdHJpbmcgR2V0Tm9uTnVtZXJpY1N0YXJ0Q2hhcnMoc3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGV4cHJlc3Npb24pKSB7CisgICAgICBpZiAoUmVnZXguSXNNYXRjaChleHByZXNzaW9uLCBAIl4oW15cZF17Mn0pIikpIHsKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb24uU3Vic3RyaW5nKDAsIDIpOworICAgICAgfQorICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goZXhwcmVzc2lvbiwgQCJeKFteXGRdezF9KSIpKSB7CisgICAgICAgIHJldHVybiBleHByZXNzaW9uLlN1YnN0cmluZygwLCAxKTsKKyAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBwdWJsaWMgZG91YmxlPyBPcGVyYW5kQXNEb3VibGUob2JqZWN0IG9wKSB7CisgICAgaWYgKG9wIGlzIGRvdWJsZSB8fCBvcCBpcyBpbnQpIHsKKyAgICAgIHJldHVybiBDb252ZXJ0LlRvRG91YmxlKG9wKTsKKyAgICB9CisgICAgaWYgKG9wICE9IG51bGwpIHsKKyAgICAgIGRvdWJsZSBvdXRwdXQ7CisgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKG9wLlRvU3RyaW5nKCksIG91dCBvdXRwdXQpKSB7CisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHVibGljIGJvb2wgRXZhbHVhdGUob2JqZWN0IGxlZnQsIHN0cmluZyBleHByZXNzaW9uKSB7CisgICAgdmFyIG9wZXJhdG9yQ2FuZGlkYXRlID0gR2V0Tm9uTnVtZXJpY1N0YXJ0Q2hhcnMoZXhwcmVzc2lvbik7CisgICAgdmFyIGxlZnROdW0gPSBPcGVyYW5kQXNEb3VibGUobGVmdCk7CisgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShvcGVyYXRvckNhbmRpZGF0ZSkgJiYgbGVmdE51bSAhPSBudWxsKSB7CisgICAgICBJT3BlcmF0b3Igb3A7CisgICAgICBpZiAoT3BlcmF0b3JzRGljdC5JbnN0YW5jZS5UcnlHZXRWYWx1ZShvcGVyYXRvckNhbmRpZGF0ZSwgb3V0IG9wKSkgeworICAgICAgICB2YXIgbnVtZXJpY0NhbmRpZGF0ZSA9IGV4cHJlc3Npb24uUmVwbGFjZShvcGVyYXRvckNhbmRpZGF0ZSwgc3RyaW5nLkVtcHR5KTsKKyAgICAgICAgZG91YmxlIGQ7CisgICAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2UobnVtZXJpY0NhbmRpZGF0ZSwgb3V0IGQpKSB7CisgICAgICAgICAgdmFyIGxlZnRSZXN1bHQgPSBfY29tcGlsZVJlc3VsdEZhY3RvcnkuQ3JlYXRlKGxlZnROdW0pOworICAgICAgICAgIHZhciByaWdodFJlc3VsdCA9IF9jb21waWxlUmVzdWx0RmFjdG9yeS5DcmVhdGUoZCk7CisgICAgICAgICAgdmFyIHJlc3VsdCA9IG9wLkFwcGx5KGxlZnRSZXN1bHQsIHJpZ2h0UmVzdWx0KTsKKyAgICAgICAgICBpZiAocmVzdWx0LkRhdGFUeXBlICE9IERhdGFUeXBlLkJvb2xlYW4pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBvcGVyYXRvciBpbiBleHByZXNzaW9uIik7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiAoYm9vbClyZXN1bHQuUmVzdWx0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBfdmFsdWVNYXRjaGVyLklzTWF0Y2gobGVmdCwgZXhwcmVzc2lvbikgPT0gMDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1JhbmdlQWRkcmVzcy5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9SYW5nZUFkZHJlc3MuY3MKaW5kZXggMTE0ZTgwYS4uNWExOWZmOSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1JhbmdlQWRkcmVzcy5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvUmFuZ2VBZGRyZXNzLmNzCkBAIC0xMyw3NyArMTMsNjQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcwotewotICAgIHB1YmxpYyBjbGFzcyBSYW5nZUFkZHJlc3MKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBSYW5nZUFkZHJlc3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGRyZXNzID0gc3RyaW5nLkVtcHR5OwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKIAotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgQWRkcmVzcyB7IGdldDsgc2V0OyB9CitwdWJsaWMgY2xhc3MgUmFuZ2VBZGRyZXNzIHsKKyAgcHVibGljIFJhbmdlQWRkcmVzcygpIHsKKyAgICBBZGRyZXNzID0gc3RyaW5nLkVtcHR5OworICB9CiAKLSAgICAgICAgcHVibGljIHN0cmluZyBXb3Jrc2hlZXQgeyBnZXQ7IGludGVybmFsIHNldDsgfQorICBpbnRlcm5hbCBzdHJpbmcgQWRkcmVzcyB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgcHVibGljIGludCBGcm9tQ29sIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKyAgcHVibGljIHN0cmluZyBXb3Jrc2hlZXQgeyBnZXQ7IGludGVybmFsIHNldDsgfQogCi0gICAgICAgIHB1YmxpYyBpbnQgVG9Db2wgeyBnZXQ7IGludGVybmFsIHNldDsgfQorICBwdWJsaWMgaW50IEZyb21Db2wgeyBnZXQ7IGludGVybmFsIHNldDsgfQogCi0gICAgICAgIHB1YmxpYyBpbnQgRnJvbVJvdyB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisgIHB1YmxpYyBpbnQgVG9Db2wgeyBnZXQ7IGludGVybmFsIHNldDsgfQogCi0gICAgICAgIHB1YmxpYyBpbnQgVG9Sb3cgeyBnZXQ7IGludGVybmFsIHNldDsgfQorICBwdWJsaWMgaW50IEZyb21Sb3cgeyBnZXQ7IGludGVybmFsIHNldDsgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQWRkcmVzczsKLSAgICAgICAgfQorICBwdWJsaWMgaW50IFRvUm93IHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KIAotICAgICAgICBwcml2YXRlIHN0YXRpYyBSYW5nZUFkZHJlc3MgX2VtcHR5ID0gbmV3IFJhbmdlQWRkcmVzcygpOwotICAgICAgICBwdWJsaWMgc3RhdGljIFJhbmdlQWRkcmVzcyBFbXB0eQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX2VtcHR5OyB9Ci0gICAgICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKKyAgICByZXR1cm4gQWRkcmVzczsKKyAgfQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJhbmdlIGNvbGxpZGVzIChmdWxsIG9yIHBhcnRseSkgd2l0aCB0aGUgc3VwcGxpZWQgcmFuZ2UKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdGhlciI+VGhlIHJhbmdlIHRvIGNoZWNrPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIGJvb2wgQ29sbGlkZXNXaXRoKFJhbmdlQWRkcmVzcyBvdGhlcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG90aGVyLldvcmtzaGVldCAhPSBXb3Jrc2hlZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG90aGVyLkZyb21Sb3cgPiBUb1JvdyB8fCBvdGhlci5Gcm9tQ29sID4gVG9Db2wKLSAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgIEZyb21Sb3cgPiBvdGhlci5Ub1JvdyB8fCBGcm9tQ29sID4gb3RoZXIuVG9Db2wpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KKyAgcHJpdmF0ZSBzdGF0aWMgUmFuZ2VBZGRyZXNzIF9lbXB0eSA9IG5ldygpOworCisgIHB1YmxpYyBzdGF0aWMgUmFuZ2VBZGRyZXNzIEVtcHR5ID0+IF9lbXB0eTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyByYW5nZSBjb2xsaWRlcyAoZnVsbCBvciBwYXJ0bHkpIHdpdGggdGhlIHN1cHBsaWVkIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ib3RoZXIiPlRoZSByYW5nZSB0byBjaGVjazwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBib29sIENvbGxpZGVzV2l0aChSYW5nZUFkZHJlc3Mgb3RoZXIpIHsKKyAgICBpZiAob3RoZXIuV29ya3NoZWV0ICE9IFdvcmtzaGVldCkgeworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICBpZiAob3RoZXIuRnJvbVJvdyA+IFRvUm93CisgICAgICAgIHx8IG90aGVyLkZyb21Db2wgPiBUb0NvbAorICAgICAgICB8fCBGcm9tUm93ID4gb3RoZXIuVG9Sb3cKKyAgICAgICAgfHwgRnJvbUNvbCA+IG90aGVyLlRvQ29sKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvUmFuZ2VBZGRyZXNzRmFjdG9yeS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9SYW5nZUFkZHJlc3NGYWN0b3J5LmNzCmluZGV4IDJlOGI3MTAuLmEyYWUwNzUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9SYW5nZUFkZHJlc3NGYWN0b3J5LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9SYW5nZUFkZHJlc3NGYWN0b3J5LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxNTEgKzEzLDE0NCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKKwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzCi17Ci0gICAgcHVibGljIGNsYXNzIFJhbmdlQWRkcmVzc0ZhY3RvcnkKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRXhjZWxEYXRhUHJvdmlkZXIgX2V4Y2VsRGF0YVByb3ZpZGVyOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEFkZHJlc3NUcmFuc2xhdG9yIF9hZGRyZXNzVHJhbnNsYXRvcjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IgX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvcjsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwogCi0gICAgICAgIHB1YmxpYyBSYW5nZUFkZHJlc3NGYWN0b3J5KEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyKQotICAgICAgICAgICAgOiB0aGlzKGV4Y2VsRGF0YVByb3ZpZGVyLCBuZXcgQWRkcmVzc1RyYW5zbGF0b3IoZXhjZWxEYXRhUHJvdmlkZXIpLCBuZXcgSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yKGV4Y2VsRGF0YVByb3ZpZGVyLCBFeGNlbFJlZmVyZW5jZVR5cGUuUmVsYXRpdmVSb3dBbmRDb2x1bW4pKQotICAgICAgICB7Ci0gICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBSYW5nZUFkZHJlc3NGYWN0b3J5IHsKKyAgcHJpdmF0ZSByZWFkb25seSBFeGNlbERhdGFQcm92aWRlciBfZXhjZWxEYXRhUHJvdmlkZXI7CisgIHByaXZhdGUgcmVhZG9ubHkgQWRkcmVzc1RyYW5zbGF0b3IgX2FkZHJlc3NUcmFuc2xhdG9yOworICBwcml2YXRlIHJlYWRvbmx5IEluZGV4VG9BZGRyZXNzVHJhbnNsYXRvciBfaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yOwogCi0gICAgICAgIHB1YmxpYyBSYW5nZUFkZHJlc3NGYWN0b3J5KEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLCBBZGRyZXNzVHJhbnNsYXRvciBhZGRyZXNzVHJhbnNsYXRvciwgSW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yIGluZGV4VG9BZGRyZXNzVHJhbnNsYXRvcikKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGV4Y2VsRGF0YVByb3ZpZGVyKS5OYW1lZCgiZXhjZWxEYXRhUHJvdmlkZXIiKS5Jc05vdE51bGwoKTsKLSAgICAgICAgICAgIFJlcXVpcmUuVGhhdChhZGRyZXNzVHJhbnNsYXRvcikuTmFtZWQoImFkZHJlc3NUcmFuc2xhdG9yIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQoaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yKS5OYW1lZCgiaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIgPSBleGNlbERhdGFQcm92aWRlcjsKLSAgICAgICAgICAgIF9hZGRyZXNzVHJhbnNsYXRvciA9IGFkZHJlc3NUcmFuc2xhdG9yOwotICAgICAgICAgICAgX2luZGV4VG9BZGRyZXNzVHJhbnNsYXRvciA9IGluZGV4VG9BZGRyZXNzVHJhbnNsYXRvcjsKLSAgICAgICAgfQorICBwdWJsaWMgUmFuZ2VBZGRyZXNzRmFjdG9yeShFeGNlbERhdGFQcm92aWRlciBleGNlbERhdGFQcm92aWRlcikKKyAgICAgIDogdGhpcygKKyAgICAgICAgICBleGNlbERhdGFQcm92aWRlciwKKyAgICAgICAgICBuZXcoZXhjZWxEYXRhUHJvdmlkZXIpLAorICAgICAgICAgIG5ldyhleGNlbERhdGFQcm92aWRlciwgRXhjZWxSZWZlcmVuY2VUeXBlLlJlbGF0aXZlUm93QW5kQ29sdW1uKSkge30KIAotICAgICAgICBwdWJsaWMgUmFuZ2VBZGRyZXNzIENyZWF0ZShpbnQgY29sLCBpbnQgcm93KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ3JlYXRlKHN0cmluZy5FbXB0eSwgY29sLCByb3cpOwotICAgICAgICB9CisgIHB1YmxpYyBSYW5nZUFkZHJlc3NGYWN0b3J5KAorICAgICAgRXhjZWxEYXRhUHJvdmlkZXIgZXhjZWxEYXRhUHJvdmlkZXIsCisgICAgICBBZGRyZXNzVHJhbnNsYXRvciBhZGRyZXNzVHJhbnNsYXRvciwKKyAgICAgIEluZGV4VG9BZGRyZXNzVHJhbnNsYXRvciBpbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IpIHsKKyAgICBSZXF1aXJlLlRoYXQoZXhjZWxEYXRhUHJvdmlkZXIpLk5hbWVkKCJleGNlbERhdGFQcm92aWRlciIpLklzTm90TnVsbCgpOworICAgIFJlcXVpcmUuVGhhdChhZGRyZXNzVHJhbnNsYXRvcikuTmFtZWQoImFkZHJlc3NUcmFuc2xhdG9yIikuSXNOb3ROdWxsKCk7CisgICAgUmVxdWlyZS5UaGF0KGluZGV4VG9BZGRyZXNzVHJhbnNsYXRvcikuTmFtZWQoImluZGV4VG9BZGRyZXNzVHJhbnNsYXRvciIpLklzTm90TnVsbCgpOworICAgIF9leGNlbERhdGFQcm92aWRlciA9IGV4Y2VsRGF0YVByb3ZpZGVyOworICAgIF9hZGRyZXNzVHJhbnNsYXRvciA9IGFkZHJlc3NUcmFuc2xhdG9yOworICAgIF9pbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IgPSBpbmRleFRvQWRkcmVzc1RyYW5zbGF0b3I7CisgIH0KIAotICAgICAgICBwdWJsaWMgUmFuZ2VBZGRyZXNzIENyZWF0ZShzdHJpbmcgd29ya3NoZWV0TmFtZSwgaW50IGNvbCwgaW50IHJvdykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZUFkZHJlc3MoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFkZHJlc3MgPSBfaW5kZXhUb0FkZHJlc3NUcmFuc2xhdG9yLlRvQWRkcmVzcyhjb2wsIHJvdyksCi0gICAgICAgICAgICAgICAgV29ya3NoZWV0ID0gd29ya3NoZWV0TmFtZSwKLSAgICAgICAgICAgICAgICBGcm9tQ29sID0gY29sLAotICAgICAgICAgICAgICAgIFRvQ29sID0gY29sLAotICAgICAgICAgICAgICAgIEZyb21Sb3cgPSByb3csCi0gICAgICAgICAgICAgICAgVG9Sb3cgPSByb3cKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KKyAgcHVibGljIFJhbmdlQWRkcmVzcyBDcmVhdGUoaW50IGNvbCwgaW50IHJvdykgeworICAgIHJldHVybiBDcmVhdGUoc3RyaW5nLkVtcHR5LCBjb2wsIHJvdyk7CisgIH0KIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3b3Jrc2hlZXROYW1lIj53aWxsIGJlIHVzZWQgaWYgbm8gd29ya3NoZWV0IG5hbWUgaXMgc3BlY2lmaWVkIGluIDxwYXJhbXJlZiBuYW1lPSJhZGRyZXNzIi8+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5hZGRyZXNzIG9mIGEgcmFuZ2U8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgUmFuZ2VBZGRyZXNzIENyZWF0ZShzdHJpbmcgd29ya3NoZWV0TmFtZSwgc3RyaW5nIGFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlcXVpcmUuVGhhdChhZGRyZXNzKS5OYW1lZCgicmFuZ2UiKS5Jc05vdE51bGxPckVtcHR5KCk7Ci0gICAgICAgICAgICAvL3ZhciBhZGRyZXNzSW5mbyA9IEV4Y2VsQWRkcmVzc0luZm8uUGFyc2UoYWRkcmVzcyk7Ci0gICAgICAgICAgICB2YXIgYWRyID0gbmV3IEV4Y2VsQWRkcmVzc0Jhc2UoYWRkcmVzcyk7ICAKLSAgICAgICAgICAgIHZhciBzaGVldCA9IHN0cmluZy5Jc051bGxPckVtcHR5KGFkci5Xb3JrU2hlZXQpID8gd29ya3NoZWV0TmFtZSA6IGFkci5Xb3JrU2hlZXQ7Ci0gICAgICAgICAgICB2YXIgZGltID0gX2V4Y2VsRGF0YVByb3ZpZGVyLkdldERpbWVuc2lvbkVuZChhZHIuV29ya1NoZWV0KTsKLSAgICAgICAgICAgIHZhciByYW5nZUFkZHJlc3MgPSBuZXcgUmFuZ2VBZGRyZXNzKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBZGRyZXNzID0gYWRyLkFkZHJlc3MsCi0gICAgICAgICAgICAgICAgV29ya3NoZWV0ID0gc2hlZXQsCi0gICAgICAgICAgICAgICAgRnJvbVJvdyA9IGFkci5fZnJvbVJvdywKLSAgICAgICAgICAgICAgICBGcm9tQ29sID0gYWRyLl9mcm9tQ29sLAotICAgICAgICAgICAgICAgIFRvUm93ID0gKGRpbSAhPSBudWxsICYmIGFkci5fdG9Sb3cgPiBkaW0uUm93KSA/IGRpbS5Sb3cgOiBhZHIuX3RvUm93LAotICAgICAgICAgICAgICAgIFRvQ29sID0gYWRyLl90b0NvbAotICAgICAgICAgICAgfTsKKyAgcHVibGljIFJhbmdlQWRkcmVzcyBDcmVhdGUoc3RyaW5nIHdvcmtzaGVldE5hbWUsIGludCBjb2wsIGludCByb3cpIHsKKyAgICByZXR1cm4gbmV3KCkgeworICAgICAgQWRkcmVzcyA9IF9pbmRleFRvQWRkcmVzc1RyYW5zbGF0b3IuVG9BZGRyZXNzKGNvbCwgcm93KSwKKyAgICAgIFdvcmtzaGVldCA9IHdvcmtzaGVldE5hbWUsCisgICAgICBGcm9tQ29sID0gY29sLAorICAgICAgVG9Db2wgPSBjb2wsCisgICAgICBGcm9tUm93ID0gcm93LAorICAgICAgVG9Sb3cgPSByb3csCisgICAgfTsKKyAgfQogCi0gICAgICAgICAgICAvL2lmIChhZGRyZXNzSW5mby5Jc011bHRpcGxlQ2VsbHMpCi0gICAgICAgICAgICAvL3sKLSAgICAgICAgICAgIC8vICAgIEhhbmRsZU11bHRpcGxlQ2VsbEFkZHJlc3MocmFuZ2VBZGRyZXNzLCBhZGRyZXNzSW5mbyk7Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgICAgIC8vZWxzZQotICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAvLyAgICBIYW5kbGVTaW5nbGVDZWxsQWRkcmVzcyhyYW5nZUFkZHJlc3MsIGFkZHJlc3NJbmZvKTsKLSAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgcmV0dXJuIHJhbmdlQWRkcmVzczsKLSAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9IndvcmtzaGVldE5hbWUiPndpbGwgYmUgdXNlZCBpZiBubyB3b3Jrc2hlZXQgbmFtZSBpcyBzcGVjaWZpZWQgaW4gPHBhcmFtcmVmIG5hbWU9ImFkZHJlc3MiLz48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPmFkZHJlc3Mgb2YgYSByYW5nZTwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBSYW5nZUFkZHJlc3MgQ3JlYXRlKHN0cmluZyB3b3Jrc2hlZXROYW1lLCBzdHJpbmcgYWRkcmVzcykgeworICAgIFJlcXVpcmUuVGhhdChhZGRyZXNzKS5OYW1lZCgicmFuZ2UiKS5Jc05vdE51bGxPckVtcHR5KCk7CisgICAgLy92YXIgYWRkcmVzc0luZm8gPSBFeGNlbEFkZHJlc3NJbmZvLlBhcnNlKGFkZHJlc3MpOworICAgIHZhciBhZHIgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZShhZGRyZXNzKTsKKyAgICB2YXIgc2hlZXQgPSBzdHJpbmcuSXNOdWxsT3JFbXB0eShhZHIuV29ya1NoZWV0KSA/IHdvcmtzaGVldE5hbWUgOiBhZHIuV29ya1NoZWV0OworICAgIHZhciBkaW0gPSBfZXhjZWxEYXRhUHJvdmlkZXIuR2V0RGltZW5zaW9uRW5kKGFkci5Xb3JrU2hlZXQpOworICAgIHZhciByYW5nZUFkZHJlc3MgPSBuZXcgUmFuZ2VBZGRyZXNzIHsKKyAgICAgIEFkZHJlc3MgPSBhZHIuQWRkcmVzcywKKyAgICAgIFdvcmtzaGVldCA9IHNoZWV0LAorICAgICAgRnJvbVJvdyA9IGFkci5fZnJvbVJvdywKKyAgICAgIEZyb21Db2wgPSBhZHIuX2Zyb21Db2wsCisgICAgICBUb1JvdyA9IChkaW0gIT0gbnVsbCAmJiBhZHIuX3RvUm93ID4gZGltLlJvdykgPyBkaW0uUm93IDogYWRyLl90b1JvdywKKyAgICAgIFRvQ29sID0gYWRyLl90b0NvbCwKKyAgICB9OwogCi0gICAgICAgIHB1YmxpYyBSYW5nZUFkZHJlc3MgQ3JlYXRlKHN0cmluZyByYW5nZSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWlyZS5UaGF0KHJhbmdlKS5OYW1lZCgicmFuZ2UiKS5Jc05vdE51bGxPckVtcHR5KCk7Ci0gICAgICAgICAgICAvL3ZhciBhZGRyZXNzSW5mbyA9IEV4Y2VsQWRkcmVzc0luZm8uUGFyc2UocmFuZ2UpOwotICAgICAgICAgICAgdmFyIGFkciA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKHJhbmdlKTsKLSAgICAgICAgICAgIHZhciByYW5nZUFkZHJlc3MgPSBuZXcgUmFuZ2VBZGRyZXNzKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBZGRyZXNzID0gYWRyLkFkZHJlc3MsCi0gICAgICAgICAgICAgICAgV29ya3NoZWV0ID0gYWRyLldvcmtTaGVldCA/PyAiIiwKLSAgICAgICAgICAgICAgICBGcm9tUm93ID0gYWRyLl9mcm9tUm93LAotICAgICAgICAgICAgICAgIEZyb21Db2wgPSBhZHIuX2Zyb21Db2wsCi0gICAgICAgICAgICAgICAgVG9Sb3cgPSBhZHIuX3RvUm93LAotICAgICAgICAgICAgICAgIFRvQ29sID0gYWRyLl90b0NvbAotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgCi0gICAgICAgICAgICAvL2lmIChhZGRyZXNzSW5mby5Jc011bHRpcGxlQ2VsbHMpCi0gICAgICAgICAgICAvL3sKLSAgICAgICAgICAgIC8vICAgIEhhbmRsZU11bHRpcGxlQ2VsbEFkZHJlc3MocmFuZ2VBZGRyZXNzLCBhZGRyZXNzSW5mbyk7Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgICAgIC8vZWxzZQotICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAvLyAgICBIYW5kbGVTaW5nbGVDZWxsQWRkcmVzcyhyYW5nZUFkZHJlc3MsIGFkZHJlc3NJbmZvKTsKLSAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgcmV0dXJuIHJhbmdlQWRkcmVzczsKLSAgICAgICAgfQorICAgIC8vaWYgKGFkZHJlc3NJbmZvLklzTXVsdGlwbGVDZWxscykKKyAgICAvL3sKKyAgICAvLyAgICBIYW5kbGVNdWx0aXBsZUNlbGxBZGRyZXNzKHJhbmdlQWRkcmVzcywgYWRkcmVzc0luZm8pOworICAgIC8vfQorICAgIC8vZWxzZQorICAgIC8veworICAgIC8vICAgIEhhbmRsZVNpbmdsZUNlbGxBZGRyZXNzKHJhbmdlQWRkcmVzcywgYWRkcmVzc0luZm8pOworICAgIC8vfQorICAgIHJldHVybiByYW5nZUFkZHJlc3M7CisgIH0KIAotICAgICAgICBwcml2YXRlIHZvaWQgSGFuZGxlU2luZ2xlQ2VsbEFkZHJlc3MoUmFuZ2VBZGRyZXNzIHJhbmdlQWRkcmVzcywgRXhjZWxBZGRyZXNzSW5mbyBhZGRyZXNzSW5mbykKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGNvbCwgcm93OwotICAgICAgICAgICAgX2FkZHJlc3NUcmFuc2xhdG9yLlRvQ29sQW5kUm93KGFkZHJlc3NJbmZvLlN0YXJ0Q2VsbCwgb3V0IGNvbCwgb3V0IHJvdyk7Ci0gICAgICAgICAgICByYW5nZUFkZHJlc3MuRnJvbUNvbCA9IGNvbDsKLSAgICAgICAgICAgIHJhbmdlQWRkcmVzcy5Ub0NvbCA9IGNvbDsKLSAgICAgICAgICAgIHJhbmdlQWRkcmVzcy5Gcm9tUm93ID0gcm93OwotICAgICAgICAgICAgcmFuZ2VBZGRyZXNzLlRvUm93ID0gcm93OwotICAgICAgICB9CisgIHB1YmxpYyBSYW5nZUFkZHJlc3MgQ3JlYXRlKHN0cmluZyByYW5nZSkgeworICAgIFJlcXVpcmUuVGhhdChyYW5nZSkuTmFtZWQoInJhbmdlIikuSXNOb3ROdWxsT3JFbXB0eSgpOworICAgIC8vdmFyIGFkZHJlc3NJbmZvID0gRXhjZWxBZGRyZXNzSW5mby5QYXJzZShyYW5nZSk7CisgICAgdmFyIGFkciA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKHJhbmdlKTsKKyAgICB2YXIgcmFuZ2VBZGRyZXNzID0gbmV3IFJhbmdlQWRkcmVzcyB7CisgICAgICBBZGRyZXNzID0gYWRyLkFkZHJlc3MsCisgICAgICBXb3Jrc2hlZXQgPSBhZHIuV29ya1NoZWV0ID8/ICIiLAorICAgICAgRnJvbVJvdyA9IGFkci5fZnJvbVJvdywKKyAgICAgIEZyb21Db2wgPSBhZHIuX2Zyb21Db2wsCisgICAgICBUb1JvdyA9IGFkci5fdG9Sb3csCisgICAgICBUb0NvbCA9IGFkci5fdG9Db2wsCisgICAgfTsKIAotICAgICAgICBwcml2YXRlIHZvaWQgSGFuZGxlTXVsdGlwbGVDZWxsQWRkcmVzcyhSYW5nZUFkZHJlc3MgcmFuZ2VBZGRyZXNzLCBFeGNlbEFkZHJlc3NJbmZvIGFkZHJlc3NJbmZvKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgZnJvbUNvbCwgZnJvbVJvdzsKLSAgICAgICAgICAgIF9hZGRyZXNzVHJhbnNsYXRvci5Ub0NvbEFuZFJvdyhhZGRyZXNzSW5mby5TdGFydENlbGwsIG91dCBmcm9tQ29sLCBvdXQgZnJvbVJvdyk7Ci0gICAgICAgICAgICBpbnQgdG9Db2wsIHRvUm93OwotICAgICAgICAgICAgX2FkZHJlc3NUcmFuc2xhdG9yLlRvQ29sQW5kUm93KGFkZHJlc3NJbmZvLkVuZENlbGwsIG91dCB0b0NvbCwgb3V0IHRvUm93LCBBZGRyZXNzVHJhbnNsYXRvci5SYW5nZUNhbGN1bGF0aW9uQmVoYXZpb3VyLkxhc3RQYXJ0KTsKLSAgICAgICAgICAgIHJhbmdlQWRkcmVzcy5Gcm9tQ29sID0gZnJvbUNvbDsKLSAgICAgICAgICAgIHJhbmdlQWRkcmVzcy5Ub0NvbCA9IHRvQ29sOwotICAgICAgICAgICAgcmFuZ2VBZGRyZXNzLkZyb21Sb3cgPSBmcm9tUm93OwotICAgICAgICAgICAgcmFuZ2VBZGRyZXNzLlRvUm93ID0gdG9Sb3c7Ci0gICAgICAgIH0KLSAgICB9CisgICAgLy9pZiAoYWRkcmVzc0luZm8uSXNNdWx0aXBsZUNlbGxzKQorICAgIC8veworICAgIC8vICAgIEhhbmRsZU11bHRpcGxlQ2VsbEFkZHJlc3MocmFuZ2VBZGRyZXNzLCBhZGRyZXNzSW5mbyk7CisgICAgLy99CisgICAgLy9lbHNlCisgICAgLy97CisgICAgLy8gICAgSGFuZGxlU2luZ2xlQ2VsbEFkZHJlc3MocmFuZ2VBZGRyZXNzLCBhZGRyZXNzSW5mbyk7CisgICAgLy99CisgICAgcmV0dXJuIHJhbmdlQWRkcmVzczsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBIYW5kbGVTaW5nbGVDZWxsQWRkcmVzcyhSYW5nZUFkZHJlc3MgcmFuZ2VBZGRyZXNzLCBFeGNlbEFkZHJlc3NJbmZvIGFkZHJlc3NJbmZvKSB7CisgICAgaW50IGNvbCwKKyAgICAgICAgcm93OworICAgIF9hZGRyZXNzVHJhbnNsYXRvci5Ub0NvbEFuZFJvdyhhZGRyZXNzSW5mby5TdGFydENlbGwsIG91dCBjb2wsIG91dCByb3cpOworICAgIHJhbmdlQWRkcmVzcy5Gcm9tQ29sID0gY29sOworICAgIHJhbmdlQWRkcmVzcy5Ub0NvbCA9IGNvbDsKKyAgICByYW5nZUFkZHJlc3MuRnJvbVJvdyA9IHJvdzsKKyAgICByYW5nZUFkZHJlc3MuVG9Sb3cgPSByb3c7CisgIH0KKworICBwcml2YXRlIHZvaWQgSGFuZGxlTXVsdGlwbGVDZWxsQWRkcmVzcyhSYW5nZUFkZHJlc3MgcmFuZ2VBZGRyZXNzLCBFeGNlbEFkZHJlc3NJbmZvIGFkZHJlc3NJbmZvKSB7CisgICAgaW50IGZyb21Db2wsCisgICAgICAgIGZyb21Sb3c7CisgICAgX2FkZHJlc3NUcmFuc2xhdG9yLlRvQ29sQW5kUm93KGFkZHJlc3NJbmZvLlN0YXJ0Q2VsbCwgb3V0IGZyb21Db2wsIG91dCBmcm9tUm93KTsKKyAgICBpbnQgdG9Db2wsCisgICAgICAgIHRvUm93OworICAgIF9hZGRyZXNzVHJhbnNsYXRvci5Ub0NvbEFuZFJvdygKKyAgICAgICAgYWRkcmVzc0luZm8uRW5kQ2VsbCwKKyAgICAgICAgb3V0IHRvQ29sLAorICAgICAgICBvdXQgdG9Sb3csCisgICAgICAgIEFkZHJlc3NUcmFuc2xhdG9yLlJhbmdlQ2FsY3VsYXRpb25CZWhhdmlvdXIuTGFzdFBhcnQpOworICAgIHJhbmdlQWRkcmVzcy5Gcm9tQ29sID0gZnJvbUNvbDsKKyAgICByYW5nZUFkZHJlc3MuVG9Db2wgPSB0b0NvbDsKKyAgICByYW5nZUFkZHJlc3MuRnJvbVJvdyA9IGZyb21Sb3c7CisgICAgcmFuZ2VBZGRyZXNzLlRvUm93ID0gdG9Sb3c7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9WYWx1ZU1hdGNoZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvVmFsdWVNYXRjaGVyLmNzCmluZGV4IDJlOGZkMmEuLmFlYjRhNDcgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9WYWx1ZU1hdGNoZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1ZhbHVlTWF0Y2hlci5jcwpAQCAtMTMsOTggKzEzLDg2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXMKLXsKLSAgICBwdWJsaWMgY2xhc3MgVmFsdWVNYXRjaGVyCi0gICAgewotICAgICAgICBwdWJsaWMgY29uc3QgaW50IEluY29tcGF0aWJsZU9wZXJhbmRzID0gLTI7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKIAotICAgICAgICBwdWJsaWMgdmlydHVhbCBpbnQgSXNNYXRjaChvYmplY3QgbzEsIG9iamVjdCBvMikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG8xICE9IG51bGwgJiYgbzIgPT0gbnVsbCkgcmV0dXJuIDE7Ci0gICAgICAgICAgICBpZiAobzEgPT0gbnVsbCAmJiBvMiAhPSBudWxsKSByZXR1cm4gLTE7Ci0gICAgICAgICAgICBpZiAobzEgPT0gbnVsbCAmJiBvMiA9PSBudWxsKSByZXR1cm4gMDsKLSAgICAgICAgICAgIC8vSGFuZGxlIHJhbmdlcyBhbmQgZGVmaW5lZCBuYW1lcwotICAgICAgICAgICAgbzEgPSBDaGVja0dldFJhbmdlKG8xKTsKLSAgICAgICAgICAgIG8yID0gQ2hlY2tHZXRSYW5nZShvMik7CitwdWJsaWMgY2xhc3MgVmFsdWVNYXRjaGVyIHsKKyAgcHVibGljIGNvbnN0IGludCBJbmNvbXBhdGlibGVPcGVyYW5kcyA9IC0yOwogCi0gICAgICAgICAgICBpZiAobzEgaXMgc3RyaW5nICYmIG8yIGlzIHN0cmluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29tcGFyZVN0cmluZ1RvU3RyaW5nKG8xLlRvU3RyaW5nKCkuVG9Mb3dlcigpLCBvMi5Ub1N0cmluZygpLlRvTG93ZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmKCBvMS5HZXRUeXBlKCkgPT0gdHlwZW9mKHN0cmluZykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBhcmVTdHJpbmdUb09iamVjdChvMS5Ub1N0cmluZygpLCBvMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChvMi5HZXRUeXBlKCkgPT0gdHlwZW9mKHN0cmluZykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvbXBhcmVPYmplY3RUb1N0cmluZyhvMSwgbzIuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ29udmVydC5Ub0RvdWJsZShvMSkuQ29tcGFyZVRvKENvbnZlcnQuVG9Eb3VibGUobzIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBDaGVja0dldFJhbmdlKG9iamVjdCB2KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodiBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByID0gKChFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKXYpOwotICAgICAgICAgICAgICAgIGlmIChyLkdldE5DZWxscygpID4gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHYgPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTkEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2ID0gci5HZXRPZmZzZXQoMCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh2IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklOYW1lSW5mbykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgbiA9ICgoRXhjZWxEYXRhUHJvdmlkZXIuSU5hbWVJbmZvKXYpOwotICAgICAgICAgICAgICAgIHYgPSBDaGVja0dldFJhbmdlKG4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBpbnQgQ29tcGFyZVN0cmluZ1RvU3RyaW5nKHN0cmluZyBzMSwgc3RyaW5nIHMyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gczEuQ29tcGFyZVRvKHMyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2aXJ0dWFsIGludCBDb21wYXJlU3RyaW5nVG9PYmplY3Qoc3RyaW5nIG8xLCBvYmplY3QgbzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZSBkMTsKLSAgICAgICAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2UobzEsIG91dCBkMSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGQxLkNvbXBhcmVUbyhDb252ZXJ0LlRvRG91YmxlKG8yKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSW5jb21wYXRpYmxlT3BlcmFuZHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdmlydHVhbCBpbnQgQ29tcGFyZU9iamVjdFRvU3RyaW5nKG9iamVjdCBvMSwgc3RyaW5nIG8yKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGUgZDI7Ci0gICAgICAgICAgICBpZiAoZG91YmxlLlRyeVBhcnNlKG8yLCBvdXQgZDIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDb252ZXJ0LlRvRG91YmxlKG8xKS5Db21wYXJlVG8oZDIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEluY29tcGF0aWJsZU9wZXJhbmRzOwotICAgICAgICB9CisgIHB1YmxpYyB2aXJ0dWFsIGludCBJc01hdGNoKG9iamVjdCBvMSwgb2JqZWN0IG8yKSB7CisgICAgaWYgKG8xICE9IG51bGwgJiYgbzIgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIDE7CiAgICAgfQorICAgIGlmIChvMSA9PSBudWxsICYmIG8yICE9IG51bGwpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKG8xID09IG51bGwgJiYgbzIgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vSGFuZGxlIHJhbmdlcyBhbmQgZGVmaW5lZCBuYW1lcworICAgIG8xID0gQ2hlY2tHZXRSYW5nZShvMSk7CisgICAgbzIgPSBDaGVja0dldFJhbmdlKG8yKTsKKworICAgIGlmIChvMSBpcyBzdHJpbmcgJiYgbzIgaXMgc3RyaW5nKSB7CisgICAgICByZXR1cm4gQ29tcGFyZVN0cmluZ1RvU3RyaW5nKG8xLlRvU3RyaW5nKCkuVG9Mb3dlcigpLCBvMi5Ub1N0cmluZygpLlRvTG93ZXIoKSk7CisgICAgfQorICAgIGlmIChvMS5HZXRUeXBlKCkgPT0gdHlwZW9mKHN0cmluZykpIHsKKyAgICAgIHJldHVybiBDb21wYXJlU3RyaW5nVG9PYmplY3QobzEuVG9TdHJpbmcoKSwgbzIpOworICAgIH0KKyAgICBpZiAobzIuR2V0VHlwZSgpID09IHR5cGVvZihzdHJpbmcpKSB7CisgICAgICByZXR1cm4gQ29tcGFyZU9iamVjdFRvU3RyaW5nKG8xLCBvMi5Ub1N0cmluZygpKTsKKyAgICB9CisgICAgcmV0dXJuIENvbnZlcnQuVG9Eb3VibGUobzEpLkNvbXBhcmVUbyhDb252ZXJ0LlRvRG91YmxlKG8yKSk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBvYmplY3QgQ2hlY2tHZXRSYW5nZShvYmplY3QgdikgeworICAgIGlmICh2IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pIHsKKyAgICAgIHZhciByID0gKChFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKXYpOworICAgICAgaWYgKHIuR2V0TkNlbGxzKCkgPiAxKSB7CisgICAgICAgIHYgPSBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTmEpOworICAgICAgfQorICAgICAgdiA9IHIuR2V0T2Zmc2V0KDAsIDApOworICAgIH0gZWxzZSBpZiAodiBpcyBFeGNlbERhdGFQcm92aWRlci5JTmFtZUluZm8pIHsKKyAgICAgIHZhciBuID0gKChFeGNlbERhdGFQcm92aWRlci5JTmFtZUluZm8pdik7CisgICAgICB2ID0gQ2hlY2tHZXRSYW5nZShuKTsKKyAgICB9CisgICAgcmV0dXJuIHY7CisgIH0KKworICBwcm90ZWN0ZWQgdmlydHVhbCBpbnQgQ29tcGFyZVN0cmluZ1RvU3RyaW5nKHN0cmluZyBzMSwgc3RyaW5nIHMyKSB7CisgICAgcmV0dXJuIHMxLkNvbXBhcmVUbyhzMik7CisgIH0KKworICBwcm90ZWN0ZWQgdmlydHVhbCBpbnQgQ29tcGFyZVN0cmluZ1RvT2JqZWN0KHN0cmluZyBvMSwgb2JqZWN0IG8yKSB7CisgICAgZG91YmxlIGQxOworICAgIGlmIChkb3VibGUuVHJ5UGFyc2UobzEsIG91dCBkMSkpIHsKKyAgICAgIHJldHVybiBkMS5Db21wYXJlVG8oQ29udmVydC5Ub0RvdWJsZShvMikpOworICAgIH0KKyAgICByZXR1cm4gSW5jb21wYXRpYmxlT3BlcmFuZHM7CisgIH0KKworICBwcm90ZWN0ZWQgdmlydHVhbCBpbnQgQ29tcGFyZU9iamVjdFRvU3RyaW5nKG9iamVjdCBvMSwgc3RyaW5nIG8yKSB7CisgICAgZG91YmxlIGQyOworICAgIGlmIChkb3VibGUuVHJ5UGFyc2UobzIsIG91dCBkMikpIHsKKyAgICAgIHJldHVybiBDb252ZXJ0LlRvRG91YmxlKG8xKS5Db21wYXJlVG8oZDIpOworICAgIH0KKyAgICByZXR1cm4gSW5jb21wYXRpYmxlT3BlcmFuZHM7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9XaWxkQ2FyZFZhbHVlTWF0Y2hlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFV0aWxpdGllcy9XaWxkQ2FyZFZhbHVlTWF0Y2hlci5jcwppbmRleCBiZmRiYjUxLi4xNWExNzU0IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxVdGlsaXRpZXMvV2lsZENhcmRWYWx1ZU1hdGNoZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVXRpbGl0aWVzL1dpbGRDYXJkVmFsdWVNYXRjaGVyLmNzCkBAIC0xMyw0NSArMTMsMzcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKKwogdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllcwotewotICAgIHB1YmxpYyBjbGFzcyBXaWxkQ2FyZFZhbHVlTWF0Y2hlciA6IFZhbHVlTWF0Y2hlcgotICAgIHsKLSAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIGludCBDb21wYXJlU3RyaW5nVG9TdHJpbmcoc3RyaW5nIHMxLCBzdHJpbmcgczIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzMS5Db250YWlucygiKiIpIHx8IHMxLkNvbnRhaW5zKCI/IikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJlZ2V4UGF0dGVybiA9IFJlZ2V4LkVzY2FwZShzMSk7Ci0gICAgICAgICAgICAgICAgcmVnZXhQYXR0ZXJuID0gc3RyaW5nLkZvcm1hdCgiXnswfSQiLCByZWdleFBhdHRlcm4pOwotICAgICAgICAgICAgICAgIHJlZ2V4UGF0dGVybiA9IHJlZ2V4UGF0dGVybi5SZXBsYWNlKEAiXCoiLCAiLioiKTsKLSAgICAgICAgICAgICAgICByZWdleFBhdHRlcm4gPSByZWdleFBhdHRlcm4uUmVwbGFjZShAIlw/IiwgIi4iKTsKLSAgICAgICAgICAgICAgICBpZiAoUmVnZXguSXNNYXRjaChzMiwgcmVnZXhQYXR0ZXJuKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBiYXNlLkNvbXBhcmVTdHJpbmdUb1N0cmluZyhzMSwgczIpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKKworcHVibGljIGNsYXNzIFdpbGRDYXJkVmFsdWVNYXRjaGVyIDogVmFsdWVNYXRjaGVyIHsKKyAgcHJvdGVjdGVkIG92ZXJyaWRlIGludCBDb21wYXJlU3RyaW5nVG9TdHJpbmcoc3RyaW5nIHMxLCBzdHJpbmcgczIpIHsKKyAgICBpZiAoczEuQ29udGFpbnMoIioiKSB8fCBzMS5Db250YWlucygiPyIpKSB7CisgICAgICB2YXIgcmVnZXhQYXR0ZXJuID0gUmVnZXguRXNjYXBlKHMxKTsKKyAgICAgIHJlZ2V4UGF0dGVybiA9IHN0cmluZy5Gb3JtYXQoIl57MH0kIiwgcmVnZXhQYXR0ZXJuKTsKKyAgICAgIHJlZ2V4UGF0dGVybiA9IHJlZ2V4UGF0dGVybi5SZXBsYWNlKEAiXCoiLCAiLioiKTsKKyAgICAgIHJlZ2V4UGF0dGVybiA9IHJlZ2V4UGF0dGVybi5SZXBsYWNlKEAiXD8iLCAiLiIpOworICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goczIsIHJlZ2V4UGF0dGVybikpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CiAgICAgfQorICAgIHJldHVybiBiYXNlLkNvbXBhcmVTdHJpbmdUb1N0cmluZyhzMSwgczIpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxWYWx1ZXMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZWxWYWx1ZXMuY3MKaW5kZXggNTdiZTM4Zi4uZDhmY2VlYiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VsVmFsdWVzLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlbFZhbHVlcy5jcwpAQCAtMSwyMDcgKzEsMjA2IEBACi3vu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOworCisvLy8gPHN1bW1hcnk+CisvLy8gUmVwcmVzZW50cyB0aGUgZXJyb3J0eXBlcyBpbiBleGNlbAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVFcnJvclR5cGUgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBEaXZpc2lvbiBieSB6ZXJvCisgIC8vLyA8L3N1bW1hcnk+CisgIERpdjAsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTm90IGFwcGxpY2FibGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgTmEsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTmFtZSBlcnJvcgorICAvLy8gPC9zdW1tYXJ5PgorICBOYW1lLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE51bGwgZXJyb3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgTnVsbCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOdW0gZXJyb3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgTnVtLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJlZmVyZW5jZSBlcnJvcgorICAvLy8gPC9zdW1tYXJ5PgorICBSZWYsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVmFsdWUgZXJyb3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgVmFsdWUsCisKKyAgLy8gQnVnIEcwMDA0CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEVycm9yIGVycm9yICAvLyBHb29nbGUgQnVnIEcwMDA0CisgIC8vLyA8L3N1bW1hcnk+CisgIEVycm9yLAorCisgIC8vIEJ1ZyBHMDAwNQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFcnJvclZhbHVlSXNOdWxsT3JFbXB0eSBlcnJvciAgLy8gR29vZ2xlIEJ1ZyBHMDAwNQorICAvLy8gPC9zdW1tYXJ5PgorICBFcnJvclZhbHVlSXNOdWxsT3JFbXB0eSwKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIFJlcHJlc2VudHMgYW4gRXhjZWwgZXJyb3IuCisvLy8gPC9zdW1tYXJ5PgorLy8vIDxzZWVhbHNvIGNyZWY9ImVFcnJvclR5cGUiLz4KK3B1YmxpYyBjbGFzcyBFeGNlbEVycm9yVmFsdWUgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBIYW5kbGVzIHRoZSBjb252ZXJ0aW9uIGJldHdlZW4gPHNlZSBjcmVmPSJlRXJyb3JUeXBlIi8+IGFuZCB0aGUgc3RyaW5nIHZhbHVlcworICAvLy8gdXNlZCBieSBFeGNlbC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWx1ZXMgeworICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgRGl2MCA9ICIjRElWLzAhIjsKKyAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIE5hID0gIiNOL0EiOworICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgTmFtZSA9ICIjTkFNRT8iOworICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgTnVsbCA9ICIjTlVMTCEiOworICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgTnVtID0gIiNOVU0hIjsKKyAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIFJlZiA9ICIjUkVGISI7CisgICAgcHVibGljIGNvbnN0IHN0cmluZyBWYWx1ZSA9ICIjVkFMVUUhIjsKKyAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIEVycm9yID0gIiNFUlJPUiEiOyAvLyBCdWcgRzAwMDQKKyAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIEVycm9yVmFsdWVJc051bGxPckVtcHR5ID0gIiNFUlJPUlZBTFVFSVNOVUxMT1JFTVBUWSEiOyAvLyBCdWcgRzAwMDUKKworICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8c3RyaW5nLCBlRXJyb3JUeXBlPiBfdmFsdWVzID0gbmV3KCkgeworICAgICAgeyBEaXYwLCBlRXJyb3JUeXBlLkRpdjAgfSwKKyAgICAgIHsgTmEsIGVFcnJvclR5cGUuTmEgfSwKKyAgICAgIHsgTmFtZSwgZUVycm9yVHlwZS5OYW1lIH0sCisgICAgICB7IE51bGwsIGVFcnJvclR5cGUuTnVsbCB9LAorICAgICAgeyBOdW0sIGVFcnJvclR5cGUuTnVtIH0sCisgICAgICB7IFJlZiwgZUVycm9yVHlwZS5SZWYgfSwKKyAgICAgIHsgVmFsdWUsIGVFcnJvclR5cGUuVmFsdWUgfSwKKyAgICAgIHsgRXJyb3IsIGVFcnJvclR5cGUuRXJyb3IgfSwgLy8gQnVnIEcwMDA0CisgICAgICB7CisgICAgICAgIEVycm9yVmFsdWVJc051bGxPckVtcHR5LAorICAgICAgICBlRXJyb3JUeXBlLkVycm9yVmFsdWVJc051bGxPckVtcHR5CisgICAgICB9IC8vIEJ1ZyBHMDAwNQorICAgICAgLAorICAgIH07CisKICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFJlcHJlc2VudHMgdGhlIGVycm9ydHlwZXMgaW4gZXhjZWwKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzdXBwbGllZCA8cGFyYW1yZWYgbmFtZT0iY2FuZGlkYXRlIi8+IGlzIGFuIGV4Y2VsIGVycm9yLgogICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gZUVycm9yVHlwZQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGl2aXNpb24gYnkgemVybwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBEaXYwLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBOb3QgYXBwbGljYWJsZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBOQSwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTmFtZSBlcnJvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBOYW1lLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBOdWxsIGVycm9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIE51bGwsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE51bSBlcnJvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBOdW0sCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlZmVyZW5jZSBlcnJvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBSZWYsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFZhbHVlIGVycm9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFZhbHVlLAotICAgICAgICAvLyBCdWcgRzAwMDQKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRXJyb3IgZXJyb3IgIC8vIEdvb2dsZSBCdWcgRzAwMDQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgRXJyb3IsCi0gICAgICAgIC8vIEJ1ZyBHMDAwNQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBFcnJvclZhbHVlSXNOdWxsT3JFbXB0eSBlcnJvciAgLy8gR29vZ2xlIEJ1ZyBHMDAwNQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBFcnJvclZhbHVlSXNOdWxsT3JFbXB0eQorICAgIC8vLyA8cGFyYW0gbmFtZT0iY2FuZGlkYXRlIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgICAgcHVibGljIHN0YXRpYyBib29sIElzRXJyb3JWYWx1ZShvYmplY3QgY2FuZGlkYXRlKSB7CisgICAgICBpZiAoY2FuZGlkYXRlID09IG51bGwgfHwgIShjYW5kaWRhdGUgaXMgRXhjZWxFcnJvclZhbHVlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICB2YXIgY2FuZGlkYXRlU3RyaW5nID0gY2FuZGlkYXRlLlRvU3RyaW5nKCk7CisgICAgICByZXR1cm4gKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShjYW5kaWRhdGVTdHJpbmcpICYmIF92YWx1ZXMuQ29udGFpbnNLZXkoY2FuZGlkYXRlU3RyaW5nKSk7CiAgICAgfQogCiAgICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBSZXByZXNlbnRzIGFuIEV4Y2VsIGVycm9yLgorICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHN1cHBsaWVkIDxwYXJhbXJlZiBuYW1lPSJjYW5kaWRhdGUiLz4gaXMgYW4gZXhjZWwgZXJyb3IuCiAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHNlZWFsc28gY3JlZj0iZUVycm9yVHlwZSIvPgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbEVycm9yVmFsdWUKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEhhbmRsZXMgdGhlIGNvbnZlcnRpb24gYmV0d2VlbiA8c2VlIGNyZWY9ImVFcnJvclR5cGUiLz4gYW5kIHRoZSBzdHJpbmcgdmFsdWVzCi0gICAgICAgIC8vLyB1c2VkIGJ5IEV4Y2VsLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbHVlcwotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIERpdjAgPSAiI0RJVi8wISI7Ci0gICAgICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIE5BID0gIiNOL0EiOwotICAgICAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBOYW1lID0gIiNOQU1FPyI7Ci0gICAgICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIE51bGwgPSAiI05VTEwhIjsKLSAgICAgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgTnVtID0gIiNOVU0hIjsKLSAgICAgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgUmVmID0gIiNSRUYhIjsKLSAgICAgICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgVmFsdWUgPSAiI1ZBTFVFISI7Ci0gICAgICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIEVycm9yID0gIiNFUlJPUiEiOyAgLy8gQnVnIEcwMDA0Ci0gICAgICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIEVycm9yVmFsdWVJc051bGxPckVtcHR5ID0gIiNFUlJPUlZBTFVFSVNOVUxMT1JFTVBUWSEiOyAgLy8gQnVnIEcwMDA1Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8c3RyaW5nLCBlRXJyb3JUeXBlPiBfdmFsdWVzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBlRXJyb3JUeXBlPigpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB7RGl2MCwgZUVycm9yVHlwZS5EaXYwfSwKLSAgICAgICAgICAgICAgICAgICAge05BLCBlRXJyb3JUeXBlLk5BfSwKLSAgICAgICAgICAgICAgICAgICAge05hbWUsIGVFcnJvclR5cGUuTmFtZX0sCi0gICAgICAgICAgICAgICAgICAgIHtOdWxsLCBlRXJyb3JUeXBlLk51bGx9LAotICAgICAgICAgICAgICAgICAgICB7TnVtLCBlRXJyb3JUeXBlLk51bX0sCi0gICAgICAgICAgICAgICAgICAgIHtSZWYsIGVFcnJvclR5cGUuUmVmfSwKLSAgICAgICAgICAgICAgICAgICAge1ZhbHVlLCBlRXJyb3JUeXBlLlZhbHVlfSwKLSAgICAgICAgICAgICAgICAgICAge0Vycm9yLCBlRXJyb3JUeXBlLkVycm9yfSwgIC8vIEJ1ZyBHMDAwNAotICAgICAgICAgICAgICAgICAgICB7RXJyb3JWYWx1ZUlzTnVsbE9yRW1wdHksIGVFcnJvclR5cGUuRXJyb3JWYWx1ZUlzTnVsbE9yRW1wdHl9ICAvLyBCdWcgRzAwMDUKLSAgICAgICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzdXBwbGllZCA8cGFyYW1yZWYgbmFtZT0iY2FuZGlkYXRlIi8+IGlzIGFuIGV4Y2VsIGVycm9yLgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY2FuZGlkYXRlIj48L3BhcmFtPgotICAgICAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBJc0Vycm9yVmFsdWUob2JqZWN0IGNhbmRpZGF0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihjYW5kaWRhdGUgPT0gbnVsbCB8fCAhKGNhbmRpZGF0ZSBpcyBFeGNlbEVycm9yVmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdmFyIGNhbmRpZGF0ZVN0cmluZyA9IGNhbmRpZGF0ZS5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgIHJldHVybiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGNhbmRpZGF0ZVN0cmluZykgJiYgX3ZhbHVlcy5Db250YWluc0tleShjYW5kaWRhdGVTdHJpbmcpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3VwcGxpZWQgPHBhcmFtcmVmIG5hbWU9ImNhbmRpZGF0ZSIvPiBpcyBhbiBleGNlbCBlcnJvci4KLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNhbmRpZGF0ZSI+PC9wYXJhbT4KLSAgICAgICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgU3RyaW5nSXNFcnJvclZhbHVlKHN0cmluZyBjYW5kaWRhdGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICghc3RyaW5nLklzTnVsbE9yRW1wdHkoY2FuZGlkYXRlKSAmJiBfdmFsdWVzLkNvbnRhaW5zS2V5KGNhbmRpZGF0ZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gQ29udmVydHMgYSBzdHJpbmcgdG8gYW4gPHNlZSBjcmVmPSJlRXJyb3JUeXBlIi8+Ci0gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWwiPjwvcGFyYW0+Ci0gICAgICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPlRocm93biBpZiB0aGUgc3VwcGxpZWQgdmFsdWUgaXMgbm90IGFuIEV4Y2VsIGVycm9yPC9leGNlcHRpb24+Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGVFcnJvclR5cGUgVG9FcnJvclR5cGUoc3RyaW5nIHZhbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkodmFsKSB8fCAhX3ZhbHVlcy5Db250YWluc0tleSh2YWwpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGVycm9yIGNvZGUgIiArICh2YWwgPz8gIjxlbXB0eT4iKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfdmFsdWVzW3ZhbF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgRXhjZWxFcnJvclZhbHVlIENyZWF0ZShlRXJyb3JUeXBlIGVycm9yVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yVmFsdWUoZXJyb3JUeXBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBFeGNlbEVycm9yVmFsdWUgUGFyc2Uoc3RyaW5nIHZhbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHZhbCkpICAvLyBHb29nbGUgQnVnIEcwMDA1Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsID0gVmFsdWVzLkVycm9yVmFsdWVJc051bGxPckVtcHR5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoVmFsdWVzLlN0cmluZ0lzRXJyb3JWYWx1ZSh2YWwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxFcnJvclZhbHVlKFZhbHVlcy5Ub0Vycm9yVHlwZSh2YWwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KHZhbCkpIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInZhbCIpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYSB2YWxpZCBlcnJvciB2YWx1ZTogIiArIHZhbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEV4Y2VsRXJyb3JWYWx1ZShlRXJyb3JUeXBlIHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFR5cGU9dHlwZTsgCi0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgZXJyb3IgdHlwZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZUVycm9yVHlwZSBUeXBlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgdHlwZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLkRpdjA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWx1ZXMuRGl2MDsKLSAgICAgICAgICAgICAgICBjYXNlIGVFcnJvclR5cGUuTkE6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWx1ZXMuTkE7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRXJyb3JUeXBlLk5hbWU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWx1ZXMuTmFtZTsKLSAgICAgICAgICAgICAgICBjYXNlIGVFcnJvclR5cGUuTnVsbDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbHVlcy5OdWxsOwotICAgICAgICAgICAgICAgIGNhc2UgZUVycm9yVHlwZS5OdW06Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWx1ZXMuTnVtOwotICAgICAgICAgICAgICAgIGNhc2UgZUVycm9yVHlwZS5SZWY6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWx1ZXMuUmVmOwotICAgICAgICAgICAgICAgIGNhc2UgZUVycm9yVHlwZS5WYWx1ZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbHVlcy5WYWx1ZTsKLSAgICAgICAgICAgICAgICBjYXNlIGVFcnJvclR5cGUuRXJyb3I6ICAvLyBCdWcgRzAwMDQKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbHVlcy5FcnJvcjsKLSAgICAgICAgICAgICAgICBjYXNlIGVFcnJvclR5cGUuRXJyb3JWYWx1ZUlzTnVsbE9yRW1wdHk6ICAvLyBCdWcgRzAwMDUKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbHVlcy5FcnJvclZhbHVlSXNOdWxsT3JFbXB0eTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZXJyb3J0eXBlIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgRXhjZWxFcnJvclZhbHVlIG9wZXJhdG9yICsob2JqZWN0IHYxLCBFeGNlbEVycm9yVmFsdWUgdjIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB2MjsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgc3RhdGljIEV4Y2VsRXJyb3JWYWx1ZSBvcGVyYXRvciArKEV4Y2VsRXJyb3JWYWx1ZSB2MSwgRXhjZWxFcnJvclZhbHVlIHYyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdjE7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJhc2UuR2V0SGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaXMgRXhjZWxFcnJvclZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuICgoRXhjZWxFcnJvclZhbHVlKSBvYmopLlRvU3RyaW5nKCkgPT0gdGhpcy5Ub1N0cmluZygpOwotICAgICAgICB9CisgICAgLy8vIDxwYXJhbSBuYW1lPSJjYW5kaWRhdGUiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICBwdWJsaWMgc3RhdGljIGJvb2wgU3RyaW5nSXNFcnJvclZhbHVlKHN0cmluZyBjYW5kaWRhdGUpIHsKKyAgICAgIHJldHVybiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGNhbmRpZGF0ZSkgJiYgX3ZhbHVlcy5Db250YWluc0tleShjYW5kaWRhdGUpKTsKICAgICB9CisKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIENvbnZlcnRzIGEgc3RyaW5nIHRvIGFuIDxzZWUgY3JlZj0iZUVycm9yVHlwZSIvPgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWwiPjwvcGFyYW0+CisgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+VGhyb3duIGlmIHRoZSBzdXBwbGllZCB2YWx1ZSBpcyBub3QgYW4gRXhjZWwgZXJyb3I8L2V4Y2VwdGlvbj4KKyAgICBwdWJsaWMgc3RhdGljIGVFcnJvclR5cGUgVG9FcnJvclR5cGUoc3RyaW5nIHZhbCkgeworICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHZhbCkgfHwgIV92YWx1ZXMuQ29udGFpbnNLZXkodmFsKSkgeworICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgZXJyb3IgY29kZSAiICsgKHZhbCA/PyAiPGVtcHR5PiIpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfdmFsdWVzW3ZhbF07CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgc3RhdGljIEV4Y2VsRXJyb3JWYWx1ZSBDcmVhdGUoZUVycm9yVHlwZSBlcnJvclR5cGUpIHsKKyAgICByZXR1cm4gbmV3KGVycm9yVHlwZSk7CisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgRXhjZWxFcnJvclZhbHVlIFBhcnNlKHN0cmluZyB2YWwpIHsKKyAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoCisgICAgICAgIHZhbCkpIC8vIEdvb2dsZSBCdWcgRzAwMDUKKyAgICB7CisgICAgICB2YWwgPSBWYWx1ZXMuRXJyb3JWYWx1ZUlzTnVsbE9yRW1wdHk7CisgICAgfQorCisgICAgaWYgKFZhbHVlcy5TdHJpbmdJc0Vycm9yVmFsdWUodmFsKSkgeworICAgICAgcmV0dXJuIG5ldyhWYWx1ZXMuVG9FcnJvclR5cGUodmFsKSk7CisgICAgfQorICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWwpKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ2YWwiKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgYSB2YWxpZCBlcnJvciB2YWx1ZTogIiArIHZhbCk7CisgIH0KKworICBwcml2YXRlIEV4Y2VsRXJyb3JWYWx1ZShlRXJyb3JUeXBlIHR5cGUpIHsKKyAgICBUeXBlID0gdHlwZTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBlcnJvciB0eXBlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBlRXJyb3JUeXBlIFR5cGUgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciB0eXBlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CisgICAgc3dpdGNoIChUeXBlKSB7CisgICAgICBjYXNlIGVFcnJvclR5cGUuRGl2MDoKKyAgICAgICAgcmV0dXJuIFZhbHVlcy5EaXYwOworICAgICAgY2FzZSBlRXJyb3JUeXBlLk5hOgorICAgICAgICByZXR1cm4gVmFsdWVzLk5hOworICAgICAgY2FzZSBlRXJyb3JUeXBlLk5hbWU6CisgICAgICAgIHJldHVybiBWYWx1ZXMuTmFtZTsKKyAgICAgIGNhc2UgZUVycm9yVHlwZS5OdWxsOgorICAgICAgICByZXR1cm4gVmFsdWVzLk51bGw7CisgICAgICBjYXNlIGVFcnJvclR5cGUuTnVtOgorICAgICAgICByZXR1cm4gVmFsdWVzLk51bTsKKyAgICAgIGNhc2UgZUVycm9yVHlwZS5SZWY6CisgICAgICAgIHJldHVybiBWYWx1ZXMuUmVmOworICAgICAgY2FzZSBlRXJyb3JUeXBlLlZhbHVlOgorICAgICAgICByZXR1cm4gVmFsdWVzLlZhbHVlOworICAgICAgY2FzZSBlRXJyb3JUeXBlLkVycm9yOiAvLyBCdWcgRzAwMDQKKyAgICAgICAgcmV0dXJuIFZhbHVlcy5FcnJvcjsKKyAgICAgIGNhc2UgZUVycm9yVHlwZS5FcnJvclZhbHVlSXNOdWxsT3JFbXB0eTogLy8gQnVnIEcwMDA1CisgICAgICAgIHJldHVybiBWYWx1ZXMuRXJyb3JWYWx1ZUlzTnVsbE9yRW1wdHk7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGVycm9ydHlwZSIpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIEV4Y2VsRXJyb3JWYWx1ZSBvcGVyYXRvciArKG9iamVjdCB2MSwgRXhjZWxFcnJvclZhbHVlIHYyKSB7CisgICAgcmV0dXJuIHYyOworICB9CisKKyAgcHVibGljIHN0YXRpYyBFeGNlbEVycm9yVmFsdWUgb3BlcmF0b3IgKyhFeGNlbEVycm9yVmFsdWUgdjEsIEV4Y2VsRXJyb3JWYWx1ZSB2MikgeworICAgIHJldHVybiB2MTsKKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7CisgICAgcmV0dXJuIGJhc2UuR2V0SGFzaENvZGUoKTsKKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKSB7CisgICAgaWYgKCEob2JqIGlzIEV4Y2VsRXJyb3JWYWx1ZSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuICgoRXhjZWxFcnJvclZhbHVlKW9iaikuVG9TdHJpbmcoKSA9PSBUb1N0cmluZygpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZXB0aW9ucy9DaXJjdWxhclJlZmVyZW5jZUV4Y2VwdGlvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlcHRpb25zL0NpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uLmNzCmluZGV4IDVmZmM1ZWQuLjkwZGFkNWIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlcHRpb25zL0NpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlcHRpb25zL0NpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uLmNzCkBAIC0xMywzNCArMTMsMjcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zCi17Ci0gICAgcHVibGljIGNsYXNzIENpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uIDogRXhjZXB0aW9uCi0gICAgewotICAgICAgICBwdWJsaWMgQ2lyY3VsYXJSZWZlcmVuY2VFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKLSAgICAgICAgeworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIAotICAgICAgICB9Ci0gICAgfQorcHVibGljIGNsYXNzIENpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uIDogRXhjZXB0aW9uIHsKKyAgcHVibGljIENpcmN1bGFyUmVmZXJlbmNlRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQorICAgICAgOiBiYXNlKG1lc3NhZ2UpIHt9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZXB0aW9ucy9FeGNlbEVycm9yQ29kZXMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZXB0aW9ucy9FeGNlbEVycm9yQ29kZXMuY3MKaW5kZXggMzQzMzNkZS4uZjE4MmU4YSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VwdGlvbnMvRXhjZWxFcnJvckNvZGVzLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlcHRpb25zL0V4Y2VsRXJyb3JDb2Rlcy5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsOTQgKzEzLDczIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9ucwotewotICAgIHB1YmxpYyBjbGFzcyBFeGNlbEVycm9yQ29kZXMKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgRXhjZWxFcnJvckNvZGVzKHN0cmluZyBjb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb2RlID0gY29kZTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIAotICAgICAgICBwdWJsaWMgc3RyaW5nIENvZGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7Ci0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBFeGNlbEVycm9yQ29kZXMgeworICBwcml2YXRlIEV4Y2VsRXJyb3JDb2RlcyhzdHJpbmcgY29kZSkgeworICAgIENvZGUgPSBjb2RlOworICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb2RlLkdldEhhc2hDb2RlKCk7Ci0gICAgICAgIH0KKyAgcHVibGljIHN0cmluZyBDb2RlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sICBFcXVhbHMob2JqZWN0IG9iaikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG9iaiBpcyBFeGNlbEVycm9yQ29kZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoRXhjZWxFcnJvckNvZGVzKW9iaikuQ29kZS5FcXVhbHMoQ29kZSk7Ci0gICAgICAgICAgICB9Ci0gCSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7CisgICAgcmV0dXJuIENvZGUuR2V0SGFzaENvZGUoKTsKKyAgfQogCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBvcGVyYXRvciA9PSAoRXhjZWxFcnJvckNvZGVzIGMxLCBFeGNlbEVycm9yQ29kZXMgYzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBjMS5Db2RlLkVxdWFscyhjMi5Db2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBvcGVyYXRvciAhPShFeGNlbEVycm9yQ29kZXMgYzEsIEV4Y2VsRXJyb3JDb2RlcyBjMikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuICFjMS5Db2RlLkVxdWFscyhjMi5Db2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IElFbnVtZXJhYmxlPHN0cmluZz4gQ29kZXMgPSBuZXcgTGlzdDxzdHJpbmc+IHsgVmFsdWUuQ29kZSwgTmFtZS5Db2RlLCBOb1ZhbHVlQXZhbGlhYmxlLkNvZGUgfTsKLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgSXNFcnJvckNvZGUob2JqZWN0IHZhbHVlVG9UZXN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsdWVUb1Rlc3QgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWVUb1Rlc3QuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgIGlmIChDb2Rlcy5GaXJzdE9yRGVmYXVsdCh4ID0+IHggPT0gY2FuZGlkYXRlKSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBFeGNlbEVycm9yQ29kZXMgVmFsdWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG5ldyBFeGNlbEVycm9yQ29kZXMoIiNWQUxVRSEiKTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBFeGNlbEVycm9yQ29kZXMgTmFtZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gbmV3IEV4Y2VsRXJyb3JDb2RlcygiI05BTUU/Iik7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRXhjZWxFcnJvckNvZGVzIE5vVmFsdWVBdmFsaWFibGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG5ldyBFeGNlbEVycm9yQ29kZXMoIiNOL0EiKTsgfQotICAgICAgICB9CisgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKSB7CisgICAgaWYgKG9iaiBpcyBFeGNlbEVycm9yQ29kZXMpIHsKKyAgICAgIHJldHVybiAoKEV4Y2VsRXJyb3JDb2RlcylvYmopLkNvZGUuRXF1YWxzKENvZGUpOwogICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJvb2wgb3BlcmF0b3IgPT0oRXhjZWxFcnJvckNvZGVzIGMxLCBFeGNlbEVycm9yQ29kZXMgYzIpIHsKKyAgICByZXR1cm4gYzEuQ29kZS5FcXVhbHMoYzIuQ29kZSk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJvb2wgb3BlcmF0b3IgIT0oRXhjZWxFcnJvckNvZGVzIGMxLCBFeGNlbEVycm9yQ29kZXMgYzIpIHsKKyAgICByZXR1cm4gIWMxLkNvZGUuRXF1YWxzKGMyLkNvZGUpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSUVudW1lcmFibGU8c3RyaW5nPiBDb2RlcyA9IG5ldyBMaXN0PHN0cmluZz4geworICAgIFZhbHVlLkNvZGUsCisgICAgTmFtZS5Db2RlLAorICAgIE5vVmFsdWVBdmFsaWFibGUuQ29kZSwKKyAgfTsKKworICBwdWJsaWMgc3RhdGljIGJvb2wgSXNFcnJvckNvZGUob2JqZWN0IHZhbHVlVG9UZXN0KSB7CisgICAgaWYgKHZhbHVlVG9UZXN0ID09IG51bGwpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFyIGNhbmRpZGF0ZSA9IHZhbHVlVG9UZXN0LlRvU3RyaW5nKCk7CisgICAgaWYgKENvZGVzLkZpcnN0T3JEZWZhdWx0KHggPT4geCA9PSBjYW5kaWRhdGUpICE9IG51bGwpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEV4Y2VsRXJyb3JDb2RlcyBWYWx1ZSA9PiBuZXcoIiNWQUxVRSEiKTsKKworICBwdWJsaWMgc3RhdGljIEV4Y2VsRXJyb3JDb2RlcyBOYW1lID0+IG5ldygiI05BTUU/Iik7CisKKyAgcHVibGljIHN0YXRpYyBFeGNlbEVycm9yQ29kZXMgTm9WYWx1ZUF2YWxpYWJsZSA9PiBuZXcoIiNOL0EiKTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlcHRpb25zL0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlcHRpb25zL0V4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbi5jcwppbmRleCBkY2MyMjM5Li40MzQxZWQwIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhjZXB0aW9ucy9FeGNlbEVycm9yVmFsdWVFeGNlcHRpb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VwdGlvbnMvRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uLmNzCkBAIC0xLDQwICsxLDI3IEBACiDvu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRoaXMgRXhjZXB0aW9uIHJlcHJlc2VudHMgYW4gRXhjZWwgZXJyb3IuIFdoZW4gdGhpcyBleGNlcHRpb24gaXMgdGhyb3duCi0gICAgLy8vIGZyb20gYW4gRXhjZWwgZnVuY3Rpb24sIHRoZSBFcnJvclZhbHVlIGNvZGUgd2lsbCBiZSBzZXQgYXMgdGhlIHZhbHVlIG9mIHRoZQotICAgIC8vLyBwYXJzZWQgY2VsbC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJFeGNlbEVycm9yVmFsdWUiLz4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIDogRXhjZXB0aW9uCi0gICAgewotICAgICAgICAKLSAgICAgICAgcHVibGljIEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihFeGNlbEVycm9yVmFsdWUgZXJyb3IpCi0gICAgICAgICAgICA6IHRoaXMoZXJyb3IuVG9TdHJpbmcoKSwgZXJyb3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIAotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwogCi0gICAgICAgIHB1YmxpYyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UsIEV4Y2VsRXJyb3JWYWx1ZSBlcnJvcikKLSAgICAgICAgICAgIDogYmFzZShtZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICBFcnJvclZhbHVlID0gZXJyb3I7Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBUaGlzIEV4Y2VwdGlvbiByZXByZXNlbnRzIGFuIEV4Y2VsIGVycm9yLiBXaGVuIHRoaXMgZXhjZXB0aW9uIGlzIHRocm93bgorLy8vIGZyb20gYW4gRXhjZWwgZnVuY3Rpb24sIHRoZSBFcnJvclZhbHVlIGNvZGUgd2lsbCBiZSBzZXQgYXMgdGhlIHZhbHVlIG9mIHRoZQorLy8vIHBhcnNlZCBjZWxsLgorLy8vIDwvc3VtbWFyeT4KKy8vLyA8c2VlYWxzbyBjcmVmPSJFeGNlbEVycm9yVmFsdWUiLz4KK3B1YmxpYyBjbGFzcyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24gOiBFeGNlcHRpb24geworICBwdWJsaWMgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKEV4Y2VsRXJyb3JWYWx1ZSBlcnJvcikKKyAgICAgIDogdGhpcyhlcnJvci5Ub1N0cmluZygpLCBlcnJvcikge30KIAotICAgICAgICBwdWJsaWMgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUgZXJyb3JUeXBlKQotICAgICAgICAgICAgOiB0aGlzKEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZXJyb3JUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgIH0KKyAgcHVibGljIEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihzdHJpbmcgbWVzc2FnZSwgRXhjZWxFcnJvclZhbHVlIGVycm9yKQorICAgICAgOiBiYXNlKG1lc3NhZ2UpIHsKKyAgICBFcnJvclZhbHVlID0gZXJyb3I7CisgIH0KIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgZXJyb3IgdmFsdWUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsRXJyb3JWYWx1ZSBFcnJvclZhbHVlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotICAgIH0KKyAgcHVibGljIEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlIGVycm9yVHlwZSkKKyAgICAgIDogdGhpcyhFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVycm9yVHlwZSkpIHt9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIGVycm9yIHZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEVycm9yVmFsdWUgRXJyb3JWYWx1ZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeGNlcHRpb25zL1VucmVjb2duaXplZFRva2VuRXhjZXB0aW9uLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VwdGlvbnMvVW5yZWNvZ25pemVkVG9rZW5FeGNlcHRpb24uY3MKaW5kZXggNGMyNmJhOC4uZjQ4NTJjMCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VwdGlvbnMvVW5yZWNvZ25pemVkVG9rZW5FeGNlcHRpb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4Y2VwdGlvbnMvVW5yZWNvZ25pemVkVG9rZW5FeGNlcHRpb24uY3MKQEAgLTEzLDM1ICsxMywyOCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9ucwotewotICAgIHB1YmxpYyBjbGFzcyBVbnJlY29nbml6ZWRUb2tlbkV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIFVucmVjb2duaXplZFRva2VuRXhjZXB0aW9uKFRva2VuIHRva2VuKQotICAgICAgICAgICAgOiBiYXNlKCAiVW5yZWNvZ25pemVkIHRva2VuOiAiICsgdG9rZW4uVmFsdWUpCi0gICAgICAgIHsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CiAKLSAgICAgICAgfQotICAgIH0KK3B1YmxpYyBjbGFzcyBVbnJlY29nbml6ZWRUb2tlbkV4Y2VwdGlvbiA6IEV4Y2VwdGlvbiB7CisgIHB1YmxpYyBVbnJlY29nbml6ZWRUb2tlbkV4Y2VwdGlvbihUb2tlbiB0b2tlbikKKyAgICAgIDogYmFzZSgiVW5yZWNvZ25pemVkIHRva2VuOiAiICsgdG9rZW4uVmFsdWUpIHt9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0F0b21pY0V4cHJlc3Npb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0F0b21pY0V4cHJlc3Npb24uY3MKaW5kZXggNTQ2NzEzNy4uMGFkMjQ5ZSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9BdG9taWNFeHByZXNzaW9uLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQXRvbWljRXhwcmVzc2lvbi5jcwpAQCAtMTMsMzkgKzEzLDI3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAotewotICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBdG9taWNFeHByZXNzaW9uIDogRXhwcmVzc2lvbgotICAgIHsKLSAgICAgICAgcHVibGljIEF0b21pY0V4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24pCi0gICAgICAgICAgICA6IGJhc2UoZXhwcmVzc2lvbikKLSAgICAgICAgeworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi0gICAgICAgIH0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBdG9taWNFeHByZXNzaW9uIDogRXhwcmVzc2lvbiB7CisgIHB1YmxpYyBBdG9taWNFeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uKQorICAgICAgOiBiYXNlKGV4cHJlc3Npb24pIHt9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNHcm91cGVkRXhwcmVzc2lvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KLSAgICAgICAgfQotICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNHcm91cGVkRXhwcmVzc2lvbiA9PiBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQm9vbGVhbkV4cHJlc3Npb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Jvb2xlYW5FeHByZXNzaW9uLmNzCmluZGV4IDIxNjI0OGYuLmRjZTZiMGYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQm9vbGVhbkV4cHJlc3Npb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Cb29sZWFuRXhwcmVzc2lvbi5jcwpAQCAtMTMsNDggKzEzLDM3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAotewotICAgIHB1YmxpYyBjbGFzcyBCb29sZWFuRXhwcmVzc2lvbiA6IEF0b21pY0V4cHJlc3Npb24KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgYm9vbD8gX3ByZWNvbXBpbGVkVmFsdWU7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLSAgICAgICAgcHVibGljIEJvb2xlYW5FeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uKQotICAgICAgICAgICAgOiBiYXNlKGV4cHJlc3Npb24pCi0gICAgICAgIHsKK3B1YmxpYyBjbGFzcyBCb29sZWFuRXhwcmVzc2lvbiA6IEF0b21pY0V4cHJlc3Npb24geworICBwcml2YXRlIGJvb2w/IF9wcmVjb21waWxlZFZhbHVlOwogCi0gICAgICAgIH0KKyAgcHVibGljIEJvb2xlYW5FeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uKQorICAgICAgOiBiYXNlKGV4cHJlc3Npb24pIHt9CiAKLSAgICAgICAgcHVibGljIEJvb2xlYW5FeHByZXNzaW9uKGJvb2wgdmFsdWUpCi0gICAgICAgICAgICA6IGJhc2UodmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcHJlY29tcGlsZWRWYWx1ZSA9IHZhbHVlOwotICAgICAgICB9CisgIHB1YmxpYyBCb29sZWFuRXhwcmVzc2lvbihib29sIHZhbHVlKQorICAgICAgOiBiYXNlKHZhbHVlID8gInRydWUiIDogImZhbHNlIikgeworICAgIF9wcmVjb21waWxlZFZhbHVlID0gdmFsdWU7CisgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IF9wcmVjb21waWxlZFZhbHVlID8/IGJvb2wuUGFyc2UoRXhwcmVzc2lvblN0cmluZyk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQocmVzdWx0LCBEYXRhVHlwZS5Cb29sZWFuKTsKLSAgICAgICAgfQotICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpIHsKKyAgICB2YXIgcmVzdWx0ID0gX3ByZWNvbXBpbGVkVmFsdWUgPz8gYm9vbC5QYXJzZShFeHByZXNzaW9uU3RyaW5nKTsKKyAgICByZXR1cm4gbmV3KHJlc3VsdCwgRGF0YVR5cGUuQm9vbGVhbik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVJlc3VsdC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVJlc3VsdC5jcwppbmRleCA3YWJjMzJlLi4xMDE0NjEwIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVSZXN1bHQuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlUmVzdWx0LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxNDcgKzEzLDEwOCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAotewotICAgIHB1YmxpYyBjbGFzcyBDb21waWxlUmVzdWx0Ci0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBDb21waWxlUmVzdWx0IF9lbXB0eSA9IG5ldyBDb21waWxlUmVzdWx0KG51bGwsIERhdGFUeXBlLkVtcHR5KTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBDb21waWxlUmVzdWx0IEVtcHR5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfZW1wdHk7IH0KLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi0gICAgICAgIHB1YmxpYyBDb21waWxlUmVzdWx0KG9iamVjdCByZXN1bHQsIERhdGFUeXBlIGRhdGFUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgICAgICBEYXRhVHlwZSA9IGRhdGFUeXBlOwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgQ29tcGlsZVJlc3VsdCB7CisgIHByaXZhdGUgc3RhdGljIENvbXBpbGVSZXN1bHQgX2VtcHR5ID0gbmV3KG51bGwsIERhdGFUeXBlLkVtcHR5KTsKIAotICAgICAgICBwdWJsaWMgQ29tcGlsZVJlc3VsdChlRXJyb3JUeXBlIGVycm9yVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgUmVzdWx0ID0gRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlcnJvclR5cGUpOwotICAgICAgICAgICAgRGF0YVR5cGUgPSBEYXRhVHlwZS5FeGNlbEVycm9yOwotICAgICAgICB9CisgIHB1YmxpYyBzdGF0aWMgQ29tcGlsZVJlc3VsdCBFbXB0eSA9PiBfZW1wdHk7CiAKLSAgICAgICAgcHVibGljIENvbXBpbGVSZXN1bHQoRXhjZWxFcnJvclZhbHVlIGVycm9yVmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlcXVpcmUuQXJndW1lbnQoZXJyb3JWYWx1ZSkuSXNOb3ROdWxsKCJlcnJvclZhbHVlIik7Ci0gICAgICAgICAgICBSZXN1bHQgPSBlcnJvclZhbHVlOwotICAgICAgICAgICAgRGF0YVR5cGUgPSBEYXRhVHlwZS5FeGNlbEVycm9yOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBvYmplY3QgUmVzdWx0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHByaXZhdGUgc2V0OwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBvYmplY3QgUmVzdWx0VmFsdWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHIgPSBSZXN1bHQgYXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbzsKLSAgICAgICAgICAgICAgICBpZiAociA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHIuR2V0VmFsdWUoci5BZGRyZXNzLl9mcm9tUm93LCByLkFkZHJlc3MuX2Zyb21Db2wpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgZG91YmxlIFJlc3VsdE51bWVyaWMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKElzTnVtZXJpYykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQgPT0gbnVsbCA/IDAgOiAgQ29udmVydC5Ub0RvdWJsZShSZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKFJlc3VsdCBpcyBEYXRlVGltZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKERhdGVUaW1lKVJlc3VsdCkuVG9PQURhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihSZXN1bHQgaXMgVGltZVNwYW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGVUaW1lKCgoVGltZVNwYW4pUmVzdWx0KS5UaWNrcykuVG9PQURhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoSXNOdW1lcmljU3RyaW5nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb3VibGUuUGFyc2UoUmVzdWx0LlRvU3RyaW5nKCksIE51bWJlclN0eWxlcy5GbG9hdCwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoUmVzdWx0IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgYyA9ICgoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbylSZXN1bHQpLkZpcnN0T3JEZWZhdWx0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuVmFsdWVEb3VibGVMb2dpY2FsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBwdWJsaWMgQ29tcGlsZVJlc3VsdChvYmplY3QgcmVzdWx0LCBEYXRhVHlwZSBkYXRhVHlwZSkgeworICAgIFJlc3VsdCA9IHJlc3VsdDsKKyAgICBEYXRhVHlwZSA9IGRhdGFUeXBlOworICB9CiAKLSAgICAgICAgcHVibGljIERhdGFUeXBlIERhdGFUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHByaXZhdGUgc2V0OwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgYm9vbCBJc051bWVyaWMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBEYXRhVHlwZSA9PSBEYXRhVHlwZS5EZWNpbWFsIHx8IERhdGFUeXBlID09IERhdGFUeXBlLkludGVnZXIgfHwgRGF0YVR5cGUgPT0gRGF0YVR5cGUuRW1wdHkgfHwgRGF0YVR5cGUgPT0gRGF0YVR5cGUuQm9vbGVhbiB8fCBEYXRhVHlwZSA9PSBEYXRhVHlwZS5EYXRlOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBwdWJsaWMgQ29tcGlsZVJlc3VsdChlRXJyb3JUeXBlIGVycm9yVHlwZSkgeworICAgIFJlc3VsdCA9IEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZXJyb3JUeXBlKTsKKyAgICBEYXRhVHlwZSA9IERhdGFUeXBlLkV4Y2VsRXJyb3I7CisgIH0KIAotICAgICAgICBwdWJsaWMgYm9vbCBJc051bWVyaWNTdHJpbmcKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIERhdGFUeXBlID09IERhdGFUeXBlLlN0cmluZyAmJiBDb252ZXJ0VXRpbC5Jc051bWVyaWNTdHJpbmcoUmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBwdWJsaWMgQ29tcGlsZVJlc3VsdChFeGNlbEVycm9yVmFsdWUgZXJyb3JWYWx1ZSkgeworICAgIFJlcXVpcmUuQXJndW1lbnQoZXJyb3JWYWx1ZSkuSXNOb3ROdWxsKCJlcnJvclZhbHVlIik7CisgICAgUmVzdWx0ID0gZXJyb3JWYWx1ZTsKKyAgICBEYXRhVHlwZSA9IERhdGFUeXBlLkV4Y2VsRXJyb3I7CisgIH0KIAotICAgICAgICBwdWJsaWMgYm9vbCBJc1Jlc3VsdE9mU3VidG90YWwgeyBnZXQ7IHNldDsgfQorICBwdWJsaWMgb2JqZWN0IFJlc3VsdCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KIAotICAgICAgICBwdWJsaWMgYm9vbCBJc0hpZGRlbkNlbGwgeyBnZXQ7IHNldDsgfQorICBwdWJsaWMgb2JqZWN0IFJlc3VsdFZhbHVlIHsKKyAgICBnZXQgeworICAgICAgdmFyIHIgPSBSZXN1bHQgYXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbzsKKyAgICAgIGlmIChyID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICAgIH0KKyAgICAgIHJldHVybiByLkdldFZhbHVlKHIuQWRkcmVzcy5fZnJvbVJvdywgci5BZGRyZXNzLl9mcm9tQ29sKTsKICAgICB9CisgIH0KKworICBwdWJsaWMgZG91YmxlIFJlc3VsdE51bWVyaWMgeworICAgIGdldCB7CisgICAgICBpZiAoSXNOdW1lcmljKSB7CisgICAgICAgIHJldHVybiBSZXN1bHQgPT0gbnVsbCA/IDAgOiBDb252ZXJ0LlRvRG91YmxlKFJlc3VsdCk7CisgICAgICB9CisgICAgICBpZiAoUmVzdWx0IGlzIERhdGVUaW1lKSB7CisgICAgICAgIHJldHVybiAoKERhdGVUaW1lKVJlc3VsdCkuVG9PQURhdGUoKTsKKyAgICAgIH0KKyAgICAgIGlmIChSZXN1bHQgaXMgVGltZVNwYW4pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEYXRlVGltZSgoKFRpbWVTcGFuKVJlc3VsdCkuVGlja3MpLlRvT0FEYXRlKCk7CisgICAgICB9CisgICAgICBpZiAoSXNOdW1lcmljU3RyaW5nKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZShSZXN1bHQuVG9TdHJpbmcoKSwgTnVtYmVyU3R5bGVzLkZsb2F0LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uKSB7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChSZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykgeworICAgICAgICB2YXIgYyA9ICgoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbylSZXN1bHQpLkZpcnN0T3JEZWZhdWx0KCk7CisgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYy5WYWx1ZURvdWJsZUxvZ2ljYWw7CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgRGF0YVR5cGUgRGF0YVR5cGUgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgcHVibGljIGJvb2wgSXNOdW1lcmljIHsKKyAgICBnZXQgeworICAgICAgcmV0dXJuIERhdGFUeXBlID09IERhdGFUeXBlLkRlY2ltYWwKKyAgICAgICAgICB8fCBEYXRhVHlwZSA9PSBEYXRhVHlwZS5JbnRlZ2VyCisgICAgICAgICAgfHwgRGF0YVR5cGUgPT0gRGF0YVR5cGUuRW1wdHkKKyAgICAgICAgICB8fCBEYXRhVHlwZSA9PSBEYXRhVHlwZS5Cb29sZWFuCisgICAgICAgICAgfHwgRGF0YVR5cGUgPT0gRGF0YVR5cGUuRGF0ZTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbCBJc051bWVyaWNTdHJpbmcgeworICAgIGdldCB7IHJldHVybiBEYXRhVHlwZSA9PSBEYXRhVHlwZS5TdHJpbmcgJiYgQ29udmVydFV0aWwuSXNOdW1lcmljU3RyaW5nKFJlc3VsdCk7IH0KKyAgfQorCisgIHB1YmxpYyBib29sIElzUmVzdWx0T2ZTdWJ0b3RhbCB7IGdldDsgc2V0OyB9CisKKyAgcHVibGljIGJvb2wgSXNIaWRkZW5DZWxsIHsgZ2V0OyBzZXQ7IH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVJlc3VsdEZhY3RvcnkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVSZXN1bHRGYWN0b3J5LmNzCmluZGV4IGFiMzEzYzQuLmFmNmYwOWYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVJlc3VsdEZhY3RvcnkuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlUmVzdWx0RmFjdG9yeS5jcwpAQCAtMTMsNjYgKzEzLDU1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAotewotICAgIHB1YmxpYyBjbGFzcyBDb21waWxlUmVzdWx0RmFjdG9yeQotICAgIHsKLSAgICAgICAgcHVibGljIHZpcnR1YWwgQ29tcGlsZVJlc3VsdCBDcmVhdGUob2JqZWN0IG9iaikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChvYmogaXMgRXhjZWxEYXRhUHJvdmlkZXIuSU5hbWVJbmZvKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvYmogPSAoKEV4Y2VsRGF0YVByb3ZpZGVyLklOYW1lSW5mbylvYmopLlZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9iaiBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9iaiA9ICgoRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbylvYmopLkdldE9mZnNldCgwLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KG51bGwsIERhdGFUeXBlLkVtcHR5KTsKLSAgICAgICAgICAgIGlmIChvYmouR2V0VHlwZSgpLkVxdWFscyh0eXBlb2Yoc3RyaW5nKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KG9iaiwgRGF0YVR5cGUuU3RyaW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvYmouR2V0VHlwZSgpLkVxdWFscyh0eXBlb2YoZG91YmxlKSkgfHwgb2JqIGlzIGRlY2ltYWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KG9iaiwgRGF0YVR5cGUuRGVjaW1hbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2JqLkdldFR5cGUoKS5FcXVhbHModHlwZW9mKGludCkpIHx8IG9iaiBpcyBsb25nIHx8IG9iaiBpcyBzaG9ydCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQob2JqLCBEYXRhVHlwZS5JbnRlZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvYmouR2V0VHlwZSgpLkVxdWFscyh0eXBlb2YoYm9vbCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChvYmosIERhdGFUeXBlLkJvb2xlYW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG9iai5HZXRUeXBlKCkuRXF1YWxzKHR5cGVvZiAoRXhjZWxFcnJvclZhbHVlKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KG9iaiwgRGF0YVR5cGUuRXhjZWxFcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob2JqLkdldFR5cGUoKS5FcXVhbHModHlwZW9mKFN5c3RlbS5EYXRlVGltZSkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdCgoKFN5c3RlbS5EYXRlVGltZSlvYmopLlRvT0FEYXRlKCksIERhdGFUeXBlLkRhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJOb24gc3VwcG9ydGVkIHR5cGUgIiArIG9iai5HZXRUeXBlKCkuRnVsbE5hbWUpOwotICAgICAgICB9Cit1c2luZyBTeXN0ZW07CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworcHVibGljIGNsYXNzIENvbXBpbGVSZXN1bHRGYWN0b3J5IHsKKyAgcHVibGljIHZpcnR1YWwgQ29tcGlsZVJlc3VsdCBDcmVhdGUob2JqZWN0IG9iaikgeworICAgIGlmICgob2JqIGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklOYW1lSW5mbykpIHsKKyAgICAgIG9iaiA9ICgoRXhjZWxEYXRhUHJvdmlkZXIuSU5hbWVJbmZvKW9iaikuVmFsdWU7CiAgICAgfQorICAgIGlmIChvYmogaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykgeworICAgICAgb2JqID0gKChFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKW9iaikuR2V0T2Zmc2V0KDAsIDApOworICAgIH0KKyAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgIHJldHVybiBuZXcobnVsbCwgRGF0YVR5cGUuRW1wdHkpOworICAgIH0KKyAgICBpZiAob2JqLkdldFR5cGUoKS5FcXVhbHModHlwZW9mKHN0cmluZykpKSB7CisgICAgICByZXR1cm4gbmV3KG9iaiwgRGF0YVR5cGUuU3RyaW5nKTsKKyAgICB9CisgICAgaWYgKG9iai5HZXRUeXBlKCkuRXF1YWxzKHR5cGVvZihkb3VibGUpKSB8fCBvYmogaXMgZGVjaW1hbCkgeworICAgICAgcmV0dXJuIG5ldyhvYmosIERhdGFUeXBlLkRlY2ltYWwpOworICAgIH0KKyAgICBpZiAob2JqLkdldFR5cGUoKS5FcXVhbHModHlwZW9mKGludCkpIHx8IG9iaiBpcyBsb25nIHx8IG9iaiBpcyBzaG9ydCkgeworICAgICAgcmV0dXJuIG5ldyhvYmosIERhdGFUeXBlLkludGVnZXIpOworICAgIH0KKyAgICBpZiAob2JqLkdldFR5cGUoKS5FcXVhbHModHlwZW9mKGJvb2wpKSkgeworICAgICAgcmV0dXJuIG5ldyhvYmosIERhdGFUeXBlLkJvb2xlYW4pOworICAgIH0KKyAgICBpZiAob2JqLkdldFR5cGUoKS5FcXVhbHModHlwZW9mKEV4Y2VsRXJyb3JWYWx1ZSkpKSB7CisgICAgICByZXR1cm4gbmV3KG9iaiwgRGF0YVR5cGUuRXhjZWxFcnJvcik7CisgICAgfQorICAgIGlmIChvYmouR2V0VHlwZSgpLkVxdWFscyh0eXBlb2YoRGF0ZVRpbWUpKSkgeworICAgICAgcmV0dXJuIG5ldygoKERhdGVUaW1lKW9iaikuVG9PQURhdGUoKSwgRGF0YVR5cGUuRGF0ZSk7CisgICAgfQorICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiTm9uIHN1cHBvcnRlZCB0eXBlICIgKyBvYmouR2V0VHlwZSgpLkZ1bGxOYW1lKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlU3RyYXRlZ3kvQ29tcGlsZVN0cmF0ZWd5LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlU3RyYXRlZ3kvQ29tcGlsZVN0cmF0ZWd5LmNzCmluZGV4IDAxMTM4YzAuLjBlYWI0YWIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVN0cmF0ZWd5L0NvbXBpbGVTdHJhdGVneS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVTdHJhdGVneS9Db21waWxlU3RyYXRlZ3kuY3MKQEAgLTEzLDM3ICsxMywzMCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguQ29tcGlsZVN0cmF0ZWd5Ci17Ci0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBpbGVTdHJhdGVneQotICAgIHsKLSAgICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IEV4cHJlc3Npb24gX2V4cHJlc3Npb247CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguQ29tcGlsZVN0cmF0ZWd5OwogCi0gICAgICAgIHB1YmxpYyBDb21waWxlU3RyYXRlZ3koRXhwcmVzc2lvbiBleHByZXNzaW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXhwcmVzc2lvbiA9IGV4cHJlc3Npb247Ci0gICAgICAgIH0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21waWxlU3RyYXRlZ3kgeworICBwcm90ZWN0ZWQgcmVhZG9ubHkgRXhwcmVzc2lvbiBfZXhwcmVzc2lvbjsKIAotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgRXhwcmVzc2lvbiBDb21waWxlKCk7Ci0gICAgfQorICBwdWJsaWMgQ29tcGlsZVN0cmF0ZWd5KEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgIF9leHByZXNzaW9uID0gZXhwcmVzc2lvbjsKKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCBFeHByZXNzaW9uIENvbXBpbGUoKTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVN0cmF0ZWd5L0NvbXBpbGVTdHJhdGVneUZhY3RvcnkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVTdHJhdGVneS9Db21waWxlU3RyYXRlZ3lGYWN0b3J5LmNzCmluZGV4IDlkN2ZiMWYuLjk0NGEzYmYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVN0cmF0ZWd5L0NvbXBpbGVTdHJhdGVneUZhY3RvcnkuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlU3RyYXRlZ3kvQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeS5jcwpAQCAtMTMsNDEgKzEzLDMxIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CisKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuT3BlcmF0b3JzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguQ29tcGlsZVN0cmF0ZWd5Ci17Ci0gICAgcHVibGljIGNsYXNzIENvbXBpbGVTdHJhdGVneUZhY3RvcnkgOiBJQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeQotICAgIHsKLSAgICAgICAgcHVibGljIENvbXBpbGVTdHJhdGVneSBDcmVhdGUoRXhwcmVzc2lvbiBleHByZXNzaW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZXhwcmVzc2lvbi5PcGVyYXRvci5PcGVyYXRvciA9PSBPcGVyYXRvcnMuQ29uY2F0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQ29uY2F0U3RyYXRlZ3koZXhwcmVzc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0Q29tcGlsZVN0cmF0ZWd5KGV4cHJlc3Npb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguQ29tcGlsZVN0cmF0ZWd5OworCitwdWJsaWMgY2xhc3MgQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeSA6IElDb21waWxlU3RyYXRlZ3lGYWN0b3J5IHsKKyAgcHVibGljIENvbXBpbGVTdHJhdGVneSBDcmVhdGUoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7CisgICAgaWYgKGV4cHJlc3Npb24uT3BlcmF0b3IuT3BlcmF0b3IgPT0gT3BlcmF0b3JzLkNvbmNhdCkgeworICAgICAgcmV0dXJuIG5ldyBTdHJpbmdDb25jYXRTdHJhdGVneShleHByZXNzaW9uKTsKICAgICB9CisgICAgcmV0dXJuIG5ldyBEZWZhdWx0Q29tcGlsZVN0cmF0ZWd5KGV4cHJlc3Npb24pOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVTdHJhdGVneS9EZWZhdWx0Q29tcGlsZVN0cmF0ZWd5LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlU3RyYXRlZ3kvRGVmYXVsdENvbXBpbGVTdHJhdGVneS5jcwppbmRleCAzZmQ4MTU1Li4yNzQ3NWQxIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVTdHJhdGVneS9EZWZhdWx0Q29tcGlsZVN0cmF0ZWd5LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVN0cmF0ZWd5L0RlZmF1bHRDb21waWxlU3RyYXRlZ3kuY3MKQEAgLTEzLDM4ICsxMywyOSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguQ29tcGlsZVN0cmF0ZWd5Ci17Ci0gICAgcHVibGljIGNsYXNzIERlZmF1bHRDb21waWxlU3RyYXRlZ3kgOiBDb21waWxlU3RyYXRlZ3kKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBEZWZhdWx0Q29tcGlsZVN0cmF0ZWd5KEV4cHJlc3Npb24gZXhwcmVzc2lvbikKLSAgICAgICAgICAgIDogYmFzZShleHByZXNzaW9uKQotICAgICAgICB7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguQ29tcGlsZVN0cmF0ZWd5OwogCi0gICAgICAgIH0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIEV4cHJlc3Npb24gQ29tcGlsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfZXhwcmVzc2lvbi5NZXJnZVdpdGhOZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9CitwdWJsaWMgY2xhc3MgRGVmYXVsdENvbXBpbGVTdHJhdGVneSA6IENvbXBpbGVTdHJhdGVneSB7CisgIHB1YmxpYyBEZWZhdWx0Q29tcGlsZVN0cmF0ZWd5KEV4cHJlc3Npb24gZXhwcmVzc2lvbikKKyAgICAgIDogYmFzZShleHByZXNzaW9uKSB7fQorCisgIHB1YmxpYyBvdmVycmlkZSBFeHByZXNzaW9uIENvbXBpbGUoKSB7CisgICAgcmV0dXJuIF9leHByZXNzaW9uLk1lcmdlV2l0aE5leHQoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlU3RyYXRlZ3kvSUNvbXBpbGVTdHJhdGVneUZhY3RvcnkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVTdHJhdGVneS9JQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeS5jcwppbmRleCAyNmE1MjYzLi4xNmE1M2E0IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVTdHJhdGVneS9JQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbXBpbGVTdHJhdGVneS9JQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeS5jcwpAQCAtMTMsMzAgKzEzLDI0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5Db21waWxlU3RyYXRlZ3kKLXsKLSAgICBwdWJsaWMgaW50ZXJmYWNlIElDb21waWxlU3RyYXRlZ3lGYWN0b3J5Ci0gICAgewotICAgICAgICBDb21waWxlU3RyYXRlZ3kgQ3JlYXRlKEV4cHJlc3Npb24gZXhwcmVzc2lvbik7Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkNvbXBpbGVTdHJhdGVneTsKKworcHVibGljIGludGVyZmFjZSBJQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeSB7CisgIENvbXBpbGVTdHJhdGVneSBDcmVhdGUoRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29tcGlsZVN0cmF0ZWd5L1N0cmluZ0NvbmNhdFN0cmF0ZWd5LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlU3RyYXRlZ3kvU3RyaW5nQ29uY2F0U3RyYXRlZ3kuY3MKaW5kZXggOWJjMTEzNC4uNDQwM2FiOCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlU3RyYXRlZ3kvU3RyaW5nQ29uY2F0U3RyYXRlZ3kuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db21waWxlU3RyYXRlZ3kvU3RyaW5nQ29uY2F0U3RyYXRlZ3kuY3MKQEAgLTEzLDUwICsxMyw0MSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguQ29tcGlsZVN0cmF0ZWd5Ci17Ci0gICAgcHVibGljIGNsYXNzIFN0cmluZ0NvbmNhdFN0cmF0ZWd5IDogQ29tcGlsZVN0cmF0ZWd5Ci0gICAgewotICAgICAgICBwdWJsaWMgU3RyaW5nQ29uY2F0U3RyYXRlZ3koRXhwcmVzc2lvbiBleHByZXNzaW9uKQotICAgICAgICAgICAgOiBiYXNlKGV4cHJlc3Npb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgCi0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5Db21waWxlU3RyYXRlZ3k7CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIEV4cHJlc3Npb24gQ29tcGlsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBuZXdFeHAgPSBfZXhwcmVzc2lvbiBpcyBFeGNlbEFkZHJlc3NFeHByZXNzaW9uID8gX2V4cHJlc3Npb24gOiBFeHByZXNzaW9uQ29udmVydGVyLkluc3RhbmNlLlRvU3RyaW5nRXhwcmVzc2lvbihfZXhwcmVzc2lvbik7Ci0gICAgICAgICAgICBuZXdFeHAuUHJldiA9IF9leHByZXNzaW9uLlByZXY7Ci0gICAgICAgICAgICBuZXdFeHAuTmV4dCA9IF9leHByZXNzaW9uLk5leHQ7Ci0gICAgICAgICAgICBpZiAoX2V4cHJlc3Npb24uUHJldiAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9leHByZXNzaW9uLlByZXYuTmV4dCA9IG5ld0V4cDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChfZXhwcmVzc2lvbi5OZXh0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2V4cHJlc3Npb24uTmV4dC5QcmV2ID0gbmV3RXhwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ld0V4cC5NZXJnZVdpdGhOZXh0KCk7Ci0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBTdHJpbmdDb25jYXRTdHJhdGVneSA6IENvbXBpbGVTdHJhdGVneSB7CisgIHB1YmxpYyBTdHJpbmdDb25jYXRTdHJhdGVneShFeHByZXNzaW9uIGV4cHJlc3Npb24pCisgICAgICA6IGJhc2UoZXhwcmVzc2lvbikge30KKworICBwdWJsaWMgb3ZlcnJpZGUgRXhwcmVzc2lvbiBDb21waWxlKCkgeworICAgIHZhciBuZXdFeHAgPQorICAgICAgICBfZXhwcmVzc2lvbiBpcyBFeGNlbEFkZHJlc3NFeHByZXNzaW9uCisgICAgICAgICAgICA/IF9leHByZXNzaW9uCisgICAgICAgICAgICA6IEV4cHJlc3Npb25Db252ZXJ0ZXIuSW5zdGFuY2UuVG9TdHJpbmdFeHByZXNzaW9uKF9leHByZXNzaW9uKTsKKyAgICBuZXdFeHAuUHJldiA9IF9leHByZXNzaW9uLlByZXY7CisgICAgbmV3RXhwLk5leHQgPSBfZXhwcmVzc2lvbi5OZXh0OworICAgIGlmIChfZXhwcmVzc2lvbi5QcmV2ICE9IG51bGwpIHsKKyAgICAgIF9leHByZXNzaW9uLlByZXYuTmV4dCA9IG5ld0V4cDsKICAgICB9CisgICAgaWYgKF9leHByZXNzaW9uLk5leHQgIT0gbnVsbCkgeworICAgICAgX2V4cHJlc3Npb24uTmV4dC5QcmV2ID0gbmV3RXhwOworICAgIH0KKyAgICByZXR1cm4gbmV3RXhwLk1lcmdlV2l0aE5leHQoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db25zdGFudEV4cHJlc3Npb25zLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Db25zdGFudEV4cHJlc3Npb25zLmNzCmluZGV4IDE3YTllMGMuLjAwZmU5YzYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvQ29uc3RhbnRFeHByZXNzaW9ucy5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0NvbnN0YW50RXhwcmVzc2lvbnMuY3MKQEAgLTEsMzEgKzEsMjIgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbTsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25zdGFudEV4cHJlc3Npb25zCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIEV4cHJlc3Npb24gUGVyY2VudAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gbmV3IENvbnN0YW50RXhwcmVzc2lvbigiUGVyY2VudCIsICgpID0+IG5ldyBDb21waWxlUmVzdWx0KDAuMDEsIERhdGFUeXBlLkRlY2ltYWwpKTsgfQotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi0gICAgcHVibGljIGNsYXNzIENvbnN0YW50RXhwcmVzc2lvbiA6IEF0b21pY0V4cHJlc3Npb24KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRnVuYzxDb21waWxlUmVzdWx0PiBfZmFjdG9yeU1ldGhvZDsKK3B1YmxpYyBzdGF0aWMgY2xhc3MgQ29uc3RhbnRFeHByZXNzaW9ucyB7CisgIHB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbiBQZXJjZW50IHsKKyAgICBnZXQgeyByZXR1cm4gbmV3IENvbnN0YW50RXhwcmVzc2lvbigiUGVyY2VudCIsICgpID0+IG5ldygwLjAxLCBEYXRhVHlwZS5EZWNpbWFsKSk7IH0KKyAgfQorfQogCi0gICAgICAgIHB1YmxpYyBDb25zdGFudEV4cHJlc3Npb24oc3RyaW5nIHRpdGxlLCBGdW5jPENvbXBpbGVSZXN1bHQ+IGZhY3RvcnlNZXRob2QpCi0gICAgICAgICAgICA6IGJhc2UodGl0bGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9mYWN0b3J5TWV0aG9kID0gZmFjdG9yeU1ldGhvZDsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIENvbnN0YW50RXhwcmVzc2lvbiA6IEF0b21pY0V4cHJlc3Npb24geworICBwcml2YXRlIHJlYWRvbmx5IEZ1bmM8Q29tcGlsZVJlc3VsdD4gX2ZhY3RvcnlNZXRob2Q7CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfZmFjdG9yeU1ldGhvZCgpOwotICAgICAgICB9Ci0gICAgfQorICBwdWJsaWMgQ29uc3RhbnRFeHByZXNzaW9uKHN0cmluZyB0aXRsZSwgRnVuYzxDb21waWxlUmVzdWx0PiBmYWN0b3J5TWV0aG9kKQorICAgICAgOiBiYXNlKHRpdGxlKSB7CisgICAgX2ZhY3RvcnlNZXRob2QgPSBmYWN0b3J5TWV0aG9kOworICB9CisKKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpIHsKKyAgICByZXR1cm4gX2ZhY3RvcnlNZXRob2QoKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9EYXRhVHlwZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRGF0YVR5cGUuY3MKaW5kZXggYjExNWIwOC4uNDc1MWRmMyAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9EYXRhVHlwZS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0RhdGFUeXBlLmNzCkBAIC0xMyw0MCArMTMsMzQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0gICAgcHVibGljIGVudW0gRGF0YVR5cGUKLSAgICB7Ci0gICAgICAgIEludGVnZXIsCi0gICAgICAgIERlY2ltYWwsCi0gICAgICAgIFN0cmluZywKLSAgICAgICAgQm9vbGVhbiwKLSAgICAgICAgRGF0ZSwKLSAgICAgICAgVGltZSwKLSAgICAgICAgRW51bWVyYWJsZSwKLSAgICAgICAgTG9va3VwQXJyYXksCi0gICAgICAgIEV4Y2VsQWRkcmVzcywKLSAgICAgICAgRXhjZWxFcnJvciwKLSAgICAgICAgRW1wdHkKLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CisKK3B1YmxpYyBlbnVtIERhdGFUeXBlIHsKKyAgSW50ZWdlciwKKyAgRGVjaW1hbCwKKyAgU3RyaW5nLAorICBCb29sZWFuLAorICBEYXRlLAorICBUaW1lLAorICBFbnVtZXJhYmxlLAorICBMb29rdXBBcnJheSwKKyAgRXhjZWxBZGRyZXNzLAorICBFeGNlbEVycm9yLAorICBFbXB0eSwKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRGF0ZUV4cHJlc3Npb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0RhdGVFeHByZXNzaW9uLmNzCmluZGV4IDA1NmVmYzUuLjEyZTkzNDIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRGF0ZUV4cHJlc3Npb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9EYXRlRXhwcmVzc2lvbi5jcwpAQCAtMTMsNDEgKzEzLDMzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgRGF0ZUV4cHJlc3Npb24gOiBBdG9taWNFeHByZXNzaW9uCi0gICAgewotICAgICAgICBwdWJsaWMgRGF0ZUV4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24pCi0gICAgICAgICAgICA6IGJhc2UoZXhwcmVzc2lvbikKLSAgICAgICAgeworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBEYXRlRXhwcmVzc2lvbiA6IEF0b21pY0V4cHJlc3Npb24geworICBwdWJsaWMgRGF0ZUV4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24pCisgICAgICA6IGJhc2UoZXhwcmVzc2lvbikge30KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGRhdGUgPSBkb3VibGUuUGFyc2UoRXhwcmVzc2lvblN0cmluZyxDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChEYXRlVGltZS5Gcm9tT0FEYXRlKGRhdGUpLCBEYXRhVHlwZS5EYXRlKTsKLSAgICAgICAgfQotICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpIHsKKyAgICB2YXIgZGF0ZSA9IGRvdWJsZS5QYXJzZShFeHByZXNzaW9uU3RyaW5nLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICByZXR1cm4gbmV3KERhdGVUaW1lLkZyb21PQURhdGUoZGF0ZSksIERhdGFUeXBlLkRhdGUpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0RlY2ltYWxFeHByZXNzaW9uLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9EZWNpbWFsRXhwcmVzc2lvbi5jcwppbmRleCA2ZTNiYTUwLi45YzMyNjQ1IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0RlY2ltYWxFeHByZXNzaW9uLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRGVjaW1hbEV4cHJlc3Npb24uY3MKQEAgLTEsNSArMSw1IEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK++7v3VzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCkBAIC0xNSw2MSArMTUsNDggQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0gICAgcHVibGljIGNsYXNzIERlY2ltYWxFeHByZXNzaW9uIDogQXRvbWljRXhwcmVzc2lvbgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkb3VibGU/IF9jb21waWxlZFZhbHVlOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX25lZ2F0ZTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotICAgICAgICBwdWJsaWMgRGVjaW1hbEV4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24pCi0gICAgICAgICAgICA6IHRoaXMoZXhwcmVzc2lvbiwgZmFsc2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIAotICAgICAgICB9CitwdWJsaWMgY2xhc3MgRGVjaW1hbEV4cHJlc3Npb24gOiBBdG9taWNFeHByZXNzaW9uIHsKKyAgcHJpdmF0ZSByZWFkb25seSBkb3VibGU/IF9jb21waWxlZFZhbHVlOworICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX25lZ2F0ZTsKIAotICAgICAgICBwdWJsaWMgRGVjaW1hbEV4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24sIGJvb2wgbmVnYXRlKQotICAgICAgICAgICAgOiBiYXNlKGV4cHJlc3Npb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9uZWdhdGUgPSBuZWdhdGU7Ci0gICAgICAgIH0KKyAgcHVibGljIERlY2ltYWxFeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uKQorICAgICAgOiB0aGlzKGV4cHJlc3Npb24sIGZhbHNlKSB7fQogCi0gICAgICAgIHB1YmxpYyBEZWNpbWFsRXhwcmVzc2lvbihkb3VibGUgY29tcGlsZWRWYWx1ZSkKLSAgICAgICAgICAgIDogYmFzZShjb21waWxlZFZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKQotICAgICAgICB7Ci0gICAgICAgICAgICBfY29tcGlsZWRWYWx1ZSA9IGNvbXBpbGVkVmFsdWU7Ci0gICAgICAgIH0KKyAgcHVibGljIERlY2ltYWxFeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uLCBib29sIG5lZ2F0ZSkKKyAgICAgIDogYmFzZShleHByZXNzaW9uKSB7CisgICAgX25lZ2F0ZSA9IG5lZ2F0ZTsKKyAgfQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGUgcmVzdWx0ID0gX2NvbXBpbGVkVmFsdWUuSGFzVmFsdWUgPyBfY29tcGlsZWRWYWx1ZS5WYWx1ZSA6IGRvdWJsZS5QYXJzZShFeHByZXNzaW9uU3RyaW5nLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IF9uZWdhdGUgPyByZXN1bHQgKiAtMSA6IHJlc3VsdDsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOwotICAgICAgICB9CisgIHB1YmxpYyBEZWNpbWFsRXhwcmVzc2lvbihkb3VibGUgY29tcGlsZWRWYWx1ZSkKKyAgICAgIDogYmFzZShjb21waWxlZFZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKSB7CisgICAgX2NvbXBpbGVkVmFsdWUgPSBjb21waWxlZFZhbHVlOworICB9CiAKLSAgICAgICAgcHVibGljIGJvb2wgSXNOZWdhdGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfbmVnYXRlOyB9Ci0gICAgICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpIHsKKyAgICBkb3VibGUgcmVzdWx0ID0gX2NvbXBpbGVkVmFsdWUuSGFzVmFsdWUKKyAgICAgICAgPyBfY29tcGlsZWRWYWx1ZS5WYWx1ZQorICAgICAgICA6IGRvdWJsZS5QYXJzZShFeHByZXNzaW9uU3RyaW5nLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICByZXN1bHQgPSBfbmVnYXRlID8gcmVzdWx0ICogLTEgOiByZXN1bHQ7CisgICAgcmV0dXJuIG5ldyhyZXN1bHQsIERhdGFUeXBlLkRlY2ltYWwpOworICB9CiAKLSAgICB9CisgIHB1YmxpYyBib29sIElzTmVnYXRlZCA9PiBfbmVnYXRlOwogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FbnVtZXJhYmxlRXhwcmVzc2lvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRW51bWVyYWJsZUV4cHJlc3Npb24uY3MKaW5kZXggMzQ1YzkxNS4uNTZiMGZhOCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FbnVtZXJhYmxlRXhwcmVzc2lvbi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0VudW1lcmFibGVFeHByZXNzaW9uLmNzCkBAIC0xMyw2MSArMTMsNDcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgRW51bWVyYWJsZUV4cHJlc3Npb24gOiBFeHByZXNzaW9uCi0gICAgewotICAgICAgICBwdWJsaWMgRW51bWVyYWJsZUV4cHJlc3Npb24oKQotICAgICAgICAgICAgOiB0aGlzKG5ldyBFeHByZXNzaW9uQ29tcGlsZXIoKSkKLSAgICAgICAgeworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBFbnVtZXJhYmxlRXhwcmVzc2lvbiA6IEV4cHJlc3Npb24geworICBwdWJsaWMgRW51bWVyYWJsZUV4cHJlc3Npb24oKQorICAgICAgOiB0aGlzKG5ldyBFeHByZXNzaW9uQ29tcGlsZXIoKSkge30KIAotICAgICAgICBwdWJsaWMgRW51bWVyYWJsZUV4cHJlc3Npb24oSUV4cHJlc3Npb25Db21waWxlciBleHByZXNzaW9uQ29tcGlsZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9leHByZXNzaW9uQ29tcGlsZXIgPSBleHByZXNzaW9uQ29tcGlsZXI7Ci0gICAgICAgIH0KKyAgcHVibGljIEVudW1lcmFibGVFeHByZXNzaW9uKElFeHByZXNzaW9uQ29tcGlsZXIgZXhwcmVzc2lvbkNvbXBpbGVyKSB7CisgICAgX2V4cHJlc3Npb25Db21waWxlciA9IGV4cHJlc3Npb25Db21waWxlcjsKKyAgfQogCi0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUV4cHJlc3Npb25Db21waWxlciBfZXhwcmVzc2lvbkNvbXBpbGVyOworICBwcml2YXRlIHJlYWRvbmx5IElFeHByZXNzaW9uQ29tcGlsZXIgX2V4cHJlc3Npb25Db21waWxlcjsKIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0dyb3VwZWRFeHByZXNzaW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICB9CisgIHB1YmxpYyBvdmVycmlkZSBib29sIElzR3JvdXBlZEV4cHJlc3Npb24gPT4gZmFsc2U7CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIEV4cHJlc3Npb24gUHJlcGFyZUZvck5leHRDaGlsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9CisgIHB1YmxpYyBvdmVycmlkZSBFeHByZXNzaW9uIFByZXBhcmVGb3JOZXh0Q2hpbGQoKSB7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMaXN0PG9iamVjdD4oKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjaGlsZEV4cHJlc3Npb24gaW4gQ2hpbGRyZW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LkFkZChfZXhwcmVzc2lvbkNvbXBpbGVyLkNvbXBpbGUobmV3IExpc3Q8RXhwcmVzc2lvbj57IGNoaWxkRXhwcmVzc2lvbiB9KS5SZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KHJlc3VsdCwgRGF0YVR5cGUuRW51bWVyYWJsZSk7Ci0gICAgICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpIHsKKyAgICB2YXIgcmVzdWx0ID0gbmV3IExpc3Q8b2JqZWN0PigpOworICAgIGZvcmVhY2ggKHZhciBjaGlsZEV4cHJlc3Npb24gaW4gQ2hpbGRyZW4pIHsKKyAgICAgIHJlc3VsdC5BZGQoX2V4cHJlc3Npb25Db21waWxlci5Db21waWxlKG5ldyBMaXN0PEV4cHJlc3Npb24+IHsgY2hpbGRFeHByZXNzaW9uIH0pLlJlc3VsdCk7CiAgICAgfQorICAgIHJldHVybiBuZXcocmVzdWx0LCBEYXRhVHlwZS5FbnVtZXJhYmxlKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeGNlbEFkZHJlc3NFeHByZXNzaW9uLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeGNlbEFkZHJlc3NFeHByZXNzaW9uLmNzCmluZGV4IDE4NmM3MjYuLjRmNjhkMmMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhjZWxBZGRyZXNzRXhwcmVzc2lvbi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4Y2VsQWRkcmVzc0V4cHJlc3Npb24uY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDExNiArMTMsMTAxIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsQWRkcmVzc0V4cHJlc3Npb24gOiBBdG9taWNFeHByZXNzaW9uCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEV4Y2VsRGF0YVByb3ZpZGVyIF9leGNlbERhdGFQcm92aWRlcjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBQYXJzaW5nQ29udGV4dCBfcGFyc2luZ0NvbnRleHQ7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUmFuZ2VBZGRyZXNzRmFjdG9yeSBfcmFuZ2VBZGRyZXNzRmFjdG9yeTsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF9uZWdhdGU7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLSAgICAgICAgcHVibGljIEV4Y2VsQWRkcmVzc0V4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24sIEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkKLSAgICAgICAgICAgIDogdGhpcyhleHByZXNzaW9uLCBleGNlbERhdGFQcm92aWRlciwgcGFyc2luZ0NvbnRleHQsIG5ldyBSYW5nZUFkZHJlc3NGYWN0b3J5KGV4Y2VsRGF0YVByb3ZpZGVyKSwgZmFsc2UpCi0gICAgICAgIHsKK3B1YmxpYyBjbGFzcyBFeGNlbEFkZHJlc3NFeHByZXNzaW9uIDogQXRvbWljRXhwcmVzc2lvbiB7CisgIHByaXZhdGUgcmVhZG9ubHkgRXhjZWxEYXRhUHJvdmlkZXIgX2V4Y2VsRGF0YVByb3ZpZGVyOworICBwcml2YXRlIHJlYWRvbmx5IFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKKyAgcHJpdmF0ZSByZWFkb25seSBSYW5nZUFkZHJlc3NGYWN0b3J5IF9yYW5nZUFkZHJlc3NGYWN0b3J5OworICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX25lZ2F0ZTsKIAotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBFeGNlbEFkZHJlc3NFeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uLCBFeGNlbERhdGFQcm92aWRlciBleGNlbERhdGFQcm92aWRlciwgUGFyc2luZ0NvbnRleHQgcGFyc2luZ0NvbnRleHQsIGJvb2wgbmVnYXRlKQotICAgICAgICAgICAgOiB0aGlzKGV4cHJlc3Npb24sIGV4Y2VsRGF0YVByb3ZpZGVyLCBwYXJzaW5nQ29udGV4dCwgbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkoZXhjZWxEYXRhUHJvdmlkZXIpLCBuZWdhdGUpCi0gICAgICAgIHsKKyAgcHVibGljIEV4Y2VsQWRkcmVzc0V4cHJlc3Npb24oCisgICAgICBzdHJpbmcgZXhwcmVzc2lvbiwKKyAgICAgIEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLAorICAgICAgUGFyc2luZ0NvbnRleHQgcGFyc2luZ0NvbnRleHQpCisgICAgICA6IHRoaXMoZXhwcmVzc2lvbiwgZXhjZWxEYXRhUHJvdmlkZXIsIHBhcnNpbmdDb250ZXh0LCBuZXcoZXhjZWxEYXRhUHJvdmlkZXIpLCBmYWxzZSkge30KIAotICAgICAgICB9CisgIHB1YmxpYyBFeGNlbEFkZHJlc3NFeHByZXNzaW9uKAorICAgICAgc3RyaW5nIGV4cHJlc3Npb24sCisgICAgICBFeGNlbERhdGFQcm92aWRlciBleGNlbERhdGFQcm92aWRlciwKKyAgICAgIFBhcnNpbmdDb250ZXh0IHBhcnNpbmdDb250ZXh0LAorICAgICAgYm9vbCBuZWdhdGUpCisgICAgICA6IHRoaXMoZXhwcmVzc2lvbiwgZXhjZWxEYXRhUHJvdmlkZXIsIHBhcnNpbmdDb250ZXh0LCBuZXcoZXhjZWxEYXRhUHJvdmlkZXIpLCBuZWdhdGUpIHt9CiAKLSAgICAgICAgcHVibGljIEV4Y2VsQWRkcmVzc0V4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24sIEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCwgUmFuZ2VBZGRyZXNzRmFjdG9yeSByYW5nZUFkZHJlc3NGYWN0b3J5LCBib29sIG5lZ2F0ZSkKLSAgICAgICAgICAgIDogYmFzZShleHByZXNzaW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQoZXhjZWxEYXRhUHJvdmlkZXIpLk5hbWVkKCJleGNlbERhdGFQcm92aWRlciIpLklzTm90TnVsbCgpOwotICAgICAgICAgICAgUmVxdWlyZS5UaGF0KHBhcnNpbmdDb250ZXh0KS5OYW1lZCgicGFyc2luZ0NvbnRleHQiKS5Jc05vdE51bGwoKTsKLSAgICAgICAgICAgIFJlcXVpcmUuVGhhdChyYW5nZUFkZHJlc3NGYWN0b3J5KS5OYW1lZCgicmFuZ2VBZGRyZXNzRmFjdG9yeSIpLklzTm90TnVsbCgpOwotICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyID0gZXhjZWxEYXRhUHJvdmlkZXI7Ci0gICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQgPSBwYXJzaW5nQ29udGV4dDsKLSAgICAgICAgICAgIF9yYW5nZUFkZHJlc3NGYWN0b3J5ID0gcmFuZ2VBZGRyZXNzRmFjdG9yeTsKLSAgICAgICAgICAgIF9uZWdhdGUgPSBuZWdhdGU7Ci0gICAgICAgIH0KKyAgcHVibGljIEV4Y2VsQWRkcmVzc0V4cHJlc3Npb24oCisgICAgICBzdHJpbmcgZXhwcmVzc2lvbiwKKyAgICAgIEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLAorICAgICAgUGFyc2luZ0NvbnRleHQgcGFyc2luZ0NvbnRleHQsCisgICAgICBSYW5nZUFkZHJlc3NGYWN0b3J5IHJhbmdlQWRkcmVzc0ZhY3RvcnksCisgICAgICBib29sIG5lZ2F0ZSkKKyAgICAgIDogYmFzZShleHByZXNzaW9uKSB7CisgICAgUmVxdWlyZS5UaGF0KGV4Y2VsRGF0YVByb3ZpZGVyKS5OYW1lZCgiZXhjZWxEYXRhUHJvdmlkZXIiKS5Jc05vdE51bGwoKTsKKyAgICBSZXF1aXJlLlRoYXQocGFyc2luZ0NvbnRleHQpLk5hbWVkKCJwYXJzaW5nQ29udGV4dCIpLklzTm90TnVsbCgpOworICAgIFJlcXVpcmUuVGhhdChyYW5nZUFkZHJlc3NGYWN0b3J5KS5OYW1lZCgicmFuZ2VBZGRyZXNzRmFjdG9yeSIpLklzTm90TnVsbCgpOworICAgIF9leGNlbERhdGFQcm92aWRlciA9IGV4Y2VsRGF0YVByb3ZpZGVyOworICAgIF9wYXJzaW5nQ29udGV4dCA9IHBhcnNpbmdDb250ZXh0OworICAgIF9yYW5nZUFkZHJlc3NGYWN0b3J5ID0gcmFuZ2VBZGRyZXNzRmFjdG9yeTsKKyAgICBfbmVnYXRlID0gbmVnYXRlOworICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNHcm91cGVkRXhwcmVzc2lvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KLSAgICAgICAgfQorICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0dyb3VwZWRFeHByZXNzaW9uID0+IGZhbHNlOwogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUGFyZW50SXNMb29rdXBGdW5jdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQoRXhwcmVzc2lvblN0cmluZywgRGF0YVR5cGUuRXhjZWxBZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29tcGlsZVJhbmdlVmFsdWVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZVJhbmdlVmFsdWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGMgPSB0aGlzLl9wYXJzaW5nQ29udGV4dC5TY29wZXMuQ3VycmVudDsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfZXhjZWxEYXRhUHJvdmlkZXIuR2V0UmFuZ2UoYy5BZGRyZXNzLldvcmtzaGVldCwgYy5BZGRyZXNzLkZyb21Sb3csIGMuQWRkcmVzcy5Gcm9tQ29sLCBFeHByZXNzaW9uU3RyaW5nKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5Jc0VtcHR5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDb21waWxlUmVzdWx0LkVtcHR5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlc3VsdC5BZGRyZXNzLlJvd3MgPiAxIHx8IHJlc3VsdC5BZGRyZXNzLkNvbHVtbnMgPiAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkVudW1lcmFibGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDb21waWxlU2luZ2xlQ2VsbChyZXN1bHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBDb21waWxlUmVzdWx0IENvbXBpbGVTaW5nbGVDZWxsKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8gcmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgY2VsbCA9IHJlc3VsdC5GaXJzdCgpOwotICAgICAgICAgICAgdmFyIGZhY3RvcnkgPSBuZXcgQ29tcGlsZVJlc3VsdEZhY3RvcnkoKTsKLSAgICAgICAgICAgIHZhciBjb21waWxlUmVzdWx0ID0gZmFjdG9yeS5DcmVhdGUoY2VsbC5WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoX25lZ2F0ZSAmJiBjb21waWxlUmVzdWx0LklzTnVtZXJpYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb21waWxlUmVzdWx0ID0gbmV3IENvbXBpbGVSZXN1bHQoY29tcGlsZVJlc3VsdC5SZXN1bHROdW1lcmljICogLTEsIGNvbXBpbGVSZXN1bHQuRGF0YVR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29tcGlsZVJlc3VsdC5Jc0hpZGRlbkNlbGwgPSBjZWxsLklzSGlkZGVuUm93OwotICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVSZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbCBJc05lZ2F0ZWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9uZWdhdGU7IH0KLSAgICAgICAgfQotCisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoKSB7CisgICAgaWYgKFBhcmVudElzTG9va3VwRnVuY3Rpb24pIHsKKyAgICAgIHJldHVybiBuZXcoRXhwcmVzc2lvblN0cmluZywgRGF0YVR5cGUuRXhjZWxBZGRyZXNzKTsKICAgICB9CisgICAgcmV0dXJuIENvbXBpbGVSYW5nZVZhbHVlcygpOworICB9CisKKyAgcHJpdmF0ZSBDb21waWxlUmVzdWx0IENvbXBpbGVSYW5nZVZhbHVlcygpIHsKKyAgICB2YXIgYyA9IF9wYXJzaW5nQ29udGV4dC5TY29wZXMuQ3VycmVudDsKKyAgICB2YXIgcmVzdWx0ID0gX2V4Y2VsRGF0YVByb3ZpZGVyLkdldFJhbmdlKAorICAgICAgICBjLkFkZHJlc3MuV29ya3NoZWV0LAorICAgICAgICBjLkFkZHJlc3MuRnJvbVJvdywKKyAgICAgICAgYy5BZGRyZXNzLkZyb21Db2wsCisgICAgICAgIEV4cHJlc3Npb25TdHJpbmcpOworCisgICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5Jc0VtcHR5KSB7CisgICAgICByZXR1cm4gQ29tcGlsZVJlc3VsdC5FbXB0eTsKKyAgICB9CisgICAgaWYgKHJlc3VsdC5BZGRyZXNzLlJvd3MgPiAxIHx8IHJlc3VsdC5BZGRyZXNzLkNvbHVtbnMgPiAxKSB7CisgICAgICByZXR1cm4gbmV3KHJlc3VsdCwgRGF0YVR5cGUuRW51bWVyYWJsZSk7CisgICAgfQorICAgIHJldHVybiBDb21waWxlU2luZ2xlQ2VsbChyZXN1bHQpOworICB9CisKKyAgcHJpdmF0ZSBDb21waWxlUmVzdWx0IENvbXBpbGVTaW5nbGVDZWxsKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8gcmVzdWx0KSB7CisgICAgdmFyIGNlbGwgPSByZXN1bHQuRmlyc3QoKTsKKyAgICB2YXIgZmFjdG9yeSA9IG5ldyBDb21waWxlUmVzdWx0RmFjdG9yeSgpOworICAgIHZhciBjb21waWxlUmVzdWx0ID0gZmFjdG9yeS5DcmVhdGUoY2VsbC5WYWx1ZSk7CisgICAgaWYgKF9uZWdhdGUgJiYgY29tcGlsZVJlc3VsdC5Jc051bWVyaWMpIHsKKyAgICAgIGNvbXBpbGVSZXN1bHQgPSBuZXcoY29tcGlsZVJlc3VsdC5SZXN1bHROdW1lcmljICogLTEsIGNvbXBpbGVSZXN1bHQuRGF0YVR5cGUpOworICAgIH0KKyAgICBjb21waWxlUmVzdWx0LklzSGlkZGVuQ2VsbCA9IGNlbGwuSXNIaWRkZW5Sb3c7CisgICAgcmV0dXJuIGNvbXBpbGVSZXN1bHQ7CisgIH0KKworICBwdWJsaWMgYm9vbCBJc05lZ2F0ZWQgeworICAgIGdldCB7IHJldHVybiBfbmVnYXRlOyB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhjZWxFcnJvckV4cHJlc3Npb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4Y2VsRXJyb3JFeHByZXNzaW9uLmNzCmluZGV4IGQyNWU0NDYuLmZjZjRkZGQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhjZWxFcnJvckV4cHJlc3Npb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeGNlbEVycm9yRXhwcmVzc2lvbi5jcwpAQCAtMTMsNjIgKzEzLDQ2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxFcnJvckV4cHJlc3Npb24gOiBFeHByZXNzaW9uCi0gICAgewotICAgICAgICBFeGNlbEVycm9yVmFsdWUgX2Vycm9yOwotICAgICAgICBwdWJsaWMgRXhjZWxFcnJvckV4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24sIEV4Y2VsRXJyb3JWYWx1ZSBlcnJvcikKLSAgICAgICAgICAgIDogYmFzZShleHByZXNzaW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXJyb3IgPSBlcnJvcjsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi0gICAgICAgIHB1YmxpYyBFeGNlbEVycm9yRXhwcmVzc2lvbihFeGNlbEVycm9yVmFsdWUgZXJyb3IpCi0gICAgICAgICAgICA6IHRoaXMoZXJyb3IuVG9TdHJpbmcoKSwgZXJyb3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIAotICAgICAgICB9CitwdWJsaWMgY2xhc3MgRXhjZWxFcnJvckV4cHJlc3Npb24gOiBFeHByZXNzaW9uIHsKKyAgcHJpdmF0ZSBFeGNlbEVycm9yVmFsdWUgX2Vycm9yOwogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzR3JvdXBlZEV4cHJlc3Npb24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgICAgIH0KKyAgcHVibGljIEV4Y2VsRXJyb3JFeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uLCBFeGNlbEVycm9yVmFsdWUgZXJyb3IpCisgICAgICA6IGJhc2UoZXhwcmVzc2lvbikgeworICAgIF9lcnJvciA9IGVycm9yOworICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChfZXJyb3IsIERhdGFUeXBlLkV4Y2VsRXJyb3IpOwotICAgICAgICAgICAgLy9pZiAoUGFyZW50SXNMb29rdXBGdW5jdGlvbikKLSAgICAgICAgICAgIC8vewotICAgICAgICAgICAgLy8gICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KEV4cHJlc3Npb25TdHJpbmcsIERhdGFUeXBlLkV4Y2VsRXJyb3IpOwotICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAvL2Vsc2UKLSAgICAgICAgICAgIC8vewotICAgICAgICAgICAgLy8gICAgcmV0dXJuIENvbXBpbGVSYW5nZVZhbHVlcygpOwotICAgICAgICAgICAgLy99Ci0gICAgICAgIH0KLSAgICB9CisgIHB1YmxpYyBFeGNlbEVycm9yRXhwcmVzc2lvbihFeGNlbEVycm9yVmFsdWUgZXJyb3IpCisgICAgICA6IHRoaXMoZXJyb3IuVG9TdHJpbmcoKSwgZXJyb3IpIHt9CisKKyAgcHVibGljIG92ZXJyaWRlIGJvb2wgSXNHcm91cGVkRXhwcmVzc2lvbiA9PiBmYWxzZTsKKworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKCkgeworICAgIHJldHVybiBuZXcoX2Vycm9yLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgICAvL2lmIChQYXJlbnRJc0xvb2t1cEZ1bmN0aW9uKQorICAgIC8veworICAgIC8vICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChFeHByZXNzaW9uU3RyaW5nLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgICAvL30KKyAgICAvL2Vsc2UKKyAgICAvL3sKKyAgICAvLyAgICByZXR1cm4gQ29tcGlsZVJhbmdlVmFsdWVzKCk7CisgICAgLy99CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbi5jcwppbmRleCAyNzdiNzhhLi5lMzJlM2YwIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uLmNzCkBAIC0xMywxMTYgKzEzLDk3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuT3BlcmF0b3JzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKLXsKLSAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXhwcmVzc2lvbgotICAgIHsKLSAgICAgICAgcHVibGljIHN0cmluZyBFeHByZXNzaW9uU3RyaW5nIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IExpc3Q8RXhwcmVzc2lvbj4gX2NoaWxkcmVuID0gbmV3IExpc3Q8RXhwcmVzc2lvbj4oKTsKLSAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IENoaWxkcmVuIHsgZ2V0IHsgcmV0dXJuIF9jaGlsZHJlbjsgfSB9Ci0gICAgICAgIHB1YmxpYyBFeHByZXNzaW9uIE5leHQgeyBnZXQ7IHNldDsgfQotICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbiBQcmV2IHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgcHVibGljIElPcGVyYXRvciBPcGVyYXRvciB7IGdldDsgc2V0OyB9Ci0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIElzR3JvdXBlZEV4cHJlc3Npb24geyBnZXQ7IH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbigpCi0gICAgICAgIHsKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHByZXNzaW9uIHsKKyAgcHVibGljIHN0cmluZyBFeHByZXNzaW9uU3RyaW5nIHsgZ2V0OyBwcml2YXRlIHNldDsgfQogCi0gICAgICAgIH0KKyAgcHJpdmF0ZSByZWFkb25seSBMaXN0PEV4cHJlc3Npb24+IF9jaGlsZHJlbiA9IG5ldygpOwogCi0gICAgICAgIHB1YmxpYyBFeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeHByZXNzaW9uU3RyaW5nID0gZXhwcmVzc2lvbjsKLSAgICAgICAgICAgIE9wZXJhdG9yID0gbnVsbDsKLSAgICAgICAgfQorICBwdWJsaWMgSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gQ2hpbGRyZW4gPT4gX2NoaWxkcmVuOwogCi0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgUGFyZW50SXNMb29rdXBGdW5jdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KKyAgcHVibGljIEV4cHJlc3Npb24gTmV4dCB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgcHVibGljIHZpcnR1YWwgYm9vbCBIYXNDaGlsZHJlbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX2NoaWxkcmVuLkFueSgpOyB9Ci0gICAgICAgIH0KKyAgcHVibGljIEV4cHJlc3Npb24gUHJldiB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgcHVibGljIHZpcnR1YWwgRXhwcmVzc2lvbiAgUHJlcGFyZUZvck5leHRDaGlsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9CisgIHB1YmxpYyBJT3BlcmF0b3IgT3BlcmF0b3IgeyBnZXQ7IHNldDsgfQogCi0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIEV4cHJlc3Npb24gQWRkQ2hpbGQoRXhwcmVzc2lvbiBjaGlsZCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jaGlsZHJlbi5BbnkoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgbGFzdCA9IF9jaGlsZHJlbi5MYXN0KCk7Ci0gICAgICAgICAgICAgICAgY2hpbGQuUHJldiA9IGxhc3Q7Ci0gICAgICAgICAgICAgICAgbGFzdC5OZXh0ID0gY2hpbGQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfY2hpbGRyZW4uQWRkKGNoaWxkKTsKLSAgICAgICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAgICAgfQorICBwdWJsaWMgYWJzdHJhY3QgYm9vbCBJc0dyb3VwZWRFeHByZXNzaW9uIHsgZ2V0OyB9CiAKLSAgICAgICAgcHVibGljIHZpcnR1YWwgRXhwcmVzc2lvbiBNZXJnZVdpdGhOZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4cHJlc3Npb24gPSB0aGlzOwotICAgICAgICAgICAgaWYgKE5leHQgIT0gbnVsbCAmJiBPcGVyYXRvciAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBPcGVyYXRvci5BcHBseShDb21waWxlKCksIE5leHQuQ29tcGlsZSgpKTsKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gRXhwcmVzc2lvbkNvbnZlcnRlci5JbnN0YW5jZS5Gcm9tQ29tcGlsZVJlc3VsdChyZXN1bHQpOwotICAgICAgICAgICAgICAgIGlmIChleHByZXNzaW9uIGlzIEV4Y2VsRXJyb3JFeHByZXNzaW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5OZXh0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5QcmV2ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChOZXh0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLk9wZXJhdG9yID0gTmV4dC5PcGVyYXRvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbi5PcGVyYXRvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV4cHJlc3Npb24uTmV4dCA9IE5leHQuTmV4dDsKLSAgICAgICAgICAgICAgICBpZiAoZXhwcmVzc2lvbi5OZXh0ICE9IG51bGwpIGV4cHJlc3Npb24uTmV4dC5QcmV2ID0gZXhwcmVzc2lvbjsKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uLlByZXYgPSBQcmV2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IChuZXcgRm9ybWF0RXhjZXB0aW9uKCJJbnZhbGlkIGZvcm11bGEgc3ludGF4LiBPcGVyYXRvciBtaXNzaW5nIGV4cHJlc3Npb24uIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFByZXYgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQcmV2Lk5leHQgPSBleHByZXNzaW9uOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247Ci0gICAgICAgIH0KKyAgcHVibGljIEV4cHJlc3Npb24oKSB7fQogCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBDb21waWxlUmVzdWx0IENvbXBpbGUoKTsKKyAgcHVibGljIEV4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24pIHsKKyAgICBFeHByZXNzaW9uU3RyaW5nID0gZXhwcmVzc2lvbjsKKyAgICBPcGVyYXRvciA9IG51bGw7CisgIH0KIAorICBwdWJsaWMgdmlydHVhbCBib29sIFBhcmVudElzTG9va3VwRnVuY3Rpb24geyBnZXQ7IHNldDsgfQorCisgIHB1YmxpYyB2aXJ0dWFsIGJvb2wgSGFzQ2hpbGRyZW4gPT4gX2NoaWxkcmVuLkFueSgpOworCisgIHB1YmxpYyB2aXJ0dWFsIEV4cHJlc3Npb24gUHJlcGFyZUZvck5leHRDaGlsZCgpIHsKKyAgICByZXR1cm4gdGhpczsKKyAgfQorCisgIHB1YmxpYyB2aXJ0dWFsIEV4cHJlc3Npb24gQWRkQ2hpbGQoRXhwcmVzc2lvbiBjaGlsZCkgeworICAgIGlmIChfY2hpbGRyZW4uQW55KCkpIHsKKyAgICAgIHZhciBsYXN0ID0gX2NoaWxkcmVuLkxhc3QoKTsKKyAgICAgIGNoaWxkLlByZXYgPSBsYXN0OworICAgICAgbGFzdC5OZXh0ID0gY2hpbGQ7CiAgICAgfQorICAgIF9jaGlsZHJlbi5BZGQoY2hpbGQpOworICAgIHJldHVybiBjaGlsZDsKKyAgfQorCisgIHB1YmxpYyB2aXJ0dWFsIEV4cHJlc3Npb24gTWVyZ2VXaXRoTmV4dCgpIHsKKyAgICB2YXIgZXhwcmVzc2lvbiA9IHRoaXM7CisgICAgaWYgKE5leHQgIT0gbnVsbCAmJiBPcGVyYXRvciAhPSBudWxsKSB7CisgICAgICB2YXIgcmVzdWx0ID0gT3BlcmF0b3IuQXBwbHkoQ29tcGlsZSgpLCBOZXh0LkNvbXBpbGUoKSk7CisgICAgICBleHByZXNzaW9uID0gRXhwcmVzc2lvbkNvbnZlcnRlci5JbnN0YW5jZS5Gcm9tQ29tcGlsZVJlc3VsdChyZXN1bHQpOworICAgICAgaWYgKGV4cHJlc3Npb24gaXMgRXhjZWxFcnJvckV4cHJlc3Npb24pIHsKKyAgICAgICAgZXhwcmVzc2lvbi5OZXh0ID0gbnVsbDsKKyAgICAgICAgZXhwcmVzc2lvbi5QcmV2ID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247CisgICAgICB9CisgICAgICBpZiAoTmV4dCAhPSBudWxsKSB7CisgICAgICAgIGV4cHJlc3Npb24uT3BlcmF0b3IgPSBOZXh0Lk9wZXJhdG9yOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXhwcmVzc2lvbi5PcGVyYXRvciA9IG51bGw7CisgICAgICB9CisgICAgICBleHByZXNzaW9uLk5leHQgPSBOZXh0Lk5leHQ7CisgICAgICBpZiAoZXhwcmVzc2lvbi5OZXh0ICE9IG51bGwpIHsKKyAgICAgICAgZXhwcmVzc2lvbi5OZXh0LlByZXYgPSBleHByZXNzaW9uOworICAgICAgfQorICAgICAgZXhwcmVzc2lvbi5QcmV2ID0gUHJldjsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgKG5ldyBGb3JtYXRFeGNlcHRpb24oIkludmFsaWQgZm9ybXVsYSBzeW50YXguIE9wZXJhdG9yIG1pc3NpbmcgZXhwcmVzc2lvbi4iKSk7CisgICAgfQorICAgIGlmIChQcmV2ICE9IG51bGwpIHsKKyAgICAgIFByZXYuTmV4dCA9IGV4cHJlc3Npb247CisgICAgfQorICAgIHJldHVybiBleHByZXNzaW9uOworICB9CisKKyAgcHVibGljIGFic3RyYWN0IENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpOwogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uQ29tcGlsZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25Db21waWxlci5jcwppbmRleCBlOTJhYTc1Li40OWE0ZWNmIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25Db21waWxlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25Db21waWxlci5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTQ1ICsxMywxMzMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5Db21waWxlU3RyYXRlZ3k7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAotewotICAgIHB1YmxpYyBjbGFzcyBFeHByZXNzaW9uQ29tcGlsZXIgOiBJRXhwcmVzc2lvbkNvbXBpbGVyCi0gICAgewotICAgICAgICBwcml2YXRlIElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IF9leHByZXNzaW9uczsKLSAgICAgICAgcHJpdmF0ZSBJRXhwcmVzc2lvbkNvbnZlcnRlciBfZXhwcmVzc2lvbkNvbnZlcnRlcjsKLSAgICAgICAgcHJpdmF0ZSBJQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeSBfY29tcGlsZVN0cmF0ZWd5RmFjdG9yeTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbkNvbXBpbGVyKCkKLSAgICAgICAgICAgIDogdGhpcyhuZXcgRXhwcmVzc2lvbkNvbnZlcnRlcigpLCBuZXcgQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeSgpKQotICAgICAgICB7Ci0gCi0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBFeHByZXNzaW9uQ29tcGlsZXIgOiBJRXhwcmVzc2lvbkNvbXBpbGVyIHsKKyAgcHJpdmF0ZSBJRW51bWVyYWJsZTxFeHByZXNzaW9uPiBfZXhwcmVzc2lvbnM7CisgIHByaXZhdGUgSUV4cHJlc3Npb25Db252ZXJ0ZXIgX2V4cHJlc3Npb25Db252ZXJ0ZXI7CisgIHByaXZhdGUgSUNvbXBpbGVTdHJhdGVneUZhY3RvcnkgX2NvbXBpbGVTdHJhdGVneUZhY3Rvcnk7CiAKLSAgICAgICAgcHVibGljIEV4cHJlc3Npb25Db21waWxlcihJRXhwcmVzc2lvbkNvbnZlcnRlciBleHByZXNzaW9uQ29udmVydGVyLCBJQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeSBjb21waWxlU3RyYXRlZ3lGYWN0b3J5KQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXhwcmVzc2lvbkNvbnZlcnRlciA9IGV4cHJlc3Npb25Db252ZXJ0ZXI7Ci0gICAgICAgICAgICBfY29tcGlsZVN0cmF0ZWd5RmFjdG9yeSA9IGNvbXBpbGVTdHJhdGVneUZhY3Rvcnk7Ci0gICAgICAgIH0KKyAgcHVibGljIEV4cHJlc3Npb25Db21waWxlcigpCisgICAgICA6IHRoaXMobmV3IEV4cHJlc3Npb25Db252ZXJ0ZXIoKSwgbmV3IENvbXBpbGVTdHJhdGVneUZhY3RvcnkoKSkge30KIAotICAgICAgICBwdWJsaWMgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGV4cHJlc3Npb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXhwcmVzc2lvbnMgPSBleHByZXNzaW9uczsKLSAgICAgICAgICAgIHJldHVybiBQZXJmb3JtQ29tcGlsYXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgQ29tcGlsZVJlc3VsdCBDb21waWxlKHN0cmluZyB3b3Jrc2hlZXQsIGludCByb3csIGludCBjb2x1bW4sIElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGV4cHJlc3Npb25zKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXhwcmVzc2lvbnMgPSBleHByZXNzaW9uczsKLSAgICAgICAgICAgIHJldHVybiBQZXJmb3JtQ29tcGlsYXRpb24od29ya3NoZWV0LCByb3csIGNvbHVtbik7Ci0gICAgICAgIH0KKyAgcHVibGljIEV4cHJlc3Npb25Db21waWxlcigKKyAgICAgIElFeHByZXNzaW9uQ29udmVydGVyIGV4cHJlc3Npb25Db252ZXJ0ZXIsCisgICAgICBJQ29tcGlsZVN0cmF0ZWd5RmFjdG9yeSBjb21waWxlU3RyYXRlZ3lGYWN0b3J5KSB7CisgICAgX2V4cHJlc3Npb25Db252ZXJ0ZXIgPSBleHByZXNzaW9uQ29udmVydGVyOworICAgIF9jb21waWxlU3RyYXRlZ3lGYWN0b3J5ID0gY29tcGlsZVN0cmF0ZWd5RmFjdG9yeTsKKyAgfQogCi0gICAgICAgIHByaXZhdGUgQ29tcGlsZVJlc3VsdCBQZXJmb3JtQ29tcGlsYXRpb24oc3RyaW5nIHdvcmtzaGVldD0iIiwgaW50IHJvdz0tMSwgaW50IGNvbHVtbj0tMSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGNvbXBpbGVkRXhwcmVzc2lvbnMgPSBIYW5kbGVHcm91cGVkRXhwcmVzc2lvbnMoKTsKLSAgICAgICAgICAgIHdoaWxlKGNvbXBpbGVkRXhwcmVzc2lvbnMuQW55KHggPT4geC5PcGVyYXRvciAhPSBudWxsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgcHJlYyA9IEZpbmRMb3dlc3RQcmVjZWRlbmNlKCk7Ci0gICAgICAgICAgICAgICAgY29tcGlsZWRFeHByZXNzaW9ucyA9IEhhbmRsZVByZWNlZGVuY2VMZXZlbChwcmVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChfZXhwcmVzc2lvbnMuQW55KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVkRXhwcmVzc2lvbnMuRmlyc3QoKS5Db21waWxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQ29tcGlsZVJlc3VsdC5FbXB0eTsKLSAgICAgICAgfQorICBwdWJsaWMgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGV4cHJlc3Npb25zKSB7CisgICAgX2V4cHJlc3Npb25zID0gZXhwcmVzc2lvbnM7CisgICAgcmV0dXJuIFBlcmZvcm1Db21waWxhdGlvbigpOworICB9CiAKLSAgICAgICAgcHJpdmF0ZSBJRW51bWVyYWJsZTxFeHByZXNzaW9uPiBIYW5kbGVHcm91cGVkRXhwcmVzc2lvbnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIV9leHByZXNzaW9ucy5BbnkoKSkgcmV0dXJuIEVudW1lcmFibGUuRW1wdHk8RXhwcmVzc2lvbj4oKTsKLSAgICAgICAgICAgIHZhciBmaXJzdCA9IF9leHByZXNzaW9ucy5GaXJzdCgpOwotICAgICAgICAgICAgdmFyIGdyb3VwZWRFeHByZXNzaW9ucyA9IF9leHByZXNzaW9ucy5XaGVyZSh4ID0+IHguSXNHcm91cGVkRXhwcmVzc2lvbik7Ci0gICAgICAgICAgICBmb3JlYWNoKHZhciBncm91cGVkRXhwcmVzc2lvbiBpbiBncm91cGVkRXhwcmVzc2lvbnMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGdyb3VwZWRFeHByZXNzaW9uLkNvbXBpbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IENvbXBpbGVSZXN1bHQuRW1wdHkpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIHZhciBuZXdFeHAgPSBfZXhwcmVzc2lvbkNvbnZlcnRlci5Gcm9tQ29tcGlsZVJlc3VsdChyZXN1bHQpOwotICAgICAgICAgICAgICAgIG5ld0V4cC5PcGVyYXRvciA9IGdyb3VwZWRFeHByZXNzaW9uLk9wZXJhdG9yOwotICAgICAgICAgICAgICAgIG5ld0V4cC5QcmV2ID0gZ3JvdXBlZEV4cHJlc3Npb24uUHJldjsKLSAgICAgICAgICAgICAgICBuZXdFeHAuTmV4dCA9IGdyb3VwZWRFeHByZXNzaW9uLk5leHQ7Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3VwZWRFeHByZXNzaW9uLlByZXYgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRFeHByZXNzaW9uLlByZXYuTmV4dCA9IG5ld0V4cDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3VwZWRFeHByZXNzaW9uLk5leHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRFeHByZXNzaW9uLk5leHQuUHJldiA9IG5ld0V4cDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3VwZWRFeHByZXNzaW9uID09IGZpcnN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBuZXdFeHA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFJlZnJlc2hMaXN0KGZpcnN0KTsKLSAgICAgICAgfQorICBwdWJsaWMgQ29tcGlsZVJlc3VsdCBDb21waWxlKAorICAgICAgc3RyaW5nIHdvcmtzaGVldCwKKyAgICAgIGludCByb3csCisgICAgICBpbnQgY29sdW1uLAorICAgICAgSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMpIHsKKyAgICBfZXhwcmVzc2lvbnMgPSBleHByZXNzaW9uczsKKyAgICByZXR1cm4gUGVyZm9ybUNvbXBpbGF0aW9uKHdvcmtzaGVldCwgcm93LCBjb2x1bW4pOworICB9CiAKLSAgICAgICAgcHJpdmF0ZSBJRW51bWVyYWJsZTxFeHByZXNzaW9uPiBIYW5kbGVQcmVjZWRlbmNlTGV2ZWwoaW50IHByZWNlZGVuY2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmaXJzdCA9IF9leHByZXNzaW9ucy5GaXJzdCgpOwotICAgICAgICAgICAgdmFyIGV4cHJlc3Npb25zVG9IYW5kbGUgPSBfZXhwcmVzc2lvbnMuV2hlcmUoeCA9PiB4Lk9wZXJhdG9yICE9IG51bGwgJiYgeC5PcGVyYXRvci5QcmVjZWRlbmNlID09IHByZWNlZGVuY2UpOwotICAgICAgICAgICAgdmFyIGxhc3QgPSBleHByZXNzaW9uc1RvSGFuZGxlLkxhc3QoKTsKLSAgICAgICAgICAgIHZhciBleHByZXNzaW9uID0gZXhwcmVzc2lvbnNUb0hhbmRsZS5GaXJzdCgpOwotICAgICAgICAgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc3RyYXRlZ3kgPSBfY29tcGlsZVN0cmF0ZWd5RmFjdG9yeS5DcmVhdGUoZXhwcmVzc2lvbik7Ci0gICAgICAgICAgICAgICAgdmFyIGNvbXBpbGVkRXhwcmVzc2lvbiA9IHN0cmF0ZWd5LkNvbXBpbGUoKTsKLSAgICAgICAgICAgICAgICBpZihjb21waWxlZEV4cHJlc3Npb24gaXMgRXhjZWxFcnJvckV4cHJlc3Npb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmcmVzaExpc3QoY29tcGlsZWRFeHByZXNzaW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGV4cHJlc3Npb24gPT0gZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGNvbXBpbGVkRXhwcmVzc2lvbjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBleHByZXNzaW9uID0gY29tcGlsZWRFeHByZXNzaW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKGV4cHJlc3Npb24gIT0gbnVsbCAmJiBleHByZXNzaW9uLk9wZXJhdG9yICE9IG51bGwgJiYgZXhwcmVzc2lvbi5PcGVyYXRvci5QcmVjZWRlbmNlID09IHByZWNlZGVuY2UpOwotICAgICAgICAgICAgcmV0dXJuIFJlZnJlc2hMaXN0KGZpcnN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IEZpbmRMb3dlc3RQcmVjZWRlbmNlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9leHByZXNzaW9ucy5XaGVyZSh4ID0+IHguT3BlcmF0b3IgIT0gbnVsbCkuTWluKHggPT4geC5PcGVyYXRvci5QcmVjZWRlbmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gUmVmcmVzaExpc3QoRXhwcmVzc2lvbiBmaXJzdCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlc3VsdExpc3QgPSBuZXcgTGlzdDxFeHByZXNzaW9uPigpOwotICAgICAgICAgICAgdmFyIGV4cCA9IGZpcnN0OwotICAgICAgICAgICAgcmVzdWx0TGlzdC5BZGQoZXhwKTsKLSAgICAgICAgICAgIHdoaWxlIChleHAuTmV4dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdExpc3QuQWRkKGV4cC5OZXh0KTsKLSAgICAgICAgICAgICAgICBleHAgPSBleHAuTmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9leHByZXNzaW9ucyA9IHJlc3VsdExpc3Q7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0TGlzdDsKLSAgICAgICAgfQorICBwcml2YXRlIENvbXBpbGVSZXN1bHQgUGVyZm9ybUNvbXBpbGF0aW9uKHN0cmluZyB3b3Jrc2hlZXQgPSAiIiwgaW50IHJvdyA9IC0xLCBpbnQgY29sdW1uID0gLTEpIHsKKyAgICB2YXIgY29tcGlsZWRFeHByZXNzaW9ucyA9IEhhbmRsZUdyb3VwZWRFeHByZXNzaW9ucygpOworICAgIHdoaWxlIChjb21waWxlZEV4cHJlc3Npb25zLkFueSh4ID0+IHguT3BlcmF0b3IgIT0gbnVsbCkpIHsKKyAgICAgIHZhciBwcmVjID0gRmluZExvd2VzdFByZWNlZGVuY2UoKTsKKyAgICAgIGNvbXBpbGVkRXhwcmVzc2lvbnMgPSBIYW5kbGVQcmVjZWRlbmNlTGV2ZWwocHJlYyk7CiAgICAgfQorICAgIGlmIChfZXhwcmVzc2lvbnMuQW55KCkpIHsKKyAgICAgIHJldHVybiBjb21waWxlZEV4cHJlc3Npb25zLkZpcnN0KCkuQ29tcGlsZSgpOworICAgIH0KKyAgICByZXR1cm4gQ29tcGlsZVJlc3VsdC5FbXB0eTsKKyAgfQorCisgIHByaXZhdGUgSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gSGFuZGxlR3JvdXBlZEV4cHJlc3Npb25zKCkgeworICAgIGlmICghX2V4cHJlc3Npb25zLkFueSgpKSB7CisgICAgICByZXR1cm4gRW51bWVyYWJsZS5FbXB0eTxFeHByZXNzaW9uPigpOworICAgIH0KKyAgICB2YXIgZmlyc3QgPSBfZXhwcmVzc2lvbnMuRmlyc3QoKTsKKyAgICB2YXIgZ3JvdXBlZEV4cHJlc3Npb25zID0gX2V4cHJlc3Npb25zLldoZXJlKHggPT4geC5Jc0dyb3VwZWRFeHByZXNzaW9uKTsKKyAgICBmb3JlYWNoICh2YXIgZ3JvdXBlZEV4cHJlc3Npb24gaW4gZ3JvdXBlZEV4cHJlc3Npb25zKSB7CisgICAgICB2YXIgcmVzdWx0ID0gZ3JvdXBlZEV4cHJlc3Npb24uQ29tcGlsZSgpOworICAgICAgaWYgKHJlc3VsdCA9PSBDb21waWxlUmVzdWx0LkVtcHR5KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdmFyIG5ld0V4cCA9IF9leHByZXNzaW9uQ29udmVydGVyLkZyb21Db21waWxlUmVzdWx0KHJlc3VsdCk7CisgICAgICBuZXdFeHAuT3BlcmF0b3IgPSBncm91cGVkRXhwcmVzc2lvbi5PcGVyYXRvcjsKKyAgICAgIG5ld0V4cC5QcmV2ID0gZ3JvdXBlZEV4cHJlc3Npb24uUHJldjsKKyAgICAgIG5ld0V4cC5OZXh0ID0gZ3JvdXBlZEV4cHJlc3Npb24uTmV4dDsKKyAgICAgIGlmIChncm91cGVkRXhwcmVzc2lvbi5QcmV2ICE9IG51bGwpIHsKKyAgICAgICAgZ3JvdXBlZEV4cHJlc3Npb24uUHJldi5OZXh0ID0gbmV3RXhwOworICAgICAgfQorICAgICAgaWYgKGdyb3VwZWRFeHByZXNzaW9uLk5leHQgIT0gbnVsbCkgeworICAgICAgICBncm91cGVkRXhwcmVzc2lvbi5OZXh0LlByZXYgPSBuZXdFeHA7CisgICAgICB9CisgICAgICBpZiAoZ3JvdXBlZEV4cHJlc3Npb24gPT0gZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBuZXdFeHA7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBSZWZyZXNoTGlzdChmaXJzdCk7CisgIH0KKworICBwcml2YXRlIElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IEhhbmRsZVByZWNlZGVuY2VMZXZlbChpbnQgcHJlY2VkZW5jZSkgeworICAgIHZhciBmaXJzdCA9IF9leHByZXNzaW9ucy5GaXJzdCgpOworICAgIHZhciBleHByZXNzaW9uc1RvSGFuZGxlID0gX2V4cHJlc3Npb25zLldoZXJlKHggPT4KKyAgICAgICAgeC5PcGVyYXRvciAhPSBudWxsICYmIHguT3BlcmF0b3IuUHJlY2VkZW5jZSA9PSBwcmVjZWRlbmNlKTsKKyAgICB2YXIgbGFzdCA9IGV4cHJlc3Npb25zVG9IYW5kbGUuTGFzdCgpOworICAgIHZhciBleHByZXNzaW9uID0gZXhwcmVzc2lvbnNUb0hhbmRsZS5GaXJzdCgpOworICAgIGRvIHsKKyAgICAgIHZhciBzdHJhdGVneSA9IF9jb21waWxlU3RyYXRlZ3lGYWN0b3J5LkNyZWF0ZShleHByZXNzaW9uKTsKKyAgICAgIHZhciBjb21waWxlZEV4cHJlc3Npb24gPSBzdHJhdGVneS5Db21waWxlKCk7CisgICAgICBpZiAoY29tcGlsZWRFeHByZXNzaW9uIGlzIEV4Y2VsRXJyb3JFeHByZXNzaW9uKSB7CisgICAgICAgIHJldHVybiBSZWZyZXNoTGlzdChjb21waWxlZEV4cHJlc3Npb24pOworICAgICAgfQorICAgICAgaWYgKGV4cHJlc3Npb24gPT0gZmlyc3QpIHsKKyAgICAgICAgZmlyc3QgPSBjb21waWxlZEV4cHJlc3Npb247CisgICAgICB9CisKKyAgICAgIGV4cHJlc3Npb24gPSBjb21waWxlZEV4cHJlc3Npb247CisgICAgfSB3aGlsZSAoZXhwcmVzc2lvbiAhPSBudWxsCisgICAgICAgICAgICAmJiBleHByZXNzaW9uLk9wZXJhdG9yICE9IG51bGwKKyAgICAgICAgICAgICYmIGV4cHJlc3Npb24uT3BlcmF0b3IuUHJlY2VkZW5jZSA9PSBwcmVjZWRlbmNlKTsKKyAgICByZXR1cm4gUmVmcmVzaExpc3QoZmlyc3QpOworICB9CisKKyAgcHJpdmF0ZSBpbnQgRmluZExvd2VzdFByZWNlZGVuY2UoKSB7CisgICAgcmV0dXJuIF9leHByZXNzaW9ucy5XaGVyZSh4ID0+IHguT3BlcmF0b3IgIT0gbnVsbCkuTWluKHggPT4geC5PcGVyYXRvci5QcmVjZWRlbmNlKTsKKyAgfQorCisgIHByaXZhdGUgSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gUmVmcmVzaExpc3QoRXhwcmVzc2lvbiBmaXJzdCkgeworICAgIHZhciByZXN1bHRMaXN0ID0gbmV3IExpc3Q8RXhwcmVzc2lvbj4oKTsKKyAgICB2YXIgZXhwID0gZmlyc3Q7CisgICAgcmVzdWx0TGlzdC5BZGQoZXhwKTsKKyAgICB3aGlsZSAoZXhwLk5leHQgIT0gbnVsbCkgeworICAgICAgcmVzdWx0TGlzdC5BZGQoZXhwLk5leHQpOworICAgICAgZXhwID0gZXhwLk5leHQ7CisgICAgfQorICAgIF9leHByZXNzaW9ucyA9IHJlc3VsdExpc3Q7CisgICAgcmV0dXJuIHJlc3VsdExpc3Q7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkNvbnZlcnRlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkNvbnZlcnRlci5jcwppbmRleCBhM2E0MjQ4Li4zMzliNzU3IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25Db252ZXJ0ZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uQ29udmVydGVyLmNzCkBAIC0xMyw4MyArMTMsNzMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAotewotICAgIHB1YmxpYyBjbGFzcyBFeHByZXNzaW9uQ29udmVydGVyIDogSUV4cHJlc3Npb25Db252ZXJ0ZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBTdHJpbmdFeHByZXNzaW9uIFRvU3RyaW5nRXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBleHByZXNzaW9uLkNvbXBpbGUoKTsKLSAgICAgICAgICAgIHZhciBuZXdFeHAgPSBuZXcgU3RyaW5nRXhwcmVzc2lvbihyZXN1bHQuUmVzdWx0LlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgbmV3RXhwLk9wZXJhdG9yID0gZXhwcmVzc2lvbi5PcGVyYXRvcjsKLSAgICAgICAgICAgIHJldHVybiBuZXdFeHA7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKIAotICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbiBGcm9tQ29tcGlsZVJlc3VsdChDb21waWxlUmVzdWx0IGNvbXBpbGVSZXN1bHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoY29tcGlsZVJlc3VsdC5EYXRhVHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkludGVnZXI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21waWxlUmVzdWx0LlJlc3VsdCBpcyBzdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IEludGVnZXJFeHByZXNzaW9uKGNvbXBpbGVSZXN1bHQuUmVzdWx0LlRvU3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBJbnRlZ2VyRXhwcmVzc2lvbihDb252ZXJ0LlRvRG91YmxlKGNvbXBpbGVSZXN1bHQuUmVzdWx0KSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nRXhwcmVzc2lvbihjb21waWxlUmVzdWx0LlJlc3VsdC5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBjYXNlIERhdGFUeXBlLkRlY2ltYWw6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21waWxlUmVzdWx0LlJlc3VsdCBpcyBzdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBEZWNpbWFsRXhwcmVzc2lvbihjb21waWxlUmVzdWx0LlJlc3VsdC5Ub1N0cmluZygpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IERlY2ltYWxFeHByZXNzaW9uKCgoZG91YmxlKSBjb21waWxlUmVzdWx0LlJlc3VsdCkpOwotICAgICAgICAgICAgICAgIGNhc2UgRGF0YVR5cGUuQm9vbGVhbjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVSZXN1bHQuUmVzdWx0IGlzIHN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IEJvb2xlYW5FeHByZXNzaW9uKGNvbXBpbGVSZXN1bHQuUmVzdWx0LlRvU3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgQm9vbGVhbkV4cHJlc3Npb24oKGJvb2wpIGNvbXBpbGVSZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAvL2Nhc2UgRGF0YVR5cGUuRW51bWVyYWJsZToKLSAgICAgICAgICAgICAgICAvLyAgICByZXR1cm4gCi0gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5FeGNlbEVycm9yOgotICAgICAgICAgICAgICAgICAgICAvL3Rocm93IChuZXcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zLkV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbigoRXhjZWxFcnJvclZhbHVlKWNvbXBpbGVSZXN1bHQuUmVzdWx0KSk7IC8vQWRkZWQgSksKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVSZXN1bHQuUmVzdWx0IGlzIHN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgRXhjZWxFcnJvckV4cHJlc3Npb24oY29tcGlsZVJlc3VsdC5SZXN1bHQuVG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbEVycm9yVmFsdWUuUGFyc2UoY29tcGlsZVJlc3VsdC5SZXN1bHQuVG9TdHJpbmcoKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBFeGNlbEVycm9yRXhwcmVzc2lvbigoRXhjZWxFcnJvclZhbHVlKSBjb21waWxlUmVzdWx0LlJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBEYXRhVHlwZS5FbXB0eToKLSAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXJFeHByZXNzaW9uKDApOyAvL0FkZGVkIEpLCitwdWJsaWMgY2xhc3MgRXhwcmVzc2lvbkNvbnZlcnRlciA6IElFeHByZXNzaW9uQ29udmVydGVyIHsKKyAgcHVibGljIFN0cmluZ0V4cHJlc3Npb24gVG9TdHJpbmdFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgIHZhciByZXN1bHQgPSBleHByZXNzaW9uLkNvbXBpbGUoKTsKKyAgICB2YXIgbmV3RXhwID0gbmV3IFN0cmluZ0V4cHJlc3Npb24ocmVzdWx0LlJlc3VsdC5Ub1N0cmluZygpKTsKKyAgICBuZXdFeHAuT3BlcmF0b3IgPSBleHByZXNzaW9uLk9wZXJhdG9yOworICAgIHJldHVybiBuZXdFeHA7CisgIH0KIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBJRXhwcmVzc2lvbkNvbnZlcnRlciBfaW5zdGFuY2U7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgSUV4cHJlc3Npb25Db252ZXJ0ZXIgSW5zdGFuY2UKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9pbnN0YW5jZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2luc3RhbmNlID0gbmV3IEV4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9pbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBwdWJsaWMgRXhwcmVzc2lvbiBGcm9tQ29tcGlsZVJlc3VsdChDb21waWxlUmVzdWx0IGNvbXBpbGVSZXN1bHQpIHsKKyAgICBzd2l0Y2ggKGNvbXBpbGVSZXN1bHQuRGF0YVR5cGUpIHsKKyAgICAgIGNhc2UgRGF0YVR5cGUuSW50ZWdlcjoKKyAgICAgICAgcmV0dXJuIGNvbXBpbGVSZXN1bHQuUmVzdWx0IGlzIHN0cmluZworICAgICAgICAgICAgPyBuZXcoY29tcGlsZVJlc3VsdC5SZXN1bHQuVG9TdHJpbmcoKSkKKyAgICAgICAgICAgIDogbmV3IEludGVnZXJFeHByZXNzaW9uKENvbnZlcnQuVG9Eb3VibGUoY29tcGlsZVJlc3VsdC5SZXN1bHQpKTsKKyAgICAgIGNhc2UgRGF0YVR5cGUuU3RyaW5nOgorICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0V4cHJlc3Npb24oY29tcGlsZVJlc3VsdC5SZXN1bHQuVG9TdHJpbmcoKSk7CisgICAgICBjYXNlIERhdGFUeXBlLkRlY2ltYWw6CisgICAgICAgIHJldHVybiBjb21waWxlUmVzdWx0LlJlc3VsdCBpcyBzdHJpbmcKKyAgICAgICAgICAgID8gbmV3KGNvbXBpbGVSZXN1bHQuUmVzdWx0LlRvU3RyaW5nKCkpCisgICAgICAgICAgICA6IG5ldyBEZWNpbWFsRXhwcmVzc2lvbigoKGRvdWJsZSljb21waWxlUmVzdWx0LlJlc3VsdCkpOworICAgICAgY2FzZSBEYXRhVHlwZS5Cb29sZWFuOgorICAgICAgICByZXR1cm4gY29tcGlsZVJlc3VsdC5SZXN1bHQgaXMgc3RyaW5nCisgICAgICAgICAgICA/IG5ldyhjb21waWxlUmVzdWx0LlJlc3VsdC5Ub1N0cmluZygpKQorICAgICAgICAgICAgOiBuZXcgQm9vbGVhbkV4cHJlc3Npb24oKGJvb2wpY29tcGlsZVJlc3VsdC5SZXN1bHQpOworICAgICAgLy9jYXNlIERhdGFUeXBlLkVudW1lcmFibGU6CisgICAgICAvLyAgICByZXR1cm4KKyAgICAgIGNhc2UgRGF0YVR5cGUuRXhjZWxFcnJvcjoKKyAgICAgICAgLy90aHJvdyAobmV3IE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9ucy5FeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oKEV4Y2VsRXJyb3JWYWx1ZSljb21waWxlUmVzdWx0LlJlc3VsdCkpOyAvL0FkZGVkIEpLCisgICAgICAgIHJldHVybiBjb21waWxlUmVzdWx0LlJlc3VsdCBpcyBzdHJpbmcKKyAgICAgICAgICAgID8gbmV3KAorICAgICAgICAgICAgICAgIGNvbXBpbGVSZXN1bHQuUmVzdWx0LlRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgRXhjZWxFcnJvclZhbHVlLlBhcnNlKGNvbXBpbGVSZXN1bHQuUmVzdWx0LlRvU3RyaW5nKCkpKQorICAgICAgICAgICAgOiBuZXcgRXhjZWxFcnJvckV4cHJlc3Npb24oKEV4Y2VsRXJyb3JWYWx1ZSljb21waWxlUmVzdWx0LlJlc3VsdCk7CisgICAgICBjYXNlIERhdGFUeXBlLkVtcHR5OgorICAgICAgICByZXR1cm4gbmV3IEludGVnZXJFeHByZXNzaW9uKDApOyAvL0FkZGVkIEpLCiAgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgSUV4cHJlc3Npb25Db252ZXJ0ZXIgX2luc3RhbmNlOworCisgIHB1YmxpYyBzdGF0aWMgSUV4cHJlc3Npb25Db252ZXJ0ZXIgSW5zdGFuY2UgeworICAgIGdldCB7CisgICAgICBpZiAoX2luc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgX2luc3RhbmNlID0gbmV3IEV4cHJlc3Npb25Db252ZXJ0ZXIoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfaW5zdGFuY2U7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25GYWN0b3J5LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uRmFjdG9yeS5jcwppbmRleCA4MzQ3MzUyLi43NDJkNTBjIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25GYWN0b3J5LmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkZhY3RvcnkuY3MKQEAgLTEzLDY5ICsxMyw2MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKKwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAotewotICAgIHB1YmxpYyBjbGFzcyBFeHByZXNzaW9uRmFjdG9yeSA6IElFeHByZXNzaW9uRmFjdG9yeQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFeGNlbERhdGFQcm92aWRlciBfZXhjZWxEYXRhUHJvdmlkZXI7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUGFyc2luZ0NvbnRleHQgX3BhcnNpbmdDb250ZXh0OworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi0gICAgICAgIHB1YmxpYyBFeHByZXNzaW9uRmFjdG9yeShFeGNlbERhdGFQcm92aWRlciBleGNlbERhdGFQcm92aWRlciwgUGFyc2luZ0NvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyID0gZXhjZWxEYXRhUHJvdmlkZXI7Ci0gICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQgPSBjb250ZXh0OwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgRXhwcmVzc2lvbkZhY3RvcnkgOiBJRXhwcmVzc2lvbkZhY3RvcnkgeworICBwcml2YXRlIHJlYWRvbmx5IEV4Y2VsRGF0YVByb3ZpZGVyIF9leGNlbERhdGFQcm92aWRlcjsKKyAgcHJpdmF0ZSByZWFkb25seSBQYXJzaW5nQ29udGV4dCBfcGFyc2luZ0NvbnRleHQ7CiAKKyAgcHVibGljIEV4cHJlc3Npb25GYWN0b3J5KEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgX2V4Y2VsRGF0YVByb3ZpZGVyID0gZXhjZWxEYXRhUHJvdmlkZXI7CisgICAgX3BhcnNpbmdDb250ZXh0ID0gY29udGV4dDsKKyAgfQogCi0gICAgICAgIHB1YmxpYyBFeHByZXNzaW9uIENyZWF0ZShUb2tlbiB0b2tlbikKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoICh0b2tlbi5Ub2tlblR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSW50ZWdlcjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyRXhwcmVzc2lvbih0b2tlbi5WYWx1ZSwgdG9rZW4uSXNOZWdhdGVkKTsKLSAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5TdHJpbmc6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nRXhwcmVzc2lvbih0b2tlbi5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuRGVjaW1hbDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWNpbWFsRXhwcmVzc2lvbih0b2tlbi5WYWx1ZSwgdG9rZW4uSXNOZWdhdGVkKTsKLSAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5Cb29sZWFuOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW5FeHByZXNzaW9uKHRva2VuLlZhbHVlKTsKLSAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5FeGNlbEFkZHJlc3M6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxBZGRyZXNzRXhwcmVzc2lvbih0b2tlbi5WYWx1ZSwgX2V4Y2VsRGF0YVByb3ZpZGVyLCBfcGFyc2luZ0NvbnRleHQsIHRva2VuLklzTmVnYXRlZCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuSW52YWxpZFJlZmVyZW5jZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yRXhwcmVzc2lvbih0b2tlbi5WYWx1ZSwgRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlJlZikpOwotICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLk51bWVyaWNFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yRXhwcmVzc2lvbih0b2tlbi5WYWx1ZSwgRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLk51bSkpOwotICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLlZhbHVlRGF0YVR5cGVFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yRXhwcmVzc2lvbih0b2tlbi5WYWx1ZSwgRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuTnVsbDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yRXhwcmVzc2lvbih0b2tlbi5WYWx1ZSwgRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLk51bGwpKTsKLSAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5OYW1lVmFsdWU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTmFtZWRWYWx1ZUV4cHJlc3Npb24odG9rZW4uVmFsdWUsIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdFeHByZXNzaW9uKHRva2VuLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBwdWJsaWMgRXhwcmVzc2lvbiBDcmVhdGUoVG9rZW4gdG9rZW4pIHsKKyAgICBzd2l0Y2ggKHRva2VuLlRva2VuVHlwZSkgeworICAgICAgY2FzZSBUb2tlblR5cGUuSW50ZWdlcjoKKyAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyRXhwcmVzc2lvbih0b2tlbi5WYWx1ZSwgdG9rZW4uSXNOZWdhdGVkKTsKKyAgICAgIGNhc2UgVG9rZW5UeXBlLlN0cmluZzoKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdFeHByZXNzaW9uKHRva2VuLlZhbHVlKTsKKyAgICAgIGNhc2UgVG9rZW5UeXBlLkRlY2ltYWw6CisgICAgICAgIHJldHVybiBuZXcgRGVjaW1hbEV4cHJlc3Npb24odG9rZW4uVmFsdWUsIHRva2VuLklzTmVnYXRlZCk7CisgICAgICBjYXNlIFRva2VuVHlwZS5Cb29sZWFuOgorICAgICAgICByZXR1cm4gbmV3IEJvb2xlYW5FeHByZXNzaW9uKHRva2VuLlZhbHVlKTsKKyAgICAgIGNhc2UgVG9rZW5UeXBlLkV4Y2VsQWRkcmVzczoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEFkZHJlc3NFeHByZXNzaW9uKAorICAgICAgICAgICAgdG9rZW4uVmFsdWUsCisgICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIsCisgICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQsCisgICAgICAgICAgICB0b2tlbi5Jc05lZ2F0ZWQpOworICAgICAgY2FzZSBUb2tlblR5cGUuSW52YWxpZFJlZmVyZW5jZToKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yRXhwcmVzc2lvbih0b2tlbi5WYWx1ZSwgRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlJlZikpOworICAgICAgY2FzZSBUb2tlblR5cGUuTnVtZXJpY0Vycm9yOgorICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRXJyb3JFeHByZXNzaW9uKHRva2VuLlZhbHVlLCBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTnVtKSk7CisgICAgICBjYXNlIFRva2VuVHlwZS5WYWx1ZURhdGFUeXBlRXJyb3I6CisgICAgICAgIHJldHVybiBuZXcgRXhjZWxFcnJvckV4cHJlc3Npb24odG9rZW4uVmFsdWUsIEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSkpOworICAgICAgY2FzZSBUb2tlblR5cGUuTnVsbDoKKyAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEVycm9yRXhwcmVzc2lvbih0b2tlbi5WYWx1ZSwgRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLk51bGwpKTsKKyAgICAgIGNhc2UgVG9rZW5UeXBlLk5hbWVWYWx1ZToKKyAgICAgICAgcmV0dXJuIG5ldyBOYW1lZFZhbHVlRXhwcmVzc2lvbih0b2tlbi5WYWx1ZSwgX3BhcnNpbmdDb250ZXh0KTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nRXhwcmVzc2lvbih0b2tlbi5WYWx1ZSk7CiAgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25HcmFwaC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkdyYXBoLmNzCmluZGV4IDA0YzY1MDkuLmQ5Mzg4YWEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkdyYXBoLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkdyYXBoLmNzCkBAIC0xMyw1OSArMTMsNTIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXhwcmVzc2lvbkdyYXBoCi0gICAgewotICAgICAgICBwcml2YXRlIExpc3Q8RXhwcmVzc2lvbj4gX2V4cHJlc3Npb25zID0gbmV3IExpc3Q8RXhwcmVzc2lvbj4oKTsKLSAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IEV4cHJlc3Npb25zIHsgZ2V0IHsgcmV0dXJuIF9leHByZXNzaW9uczsgfSB9Ci0gICAgICAgIHB1YmxpYyBFeHByZXNzaW9uIEN1cnJlbnQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLSAgICAgICAgcHVibGljIEV4cHJlc3Npb24gQWRkKEV4cHJlc3Npb24gZXhwcmVzc2lvbikKLSAgICAgICAgewotICAgICAgICAgICAgX2V4cHJlc3Npb25zLkFkZChleHByZXNzaW9uKTsKLSAgICAgICAgICAgIGlmIChDdXJyZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3VycmVudC5OZXh0ID0gZXhwcmVzc2lvbjsKLSAgICAgICAgICAgICAgICBleHByZXNzaW9uLlByZXYgPSBDdXJyZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ3VycmVudCA9IGV4cHJlc3Npb247Ci0gICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbjsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIEV4cHJlc3Npb25HcmFwaCB7CisgIHByaXZhdGUgTGlzdDxFeHByZXNzaW9uPiBfZXhwcmVzc2lvbnMgPSBuZXcoKTsKIAotICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9leHByZXNzaW9ucy5DbGVhcigpOwotICAgICAgICAgICAgQ3VycmVudCA9IG51bGw7Ci0gICAgICAgIH0KKyAgcHVibGljIElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IEV4cHJlc3Npb25zID0+IF9leHByZXNzaW9uczsKIAotICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoRXhwcmVzc2lvbiBpdGVtKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXRlbSA9PSBDdXJyZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBpdGVtLlByZXYgPz8gaXRlbS5OZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2V4cHJlc3Npb25zLlJlbW92ZShpdGVtKTsKLSAgICAgICAgfQorICBwdWJsaWMgRXhwcmVzc2lvbiBDdXJyZW50IHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgIHB1YmxpYyBFeHByZXNzaW9uIEFkZChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICBfZXhwcmVzc2lvbnMuQWRkKGV4cHJlc3Npb24pOworICAgIGlmIChDdXJyZW50ICE9IG51bGwpIHsKKyAgICAgIEN1cnJlbnQuTmV4dCA9IGV4cHJlc3Npb247CisgICAgICBleHByZXNzaW9uLlByZXYgPSBDdXJyZW50OwogICAgIH0KKyAgICBDdXJyZW50ID0gZXhwcmVzc2lvbjsKKyAgICByZXR1cm4gZXhwcmVzc2lvbjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlc2V0KCkgeworICAgIF9leHByZXNzaW9ucy5DbGVhcigpOworICAgIEN1cnJlbnQgPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgUmVtb3ZlKEV4cHJlc3Npb24gaXRlbSkgeworICAgIGlmIChpdGVtID09IEN1cnJlbnQpIHsKKyAgICAgIEN1cnJlbnQgPSBpdGVtLlByZXYgPz8gaXRlbS5OZXh0OworICAgIH0KKyAgICBfZXhwcmVzc2lvbnMuUmVtb3ZlKGl0ZW0pOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25HcmFwaEJ1aWxkZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0V4cHJlc3Npb25HcmFwaEJ1aWxkZXIuY3MKaW5kZXggM2Y3NzE1OC4uZGUyZjM4NCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9FeHByZXNzaW9uR3JhcGhCdWlsZGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRXhwcmVzc2lvbkdyYXBoQnVpbGRlci5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMjQwICsxMywxODUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5PcGVyYXRvcnM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXhwcmVzc2lvbkdyYXBoQnVpbGRlciA6SUV4cHJlc3Npb25HcmFwaEJ1aWxkZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRXhwcmVzc2lvbkdyYXBoIF9ncmFwaCA9IG5ldyBFeHByZXNzaW9uR3JhcGgoKTsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJRXhwcmVzc2lvbkZhY3RvcnkgX2V4cHJlc3Npb25GYWN0b3J5OwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgX3Rva2VuSW5kZXggPSAwOwotICAgICAgICBwcml2YXRlIGJvb2wgX25lZ2F0ZU5leHRFeHByZXNzaW9uOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi0gICAgICAgIHB1YmxpYyBFeHByZXNzaW9uR3JhcGhCdWlsZGVyKEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkKLSAgICAgICAgICAgIDogdGhpcyhuZXcgRXhwcmVzc2lvbkZhY3RvcnkoZXhjZWxEYXRhUHJvdmlkZXIsIHBhcnNpbmdDb250ZXh0KSwgcGFyc2luZ0NvbnRleHQpCi0gICAgICAgIHsKK3B1YmxpYyBjbGFzcyBFeHByZXNzaW9uR3JhcGhCdWlsZGVyIDogSUV4cHJlc3Npb25HcmFwaEJ1aWxkZXIgeworICBwcml2YXRlIHJlYWRvbmx5IEV4cHJlc3Npb25HcmFwaCBfZ3JhcGggPSBuZXcoKTsKKyAgcHJpdmF0ZSByZWFkb25seSBJRXhwcmVzc2lvbkZhY3RvcnkgX2V4cHJlc3Npb25GYWN0b3J5OworICBwcml2YXRlIHJlYWRvbmx5IFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKKyAgcHJpdmF0ZSBpbnQgX3Rva2VuSW5kZXg7CisgIHByaXZhdGUgYm9vbCBfbmVnYXRlTmV4dEV4cHJlc3Npb247CiAKKyAgcHVibGljIEV4cHJlc3Npb25HcmFwaEJ1aWxkZXIoRXhjZWxEYXRhUHJvdmlkZXIgZXhjZWxEYXRhUHJvdmlkZXIsIFBhcnNpbmdDb250ZXh0IHBhcnNpbmdDb250ZXh0KQorICAgICAgOiB0aGlzKG5ldyBFeHByZXNzaW9uRmFjdG9yeShleGNlbERhdGFQcm92aWRlciwgcGFyc2luZ0NvbnRleHQpLCBwYXJzaW5nQ29udGV4dCkge30KKworICBwdWJsaWMgRXhwcmVzc2lvbkdyYXBoQnVpbGRlcigKKyAgICAgIElFeHByZXNzaW9uRmFjdG9yeSBleHByZXNzaW9uRmFjdG9yeSwKKyAgICAgIFBhcnNpbmdDb250ZXh0IHBhcnNpbmdDb250ZXh0KSB7CisgICAgX2V4cHJlc3Npb25GYWN0b3J5ID0gZXhwcmVzc2lvbkZhY3Rvcnk7CisgICAgX3BhcnNpbmdDb250ZXh0ID0gcGFyc2luZ0NvbnRleHQ7CisgIH0KKworICBwdWJsaWMgRXhwcmVzc2lvbkdyYXBoIEJ1aWxkKElFbnVtZXJhYmxlPFRva2VuPiB0b2tlbnMpIHsKKyAgICBfdG9rZW5JbmRleCA9IDA7CisgICAgX2dyYXBoLlJlc2V0KCk7CisgICAgdmFyIHRva2Vuc0FyciA9IHRva2VucyAhPSBudWxsID8gdG9rZW5zLlRvQXJyYXkoKSA6IG5ldyBUb2tlblswXTsKKyAgICBCdWlsZFVwKHRva2Vuc0FyciwgbnVsbCk7CisgICAgcmV0dXJuIF9ncmFwaDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBCdWlsZFVwKFRva2VuW10gdG9rZW5zLCBFeHByZXNzaW9uIHBhcmVudCkgeworICAgIHdoaWxlIChfdG9rZW5JbmRleCA8IHRva2Vucy5MZW5ndGgpIHsKKyAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tfdG9rZW5JbmRleF07CisgICAgICBJT3BlcmF0b3Igb3AgPSBudWxsOworICAgICAgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlcmF0b3IKKyAgICAgICAgICAmJiBPcGVyYXRvcnNEaWN0Lkluc3RhbmNlLlRyeUdldFZhbHVlKHRva2VuLlZhbHVlLCBvdXQgb3ApKSB7CisgICAgICAgIFNldE9wZXJhdG9yT25FeHByZXNzaW9uKHBhcmVudCwgb3ApOworICAgICAgfSBlbHNlIGlmICh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLkZ1bmN0aW9uKSB7CisgICAgICAgIEJ1aWxkRnVuY3Rpb25FeHByZXNzaW9uKHRva2VucywgcGFyZW50LCB0b2tlbi5WYWx1ZSk7CisgICAgICB9IGVsc2UgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ0VudW1lcmFibGUpIHsKKyAgICAgICAgX3Rva2VuSW5kZXgrKzsKKyAgICAgICAgQnVpbGRFbnVtZXJhYmxlRXhwcmVzc2lvbih0b2tlbnMsIHBhcmVudCk7CisgICAgICB9IGVsc2UgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKSB7CisgICAgICAgIF90b2tlbkluZGV4Kys7CisgICAgICAgIEJ1aWxkR3JvdXBFeHByZXNzaW9uKHRva2VucywgcGFyZW50KTsKKyAgICAgICAgLy9pZiAocGFyZW50IGlzIEZ1bmN0aW9uRXhwcmVzc2lvbikKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIHJldHVybjsKKyAgICAgICAgLy99CisgICAgICB9IGVsc2UgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuQ2xvc2luZ1BhcmVudGhlc2lzCisgICAgICAgICAgfHwgdG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5DbG9zaW5nRW51bWVyYWJsZSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSBpZiAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5OZWdhdG9yKSB7CisgICAgICAgIF9uZWdhdGVOZXh0RXhwcmVzc2lvbiA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuUGVyY2VudCkgeworICAgICAgICBTZXRPcGVyYXRvck9uRXhwcmVzc2lvbihwYXJlbnQsIE9wZXJhdG9yLlBlcmNlbnQpOworICAgICAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgICAgICBfZ3JhcGguQWRkKENvbnN0YW50RXhwcmVzc2lvbnMuUGVyY2VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcGFyZW50LkFkZENoaWxkKENvbnN0YW50RXhwcmVzc2lvbnMuUGVyY2VudCk7CiAgICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbkdyYXBoQnVpbGRlcihJRXhwcmVzc2lvbkZhY3RvcnkgZXhwcmVzc2lvbkZhY3RvcnksIFBhcnNpbmdDb250ZXh0IHBhcnNpbmdDb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBfZXhwcmVzc2lvbkZhY3RvcnkgPSBleHByZXNzaW9uRmFjdG9yeTsKLSAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dCA9IHBhcnNpbmdDb250ZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEV4cHJlc3Npb25HcmFwaCBCdWlsZChJRW51bWVyYWJsZTxUb2tlbj4gdG9rZW5zKQotICAgICAgICB7Ci0gICAgICAgICAgICBfdG9rZW5JbmRleCA9IDA7Ci0gICAgICAgICAgICBfZ3JhcGguUmVzZXQoKTsKLSAgICAgICAgICAgIHZhciB0b2tlbnNBcnIgPSB0b2tlbnMgIT0gbnVsbCA/IHRva2Vucy5Ub0FycmF5KCkgOiBuZXcgVG9rZW5bMF07Ci0gICAgICAgICAgICBCdWlsZFVwKHRva2Vuc0FyciwgbnVsbCk7Ci0gICAgICAgICAgICByZXR1cm4gX2dyYXBoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEJ1aWxkVXAoVG9rZW5bXSB0b2tlbnMsIEV4cHJlc3Npb24gcGFyZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoX3Rva2VuSW5kZXggPCB0b2tlbnMuTGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vuc1tfdG9rZW5JbmRleF07Ci0gICAgICAgICAgICAgICAgSU9wZXJhdG9yIG9wID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVyYXRvciAmJiBPcGVyYXRvcnNEaWN0Lkluc3RhbmNlLlRyeUdldFZhbHVlKHRva2VuLlZhbHVlLCBvdXQgb3ApKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2V0T3BlcmF0b3JPbkV4cHJlc3Npb24ocGFyZW50LCBvcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuRnVuY3Rpb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBCdWlsZEZ1bmN0aW9uRXhwcmVzc2lvbih0b2tlbnMsIHBhcmVudCwgdG9rZW4uVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZW5pbmdFbnVtZXJhYmxlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3Rva2VuSW5kZXgrKzsKLSAgICAgICAgICAgICAgICAgICAgQnVpbGRFbnVtZXJhYmxlRXhwcmVzc2lvbih0b2tlbnMsIHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3Rva2VuSW5kZXgrKzsKLSAgICAgICAgICAgICAgICAgICAgQnVpbGRHcm91cEV4cHJlc3Npb24odG9rZW5zLCBwYXJlbnQpOwotICAgICAgICAgICAgICAgICAgICAvL2lmIChwYXJlbnQgaXMgRnVuY3Rpb25FeHByZXNzaW9uKQotICAgICAgICAgICAgICAgICAgICAvL3sKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5DbG9zaW5nUGFyZW50aGVzaXMgfHwgdG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5DbG9zaW5nRW51bWVyYWJsZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk5lZ2F0b3IpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbmVnYXRlTmV4dEV4cHJlc3Npb24gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuUGVyY2VudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNldE9wZXJhdG9yT25FeHByZXNzaW9uKHBhcmVudCwgT3BlcmF0b3IuUGVyY2VudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX2dyYXBoLkFkZChDb25zdGFudEV4cHJlc3Npb25zLlBlcmNlbnQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LkFkZENoaWxkKENvbnN0YW50RXhwcmVzc2lvbnMuUGVyY2VudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ3JlYXRlQW5kQXBwZW5kRXhwcmVzc2lvbihyZWYgcGFyZW50LCB0b2tlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF90b2tlbkluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgQnVpbGRFbnVtZXJhYmxlRXhwcmVzc2lvbihUb2tlbltdIHRva2VucywgRXhwcmVzc2lvbiBwYXJlbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZ3JhcGguQWRkKG5ldyBFbnVtZXJhYmxlRXhwcmVzc2lvbigpKTsKLSAgICAgICAgICAgICAgICBCdWlsZFVwKHRva2VucywgX2dyYXBoLkN1cnJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBlbnVtZXJhYmxlRXhwcmVzc2lvbiA9IG5ldyBFbnVtZXJhYmxlRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgICAgIHBhcmVudC5BZGRDaGlsZChlbnVtZXJhYmxlRXhwcmVzc2lvbik7Ci0gICAgICAgICAgICAgICAgQnVpbGRVcCh0b2tlbnMsIGVudW1lcmFibGVFeHByZXNzaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBDcmVhdGVBbmRBcHBlbmRFeHByZXNzaW9uKHJlZiBFeHByZXNzaW9uIHBhcmVudCwgVG9rZW4gdG9rZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChJc1dhc3RlKHRva2VuKSkgcmV0dXJuOwotICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmIAotICAgICAgICAgICAgICAgICh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLkNvbW1hIHx8IHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuU2VtaUNvbG9uKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuUHJlcGFyZUZvck5leHRDaGlsZCgpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChfbmVnYXRlTmV4dEV4cHJlc3Npb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG9rZW4uTmVnYXRlKCk7Ci0gICAgICAgICAgICAgICAgX25lZ2F0ZU5leHRFeHByZXNzaW9uID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgZXhwcmVzc2lvbiA9IF9leHByZXNzaW9uRmFjdG9yeS5DcmVhdGUodG9rZW4pOwotICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9ncmFwaC5BZGQoZXhwcmVzc2lvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGFyZW50LkFkZENoaWxkKGV4cHJlc3Npb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sIElzV2FzdGUoVG9rZW4gdG9rZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlN0cmluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBCdWlsZEZ1bmN0aW9uRXhwcmVzc2lvbihUb2tlbltdIHRva2VucywgRXhwcmVzc2lvbiBwYXJlbnQsIHN0cmluZyBmdW5jTmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9ncmFwaC5BZGQobmV3IEZ1bmN0aW9uRXhwcmVzc2lvbihmdW5jTmFtZSwgX3BhcnNpbmdDb250ZXh0LCBfbmVnYXRlTmV4dEV4cHJlc3Npb24pKTsKLSAgICAgICAgICAgICAgICBfbmVnYXRlTmV4dEV4cHJlc3Npb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBIYW5kbGVGdW5jdGlvbkFyZ3VtZW50cyh0b2tlbnMsIF9ncmFwaC5DdXJyZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZnVuYyA9IG5ldyBGdW5jdGlvbkV4cHJlc3Npb24oZnVuY05hbWUsIF9wYXJzaW5nQ29udGV4dCwgX25lZ2F0ZU5leHRFeHByZXNzaW9uKTsKLSAgICAgICAgICAgICAgICBfbmVnYXRlTmV4dEV4cHJlc3Npb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBwYXJlbnQuQWRkQ2hpbGQoZnVuYyk7Ci0gICAgICAgICAgICAgICAgSGFuZGxlRnVuY3Rpb25Bcmd1bWVudHModG9rZW5zLCBmdW5jKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBIYW5kbGVGdW5jdGlvbkFyZ3VtZW50cyhUb2tlbltdIHRva2VucywgRXhwcmVzc2lvbiBmdW5jdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgX3Rva2VuSW5kZXgrKzsKLSAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2Vucy5FbGVtZW50QXQoX3Rva2VuSW5kZXgpOwotICAgICAgICAgICAgaWYgKHRva2VuLlRva2VuVHlwZSAhPSBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfdG9rZW5JbmRleCsrOwotICAgICAgICAgICAgQnVpbGRVcCh0b2tlbnMsIGZ1bmN0aW9uLkNoaWxkcmVuLkZpcnN0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEJ1aWxkR3JvdXBFeHByZXNzaW9uKFRva2VuW10gdG9rZW5zLCBFeHByZXNzaW9uIHBhcmVudCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9ncmFwaC5BZGQobmV3IEdyb3VwRXhwcmVzc2lvbihfbmVnYXRlTmV4dEV4cHJlc3Npb24pKTsKLSAgICAgICAgICAgICAgICBfbmVnYXRlTmV4dEV4cHJlc3Npb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBCdWlsZFVwKHRva2VucywgX2dyYXBoLkN1cnJlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuSXNHcm91cGVkRXhwcmVzc2lvbiB8fCBwYXJlbnQgaXMgRnVuY3Rpb25Bcmd1bWVudEV4cHJlc3Npb24pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgbmV3R3JvdXBFeHByZXNzaW9uID0gbmV3IEdyb3VwRXhwcmVzc2lvbihfbmVnYXRlTmV4dEV4cHJlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICBfbmVnYXRlTmV4dEV4cHJlc3Npb24gPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgcGFyZW50LkFkZENoaWxkKG5ld0dyb3VwRXhwcmVzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIEJ1aWxkVXAodG9rZW5zLCBuZXdHcm91cEV4cHJlc3Npb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgQnVpbGRVcCh0b2tlbnMsIHBhcmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgU2V0T3BlcmF0b3JPbkV4cHJlc3Npb24oRXhwcmVzc2lvbiBwYXJlbnQsIElPcGVyYXRvciBvcCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBhcmVudCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9ncmFwaC5DdXJyZW50Lk9wZXJhdG9yID0gb3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRXhwcmVzc2lvbiBjYW5kaWRhdGU7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpcyBGdW5jdGlvbkFyZ3VtZW50RXhwcmVzc2lvbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSA9IHBhcmVudC5DaGlsZHJlbi5MYXN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSA9IHBhcmVudC5DaGlsZHJlbi5MYXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgaXMgRnVuY3Rpb25Bcmd1bWVudEV4cHJlc3Npb24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5DaGlsZHJlbi5MYXN0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FuZGlkYXRlLk9wZXJhdG9yID0gb3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENyZWF0ZUFuZEFwcGVuZEV4cHJlc3Npb24ocmVmIHBhcmVudCwgdG9rZW4pOworICAgICAgfQorICAgICAgX3Rva2VuSW5kZXgrKzsKICAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgQnVpbGRFbnVtZXJhYmxlRXhwcmVzc2lvbihUb2tlbltdIHRva2VucywgRXhwcmVzc2lvbiBwYXJlbnQpIHsKKyAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgIF9ncmFwaC5BZGQobmV3IEVudW1lcmFibGVFeHByZXNzaW9uKCkpOworICAgICAgQnVpbGRVcCh0b2tlbnMsIF9ncmFwaC5DdXJyZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIGVudW1lcmFibGVFeHByZXNzaW9uID0gbmV3IEVudW1lcmFibGVFeHByZXNzaW9uKCk7CisgICAgICBwYXJlbnQuQWRkQ2hpbGQoZW51bWVyYWJsZUV4cHJlc3Npb24pOworICAgICAgQnVpbGRVcCh0b2tlbnMsIGVudW1lcmFibGVFeHByZXNzaW9uKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgQ3JlYXRlQW5kQXBwZW5kRXhwcmVzc2lvbihyZWYgRXhwcmVzc2lvbiBwYXJlbnQsIFRva2VuIHRva2VuKSB7CisgICAgaWYgKElzV2FzdGUodG9rZW4pKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwYXJlbnQgIT0gbnVsbAorICAgICAgICAmJiAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5Db21tYSB8fCB0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlNlbWlDb2xvbikpIHsKKyAgICAgIHBhcmVudCA9IHBhcmVudC5QcmVwYXJlRm9yTmV4dENoaWxkKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChfbmVnYXRlTmV4dEV4cHJlc3Npb24pIHsKKyAgICAgIHRva2VuLk5lZ2F0ZSgpOworICAgICAgX25lZ2F0ZU5leHRFeHByZXNzaW9uID0gZmFsc2U7CisgICAgfQorICAgIHZhciBleHByZXNzaW9uID0gX2V4cHJlc3Npb25GYWN0b3J5LkNyZWF0ZSh0b2tlbik7CisgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CisgICAgICBfZ3JhcGguQWRkKGV4cHJlc3Npb24pOworICAgIH0gZWxzZSB7CisgICAgICBwYXJlbnQuQWRkQ2hpbGQoZXhwcmVzc2lvbik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBib29sIElzV2FzdGUoVG9rZW4gdG9rZW4pIHsKKyAgICBpZiAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwcml2YXRlIHZvaWQgQnVpbGRGdW5jdGlvbkV4cHJlc3Npb24oVG9rZW5bXSB0b2tlbnMsIEV4cHJlc3Npb24gcGFyZW50LCBzdHJpbmcgZnVuY05hbWUpIHsKKyAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgIF9ncmFwaC5BZGQobmV3IEZ1bmN0aW9uRXhwcmVzc2lvbihmdW5jTmFtZSwgX3BhcnNpbmdDb250ZXh0LCBfbmVnYXRlTmV4dEV4cHJlc3Npb24pKTsKKyAgICAgIF9uZWdhdGVOZXh0RXhwcmVzc2lvbiA9IGZhbHNlOworICAgICAgSGFuZGxlRnVuY3Rpb25Bcmd1bWVudHModG9rZW5zLCBfZ3JhcGguQ3VycmVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciBmdW5jID0gbmV3IEZ1bmN0aW9uRXhwcmVzc2lvbihmdW5jTmFtZSwgX3BhcnNpbmdDb250ZXh0LCBfbmVnYXRlTmV4dEV4cHJlc3Npb24pOworICAgICAgX25lZ2F0ZU5leHRFeHByZXNzaW9uID0gZmFsc2U7CisgICAgICBwYXJlbnQuQWRkQ2hpbGQoZnVuYyk7CisgICAgICBIYW5kbGVGdW5jdGlvbkFyZ3VtZW50cyh0b2tlbnMsIGZ1bmMpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBIYW5kbGVGdW5jdGlvbkFyZ3VtZW50cyhUb2tlbltdIHRva2VucywgRXhwcmVzc2lvbiBmdW5jdGlvbikgeworICAgIF90b2tlbkluZGV4Kys7CisgICAgdmFyIHRva2VuID0gdG9rZW5zLkVsZW1lbnRBdChfdG9rZW5JbmRleCk7CisgICAgaWYgKHRva2VuLlRva2VuVHlwZSAhPSBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKSB7CisgICAgICB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUuVmFsdWUpOworICAgIH0KKyAgICBfdG9rZW5JbmRleCsrOworICAgIEJ1aWxkVXAodG9rZW5zLCBmdW5jdGlvbi5DaGlsZHJlbi5GaXJzdCgpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBCdWlsZEdyb3VwRXhwcmVzc2lvbihUb2tlbltdIHRva2VucywgRXhwcmVzc2lvbiBwYXJlbnQpIHsKKyAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgIF9ncmFwaC5BZGQobmV3IEdyb3VwRXhwcmVzc2lvbihfbmVnYXRlTmV4dEV4cHJlc3Npb24pKTsKKyAgICAgIF9uZWdhdGVOZXh0RXhwcmVzc2lvbiA9IGZhbHNlOworICAgICAgQnVpbGRVcCh0b2tlbnMsIF9ncmFwaC5DdXJyZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHBhcmVudC5Jc0dyb3VwZWRFeHByZXNzaW9uIHx8IHBhcmVudCBpcyBGdW5jdGlvbkFyZ3VtZW50RXhwcmVzc2lvbikgeworICAgICAgICB2YXIgbmV3R3JvdXBFeHByZXNzaW9uID0gbmV3IEdyb3VwRXhwcmVzc2lvbihfbmVnYXRlTmV4dEV4cHJlc3Npb24pOworICAgICAgICBfbmVnYXRlTmV4dEV4cHJlc3Npb24gPSBmYWxzZTsKKyAgICAgICAgcGFyZW50LkFkZENoaWxkKG5ld0dyb3VwRXhwcmVzc2lvbik7CisgICAgICAgIEJ1aWxkVXAodG9rZW5zLCBuZXdHcm91cEV4cHJlc3Npb24pOworICAgICAgfQorICAgICAgQnVpbGRVcCh0b2tlbnMsIHBhcmVudCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIFNldE9wZXJhdG9yT25FeHByZXNzaW9uKEV4cHJlc3Npb24gcGFyZW50LCBJT3BlcmF0b3Igb3ApIHsKKyAgICBpZiAocGFyZW50ID09IG51bGwpIHsKKyAgICAgIF9ncmFwaC5DdXJyZW50Lk9wZXJhdG9yID0gb3A7CisgICAgfSBlbHNlIHsKKyAgICAgIEV4cHJlc3Npb24gY2FuZGlkYXRlOworICAgICAgaWYgKHBhcmVudCBpcyBGdW5jdGlvbkFyZ3VtZW50RXhwcmVzc2lvbikgeworICAgICAgICBjYW5kaWRhdGUgPSBwYXJlbnQuQ2hpbGRyZW4uTGFzdCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY2FuZGlkYXRlID0gcGFyZW50LkNoaWxkcmVuLkxhc3QoKTsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZSBpcyBGdW5jdGlvbkFyZ3VtZW50RXhwcmVzc2lvbikgeworICAgICAgICAgIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZS5DaGlsZHJlbi5MYXN0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGNhbmRpZGF0ZS5PcGVyYXRvciA9IG9wOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkFyZ3VtZW50RXhwcmVzc2lvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Bcmd1bWVudEV4cHJlc3Npb24uY3MKaW5kZXggYmE1YWVlMC4uMDEyM2UxZCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkFyZ3VtZW50RXhwcmVzc2lvbi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQXJndW1lbnRFeHByZXNzaW9uLmNzCkBAIC0xMyw2MiArMTMsNDUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0gICAgcHVibGljIGNsYXNzIEZ1bmN0aW9uQXJndW1lbnRFeHByZXNzaW9uIDogR3JvdXBFeHByZXNzaW9uCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEV4cHJlc3Npb24gX2Z1bmN0aW9uOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi0gICAgICAgIHB1YmxpYyBGdW5jdGlvbkFyZ3VtZW50RXhwcmVzc2lvbihFeHByZXNzaW9uIGZ1bmN0aW9uKQotICAgICAgICAgICAgOiBiYXNlKGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZnVuY3Rpb24gPSBmdW5jdGlvbjsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIEZ1bmN0aW9uQXJndW1lbnRFeHByZXNzaW9uIDogR3JvdXBFeHByZXNzaW9uIHsKKyAgcHJpdmF0ZSByZWFkb25seSBFeHByZXNzaW9uIF9mdW5jdGlvbjsKIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBQYXJlbnRJc0xvb2t1cEZ1bmN0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBiYXNlLlBhcmVudElzTG9va3VwRnVuY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlLlBhcmVudElzTG9va3VwRnVuY3Rpb24gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgY2hpbGQgaW4gQ2hpbGRyZW4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGlsZC5QYXJlbnRJc0xvb2t1cEZ1bmN0aW9uID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHB1YmxpYyBGdW5jdGlvbkFyZ3VtZW50RXhwcmVzc2lvbihFeHByZXNzaW9uIGZ1bmN0aW9uKQorICAgICAgOiBiYXNlKGZhbHNlKSB7CisgICAgX2Z1bmN0aW9uID0gZnVuY3Rpb247CisgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0dyb3VwZWRFeHByZXNzaW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIEV4cHJlc3Npb24gUHJlcGFyZUZvck5leHRDaGlsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfZnVuY3Rpb24uUHJlcGFyZUZvck5leHRDaGlsZCgpOwotICAgICAgICB9CisgIHB1YmxpYyBvdmVycmlkZSBib29sIFBhcmVudElzTG9va3VwRnVuY3Rpb24geworICAgIGdldCA9PiBiYXNlLlBhcmVudElzTG9va3VwRnVuY3Rpb247CisgICAgc2V0IHsKKyAgICAgIGJhc2UuUGFyZW50SXNMb29rdXBGdW5jdGlvbiA9IHZhbHVlOworICAgICAgZm9yZWFjaCAodmFyIGNoaWxkIGluIENoaWxkcmVuKSB7CisgICAgICAgIGNoaWxkLlBhcmVudElzTG9va3VwRnVuY3Rpb24gPSB2YWx1ZTsKKyAgICAgIH0KICAgICB9CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0dyb3VwZWRFeHByZXNzaW9uID0+IGZhbHNlOworCisgIHB1YmxpYyBvdmVycmlkZSBFeHByZXNzaW9uIFByZXBhcmVGb3JOZXh0Q2hpbGQoKSB7CisgICAgcmV0dXJuIF9mdW5jdGlvbi5QcmVwYXJlRm9yTmV4dENoaWxkKCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Db21waWxlcnMvRGVmYXVsdENvbXBpbGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9EZWZhdWx0Q29tcGlsZXIuY3MKaW5kZXggNDBhODU0NC4uZWJjMjkxOCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9EZWZhdWx0Q29tcGlsZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9EZWZhdWx0Q29tcGlsZXIuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDU3ICsxMyw0NSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5GdW5jdGlvbkNvbXBpbGVycwotewotICAgIHB1YmxpYyBjbGFzcyBEZWZhdWx0Q29tcGlsZXIgOiBGdW5jdGlvbkNvbXBpbGVyCi0gICAgewotICAgICAgICBwdWJsaWMgRGVmYXVsdENvbXBpbGVyKEV4Y2VsRnVuY3Rpb24gZnVuY3Rpb24pCi0gICAgICAgICAgICA6IGJhc2UoZnVuY3Rpb24pCi0gICAgICAgIHsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5GdW5jdGlvbkNvbXBpbGVyczsKIAotICAgICAgICB9CitwdWJsaWMgY2xhc3MgRGVmYXVsdENvbXBpbGVyIDogRnVuY3Rpb25Db21waWxlciB7CisgIHB1YmxpYyBEZWZhdWx0Q29tcGlsZXIoRXhjZWxGdW5jdGlvbiBmdW5jdGlvbikKKyAgICAgIDogYmFzZShmdW5jdGlvbikge30KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGNoaWxkcmVuLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCk7Ci0gICAgICAgICAgICBGdW5jdGlvbi5CZWZvcmVJbnZva2UoY29udGV4dCk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgY2hpbGQgaW4gY2hpbGRyZW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGNvbXBpbGVSZXN1bHQgPSBjaGlsZC5Db21waWxlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBpbGVSZXN1bHQuSXNSZXN1bHRPZlN1YnRvdGFsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGFyZyA9IG5ldyBGdW5jdGlvbkFyZ3VtZW50KGNvbXBpbGVSZXN1bHQuUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgYXJnLlNldEV4Y2VsU3RhdGVGbGFnKEV4Y2VsQ2VsbFN0YXRlLklzUmVzdWx0T2ZTdWJ0b3RhbCk7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3MuQWRkKGFyZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEJ1aWxkRnVuY3Rpb25Bcmd1bWVudHMoY29tcGlsZVJlc3VsdC5SZXN1bHQsIGFyZ3MpOyAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLkV4ZWN1dGUoYXJncywgY29udGV4dCk7Ci0gICAgICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZShJRW51bWVyYWJsZTxFeHByZXNzaW9uPiBjaGlsZHJlbiwgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHZhciBhcmdzID0gbmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4oKTsKKyAgICBGdW5jdGlvbi5CZWZvcmVJbnZva2UoY29udGV4dCk7CisgICAgZm9yZWFjaCAodmFyIGNoaWxkIGluIGNoaWxkcmVuKSB7CisgICAgICB2YXIgY29tcGlsZVJlc3VsdCA9IGNoaWxkLkNvbXBpbGUoKTsKKyAgICAgIGlmIChjb21waWxlUmVzdWx0LklzUmVzdWx0T2ZTdWJ0b3RhbCkgeworICAgICAgICB2YXIgYXJnID0gbmV3IEZ1bmN0aW9uQXJndW1lbnQoY29tcGlsZVJlc3VsdC5SZXN1bHQpOworICAgICAgICBhcmcuU2V0RXhjZWxTdGF0ZUZsYWcoRXhjZWxDZWxsU3RhdGUuSXNSZXN1bHRPZlN1YnRvdGFsKTsKKyAgICAgICAgYXJncy5BZGQoYXJnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEJ1aWxkRnVuY3Rpb25Bcmd1bWVudHMoY29tcGlsZVJlc3VsdC5SZXN1bHQsIGFyZ3MpOworICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gRnVuY3Rpb24uRXhlY3V0ZShhcmdzLCBjb250ZXh0KTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9FcnJvckhhbmRsaW5nRnVuY3Rpb25Db21waWxlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Db21waWxlcnMvRXJyb3JIYW5kbGluZ0Z1bmN0aW9uQ29tcGlsZXIuY3MKaW5kZXggZmZhNGNhYy4uMzAzODIxYSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9FcnJvckhhbmRsaW5nRnVuY3Rpb25Db21waWxlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0Vycm9ySGFuZGxpbmdGdW5jdGlvbkNvbXBpbGVyLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw1OSArMTMsNDYgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VwdGlvbnM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5GdW5jdGlvbkNvbXBpbGVycwotewotICAgIHB1YmxpYyBjbGFzcyBFcnJvckhhbmRsaW5nRnVuY3Rpb25Db21waWxlciA6IEZ1bmN0aW9uQ29tcGlsZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBFcnJvckhhbmRsaW5nRnVuY3Rpb25Db21waWxlcihFeGNlbEZ1bmN0aW9uIGZ1bmN0aW9uKQotICAgICAgICAgICAgOiBiYXNlKGZ1bmN0aW9uKQotICAgICAgICB7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRnVuY3Rpb25Db21waWxlcnM7CiAKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGNoaWxkcmVuLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCk7Ci0gICAgICAgICAgICBGdW5jdGlvbi5CZWZvcmVJbnZva2UoY29udGV4dCk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgY2hpbGQgaW4gY2hpbGRyZW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgYXJnID0gY2hpbGQuQ29tcGlsZSgpOwotICAgICAgICAgICAgICAgICAgICBCdWlsZEZ1bmN0aW9uQXJndW1lbnRzKGFyZyAhPSBudWxsID8gYXJnLlJlc3VsdCA6IG51bGwsIGFyZ3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIGVmZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoKEVycm9ySGFuZGxpbmdGdW5jdGlvbilGdW5jdGlvbikuSGFuZGxlRXJyb3IoZWZlLkVycm9yVmFsdWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoLy8gKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoRXJyb3JIYW5kbGluZ0Z1bmN0aW9uKUZ1bmN0aW9uKS5IYW5kbGVFcnJvcihFeGNlbEVycm9yVmFsdWUuVmFsdWVzLlZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24uRXhlY3V0ZShhcmdzLCBjb250ZXh0KTsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIEVycm9ySGFuZGxpbmdGdW5jdGlvbkNvbXBpbGVyIDogRnVuY3Rpb25Db21waWxlciB7CisgIHB1YmxpYyBFcnJvckhhbmRsaW5nRnVuY3Rpb25Db21waWxlcihFeGNlbEZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgICAgOiBiYXNlKGZ1bmN0aW9uKSB7fQorCisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gY2hpbGRyZW4sIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICB2YXIgYXJncyA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCk7CisgICAgRnVuY3Rpb24uQmVmb3JlSW52b2tlKGNvbnRleHQpOworICAgIGZvcmVhY2ggKHZhciBjaGlsZCBpbiBjaGlsZHJlbikgeworICAgICAgdHJ5IHsKKyAgICAgICAgdmFyIGFyZyA9IGNoaWxkLkNvbXBpbGUoKTsKKyAgICAgICAgQnVpbGRGdW5jdGlvbkFyZ3VtZW50cyhhcmcgIT0gbnVsbCA/IGFyZy5SZXN1bHQgOiBudWxsLCBhcmdzKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbiBlZmUpIHsKKyAgICAgICAgcmV0dXJuICgoRXJyb3JIYW5kbGluZ0Z1bmN0aW9uKUZ1bmN0aW9uKS5IYW5kbGVFcnJvcihlZmUuRXJyb3JWYWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgIH0gY2F0Y2ggLy8gKEV4Y2VwdGlvbiBlKQorICAgICAgeworICAgICAgICByZXR1cm4gKChFcnJvckhhbmRsaW5nRnVuY3Rpb24pRnVuY3Rpb24pLkhhbmRsZUVycm9yKEV4Y2VsRXJyb3JWYWx1ZS5WYWx1ZXMuVmFsdWUpOworICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gRnVuY3Rpb24uRXhlY3V0ZShhcmdzLCBjb250ZXh0KTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9GdW5jdGlvbkNvbXBpbGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9GdW5jdGlvbkNvbXBpbGVyLmNzCmluZGV4IDYzYThiMjIuLmNiMTY0YjAgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Db21waWxlcnMvRnVuY3Rpb25Db21waWxlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0Z1bmN0aW9uQ29tcGlsZXIuY3MKQEAgLTEzLDYzICsxMyw0OCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRnVuY3Rpb25Db21waWxlcnMKLXsKLSAgICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRnVuY3Rpb25Db21waWxlcgotICAgIHsKLSAgICAgICAgcHJvdGVjdGVkIEV4Y2VsRnVuY3Rpb24gRnVuY3Rpb24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5GdW5jdGlvbkNvbXBpbGVyczsKIAotICAgICAgICBwdWJsaWMgRnVuY3Rpb25Db21waWxlcihFeGNlbEZ1bmN0aW9uIGZ1bmN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQoZnVuY3Rpb24pLk5hbWVkKCJmdW5jdGlvbiIpLklzTm90TnVsbCgpOwotICAgICAgICAgICAgRnVuY3Rpb24gPSBmdW5jdGlvbjsKLSAgICAgICAgfQorcHVibGljIGFic3RyYWN0IGNsYXNzIEZ1bmN0aW9uQ29tcGlsZXIgeworICBwcm90ZWN0ZWQgRXhjZWxGdW5jdGlvbiBGdW5jdGlvbiB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KIAotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBCdWlsZEZ1bmN0aW9uQXJndW1lbnRzKG9iamVjdCByZXN1bHQsIExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4gYXJncykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHJlc3VsdCBpcyBJRW51bWVyYWJsZTxvYmplY3Q+ICYmICEocmVzdWx0IGlzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBhcmdMaXN0ID0gbmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4oKTsKLSAgICAgICAgICAgICAgICB2YXIgb2JqZWN0cyA9IHJlc3VsdCBhcyBJRW51bWVyYWJsZTxvYmplY3Q+OwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBhcmcgaW4gb2JqZWN0cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEJ1aWxkRnVuY3Rpb25Bcmd1bWVudHMoYXJnLCBhcmdMaXN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXJncy5BZGQobmV3IEZ1bmN0aW9uQXJndW1lbnQoYXJnTGlzdCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFyZ3MuQWRkKG5ldyBGdW5jdGlvbkFyZ3VtZW50KHJlc3VsdCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHB1YmxpYyBGdW5jdGlvbkNvbXBpbGVyKEV4Y2VsRnVuY3Rpb24gZnVuY3Rpb24pIHsKKyAgICBSZXF1aXJlLlRoYXQoZnVuY3Rpb24pLk5hbWVkKCJmdW5jdGlvbiIpLklzTm90TnVsbCgpOworICAgIEZ1bmN0aW9uID0gZnVuY3Rpb247CisgIH0KIAotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGNoaWxkcmVuLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KTsKKyAgcHJvdGVjdGVkIHZvaWQgQnVpbGRGdW5jdGlvbkFyZ3VtZW50cyhvYmplY3QgcmVzdWx0LCBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+IGFyZ3MpIHsKKyAgICBpZiAocmVzdWx0IGlzIElFbnVtZXJhYmxlPG9iamVjdD4gJiYgIShyZXN1bHQgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykpIHsKKyAgICAgIHZhciBhcmdMaXN0ID0gbmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4oKTsKKyAgICAgIHZhciBvYmplY3RzID0gcmVzdWx0IGFzIElFbnVtZXJhYmxlPG9iamVjdD47CisgICAgICBmb3JlYWNoICh2YXIgYXJnIGluIG9iamVjdHMpIHsKKyAgICAgICAgQnVpbGRGdW5jdGlvbkFyZ3VtZW50cyhhcmcsIGFyZ0xpc3QpOworICAgICAgfQorICAgICAgYXJncy5BZGQobmV3KGFyZ0xpc3QpKTsKKyAgICB9IGVsc2UgeworICAgICAgYXJncy5BZGQobmV3KHJlc3VsdCkpOwogICAgIH0KKyAgfQorCisgIHB1YmxpYyBhYnN0cmFjdCBDb21waWxlUmVzdWx0IENvbXBpbGUoSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gY2hpbGRyZW4sIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpOwogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9GdW5jdGlvbkNvbXBpbGVyRmFjdG9yeS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Db21waWxlcnMvRnVuY3Rpb25Db21waWxlckZhY3RvcnkuY3MKaW5kZXggMWJmNzY5My4uMGY1NGRjYyAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9GdW5jdGlvbkNvbXBpbGVyRmFjdG9yeS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0Z1bmN0aW9uQ29tcGlsZXJGYWN0b3J5LmNzCkBAIC0xMyw1NSArMTMsNTUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRnVuY3Rpb25Db21waWxlcnMKLXsKLSAgICBwdWJsaWMgY2xhc3MgRnVuY3Rpb25Db21waWxlckZhY3RvcnkKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxUeXBlLCBGdW5jdGlvbkNvbXBpbGVyPiBfc3BlY2lhbENvbXBpbGVycyA9IG5ldyBEaWN0aW9uYXJ5PFR5cGUsIEZ1bmN0aW9uQ29tcGlsZXI+KCk7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRnVuY3Rpb25Db21waWxlcnM7CiAKLSAgICAgICAgcHVibGljIEZ1bmN0aW9uQ29tcGlsZXJGYWN0b3J5KEZ1bmN0aW9uUmVwb3NpdG9yeSByZXBvc2l0b3J5KQotICAgICAgICB7Ci0gICAgICAgICAgICBfc3BlY2lhbENvbXBpbGVycy5BZGQodHlwZW9mKElmKSwgbmV3IElmRnVuY3Rpb25Db21waWxlcihyZXBvc2l0b3J5LkdldEZ1bmN0aW9uKCJpZiIpKSk7Ci0gICAgICAgICAgICBfc3BlY2lhbENvbXBpbGVycy5BZGQodHlwZW9mKElmRXJyb3IpLCBuZXcgSWZFcnJvckZ1bmN0aW9uQ29tcGlsZXIocmVwb3NpdG9yeS5HZXRGdW5jdGlvbigiaWZlcnJvciIpKSk7Ci0gICAgICAgICAgICBfc3BlY2lhbENvbXBpbGVycy5BZGQodHlwZW9mKElmTmEpLCBuZXcgSWZOYUZ1bmN0aW9uQ29tcGlsZXIocmVwb3NpdG9yeS5HZXRGdW5jdGlvbigiaWZuYSIpKSk7Ci0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBGdW5jdGlvbkNvbXBpbGVyRmFjdG9yeSB7CisgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxUeXBlLCBGdW5jdGlvbkNvbXBpbGVyPiBfc3BlY2lhbENvbXBpbGVycyA9IG5ldygpOwogCi0gICAgICAgIHByaXZhdGUgRnVuY3Rpb25Db21waWxlciBHZXRDb21waWxlckJ5VHlwZShFeGNlbEZ1bmN0aW9uIGZ1bmN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZnVuY1R5cGUgPSBmdW5jdGlvbi5HZXRUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoX3NwZWNpYWxDb21waWxlcnMuQ29udGFpbnNLZXkoZnVuY1R5cGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc3BlY2lhbENvbXBpbGVyc1tmdW5jVHlwZV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRDb21waWxlcihmdW5jdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZpcnR1YWwgRnVuY3Rpb25Db21waWxlciBDcmVhdGUoRXhjZWxGdW5jdGlvbiBmdW5jdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGZ1bmN0aW9uLklzTG9va3VwRnVjdGlvbikgcmV0dXJuIG5ldyBMb29rdXBGdW5jdGlvbkNvbXBpbGVyKGZ1bmN0aW9uKTsKLSAgICAgICAgICAgIGlmIChmdW5jdGlvbi5Jc0Vycm9ySGFuZGxpbmdGdW5jdGlvbikgcmV0dXJuIG5ldyBFcnJvckhhbmRsaW5nRnVuY3Rpb25Db21waWxlcihmdW5jdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gR2V0Q29tcGlsZXJCeVR5cGUoZnVuY3Rpb24pOwotICAgICAgICB9CisgIHB1YmxpYyBGdW5jdGlvbkNvbXBpbGVyRmFjdG9yeShGdW5jdGlvblJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgeworICAgIF9zcGVjaWFsQ29tcGlsZXJzLkFkZCh0eXBlb2YoSWYpLCBuZXcgSWZGdW5jdGlvbkNvbXBpbGVyKHJlcG9zaXRvcnkuR2V0RnVuY3Rpb24oImlmIikpKTsKKyAgICBfc3BlY2lhbENvbXBpbGVycy5BZGQoCisgICAgICAgIHR5cGVvZihJZkVycm9yKSwKKyAgICAgICAgbmV3IElmRXJyb3JGdW5jdGlvbkNvbXBpbGVyKHJlcG9zaXRvcnkuR2V0RnVuY3Rpb24oImlmZXJyb3IiKSkpOworICAgIF9zcGVjaWFsQ29tcGlsZXJzLkFkZCh0eXBlb2YoSWZOYSksIG5ldyBJZk5hRnVuY3Rpb25Db21waWxlcihyZXBvc2l0b3J5LkdldEZ1bmN0aW9uKCJpZm5hIikpKTsKKyAgfQorCisgIHByaXZhdGUgRnVuY3Rpb25Db21waWxlciBHZXRDb21waWxlckJ5VHlwZShFeGNlbEZ1bmN0aW9uIGZ1bmN0aW9uKSB7CisgICAgdmFyIGZ1bmNUeXBlID0gZnVuY3Rpb24uR2V0VHlwZSgpOworICAgIGlmIChfc3BlY2lhbENvbXBpbGVycy5Db250YWluc0tleShmdW5jVHlwZSkpIHsKKyAgICAgIHJldHVybiBfc3BlY2lhbENvbXBpbGVyc1tmdW5jVHlwZV07CiAgICAgfQorICAgIHJldHVybiBuZXcgRGVmYXVsdENvbXBpbGVyKGZ1bmN0aW9uKTsKKyAgfQorCisgIHB1YmxpYyB2aXJ0dWFsIEZ1bmN0aW9uQ29tcGlsZXIgQ3JlYXRlKEV4Y2VsRnVuY3Rpb24gZnVuY3Rpb24pIHsKKyAgICBpZiAoZnVuY3Rpb24uSXNMb29rdXBGdWN0aW9uKSB7CisgICAgICByZXR1cm4gbmV3IExvb2t1cEZ1bmN0aW9uQ29tcGlsZXIoZnVuY3Rpb24pOworICAgIH0KKyAgICBpZiAoZnVuY3Rpb24uSXNFcnJvckhhbmRsaW5nRnVuY3Rpb24pIHsKKyAgICAgIHJldHVybiBuZXcgRXJyb3JIYW5kbGluZ0Z1bmN0aW9uQ29tcGlsZXIoZnVuY3Rpb24pOworICAgIH0KKyAgICByZXR1cm4gR2V0Q29tcGlsZXJCeVR5cGUoZnVuY3Rpb24pOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0lmRXJyb3JGdW5jdGlvbkNvbXBpbGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9JZkVycm9yRnVuY3Rpb25Db21waWxlci5jcwppbmRleCBhNDA5NjMyLi5lODA5ZWE1IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0lmRXJyb3JGdW5jdGlvbkNvbXBpbGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Db21waWxlcnMvSWZFcnJvckZ1bmN0aW9uQ29tcGlsZXIuY3MKQEAgLTEsNDggKzEsMzUgQEAKLe+7v3VzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTG9naWNhbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRnVuY3Rpb25Db21waWxlcnMKLXsKLSAgICBwdWJsaWMgY2xhc3MgSWZFcnJvckZ1bmN0aW9uQ29tcGlsZXIgOiBGdW5jdGlvbkNvbXBpbGVyCi0gICAgewotICAgICAgICBwdWJsaWMgSWZFcnJvckZ1bmN0aW9uQ29tcGlsZXIoRXhjZWxGdW5jdGlvbiBmdW5jdGlvbikKLSAgICAgICAgICAgIDogYmFzZShmdW5jdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgUmVxdWlyZS5UaGF0KGZ1bmN0aW9uKS5OYW1lZCgiZnVuY3Rpb24iKS5Jc05vdE51bGwoKTsKLSAgICAgICAgICAKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkZ1bmN0aW9uQ29tcGlsZXJzOwogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gY2hpbGRyZW4sIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjaGlsZHJlbi5Db3VudCgpICE9IDIpIHRocm93IG5ldyBFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24oZUVycm9yVHlwZS5WYWx1ZSk7Ci0gICAgICAgICAgICB2YXIgYXJncyA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCk7Ci0gICAgICAgICAgICBGdW5jdGlvbi5CZWZvcmVJbnZva2UoY29udGV4dCk7Ci0gICAgICAgICAgICB2YXIgZmlyc3RDaGlsZCA9IGNoaWxkcmVuLkZpcnN0KCk7Ci0gICAgICAgICAgICB2YXIgbGFzdENoaWxkID0gY2hpbGRyZW4uRWxlbWVudEF0KDEpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZpcnN0Q2hpbGQuQ29tcGlsZSgpOwotICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuRGF0YVR5cGUgPT0gRGF0YVR5cGUuRXhjZWxFcnJvcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3MuQWRkKG5ldyBGdW5jdGlvbkFyZ3VtZW50KGxhc3RDaGlsZC5Db21waWxlKCkuUmVzdWx0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFyZ3MuQWRkKG5ldyBGdW5jdGlvbkFyZ3VtZW50KHJlc3VsdC5SZXN1bHQpKTsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcmdzLkFkZChuZXcgRnVuY3Rpb25Bcmd1bWVudChsYXN0Q2hpbGQuQ29tcGlsZSgpLlJlc3VsdCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLkV4ZWN1dGUoYXJncywgY29udGV4dCk7Ci0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBJZkVycm9yRnVuY3Rpb25Db21waWxlciA6IEZ1bmN0aW9uQ29tcGlsZXIgeworICBwdWJsaWMgSWZFcnJvckZ1bmN0aW9uQ29tcGlsZXIoRXhjZWxGdW5jdGlvbiBmdW5jdGlvbikKKyAgICAgIDogYmFzZShmdW5jdGlvbikgeworICAgIFJlcXVpcmUuVGhhdChmdW5jdGlvbikuTmFtZWQoImZ1bmN0aW9uIikuSXNOb3ROdWxsKCk7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGNoaWxkcmVuLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgaWYgKGNoaWxkcmVuLkNvdW50KCkgIT0gMikgeworICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKICAgICB9CisgICAgdmFyIGFyZ3MgPSBuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PigpOworICAgIEZ1bmN0aW9uLkJlZm9yZUludm9rZShjb250ZXh0KTsKKyAgICB2YXIgZmlyc3RDaGlsZCA9IGNoaWxkcmVuLkZpcnN0KCk7CisgICAgdmFyIGxhc3RDaGlsZCA9IGNoaWxkcmVuLkVsZW1lbnRBdCgxKTsKKyAgICB0cnkgeworICAgICAgdmFyIHJlc3VsdCA9IGZpcnN0Q2hpbGQuQ29tcGlsZSgpOworICAgICAgaWYgKHJlc3VsdC5EYXRhVHlwZSA9PSBEYXRhVHlwZS5FeGNlbEVycm9yKSB7CisgICAgICAgIGFyZ3MuQWRkKG5ldyhsYXN0Q2hpbGQuQ29tcGlsZSgpLlJlc3VsdCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYXJncy5BZGQobmV3KHJlc3VsdC5SZXN1bHQpKTsKKyAgICAgIH0KKyAgICB9IGNhdGNoIChFeGNlbEVycm9yVmFsdWVFeGNlcHRpb24pIHsKKyAgICAgIGFyZ3MuQWRkKG5ldyhsYXN0Q2hpbGQuQ29tcGlsZSgpLlJlc3VsdCkpOworICAgIH0KKyAgICByZXR1cm4gRnVuY3Rpb24uRXhlY3V0ZShhcmdzLCBjb250ZXh0KTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9JZkZ1bmN0aW9uQ29tcGlsZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0lmRnVuY3Rpb25Db21waWxlci5jcwppbmRleCBmZmU3MGFkLi4wODE4Y2U1IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0lmRnVuY3Rpb25Db21waWxlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0lmRnVuY3Rpb25Db21waWxlci5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTAyICsxMyw5MiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDE0LTAxLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5Mb2dpY2FsOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwordXNpbmcgUmVxdWlyZSA9IE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzLlJlcXVpcmU7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5GdW5jdGlvbkNvbXBpbGVycwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gV2h5IGRvIHRoZSBJZiBmdW5jdGlvbiByZXF1aXJlIGEgY29tcGlsZXIgb2YgaXRzIG93biB5b3UgbWlnaHQgYXNrOykKLSAgICAvLy8gCi0gICAgLy8vIEl0IGlzIGJlY2F1c2UgaXQgb25seSBuZWVkcyB0byBldmFsdWF0ZSBvbmUgb2YgdGhlIHR3byBsYXN0IGV4cHJlc3Npb25zLiBUaGlzCi0gICAgLy8vIGNvbXBpbGVyIGhhbmRsZXMgdGhpcyAtIGl0IGlnbm9yZXMgdGhlIGlycmVsZXZhbnQgZXhwcmVzc2lvbi4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBJZkZ1bmN0aW9uQ29tcGlsZXIgOiBGdW5jdGlvbkNvbXBpbGVyCi0gICAgewotICAgICAgICBwdWJsaWMgSWZGdW5jdGlvbkNvbXBpbGVyKEV4Y2VsRnVuY3Rpb24gZnVuY3Rpb24pCi0gICAgICAgICAgICA6IGJhc2UoZnVuY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlcXVpcmUuVGhhdChmdW5jdGlvbikuTmFtZWQoImZ1bmN0aW9uIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICBpZiAoIShmdW5jdGlvbiBpcyBJZikpIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiZnVuY3Rpb24gbXVzdCBiZSBvZiB0eXBlIElmIik7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5GdW5jdGlvbkNvbXBpbGVyczsKIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGNoaWxkcmVuLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihjaGlsZHJlbi5Db3VudCgpIDwgMykgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKLSAgICAgICAgICAgIHZhciBhcmdzID0gbmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4oKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uLkJlZm9yZUludm9rZShjb250ZXh0KTsKLSAgICAgICAgICAgIHZhciBmaXJzdENoaWxkID0gY2hpbGRyZW4uRWxlbWVudEF0KDApOwotICAgICAgICAgICAgdmFyIHYgPSBmaXJzdENoaWxkLkNvbXBpbGUoKS5SZXN1bHQ7Ci0KLSAgICAgICAgICAgIC8qKioqICBIYW5kbGUgbmFtZXMgYW5kIHJhbmdlcyAqKioqLwotICAgICAgICAgICAgaWYgKHYgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSU5hbWVJbmZvKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHYgPSAoKEV4Y2VsRGF0YVByb3ZpZGVyLklOYW1lSW5mbyl2KS5WYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHYgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgcj0oKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pdik7Ci0gICAgICAgICAgICAgICAgaWYoci5HZXROQ2VsbHMoKT4xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJMb2dpY2FsIGNhbid0IGJlIG1vcmUgdGhhbiBvbmUgY2VsbCIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdiA9IHIuR2V0T2Zmc2V0KDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbCBib29sVmFsOwotICAgICAgICAgICAgaWYodiBpcyBib29sKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJvb2xWYWwgPSAoYm9vbCl2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKE9mZmljZU9wZW5YbWwuVXRpbHMuQ29udmVydFV0aWwuSXNOdW1lcmljKHYpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYm9vbFZhbCA9IE9mZmljZU9wZW5YbWwuVXRpbHMuQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUodikhPTA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgbG9naWNhbCB0ZXN0IikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKioqICBFbmQgSGFuZGxlIG5hbWVzIGFuZCByYW5nZXMgKioqKi8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXJncy5BZGQobmV3IEZ1bmN0aW9uQXJndW1lbnQoYm9vbFZhbCkpOwotICAgICAgICAgICAgaWYgKGJvb2xWYWwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHZhbCA9IGNoaWxkcmVuLkVsZW1lbnRBdCgxKS5Db21waWxlKCkuUmVzdWx0OwotICAgICAgICAgICAgICAgIGFyZ3MuQWRkKG5ldyBGdW5jdGlvbkFyZ3VtZW50KHZhbCkpOwotICAgICAgICAgICAgICAgIGFyZ3MuQWRkKG5ldyBGdW5jdGlvbkFyZ3VtZW50KG51bGwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgdmFsID0gY2hpbGRyZW4uRWxlbWVudEF0KDIpLkNvbXBpbGUoKS5SZXN1bHQ7Ci0gICAgICAgICAgICAgICAgYXJncy5BZGQobmV3IEZ1bmN0aW9uQXJndW1lbnQobnVsbCkpOwotICAgICAgICAgICAgICAgIGFyZ3MuQWRkKG5ldyBGdW5jdGlvbkFyZ3VtZW50KHZhbCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLkV4ZWN1dGUoYXJncywgY29udGV4dCk7Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBXaHkgZG8gdGhlIElmIGZ1bmN0aW9uIHJlcXVpcmUgYSBjb21waWxlciBvZiBpdHMgb3duIHlvdSBtaWdodCBhc2s7KQorLy8vCisvLy8gSXQgaXMgYmVjYXVzZSBpdCBvbmx5IG5lZWRzIHRvIGV2YWx1YXRlIG9uZSBvZiB0aGUgdHdvIGxhc3QgZXhwcmVzc2lvbnMuIFRoaXMKKy8vLyBjb21waWxlciBoYW5kbGVzIHRoaXMgLSBpdCBpZ25vcmVzIHRoZSBpcnJlbGV2YW50IGV4cHJlc3Npb24uCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIElmRnVuY3Rpb25Db21waWxlciA6IEZ1bmN0aW9uQ29tcGlsZXIgeworICBwdWJsaWMgSWZGdW5jdGlvbkNvbXBpbGVyKEV4Y2VsRnVuY3Rpb24gZnVuY3Rpb24pCisgICAgICA6IGJhc2UoZnVuY3Rpb24pIHsKKyAgICBSZXF1aXJlLlRoYXQoZnVuY3Rpb24pLk5hbWVkKCJmdW5jdGlvbiIpLklzTm90TnVsbCgpOworICAgIGlmICghKGZ1bmN0aW9uIGlzIElmKSkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJmdW5jdGlvbiBtdXN0IGJlIG9mIHR5cGUgSWYiKTsKICAgICB9CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGNoaWxkcmVuLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgaWYgKGNoaWxkcmVuLkNvdW50KCkgPCAzKSB7CisgICAgICB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUuVmFsdWUpOworICAgIH0KKyAgICB2YXIgYXJncyA9IG5ldyBMaXN0PEZ1bmN0aW9uQXJndW1lbnQ+KCk7CisgICAgRnVuY3Rpb24uQmVmb3JlSW52b2tlKGNvbnRleHQpOworICAgIHZhciBmaXJzdENoaWxkID0gY2hpbGRyZW4uRWxlbWVudEF0KDApOworICAgIHZhciB2ID0gZmlyc3RDaGlsZC5Db21waWxlKCkuUmVzdWx0OworCisgICAgLyoqKiogIEhhbmRsZSBuYW1lcyBhbmQgcmFuZ2VzICoqKiovCisgICAgaWYgKHYgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSU5hbWVJbmZvKSB7CisgICAgICB2ID0gKChFeGNlbERhdGFQcm92aWRlci5JTmFtZUluZm8pdikuVmFsdWU7CisgICAgfQorCisgICAgaWYgKHYgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykgeworICAgICAgdmFyIHIgPSAoKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pdik7CisgICAgICBpZiAoci5HZXROQ2VsbHMoKSA+IDEpIHsKKyAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiTG9naWNhbCBjYW4ndCBiZSBtb3JlIHRoYW4gb25lIGNlbGwiKSk7CisgICAgICB9CisgICAgICB2ID0gci5HZXRPZmZzZXQoMCwgMCk7CisgICAgfQorICAgIGJvb2wgYm9vbFZhbDsKKyAgICBpZiAodiBpcyBib29sKSB7CisgICAgICBib29sVmFsID0gKGJvb2wpdjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKENvbnZlcnRVdGlsLklzTnVtZXJpYyh2KSkgeworICAgICAgICBib29sVmFsID0gQ29udmVydFV0aWwuR2V0VmFsdWVEb3VibGUodikgIT0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgbG9naWNhbCB0ZXN0IikpOworICAgICAgfQorICAgIH0KKyAgICAvKioqKiAgRW5kIEhhbmRsZSBuYW1lcyBhbmQgcmFuZ2VzICoqKiovCisKKyAgICBhcmdzLkFkZChuZXcoYm9vbFZhbCkpOworICAgIGlmIChib29sVmFsKSB7CisgICAgICB2YXIgdmFsID0gY2hpbGRyZW4uRWxlbWVudEF0KDEpLkNvbXBpbGUoKS5SZXN1bHQ7CisgICAgICBhcmdzLkFkZChuZXcodmFsKSk7CisgICAgICBhcmdzLkFkZChuZXcobnVsbCkpOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgdmFsID0gY2hpbGRyZW4uRWxlbWVudEF0KDIpLkNvbXBpbGUoKS5SZXN1bHQ7CisgICAgICBhcmdzLkFkZChuZXcobnVsbCkpOworICAgICAgYXJncy5BZGQobmV3KHZhbCkpOworICAgIH0KKyAgICByZXR1cm4gRnVuY3Rpb24uRXhlY3V0ZShhcmdzLCBjb250ZXh0KTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9JZk5hRnVuY3Rpb25Db21waWxlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Db21waWxlcnMvSWZOYUZ1bmN0aW9uQ29tcGlsZXIuY3MKaW5kZXggZWNmZmYzMS4uNTVmMTViMiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9JZk5hRnVuY3Rpb25Db21waWxlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0lmTmFGdW5jdGlvbkNvbXBpbGVyLmNzCkBAIC0xLDQ2ICsxLDMzIEBACi3vu791c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkZ1bmN0aW9uQ29tcGlsZXJzCi17Ci0gICAgcHVibGljIGNsYXNzIElmTmFGdW5jdGlvbkNvbXBpbGVyIDogRnVuY3Rpb25Db21waWxlcgotICAgIHsKLSAgICAgICAgcHVibGljIElmTmFGdW5jdGlvbkNvbXBpbGVyKEV4Y2VsRnVuY3Rpb24gZnVuY3Rpb24pCi0gICAgICAgICAgICA6YmFzZShmdW5jdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5GdW5jdGlvbkNvbXBpbGVyczsKIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGNoaWxkcmVuLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2hpbGRyZW4uQ291bnQoKSAhPSAyKSB0aHJvdyBuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKGVFcnJvclR5cGUuVmFsdWUpOwotICAgICAgICAgICAgdmFyIGFyZ3MgPSBuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PigpOwotICAgICAgICAgICAgRnVuY3Rpb24uQmVmb3JlSW52b2tlKGNvbnRleHQpOwotICAgICAgICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBjaGlsZHJlbi5GaXJzdCgpOwotICAgICAgICAgICAgdmFyIGxhc3RDaGlsZCA9IGNoaWxkcmVuLkVsZW1lbnRBdCgxKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBmaXJzdENoaWxkLkNvbXBpbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0LkRhdGFUeXBlID09IERhdGFUeXBlLkV4Y2VsRXJyb3IgJiYgKEVxdWFscyhyZXN1bHQuUmVzdWx0LAotICAgICAgICAgICAgICAgICAgICBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTkEpKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhcmdzLkFkZChuZXcgRnVuY3Rpb25Bcmd1bWVudChsYXN0Q2hpbGQuQ29tcGlsZSgpLlJlc3VsdCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhcmdzLkFkZChuZXcgRnVuY3Rpb25Bcmd1bWVudChyZXN1bHQuUmVzdWx0KSk7Ci0gICAgICAgICAgICAgICAgfQorcHVibGljIGNsYXNzIElmTmFGdW5jdGlvbkNvbXBpbGVyIDogRnVuY3Rpb25Db21waWxlciB7CisgIHB1YmxpYyBJZk5hRnVuY3Rpb25Db21waWxlcihFeGNlbEZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgICAgOiBiYXNlKGZ1bmN0aW9uKSB7fQogCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFyZ3MuQWRkKG5ldyBGdW5jdGlvbkFyZ3VtZW50KGxhc3RDaGlsZC5Db21waWxlKCkuUmVzdWx0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gRnVuY3Rpb24uRXhlY3V0ZShhcmdzLCBjb250ZXh0KTsKLSAgICAgICAgfQorICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGNoaWxkcmVuLCBQYXJzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgaWYgKGNoaWxkcmVuLkNvdW50KCkgIT0gMikgeworICAgICAgdGhyb3cgbmV3IEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbihlRXJyb3JUeXBlLlZhbHVlKTsKICAgICB9CisgICAgdmFyIGFyZ3MgPSBuZXcgTGlzdDxGdW5jdGlvbkFyZ3VtZW50PigpOworICAgIEZ1bmN0aW9uLkJlZm9yZUludm9rZShjb250ZXh0KTsKKyAgICB2YXIgZmlyc3RDaGlsZCA9IGNoaWxkcmVuLkZpcnN0KCk7CisgICAgdmFyIGxhc3RDaGlsZCA9IGNoaWxkcmVuLkVsZW1lbnRBdCgxKTsKKyAgICB0cnkgeworICAgICAgdmFyIHJlc3VsdCA9IGZpcnN0Q2hpbGQuQ29tcGlsZSgpOworICAgICAgaWYgKHJlc3VsdC5EYXRhVHlwZSA9PSBEYXRhVHlwZS5FeGNlbEVycm9yCisgICAgICAgICAgJiYgKEVxdWFscyhyZXN1bHQuUmVzdWx0LCBFeGNlbEVycm9yVmFsdWUuQ3JlYXRlKGVFcnJvclR5cGUuTmEpKSkpIHsKKyAgICAgICAgYXJncy5BZGQobmV3KGxhc3RDaGlsZC5Db21waWxlKCkuUmVzdWx0KSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBhcmdzLkFkZChuZXcocmVzdWx0LlJlc3VsdCkpOworICAgICAgfQorICAgIH0gY2F0Y2ggKEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbikgeworICAgICAgYXJncy5BZGQobmV3KGxhc3RDaGlsZC5Db21waWxlKCkuUmVzdWx0KSk7CisgICAgfQorICAgIHJldHVybiBGdW5jdGlvbi5FeGVjdXRlKGFyZ3MsIGNvbnRleHQpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0xvb2t1cEZ1bmN0aW9uQ29tcGlsZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uQ29tcGlsZXJzL0xvb2t1cEZ1bmN0aW9uQ29tcGlsZXIuY3MKaW5kZXggOTQ0MDU5NC4uYTM1MDUwNCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkNvbXBpbGVycy9Mb29rdXBGdW5jdGlvbkNvbXBpbGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvRnVuY3Rpb25Db21waWxlcnMvTG9va3VwRnVuY3Rpb25Db21waWxlci5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsNTYgKzEzLDQ0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGguRnVuY3Rpb25Db21waWxlcnMKLXsKLSAgICBwdWJsaWMgY2xhc3MgTG9va3VwRnVuY3Rpb25Db21waWxlciA6IEZ1bmN0aW9uQ29tcGlsZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBMb29rdXBGdW5jdGlvbkNvbXBpbGVyKEV4Y2VsRnVuY3Rpb24gZnVuY3Rpb24pCi0gICAgICAgICAgICA6IGJhc2UoZnVuY3Rpb24pCi0gICAgICAgIHsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaC5GdW5jdGlvbkNvbXBpbGVyczsKIAotICAgICAgICB9CitwdWJsaWMgY2xhc3MgTG9va3VwRnVuY3Rpb25Db21waWxlciA6IEZ1bmN0aW9uQ29tcGlsZXIgeworICBwdWJsaWMgTG9va3VwRnVuY3Rpb25Db21waWxlcihFeGNlbEZ1bmN0aW9uIGZ1bmN0aW9uKQorICAgICAgOiBiYXNlKGZ1bmN0aW9uKSB7fQogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gY2hpbGRyZW4sIFBhcnNpbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhcmdzID0gbmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4oKTsKLSAgICAgICAgICAgIEZ1bmN0aW9uLkJlZm9yZUludm9rZShjb250ZXh0KTsKLSAgICAgICAgICAgIHZhciBmaXJzdENoaWxkID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBjaGlsZCBpbiBjaGlsZHJlbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIWZpcnN0Q2hpbGQgfHwgRnVuY3Rpb24uU2tpcEFyZ3VtZW50RXZhbHVhdGlvbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkLlBhcmVudElzTG9va3VwRnVuY3Rpb24gPSBGdW5jdGlvbi5Jc0xvb2t1cEZ1Y3Rpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpcnN0Q2hpbGQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFyIGFyZyA9IGNoaWxkLkNvbXBpbGUoKTsKLSAgICAgICAgICAgICAgICBCdWlsZEZ1bmN0aW9uQXJndW1lbnRzKGFyZyAhPSBudWxsID8gYXJnLlJlc3VsdCA6IG51bGwsIGFyZ3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uLkV4ZWN1dGUoYXJncywgY29udGV4dCk7Ci0gICAgICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZShJRW51bWVyYWJsZTxFeHByZXNzaW9uPiBjaGlsZHJlbiwgUGFyc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgIHZhciBhcmdzID0gbmV3IExpc3Q8RnVuY3Rpb25Bcmd1bWVudD4oKTsKKyAgICBGdW5jdGlvbi5CZWZvcmVJbnZva2UoY29udGV4dCk7CisgICAgdmFyIGZpcnN0Q2hpbGQgPSB0cnVlOworICAgIGZvcmVhY2ggKHZhciBjaGlsZCBpbiBjaGlsZHJlbikgeworICAgICAgaWYgKCFmaXJzdENoaWxkIHx8IEZ1bmN0aW9uLlNraXBBcmd1bWVudEV2YWx1YXRpb24pIHsKKyAgICAgICAgY2hpbGQuUGFyZW50SXNMb29rdXBGdW5jdGlvbiA9IEZ1bmN0aW9uLklzTG9va3VwRnVjdGlvbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpcnN0Q2hpbGQgPSBmYWxzZTsKKyAgICAgIH0KKyAgICAgIHZhciBhcmcgPSBjaGlsZC5Db21waWxlKCk7CisgICAgICBCdWlsZEZ1bmN0aW9uQXJndW1lbnRzKGFyZyAhPSBudWxsID8gYXJnLlJlc3VsdCA6IG51bGwsIGFyZ3MpOwogICAgIH0KKyAgICByZXR1cm4gRnVuY3Rpb24uRXhlY3V0ZShhcmdzLCBjb250ZXh0KTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9GdW5jdGlvbkV4cHJlc3Npb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uRXhwcmVzc2lvbi5jcwppbmRleCAyNDE5M2NhLi4wZjM5YmQ1IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uRXhwcmVzc2lvbi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0Z1bmN0aW9uRXhwcmVzc2lvbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTIyICsxMyw5OCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKKwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoLkZ1bmN0aW9uQ29tcGlsZXJzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBFeHByZXNzaW9uIHRoYXQgaGFuZGxlcyBleGVjdXRpb24gb2YgYSBmdW5jdGlvbi4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBGdW5jdGlvbkV4cHJlc3Npb24gOiBBdG9taWNFeHByZXNzaW9uCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImV4cHJlc3Npb24iPnNob3VsZCBiZSB0aGUgb2YgdGhlIGZ1bmN0aW9uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXJzaW5nQ29udGV4dCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpc05lZ2F0ZWQiPlRydWUgaWYgdGhlIG51bWVyaWMgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBzaG91bGQgYmUgbmVnYXRlZC48L3BhcmFtPgotICAgICAgICBwdWJsaWMgRnVuY3Rpb25FeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCwgYm9vbCBpc05lZ2F0ZWQpCi0gICAgICAgICAgICA6IGJhc2UoZXhwcmVzc2lvbikKLSAgICAgICAgewotICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0ID0gcGFyc2luZ0NvbnRleHQ7Ci0gICAgICAgICAgICBfZnVuY3Rpb25Db21waWxlckZhY3RvcnkgPSBuZXcgRnVuY3Rpb25Db21waWxlckZhY3RvcnkocGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5GdW5jdGlvblJlcG9zaXRvcnkpOwotICAgICAgICAgICAgX2lzTmVnYXRlZCA9IGlzTmVnYXRlZDsKLSAgICAgICAgICAgIGJhc2UuQWRkQ2hpbGQobmV3IEZ1bmN0aW9uQXJndW1lbnRFeHByZXNzaW9uKHRoaXMpKTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEV4cHJlc3Npb24gdGhhdCBoYW5kbGVzIGV4ZWN1dGlvbiBvZiBhIGZ1bmN0aW9uLgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBGdW5jdGlvbkV4cHJlc3Npb24gOiBBdG9taWNFeHByZXNzaW9uIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29uc3RydWN0b3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJleHByZXNzaW9uIj5zaG91bGQgYmUgdGhlIG9mIHRoZSBmdW5jdGlvbjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icGFyc2luZ0NvbnRleHQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXNOZWdhdGVkIj5UcnVlIGlmIHRoZSBudW1lcmljIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIG5lZ2F0ZWQuPC9wYXJhbT4KKyAgcHVibGljIEZ1bmN0aW9uRXhwcmVzc2lvbihzdHJpbmcgZXhwcmVzc2lvbiwgUGFyc2luZ0NvbnRleHQgcGFyc2luZ0NvbnRleHQsIGJvb2wgaXNOZWdhdGVkKQorICAgICAgOiBiYXNlKGV4cHJlc3Npb24pIHsKKyAgICBfcGFyc2luZ0NvbnRleHQgPSBwYXJzaW5nQ29udGV4dDsKKyAgICBfZnVuY3Rpb25Db21waWxlckZhY3RvcnkgPSBuZXcocGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5GdW5jdGlvblJlcG9zaXRvcnkpOworICAgIF9pc05lZ2F0ZWQgPSBpc05lZ2F0ZWQ7CisgICAgYmFzZS5BZGRDaGlsZChuZXcgRnVuY3Rpb25Bcmd1bWVudEV4cHJlc3Npb24odGhpcykpOworICB9CisKKyAgcHJpdmF0ZSByZWFkb25seSBQYXJzaW5nQ29udGV4dCBfcGFyc2luZ0NvbnRleHQ7CisgIHByaXZhdGUgcmVhZG9ubHkgRnVuY3Rpb25Db21waWxlckZhY3RvcnkgX2Z1bmN0aW9uQ29tcGlsZXJGYWN0b3J5OworICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX2lzTmVnYXRlZDsKKworICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKCkgeworICAgIHRyeSB7CisgICAgICB2YXIgZnVuY3Rpb24gPSBfcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5GdW5jdGlvblJlcG9zaXRvcnkuR2V0RnVuY3Rpb24oRXhwcmVzc2lvblN0cmluZyk7CisgICAgICBpZiAoZnVuY3Rpb24gPT0gbnVsbCkgeworICAgICAgICBpZiAoX3BhcnNpbmdDb250ZXh0LkRlYnVnKSB7CisgICAgICAgICAgX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uTG9nZ2VyLkxvZygKKyAgICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0LAorICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KCInezB9JyBpcyBub3QgYSBzdXBwb3J0ZWQgZnVuY3Rpb24iLCBFeHByZXNzaW9uU3RyaW5nKSk7CiAgICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGdW5jdGlvbkNvbXBpbGVyRmFjdG9yeSBfZnVuY3Rpb25Db21waWxlckZhY3Rvcnk7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfaXNOZWdhdGVkOwotCi0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBmdW5jdGlvbiA9IF9wYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeS5HZXRGdW5jdGlvbihFeHByZXNzaW9uU3RyaW5nKTsKLSAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb24gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfcGFyc2luZ0NvbnRleHQuRGVidWcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkxvZ2dlci5Mb2coX3BhcnNpbmdDb250ZXh0LCBzdHJpbmcuRm9ybWF0KCInezB9JyBpcyBub3QgYSBzdXBwb3J0ZWQgZnVuY3Rpb24iLCBFeHByZXNzaW9uU3RyaW5nKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5OYW1lKSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChfcGFyc2luZ0NvbnRleHQuRGVidWcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5Mb2dnZXIuTG9nRnVuY3Rpb24oRXhwcmVzc2lvblN0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhciBjb21waWxlciA9IF9mdW5jdGlvbkNvbXBpbGVyRmFjdG9yeS5DcmVhdGUoZnVuY3Rpb24pOwotICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBjb21waWxlci5Db21waWxlKEhhc0NoaWxkcmVuID8gQ2hpbGRyZW4gOiBFbnVtZXJhYmxlLkVtcHR5PEV4cHJlc3Npb24+KCksIF9wYXJzaW5nQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKF9pc05lZ2F0ZWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5Jc051bWVyaWMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcGFyc2luZ0NvbnRleHQuRGVidWcpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1zZyA9IHN0cmluZy5Gb3JtYXQoIlRyeWluZyB0byBuZWdhdGUgYSBub24tbnVtZXJpYyB2YWx1ZSAoezB9KSBpbiBmdW5jdGlvbiAnezF9JyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5SZXN1bHQsIEV4cHJlc3Npb25TdHJpbmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkxvZ2dlci5Mb2coX3BhcnNpbmdDb250ZXh0LCBtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSksIERhdGFUeXBlLkV4Y2VsRXJyb3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChyZXN1bHQuUmVzdWx0TnVtZXJpYyAqIC0xLCByZXN1bHQuRGF0YVR5cGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfcGFyc2luZ0NvbnRleHQuRGVidWcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5Mb2dnZXIuTG9nKF9wYXJzaW5nQ29udGV4dCwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChlLkVycm9yVmFsdWUsIERhdGFUeXBlLkV4Y2VsRXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCisgICAgICAgIHJldHVybiBuZXcoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLk5hbWUpLCBEYXRhVHlwZS5FeGNlbEVycm9yKTsKKyAgICAgIH0KKyAgICAgIGlmIChfcGFyc2luZ0NvbnRleHQuRGVidWcpIHsKKyAgICAgICAgX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uTG9nZ2VyLkxvZ0Z1bmN0aW9uKEV4cHJlc3Npb25TdHJpbmcpOworICAgICAgfQorICAgICAgdmFyIGNvbXBpbGVyID0gX2Z1bmN0aW9uQ29tcGlsZXJGYWN0b3J5LkNyZWF0ZShmdW5jdGlvbik7CisgICAgICB2YXIgcmVzdWx0ID0gY29tcGlsZXIuQ29tcGlsZSgKKyAgICAgICAgICBIYXNDaGlsZHJlbiA/IENoaWxkcmVuIDogRW51bWVyYWJsZS5FbXB0eTxFeHByZXNzaW9uPigpLAorICAgICAgICAgIF9wYXJzaW5nQ29udGV4dCk7CisgICAgICBpZiAoX2lzTmVnYXRlZCkgeworICAgICAgICBpZiAoIXJlc3VsdC5Jc051bWVyaWMpIHsKKyAgICAgICAgICBpZiAoX3BhcnNpbmdDb250ZXh0LkRlYnVnKSB7CisgICAgICAgICAgICB2YXIgbXNnID0gc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgICAiVHJ5aW5nIHRvIG5lZ2F0ZSBhIG5vbi1udW1lcmljIHZhbHVlICh7MH0pIGluIGZ1bmN0aW9uICd7MX0nIiwKKyAgICAgICAgICAgICAgICByZXN1bHQuUmVzdWx0LAorICAgICAgICAgICAgICAgIEV4cHJlc3Npb25TdHJpbmcpOworICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uTG9nZ2VyLkxvZyhfcGFyc2luZ0NvbnRleHQsIG1zZyk7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBuZXcoRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKSwgRGF0YVR5cGUuRXhjZWxFcnJvcik7CiAgICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRXhwcmVzc2lvbiBQcmVwYXJlRm9yTmV4dENoaWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGJhc2UuQWRkQ2hpbGQobmV3IEZ1bmN0aW9uQXJndW1lbnRFeHByZXNzaW9uKHRoaXMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEhhc0NoaWxkcmVuCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoQ2hpbGRyZW4uQW55KCkgJiYgQ2hpbGRyZW4uRmlyc3QoKS5DaGlsZHJlbi5BbnkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgRXhwcmVzc2lvbiBBZGRDaGlsZChFeHByZXNzaW9uIGNoaWxkKQotICAgICAgICB7Ci0gICAgICAgICAgICBDaGlsZHJlbi5MYXN0KCkuQWRkQ2hpbGQoY2hpbGQpOwotICAgICAgICAgICAgcmV0dXJuIGNoaWxkOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcocmVzdWx0LlJlc3VsdE51bWVyaWMgKiAtMSwgcmVzdWx0LkRhdGFUeXBlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfSBjYXRjaCAoRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIGUpIHsKKyAgICAgIGlmIChfcGFyc2luZ0NvbnRleHQuRGVidWcpIHsKKyAgICAgICAgX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uTG9nZ2VyLkxvZyhfcGFyc2luZ0NvbnRleHQsIGUpOworICAgICAgfQorICAgICAgcmV0dXJuIG5ldyhlLkVycm9yVmFsdWUsIERhdGFUeXBlLkV4Y2VsRXJyb3IpOwogICAgIH0KKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBFeHByZXNzaW9uIFByZXBhcmVGb3JOZXh0Q2hpbGQoKSB7CisgICAgcmV0dXJuIGJhc2UuQWRkQ2hpbGQobmV3IEZ1bmN0aW9uQXJndW1lbnRFeHByZXNzaW9uKHRoaXMpKTsKKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBib29sIEhhc0NoaWxkcmVuID0+IChDaGlsZHJlbi5BbnkoKSAmJiBDaGlsZHJlbi5GaXJzdCgpLkNoaWxkcmVuLkFueSgpKTsKKworICBwdWJsaWMgb3ZlcnJpZGUgRXhwcmVzc2lvbiBBZGRDaGlsZChFeHByZXNzaW9uIGNoaWxkKSB7CisgICAgQ2hpbGRyZW4uTGFzdCgpLkFkZENoaWxkKGNoaWxkKTsKKyAgICByZXR1cm4gY2hpbGQ7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvR3JvdXBFeHByZXNzaW9uLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Hcm91cEV4cHJlc3Npb24uY3MKaW5kZXggZThkYmEyMC4uNTRkZjEzMSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Hcm91cEV4cHJlc3Npb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9Hcm91cEV4cHJlc3Npb24uY3MKQEAgLTEzLDY1ICsxMyw0NSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgR3JvdXBFeHByZXNzaW9uIDogRXhwcmVzc2lvbgotICAgIHsKLSAgICAgICAgcHVibGljIEdyb3VwRXhwcmVzc2lvbihib29sIGlzTmVnYXRlZCkKLSAgICAgICAgICAgIDogdGhpcyhpc05lZ2F0ZWQsIG5ldyBFeHByZXNzaW9uQ29tcGlsZXIoKSkKLSAgICAgICAgeworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBHcm91cEV4cHJlc3Npb24gOiBFeHByZXNzaW9uIHsKKyAgcHVibGljIEdyb3VwRXhwcmVzc2lvbihib29sIGlzTmVnYXRlZCkKKyAgICAgIDogdGhpcyhpc05lZ2F0ZWQsIG5ldyBFeHByZXNzaW9uQ29tcGlsZXIoKSkge30KIAotICAgICAgICBwdWJsaWMgR3JvdXBFeHByZXNzaW9uKGJvb2wgaXNOZWdhdGVkLCBJRXhwcmVzc2lvbkNvbXBpbGVyIGV4cHJlc3Npb25Db21waWxlcikKLSAgICAgICAgewotICAgICAgICAgICAgX2V4cHJlc3Npb25Db21waWxlciA9IGV4cHJlc3Npb25Db21waWxlcjsKLSAgICAgICAgICAgIF9pc05lZ2F0ZWQgPSBpc05lZ2F0ZWQ7Ci0gICAgICAgIH0KKyAgcHVibGljIEdyb3VwRXhwcmVzc2lvbihib29sIGlzTmVnYXRlZCwgSUV4cHJlc3Npb25Db21waWxlciBleHByZXNzaW9uQ29tcGlsZXIpIHsKKyAgICBfZXhwcmVzc2lvbkNvbXBpbGVyID0gZXhwcmVzc2lvbkNvbXBpbGVyOworICAgIF9pc05lZ2F0ZWQgPSBpc05lZ2F0ZWQ7CisgIH0KIAotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElFeHByZXNzaW9uQ29tcGlsZXIgX2V4cHJlc3Npb25Db21waWxlcjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBib29sIF9pc05lZ2F0ZWQ7CisgIHByaXZhdGUgcmVhZG9ubHkgSUV4cHJlc3Npb25Db21waWxlciBfZXhwcmVzc2lvbkNvbXBpbGVyOworICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgX2lzTmVnYXRlZDsKIAotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVzdWx0ID0gIF9leHByZXNzaW9uQ29tcGlsZXIuQ29tcGlsZShDaGlsZHJlbik7Ci0gICAgICAgICAgICBpZiAocmVzdWx0LklzTnVtZXJpYyAmJiBfaXNOZWdhdGVkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChyZXN1bHQuUmVzdWx0TnVtZXJpYyAqIC0xLCByZXN1bHQuRGF0YVR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIElzR3JvdXBlZEV4cHJlc3Npb24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIElzTmVnYXRlZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX2lzTmVnYXRlZDsgfQotICAgICAgICB9Ci0KKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpIHsKKyAgICB2YXIgcmVzdWx0ID0gX2V4cHJlc3Npb25Db21waWxlci5Db21waWxlKENoaWxkcmVuKTsKKyAgICBpZiAocmVzdWx0LklzTnVtZXJpYyAmJiBfaXNOZWdhdGVkKSB7CisgICAgICByZXR1cm4gbmV3KHJlc3VsdC5SZXN1bHROdW1lcmljICogLTEsIHJlc3VsdC5EYXRhVHlwZSk7CiAgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBJc0dyb3VwZWRFeHByZXNzaW9uID0+IHRydWU7CisKKyAgcHVibGljIGJvb2wgSXNOZWdhdGVkID0+IF9pc05lZ2F0ZWQ7CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0lFeHByZXNzaW9uQ29tcGlsZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0lFeHByZXNzaW9uQ29tcGlsZXIuY3MKaW5kZXggM2ZiMzllZS4uYzdlZjhkZCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9JRXhwcmVzc2lvbkNvbXBpbGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvSUV4cHJlc3Npb25Db21waWxlci5jcwpAQCAtMTMsMzAgKzEzLDI2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaAotewotICAgIHB1YmxpYyBpbnRlcmZhY2UgSUV4cHJlc3Npb25Db21waWxlcgotICAgIHsKLSAgICAgICAgQ29tcGlsZVJlc3VsdCBDb21waWxlKElFbnVtZXJhYmxlPEV4cHJlc3Npb24+IGV4cHJlc3Npb25zKTsKLSAgICB9Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOworCitwdWJsaWMgaW50ZXJmYWNlIElFeHByZXNzaW9uQ29tcGlsZXIgeworICBDb21waWxlUmVzdWx0IENvbXBpbGUoSUVudW1lcmFibGU8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMpOwogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9JRXhwcmVzc2lvbkNvbnZlcnRlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvSUV4cHJlc3Npb25Db252ZXJ0ZXIuY3MKaW5kZXggNjYwZGY5Ny4uMGExYjkwMSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9JRXhwcmVzc2lvbkNvbnZlcnRlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0lFeHByZXNzaW9uQ29udmVydGVyLmNzCkBAIC0xMywzMSArMTMsMjYgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0gICAgcHVibGljIGludGVyZmFjZSBJRXhwcmVzc2lvbkNvbnZlcnRlcgotICAgIHsKLSAgICAgICAgU3RyaW5nRXhwcmVzc2lvbiBUb1N0cmluZ0V4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKLSAgICAgICAgRXhwcmVzc2lvbiBGcm9tQ29tcGlsZVJlc3VsdChDb21waWxlUmVzdWx0IGNvbXBpbGVSZXN1bHQpOwotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworcHVibGljIGludGVyZmFjZSBJRXhwcmVzc2lvbkNvbnZlcnRlciB7CisgIFN0cmluZ0V4cHJlc3Npb24gVG9TdHJpbmdFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbik7CisKKyAgRXhwcmVzc2lvbiBGcm9tQ29tcGlsZVJlc3VsdChDb21waWxlUmVzdWx0IGNvbXBpbGVSZXN1bHQpOwogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9JRXhwcmVzc2lvbkZhY3RvcnkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0lFeHByZXNzaW9uRmFjdG9yeS5jcwppbmRleCA5NDRiMTE4Li4yZTg5YjJhIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0lFeHByZXNzaW9uRmFjdG9yeS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0lFeHByZXNzaW9uRmFjdG9yeS5jcwpAQCAtMTMsMzEgKzEzLDI2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CisKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKLXsKLSAgICBwdWJsaWMgaW50ZXJmYWNlIElFeHByZXNzaW9uRmFjdG9yeQotICAgIHsKLSAgICAgICAgRXhwcmVzc2lvbiBDcmVhdGUoVG9rZW4gdG9rZW4pOwotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworcHVibGljIGludGVyZmFjZSBJRXhwcmVzc2lvbkZhY3RvcnkgeworICBFeHByZXNzaW9uIENyZWF0ZShUb2tlbiB0b2tlbik7CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0lFeHByZXNzaW9uR3JhcGhCdWlsZGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9JRXhwcmVzc2lvbkdyYXBoQnVpbGRlci5jcwppbmRleCBjYjllMTIyLi4yZmFkNjY3IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0lFeHByZXNzaW9uR3JhcGhCdWlsZGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvSUV4cHJlc3Npb25HcmFwaEJ1aWxkZXIuY3MKQEAgLTEzLDMxICsxMywyNyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0gICAgcHVibGljIGludGVyZmFjZSBJRXhwcmVzc2lvbkdyYXBoQnVpbGRlcgotICAgIHsKLSAgICAgICAgRXhwcmVzc2lvbkdyYXBoIEJ1aWxkKElFbnVtZXJhYmxlPFRva2VuPiB0b2tlbnMpOwotICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4cHJlc3Npb25HcmFwaDsKKworcHVibGljIGludGVyZmFjZSBJRXhwcmVzc2lvbkdyYXBoQnVpbGRlciB7CisgIEV4cHJlc3Npb25HcmFwaCBCdWlsZChJRW51bWVyYWJsZTxUb2tlbj4gdG9rZW5zKTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvSW50ZWdlckV4cHJlc3Npb24uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL0ludGVnZXJFeHByZXNzaW9uLmNzCmluZGV4IDRlNTcxNjguLjk3M2I1MjMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvSW50ZWdlckV4cHJlc3Npb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9JbnRlZ2VyRXhwcmVzc2lvbi5jcwpAQCAtMTMsNjMgKzEzLDUxIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgSW50ZWdlckV4cHJlc3Npb24gOiBBdG9taWNFeHByZXNzaW9uCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRvdWJsZT8gX2NvbXBpbGVkVmFsdWU7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYm9vbCBfbmVnYXRlOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwogCi0gICAgICAgIHB1YmxpYyBJbnRlZ2VyRXhwcmVzc2lvbihzdHJpbmcgZXhwcmVzc2lvbikKLSAgICAgICAgICAgIDogdGhpcyhleHByZXNzaW9uLCBmYWxzZSkKLSAgICAgICAgeworcHVibGljIGNsYXNzIEludGVnZXJFeHByZXNzaW9uIDogQXRvbWljRXhwcmVzc2lvbiB7CisgIHByaXZhdGUgcmVhZG9ubHkgZG91YmxlPyBfY29tcGlsZWRWYWx1ZTsKKyAgcHJpdmF0ZSByZWFkb25seSBib29sIF9uZWdhdGU7CiAKLSAgICAgICAgfQorICBwdWJsaWMgSW50ZWdlckV4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24pCisgICAgICA6IHRoaXMoZXhwcmVzc2lvbiwgZmFsc2UpIHt9CiAKLSAgICAgICAgcHVibGljIEludGVnZXJFeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uLCBib29sIG5lZ2F0ZSkKLSAgICAgICAgICAgIDogYmFzZShleHByZXNzaW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbmVnYXRlID0gbmVnYXRlOwotICAgICAgICB9CisgIHB1YmxpYyBJbnRlZ2VyRXhwcmVzc2lvbihzdHJpbmcgZXhwcmVzc2lvbiwgYm9vbCBuZWdhdGUpCisgICAgICA6IGJhc2UoZXhwcmVzc2lvbikgeworICAgIF9uZWdhdGUgPSBuZWdhdGU7CisgIH0KIAotICAgICAgICBwdWJsaWMgSW50ZWdlckV4cHJlc3Npb24oZG91YmxlIHZhbCkKLSAgICAgICAgICAgIDogYmFzZSh2YWwuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb21waWxlZFZhbHVlID0gTWF0aC5GbG9vcih2YWwpOwotICAgICAgICB9CisgIHB1YmxpYyBJbnRlZ2VyRXhwcmVzc2lvbihkb3VibGUgdmFsKQorICAgICAgOiBiYXNlKHZhbC5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkgeworICAgIF9jb21waWxlZFZhbHVlID0gTWF0aC5GbG9vcih2YWwpOworICB9CiAKLSAgICAgICAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRvdWJsZSByZXN1bHQgPSBfY29tcGlsZWRWYWx1ZS5IYXNWYWx1ZSA/IF9jb21waWxlZFZhbHVlLlZhbHVlIDogZG91YmxlLlBhcnNlKEV4cHJlc3Npb25TdHJpbmcsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgICAgcmVzdWx0ID0gX25lZ2F0ZSA/IHJlc3VsdCotMSA6IHJlc3VsdDsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGlsZVJlc3VsdChyZXN1bHQsIERhdGFUeXBlLkludGVnZXIpOwotICAgICAgICB9CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoKSB7CisgICAgZG91YmxlIHJlc3VsdCA9IF9jb21waWxlZFZhbHVlLkhhc1ZhbHVlCisgICAgICAgID8gX2NvbXBpbGVkVmFsdWUuVmFsdWUKKyAgICAgICAgOiBkb3VibGUuUGFyc2UoRXhwcmVzc2lvblN0cmluZywgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgcmVzdWx0ID0gX25lZ2F0ZSA/IHJlc3VsdCAqIC0xIDogcmVzdWx0OworICAgIHJldHVybiBuZXcocmVzdWx0LCBEYXRhVHlwZS5JbnRlZ2VyKTsKKyAgfQogCi0gICAgICAgIHB1YmxpYyBib29sIElzTmVnYXRlZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX25lZ2F0ZTsgfQotICAgICAgICB9Ci0KLSAgICB9CisgIHB1YmxpYyBib29sIElzTmVnYXRlZCA9PiBfbmVnYXRlOwogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9OYW1lZFZhbHVlRXhwcmVzc2lvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvTmFtZWRWYWx1ZUV4cHJlc3Npb24uY3MKaW5kZXggM2M1NGJjOC4uMDgwZjhhMCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9OYW1lZFZhbHVlRXhwcmVzc2lvbi5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL05hbWVkVmFsdWVFeHByZXNzaW9uLmNzCkBAIC0xMyw3OCArMTMsNjIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGgKLXsKLSAgICBwdWJsaWMgY2xhc3MgTmFtZWRWYWx1ZUV4cHJlc3Npb24gOiBBdG9taWNFeHByZXNzaW9uCi0gICAgewotICAgICAgICBwdWJsaWMgTmFtZWRWYWx1ZUV4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24sIFBhcnNpbmdDb250ZXh0IHBhcnNpbmdDb250ZXh0KQotICAgICAgICAgICAgOiBiYXNlKGV4cHJlc3Npb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dCA9IHBhcnNpbmdDb250ZXh0OwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBQYXJzaW5nQ29udGV4dCBfcGFyc2luZ0NvbnRleHQ7CitwdWJsaWMgY2xhc3MgTmFtZWRWYWx1ZUV4cHJlc3Npb24gOiBBdG9taWNFeHByZXNzaW9uIHsKKyAgcHVibGljIE5hbWVkVmFsdWVFeHByZXNzaW9uKHN0cmluZyBleHByZXNzaW9uLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkKKyAgICAgIDogYmFzZShleHByZXNzaW9uKSB7CisgICAgX3BhcnNpbmdDb250ZXh0ID0gcGFyc2luZ0NvbnRleHQ7CisgIH0KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGMgPSB0aGlzLl9wYXJzaW5nQ29udGV4dC5TY29wZXMuQ3VycmVudDsKLSAgICAgICAgICAgIHZhciBuYW1lID0gX3BhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyLkdldE5hbWUoYy5BZGRyZXNzLldvcmtzaGVldCwgRXhwcmVzc2lvblN0cmluZyk7Ci0gICAgICAgICAgICAvL3ZhciByZXN1bHQgPSBfcGFyc2luZ0NvbnRleHQuUGFyc2VyLlBhcnNlKHZhbHVlLlRvU3RyaW5nKCkpOworICBwcml2YXRlIHJlYWRvbmx5IFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKIAotICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbnMuRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5OYW1lKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG5hbWUuVmFsdWU9PW51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobmFtZS5WYWx1ZSBpcyBFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IChFeGNlbERhdGFQcm92aWRlci5JUmFuZ2VJbmZvKW5hbWUuVmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKHJhbmdlLklzTXVsdGkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBpbGVSZXN1bHQobmFtZS5WYWx1ZSwgRGF0YVR5cGUuRW51bWVyYWJsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZS5Jc0VtcHR5KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBDb21waWxlUmVzdWx0RmFjdG9yeSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5DcmVhdGUocmFuZ2UuRmlyc3QoKS5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB2YXIgZmFjdG9yeSA9IG5ldyBDb21waWxlUmVzdWx0RmFjdG9yeSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LkNyZWF0ZShuYW1lLlZhbHVlKTsKLSAgICAgICAgICAgIH0KKyAgcHVibGljIG92ZXJyaWRlIENvbXBpbGVSZXN1bHQgQ29tcGlsZSgpIHsKKyAgICB2YXIgYyA9IF9wYXJzaW5nQ29udGV4dC5TY29wZXMuQ3VycmVudDsKKyAgICB2YXIgbmFtZSA9IF9wYXJzaW5nQ29udGV4dC5FeGNlbERhdGFQcm92aWRlci5HZXROYW1lKGMuQWRkcmVzcy5Xb3Jrc2hlZXQsIEV4cHJlc3Npb25TdHJpbmcpOworICAgIC8vdmFyIHJlc3VsdCA9IF9wYXJzaW5nQ29udGV4dC5QYXJzZXIuUGFyc2UodmFsdWUuVG9TdHJpbmcoKSk7CiAKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL3JldHVybiBuZXcgQ29tcGlsZVJlc3VsdEZhY3RvcnkoKS5DcmVhdGUocmVzdWx0KTsKLSAgICAgICAgfQorICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgIHRocm93IChuZXcgRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uKEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5OYW1lKSkpOwogICAgIH0KKyAgICBpZiAobmFtZS5WYWx1ZSA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgaWYgKG5hbWUuVmFsdWUgaXMgRXhjZWxEYXRhUHJvdmlkZXIuSVJhbmdlSW5mbykgeworICAgICAgdmFyIHJhbmdlID0gKEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm8pbmFtZS5WYWx1ZTsKKyAgICAgIGlmIChyYW5nZS5Jc011bHRpKSB7CisgICAgICAgIHJldHVybiBuZXcobmFtZS5WYWx1ZSwgRGF0YVR5cGUuRW51bWVyYWJsZSk7CisgICAgICB9CisgICAgICBpZiAocmFuZ2UuSXNFbXB0eSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICAgIHZhciBmYWN0b3J5ID0gbmV3IENvbXBpbGVSZXN1bHRGYWN0b3J5KCk7CisgICAgICByZXR1cm4gZmFjdG9yeS5DcmVhdGUocmFuZ2UuRmlyc3QoKS5WYWx1ZSk7CisgICAgfQorICAgIHsKKyAgICAgIHZhciBmYWN0b3J5ID0gbmV3IENvbXBpbGVSZXN1bHRGYWN0b3J5KCk7CisgICAgICByZXR1cm4gZmFjdG9yeS5DcmVhdGUobmFtZS5WYWx1ZSk7CisgICAgfQorCisgICAgLy9yZXR1cm4gbmV3IENvbXBpbGVSZXN1bHRGYWN0b3J5KCkuQ3JlYXRlKHJlc3VsdCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvU3RyaW5nRXhwcmVzc2lvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9FeHByZXNzaW9uR3JhcGgvU3RyaW5nRXhwcmVzc2lvbi5jcwppbmRleCA1Mjg5NWNiLi5mM2IyOWRlIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRXhwcmVzc2lvbkdyYXBoL1N0cmluZ0V4cHJlc3Npb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0V4cHJlc3Npb25HcmFwaC9TdHJpbmdFeHByZXNzaW9uLmNzCkBAIC0xMywzOSArMTMsMjkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoCi17Ci0gICAgcHVibGljIGNsYXNzIFN0cmluZ0V4cHJlc3Npb24gOiBBdG9taWNFeHByZXNzaW9uCi0gICAgewotICAgICAgICBwdWJsaWMgU3RyaW5nRXhwcmVzc2lvbihzdHJpbmcgZXhwcmVzc2lvbikKLSAgICAgICAgICAgIDogYmFzZShleHByZXNzaW9uKQotICAgICAgICB7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7CiAKLSAgICAgICAgfQorcHVibGljIGNsYXNzIFN0cmluZ0V4cHJlc3Npb24gOiBBdG9taWNFeHByZXNzaW9uIHsKKyAgcHVibGljIFN0cmluZ0V4cHJlc3Npb24oc3RyaW5nIGV4cHJlc3Npb24pCisgICAgICA6IGJhc2UoZXhwcmVzc2lvbikge30KIAotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgQ29tcGlsZVJlc3VsdCBDb21waWxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21waWxlUmVzdWx0KEV4cHJlc3Npb25TdHJpbmcsIERhdGFUeXBlLlN0cmluZyk7Ci0gICAgICAgIH0KLSAgICB9CisgIHB1YmxpYyBvdmVycmlkZSBDb21waWxlUmVzdWx0IENvbXBpbGUoKSB7CisgICAgcmV0dXJuIG5ldyhFeHByZXNzaW9uU3RyaW5nLCBEYXRhVHlwZS5TdHJpbmcpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRm9ybXVsYVBhcnNlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9Gb3JtdWxhUGFyc2VyLmNzCmluZGV4IGE3YWQyZDguLmZhYTA1MzYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9Gb3JtdWxhUGFyc2VyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9Gb3JtdWxhUGFyc2VyLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywyMTQgKzEzLDE4NiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlcHRpb25zOwordXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKK3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZwotewotICAgIHB1YmxpYyBjbGFzcyBGb3JtdWxhUGFyc2VyCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFBhcnNpbmdDb250ZXh0IF9wYXJzaW5nQ29udGV4dDsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBFeGNlbERhdGFQcm92aWRlciBfZXhjZWxEYXRhUHJvdmlkZXI7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKIAotICAgICAgICBwdWJsaWMgRm9ybXVsYVBhcnNlcihFeGNlbERhdGFQcm92aWRlciBleGNlbERhdGFQcm92aWRlcikKLSAgICAgICAgICAgIDogdGhpcyhleGNlbERhdGFQcm92aWRlciwgUGFyc2luZ0NvbnRleHQuQ3JlYXRlKCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgCi0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBGb3JtdWxhUGFyc2VyIHsKKyAgcHJpdmF0ZSByZWFkb25seSBQYXJzaW5nQ29udGV4dCBfcGFyc2luZ0NvbnRleHQ7CisgIHByaXZhdGUgcmVhZG9ubHkgRXhjZWxEYXRhUHJvdmlkZXIgX2V4Y2VsRGF0YVByb3ZpZGVyOwogCi0gICAgICAgIHB1YmxpYyBGb3JtdWxhUGFyc2VyKEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgcGFyc2luZ0NvbnRleHQuUGFyc2VyID0gdGhpczsKLSAgICAgICAgICAgIHBhcnNpbmdDb250ZXh0LkV4Y2VsRGF0YVByb3ZpZGVyID0gZXhjZWxEYXRhUHJvdmlkZXI7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5OYW1lVmFsdWVQcm92aWRlciA9IG5ldyBFcHBsdXNOYW1lVmFsdWVQcm92aWRlcihleGNlbERhdGFQcm92aWRlcik7Ci0gICAgICAgICAgICBwYXJzaW5nQ29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5ID0gbmV3IFJhbmdlQWRkcmVzc0ZhY3RvcnkoZXhjZWxEYXRhUHJvdmlkZXIpOwotICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0ID0gcGFyc2luZ0NvbnRleHQ7Ci0gICAgICAgICAgICBfZXhjZWxEYXRhUHJvdmlkZXIgPSBleGNlbERhdGFQcm92aWRlcjsKLSAgICAgICAgICAgIENvbmZpZ3VyZShjb25maWd1cmF0aW9uID0+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAuU2V0TGV4ZXIobmV3IExleGVyKF9wYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeSwgX3BhcnNpbmdDb250ZXh0Lk5hbWVWYWx1ZVByb3ZpZGVyKSkKLSAgICAgICAgICAgICAgICAgICAgLlNldEdyYXBoQnVpbGRlcihuZXcgRXhwcmVzc2lvbkdyYXBoQnVpbGRlcihleGNlbERhdGFQcm92aWRlciwgX3BhcnNpbmdDb250ZXh0KSkKLSAgICAgICAgICAgICAgICAgICAgLlNldEV4cHJlc2lvbkNvbXBpbGVyKG5ldyBFeHByZXNzaW9uQ29tcGlsZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgLkZ1bmN0aW9uUmVwb3NpdG9yeS5Mb2FkTW9kdWxlKG5ldyBCdWlsdEluRnVuY3Rpb25zKCkpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KKyAgcHVibGljIEZvcm11bGFQYXJzZXIoRXhjZWxEYXRhUHJvdmlkZXIgZXhjZWxEYXRhUHJvdmlkZXIpCisgICAgICA6IHRoaXMoZXhjZWxEYXRhUHJvdmlkZXIsIFBhcnNpbmdDb250ZXh0LkNyZWF0ZSgpKSB7fQogCi0gICAgICAgIHB1YmxpYyB2b2lkIENvbmZpZ3VyZShBY3Rpb248UGFyc2luZ0NvbmZpZ3VyYXRpb24+IGNvbmZpZ01ldGhvZCkKLSAgICAgICAgewotICAgICAgICAgICAgY29uZmlnTWV0aG9kLkludm9rZShfcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICBfbGV4ZXIgPSBfcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5MZXhlciA/PyBfbGV4ZXI7Ci0gICAgICAgICAgICBfZ3JhcGhCdWlsZGVyID0gX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uR3JhcGhCdWlsZGVyID8/IF9ncmFwaEJ1aWxkZXI7Ci0gICAgICAgICAgICBfY29tcGlsZXIgPSBfcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5FeHByZXNzaW9uQ29tcGlsZXIgPz8gX2NvbXBpbGVyOwotICAgICAgICB9CisgIHB1YmxpYyBGb3JtdWxhUGFyc2VyKEV4Y2VsRGF0YVByb3ZpZGVyIGV4Y2VsRGF0YVByb3ZpZGVyLCBQYXJzaW5nQ29udGV4dCBwYXJzaW5nQ29udGV4dCkgeworICAgIHBhcnNpbmdDb250ZXh0LlBhcnNlciA9IHRoaXM7CisgICAgcGFyc2luZ0NvbnRleHQuRXhjZWxEYXRhUHJvdmlkZXIgPSBleGNlbERhdGFQcm92aWRlcjsKKyAgICBwYXJzaW5nQ29udGV4dC5OYW1lVmFsdWVQcm92aWRlciA9IG5ldyBFcHBsdXNOYW1lVmFsdWVQcm92aWRlcihleGNlbERhdGFQcm92aWRlcik7CisgICAgcGFyc2luZ0NvbnRleHQuUmFuZ2VBZGRyZXNzRmFjdG9yeSA9IG5ldyhleGNlbERhdGFQcm92aWRlcik7CisgICAgX3BhcnNpbmdDb250ZXh0ID0gcGFyc2luZ0NvbnRleHQ7CisgICAgX2V4Y2VsRGF0YVByb3ZpZGVyID0gZXhjZWxEYXRhUHJvdmlkZXI7CisgICAgQ29uZmlndXJlKGNvbmZpZ3VyYXRpb24gPT4geworICAgICAgY29uZmlndXJhdGlvbgorICAgICAgICAgIC5TZXRMZXhlcigKKyAgICAgICAgICAgICAgbmV3IExleGVyKAorICAgICAgICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uRnVuY3Rpb25SZXBvc2l0b3J5LAorICAgICAgICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0Lk5hbWVWYWx1ZVByb3ZpZGVyKSkKKyAgICAgICAgICAuU2V0R3JhcGhCdWlsZGVyKG5ldyBFeHByZXNzaW9uR3JhcGhCdWlsZGVyKGV4Y2VsRGF0YVByb3ZpZGVyLCBfcGFyc2luZ0NvbnRleHQpKQorICAgICAgICAgIC5TZXRFeHByZXNpb25Db21waWxlcihuZXcgRXhwcmVzc2lvbkNvbXBpbGVyKCkpCisgICAgICAgICAgLkZ1bmN0aW9uUmVwb3NpdG9yeS5Mb2FkTW9kdWxlKG5ldyBCdWlsdEluRnVuY3Rpb25zKCkpOworICAgIH0pOworICB9CiAKLSAgICAgICAgcHJpdmF0ZSBJTGV4ZXIgX2xleGVyOwotICAgICAgICBwcml2YXRlIElFeHByZXNzaW9uR3JhcGhCdWlsZGVyIF9ncmFwaEJ1aWxkZXI7Ci0gICAgICAgIHByaXZhdGUgSUV4cHJlc3Npb25Db21waWxlciBfY29tcGlsZXI7CisgIHB1YmxpYyB2b2lkIENvbmZpZ3VyZShBY3Rpb248UGFyc2luZ0NvbmZpZ3VyYXRpb24+IGNvbmZpZ01ldGhvZCkgeworICAgIGNvbmZpZ01ldGhvZC5JbnZva2UoX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24pOworICAgIF9sZXhlciA9IF9wYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkxleGVyID8/IF9sZXhlcjsKKyAgICBfZ3JhcGhCdWlsZGVyID0gX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uR3JhcGhCdWlsZGVyID8/IF9ncmFwaEJ1aWxkZXI7CisgICAgX2NvbXBpbGVyID0gX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uRXhwcmVzc2lvbkNvbXBpbGVyID8/IF9jb21waWxlcjsKKyAgfQogCi0gICAgICAgIHB1YmxpYyBJTGV4ZXIgTGV4ZXIgeyBnZXQgeyByZXR1cm4gX2xleGVyOyB9IH0KLSAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPHN0cmluZz4gRnVuY3Rpb25OYW1lcyB7IGdldCB7IHJldHVybiBfcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5GdW5jdGlvblJlcG9zaXRvcnkuRnVuY3Rpb25OYW1lczsgfSB9IAorICBwcml2YXRlIElMZXhlciBfbGV4ZXI7CisgIHByaXZhdGUgSUV4cHJlc3Npb25HcmFwaEJ1aWxkZXIgX2dyYXBoQnVpbGRlcjsKKyAgcHJpdmF0ZSBJRXhwcmVzc2lvbkNvbXBpbGVyIF9jb21waWxlcjsKIAotICAgICAgICBpbnRlcm5hbCB2aXJ0dWFsIG9iamVjdCBQYXJzZShzdHJpbmcgZm9ybXVsYSwgUmFuZ2VBZGRyZXNzIHJhbmdlQWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgKHZhciBzY29wZSA9IF9wYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUocmFuZ2VBZGRyZXNzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgdG9rZW5zID0gX2xleGVyLlRva2VuaXplKGZvcm11bGEpOwotICAgICAgICAgICAgICAgIHZhciBncmFwaCA9IF9ncmFwaEJ1aWxkZXIuQnVpbGQodG9rZW5zKTsKLSAgICAgICAgICAgICAgICBpZiAoZ3JhcGguRXhwcmVzc2lvbnMuQ291bnQoKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfY29tcGlsZXIuQ29tcGlsZShncmFwaC5FeHByZXNzaW9ucykuUmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHB1YmxpYyBJTGV4ZXIgTGV4ZXIgPT4gX2xleGVyOwogCi0gICAgICAgIGludGVybmFsIHZpcnR1YWwgb2JqZWN0IFBhcnNlKElFbnVtZXJhYmxlPFRva2VuPiB0b2tlbnMsIHN0cmluZyB3b3Jrc2hlZXQsIHN0cmluZyBhZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmFuZ2VBZGRyZXNzID0gX3BhcnNpbmdDb250ZXh0LlJhbmdlQWRkcmVzc0ZhY3RvcnkuQ3JlYXRlKGFkZHJlc3MpOwotICAgICAgICAgICAgdXNpbmcgKHZhciBzY29wZSA9IF9wYXJzaW5nQ29udGV4dC5TY29wZXMuTmV3U2NvcGUocmFuZ2VBZGRyZXNzKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgZ3JhcGggPSBfZ3JhcGhCdWlsZGVyLkJ1aWxkKHRva2Vucyk7Ci0gICAgICAgICAgICAgICAgaWYgKGdyYXBoLkV4cHJlc3Npb25zLkNvdW50KCkgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2NvbXBpbGVyLkNvbXBpbGUoZ3JhcGguRXhwcmVzc2lvbnMpLlJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCB2aXJ0dWFsIG9iamVjdCBQYXJzZUNlbGwoSUVudW1lcmFibGU8VG9rZW4+IHRva2Vucywgc3RyaW5nIHdvcmtzaGVldCwgaW50IHJvdywgaW50IGNvbHVtbikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJhbmdlQWRkcmVzcyA9IF9wYXJzaW5nQ29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZSh3b3Jrc2hlZXQsIGNvbHVtbiwgcm93KTsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgc2NvcGUgPSBfcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKHJhbmdlQWRkcmVzcykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gICAgX3BhcnNpbmdDb250ZXh0LkRlcGVuZGVuY2llcy5BZGRGb3JtdWxhU2NvcGUoc2NvcGUpOwotICAgICAgICAgICAgICAgIHZhciBncmFwaCA9IF9ncmFwaEJ1aWxkZXIuQnVpbGQodG9rZW5zKTsKLSAgICAgICAgICAgICAgICBpZiAoZ3JhcGguRXhwcmVzc2lvbnMuQ291bnQoKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDBkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBjb21waWxlUmVzdWx0ID0gX2NvbXBpbGVyLkNvbXBpbGUoZ3JhcGguRXhwcmVzc2lvbnMpOwotICAgICAgICAgICAgICAgICAgICAvLyBxdWljayBzb2x1dGlvbiBmb3IgdGhlIGZhY3QgdGhhdCBhbiBleGNlbHJhbmdlIGNhbiBiZSByZXR1cm5lZC4KLSAgICAgICAgICAgICAgICAgICAgdmFyIHJhbmdlSW5mbyA9IGNvbXBpbGVSZXN1bHQuUmVzdWx0IGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZUluZm8gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVSZXN1bHQuUmVzdWx0ID8/IDBkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlSW5mby5Jc0VtcHR5KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmFuZ2VJbmZvLklzTXVsdGkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlSW5mby5GaXJzdCgpLlZhbHVlID8/IDBkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2sgdG8gcmV0dXJuIG11bHRpY2VsbCBpZiBpdCBpcyBhIHdvcmtib29rIHNjb3BlZCBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHdvcmtzaGVldCkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlSW5mbzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfcGFyc2luZ0NvbnRleHQuRGVidWcpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1zZyA9IHN0cmluZy5Gb3JtYXQoIkEgcmFuZ2Ugd2l0aCBtdWx0aXBsZSBjZWxsIHdhcyByZXR1cm5lZCBhdCByb3cgezB9LCBjb2x1bW4gezF9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93LCBjb2x1bW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkxvZ2dlci5Mb2coX3BhcnNpbmdDb250ZXh0LCBtc2cpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRXJyb3JWYWx1ZS5DcmVhdGUoZUVycm9yVHlwZS5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2goRXhjZWxFcnJvclZhbHVlRXhjZXB0aW9uIGV4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9wYXJzaW5nQ29udGV4dC5EZWJ1ZykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uTG9nZ2VyLkxvZyhfcGFyc2luZ0NvbnRleHQsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXguRXJyb3JWYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgcHVibGljIElFbnVtZXJhYmxlPHN0cmluZz4gRnVuY3Rpb25OYW1lcyB7CisgICAgZ2V0IHsgcmV0dXJuIF9wYXJzaW5nQ29udGV4dC5Db25maWd1cmF0aW9uLkZ1bmN0aW9uUmVwb3NpdG9yeS5GdW5jdGlvbk5hbWVzOyB9CisgIH0KIAotICAgICAgICBwdWJsaWMgdmlydHVhbCBvYmplY3QgUGFyc2Uoc3RyaW5nIGZvcm11bGEsIHN0cmluZyBhZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gUGFyc2UoZm9ybXVsYSwgX3BhcnNpbmdDb250ZXh0LlJhbmdlQWRkcmVzc0ZhY3RvcnkuQ3JlYXRlKGFkZHJlc3MpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZpcnR1YWwgb2JqZWN0IFBhcnNlKHN0cmluZyBmb3JtdWxhKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gUGFyc2UoZm9ybXVsYSwgUmFuZ2VBZGRyZXNzLkVtcHR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBQYXJzZUF0KHN0cmluZyBhZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQoYWRkcmVzcykuTmFtZWQoImFkZHJlc3MiKS5Jc05vdE51bGxPckVtcHR5KCk7Ci0gICAgICAgICAgICB2YXIgcmFuZ2VBZGRyZXNzID0gX3BhcnNpbmdDb250ZXh0LlJhbmdlQWRkcmVzc0ZhY3RvcnkuQ3JlYXRlKGFkZHJlc3MpOwotICAgICAgICAgICAgcmV0dXJuIFBhcnNlQXQocmFuZ2VBZGRyZXNzLldvcmtzaGVldCwgcmFuZ2VBZGRyZXNzLkZyb21Sb3csIHJhbmdlQWRkcmVzcy5Gcm9tQ29sKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBQYXJzZUF0KHN0cmluZyB3b3Jrc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZiA9IF9leGNlbERhdGFQcm92aWRlci5HZXRSYW5nZUZvcm11bGEod29ya3NoZWV0TmFtZSwgcm93LCBjb2wpOwotICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGYpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfZXhjZWxEYXRhUHJvdmlkZXIuR2V0UmFuZ2VWYWx1ZSh3b3Jrc2hlZXROYW1lLCByb3csIGNvbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlKGYsIF9wYXJzaW5nQ29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZSh3b3Jrc2hlZXROYW1lLGNvbCxyb3cpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vdmFyIGRhdGFJdGVtID0gX2V4Y2VsRGF0YVByb3ZpZGVyLkdldFJhbmdlVmFsdWVzKGFkZHJlc3MpLkZpcnN0T3JEZWZhdWx0KCk7Ci0gICAgICAgICAgICAvL2lmIChkYXRhSXRlbSA9PSBudWxsIC8qfHwgKGRhdGFJdGVtLlZhbHVlID09IG51bGwgJiYgZGF0YUl0ZW0uRm9ybXVsYSA9PSBudWxsKSovKSByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIC8vaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShkYXRhSXRlbS5Gb3JtdWxhKSkKLSAgICAgICAgICAgIC8vewotICAgICAgICAgICAgLy8gICAgcmV0dXJuIFBhcnNlKGRhdGFJdGVtLkZvcm11bGEsIF9wYXJzaW5nQ29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZShhZGRyZXNzKSk7Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgICAgIC8vcmV0dXJuIFBhcnNlKGRhdGFJdGVtLlZhbHVlLlRvU3RyaW5nKCksIF9wYXJzaW5nQ29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZShhZGRyZXNzKSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGludGVybmFsIHZvaWQgSW5pdE5ld0NhbGMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihfZXhjZWxEYXRhUHJvdmlkZXIhPW51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2V4Y2VsRGF0YVByb3ZpZGVyLlJlc2V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBQcmF2ZWVuJ3MgRm9ybXVsYSBQYXJzZXIKLSAgICAgICAgcHVibGljIEV4cHJlc3Npb25HcmFwaC5FeHByZXNzaW9uR3JhcGggUGFyc2VUb0dyYXBoKHN0cmluZyBmb3JtdWxhKQotICAgICAgICB7Ci0gICAgICAgICAgICB1c2luZyAodmFyIHNjb3BlID0gX3BhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfbGV4ZXIuVG9rZW5pemUoZm9ybXVsYSk7Ci0gICAgICAgICAgICAgICAgdmFyIGdyYXBoID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOwotICAgICAgICAgICAgICAgIHJldHVybiBncmFwaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBpbnRlcm5hbCB2aXJ0dWFsIG9iamVjdCBQYXJzZShzdHJpbmcgZm9ybXVsYSwgUmFuZ2VBZGRyZXNzIHJhbmdlQWRkcmVzcykgeworICAgIHVzaW5nICh2YXIgc2NvcGUgPSBfcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKHJhbmdlQWRkcmVzcykpIHsKKyAgICAgIHZhciB0b2tlbnMgPSBfbGV4ZXIuVG9rZW5pemUoZm9ybXVsYSk7CisgICAgICB2YXIgZ3JhcGggPSBfZ3JhcGhCdWlsZGVyLkJ1aWxkKHRva2Vucyk7CisgICAgICBpZiAoZ3JhcGguRXhwcmVzc2lvbnMuQ291bnQoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgICAgcmV0dXJuIF9jb21waWxlci5Db21waWxlKGdyYXBoLkV4cHJlc3Npb25zKS5SZXN1bHQ7CiAgICAgfQorICB9CisKKyAgaW50ZXJuYWwgdmlydHVhbCBvYmplY3QgUGFyc2UoSUVudW1lcmFibGU8VG9rZW4+IHRva2Vucywgc3RyaW5nIHdvcmtzaGVldCwgc3RyaW5nIGFkZHJlc3MpIHsKKyAgICB2YXIgcmFuZ2VBZGRyZXNzID0gX3BhcnNpbmdDb250ZXh0LlJhbmdlQWRkcmVzc0ZhY3RvcnkuQ3JlYXRlKGFkZHJlc3MpOworICAgIHVzaW5nICh2YXIgc2NvcGUgPSBfcGFyc2luZ0NvbnRleHQuU2NvcGVzLk5ld1Njb3BlKHJhbmdlQWRkcmVzcykpIHsKKyAgICAgIHZhciBncmFwaCA9IF9ncmFwaEJ1aWxkZXIuQnVpbGQodG9rZW5zKTsKKyAgICAgIGlmIChncmFwaC5FeHByZXNzaW9ucy5Db3VudCgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICByZXR1cm4gX2NvbXBpbGVyLkNvbXBpbGUoZ3JhcGguRXhwcmVzc2lvbnMpLlJlc3VsdDsKKyAgICB9CisgIH0KKworICBpbnRlcm5hbCB2aXJ0dWFsIG9iamVjdCBQYXJzZUNlbGwoCisgICAgICBJRW51bWVyYWJsZTxUb2tlbj4gdG9rZW5zLAorICAgICAgc3RyaW5nIHdvcmtzaGVldCwKKyAgICAgIGludCByb3csCisgICAgICBpbnQgY29sdW1uKSB7CisgICAgdmFyIHJhbmdlQWRkcmVzcyA9IF9wYXJzaW5nQ29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZSh3b3Jrc2hlZXQsIGNvbHVtbiwgcm93KTsKKyAgICB1c2luZyAodmFyIHNjb3BlID0gX3BhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShyYW5nZUFkZHJlc3MpKSB7CisgICAgICAvLyAgICBfcGFyc2luZ0NvbnRleHQuRGVwZW5kZW5jaWVzLkFkZEZvcm11bGFTY29wZShzY29wZSk7CisgICAgICB2YXIgZ3JhcGggPSBfZ3JhcGhCdWlsZGVyLkJ1aWxkKHRva2Vucyk7CisgICAgICBpZiAoZ3JhcGguRXhwcmVzc2lvbnMuQ291bnQoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiAwZDsKKyAgICAgIH0KKyAgICAgIHRyeSB7CisgICAgICAgIHZhciBjb21waWxlUmVzdWx0ID0gX2NvbXBpbGVyLkNvbXBpbGUoZ3JhcGguRXhwcmVzc2lvbnMpOworICAgICAgICAvLyBxdWljayBzb2x1dGlvbiBmb3IgdGhlIGZhY3QgdGhhdCBhbiBleGNlbHJhbmdlIGNhbiBiZSByZXR1cm5lZC4KKyAgICAgICAgdmFyIHJhbmdlSW5mbyA9IGNvbXBpbGVSZXN1bHQuUmVzdWx0IGFzIEV4Y2VsRGF0YVByb3ZpZGVyLklSYW5nZUluZm87CisgICAgICAgIGlmIChyYW5nZUluZm8gPT0gbnVsbCkgeworICAgICAgICAgIHJldHVybiBjb21waWxlUmVzdWx0LlJlc3VsdCA/PyAwZDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmFuZ2VJbmZvLklzRW1wdHkpIHsKKyAgICAgICAgICByZXR1cm4gMGQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyYW5nZUluZm8uSXNNdWx0aSkgeworICAgICAgICAgIHJldHVybiByYW5nZUluZm8uRmlyc3QoKS5WYWx1ZSA/PyAwZDsKKyAgICAgICAgfQorICAgICAgICAvLyBvayB0byByZXR1cm4gbXVsdGljZWxsIGlmIGl0IGlzIGEgd29ya2Jvb2sgc2NvcGVkIG5hbWUuCisgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh3b3Jrc2hlZXQpKSB7CisgICAgICAgICAgcmV0dXJuIHJhbmdlSW5mbzsKKyAgICAgICAgfQorICAgICAgICBpZiAoX3BhcnNpbmdDb250ZXh0LkRlYnVnKSB7CisgICAgICAgICAgdmFyIG1zZyA9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICAgICAgICJBIHJhbmdlIHdpdGggbXVsdGlwbGUgY2VsbCB3YXMgcmV0dXJuZWQgYXQgcm93IHswfSwgY29sdW1uIHsxfSIsCisgICAgICAgICAgICAgIHJvdywKKyAgICAgICAgICAgICAgY29sdW1uKTsKKyAgICAgICAgICBfcGFyc2luZ0NvbnRleHQuQ29uZmlndXJhdGlvbi5Mb2dnZXIuTG9nKF9wYXJzaW5nQ29udGV4dCwgbXNnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRXhjZWxFcnJvclZhbHVlLkNyZWF0ZShlRXJyb3JUeXBlLlZhbHVlKTsKKyAgICAgIH0gY2F0Y2ggKEV4Y2VsRXJyb3JWYWx1ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICBpZiAoX3BhcnNpbmdDb250ZXh0LkRlYnVnKSB7CisgICAgICAgICAgX3BhcnNpbmdDb250ZXh0LkNvbmZpZ3VyYXRpb24uTG9nZ2VyLkxvZyhfcGFyc2luZ0NvbnRleHQsIGV4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXguRXJyb3JWYWx1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgdmlydHVhbCBvYmplY3QgUGFyc2Uoc3RyaW5nIGZvcm11bGEsIHN0cmluZyBhZGRyZXNzKSB7CisgICAgcmV0dXJuIFBhcnNlKGZvcm11bGEsIF9wYXJzaW5nQ29udGV4dC5SYW5nZUFkZHJlc3NGYWN0b3J5LkNyZWF0ZShhZGRyZXNzKSk7CisgIH0KKworICBwdWJsaWMgdmlydHVhbCBvYmplY3QgUGFyc2Uoc3RyaW5nIGZvcm11bGEpIHsKKyAgICByZXR1cm4gUGFyc2UoZm9ybXVsYSwgUmFuZ2VBZGRyZXNzLkVtcHR5KTsKKyAgfQorCisgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBQYXJzZUF0KHN0cmluZyBhZGRyZXNzKSB7CisgICAgUmVxdWlyZS5UaGF0KGFkZHJlc3MpLk5hbWVkKCJhZGRyZXNzIikuSXNOb3ROdWxsT3JFbXB0eSgpOworICAgIHZhciByYW5nZUFkZHJlc3MgPSBfcGFyc2luZ0NvbnRleHQuUmFuZ2VBZGRyZXNzRmFjdG9yeS5DcmVhdGUoYWRkcmVzcyk7CisgICAgcmV0dXJuIFBhcnNlQXQocmFuZ2VBZGRyZXNzLldvcmtzaGVldCwgcmFuZ2VBZGRyZXNzLkZyb21Sb3csIHJhbmdlQWRkcmVzcy5Gcm9tQ29sKTsKKyAgfQorCisgIHB1YmxpYyB2aXJ0dWFsIG9iamVjdCBQYXJzZUF0KHN0cmluZyB3b3Jrc2hlZXROYW1lLCBpbnQgcm93LCBpbnQgY29sKSB7CisgICAgdmFyIGYgPSBfZXhjZWxEYXRhUHJvdmlkZXIuR2V0UmFuZ2VGb3JtdWxhKHdvcmtzaGVldE5hbWUsIHJvdywgY29sKTsKKyAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoZikpIHsKKyAgICAgIHJldHVybiBfZXhjZWxEYXRhUHJvdmlkZXIuR2V0UmFuZ2VWYWx1ZSh3b3Jrc2hlZXROYW1lLCByb3csIGNvbCk7CisgICAgfQorICAgIHJldHVybiBQYXJzZShmLCBfcGFyc2luZ0NvbnRleHQuUmFuZ2VBZGRyZXNzRmFjdG9yeS5DcmVhdGUod29ya3NoZWV0TmFtZSwgY29sLCByb3cpKTsKKyAgICAvL3ZhciBkYXRhSXRlbSA9IF9leGNlbERhdGFQcm92aWRlci5HZXRSYW5nZVZhbHVlcyhhZGRyZXNzKS5GaXJzdE9yRGVmYXVsdCgpOworICAgIC8vaWYgKGRhdGFJdGVtID09IG51bGwgLyp8fCAoZGF0YUl0ZW0uVmFsdWUgPT0gbnVsbCAmJiBkYXRhSXRlbS5Gb3JtdWxhID09IG51bGwpKi8pIHJldHVybiBudWxsOworICAgIC8vaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShkYXRhSXRlbS5Gb3JtdWxhKSkKKyAgICAvL3sKKyAgICAvLyAgICByZXR1cm4gUGFyc2UoZGF0YUl0ZW0uRm9ybXVsYSwgX3BhcnNpbmdDb250ZXh0LlJhbmdlQWRkcmVzc0ZhY3RvcnkuQ3JlYXRlKGFkZHJlc3MpKTsKKyAgICAvL30KKyAgICAvL3JldHVybiBQYXJzZShkYXRhSXRlbS5WYWx1ZS5Ub1N0cmluZygpLCBfcGFyc2luZ0NvbnRleHQuUmFuZ2VBZGRyZXNzRmFjdG9yeS5DcmVhdGUoYWRkcmVzcykpOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBJbml0TmV3Q2FsYygpIHsKKyAgICBpZiAoX2V4Y2VsRGF0YVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgIF9leGNlbERhdGFQcm92aWRlci5SZXNldCgpOworICAgIH0KKyAgfQorCisgIC8vIFByYXZlZW4ncyBGb3JtdWxhIFBhcnNlcgorICBwdWJsaWMgRXhwcmVzc2lvbkdyYXBoLkV4cHJlc3Npb25HcmFwaCBQYXJzZVRvR3JhcGgoc3RyaW5nIGZvcm11bGEpIHsKKyAgICB1c2luZyAodmFyIHNjb3BlID0gX3BhcnNpbmdDb250ZXh0LlNjb3Blcy5OZXdTY29wZShSYW5nZUFkZHJlc3MuRW1wdHkpKSB7CisgICAgICB2YXIgdG9rZW5zID0gX2xleGVyLlRva2VuaXplKGZvcm11bGEpOworICAgICAgdmFyIGdyYXBoID0gX2dyYXBoQnVpbGRlci5CdWlsZCh0b2tlbnMpOworICAgICAgcmV0dXJuIGdyYXBoOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0Zvcm11bGFQYXJzZXJNYW5hZ2VyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0Zvcm11bGFQYXJzZXJNYW5hZ2VyLmNzCmluZGV4IDUxYTUyMzQuLjlkN2RjNjUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9Gb3JtdWxhUGFyc2VyTWFuYWdlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvRm9ybXVsYVBhcnNlck1hbmFnZXIuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDk0ICsxMyw4NSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5JTzsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTG9nZ2luZzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB2YXJpb3VzIGZ1bmN0aW9uYWxpdHkgcmVnYXJkaW5nIAotICAgIC8vLyBleGNlbCBmb3JtdWxhIGV2YWx1YXRpb24uCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRm9ybXVsYVBhcnNlck1hbmFnZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRm9ybXVsYVBhcnNlciBfcGFyc2VyOwogCi0gICAgICAgIGludGVybmFsIEZvcm11bGFQYXJzZXJNYW5hZ2VyKEZvcm11bGFQYXJzZXIgcGFyc2VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBSZXF1aXJlLlRoYXQocGFyc2VyKS5OYW1lZCgicGFyc2VyIikuSXNOb3ROdWxsKCk7Ci0gICAgICAgICAgICBfcGFyc2VyID0gcGFyc2VyOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMb2FkcyBhIG1vZHVsZSBjb250YWluaW5nIGN1c3RvbSBmdW5jdGlvbnMgdG8gdGhlIGZvcm11bGEgcGFyc2VyLiBCeSB1c2luZwotICAgICAgICAvLy8gdGhpcyBtZXRob2QgeW91IGNhbiBhZGQgeW91ciBvd24gaW1wbGVtZW50YXRpb25zIG9mIEV4Y2VsIGZ1bmN0aW9ucywgYnkKLSAgICAgICAgLy8vIGltcGxlbWVudGluZyBhIDxzZWUgY3JlZj0iSUZ1bmN0aW9uTW9kdWxlIi8+LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1vZHVsZSI+QSA8c2VlIGNyZWY9IklGdW5jdGlvbk1vZHVsZSIvPiBjb250YWluaW5nIDxzZWUgY3JlZj0iRXhjZWxGdW5jdGlvbiIvPnMuPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgTG9hZEZ1bmN0aW9uTW9kdWxlKElGdW5jdGlvbk1vZHVsZSBtb2R1bGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYXJzZXIuQ29uZmlndXJlKHggPT4geC5GdW5jdGlvblJlcG9zaXRvcnkuTG9hZE1vZHVsZShtb2R1bGUpKTsKLSAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB2YXJpb3VzIGZ1bmN0aW9uYWxpdHkgcmVnYXJkaW5nCisvLy8gZXhjZWwgZm9ybXVsYSBldmFsdWF0aW9uLgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBGb3JtdWxhUGFyc2VyTWFuYWdlciB7CisgIHByaXZhdGUgcmVhZG9ubHkgRm9ybXVsYVBhcnNlciBfcGFyc2VyOwogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBzdXBwbGllZCA8cGFyYW1yZWYgbmFtZT0iZnVuY3Rpb25OYW1lIi8+IGRvZXMgbm90IGV4aXN0LCB0aGUgc3VwcGxpZWQKLSAgICAgICAgLy8vIDxwYXJhbXJlZiBuYW1lPSJmdW5jdGlvbkltcGwiLz4gaW1wbGVtZW50YXRpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgZm9ybXVsYSBwYXJzZXIuCi0gICAgICAgIC8vLyBJZiBpdCBleGlzdHMsIHRoZSBleGlzdGluZyBmdW5jdGlvbiB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBzdXBwbGllZCA8cGFyYW1yZWYgbmFtZT0iZnVuY3Rpb25JbXBsIj5mdW5jdGlvbiBpbXBsZW1lbnRhdGlvbjwvcGFyYW1yZWY+Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZnVuY3Rpb25OYW1lIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZ1bmN0aW9uSW1wbCI+PC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgQWRkT3JSZXBsYWNlRnVuY3Rpb24oc3RyaW5nIGZ1bmN0aW9uTmFtZSwgRXhjZWxGdW5jdGlvbiBmdW5jdGlvbkltcGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYXJzZXIuQ29uZmlndXJlKHggPT4geC5GdW5jdGlvblJlcG9zaXRvcnkuQWRkT3JSZXBsYWNlRnVuY3Rpb24oZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkltcGwpKTsKLSAgICAgICAgfQorICBpbnRlcm5hbCBGb3JtdWxhUGFyc2VyTWFuYWdlcihGb3JtdWxhUGFyc2VyIHBhcnNlcikgeworICAgIFJlcXVpcmUuVGhhdChwYXJzZXIpLk5hbWVkKCJwYXJzZXIiKS5Jc05vdE51bGwoKTsKKyAgICBfcGFyc2VyID0gcGFyc2VyOworICB9CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgZnVuY3Rpb25zIGltcGxlbWVudGVkLCBib3RoIHRoZSBidWlsdCBpbiBmdW5jdGlvbnMKLSAgICAgICAgLy8vIGFuZCBmdW5jdGlvbnMgYWRkZWQgdXNpbmcgdGhlIExvYWRGdW5jdGlvbk1vZHVsZSBtZXRob2Qgb2YgdGhpcyBjbGFzcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkZ1bmN0aW9uIG5hbWVzIGluIGxvd2VyIGNhc2U8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBJRW51bWVyYWJsZTxzdHJpbmc+IEdldEltcGxlbWVudGVkRnVuY3Rpb25OYW1lcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmbkxpc3QgPSBfcGFyc2VyLkZ1bmN0aW9uTmFtZXMuVG9MaXN0KCk7Ci0gICAgICAgICAgICBmbkxpc3QuU29ydCgoeCwgeSkgPT4gU3RyaW5nLkNvbXBhcmUoeCwgeSwgU3lzdGVtLlN0cmluZ0NvbXBhcmlzb24uT3JkaW5hbCkpOwotICAgICAgICAgICAgcmV0dXJuIGZuTGlzdDsKLSAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMb2FkcyBhIG1vZHVsZSBjb250YWluaW5nIGN1c3RvbSBmdW5jdGlvbnMgdG8gdGhlIGZvcm11bGEgcGFyc2VyLiBCeSB1c2luZworICAvLy8gdGhpcyBtZXRob2QgeW91IGNhbiBhZGQgeW91ciBvd24gaW1wbGVtZW50YXRpb25zIG9mIEV4Y2VsIGZ1bmN0aW9ucywgYnkKKyAgLy8vIGltcGxlbWVudGluZyBhIDxzZWUgY3JlZj0iSUZ1bmN0aW9uTW9kdWxlIi8+LgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Im1vZHVsZSI+QSA8c2VlIGNyZWY9IklGdW5jdGlvbk1vZHVsZSIvPiBjb250YWluaW5nIDxzZWUgY3JlZj0iRXhjZWxGdW5jdGlvbiIvPnMuPC9wYXJhbT4KKyAgcHVibGljIHZvaWQgTG9hZEZ1bmN0aW9uTW9kdWxlKElGdW5jdGlvbk1vZHVsZSBtb2R1bGUpIHsKKyAgICBfcGFyc2VyLkNvbmZpZ3VyZSh4ID0+IHguRnVuY3Rpb25SZXBvc2l0b3J5LkxvYWRNb2R1bGUobW9kdWxlKSk7CisgIH0KIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQYXJzZXMgdGhlIHN1cHBsaWVkIDxwYXJhbXJlZiBuYW1lPSJmb3JtdWxhIi8+IGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZm9ybXVsYSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIG9iamVjdCBQYXJzZShzdHJpbmcgZm9ybXVsYSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9wYXJzZXIuUGFyc2UoZm9ybXVsYSk7Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhlIHN1cHBsaWVkIDxwYXJhbXJlZiBuYW1lPSJmdW5jdGlvbk5hbWUiLz4gZG9lcyBub3QgZXhpc3QsIHRoZSBzdXBwbGllZAorICAvLy8gPHBhcmFtcmVmIG5hbWU9ImZ1bmN0aW9uSW1wbCIvPiBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBmb3JtdWxhIHBhcnNlci4KKyAgLy8vIElmIGl0IGV4aXN0cywgdGhlIGV4aXN0aW5nIGZ1bmN0aW9uIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHN1cHBsaWVkIDxwYXJhbXJlZiBuYW1lPSJmdW5jdGlvbkltcGwiPmZ1bmN0aW9uIGltcGxlbWVudGF0aW9uPC9wYXJhbXJlZj4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJmdW5jdGlvbk5hbWUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZnVuY3Rpb25JbXBsIj48L3BhcmFtPgorICBwdWJsaWMgdm9pZCBBZGRPclJlcGxhY2VGdW5jdGlvbihzdHJpbmcgZnVuY3Rpb25OYW1lLCBFeGNlbEZ1bmN0aW9uIGZ1bmN0aW9uSW1wbCkgeworICAgIF9wYXJzZXIuQ29uZmlndXJlKHggPT4geC5GdW5jdGlvblJlcG9zaXRvcnkuQWRkT3JSZXBsYWNlRnVuY3Rpb24oZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkltcGwpKTsKKyAgfQogCi0gICAgICAgIC8vIFByYXZlZW4ncyBQYXJzZXIgU3VwcG9ydAotICAgICAgICBwdWJsaWMgRXhwcmVzc2lvbkdyYXBoLkV4cHJlc3Npb25HcmFwaCBQYXJzZVRvR3JhcGgoc3RyaW5nIGZvcm11bGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfcGFyc2VyLlBhcnNlVG9HcmFwaChmb3JtdWxhKTsKLSAgICAgICAgfQotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiBhbGwgZnVuY3Rpb25zIGltcGxlbWVudGVkLCBib3RoIHRoZSBidWlsdCBpbiBmdW5jdGlvbnMKKyAgLy8vIGFuZCBmdW5jdGlvbnMgYWRkZWQgdXNpbmcgdGhlIExvYWRGdW5jdGlvbk1vZHVsZSBtZXRob2Qgb2YgdGhpcyBjbGFzcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPkZ1bmN0aW9uIG5hbWVzIGluIGxvd2VyIGNhc2U8L3JldHVybnM+CisgIHB1YmxpYyBJRW51bWVyYWJsZTxzdHJpbmc+IEdldEltcGxlbWVudGVkRnVuY3Rpb25OYW1lcygpIHsKKyAgICB2YXIgZm5MaXN0ID0gX3BhcnNlci5GdW5jdGlvbk5hbWVzLlRvTGlzdCgpOworICAgIGZuTGlzdC5Tb3J0KCh4LCB5KSA9PiBTdHJpbmcuQ29tcGFyZSh4LCB5LCBTdHJpbmdDb21wYXJpc29uLk9yZGluYWwpKTsKKyAgICByZXR1cm4gZm5MaXN0OworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUGFyc2VzIHRoZSBzdXBwbGllZCA8cGFyYW1yZWYgbmFtZT0iZm9ybXVsYSIvPiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImZvcm11bGEiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBvYmplY3QgUGFyc2Uoc3RyaW5nIGZvcm11bGEpIHsKKyAgICByZXR1cm4gX3BhcnNlci5QYXJzZShmb3JtdWxhKTsKKyAgfQorCisgIC8vIFByYXZlZW4ncyBQYXJzZXIgU3VwcG9ydAorICBwdWJsaWMgRXhwcmVzc2lvbkdyYXBoLkV4cHJlc3Npb25HcmFwaCBQYXJzZVRvR3JhcGgoc3RyaW5nIGZvcm11bGEpIHsKKyAgICByZXR1cm4gX3BhcnNlci5QYXJzZVRvR3JhcGgoZm9ybXVsYSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9JTmFtZVZhbHVlUHJvdmlkZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvSU5hbWVWYWx1ZVByb3ZpZGVyLmNzCmluZGV4IGM5M2JmMGQuLjBhMjI3YWUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9JTmFtZVZhbHVlUHJvdmlkZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0lOYW1lVmFsdWVQcm92aWRlci5jcwpAQCAtMSwxNiArMSw5IEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Civvu79uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKLXsKLSAgICBwdWJsaWMgaW50ZXJmYWNlIElOYW1lVmFsdWVQcm92aWRlcgotICAgIHsKLSAgICAgICAgYm9vbCBJc05hbWVkVmFsdWUoc3RyaW5nIGtleSwgc3RyaW5nIHdvcmtzaGVldCk7CitwdWJsaWMgaW50ZXJmYWNlIElOYW1lVmFsdWVQcm92aWRlciB7CisgIGJvb2wgSXNOYW1lZFZhbHVlKHN0cmluZyBrZXksIHN0cmluZyB3b3Jrc2hlZXQpOwogCi0gICAgICAgIG9iamVjdCBHZXROYW1lZFZhbHVlKHN0cmluZyBrZXkpOworICBvYmplY3QgR2V0TmFtZWRWYWx1ZShzdHJpbmcga2V5KTsKIAotICAgICAgICB2b2lkIFJlbG9hZCgpOwotICAgIH0KKyAgdm9pZCBSZWxvYWQoKTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9JUGFyc2luZ0xpZmV0aW1lRXZlbnRIYW5kbGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0lQYXJzaW5nTGlmZXRpbWVFdmVudEhhbmRsZXIuY3MKaW5kZXggMWM2ZDMxYi4uNTJmYzc5NCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0lQYXJzaW5nTGlmZXRpbWVFdmVudEhhbmRsZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0lQYXJzaW5nTGlmZXRpbWVFdmVudEhhbmRsZXIuY3MKQEAgLTEsMTIgKzEsNSBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0Owor77u/bmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nCi17Ci0gICAgcHVibGljIGludGVyZmFjZSBJUGFyc2luZ0xpZmV0aW1lRXZlbnRIYW5kbGVyCi0gICAgewotICAgICAgICB2b2lkIFBhcnNpbmdDb21wbGV0ZWQoKTsKLSAgICB9CitwdWJsaWMgaW50ZXJmYWNlIElQYXJzaW5nTGlmZXRpbWVFdmVudEhhbmRsZXIgeworICB2b2lkIFBhcnNpbmdDb21wbGV0ZWQoKTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSUxleGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9JTGV4ZXIuY3MKaW5kZXggOTQzZmFiNC4uZWMzYWVmNSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9JTGV4ZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9JTGV4ZXIuY3MKQEAgLTEzLDMxICsxMywyOCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMKLXsKLSAgICBwdWJsaWMgaW50ZXJmYWNlIElMZXhlcgotICAgIHsKLSAgICAgICAgSUVudW1lcmFibGU8VG9rZW4+IFRva2VuaXplKHN0cmluZyBpbnB1dCk7Ci0gICAgICAgIElFbnVtZXJhYmxlPFRva2VuPiBUb2tlbml6ZShzdHJpbmcgaW5wdXQsIHN0cmluZyB3b3Jrc2hlZXQpOwotICAgIH0KK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOworCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7CisKK3B1YmxpYyBpbnRlcmZhY2UgSUxleGVyIHsKKyAgSUVudW1lcmFibGU8VG9rZW4+IFRva2VuaXplKHN0cmluZyBpbnB1dCk7CisKKyAgSUVudW1lcmFibGU8VG9rZW4+IFRva2VuaXplKHN0cmluZyBpbnB1dCwgc3RyaW5nIHdvcmtzaGVldCk7CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0lTb3VyY2VDb2RlVG9rZW5pemVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9JU291cmNlQ29kZVRva2VuaXplci5jcwppbmRleCAzYTZhZDQ4Li40ODhkNGFhIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0lTb3VyY2VDb2RlVG9rZW5pemVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSVNvdXJjZUNvZGVUb2tlbml6ZXIuY3MKQEAgLTEzLDMwICsxMywyNiBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMKLXsKLSAgICBwdWJsaWMgaW50ZXJmYWNlIElTb3VyY2VDb2RlVG9rZW5pemVyCi0gICAgewotICAgICAgICBJRW51bWVyYWJsZTxUb2tlbj4gVG9rZW5pemUoc3RyaW5nIGlucHV0LCBzdHJpbmcgd29ya3NoZWV0KTsKLSAgICB9Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOworCitwdWJsaWMgaW50ZXJmYWNlIElTb3VyY2VDb2RlVG9rZW5pemVyIHsKKyAgSUVudW1lcmFibGU8VG9rZW4+IFRva2VuaXplKHN0cmluZyBpbnB1dCwgc3RyaW5nIHdvcmtzaGVldCk7CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0lTeW50YWN0aWNBbmFseXplci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSVN5bnRhY3RpY0FuYWx5emVyLmNzCmluZGV4IDU1ZTFhODYuLjlmNzNkYmEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSVN5bnRhY3RpY0FuYWx5emVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSVN5bnRhY3RpY0FuYWx5emVyLmNzCkBAIC0xMywzMCArMTMsMjYgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCi17Ci0gICAgcHVibGljIGludGVyZmFjZSBJU3ludGFjdGljQW5hbHl6ZXIKLSAgICB7Ci0gICAgICAgIHZvaWQgQW5hbHl6ZShJRW51bWVyYWJsZTxUb2tlbj4gdG9rZW5zKTsKLSAgICB9Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOworCitwdWJsaWMgaW50ZXJmYWNlIElTeW50YWN0aWNBbmFseXplciB7CisgIHZvaWQgQW5hbHl6ZShJRW51bWVyYWJsZTxUb2tlbj4gdG9rZW5zKTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSVRva2VuRmFjdG9yeS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSVRva2VuRmFjdG9yeS5jcwppbmRleCBkMzMwZmZlLi5hYjViMTcwIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0lUb2tlbkZhY3RvcnkuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9JVG9rZW5GYWN0b3J5LmNzCkBAIC0xMywzMiArMTMsMzAgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCi17Ci0gICAgcHVibGljIGludGVyZmFjZSBJVG9rZW5GYWN0b3J5Ci0gICAgewotICAgICAgICBUb2tlbiBDcmVhdGUoSUVudW1lcmFibGU8VG9rZW4+IHRva2Vucywgc3RyaW5nIHRva2VuKTsKLSAgICAgICAgVG9rZW4gQ3JlYXRlKElFbnVtZXJhYmxlPFRva2VuPiB0b2tlbnMsIHN0cmluZyB0b2tlbiwgc3RyaW5nIHdvcmtzaGVldCk7Ci0gICAgICAgIFRva2VuIENyZWF0ZShzdHJpbmcgdG9rZW4sIFRva2VuVHlwZSBleHBsaWNpdFRva2VuVHlwZSk7Ci0gICAgfQordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKKworcHVibGljIGludGVyZmFjZSBJVG9rZW5GYWN0b3J5IHsKKyAgVG9rZW4gQ3JlYXRlKElFbnVtZXJhYmxlPFRva2VuPiB0b2tlbnMsIHN0cmluZyB0b2tlbik7CisKKyAgVG9rZW4gQ3JlYXRlKElFbnVtZXJhYmxlPFRva2VuPiB0b2tlbnMsIHN0cmluZyB0b2tlbiwgc3RyaW5nIHdvcmtzaGVldCk7CisKKyAgVG9rZW4gQ3JlYXRlKHN0cmluZyB0b2tlbiwgVG9rZW5UeXBlIGV4cGxpY2l0VG9rZW5UeXBlKTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSVRva2VuSW5kZXhQcm92aWRlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSVRva2VuSW5kZXhQcm92aWRlci5jcwppbmRleCA2YTdmNmM0Li4xMDI4YTFjIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0lUb2tlbkluZGV4UHJvdmlkZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9JVG9rZW5JbmRleFByb3ZpZGVyLmNzCkBAIC0xLDE0ICsxLDcgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK++7v25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCi17Ci0gICAgcHVibGljIGludGVyZmFjZSBJVG9rZW5JbmRleFByb3ZpZGVyCi0gICAgewotICAgICAgICBpbnQgSW5kZXggeyBnZXQ7ICB9CitwdWJsaWMgaW50ZXJmYWNlIElUb2tlbkluZGV4UHJvdmlkZXIgeworICBpbnQgSW5kZXggeyBnZXQ7IH0KIAotICAgICAgICB2b2lkIE1vdmVJbmRleFBvaW50ZXJGb3J3YXJkKCk7Ci0gICAgfQorICB2b2lkIE1vdmVJbmRleFBvaW50ZXJGb3J3YXJkKCk7CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0lUb2tlblNlcGFyYXRvclByb3ZpZGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9JVG9rZW5TZXBhcmF0b3JQcm92aWRlci5jcwppbmRleCBkYjM2MTBiLi45MWZiNmI5IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0lUb2tlblNlcGFyYXRvclByb3ZpZGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIuY3MKQEAgLTEzLDM1ICsxMywzMCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEzLTAzLTAxIChQcmlvciBmaWxlIGhpc3Rvcnkgb24gaHR0cHM6Ly9naXRodWIuY29tL3N3bWFsL0V4Y2VsRm9ybXVsYVBhcnNlcikKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOworCiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcwotewotICAgIHB1YmxpYyBpbnRlcmZhY2UgSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIKLSAgICB7Ci0gICAgICAgIElEaWN0aW9uYXJ5PHN0cmluZywgVG9rZW4+IFRva2VucyB7IGdldDsgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwogCi0gICAgICAgIGJvb2wgSXNPcGVyYXRvcihzdHJpbmcgaXRlbSk7CitwdWJsaWMgaW50ZXJmYWNlIElUb2tlblNlcGFyYXRvclByb3ZpZGVyIHsKKyAgSURpY3Rpb25hcnk8c3RyaW5nLCBUb2tlbj4gVG9rZW5zIHsgZ2V0OyB9CiAKLSAgICAgICAgYm9vbCBJc1Bvc3NpYmxlTGFzdFBhcnRPZk11bHRpcGxlQ2hhck9wZXJhdG9yKHN0cmluZyBwYXJ0KTsKKyAgYm9vbCBJc09wZXJhdG9yKHN0cmluZyBpdGVtKTsKIAotICAgIH0KKyAgYm9vbCBJc1Bvc3NpYmxlTGFzdFBhcnRPZk11bHRpcGxlQ2hhck9wZXJhdG9yKHN0cmluZyBwYXJ0KTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvTGV4ZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL0xleGVyLmNzCmluZGV4IGJjNWVhMTguLjM1ZjRlOGYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvTGV4ZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9MZXhlci5jcwpAQCAtMTMsNTYgKzEzLDUwIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOworCiAvL3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMKLXsKLSAgICBwdWJsaWMgY2xhc3MgTGV4ZXIgOiBJTGV4ZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBMZXhlcihGdW5jdGlvblJlcG9zaXRvcnkgZnVuY3Rpb25SZXBvc2l0b3J5LCBJTmFtZVZhbHVlUHJvdmlkZXIgbmFtZVZhbHVlUHJvdmlkZXIpCi0gICAgICAgICAgICA6dGhpcyhuZXcgU291cmNlQ29kZVRva2VuaXplcihmdW5jdGlvblJlcG9zaXRvcnksIG5hbWVWYWx1ZVByb3ZpZGVyKSwgbmV3IFN5bnRhY3RpY0FuYWx5emVyKCkpCi0gICAgICAgIHsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKIAotICAgICAgICB9CitwdWJsaWMgY2xhc3MgTGV4ZXIgOiBJTGV4ZXIgeworICBwdWJsaWMgTGV4ZXIoRnVuY3Rpb25SZXBvc2l0b3J5IGZ1bmN0aW9uUmVwb3NpdG9yeSwgSU5hbWVWYWx1ZVByb3ZpZGVyIG5hbWVWYWx1ZVByb3ZpZGVyKQorICAgICAgOiB0aGlzKAorICAgICAgICAgIG5ldyBTb3VyY2VDb2RlVG9rZW5pemVyKGZ1bmN0aW9uUmVwb3NpdG9yeSwgbmFtZVZhbHVlUHJvdmlkZXIpLAorICAgICAgICAgIG5ldyBTeW50YWN0aWNBbmFseXplcigpKSB7fQogCi0gICAgICAgIHB1YmxpYyBMZXhlcihJU291cmNlQ29kZVRva2VuaXplciB0b2tlbml6ZXIsIElTeW50YWN0aWNBbmFseXplciBhbmFseXplcikKLSAgICAgICAgewotICAgICAgICAgICAgX3Rva2VuaXplciA9IHRva2VuaXplcjsKLSAgICAgICAgICAgIF9hbmFseXplciA9IGFuYWx5emVyOwotICAgICAgICB9CisgIHB1YmxpYyBMZXhlcihJU291cmNlQ29kZVRva2VuaXplciB0b2tlbml6ZXIsIElTeW50YWN0aWNBbmFseXplciBhbmFseXplcikgeworICAgIF90b2tlbml6ZXIgPSB0b2tlbml6ZXI7CisgICAgX2FuYWx5emVyID0gYW5hbHl6ZXI7CisgIH0KIAotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElTb3VyY2VDb2RlVG9rZW5pemVyIF90b2tlbml6ZXI7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSVN5bnRhY3RpY0FuYWx5emVyIF9hbmFseXplcjsKKyAgcHJpdmF0ZSByZWFkb25seSBJU291cmNlQ29kZVRva2VuaXplciBfdG9rZW5pemVyOworICBwcml2YXRlIHJlYWRvbmx5IElTeW50YWN0aWNBbmFseXplciBfYW5hbHl6ZXI7CiAKLSAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPFRva2VuPiBUb2tlbml6ZShzdHJpbmcgaW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUb2tlbml6ZShpbnB1dCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIElFbnVtZXJhYmxlPFRva2VuPiBUb2tlbml6ZShzdHJpbmcgaW5wdXQsIHN0cmluZyB3b3Jrc2hlZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB0b2tlbnMgPSBfdG9rZW5pemVyLlRva2VuaXplKGlucHV0LCB3b3Jrc2hlZXQpOwotICAgICAgICAgICAgX2FuYWx5emVyLkFuYWx5emUodG9rZW5zKTsKLSAgICAgICAgICAgIHJldHVybiB0b2tlbnM7Ci0gICAgICAgIH0KLSAgICB9CisgIHB1YmxpYyBJRW51bWVyYWJsZTxUb2tlbj4gVG9rZW5pemUoc3RyaW5nIGlucHV0KSB7CisgICAgcmV0dXJuIFRva2VuaXplKGlucHV0LCBudWxsKTsKKyAgfQorCisgIHB1YmxpYyBJRW51bWVyYWJsZTxUb2tlbj4gVG9rZW5pemUoc3RyaW5nIGlucHV0LCBzdHJpbmcgd29ya3NoZWV0KSB7CisgICAgdmFyIHRva2VucyA9IF90b2tlbml6ZXIuVG9rZW5pemUoaW5wdXQsIHdvcmtzaGVldCk7CisgICAgX2FuYWx5emVyLkFuYWx5emUodG9rZW5zKTsKKyAgICByZXR1cm4gdG9rZW5zOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1NvdXJjZUNvZGVUb2tlbml6ZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1NvdXJjZUNvZGVUb2tlbml6ZXIuY3MKaW5kZXggYjgyNjVhMS4uMDFlOWJmOSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Tb3VyY2VDb2RlVG9rZW5pemVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvU291cmNlQ29kZVRva2VuaXplci5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMzQxICsxMywyODYgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIHVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcwotewotICAgIHB1YmxpYyBjbGFzcyBTb3VyY2VDb2RlVG9rZW5pemVyIDogSVNvdXJjZUNvZGVUb2tlbml6ZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgSVNvdXJjZUNvZGVUb2tlbml6ZXIgRGVmYXVsdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gbmV3IFNvdXJjZUNvZGVUb2tlbml6ZXIoRnVuY3Rpb25OYW1lUHJvdmlkZXIuRW1wdHksIE5hbWVWYWx1ZVByb3ZpZGVyLkVtcHR5KTsgfQotICAgICAgICB9CiAKLSAgICAgICAgcHVibGljIFNvdXJjZUNvZGVUb2tlbml6ZXIoSUZ1bmN0aW9uTmFtZVByb3ZpZGVyIGZ1bmN0aW9uUmVwb3NpdG9yeSwgSU5hbWVWYWx1ZVByb3ZpZGVyIG5hbWVWYWx1ZVByb3ZpZGVyKQotICAgICAgICAgICAgOiB0aGlzKG5ldyBUb2tlbkZhY3RvcnkoZnVuY3Rpb25SZXBvc2l0b3J5LCBuYW1lVmFsdWVQcm92aWRlciksIG5ldyBUb2tlblNlcGFyYXRvclByb3ZpZGVyKCkpCi0gICAgICAgIHsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKIAotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTb3VyY2VDb2RlVG9rZW5pemVyKElUb2tlbkZhY3RvcnkgdG9rZW5GYWN0b3J5LCBJVG9rZW5TZXBhcmF0b3JQcm92aWRlciB0b2tlblByb3ZpZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBfdG9rZW5GYWN0b3J5ID0gdG9rZW5GYWN0b3J5OwotICAgICAgICAgICAgX3Rva2VuUHJvdmlkZXIgPSB0b2tlblByb3ZpZGVyOwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgU291cmNlQ29kZVRva2VuaXplciA6IElTb3VyY2VDb2RlVG9rZW5pemVyIHsKKyAgcHVibGljIHN0YXRpYyBJU291cmNlQ29kZVRva2VuaXplciBEZWZhdWx0ID0+CisgICAgbmV3IFNvdXJjZUNvZGVUb2tlbml6ZXIoRnVuY3Rpb25OYW1lUHJvdmlkZXIuRW1wdHksIE5hbWVWYWx1ZVByb3ZpZGVyLkVtcHR5KTsKIAotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElUb2tlblNlcGFyYXRvclByb3ZpZGVyIF90b2tlblByb3ZpZGVyOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElUb2tlbkZhY3RvcnkgX3Rva2VuRmFjdG9yeTsKKyAgcHVibGljIFNvdXJjZUNvZGVUb2tlbml6ZXIoCisgICAgICBJRnVuY3Rpb25OYW1lUHJvdmlkZXIgZnVuY3Rpb25SZXBvc2l0b3J5LAorICAgICAgSU5hbWVWYWx1ZVByb3ZpZGVyIG5hbWVWYWx1ZVByb3ZpZGVyKQorICAgICAgOiB0aGlzKAorICAgICAgICAgIG5ldyBUb2tlbkZhY3RvcnkoZnVuY3Rpb25SZXBvc2l0b3J5LCBuYW1lVmFsdWVQcm92aWRlciksCisgICAgICAgICAgbmV3IFRva2VuU2VwYXJhdG9yUHJvdmlkZXIoKSkge30KIAotICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8VG9rZW4+IFRva2VuaXplKHN0cmluZyBpbnB1dCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFRva2VuaXplKGlucHV0LCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgSUVudW1lcmFibGU8VG9rZW4+IFRva2VuaXplKHN0cmluZyBpbnB1dCwgc3RyaW5nIHdvcmtzaGVldCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGlucHV0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRW51bWVyYWJsZS5FbXB0eTxUb2tlbj4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIE1BIDE0MDE6IElnbm9yZSBsZWFkaW5nIHBsdXMgaW4gZm9ybXVsYS4KLSAgICAgICAgICAgIGlucHV0ID0gaW5wdXQuVHJpbVN0YXJ0KCcrJyk7Ci0gICAgICAgICAgICB2YXIgY29udGV4dCA9IG5ldyBUb2tlbml6ZXJDb250ZXh0KGlucHV0KTsKKyAgcHVibGljIFNvdXJjZUNvZGVUb2tlbml6ZXIoSVRva2VuRmFjdG9yeSB0b2tlbkZhY3RvcnksIElUb2tlblNlcGFyYXRvclByb3ZpZGVyIHRva2VuUHJvdmlkZXIpIHsKKyAgICBfdG9rZW5GYWN0b3J5ID0gdG9rZW5GYWN0b3J5OworICAgIF90b2tlblByb3ZpZGVyID0gdG9rZW5Qcm92aWRlcjsKKyAgfQogCi0gICAgICAgICAgICBib29sIGlzU2luZ2xlUXVvdGVTdHJpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpPGNvbnRleHQuRm9ybXVsYUNoYXJzLkxlbmd0aDtpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGMgPSBjb250ZXh0LkZvcm11bGFDaGFyc1tpXTsKLSAgICAgICAgICAgICAgICBUb2tlbiB0b2tlblNlcGFyYXRvcjsKLSAgICAgICAgICAgICAgICBpZiAoQ2hhcklzVG9rZW5TZXBhcmF0b3IoYywgb3V0IHRva2VuU2VwYXJhdG9yKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LklzSW5TdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc0RvdWJsZVF1b3RlKHRva2VuU2VwYXJhdG9yLCBpLCBjb250ZXh0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZih0b2tlblNlcGFyYXRvci5Ub2tlblR5cGUgIT0gVG9rZW5UeXBlLlN0cmluZykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LkFwcGVuZFRvQ3VycmVudFRva2VuKGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ0hBTkdFIDIKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaXNTaW5nbGVRdW90ZVN0cmluZyAmJiBjICE9ICdcJycpIHx8ICghaXNTaW5nbGVRdW90ZVN0cmluZyAmJiBjICE9ICciJykpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nQnJhY2tldCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQnJhY2tldENvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5DbG9zaW5nQnJhY2tldCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQnJhY2tldENvdW50LS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5CcmFja2V0Q291bnQgPiAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LkFwcGVuZFRvQ3VycmVudFRva2VuKGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gdHdvIG9wZXJhdG9ycyBpbiBzZXF1ZW5jZSBjb3VsZCBiZSAiPD0iIG9yICI+PSIKLSAgICAgICAgICAgICAgICAgICAgaWYgKElzUGFydE9mTXVsdGlwbGVDaGFyU2VwYXJhdG9yKGNvbnRleHQsIGMpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc09wID0gY29udGV4dC5MYXN0VG9rZW4uVmFsdWUgKyBjLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9wID0gX3Rva2VuUHJvdmlkZXIuVG9rZW5zW3NPcF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LlJlcGxhY2VMYXN0VG9rZW4ob3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5OZXdUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuU2VwYXJhdG9yLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuU3RyaW5nKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDSEFOR0UzIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzU2luZ2xlUXVvdGVTdHJpbmcgPSAoYyA9PSAnXCcnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lkxhc3RUb2tlbiAhPSBudWxsICYmIGNvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ0VudW1lcmFibGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsgIC8vIFByYXZlZW4ncyBjaGFuZ2Ugb2YgMTAvMjgvMjAxNQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuVG9nZ2xlSXNJblN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuTGFzdFRva2VuICE9IG51bGwgJiYgY29udGV4dC5MYXN0VG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5BZGRUb2tlbighY29udGV4dC5DdXJyZW50VG9rZW5IYXNWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBUb2tlbihzdHJpbmcuRW1wdHksIFRva2VuVHlwZS5TdHJpbmdDb250ZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBUb2tlbihjb250ZXh0LkN1cnJlbnRUb2tlbiwgVG9rZW5UeXBlLlN0cmluZ0NvbnRlbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQWRkVG9rZW4obmV3IFRva2VuKCJcIiIsIFRva2VuVHlwZS5TdHJpbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuVG9nZ2xlSXNJblN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5OZXdUb2tlbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuQ3VycmVudFRva2VuSGFzVmFsdWUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZWdleC5Jc01hdGNoKGNvbnRleHQuQ3VycmVudFRva2VuLCAiXlwiKiQiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKF90b2tlbkZhY3RvcnkuQ3JlYXRlKGNvbnRleHQuQ3VycmVudFRva2VuLCBUb2tlblR5cGUuU3RyaW5nQ29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQWRkVG9rZW4oQ3JlYXRlVG9rZW4oY29udGV4dCwgd29ya3NoZWV0KSk7ICAKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBhIG5leHQgdG9rZW4gaXMgYW4gb3BlbmluZyBwYXJhbnRoZXNlcyBhbmQgdGhlIHByZXZpb3VzIHRva2VuIGlzIGludGVycGV0ZWQgYXMgYW4gYWRkcmVzcyBvciBuYW1lLCB0aGVuIHRoZSBjdXJyZW5jdCB0b2tlbiBpcyBhIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih0b2tlblNlcGFyYXRvci5Ub2tlblR5cGU9PVRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMgJiYgKGNvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZT09VG9rZW5UeXBlLkV4Y2VsQWRkcmVzcyB8fCBjb250ZXh0Lkxhc3RUb2tlbi5Ub2tlblR5cGU9PVRva2VuVHlwZS5OYW1lVmFsdWUpKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lkxhc3RUb2tlbi5Ub2tlblR5cGU9VG9rZW5UeXBlLkZ1bmN0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblNlcGFyYXRvci5WYWx1ZSA9PSAiLSIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUb2tlbklzTmVnYXRvcihjb250ZXh0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKG5ldyBUb2tlbigiLSIsIFRva2VuVHlwZS5OZWdhdG9yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5BZGRUb2tlbih0b2tlblNlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuTmV3VG9rZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29udGV4dC5DdXJyZW50VG9rZW5IYXNWYWx1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKENyZWF0ZVRva2VuKGNvbnRleHQsIHdvcmtzaGVldCkpOwotICAgICAgICAgICAgfQorICBwcml2YXRlIHJlYWRvbmx5IElUb2tlblNlcGFyYXRvclByb3ZpZGVyIF90b2tlblByb3ZpZGVyOworICBwcml2YXRlIHJlYWRvbmx5IElUb2tlbkZhY3RvcnkgX3Rva2VuRmFjdG9yeTsKIAotICAgICAgICAgICAgQ2xlYW51cFRva2Vucyhjb250ZXh0LCBfdG9rZW5Qcm92aWRlci5Ub2tlbnMpOworICBwdWJsaWMgSUVudW1lcmFibGU8VG9rZW4+IFRva2VuaXplKHN0cmluZyBpbnB1dCkgeworICAgIHJldHVybiBUb2tlbml6ZShpbnB1dCwgbnVsbCk7CisgIH0KIAotICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuUmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBJc0RvdWJsZVF1b3RlKFRva2VuIHRva2VuU2VwYXJhdG9yLCBpbnQgZm9ybXVsYUNoYXJJbmRleCwgVG9rZW5pemVyQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcgJiYgZm9ybXVsYUNoYXJJbmRleCArIDEgPCBjb250ZXh0LkZvcm11bGFDaGFycy5MZW5ndGggJiYgY29udGV4dC5Gb3JtdWxhQ2hhcnNbZm9ybXVsYUNoYXJJbmRleCArIDFdID09ICdcIic7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ2xlYW51cFRva2VucyhUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsIElEaWN0aW9uYXJ5PHN0cmluZywgVG9rZW4+ICB0b2tlbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dC5SZXN1bHQuQ291bnQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgdG9rZW49Y29udGV4dC5SZXN1bHRbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuVW5yZWNvZ25pemVkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBjb250ZXh0LlJlc3VsdC5Db3VudCAtIDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LlJlc3VsdFtpKzFdLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLlRva2VuVHlwZSA9IFRva2VuVHlwZS5GdW5jdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5Ub2tlblR5cGUgPSBUb2tlblR5cGUuTmFtZVZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uVG9rZW5UeXBlID0gVG9rZW5UeXBlLk5hbWVWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLkZ1bmN0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBjb250ZXh0LlJlc3VsdC5Db3VudCAtIDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LlJlc3VsdFtpICsgMV0uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uVG9rZW5UeXBlID0gVG9rZW5UeXBlLkZ1bmN0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLlRva2VuVHlwZSA9IFRva2VuVHlwZS5VbnJlY29nbml6ZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5Ub2tlblR5cGUgPSBUb2tlblR5cGUuVW5yZWNvZ25pemVkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZXJhdG9yIHx8IHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuTmVnYXRvcikgJiYgaSA8IGNvbnRleHQuUmVzdWx0LkNvdW50IC0gMSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICh0b2tlbi5WYWx1ZT09IisiIHx8IHRva2VuLlZhbHVlPT0iLSIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPiAwICYmIHRva2VuLlZhbHVlID09ICIrIikgICAgLy9SZW1vdmUgYW55ICsgd2l0aCBhbiBvcGVuaW5nIHBhcmVudGhlc2lzIGJlZm9yZS4KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuUmVzdWx0W2kgLSAxXS5Ub2tlblR5cGUgID09IFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5SZXN1bHQuUmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0TmVnYXRvck9wZXJhdG9yKGNvbnRleHQsIGksIHRva2Vucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRUb2tlbiA9IGNvbnRleHQuUmVzdWx0W2kgKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRUb2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZXJhdG9yIHx8IG5leHRUb2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk5lZ2F0b3IpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi5WYWx1ZSA9PSAiKyIgJiYgKG5leHRUb2tlbi5WYWx1ZT09IisiIHx8IG5leHRUb2tlbi5WYWx1ZSA9PSAiLSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIGZpcnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5SZXN1bHQuUmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0TmVnYXRvck9wZXJhdG9yKGNvbnRleHQsIGksIHRva2Vucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodG9rZW4uVmFsdWUgPT0gIi0iICYmIG5leHRUb2tlbi5WYWx1ZSA9PSAiKyIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9SZW1vdmUgc2Vjb25kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5SZXN1bHQuUmVtb3ZlQXQoaSsxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXROZWdhdG9yT3BlcmF0b3IoY29udGV4dCwgaSwgdG9rZW5zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0b2tlbi5WYWx1ZSA9PSAiLSIgJiYgbmV4dFRva2VuLlZhbHVlID09ICItIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1JlbW92ZSBmaXJzdCBhbmQgc2V0IG9wZXJhdG9yIHRvICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LlJlc3VsdC5SZW1vdmVBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5SZXN1bHQuUmVtb3ZlQXQoaSsxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnRleHQuUmVzdWx0W2ldLlRva2VuVHlwZSA9IFRva2VuVHlwZS5PcGVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb250ZXh0LlJlc3VsdFtpXS5WYWx1ZSA9ICIrIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5SZXN1bHRbaV0gPSB0b2tlbnNbIisiXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0TmVnYXRvck9wZXJhdG9yKGNvbnRleHQsIGksIHRva2Vucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFNldE5lZ2F0b3JPcGVyYXRvcihUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsIGludCBpLCBJRGljdGlvbmFyeTxzdHJpbmcsIFRva2VuPiAgdG9rZW5zKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dC5SZXN1bHRbaV0uVmFsdWUgPT0gIi0iICYmIGkgPiAwICYmIChjb250ZXh0LlJlc3VsdFtpXS5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZXJhdG9yIHx8IGNvbnRleHQuUmVzdWx0W2ldLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuTmVnYXRvcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKFRva2VuSXNOZWdhdG9yKGNvbnRleHQuUmVzdWx0W2kgLSAxXSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LlJlc3VsdFtpXSA9IG5ldyBUb2tlbigiLSIsIFRva2VuVHlwZS5OZWdhdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5SZXN1bHRbaV0gPSB0b2tlbnNbIi0iXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIFRva2VuSXNOZWdhdG9yKFRva2VuaXplckNvbnRleHQgY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFRva2VuSXNOZWdhdG9yKGNvbnRleHQuTGFzdFRva2VuKTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIFRva2VuSXNOZWdhdG9yKFRva2VuIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0ID09IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlcmF0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzCi0gICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgdC5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLkNvbW1hCi0gICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgdC5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlNlbWlDb2xvbgotICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHQuVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nRW51bWVyYWJsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbCBJc1BhcnRPZk11bHRpcGxlQ2hhclNlcGFyYXRvcihUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsIGNoYXIgYykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGxhc3RUb2tlbiA9IGNvbnRleHQuTGFzdFRva2VuICE9IG51bGwgPyBjb250ZXh0Lkxhc3RUb2tlbi5WYWx1ZSA6IHN0cmluZy5FbXB0eTsKLSAgICAgICAgICAgIHJldHVybiBfdG9rZW5Qcm92aWRlci5Jc09wZXJhdG9yKGxhc3RUb2tlbikgCi0gICAgICAgICAgICAgICAgJiYgX3Rva2VuUHJvdmlkZXIuSXNQb3NzaWJsZUxhc3RQYXJ0T2ZNdWx0aXBsZUNoYXJPcGVyYXRvcihjLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKSAKLSAgICAgICAgICAgICAgICAmJiAhY29udGV4dC5DdXJyZW50VG9rZW5IYXNWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgVG9rZW4gQ3JlYXRlVG9rZW4oVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LCBzdHJpbmcgd29ya3NoZWV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dC5DdXJyZW50VG9rZW4gPT0gIi0iKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lkxhc3RUb2tlbiA9PSBudWxsICYmIGNvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlcmF0b3IpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKCItIiwgVG9rZW5UeXBlLk5lZ2F0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBfdG9rZW5GYWN0b3J5LkNyZWF0ZShjb250ZXh0LlJlc3VsdCwgY29udGV4dC5DdXJyZW50VG9rZW4sIHdvcmtzaGVldCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2wgQ2hhcklzVG9rZW5TZXBhcmF0b3IoY2hhciBjLCBvdXQgVG9rZW4gdG9rZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfdG9rZW5Qcm92aWRlci5Ub2tlbnMuQ29udGFpbnNLZXkoYy5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIHRva2VuID0gcmVzdWx0ID8gdG9rZW4gPSBfdG9rZW5Qcm92aWRlci5Ub2tlbnNbYy5Ub1N0cmluZygpXSA6IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9CisgIHB1YmxpYyBJRW51bWVyYWJsZTxUb2tlbj4gVG9rZW5pemUoc3RyaW5nIGlucHV0LCBzdHJpbmcgd29ya3NoZWV0KSB7CisgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KGlucHV0KSkgeworICAgICAgcmV0dXJuIEVudW1lcmFibGUuRW1wdHk8VG9rZW4+KCk7CiAgICAgfQorICAgIC8vIE1BIDE0MDE6IElnbm9yZSBsZWFkaW5nIHBsdXMgaW4gZm9ybXVsYS4KKyAgICBpbnB1dCA9IGlucHV0LlRyaW1TdGFydCgnKycpOworICAgIHZhciBjb250ZXh0ID0gbmV3IFRva2VuaXplckNvbnRleHQoaW5wdXQpOworCisgICAgYm9vbCBpc1NpbmdsZVF1b3RlU3RyaW5nID0gZmFsc2U7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0LkZvcm11bGFDaGFycy5MZW5ndGg7IGkrKykgeworICAgICAgdmFyIGMgPSBjb250ZXh0LkZvcm11bGFDaGFyc1tpXTsKKyAgICAgIFRva2VuIHRva2VuU2VwYXJhdG9yOworICAgICAgaWYgKENoYXJJc1Rva2VuU2VwYXJhdG9yKGMsIG91dCB0b2tlblNlcGFyYXRvcikpIHsKKyAgICAgICAgaWYgKGNvbnRleHQuSXNJblN0cmluZykgeworICAgICAgICAgIGlmIChJc0RvdWJsZVF1b3RlKHRva2VuU2VwYXJhdG9yLCBpLCBjb250ZXh0KSkgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlICE9IFRva2VuVHlwZS5TdHJpbmcpIHsKKyAgICAgICAgICAgIGNvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gQ0hBTkdFIDIKKyAgICAgICAgICBpZiAoKGlzU2luZ2xlUXVvdGVTdHJpbmcgJiYgYyAhPSAnXCcnKSB8fCAoIWlzU2luZ2xlUXVvdGVTdHJpbmcgJiYgYyAhPSAnIicpKSB7CisgICAgICAgICAgICBjb250ZXh0LkFwcGVuZFRvQ3VycmVudFRva2VuKGMpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0b2tlblNlcGFyYXRvci5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZW5pbmdCcmFja2V0KSB7CisgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKKyAgICAgICAgICBjb250ZXh0LkJyYWNrZXRDb3VudCsrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICh0b2tlblNlcGFyYXRvci5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLkNsb3NpbmdCcmFja2V0KSB7CisgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKKyAgICAgICAgICBjb250ZXh0LkJyYWNrZXRDb3VudC0tOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjb250ZXh0LkJyYWNrZXRDb3VudCA+IDApIHsKKyAgICAgICAgICBjb250ZXh0LkFwcGVuZFRvQ3VycmVudFRva2VuKGMpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIHR3byBvcGVyYXRvcnMgaW4gc2VxdWVuY2UgY291bGQgYmUgIjw9IiBvciAiPj0iCisgICAgICAgIGlmIChJc1BhcnRPZk11bHRpcGxlQ2hhclNlcGFyYXRvcihjb250ZXh0LCBjKSkgeworICAgICAgICAgIHZhciBzT3AgPSBjb250ZXh0Lkxhc3RUb2tlbi5WYWx1ZSArIGMuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgdmFyIG9wID0gX3Rva2VuUHJvdmlkZXIuVG9rZW5zW3NPcF07CisgICAgICAgICAgY29udGV4dC5SZXBsYWNlTGFzdFRva2VuKG9wKTsKKyAgICAgICAgICBjb250ZXh0Lk5ld1Rva2VuKCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRva2VuU2VwYXJhdG9yLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuU3RyaW5nKSB7CisgICAgICAgICAgLy8gQ0hBTkdFMyA6CisgICAgICAgICAgaXNTaW5nbGVRdW90ZVN0cmluZyA9IChjID09ICdcJycpOworICAgICAgICAgIGlmIChjb250ZXh0Lkxhc3RUb2tlbiAhPSBudWxsCisgICAgICAgICAgICAgICYmIGNvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ0VudW1lcmFibGUpIHsKKyAgICAgICAgICAgIC8vIGNvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7ICAvLyBQcmF2ZWVuJ3MgY2hhbmdlIG9mIDEwLzI4LzIwMTUKKyAgICAgICAgICAgIGNvbnRleHQuVG9nZ2xlSXNJblN0cmluZygpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChjb250ZXh0Lkxhc3RUb2tlbiAhPSBudWxsICYmIGNvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuU3RyaW5nKSB7CisgICAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKAorICAgICAgICAgICAgICAgICFjb250ZXh0LkN1cnJlbnRUb2tlbkhhc1ZhbHVlCisgICAgICAgICAgICAgICAgICAgID8gbmV3KHN0cmluZy5FbXB0eSwgVG9rZW5UeXBlLlN0cmluZ0NvbnRlbnQpCisgICAgICAgICAgICAgICAgICAgIDogbmV3IFRva2VuKGNvbnRleHQuQ3VycmVudFRva2VuLCBUb2tlblR5cGUuU3RyaW5nQ29udGVudCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKG5ldygiXCIiLCBUb2tlblR5cGUuU3RyaW5nKSk7CisgICAgICAgICAgY29udGV4dC5Ub2dnbGVJc0luU3RyaW5nKCk7CisgICAgICAgICAgY29udGV4dC5OZXdUb2tlbigpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjb250ZXh0LkN1cnJlbnRUb2tlbkhhc1ZhbHVlKSB7CisgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goY29udGV4dC5DdXJyZW50VG9rZW4sICJeXCIqJCIpKSB7CisgICAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKF90b2tlbkZhY3RvcnkuQ3JlYXRlKGNvbnRleHQuQ3VycmVudFRva2VuLCBUb2tlblR5cGUuU3RyaW5nQ29udGVudCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKENyZWF0ZVRva2VuKGNvbnRleHQsIHdvcmtzaGVldCkpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vSWYgdGhlIGEgbmV4dCB0b2tlbiBpcyBhbiBvcGVuaW5nIHBhcmFudGhlc2VzIGFuZCB0aGUgcHJldmlvdXMgdG9rZW4gaXMgaW50ZXJwZXRlZCBhcyBhbiBhZGRyZXNzIG9yIG5hbWUsIHRoZW4gdGhlIGN1cnJlbmN0IHRva2VuIGlzIGEgZnVuY3Rpb24KKyAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMKKyAgICAgICAgICAgICAgJiYgKGNvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuRXhjZWxBZGRyZXNzCisgICAgICAgICAgICAgICAgICAgICAgfHwgY29udGV4dC5MYXN0VG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5OYW1lVmFsdWUpKSB7CisgICAgICAgICAgICBjb250ZXh0Lkxhc3RUb2tlbi5Ub2tlblR5cGUgPSBUb2tlblR5cGUuRnVuY3Rpb247CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh0b2tlblNlcGFyYXRvci5WYWx1ZSA9PSAiLSIpIHsKKyAgICAgICAgICBpZiAoVG9rZW5Jc05lZ2F0b3IoY29udGV4dCkpIHsKKyAgICAgICAgICAgIGNvbnRleHQuQWRkVG9rZW4obmV3KCItIiwgVG9rZW5UeXBlLk5lZ2F0b3IpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb250ZXh0LkFkZFRva2VuKHRva2VuU2VwYXJhdG9yKTsKKyAgICAgICAgY29udGV4dC5OZXdUb2tlbigpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGNvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7CisgICAgfQorICAgIGlmIChjb250ZXh0LkN1cnJlbnRUb2tlbkhhc1ZhbHVlKSB7CisgICAgICBjb250ZXh0LkFkZFRva2VuKENyZWF0ZVRva2VuKGNvbnRleHQsIHdvcmtzaGVldCkpOworICAgIH0KKworICAgIENsZWFudXBUb2tlbnMoY29udGV4dCwgX3Rva2VuUHJvdmlkZXIuVG9rZW5zKTsKKworICAgIHJldHVybiBjb250ZXh0LlJlc3VsdDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGJvb2wgSXNEb3VibGVRdW90ZSgKKyAgICAgIFRva2VuIHRva2VuU2VwYXJhdG9yLAorICAgICAgaW50IGZvcm11bGFDaGFySW5kZXgsCisgICAgICBUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQpIHsKKyAgICByZXR1cm4gdG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcKKyAgICAgICAgJiYgZm9ybXVsYUNoYXJJbmRleCArIDEgPCBjb250ZXh0LkZvcm11bGFDaGFycy5MZW5ndGgKKyAgICAgICAgJiYgY29udGV4dC5Gb3JtdWxhQ2hhcnNbZm9ybXVsYUNoYXJJbmRleCArIDFdID09ICdcIic7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIENsZWFudXBUb2tlbnMoVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LCBJRGljdGlvbmFyeTxzdHJpbmcsIFRva2VuPiB0b2tlbnMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRleHQuUmVzdWx0LkNvdW50OyBpKyspIHsKKyAgICAgIHZhciB0b2tlbiA9IGNvbnRleHQuUmVzdWx0W2ldOworICAgICAgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuVW5yZWNvZ25pemVkKSB7CisgICAgICAgIGlmIChpIDwgY29udGV4dC5SZXN1bHQuQ291bnQgLSAxKSB7CisgICAgICAgICAgaWYgKGNvbnRleHQuUmVzdWx0W2kgKyAxXS5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcykgeworICAgICAgICAgICAgdG9rZW4uVG9rZW5UeXBlID0gVG9rZW5UeXBlLkZ1bmN0aW9uOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0b2tlbi5Ub2tlblR5cGUgPSBUb2tlblR5cGUuTmFtZVZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0b2tlbi5Ub2tlblR5cGUgPSBUb2tlblR5cGUuTmFtZVZhbHVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuRnVuY3Rpb24pIHsKKyAgICAgICAgaWYgKGkgPCBjb250ZXh0LlJlc3VsdC5Db3VudCAtIDEpIHsKKyAgICAgICAgICBpZiAoY29udGV4dC5SZXN1bHRbaSArIDFdLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzKSB7CisgICAgICAgICAgICB0b2tlbi5Ub2tlblR5cGUgPSBUb2tlblR5cGUuRnVuY3Rpb247CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRva2VuLlRva2VuVHlwZSA9IFRva2VuVHlwZS5VbnJlY29nbml6ZWQ7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRva2VuLlRva2VuVHlwZSA9IFRva2VuVHlwZS5VbnJlY29nbml6ZWQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoKHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlcmF0b3IgfHwgdG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5OZWdhdG9yKQorICAgICAgICAgICYmIGkgPCBjb250ZXh0LlJlc3VsdC5Db3VudCAtIDEKKyAgICAgICAgICAmJiAodG9rZW4uVmFsdWUgPT0gIisiIHx8IHRva2VuLlZhbHVlID09ICItIikpIHsKKyAgICAgICAgaWYgKGkgPiAwCisgICAgICAgICAgICAmJiB0b2tlbi5WYWx1ZQorICAgICAgICAgICAgICAgID09ICIrIikgLy9SZW1vdmUgYW55ICsgd2l0aCBhbiBvcGVuaW5nIHBhcmVudGhlc2lzIGJlZm9yZS4KKyAgICAgICAgeworICAgICAgICAgIGlmIChjb250ZXh0LlJlc3VsdFtpIC0gMV0uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMpIHsKKyAgICAgICAgICAgIGNvbnRleHQuUmVzdWx0LlJlbW92ZUF0KGkpOworICAgICAgICAgICAgU2V0TmVnYXRvck9wZXJhdG9yKGNvbnRleHQsIGksIHRva2Vucyk7CisgICAgICAgICAgICBpLS07CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2YXIgbmV4dFRva2VuID0gY29udGV4dC5SZXN1bHRbaSArIDFdOworICAgICAgICBpZiAobmV4dFRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlcmF0b3IgfHwgbmV4dFRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuTmVnYXRvcikgeworICAgICAgICAgIGlmICh0b2tlbi5WYWx1ZSA9PSAiKyIgJiYgKG5leHRUb2tlbi5WYWx1ZSA9PSAiKyIgfHwgbmV4dFRva2VuLlZhbHVlID09ICItIikpIHsKKyAgICAgICAgICAgIC8vUmVtb3ZlIGZpcnN0CisgICAgICAgICAgICBjb250ZXh0LlJlc3VsdC5SZW1vdmVBdChpKTsKKyAgICAgICAgICAgIFNldE5lZ2F0b3JPcGVyYXRvcihjb250ZXh0LCBpLCB0b2tlbnMpOworICAgICAgICAgICAgaS0tOworICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4uVmFsdWUgPT0gIi0iICYmIG5leHRUb2tlbi5WYWx1ZSA9PSAiKyIpIHsKKyAgICAgICAgICAgIC8vUmVtb3ZlIHNlY29uZAorICAgICAgICAgICAgY29udGV4dC5SZXN1bHQuUmVtb3ZlQXQoaSArIDEpOworICAgICAgICAgICAgU2V0TmVnYXRvck9wZXJhdG9yKGNvbnRleHQsIGksIHRva2Vucyk7CisgICAgICAgICAgICBpLS07CisgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbi5WYWx1ZSA9PSAiLSIgJiYgbmV4dFRva2VuLlZhbHVlID09ICItIikgeworICAgICAgICAgICAgLy9SZW1vdmUgZmlyc3QgYW5kIHNldCBvcGVyYXRvciB0byArCisgICAgICAgICAgICBjb250ZXh0LlJlc3VsdC5SZW1vdmVBdChpKTsKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgY29udGV4dC5SZXN1bHQuUmVtb3ZlQXQoaSArIDEpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvL2NvbnRleHQuUmVzdWx0W2ldLlRva2VuVHlwZSA9IFRva2VuVHlwZS5PcGVyYXRvcjsKKyAgICAgICAgICAgICAgLy9jb250ZXh0LlJlc3VsdFtpXS5WYWx1ZSA9ICIrIjsKKyAgICAgICAgICAgICAgY29udGV4dC5SZXN1bHRbaV0gPSB0b2tlbnNbIisiXTsKKyAgICAgICAgICAgICAgU2V0TmVnYXRvck9wZXJhdG9yKGNvbnRleHQsIGksIHRva2Vucyk7CisgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIFNldE5lZ2F0b3JPcGVyYXRvcigKKyAgICAgIFRva2VuaXplckNvbnRleHQgY29udGV4dCwKKyAgICAgIGludCBpLAorICAgICAgSURpY3Rpb25hcnk8c3RyaW5nLCBUb2tlbj4gdG9rZW5zKSB7CisgICAgaWYgKGNvbnRleHQuUmVzdWx0W2ldLlZhbHVlID09ICItIgorICAgICAgICAmJiBpID4gMAorICAgICAgICAmJiAoY29udGV4dC5SZXN1bHRbaV0uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVyYXRvcgorICAgICAgICAgICAgICAgIHx8IGNvbnRleHQuUmVzdWx0W2ldLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuTmVnYXRvcikpIHsKKyAgICAgIGlmIChUb2tlbklzTmVnYXRvcihjb250ZXh0LlJlc3VsdFtpIC0gMV0pKSB7CisgICAgICAgIGNvbnRleHQuUmVzdWx0W2ldID0gbmV3KCItIiwgVG9rZW5UeXBlLk5lZ2F0b3IpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udGV4dC5SZXN1bHRbaV0gPSB0b2tlbnNbIi0iXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sIFRva2VuSXNOZWdhdG9yKFRva2VuaXplckNvbnRleHQgY29udGV4dCkgeworICAgIHJldHVybiBUb2tlbklzTmVnYXRvcihjb250ZXh0Lkxhc3RUb2tlbik7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBib29sIFRva2VuSXNOZWdhdG9yKFRva2VuIHQpIHsKKyAgICByZXR1cm4gdCA9PSBudWxsCisgICAgICAgIHx8IHQuVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVyYXRvcgorICAgICAgICB8fCB0LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzCisgICAgICAgIHx8IHQuVG9rZW5UeXBlID09IFRva2VuVHlwZS5Db21tYQorICAgICAgICB8fCB0LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuU2VtaUNvbG9uCisgICAgICAgIHx8IHQuVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nRW51bWVyYWJsZTsKKyAgfQorCisgIHByaXZhdGUgYm9vbCBJc1BhcnRPZk11bHRpcGxlQ2hhclNlcGFyYXRvcihUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsIGNoYXIgYykgeworICAgIHZhciBsYXN0VG9rZW4gPSBjb250ZXh0Lkxhc3RUb2tlbiAhPSBudWxsID8gY29udGV4dC5MYXN0VG9rZW4uVmFsdWUgOiBzdHJpbmcuRW1wdHk7CisgICAgcmV0dXJuIF90b2tlblByb3ZpZGVyLklzT3BlcmF0b3IobGFzdFRva2VuKQorICAgICAgICAmJiBfdG9rZW5Qcm92aWRlci5Jc1Bvc3NpYmxlTGFzdFBhcnRPZk11bHRpcGxlQ2hhck9wZXJhdG9yKAorICAgICAgICAgICAgYy5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkKKyAgICAgICAgJiYgIWNvbnRleHQuQ3VycmVudFRva2VuSGFzVmFsdWU7CisgIH0KKworICBwcml2YXRlIFRva2VuIENyZWF0ZVRva2VuKFRva2VuaXplckNvbnRleHQgY29udGV4dCwgc3RyaW5nIHdvcmtzaGVldCkgeworICAgIGlmIChjb250ZXh0LkN1cnJlbnRUb2tlbiA9PSAiLSIpIHsKKyAgICAgIGlmIChjb250ZXh0Lkxhc3RUb2tlbiA9PSBudWxsICYmIGNvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlcmF0b3IpIHsKKyAgICAgICAgcmV0dXJuIG5ldygiLSIsIFRva2VuVHlwZS5OZWdhdG9yKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF90b2tlbkZhY3RvcnkuQ3JlYXRlKGNvbnRleHQuUmVzdWx0LCBjb250ZXh0LkN1cnJlbnRUb2tlbiwgd29ya3NoZWV0KTsKKyAgfQorCisgIHByaXZhdGUgYm9vbCBDaGFySXNUb2tlblNlcGFyYXRvcihjaGFyIGMsIG91dCBUb2tlbiB0b2tlbikgeworICAgIHZhciByZXN1bHQgPSBfdG9rZW5Qcm92aWRlci5Ub2tlbnMuQ29udGFpbnNLZXkoYy5Ub1N0cmluZygpKTsKKyAgICB0b2tlbiA9IHJlc3VsdCA/IHRva2VuID0gX3Rva2VuUHJvdmlkZXIuVG9rZW5zW2MuVG9TdHJpbmcoKV0gOiBudWxsOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvU3ludGFjdGljQW5hbHl6ZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1N5bnRhY3RpY0FuYWx5emVyLmNzCmluZGV4IDA2NjYyMjAuLmU3NzFhYWYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvU3ludGFjdGljQW5hbHl6ZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9TeW50YWN0aWNBbmFseXplci5jcwpAQCAtMTMsOTAgKzEzLDc3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZXB0aW9uczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCi17Ci0gICAgcHVibGljIGNsYXNzIFN5bnRhY3RpY0FuYWx5emVyIDogSVN5bnRhY3RpY0FuYWx5emVyCi0gICAgewotICAgICAgICBwcml2YXRlIGNsYXNzIEFuYWx5emluZ0NvbnRleHQKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGludCBOdW1iZXJPZk9wZW5lZFBhcmVudGhlc2VzIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgTnVtYmVyT2ZDbG9zZWRQYXJlbnRoZXNlcyB7IGdldDsgc2V0OyB9Ci0gICAgICAgICAgICBwdWJsaWMgaW50IE9wZW5lZFN0cmluZ3MgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgcHVibGljIGludCBDbG9zZWRTdHJpbmdzIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgICAgIHB1YmxpYyBib29sIElzSW5TdHJpbmcgeyBnZXQ7IHNldDsgfQotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIEFuYWx5emUoSUVudW1lcmFibGU8VG9rZW4+IHRva2VucykKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBuZXcgQW5hbHl6aW5nQ29udGV4dCgpOwotICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRva2VuIGluIHRva2VucykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5VbnJlY29nbml6ZWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5yZWNvZ25pemVkVG9rZW5FeGNlcHRpb24odG9rZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBFbnN1cmVQYXJlbnRoZXNlc0FyZVdlbGxGb3JtZWQodG9rZW4sIGNvbnRleHQpOwotICAgICAgICAgICAgICAgIEVuc3VyZVN0cmluZ3NBcmVXZWxsRm9ybWVkKHRva2VuLCBjb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFZhbGlkYXRlKGNvbnRleHQpOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7CiAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBWYWxpZGF0ZShBbmFseXppbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0Lk51bWJlck9mT3BlbmVkUGFyZW50aGVzZXMgIT0gY29udGV4dC5OdW1iZXJPZkNsb3NlZFBhcmVudGhlc2VzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oIk51bWJlciBvZiBvcGVuZWQgYW5kIGNsb3NlZCBwYXJlbnRoZXNlcyBkb2VzIG5vdCBtYXRjaCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbnRleHQuT3BlbmVkU3RyaW5ncyAhPSBjb250ZXh0LkNsb3NlZFN0cmluZ3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZvcm1hdEV4Y2VwdGlvbigiVW50ZXJtaW5hdGVkIHN0cmluZyIpOwotICAgICAgICAgICAgfQotICAgICAgICB9CitwdWJsaWMgY2xhc3MgU3ludGFjdGljQW5hbHl6ZXIgOiBJU3ludGFjdGljQW5hbHl6ZXIgeworICBwcml2YXRlIGNsYXNzIEFuYWx5emluZ0NvbnRleHQgeworICAgIHB1YmxpYyBpbnQgTnVtYmVyT2ZPcGVuZWRQYXJlbnRoZXNlcyB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIEVuc3VyZVBhcmVudGhlc2VzQXJlV2VsbEZvcm1lZChUb2tlbiB0b2tlbiwgQW5hbHl6aW5nQ29udGV4dCBjb250ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5OdW1iZXJPZk9wZW5lZFBhcmVudGhlc2VzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLkNsb3NpbmdQYXJlbnRoZXNpcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0Lk51bWJlck9mQ2xvc2VkUGFyZW50aGVzZXMrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIHB1YmxpYyBpbnQgTnVtYmVyT2ZDbG9zZWRQYXJlbnRoZXNlcyB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIEVuc3VyZVN0cmluZ3NBcmVXZWxsRm9ybWVkKFRva2VuIHRva2VuLCBBbmFseXppbmdDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY29udGV4dC5Jc0luU3RyaW5nICYmIHRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuU3RyaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRleHQuSXNJblN0cmluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5PcGVuZWRTdHJpbmdzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChjb250ZXh0LklzSW5TdHJpbmcgJiYgdG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5Jc0luU3RyaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5DbG9zZWRTdHJpbmdzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBwdWJsaWMgaW50IE9wZW5lZFN0cmluZ3MgeyBnZXQ7IHNldDsgfQorCisgICAgcHVibGljIGludCBDbG9zZWRTdHJpbmdzIHsgZ2V0OyBzZXQ7IH0KKworICAgIHB1YmxpYyBib29sIElzSW5TdHJpbmcgeyBnZXQ7IHNldDsgfQorICB9CisKKyAgcHVibGljIHZvaWQgQW5hbHl6ZShJRW51bWVyYWJsZTxUb2tlbj4gdG9rZW5zKSB7CisgICAgdmFyIGNvbnRleHQgPSBuZXcgQW5hbHl6aW5nQ29udGV4dCgpOworICAgIGZvcmVhY2ggKHZhciB0b2tlbiBpbiB0b2tlbnMpIHsKKyAgICAgIGlmICh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlVucmVjb2duaXplZCkgeworICAgICAgICB0aHJvdyBuZXcgVW5yZWNvZ25pemVkVG9rZW5FeGNlcHRpb24odG9rZW4pOworICAgICAgfQorICAgICAgRW5zdXJlUGFyZW50aGVzZXNBcmVXZWxsRm9ybWVkKHRva2VuLCBjb250ZXh0KTsKKyAgICAgIEVuc3VyZVN0cmluZ3NBcmVXZWxsRm9ybWVkKHRva2VuLCBjb250ZXh0KTsKICAgICB9CisgICAgVmFsaWRhdGUoY29udGV4dCk7CisgIH0KKworICBwcml2YXRlIHN0YXRpYyB2b2lkIFZhbGlkYXRlKEFuYWx5emluZ0NvbnRleHQgY29udGV4dCkgeworICAgIGlmIChjb250ZXh0Lk51bWJlck9mT3BlbmVkUGFyZW50aGVzZXMgIT0gY29udGV4dC5OdW1iZXJPZkNsb3NlZFBhcmVudGhlc2VzKSB7CisgICAgICB0aHJvdyBuZXcgRm9ybWF0RXhjZXB0aW9uKCJOdW1iZXIgb2Ygb3BlbmVkIGFuZCBjbG9zZWQgcGFyZW50aGVzZXMgZG9lcyBub3QgbWF0Y2giKTsKKyAgICB9CisgICAgaWYgKGNvbnRleHQuT3BlbmVkU3RyaW5ncyAhPSBjb250ZXh0LkNsb3NlZFN0cmluZ3MpIHsKKyAgICAgIHRocm93IG5ldyBGb3JtYXRFeGNlcHRpb24oIlVudGVybWluYXRlZCBzdHJpbmciKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgRW5zdXJlUGFyZW50aGVzZXNBcmVXZWxsRm9ybWVkKFRva2VuIHRva2VuLCBBbmFseXppbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICBpZiAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMpIHsKKyAgICAgIGNvbnRleHQuTnVtYmVyT2ZPcGVuZWRQYXJlbnRoZXNlcysrOworICAgIH0gZWxzZSBpZiAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5DbG9zaW5nUGFyZW50aGVzaXMpIHsKKyAgICAgIGNvbnRleHQuTnVtYmVyT2ZDbG9zZWRQYXJlbnRoZXNlcysrOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBFbnN1cmVTdHJpbmdzQXJlV2VsbEZvcm1lZChUb2tlbiB0b2tlbiwgQW5hbHl6aW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgaWYgKCFjb250ZXh0LklzSW5TdHJpbmcgJiYgdG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcpIHsKKyAgICAgIGNvbnRleHQuSXNJblN0cmluZyA9IHRydWU7CisgICAgICBjb250ZXh0Lk9wZW5lZFN0cmluZ3MrKzsKKyAgICB9IGVsc2UgaWYgKGNvbnRleHQuSXNJblN0cmluZyAmJiB0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlN0cmluZykgeworICAgICAgY29udGV4dC5Jc0luU3RyaW5nID0gZmFsc2U7CisgICAgICBjb250ZXh0LkNsb3NlZFN0cmluZ3MrKzsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW4uY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuLmNzCmluZGV4IDFkZTliOTkuLmYzZmFhMGMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW4uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlbi5jcwpAQCAtMTMsNjMgKzEzLDQ5IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcwotewotICAgIHB1YmxpYyBjbGFzcyBUb2tlbgotICAgIHsKLSAgICAgICAgcHVibGljIFRva2VuKHN0cmluZyB0b2tlbiwgVG9rZW5UeXBlIHRva2VuVHlwZSkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSB0b2tlbjsKLSAgICAgICAgICAgIFRva2VuVHlwZSA9IHRva2VuVHlwZTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwogCi0gICAgICAgIHB1YmxpYyBzdHJpbmcgVmFsdWUgeyBnZXQ7IGludGVybmFsIHNldDsgfQorcHVibGljIGNsYXNzIFRva2VuIHsKKyAgcHVibGljIFRva2VuKHN0cmluZyB0b2tlbiwgVG9rZW5UeXBlIHRva2VuVHlwZSkgeworICAgIFZhbHVlID0gdG9rZW47CisgICAgVG9rZW5UeXBlID0gdG9rZW5UeXBlOworICB9CiAKLSAgICAgICAgcHVibGljIFRva2VuVHlwZSBUb2tlblR5cGUgeyBnZXQ7IGludGVybmFsIHNldDsgfQorICBwdWJsaWMgc3RyaW5nIFZhbHVlIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KIAotICAgICAgICBwdWJsaWMgdm9pZCBBcHBlbmQoc3RyaW5nIHN0cmluZ1RvQXBwZW5kKQotICAgICAgICB7Ci0gICAgICAgICAgICBWYWx1ZSArPSBzdHJpbmdUb0FwcGVuZDsKLSAgICAgICAgfQorICBwdWJsaWMgVG9rZW5UeXBlIFRva2VuVHlwZSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CiAKLSAgICAgICAgcHVibGljIGJvb2wgSXNOZWdhdGVkIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgTmVnYXRlKCkKLSAgICAgICAgeworICBwdWJsaWMgdm9pZCBBcHBlbmQoc3RyaW5nIHN0cmluZ1RvQXBwZW5kKSB7CisgICAgVmFsdWUgKz0gc3RyaW5nVG9BcHBlbmQ7CisgIH0KIAotICAgICAgICAgICAgaWYgKAotICAgICAgICAgICAgICAgIFRva2VuVHlwZSA9PSBUb2tlblR5cGUuRGVjaW1hbCAKLSAgICAgICAgICAgICAgICB8fCAKLSAgICAgICAgICAgICAgICBUb2tlblR5cGUgPT0gVG9rZW5UeXBlLkludGVnZXIKLSAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgIFRva2VuVHlwZSA9PSBUb2tlblR5cGUuRXhjZWxBZGRyZXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElzTmVnYXRlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUb2tlblR5cGUuVG9TdHJpbmcoKSArICIsICIgKyBWYWx1ZTsKLSAgICAgICAgfQorICBwdWJsaWMgYm9vbCBJc05lZ2F0ZWQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgcHVibGljIHZvaWQgTmVnYXRlKCkgeworICAgIGlmIChUb2tlblR5cGUgPT0gVG9rZW5UeXBlLkRlY2ltYWwKKyAgICAgICAgfHwgVG9rZW5UeXBlID09IFRva2VuVHlwZS5JbnRlZ2VyCisgICAgICAgIHx8IFRva2VuVHlwZSA9PSBUb2tlblR5cGUuRXhjZWxBZGRyZXNzKSB7CisgICAgICBJc05lZ2F0ZWQgPSB0cnVlOwogICAgIH0KKyAgfQorCisgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7CisgICAgcmV0dXJuIFRva2VuVHlwZSArICIsICIgKyBWYWx1ZTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlbkZhY3RvcnkuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuRmFjdG9yeS5jcwppbmRleCAzODE3ZGYyLi45NmM4N2EzIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuRmFjdG9yeS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuRmFjdG9yeS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTU1ICsxMywxMjkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKiBKYW4gS8OkbGxtYW4gICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZWQgQWRyZXNzIHZhbGlkYXRlICAgIDIwMTMtMDMtMDEKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CiB1c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWwuRnVuY3Rpb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwotdXNpbmcgT2ZmaWNlT3BlblhtbDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCi17Ci0gICAgcHVibGljIGNsYXNzIFRva2VuRmFjdG9yeSA6IElUb2tlbkZhY3RvcnkKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBUb2tlbkZhY3RvcnkoSUZ1bmN0aW9uTmFtZVByb3ZpZGVyIGZ1bmN0aW9uUmVwb3NpdG9yeSwgSU5hbWVWYWx1ZVByb3ZpZGVyIG5hbWVWYWx1ZVByb3ZpZGVyKQotICAgICAgICAgICAgOiB0aGlzKG5ldyBUb2tlblNlcGFyYXRvclByb3ZpZGVyKCksIG5hbWVWYWx1ZVByb3ZpZGVyLCBmdW5jdGlvblJlcG9zaXRvcnkpCi0gICAgICAgIHsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKIAotICAgICAgICB9CitwdWJsaWMgY2xhc3MgVG9rZW5GYWN0b3J5IDogSVRva2VuRmFjdG9yeSB7CisgIHB1YmxpYyBUb2tlbkZhY3RvcnkoCisgICAgICBJRnVuY3Rpb25OYW1lUHJvdmlkZXIgZnVuY3Rpb25SZXBvc2l0b3J5LAorICAgICAgSU5hbWVWYWx1ZVByb3ZpZGVyIG5hbWVWYWx1ZVByb3ZpZGVyKQorICAgICAgOiB0aGlzKG5ldyBUb2tlblNlcGFyYXRvclByb3ZpZGVyKCksIG5hbWVWYWx1ZVByb3ZpZGVyLCBmdW5jdGlvblJlcG9zaXRvcnkpIHt9CiAKLSAgICAgICAgcHVibGljIFRva2VuRmFjdG9yeShJVG9rZW5TZXBhcmF0b3JQcm92aWRlciB0b2tlblNlcGFyYXRvclByb3ZpZGVyLCBJTmFtZVZhbHVlUHJvdmlkZXIgbmFtZVZhbHVlUHJvdmlkZXIsIElGdW5jdGlvbk5hbWVQcm92aWRlciBmdW5jdGlvbk5hbWVQcm92aWRlcikKLSAgICAgICAgewotICAgICAgICAgICAgX3Rva2VuU2VwYXJhdG9yUHJvdmlkZXIgPSB0b2tlblNlcGFyYXRvclByb3ZpZGVyOwotICAgICAgICAgICAgX2Z1bmN0aW9uTmFtZVByb3ZpZGVyID0gZnVuY3Rpb25OYW1lUHJvdmlkZXI7Ci0gICAgICAgICAgICBfbmFtZVZhbHVlUHJvdmlkZXIgPSBuYW1lVmFsdWVQcm92aWRlcjsKLSAgICAgICAgfQorICBwdWJsaWMgVG9rZW5GYWN0b3J5KAorICAgICAgSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIgdG9rZW5TZXBhcmF0b3JQcm92aWRlciwKKyAgICAgIElOYW1lVmFsdWVQcm92aWRlciBuYW1lVmFsdWVQcm92aWRlciwKKyAgICAgIElGdW5jdGlvbk5hbWVQcm92aWRlciBmdW5jdGlvbk5hbWVQcm92aWRlcikgeworICAgIF90b2tlblNlcGFyYXRvclByb3ZpZGVyID0gdG9rZW5TZXBhcmF0b3JQcm92aWRlcjsKKyAgICBfZnVuY3Rpb25OYW1lUHJvdmlkZXIgPSBmdW5jdGlvbk5hbWVQcm92aWRlcjsKKyAgICBfbmFtZVZhbHVlUHJvdmlkZXIgPSBuYW1lVmFsdWVQcm92aWRlcjsKKyAgfQogCi0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIgX3Rva2VuU2VwYXJhdG9yUHJvdmlkZXI7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUZ1bmN0aW9uTmFtZVByb3ZpZGVyIF9mdW5jdGlvbk5hbWVQcm92aWRlcjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJTmFtZVZhbHVlUHJvdmlkZXIgX25hbWVWYWx1ZVByb3ZpZGVyOwotICAgICAgICBwdWJsaWMgVG9rZW4gQ3JlYXRlKElFbnVtZXJhYmxlPFRva2VuPiB0b2tlbnMsIHN0cmluZyB0b2tlbikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZSh0b2tlbnMsIHRva2VuLCBudWxsKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgVG9rZW4gQ3JlYXRlKElFbnVtZXJhYmxlPFRva2VuPiB0b2tlbnMsIHN0cmluZyB0b2tlbiwgc3RyaW5nIHdvcmtzaGVldCkKLSAgICAgICAgewotICAgICAgICAgICAgVG9rZW4gdG9rZW5TZXBhcmF0b3IgPSBudWxsOwotICAgICAgICAgICAgaWYgKF90b2tlblNlcGFyYXRvclByb3ZpZGVyLlRva2Vucy5UcnlHZXRWYWx1ZSh0b2tlbiwgb3V0IHRva2VuU2VwYXJhdG9yKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5TZXBhcmF0b3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgdG9rZW5MaXN0ID0gKElMaXN0PFRva2VuPil0b2tlbnM7Ci0gICAgICAgICAgICAvL0FkZHJlc3Mgd2l0aCB3b3Jrc2hlZXQtc3RyaW5nIGJlZm9yZSAgL0pLCi0gICAgICAgICAgICBpZiAodG9rZW4uU3RhcnRzV2l0aCgiISIpICYmIHRva2VuTGlzdFt0b2tlbkxpc3QuQ291bnQtMV0uVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGFkZHIgPSAiIjsKLSAgICAgICAgICAgICAgICB2YXIgaSA9IHRva2VuTGlzdC5Db3VudCAtIDI7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRva2VuTGlzdFtpXS5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlN0cmluZ0NvbnRlbnQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIgPSAiJyIgKyB0b2tlbkxpc3RbaV0uVmFsdWUuUmVwbGFjZSgiJyIsICInJyIpICsgIiciOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50RXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIkludmFsaWQgZm9ybXVsYSB0b2tlbiBzZXF1ZW5jZSBuZWFyIHswfSIsdG9rZW4pKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy9SZW1vdmUgdGhlIHN0cmluZyB0b2tlbnMgYW5kIGNvbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgdG9rZW5MaXN0LlJlbW92ZUF0KHRva2VuTGlzdC5Db3VudCAtIDEpOwotICAgICAgICAgICAgICAgICAgICB0b2tlbkxpc3QuUmVtb3ZlQXQodG9rZW5MaXN0LkNvdW50IC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIHRva2VuTGlzdC5SZW1vdmVBdCh0b2tlbkxpc3QuQ291bnQgLSAxKTsKKyAgcHJpdmF0ZSByZWFkb25seSBJVG9rZW5TZXBhcmF0b3JQcm92aWRlciBfdG9rZW5TZXBhcmF0b3JQcm92aWRlcjsKKyAgcHJpdmF0ZSByZWFkb25seSBJRnVuY3Rpb25OYW1lUHJvdmlkZXIgX2Z1bmN0aW9uTmFtZVByb3ZpZGVyOworICBwcml2YXRlIHJlYWRvbmx5IElOYW1lVmFsdWVQcm92aWRlciBfbmFtZVZhbHVlUHJvdmlkZXI7CiAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbihhZGRyICsgdG9rZW4sIFRva2VuVHlwZS5FeGNlbEFkZHJlc3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiSW52YWxpZCBmb3JtdWxhIHRva2VuIHNlcXVlbmNlIG5lYXIgezB9Iix0b2tlbikpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9CisgIHB1YmxpYyBUb2tlbiBDcmVhdGUoSUVudW1lcmFibGU8VG9rZW4+IHRva2Vucywgc3RyaW5nIHRva2VuKSB7CisgICAgcmV0dXJuIENyZWF0ZSh0b2tlbnMsIHRva2VuLCBudWxsKTsKKyAgfQogCi0gICAgICAgICAgICBpZiAodG9rZW5zLkFueSgpICYmIHRva2Vucy5MYXN0KCkuVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbih0b2tlbiwgVG9rZW5UeXBlLlN0cmluZ0NvbnRlbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh0b2tlbikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbi5UcmltKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoUmVnZXguSXNNYXRjaCh0b2tlbiwgUmVnZXhDb25zdGFudHMuRGVjaW1hbCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbih0b2tlbiwgVG9rZW5UeXBlLkRlY2ltYWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoUmVnZXguSXNNYXRjaCh0b2tlbiwgUmVnZXhDb25zdGFudHMuSW50ZWdlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbih0b2tlbiwgVG9rZW5UeXBlLkludGVnZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2godG9rZW4sIFJlZ2V4Q29uc3RhbnRzLkJvb2xlYW4sIFJlZ2V4T3B0aW9ucy5JZ25vcmVDYXNlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKHRva2VuLCBUb2tlblR5cGUuQm9vbGVhbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodG9rZW4uVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKS5Db250YWlucygiI1JFRiEiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKHRva2VuLCBUb2tlblR5cGUuSW52YWxpZFJlZmVyZW5jZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodG9rZW4uVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSA9PSAiI05VTSEiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4odG9rZW4sIFRva2VuVHlwZS5OdW1lcmljRXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRva2VuLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgPT0gIiNWQUxVRSEiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4odG9rZW4sIFRva2VuVHlwZS5WYWx1ZURhdGFUeXBlRXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRva2VuLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgPT0gIiNOVUxMISIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbih0b2tlbiwgVG9rZW5UeXBlLk51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKF9uYW1lVmFsdWVQcm92aWRlciAhPSBudWxsICYmIF9uYW1lVmFsdWVQcm92aWRlci5Jc05hbWVkVmFsdWUodG9rZW4sIHdvcmtzaGVldCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbih0b2tlbiwgVG9rZW5UeXBlLk5hbWVWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoX2Z1bmN0aW9uTmFtZVByb3ZpZGVyLklzRnVuY3Rpb25OYW1lKHRva2VuKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKHRva2VuLCBUb2tlblR5cGUuRnVuY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRva2VuTGlzdC5Db3VudCA+IDAgJiYgdG9rZW5MaXN0W3Rva2VuTGlzdC5Db3VudCAtIDFdLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ0VudW1lcmFibGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbih0b2tlbiwgVG9rZW5UeXBlLkVudW1lcmFibGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIGF0ID0gT2ZmaWNlT3BlblhtbC5FeGNlbEFkZHJlc3NCYXNlLklzVmFsaWQodG9rZW4pOwotICAgICAgICAgICAgaWYgKGF0PT1FeGNlbEFkZHJlc3NCYXNlLkFkZHJlc3NUeXBlLkludGVybmFsQWRkcmVzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKHRva2VuLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSksIFRva2VuVHlwZS5FeGNlbEFkZHJlc3MpOwotICAgICAgICAgICAgfSAKLSAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4odG9rZW4sIFRva2VuVHlwZS5VbnJlY29nbml6ZWQpOwotCi0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVG9rZW4gQ3JlYXRlKHN0cmluZyB0b2tlbiwgVG9rZW5UeXBlIGV4cGxpY2l0VG9rZW5UeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKHRva2VuLCBleHBsaWNpdFRva2VuVHlwZSk7Ci0gICAgICAgIH0KKyAgcHVibGljIFRva2VuIENyZWF0ZShJRW51bWVyYWJsZTxUb2tlbj4gdG9rZW5zLCBzdHJpbmcgdG9rZW4sIHN0cmluZyB3b3Jrc2hlZXQpIHsKKyAgICBUb2tlbiB0b2tlblNlcGFyYXRvciA9IG51bGw7CisgICAgaWYgKF90b2tlblNlcGFyYXRvclByb3ZpZGVyLlRva2Vucy5UcnlHZXRWYWx1ZSh0b2tlbiwgb3V0IHRva2VuU2VwYXJhdG9yKSkgeworICAgICAgcmV0dXJuIHRva2VuU2VwYXJhdG9yOwogICAgIH0KKyAgICB2YXIgdG9rZW5MaXN0ID0gKElMaXN0PFRva2VuPil0b2tlbnM7CisgICAgLy9BZGRyZXNzIHdpdGggd29ya3NoZWV0LXN0cmluZyBiZWZvcmUgIC9KSworICAgIGlmICh0b2tlbi5TdGFydHNXaXRoKCIhIikgJiYgdG9rZW5MaXN0W3Rva2VuTGlzdC5Db3VudCAtIDFdLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuU3RyaW5nKSB7CisgICAgICBzdHJpbmcgYWRkciA9ICIiOworICAgICAgdmFyIGkgPSB0b2tlbkxpc3QuQ291bnQgLSAyOworICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgIGlmICh0b2tlbkxpc3RbaV0uVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmdDb250ZW50KSB7CisgICAgICAgICAgYWRkciA9ICInIiArIHRva2VuTGlzdFtpXS5WYWx1ZS5SZXBsYWNlKCInIiwgIicnIikgKyAiJyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoIkludmFsaWQgZm9ybXVsYSB0b2tlbiBzZXF1ZW5jZSBuZWFyIHswfSIsIHRva2VuKSkpOworICAgICAgICB9CisgICAgICAgIC8vUmVtb3ZlIHRoZSBzdHJpbmcgdG9rZW5zIGFuZCBjb250ZW50CisgICAgICAgIHRva2VuTGlzdC5SZW1vdmVBdCh0b2tlbkxpc3QuQ291bnQgLSAxKTsKKyAgICAgICAgdG9rZW5MaXN0LlJlbW92ZUF0KHRva2VuTGlzdC5Db3VudCAtIDEpOworICAgICAgICB0b2tlbkxpc3QuUmVtb3ZlQXQodG9rZW5MaXN0LkNvdW50IC0gMSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyhhZGRyICsgdG9rZW4sIFRva2VuVHlwZS5FeGNlbEFkZHJlc3MpOworICAgICAgfQorICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgiSW52YWxpZCBmb3JtdWxhIHRva2VuIHNlcXVlbmNlIG5lYXIgezB9IiwgdG9rZW4pKSk7CisgICAgfQorCisgICAgaWYgKHRva2Vucy5BbnkoKSAmJiB0b2tlbnMuTGFzdCgpLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuU3RyaW5nKSB7CisgICAgICByZXR1cm4gbmV3KHRva2VuLCBUb2tlblR5cGUuU3RyaW5nQ29udGVudCk7CisgICAgfQorICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkodG9rZW4pKSB7CisgICAgICB0b2tlbiA9IHRva2VuLlRyaW0oKTsKKyAgICB9CisgICAgaWYgKFJlZ2V4LklzTWF0Y2godG9rZW4sIFJlZ2V4Q29uc3RhbnRzLkRlY2ltYWwpKSB7CisgICAgICByZXR1cm4gbmV3KHRva2VuLCBUb2tlblR5cGUuRGVjaW1hbCk7CisgICAgfQorICAgIGlmIChSZWdleC5Jc01hdGNoKHRva2VuLCBSZWdleENvbnN0YW50cy5JbnRlZ2VyKSkgeworICAgICAgcmV0dXJuIG5ldyh0b2tlbiwgVG9rZW5UeXBlLkludGVnZXIpOworICAgIH0KKyAgICBpZiAoUmVnZXguSXNNYXRjaCh0b2tlbiwgUmVnZXhDb25zdGFudHMuQm9vbGVhbiwgUmVnZXhPcHRpb25zLklnbm9yZUNhc2UpKSB7CisgICAgICByZXR1cm4gbmV3KHRva2VuLCBUb2tlblR5cGUuQm9vbGVhbik7CisgICAgfQorICAgIGlmICh0b2tlbi5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLkNvbnRhaW5zKCIjUkVGISIpKSB7CisgICAgICByZXR1cm4gbmV3KHRva2VuLCBUb2tlblR5cGUuSW52YWxpZFJlZmVyZW5jZSk7CisgICAgfQorICAgIGlmICh0b2tlbi5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpID09ICIjTlVNISIpIHsKKyAgICAgIHJldHVybiBuZXcodG9rZW4sIFRva2VuVHlwZS5OdW1lcmljRXJyb3IpOworICAgIH0KKyAgICBpZiAodG9rZW4uVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSA9PSAiI1ZBTFVFISIpIHsKKyAgICAgIHJldHVybiBuZXcodG9rZW4sIFRva2VuVHlwZS5WYWx1ZURhdGFUeXBlRXJyb3IpOworICAgIH0KKyAgICBpZiAodG9rZW4uVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSA9PSAiI05VTEwhIikgeworICAgICAgcmV0dXJuIG5ldyh0b2tlbiwgVG9rZW5UeXBlLk51bGwpOworICAgIH0KKyAgICBpZiAoX25hbWVWYWx1ZVByb3ZpZGVyICE9IG51bGwgJiYgX25hbWVWYWx1ZVByb3ZpZGVyLklzTmFtZWRWYWx1ZSh0b2tlbiwgd29ya3NoZWV0KSkgeworICAgICAgcmV0dXJuIG5ldyh0b2tlbiwgVG9rZW5UeXBlLk5hbWVWYWx1ZSk7CisgICAgfQorICAgIGlmIChfZnVuY3Rpb25OYW1lUHJvdmlkZXIuSXNGdW5jdGlvbk5hbWUodG9rZW4pKSB7CisgICAgICByZXR1cm4gbmV3KHRva2VuLCBUb2tlblR5cGUuRnVuY3Rpb24pOworICAgIH0KKyAgICBpZiAodG9rZW5MaXN0LkNvdW50ID4gMAorICAgICAgICAmJiB0b2tlbkxpc3RbdG9rZW5MaXN0LkNvdW50IC0gMV0uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nRW51bWVyYWJsZSkgeworICAgICAgcmV0dXJuIG5ldyh0b2tlbiwgVG9rZW5UeXBlLkVudW1lcmFibGUpOworICAgIH0KKyAgICB2YXIgYXQgPSBFeGNlbEFkZHJlc3NCYXNlLklzVmFsaWQodG9rZW4pOworICAgIGlmIChhdCA9PSBFeGNlbEFkZHJlc3NCYXNlLkFkZHJlc3NUeXBlLkludGVybmFsQWRkcmVzcykgeworICAgICAgcmV0dXJuIG5ldyh0b2tlbi5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLCBUb2tlblR5cGUuRXhjZWxBZGRyZXNzKTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyh0b2tlbiwgVG9rZW5UeXBlLlVucmVjb2duaXplZCk7CisgIH0KKworICBwdWJsaWMgVG9rZW4gQ3JlYXRlKHN0cmluZyB0b2tlbiwgVG9rZW5UeXBlIGV4cGxpY2l0VG9rZW5UeXBlKSB7CisgICAgcmV0dXJuIG5ldyh0b2tlbiwgZXhwbGljaXRUb2tlblR5cGUpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuSGFuZGxlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5IYW5kbGVyLmNzCmluZGV4IDhlODYxNjkuLjhjMmEyNzEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5IYW5kbGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5IYW5kbGVyLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxNDYgKzEzLDEyMCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDE1LTEyLTI4CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzLlRva2VuU2VwYXJhdG9ySGFuZGxlcnM7CiB1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcy5Ub2tlblNlcGFyYXRvckhhbmRsZXJzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMKLXsKLSAgICBwdWJsaWMgY2xhc3MgVG9rZW5IYW5kbGVyIDogSVRva2VuSW5kZXhQcm92aWRlcgotICAgIHsKLSAgICAgICAgcHVibGljIFRva2VuSGFuZGxlcihUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsIElUb2tlbkZhY3RvcnkgdG9rZW5GYWN0b3J5LCBJVG9rZW5TZXBhcmF0b3JQcm92aWRlciB0b2tlblByb3ZpZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBfY29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgICAgICBfdG9rZW5GYWN0b3J5ID0gdG9rZW5GYWN0b3J5OwotICAgICAgICAgICAgX3Rva2VuUHJvdmlkZXIgPSB0b2tlblByb3ZpZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUb2tlbml6ZXJDb250ZXh0IF9jb250ZXh0OwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElUb2tlblNlcGFyYXRvclByb3ZpZGVyIF90b2tlblByb3ZpZGVyOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElUb2tlbkZhY3RvcnkgX3Rva2VuRmFjdG9yeTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgX3Rva2VuSW5kZXggPSAtMTsKLQotICAgICAgICBwdWJsaWMgc3RyaW5nIFdvcmtzaGVldCB7IGdldDsgc2V0OyB9Ci0KLSAgICAgICAgcHVibGljIGJvb2wgSGFzTW9yZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfdG9rZW5JbmRleCA8IChfY29udGV4dC5Gb3JtdWxhQ2hhcnMuTGVuZ3RoIC0gMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBOZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgX3Rva2VuSW5kZXgrKzsKLSAgICAgICAgICAgIEhhbmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEhhbmRsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjID0gX2NvbnRleHQuRm9ybXVsYUNoYXJzW190b2tlbkluZGV4XTsKLSAgICAgICAgICAgIFRva2VuIHRva2VuU2VwYXJhdG9yOwotICAgICAgICAgICAgaWYgKENoYXJJc1Rva2VuU2VwYXJhdG9yKGMsIG91dCB0b2tlblNlcGFyYXRvcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKFRva2VuU2VwYXJhdG9ySGFuZGxlci5IYW5kbGUoYywgdG9rZW5TZXBhcmF0b3IsIF9jb250ZXh0LCB0aGlzKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKF9jb250ZXh0LkN1cnJlbnRUb2tlbkhhc1ZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2goX2NvbnRleHQuQ3VycmVudFRva2VuLCAiXlwiKiQiKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQuQWRkVG9rZW4oX3Rva2VuRmFjdG9yeS5DcmVhdGUoX2NvbnRleHQuQ3VycmVudFRva2VuLCBUb2tlblR5cGUuU3RyaW5nQ29udGVudCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQuQWRkVG9rZW4oQ3JlYXRlVG9rZW4oX2NvbnRleHQsIFdvcmtzaGVldCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBhIG5leHQgdG9rZW4gaXMgYW4gb3BlbmluZyBwYXJhbnRoZXNlcyBhbmQgdGhlIHByZXZpb3VzIHRva2VuIGlzIGludGVycGV0ZWQgYXMgYW4gYWRkcmVzcyBvciBuYW1lLCB0aGVuIHRoZSBjdXJyZW5jdCB0b2tlbiBpcyBhIGZ1bmN0aW9uCi0gICAgICAgICAgICAgICAgICAgIGlmICh0b2tlblNlcGFyYXRvci5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcyAmJiAoX2NvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuRXhjZWxBZGRyZXNzIHx8IF9jb250ZXh0Lkxhc3RUb2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk5hbWVWYWx1ZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lkxhc3RUb2tlbi5Ub2tlblR5cGUgPSBUb2tlblR5cGUuRnVuY3Rpb247Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRva2VuU2VwYXJhdG9yLlZhbHVlID09ICItIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChUb2tlbklzTmVnYXRvcihfY29udGV4dCkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0LkFkZFRva2VuKG5ldyBUb2tlbigiLSIsIFRva2VuVHlwZS5OZWdhdG9yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgX2NvbnRleHQuQWRkVG9rZW4odG9rZW5TZXBhcmF0b3IpOwotICAgICAgICAgICAgICAgIF9jb250ZXh0Lk5ld1Rva2VuKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2NvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2wgQ2hhcklzVG9rZW5TZXBhcmF0b3IoY2hhciBjLCBvdXQgVG9rZW4gdG9rZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXN1bHQgPSBfdG9rZW5Qcm92aWRlci5Ub2tlbnMuQ29udGFpbnNLZXkoYy5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIHRva2VuID0gcmVzdWx0ID8gdG9rZW4gPSBfdG9rZW5Qcm92aWRlci5Ub2tlbnNbYy5Ub1N0cmluZygpXSA6IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgCi0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBUb2tlbklzTmVnYXRvcihUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUb2tlbklzTmVnYXRvcihjb250ZXh0Lkxhc3RUb2tlbik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBUb2tlbklzTmVnYXRvcihUb2tlbiB0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgdC5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZXJhdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgdC5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcwotICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHQuVG9rZW5UeXBlID09IFRva2VuVHlwZS5Db21tYQotICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHQuVG9rZW5UeXBlID09IFRva2VuVHlwZS5TZW1pQ29sb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ0VudW1lcmFibGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFRva2VuIENyZWF0ZVRva2VuKFRva2VuaXplckNvbnRleHQgY29udGV4dCwgc3RyaW5nIHdvcmtzaGVldCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbnRleHQuQ3VycmVudFRva2VuID09ICItIikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5MYXN0VG9rZW4gPT0gbnVsbCAmJiBjb250ZXh0Lkxhc3RUb2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZXJhdG9yKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlbigiLSIsIFRva2VuVHlwZS5OZWdhdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX3Rva2VuRmFjdG9yeS5DcmVhdGUoY29udGV4dC5SZXN1bHQsIGNvbnRleHQuQ3VycmVudFRva2VuLCB3b3Jrc2hlZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IElUb2tlbkluZGV4UHJvdmlkZXIuSW5kZXgKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF90b2tlbkluZGV4OyB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHZvaWQgSVRva2VuSW5kZXhQcm92aWRlci5Nb3ZlSW5kZXhQb2ludGVyRm9yd2FyZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF90b2tlbkluZGV4Kys7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcyB7CisgIHB1YmxpYyBjbGFzcyBUb2tlbkhhbmRsZXIgOiBJVG9rZW5JbmRleFByb3ZpZGVyIHsKKyAgICBwdWJsaWMgVG9rZW5IYW5kbGVyKAorICAgICAgICBUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIElUb2tlbkZhY3RvcnkgdG9rZW5GYWN0b3J5LAorICAgICAgICBJVG9rZW5TZXBhcmF0b3JQcm92aWRlciB0b2tlblByb3ZpZGVyKSB7CisgICAgICBfY29udGV4dCA9IGNvbnRleHQ7CisgICAgICBfdG9rZW5GYWN0b3J5ID0gdG9rZW5GYWN0b3J5OworICAgICAgX3Rva2VuUHJvdmlkZXIgPSB0b2tlblByb3ZpZGVyOwogICAgIH0KKworICAgIHByaXZhdGUgcmVhZG9ubHkgVG9rZW5pemVyQ29udGV4dCBfY29udGV4dDsKKyAgICBwcml2YXRlIHJlYWRvbmx5IElUb2tlblNlcGFyYXRvclByb3ZpZGVyIF90b2tlblByb3ZpZGVyOworICAgIHByaXZhdGUgcmVhZG9ubHkgSVRva2VuRmFjdG9yeSBfdG9rZW5GYWN0b3J5OworICAgIHByaXZhdGUgaW50IF90b2tlbkluZGV4ID0gLTE7CisKKyAgICBwdWJsaWMgc3RyaW5nIFdvcmtzaGVldCB7IGdldDsgc2V0OyB9CisKKyAgICBwdWJsaWMgYm9vbCBIYXNNb3JlKCkgeworICAgICAgcmV0dXJuIF90b2tlbkluZGV4IDwgKF9jb250ZXh0LkZvcm11bGFDaGFycy5MZW5ndGggLSAxKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBOZXh0KCkgeworICAgICAgX3Rva2VuSW5kZXgrKzsKKyAgICAgIEhhbmRsZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBIYW5kbGUoKSB7CisgICAgICB2YXIgYyA9IF9jb250ZXh0LkZvcm11bGFDaGFyc1tfdG9rZW5JbmRleF07CisgICAgICBUb2tlbiB0b2tlblNlcGFyYXRvcjsKKyAgICAgIGlmIChDaGFySXNUb2tlblNlcGFyYXRvcihjLCBvdXQgdG9rZW5TZXBhcmF0b3IpKSB7CisgICAgICAgIGlmIChUb2tlblNlcGFyYXRvckhhbmRsZXIuSGFuZGxlKGMsIHRva2VuU2VwYXJhdG9yLCBfY29udGV4dCwgdGhpcykpIHsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoX2NvbnRleHQuQ3VycmVudFRva2VuSGFzVmFsdWUpIHsKKyAgICAgICAgICBpZiAoUmVnZXguSXNNYXRjaChfY29udGV4dC5DdXJyZW50VG9rZW4sICJeXCIqJCIpKSB7CisgICAgICAgICAgICBfY29udGV4dC5BZGRUb2tlbihfdG9rZW5GYWN0b3J5LkNyZWF0ZShfY29udGV4dC5DdXJyZW50VG9rZW4sIFRva2VuVHlwZS5TdHJpbmdDb250ZW50KSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9jb250ZXh0LkFkZFRva2VuKENyZWF0ZVRva2VuKF9jb250ZXh0LCBXb3Jrc2hlZXQpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvL0lmIHRoZSBhIG5leHQgdG9rZW4gaXMgYW4gb3BlbmluZyBwYXJhbnRoZXNlcyBhbmQgdGhlIHByZXZpb3VzIHRva2VuIGlzIGludGVycGV0ZWQgYXMgYW4gYWRkcmVzcyBvciBuYW1lLCB0aGVuIHRoZSBjdXJyZW5jdCB0b2tlbiBpcyBhIGZ1bmN0aW9uCisgICAgICAgICAgaWYgKHRva2VuU2VwYXJhdG9yLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ1BhcmVudGhlc2lzCisgICAgICAgICAgICAgICYmIChfY29udGV4dC5MYXN0VG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5FeGNlbEFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgICB8fCBfY29udGV4dC5MYXN0VG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5OYW1lVmFsdWUpKSB7CisgICAgICAgICAgICBfY29udGV4dC5MYXN0VG9rZW4uVG9rZW5UeXBlID0gVG9rZW5UeXBlLkZ1bmN0aW9uOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVmFsdWUgPT0gIi0iKSB7CisgICAgICAgICAgaWYgKFRva2VuSXNOZWdhdG9yKF9jb250ZXh0KSkgeworICAgICAgICAgICAgX2NvbnRleHQuQWRkVG9rZW4obmV3IFRva2VuKCItIiwgVG9rZW5UeXBlLk5lZ2F0b3IpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX2NvbnRleHQuQWRkVG9rZW4odG9rZW5TZXBhcmF0b3IpOworICAgICAgICBfY29udGV4dC5OZXdUb2tlbigpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBfY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2wgQ2hhcklzVG9rZW5TZXBhcmF0b3IoY2hhciBjLCBvdXQgVG9rZW4gdG9rZW4pIHsKKyAgICAgIHZhciByZXN1bHQgPSBfdG9rZW5Qcm92aWRlci5Ub2tlbnMuQ29udGFpbnNLZXkoYy5Ub1N0cmluZygpKTsKKyAgICAgIHRva2VuID0gcmVzdWx0ID8gdG9rZW4gPSBfdG9rZW5Qcm92aWRlci5Ub2tlbnNbYy5Ub1N0cmluZygpXSA6IG51bGw7CisgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2wgVG9rZW5Jc05lZ2F0b3IoVG9rZW5pemVyQ29udGV4dCBjb250ZXh0KSB7CisgICAgICByZXR1cm4gVG9rZW5Jc05lZ2F0b3IoY29udGV4dC5MYXN0VG9rZW4pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2wgVG9rZW5Jc05lZ2F0b3IoVG9rZW4gdCkgeworICAgICAgcmV0dXJuIHQgPT0gbnVsbAorICAgICAgICAgIHx8IHQuVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVyYXRvcgorICAgICAgICAgIHx8IHQuVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nUGFyZW50aGVzaXMKKyAgICAgICAgICB8fCB0LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuQ29tbWEKKyAgICAgICAgICB8fCB0LlRva2VuVHlwZSA9PSBUb2tlblR5cGUuU2VtaUNvbG9uCisgICAgICAgICAgfHwgdC5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZW5pbmdFbnVtZXJhYmxlOworICAgIH0KKworICAgIHByaXZhdGUgVG9rZW4gQ3JlYXRlVG9rZW4oVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LCBzdHJpbmcgd29ya3NoZWV0KSB7CisgICAgICBpZiAoY29udGV4dC5DdXJyZW50VG9rZW4gPT0gIi0iKSB7CisgICAgICAgIGlmIChjb250ZXh0Lkxhc3RUb2tlbiA9PSBudWxsICYmIGNvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlcmF0b3IpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IFRva2VuKCItIiwgVG9rZW5UeXBlLk5lZ2F0b3IpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gX3Rva2VuRmFjdG9yeS5DcmVhdGUoY29udGV4dC5SZXN1bHQsIGNvbnRleHQuQ3VycmVudFRva2VuLCB3b3Jrc2hlZXQpOworICAgIH0KKworICAgIGludCBJVG9rZW5JbmRleFByb3ZpZGVyLkluZGV4IHsKKyAgICAgIGdldCB7IHJldHVybiBfdG9rZW5JbmRleDsgfQorICAgIH0KKworICAgIHZvaWQgSVRva2VuSW5kZXhQcm92aWRlci5Nb3ZlSW5kZXhQb2ludGVyRm9yd2FyZCgpIHsKKyAgICAgIF90b2tlbkluZGV4Kys7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9ySGFuZGxlcnMvQnJhY2tldEhhbmRsZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9ySGFuZGxlcnMvQnJhY2tldEhhbmRsZXIuY3MKaW5kZXggMThhY2ViMS4uZWE0MjM2YSAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL0JyYWNrZXRIYW5kbGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JIYW5kbGVycy9CcmFja2V0SGFuZGxlci5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTcgKzEzLDE3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTUtMTItMjgKQEAgLTMzLDMwICszMywyOCBAQAogdXNpbmcgU3lzdGVtLkxpbnE7CiB1c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzLlRva2VuU2VwYXJhdG9ySGFuZGxlcnMKLXsKLSAgICBwdWJsaWMgY2xhc3MgQnJhY2tldEhhbmRsZXIgOiBTZXBhcmF0b3JIYW5kbGVyCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBIYW5kbGUoY2hhciBjLCBUb2tlbiB0b2tlblNlcGFyYXRvciwgVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LCBJVG9rZW5JbmRleFByb3ZpZGVyIHRva2VuSW5kZXhQcm92aWRlcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRva2VuU2VwYXJhdG9yLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ0JyYWNrZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LkJyYWNrZXRDb3VudCsrOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRva2VuU2VwYXJhdG9yLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuQ2xvc2luZ0JyYWNrZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LkJyYWNrZXRDb3VudC0tOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbnRleHQuQnJhY2tldENvdW50ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb250ZXh0LkFwcGVuZFRvQ3VycmVudFRva2VuKGMpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMuVG9rZW5TZXBhcmF0b3JIYW5kbGVycyB7CisgIHB1YmxpYyBjbGFzcyBCcmFja2V0SGFuZGxlciA6IFNlcGFyYXRvckhhbmRsZXIgeworICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEhhbmRsZSgKKyAgICAgICAgY2hhciBjLAorICAgICAgICBUb2tlbiB0b2tlblNlcGFyYXRvciwKKyAgICAgICAgVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LAorICAgICAgICBJVG9rZW5JbmRleFByb3ZpZGVyIHRva2VuSW5kZXhQcm92aWRlcikgeworICAgICAgaWYgKHRva2VuU2VwYXJhdG9yLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuT3BlbmluZ0JyYWNrZXQpIHsKKyAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKKyAgICAgICAgY29udGV4dC5CcmFja2V0Q291bnQrKzsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5DbG9zaW5nQnJhY2tldCkgeworICAgICAgICBjb250ZXh0LkFwcGVuZFRvQ3VycmVudFRva2VuKGMpOworICAgICAgICBjb250ZXh0LkJyYWNrZXRDb3VudC0tOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmIChjb250ZXh0LkJyYWNrZXRDb3VudCA+IDApIHsKKyAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9ySGFuZGxlcnMvTXVsdGlwbGVDaGFyU2VwYXJhdG9ySGFuZGxlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JIYW5kbGVycy9NdWx0aXBsZUNoYXJTZXBhcmF0b3JIYW5kbGVyLmNzCmluZGV4IDgyZWUwODEuLmRjMDIzNjkgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JIYW5kbGVycy9NdWx0aXBsZUNoYXJTZXBhcmF0b3JIYW5kbGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JIYW5kbGVycy9NdWx0aXBsZUNoYXJTZXBhcmF0b3JIYW5kbGVyLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxNyArMTMsMTcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxNS0xMi0yOApAQCAtMzQsNDEgKzM0LDM5IEBACiB1c2luZyBTeXN0ZW0uTGlucTsKIHVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMuVG9rZW5TZXBhcmF0b3JIYW5kbGVycwotewotICAgIHB1YmxpYyBjbGFzcyBNdWx0aXBsZUNoYXJTZXBhcmF0b3JIYW5kbGVyIDogU2VwYXJhdG9ySGFuZGxlcgotICAgIHsKLSAgICAgICAgSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIgX3Rva2VuU2VwYXJhdG9yUHJvdmlkZXI7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMuVG9rZW5TZXBhcmF0b3JIYW5kbGVycyB7CisgIHB1YmxpYyBjbGFzcyBNdWx0aXBsZUNoYXJTZXBhcmF0b3JIYW5kbGVyIDogU2VwYXJhdG9ySGFuZGxlciB7CisgICAgSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIgX3Rva2VuU2VwYXJhdG9yUHJvdmlkZXI7CiAKLSAgICAgICAgcHVibGljIE11bHRpcGxlQ2hhclNlcGFyYXRvckhhbmRsZXIoKQotICAgICAgICAgICAgOiB0aGlzKG5ldyBUb2tlblNlcGFyYXRvclByb3ZpZGVyKCkpCi0gICAgICAgIHsKKyAgICBwdWJsaWMgTXVsdGlwbGVDaGFyU2VwYXJhdG9ySGFuZGxlcigpCisgICAgICAgIDogdGhpcyhuZXcgVG9rZW5TZXBhcmF0b3JQcm92aWRlcigpKSB7fQogCi0gICAgICAgIH0KLSAgICAgICAgcHVibGljIE11bHRpcGxlQ2hhclNlcGFyYXRvckhhbmRsZXIoSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIgdG9rZW5TZXBhcmF0b3JQcm92aWRlcikKLSAgICAgICAgewotICAgICAgICAgICAgX3Rva2VuU2VwYXJhdG9yUHJvdmlkZXIgPSB0b2tlblNlcGFyYXRvclByb3ZpZGVyOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEhhbmRsZShjaGFyIGMsIFRva2VuIHRva2VuU2VwYXJhdG9yLCBUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsIElUb2tlbkluZGV4UHJvdmlkZXIgdG9rZW5JbmRleFByb3ZpZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyB0d28gb3BlcmF0b3JzIGluIHNlcXVlbmNlIGNvdWxkIGJlICI8PSIgb3IgIj49IgotICAgICAgICAgICAgaWYgKElzUGFydE9mTXVsdGlwbGVDaGFyU2VwYXJhdG9yKGNvbnRleHQsIGMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzT3AgPSBjb250ZXh0Lkxhc3RUb2tlbi5WYWx1ZSArIGMuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICAgICAgdmFyIG9wID0gX3Rva2VuU2VwYXJhdG9yUHJvdmlkZXIuVG9rZW5zW3NPcF07Ci0gICAgICAgICAgICAgICAgY29udGV4dC5SZXBsYWNlTGFzdFRva2VuKG9wKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0Lk5ld1Rva2VuKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2wgSXNQYXJ0T2ZNdWx0aXBsZUNoYXJTZXBhcmF0b3IoVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LCBjaGFyIGMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBsYXN0VG9rZW4gPSBjb250ZXh0Lkxhc3RUb2tlbiAhPSBudWxsID8gY29udGV4dC5MYXN0VG9rZW4uVmFsdWUgOiBzdHJpbmcuRW1wdHk7Ci0gICAgICAgICAgICByZXR1cm4gX3Rva2VuU2VwYXJhdG9yUHJvdmlkZXIuSXNPcGVyYXRvcihsYXN0VG9rZW4pCi0gICAgICAgICAgICAgICAgJiYgX3Rva2VuU2VwYXJhdG9yUHJvdmlkZXIuSXNQb3NzaWJsZUxhc3RQYXJ0T2ZNdWx0aXBsZUNoYXJPcGVyYXRvcihjLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKQotICAgICAgICAgICAgICAgICYmICFjb250ZXh0LkN1cnJlbnRUb2tlbkhhc1ZhbHVlOwotICAgICAgICB9CisgICAgcHVibGljIE11bHRpcGxlQ2hhclNlcGFyYXRvckhhbmRsZXIoSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIgdG9rZW5TZXBhcmF0b3JQcm92aWRlcikgeworICAgICAgX3Rva2VuU2VwYXJhdG9yUHJvdmlkZXIgPSB0b2tlblNlcGFyYXRvclByb3ZpZGVyOwogICAgIH0KKworICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEhhbmRsZSgKKyAgICAgICAgY2hhciBjLAorICAgICAgICBUb2tlbiB0b2tlblNlcGFyYXRvciwKKyAgICAgICAgVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LAorICAgICAgICBJVG9rZW5JbmRleFByb3ZpZGVyIHRva2VuSW5kZXhQcm92aWRlcikgeworICAgICAgLy8gdHdvIG9wZXJhdG9ycyBpbiBzZXF1ZW5jZSBjb3VsZCBiZSAiPD0iIG9yICI+PSIKKyAgICAgIGlmIChJc1BhcnRPZk11bHRpcGxlQ2hhclNlcGFyYXRvcihjb250ZXh0LCBjKSkgeworICAgICAgICB2YXIgc09wID0gY29udGV4dC5MYXN0VG9rZW4uVmFsdWUgKyBjLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICB2YXIgb3AgPSBfdG9rZW5TZXBhcmF0b3JQcm92aWRlci5Ub2tlbnNbc09wXTsKKyAgICAgICAgY29udGV4dC5SZXBsYWNlTGFzdFRva2VuKG9wKTsKKyAgICAgICAgY29udGV4dC5OZXdUb2tlbigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2wgSXNQYXJ0T2ZNdWx0aXBsZUNoYXJTZXBhcmF0b3IoVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LCBjaGFyIGMpIHsKKyAgICAgIHZhciBsYXN0VG9rZW4gPSBjb250ZXh0Lkxhc3RUb2tlbiAhPSBudWxsID8gY29udGV4dC5MYXN0VG9rZW4uVmFsdWUgOiBzdHJpbmcuRW1wdHk7CisgICAgICByZXR1cm4gX3Rva2VuU2VwYXJhdG9yUHJvdmlkZXIuSXNPcGVyYXRvcihsYXN0VG9rZW4pCisgICAgICAgICAgJiYgX3Rva2VuU2VwYXJhdG9yUHJvdmlkZXIuSXNQb3NzaWJsZUxhc3RQYXJ0T2ZNdWx0aXBsZUNoYXJPcGVyYXRvcigKKyAgICAgICAgICAgICAgYy5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkKKyAgICAgICAgICAmJiAhY29udGV4dC5DdXJyZW50VG9rZW5IYXNWYWx1ZTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JIYW5kbGVycy9TZXBhcmF0b3JIYW5kbGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL1NlcGFyYXRvckhhbmRsZXIuY3MKaW5kZXggYjI3NWIyYi4uNzAyYTEyZCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL1NlcGFyYXRvckhhbmRsZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL1NlcGFyYXRvckhhbmRsZXIuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDE3ICsxMywxNyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDE1LTEyLTI4CkBAIC0zMywxNiArMzMsMjEgQEAKIHVzaW5nIFN5c3RlbS5MaW5xOwogdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcy5Ub2tlblNlcGFyYXRvckhhbmRsZXJzCi17Ci0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcGFyYXRvckhhbmRsZXIKLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBib29sIElzRG91YmxlUXVvdGUoVG9rZW4gdG9rZW5TZXBhcmF0b3IsIGludCBmb3JtdWxhQ2hhckluZGV4LCBUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0b2tlblNlcGFyYXRvci5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlN0cmluZyAmJiBmb3JtdWxhQ2hhckluZGV4ICsgMSA8IGNvbnRleHQuRm9ybXVsYUNoYXJzLkxlbmd0aCAmJiBjb250ZXh0LkZvcm11bGFDaGFyc1tmb3JtdWxhQ2hhckluZGV4ICsgMV0gPT0gJ1wiJzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sIEhhbmRsZShjaGFyIGMsIFRva2VuIHRva2VuU2VwYXJhdG9yLCBUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsIElUb2tlbkluZGV4UHJvdmlkZXIgdG9rZW5JbmRleFByb3ZpZGVyKTsKLQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzLlRva2VuU2VwYXJhdG9ySGFuZGxlcnMgeworICBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VwYXJhdG9ySGFuZGxlciB7CisgICAgcHJvdGVjdGVkIGJvb2wgSXNEb3VibGVRdW90ZSgKKyAgICAgICAgVG9rZW4gdG9rZW5TZXBhcmF0b3IsCisgICAgICAgIGludCBmb3JtdWxhQ2hhckluZGV4LAorICAgICAgICBUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgIHJldHVybiB0b2tlblNlcGFyYXRvci5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlN0cmluZworICAgICAgICAgICYmIGZvcm11bGFDaGFySW5kZXggKyAxIDwgY29udGV4dC5Gb3JtdWxhQ2hhcnMuTGVuZ3RoCisgICAgICAgICAgJiYgY29udGV4dC5Gb3JtdWxhQ2hhcnNbZm9ybXVsYUNoYXJJbmRleCArIDFdID09ICdcIic7CiAgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IGJvb2wgSGFuZGxlKAorICAgICAgICBjaGFyIGMsCisgICAgICAgIFRva2VuIHRva2VuU2VwYXJhdG9yLAorICAgICAgICBUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIElUb2tlbkluZGV4UHJvdmlkZXIgdG9rZW5JbmRleFByb3ZpZGVyKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL1NoZWV0bmFtZUhhbmRsZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9ySGFuZGxlcnMvU2hlZXRuYW1lSGFuZGxlci5jcwppbmRleCAyMTQ3ZjhlLi5mNDM1ZmIzIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9ySGFuZGxlcnMvU2hlZXRuYW1lSGFuZGxlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9ySGFuZGxlcnMvU2hlZXRuYW1lSGFuZGxlci5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTcgKzEzLDE3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTUtMTItMjgKQEAgLTMzLDQxICszMywzOCBAQAogdXNpbmcgU3lzdGVtLkxpbnE7CiB1c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzLlRva2VuU2VwYXJhdG9ySGFuZGxlcnMKLXsKLSAgICBwdWJsaWMgY2xhc3MgU2hlZXRuYW1lSGFuZGxlciA6IFNlcGFyYXRvckhhbmRsZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEhhbmRsZShjaGFyIGMsIFRva2VuIHRva2VuU2VwYXJhdG9yLCBUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsIElUb2tlbkluZGV4UHJvdmlkZXIgdG9rZW5JbmRleFByb3ZpZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dC5Jc0luU2hlZXROYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChJc0RvdWJsZVF1b3RlKHRva2VuU2VwYXJhdG9yLCB0b2tlbkluZGV4UHJvdmlkZXIuSW5kZXgsIGNvbnRleHQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdG9rZW5JbmRleFByb3ZpZGVyLk1vdmVJbmRleFBvaW50ZXJGb3J3YXJkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlICE9IFRva2VuVHlwZS5Xb3Jrc2hlZXROYW1lKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5Xb3Jrc2hlZXROYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lkxhc3RUb2tlbiAhPSBudWxsICYmIGNvbnRleHQuTGFzdFRva2VuLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuV29ya3NoZWV0TmFtZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQWRkVG9rZW4oIWNvbnRleHQuQ3VycmVudFRva2VuSGFzVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFRva2VuKHN0cmluZy5FbXB0eSwgVG9rZW5UeXBlLldvcmtzaGVldE5hbWVDb250ZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgVG9rZW4oY29udGV4dC5DdXJyZW50VG9rZW4sIFRva2VuVHlwZS5Xb3Jrc2hlZXROYW1lQ29udGVudCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKG5ldyBUb2tlbigiJyIsIFRva2VuVHlwZS5Xb3Jrc2hlZXROYW1lKSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5Ub2dnbGVJc0luU2hlZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgY29udGV4dC5OZXdUb2tlbigpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzLlRva2VuU2VwYXJhdG9ySGFuZGxlcnMgeworICBwdWJsaWMgY2xhc3MgU2hlZXRuYW1lSGFuZGxlciA6IFNlcGFyYXRvckhhbmRsZXIgeworICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEhhbmRsZSgKKyAgICAgICAgY2hhciBjLAorICAgICAgICBUb2tlbiB0b2tlblNlcGFyYXRvciwKKyAgICAgICAgVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LAorICAgICAgICBJVG9rZW5JbmRleFByb3ZpZGVyIHRva2VuSW5kZXhQcm92aWRlcikgeworICAgICAgaWYgKGNvbnRleHQuSXNJblNoZWV0TmFtZSkgeworICAgICAgICBpZiAoSXNEb3VibGVRdW90ZSh0b2tlblNlcGFyYXRvciwgdG9rZW5JbmRleFByb3ZpZGVyLkluZGV4LCBjb250ZXh0KSkgeworICAgICAgICAgIHRva2VuSW5kZXhQcm92aWRlci5Nb3ZlSW5kZXhQb2ludGVyRm9yd2FyZCgpOworICAgICAgICAgIGNvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHRva2VuU2VwYXJhdG9yLlRva2VuVHlwZSAhPSBUb2tlblR5cGUuV29ya3NoZWV0TmFtZSkgeworICAgICAgICAgIGNvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKHRva2VuU2VwYXJhdG9yLlRva2VuVHlwZSA9PSBUb2tlblR5cGUuV29ya3NoZWV0TmFtZSkgeworICAgICAgICBpZiAoY29udGV4dC5MYXN0VG9rZW4gIT0gbnVsbCAmJiBjb250ZXh0Lkxhc3RUb2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLldvcmtzaGVldE5hbWUpIHsKKyAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKAorICAgICAgICAgICAgICAhY29udGV4dC5DdXJyZW50VG9rZW5IYXNWYWx1ZQorICAgICAgICAgICAgICAgICAgPyBuZXcgVG9rZW4oc3RyaW5nLkVtcHR5LCBUb2tlblR5cGUuV29ya3NoZWV0TmFtZUNvbnRlbnQpCisgICAgICAgICAgICAgICAgICA6IG5ldyBUb2tlbihjb250ZXh0LkN1cnJlbnRUb2tlbiwgVG9rZW5UeXBlLldvcmtzaGVldE5hbWVDb250ZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgY29udGV4dC5BZGRUb2tlbihuZXcgVG9rZW4oIiciLCBUb2tlblR5cGUuV29ya3NoZWV0TmFtZSkpOworICAgICAgICBjb250ZXh0LlRvZ2dsZUlzSW5TaGVldE5hbWUoKTsKKyAgICAgICAgY29udGV4dC5OZXdUb2tlbigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JIYW5kbGVycy9TdHJpbmdIYW5kbGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL1N0cmluZ0hhbmRsZXIuY3MKaW5kZXggZWM0YTI0Yi4uMmVmNjI5YyAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL1N0cmluZ0hhbmRsZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL1N0cmluZ0hhbmRsZXIuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDE3ICsxMywxNyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDE1LTEyLTI4CkBAIC0zMyw0NyArMzMsNDQgQEAKIHVzaW5nIFN5c3RlbS5MaW5xOwogdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcy5Ub2tlblNlcGFyYXRvckhhbmRsZXJzCi17Ci0gICAgcHVibGljIGNsYXNzIFN0cmluZ0hhbmRsZXIgOiBTZXBhcmF0b3JIYW5kbGVyCi0gICAgewotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBIYW5kbGUoY2hhciBjLCBUb2tlbiB0b2tlblNlcGFyYXRvciwgVG9rZW5pemVyQ29udGV4dCBjb250ZXh0LCBJVG9rZW5JbmRleFByb3ZpZGVyIHRva2VuSW5kZXhQcm92aWRlcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYoY29udGV4dC5Jc0luU3RyaW5nKQotICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICBpZiAoSXNEb3VibGVRdW90ZSh0b2tlblNlcGFyYXRvciwgdG9rZW5JbmRleFByb3ZpZGVyLkluZGV4LCBjb250ZXh0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRva2VuSW5kZXhQcm92aWRlci5Nb3ZlSW5kZXhQb2ludGVyRm9yd2FyZCgpOwotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LkFwcGVuZFRvQ3VycmVudFRva2VuKGMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRva2VuU2VwYXJhdG9yLlRva2VuVHlwZSAhPSBUb2tlblR5cGUuU3RyaW5nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuTGFzdFRva2VuICE9IG51bGwgJiYgY29udGV4dC5MYXN0VG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nRW51bWVyYWJsZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuVG9nZ2xlSXNJblN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuTGFzdFRva2VuICE9IG51bGwgJiYgY29udGV4dC5MYXN0VG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKCFjb250ZXh0LkN1cnJlbnRUb2tlbkhhc1ZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBUb2tlbihzdHJpbmcuRW1wdHksIFRva2VuVHlwZS5TdHJpbmdDb250ZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgVG9rZW4oY29udGV4dC5DdXJyZW50VG9rZW4sIFRva2VuVHlwZS5TdHJpbmdDb250ZW50KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRleHQuQWRkVG9rZW4obmV3IFRva2VuKCJcIiIsIFRva2VuVHlwZS5TdHJpbmcpKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0LlRvZ2dsZUlzSW5TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBjb250ZXh0Lk5ld1Rva2VuKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXMuVG9rZW5TZXBhcmF0b3JIYW5kbGVycyB7CisgIHB1YmxpYyBjbGFzcyBTdHJpbmdIYW5kbGVyIDogU2VwYXJhdG9ySGFuZGxlciB7CisgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgSGFuZGxlKAorICAgICAgICBjaGFyIGMsCisgICAgICAgIFRva2VuIHRva2VuU2VwYXJhdG9yLAorICAgICAgICBUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIElUb2tlbkluZGV4UHJvdmlkZXIgdG9rZW5JbmRleFByb3ZpZGVyKSB7CisgICAgICBpZiAoY29udGV4dC5Jc0luU3RyaW5nKSB7CisgICAgICAgIGlmIChJc0RvdWJsZVF1b3RlKHRva2VuU2VwYXJhdG9yLCB0b2tlbkluZGV4UHJvdmlkZXIuSW5kZXgsIGNvbnRleHQpKSB7CisgICAgICAgICAgdG9rZW5JbmRleFByb3ZpZGVyLk1vdmVJbmRleFBvaW50ZXJGb3J3YXJkKCk7CisgICAgICAgICAgY29udGV4dC5BcHBlbmRUb0N1cnJlbnRUb2tlbihjKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQorICAgICAgICBpZiAodG9rZW5TZXBhcmF0b3IuVG9rZW5UeXBlICE9IFRva2VuVHlwZS5TdHJpbmcpIHsKKyAgICAgICAgICBjb250ZXh0LkFwcGVuZFRvQ3VycmVudFRva2VuKGMpOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh0b2tlblNlcGFyYXRvci5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLlN0cmluZykgeworICAgICAgICBpZiAoY29udGV4dC5MYXN0VG9rZW4gIT0gbnVsbAorICAgICAgICAgICAgJiYgY29udGV4dC5MYXN0VG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVuaW5nRW51bWVyYWJsZSkgeworICAgICAgICAgIGNvbnRleHQuQXBwZW5kVG9DdXJyZW50VG9rZW4oYyk7CisgICAgICAgICAgY29udGV4dC5Ub2dnbGVJc0luU3RyaW5nKCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRleHQuTGFzdFRva2VuICE9IG51bGwgJiYgY29udGV4dC5MYXN0VG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5TdHJpbmcpIHsKKyAgICAgICAgICBjb250ZXh0LkFkZFRva2VuKAorICAgICAgICAgICAgICAhY29udGV4dC5DdXJyZW50VG9rZW5IYXNWYWx1ZQorICAgICAgICAgICAgICAgICAgPyBuZXcgVG9rZW4oc3RyaW5nLkVtcHR5LCBUb2tlblR5cGUuU3RyaW5nQ29udGVudCkKKyAgICAgICAgICAgICAgICAgIDogbmV3IFRva2VuKGNvbnRleHQuQ3VycmVudFRva2VuLCBUb2tlblR5cGUuU3RyaW5nQ29udGVudCkpOworICAgICAgICB9CisgICAgICAgIGNvbnRleHQuQWRkVG9rZW4obmV3IFRva2VuKCJcIiIsIFRva2VuVHlwZS5TdHJpbmcpKTsKKyAgICAgICAgY29udGV4dC5Ub2dnbGVJc0luU3RyaW5nKCk7CisgICAgICAgIGNvbnRleHQuTmV3VG9rZW4oKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9ySGFuZGxlcnMvVG9rZW5TZXBhcmF0b3JIYW5kbGVyLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvckhhbmRsZXJzL1Rva2VuU2VwYXJhdG9ySGFuZGxlci5jcwppbmRleCA0Zjc4Yzk0Li44YWZiOTk3IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9ySGFuZGxlcnMvVG9rZW5TZXBhcmF0b3JIYW5kbGVyLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JIYW5kbGVycy9Ub2tlblNlcGFyYXRvckhhbmRsZXIuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDE3ICsxMywxNyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDE1LTEyLTI4CkBAIC0zMyw0MCArMzMsMzggQEAKIHVzaW5nIFN5c3RlbS5MaW5xOwogdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcy5Ub2tlblNlcGFyYXRvckhhbmRsZXJzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGFjY2VzcyB0byA8c2VlIGNyZWY9IlNlcGFyYXRvckhhbmRsZXIiLz5zIC0gY2xhc3NlcyB0aGF0IGV4cG9zZXMgZnVuY3Rpb25hdGxpdHkKLSAgICAvLy8gbmVlZGVkIHdoZW4gcGFyc2luZyBzdHJpbmdzIHRvIHRva2Vucy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVG9rZW5TZXBhcmF0b3JIYW5kbGVyCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBTZXBhcmF0b3JIYW5kbGVyW10gX2hhbmRsZXJzID0gbmV3IFNlcGFyYXRvckhhbmRsZXJbXQotICAgICAgICB7IAotICAgICAgICAgICAgbmV3IFN0cmluZ0hhbmRsZXIoKSwKLSAgICAgICAgICAgIG5ldyBCcmFja2V0SGFuZGxlcigpLAotICAgICAgICAgICAgbmV3IFNoZWV0bmFtZUhhbmRsZXIoKSwKLSAgICAgICAgICAgIG5ldyBNdWx0aXBsZUNoYXJTZXBhcmF0b3JIYW5kbGVyKCkKLSAgICAgICAgfTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpcy5Ub2tlblNlcGFyYXRvckhhbmRsZXJzIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhY2Nlc3MgdG8gPHNlZSBjcmVmPSJTZXBhcmF0b3JIYW5kbGVyIi8+cyAtIGNsYXNzZXMgdGhhdCBleHBvc2VzIGZ1bmN0aW9uYXRsaXR5CisgIC8vLyBuZWVkZWQgd2hlbiBwYXJzaW5nIHN0cmluZ3MgdG8gdG9rZW5zLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RhdGljIGNsYXNzIFRva2VuU2VwYXJhdG9ySGFuZGxlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgU2VwYXJhdG9ySGFuZGxlcltdIF9oYW5kbGVycyA9IG5ldyBTZXBhcmF0b3JIYW5kbGVyW10geworICAgICAgbmV3IFN0cmluZ0hhbmRsZXIoKSwKKyAgICAgIG5ldyBCcmFja2V0SGFuZGxlcigpLAorICAgICAgbmV3IFNoZWV0bmFtZUhhbmRsZXIoKSwKKyAgICAgIG5ldyBNdWx0aXBsZUNoYXJTZXBhcmF0b3JIYW5kbGVyKCksCisgICAgfTsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBIYW5kbGVzIGEgdG9rZW5zZXBhcmF0b3IuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0b2tlblNlcGFyYXRvciI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb250ZXh0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRva2VuSW5kZXhQcm92aWRlciI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlJldHVybnMgdHJ1ZSBpZiB0aGUgdG9rZW5zZXBhcmF0b3Igd2FzIGhhbmRsZWQuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgSGFuZGxlKGNoYXIgYywgVG9rZW4gdG9rZW5TZXBhcmF0b3IsIFRva2VuaXplckNvbnRleHQgY29udGV4dCwgSVRva2VuSW5kZXhQcm92aWRlciB0b2tlbkluZGV4UHJvdmlkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcmVhY2godmFyIGhhbmRsZXIgaW4gX2hhbmRsZXJzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGhhbmRsZXIuSGFuZGxlKGMsIHRva2VuU2VwYXJhdG9yLCBjb250ZXh0LCB0b2tlbkluZGV4UHJvdmlkZXIpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vLyA8c3VtbWFyeT4KKyAgICAvLy8gSGFuZGxlcyBhIHRva2Vuc2VwYXJhdG9yLgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJjIj48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0idG9rZW5TZXBhcmF0b3IiPjwvcGFyYW0+CisgICAgLy8vIDxwYXJhbSBuYW1lPSJjb250ZXh0Ij48L3BhcmFtPgorICAgIC8vLyA8cGFyYW0gbmFtZT0idG9rZW5JbmRleFByb3ZpZGVyIj48L3BhcmFtPgorICAgIC8vLyA8cmV0dXJucz5SZXR1cm5zIHRydWUgaWYgdGhlIHRva2Vuc2VwYXJhdG9yIHdhcyBoYW5kbGVkLjwvcmV0dXJucz4KKyAgICBwdWJsaWMgc3RhdGljIGJvb2wgSGFuZGxlKAorICAgICAgICBjaGFyIGMsCisgICAgICAgIFRva2VuIHRva2VuU2VwYXJhdG9yLAorICAgICAgICBUb2tlbml6ZXJDb250ZXh0IGNvbnRleHQsCisgICAgICAgIElUb2tlbkluZGV4UHJvdmlkZXIgdG9rZW5JbmRleFByb3ZpZGVyKSB7CisgICAgICBmb3JlYWNoICh2YXIgaGFuZGxlciBpbiBfaGFuZGxlcnMpIHsKKyAgICAgICAgaWYgKGhhbmRsZXIuSGFuZGxlKGMsIHRva2VuU2VwYXJhdG9yLCBjb250ZXh0LCB0b2tlbkluZGV4UHJvdmlkZXIpKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JQcm92aWRlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5TZXBhcmF0b3JQcm92aWRlci5jcwppbmRleCBkMTFjY2Q2Li5jZGRkMmYzIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuU2VwYXJhdG9yUHJvdmlkZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlblNlcGFyYXRvclByb3ZpZGVyLmNzCkBAIC0xMyw4MiArMTMsNjkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKKwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlRocmVhZGluZzsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCi17Ci0gICAgcHVibGljIGNsYXNzIFRva2VuU2VwYXJhdG9yUHJvdmlkZXIgOiBJVG9rZW5TZXBhcmF0b3JQcm92aWRlcgotICAgIHsKLSAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEaWN0aW9uYXJ5PHN0cmluZywgVG9rZW4+IF90b2tlbnM7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7CiAKLSAgICAgICAgc3RhdGljIFRva2VuU2VwYXJhdG9yUHJvdmlkZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfdG9rZW5zID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBUb2tlbj4oKTsKLSAgICAgICAgICAgIF90b2tlbnMuQWRkKCIrIiwgbmV3IFRva2VuKCIrIiwgVG9rZW5UeXBlLk9wZXJhdG9yKSk7Ci0gICAgICAgICAgICBfdG9rZW5zLkFkZCgiLSIsIG5ldyBUb2tlbigiLSIsIFRva2VuVHlwZS5PcGVyYXRvcikpOwotICAgICAgICAgICAgX3Rva2Vucy5BZGQoIioiLCBuZXcgVG9rZW4oIioiLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKLSAgICAgICAgICAgIF90b2tlbnMuQWRkKCIvIiwgbmV3IFRva2VuKCIvIiwgVG9rZW5UeXBlLk9wZXJhdG9yKSk7Ci0gICAgICAgICAgICBfdG9rZW5zLkFkZCgiXiIsIG5ldyBUb2tlbigiXiIsIFRva2VuVHlwZS5PcGVyYXRvcikpOwotICAgICAgICAgICAgX3Rva2Vucy5BZGQoIiYiLCBuZXcgVG9rZW4oIiYiLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKLSAgICAgICAgICAgIF90b2tlbnMuQWRkKCI+IiwgbmV3IFRva2VuKCI+IiwgVG9rZW5UeXBlLk9wZXJhdG9yKSk7Ci0gICAgICAgICAgICBfdG9rZW5zLkFkZCgiPCIsIG5ldyBUb2tlbigiPCIsIFRva2VuVHlwZS5PcGVyYXRvcikpOwotICAgICAgICAgICAgX3Rva2Vucy5BZGQoIj0iLCBuZXcgVG9rZW4oIj0iLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKLSAgICAgICAgICAgIF90b2tlbnMuQWRkKCI8PSIsIG5ldyBUb2tlbigiPD0iLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKLSAgICAgICAgICAgIF90b2tlbnMuQWRkKCI+PSIsIG5ldyBUb2tlbigiPj0iLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKLSAgICAgICAgICAgIF90b2tlbnMuQWRkKCI8PiIsIG5ldyBUb2tlbigiPD4iLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKLSAgICAgICAgICAgIF90b2tlbnMuQWRkKCIoIiwgbmV3IFRva2VuKCIoIiwgVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcykpOwotICAgICAgICAgICAgX3Rva2Vucy5BZGQoIikiLCBuZXcgVG9rZW4oIikiLCBUb2tlblR5cGUuQ2xvc2luZ1BhcmVudGhlc2lzKSk7Ci0gICAgICAgICAgICBfdG9rZW5zLkFkZCgieyIsIG5ldyBUb2tlbigieyIsIFRva2VuVHlwZS5PcGVuaW5nRW51bWVyYWJsZSkpOwotICAgICAgICAgICAgX3Rva2Vucy5BZGQoIn0iLCBuZXcgVG9rZW4oIn0iLCBUb2tlblR5cGUuQ2xvc2luZ0VudW1lcmFibGUpKTsKLSAgICAgICAgICAgIF90b2tlbnMuQWRkKCInIiwgbmV3IFRva2VuKCInIiwgVG9rZW5UeXBlLlN0cmluZykpOyAgCi0gICAgICAgICAgICBfdG9rZW5zLkFkZCgiXCIiLCBuZXcgVG9rZW4oIlwiIiwgVG9rZW5UeXBlLlN0cmluZykpOwotICAgICAgICAgICAgX3Rva2Vucy5BZGQoIiwiLCBuZXcgVG9rZW4oIiwiLCBUb2tlblR5cGUuQ29tbWEpKTsKLSAgICAgICAgICAgIF90b2tlbnMuQWRkKCI7IiwgbmV3IFRva2VuKCI7IiwgVG9rZW5UeXBlLlNlbWlDb2xvbikpOwotICAgICAgICAgICAgX3Rva2Vucy5BZGQoIlsiLCBuZXcgVG9rZW4oIlsiLCBUb2tlblR5cGUuT3BlbmluZ0JyYWNrZXQpKTsKLSAgICAgICAgICAgIF90b2tlbnMuQWRkKCJdIiwgbmV3IFRva2VuKCJdIiwgVG9rZW5UeXBlLkNsb3NpbmdCcmFja2V0KSk7Ci0gICAgICAgICAgICBfdG9rZW5zLkFkZCgiJSIsIG5ldyBUb2tlbigiJSIsIFRva2VuVHlwZS5QZXJjZW50KSk7Ci0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBUb2tlblNlcGFyYXRvclByb3ZpZGVyIDogSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIgeworICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEaWN0aW9uYXJ5PHN0cmluZywgVG9rZW4+IF90b2tlbnM7CiAKLSAgICAgICAgSURpY3Rpb25hcnk8c3RyaW5nLCBUb2tlbj4gSVRva2VuU2VwYXJhdG9yUHJvdmlkZXIuVG9rZW5zCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfdG9rZW5zOyB9Ci0gICAgICAgIH0KKyAgc3RhdGljIFRva2VuU2VwYXJhdG9yUHJvdmlkZXIoKSB7CisgICAgX3Rva2VucyA9IG5ldygpOworICAgIF90b2tlbnMuQWRkKCIrIiwgbmV3KCIrIiwgVG9rZW5UeXBlLk9wZXJhdG9yKSk7CisgICAgX3Rva2Vucy5BZGQoIi0iLCBuZXcoIi0iLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKKyAgICBfdG9rZW5zLkFkZCgiKiIsIG5ldygiKiIsIFRva2VuVHlwZS5PcGVyYXRvcikpOworICAgIF90b2tlbnMuQWRkKCIvIiwgbmV3KCIvIiwgVG9rZW5UeXBlLk9wZXJhdG9yKSk7CisgICAgX3Rva2Vucy5BZGQoIl4iLCBuZXcoIl4iLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKKyAgICBfdG9rZW5zLkFkZCgiJiIsIG5ldygiJiIsIFRva2VuVHlwZS5PcGVyYXRvcikpOworICAgIF90b2tlbnMuQWRkKCI+IiwgbmV3KCI+IiwgVG9rZW5UeXBlLk9wZXJhdG9yKSk7CisgICAgX3Rva2Vucy5BZGQoIjwiLCBuZXcoIjwiLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKKyAgICBfdG9rZW5zLkFkZCgiPSIsIG5ldygiPSIsIFRva2VuVHlwZS5PcGVyYXRvcikpOworICAgIF90b2tlbnMuQWRkKCI8PSIsIG5ldygiPD0iLCBUb2tlblR5cGUuT3BlcmF0b3IpKTsKKyAgICBfdG9rZW5zLkFkZCgiPj0iLCBuZXcoIj49IiwgVG9rZW5UeXBlLk9wZXJhdG9yKSk7CisgICAgX3Rva2Vucy5BZGQoIjw+IiwgbmV3KCI8PiIsIFRva2VuVHlwZS5PcGVyYXRvcikpOworICAgIF90b2tlbnMuQWRkKCIoIiwgbmV3KCIoIiwgVG9rZW5UeXBlLk9wZW5pbmdQYXJlbnRoZXNpcykpOworICAgIF90b2tlbnMuQWRkKCIpIiwgbmV3KCIpIiwgVG9rZW5UeXBlLkNsb3NpbmdQYXJlbnRoZXNpcykpOworICAgIF90b2tlbnMuQWRkKCJ7IiwgbmV3KCJ7IiwgVG9rZW5UeXBlLk9wZW5pbmdFbnVtZXJhYmxlKSk7CisgICAgX3Rva2Vucy5BZGQoIn0iLCBuZXcoIn0iLCBUb2tlblR5cGUuQ2xvc2luZ0VudW1lcmFibGUpKTsKKyAgICBfdG9rZW5zLkFkZCgiJyIsIG5ldygiJyIsIFRva2VuVHlwZS5TdHJpbmcpKTsKKyAgICBfdG9rZW5zLkFkZCgiXCIiLCBuZXcoIlwiIiwgVG9rZW5UeXBlLlN0cmluZykpOworICAgIF90b2tlbnMuQWRkKCIsIiwgbmV3KCIsIiwgVG9rZW5UeXBlLkNvbW1hKSk7CisgICAgX3Rva2Vucy5BZGQoIjsiLCBuZXcoIjsiLCBUb2tlblR5cGUuU2VtaUNvbG9uKSk7CisgICAgX3Rva2Vucy5BZGQoIlsiLCBuZXcoIlsiLCBUb2tlblR5cGUuT3BlbmluZ0JyYWNrZXQpKTsKKyAgICBfdG9rZW5zLkFkZCgiXSIsIG5ldygiXSIsIFRva2VuVHlwZS5DbG9zaW5nQnJhY2tldCkpOworICAgIF90b2tlbnMuQWRkKCIlIiwgbmV3KCIlIiwgVG9rZW5UeXBlLlBlcmNlbnQpKTsKKyAgfQogCi0gICAgICAgIHB1YmxpYyBib29sIElzT3BlcmF0b3Ioc3RyaW5nIGl0ZW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRva2VuIHRva2VuOwotICAgICAgICAgICAgaWYgKF90b2tlbnMuVHJ5R2V0VmFsdWUoaXRlbSwgb3V0IHRva2VuKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodG9rZW4uVG9rZW5UeXBlID09IFRva2VuVHlwZS5PcGVyYXRvcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICBJRGljdGlvbmFyeTxzdHJpbmcsIFRva2VuPiBJVG9rZW5TZXBhcmF0b3JQcm92aWRlci5Ub2tlbnMgPT4gX3Rva2VuczsKIAotICAgICAgICBwdWJsaWMgYm9vbCBJc1Bvc3NpYmxlTGFzdFBhcnRPZk11bHRpcGxlQ2hhck9wZXJhdG9yKHN0cmluZyBwYXJ0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcGFydCA9PSAiPSIgfHwgcGFydCA9PSAiPiI7Ci0gICAgICAgIH0KKyAgcHVibGljIGJvb2wgSXNPcGVyYXRvcihzdHJpbmcgaXRlbSkgeworICAgIFRva2VuIHRva2VuOworICAgIGlmIChfdG9rZW5zLlRyeUdldFZhbHVlKGl0ZW0sIG91dCB0b2tlbikpIHsKKyAgICAgIGlmICh0b2tlbi5Ub2tlblR5cGUgPT0gVG9rZW5UeXBlLk9wZXJhdG9yKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwdWJsaWMgYm9vbCBJc1Bvc3NpYmxlTGFzdFBhcnRPZk11bHRpcGxlQ2hhck9wZXJhdG9yKHN0cmluZyBwYXJ0KSB7CisgICAgcmV0dXJuIHBhcnQgPT0gIj0iIHx8IHBhcnQgPT0gIj4iOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuVHlwZS5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5UeXBlLmNzCmluZGV4IDViY2RhOWEuLmE2OTg0NzAgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5UeXBlLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5UeXBlLmNzCkBAIC0xMyw1NCArMTMsNDggQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMy0wMy0wMSAoUHJpb3IgZmlsZSBoaXN0b3J5IG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9zd21hbC9FeGNlbEZvcm11bGFQYXJzZXIpCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCi17Ci0gICAgcHVibGljIGVudW0gVG9rZW5UeXBlCi0gICAgewotICAgICAgICBPcGVyYXRvciwKLSAgICAgICAgTmVnYXRvciwKLSAgICAgICAgT3BlbmluZ1BhcmVudGhlc2lzLAotICAgICAgICBDbG9zaW5nUGFyZW50aGVzaXMsCi0gICAgICAgIE9wZW5pbmdFbnVtZXJhYmxlLAotICAgICAgICBDbG9zaW5nRW51bWVyYWJsZSwKLSAgICAgICAgT3BlbmluZ0JyYWNrZXQsCi0gICAgICAgIENsb3NpbmdCcmFja2V0LCAgICAgICAgCi0gICAgICAgIEVudW1lcmFibGUsCi0gICAgICAgIENvbW1hLAotICAgICAgICBTZW1pQ29sb24sCi0gICAgICAgIFN0cmluZywKLSAgICAgICAgU3RyaW5nQ29udGVudCwKLSAgICAgICAgSW50ZWdlciwKLSAgICAgICAgQm9vbGVhbiwKLSAgICAgICAgRGVjaW1hbCwKLSAgICAgICAgUGVyY2VudCwKLSAgICAgICAgRnVuY3Rpb24sCi0gICAgICAgIEV4Y2VsQWRkcmVzcywKLSAgICAgICAgTmFtZVZhbHVlLAotICAgICAgICBJbnZhbGlkUmVmZXJlbmNlLAotICAgICAgICBOdW1lcmljRXJyb3IsCi0gICAgICAgIFZhbHVlRGF0YVR5cGVFcnJvciwKLSAgICAgICAgTnVsbCwKLSAgICAgICAgVW5yZWNvZ25pemVkCi0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOworCitwdWJsaWMgZW51bSBUb2tlblR5cGUgeworICBPcGVyYXRvciwKKyAgTmVnYXRvciwKKyAgT3BlbmluZ1BhcmVudGhlc2lzLAorICBDbG9zaW5nUGFyZW50aGVzaXMsCisgIE9wZW5pbmdFbnVtZXJhYmxlLAorICBDbG9zaW5nRW51bWVyYWJsZSwKKyAgT3BlbmluZ0JyYWNrZXQsCisgIENsb3NpbmdCcmFja2V0LAorICBFbnVtZXJhYmxlLAorICBDb21tYSwKKyAgU2VtaUNvbG9uLAorICBTdHJpbmcsCisgIFN0cmluZ0NvbnRlbnQsCisgIEludGVnZXIsCisgIEJvb2xlYW4sCisgIERlY2ltYWwsCisgIFBlcmNlbnQsCisgIEZ1bmN0aW9uLAorICBFeGNlbEFkZHJlc3MsCisgIE5hbWVWYWx1ZSwKKyAgSW52YWxpZFJlZmVyZW5jZSwKKyAgTnVtZXJpY0Vycm9yLAorICBWYWx1ZURhdGFUeXBlRXJyb3IsCisgIE51bGwsCisgIFVucmVjb2duaXplZCwKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5pemVyQ29udGV4dC5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9MZXhpY2FsQW5hbHlzaXMvVG9rZW5pemVyQ29udGV4dC5jcwppbmRleCA2YTI4MTQyLi5lODdhYzE0IDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTGV4aWNhbEFuYWx5c2lzL1Rva2VuaXplckNvbnRleHQuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xleGljYWxBbmFseXNpcy9Ub2tlbml6ZXJDb250ZXh0LmNzCkBAIC0xMywxMjAgKzEzLDkyIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7CiB1c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzCi17Ci0gICAgcHVibGljIGNsYXNzIFRva2VuaXplckNvbnRleHQKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBUb2tlbml6ZXJDb250ZXh0KHN0cmluZyBmb3JtdWxhKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGZvcm11bGEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jaGFycyA9IGZvcm11bGEuVG9BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX3Jlc3VsdCA9IG5ldyBMaXN0PFRva2VuPigpOwotICAgICAgICAgICAgX2N1cnJlbnRUb2tlbiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKIAotICAgICAgICBwcml2YXRlIGNoYXJbXSBfY2hhcnM7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxUb2tlbj4gX3Jlc3VsdDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIF9jdXJyZW50VG9rZW47Ci0KLSAgICAgICAgcHVibGljIGNoYXJbXSBGb3JtdWxhQ2hhcnMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9jaGFyczsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElMaXN0PFRva2VuPiBSZXN1bHQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9yZXN1bHQ7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIElzSW5TdHJpbmcKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBUb2dnbGVJc0luU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgSXNJblN0cmluZyA9ICFJc0luU3RyaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgaW50IEJyYWNrZXRDb3VudAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RyaW5nIEN1cnJlbnRUb2tlbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX2N1cnJlbnRUb2tlbi5Ub1N0cmluZygpOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbCBDdXJyZW50VG9rZW5IYXNWYWx1ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gIXN0cmluZy5Jc051bGxPckVtcHR5KHRoaXMuSXNJblN0cmluZyA/IEN1cnJlbnRUb2tlbiA6IEN1cnJlbnRUb2tlbi5UcmltKCkpOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBOZXdUb2tlbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jdXJyZW50VG9rZW4gPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgQWRkVG9rZW4oVG9rZW4gdG9rZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yZXN1bHQuQWRkKHRva2VuKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIEFwcGVuZFRvQ3VycmVudFRva2VuKGNoYXIgYykKLSAgICAgICAgewotICAgICAgICAgICAgX2N1cnJlbnRUb2tlbi5BcHBlbmQoYy5Ub1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIEFwcGVuZFRvTGFzdFRva2VuKHN0cmluZyBzdHJpbmdUb0FwcGVuZCkKLSAgICAgICAgewotICAgICAgICAgICAgX3Jlc3VsdC5MYXN0KCkuQXBwZW5kKHN0cmluZ1RvQXBwZW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldExhc3RUb2tlblR5cGUoVG9rZW5UeXBlIHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yZXN1bHQuTGFzdCgpLlRva2VuVHlwZSA9IHR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBSZXBsYWNlTGFzdFRva2VuKFRva2VuIG5ld1Rva2VuKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgY291bnQgPSBfcmVzdWx0LkNvdW50OwotICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcmVzdWx0LlJlbW92ZUF0KGNvdW50IC0gMSk7ICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfcmVzdWx0LkFkZChuZXdUb2tlbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVG9rZW4gTGFzdFRva2VuCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfcmVzdWx0LkNvdW50ID4gMCA/IF9yZXN1bHQuTGFzdCgpIDogbnVsbDsgfQotICAgICAgICB9Ci0KK3B1YmxpYyBjbGFzcyBUb2tlbml6ZXJDb250ZXh0IHsKKyAgcHVibGljIFRva2VuaXplckNvbnRleHQoc3RyaW5nIGZvcm11bGEpIHsKKyAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KGZvcm11bGEpKSB7CisgICAgICBfY2hhcnMgPSBmb3JtdWxhLlRvQXJyYXkoKTsKICAgICB9CisgICAgX3Jlc3VsdCA9IG5ldygpOworICAgIF9jdXJyZW50VG9rZW4gPSBuZXcoKTsKKyAgfQorCisgIHByaXZhdGUgY2hhcltdIF9jaGFyczsKKyAgcHJpdmF0ZSBMaXN0PFRva2VuPiBfcmVzdWx0OworICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgX2N1cnJlbnRUb2tlbjsKKworICBwdWJsaWMgY2hhcltdIEZvcm11bGFDaGFycyA9PiBfY2hhcnM7CisKKyAgcHVibGljIElMaXN0PFRva2VuPiBSZXN1bHQgeworICAgIGdldCB7IHJldHVybiBfcmVzdWx0OyB9CisgIH0KKworICBwdWJsaWMgYm9vbCBJc0luU3RyaW5nIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgIHB1YmxpYyB2b2lkIFRvZ2dsZUlzSW5TdHJpbmcoKSB7CisgICAgSXNJblN0cmluZyA9ICFJc0luU3RyaW5nOworICB9CisKKyAgaW50ZXJuYWwgaW50IEJyYWNrZXRDb3VudCB7IGdldDsgc2V0OyB9CisKKyAgcHVibGljIHN0cmluZyBDdXJyZW50VG9rZW4geworICAgIGdldCB7IHJldHVybiBfY3VycmVudFRva2VuLlRvU3RyaW5nKCk7IH0KKyAgfQorCisgIHB1YmxpYyBib29sIEN1cnJlbnRUb2tlbkhhc1ZhbHVlIHsKKyAgICBnZXQgeyByZXR1cm4gIXN0cmluZy5Jc051bGxPckVtcHR5KElzSW5TdHJpbmcgPyBDdXJyZW50VG9rZW4gOiBDdXJyZW50VG9rZW4uVHJpbSgpKTsgfQorICB9CisKKyAgcHVibGljIHZvaWQgTmV3VG9rZW4oKSB7CisgICAgX2N1cnJlbnRUb2tlbiA9IG5ldygpOworICB9CisKKyAgcHVibGljIHZvaWQgQWRkVG9rZW4oVG9rZW4gdG9rZW4pIHsKKyAgICBfcmVzdWx0LkFkZCh0b2tlbik7CisgIH0KKworICBwdWJsaWMgdm9pZCBBcHBlbmRUb0N1cnJlbnRUb2tlbihjaGFyIGMpIHsKKyAgICBfY3VycmVudFRva2VuLkFwcGVuZChjLlRvU3RyaW5nKCkpOworICB9CisKKyAgcHVibGljIHZvaWQgQXBwZW5kVG9MYXN0VG9rZW4oc3RyaW5nIHN0cmluZ1RvQXBwZW5kKSB7CisgICAgX3Jlc3VsdC5MYXN0KCkuQXBwZW5kKHN0cmluZ1RvQXBwZW5kKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFNldExhc3RUb2tlblR5cGUoVG9rZW5UeXBlIHR5cGUpIHsKKyAgICBfcmVzdWx0Lkxhc3QoKS5Ub2tlblR5cGUgPSB0eXBlOworICB9CisKKyAgcHVibGljIHZvaWQgUmVwbGFjZUxhc3RUb2tlbihUb2tlbiBuZXdUb2tlbikgeworICAgIHZhciBjb3VudCA9IF9yZXN1bHQuQ291bnQ7CisgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgX3Jlc3VsdC5SZW1vdmVBdChjb3VudCAtIDEpOworICAgIH0KKyAgICBfcmVzdWx0LkFkZChuZXdUb2tlbik7CisgIH0KKworICBwdWJsaWMgVG9rZW4gTGFzdFRva2VuIHsKKyAgICBnZXQgeyByZXR1cm4gX3Jlc3VsdC5Db3VudCA+IDAgPyBfcmVzdWx0Lkxhc3QoKSA6IG51bGw7IH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL0xvZ2dpbmcvSUZvcm11bGFQYXJzZXJMb2dnZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTG9nZ2luZy9JRm9ybXVsYVBhcnNlckxvZ2dlci5jcwppbmRleCBmNWE5MWI4Li5kYzM4ZDlkIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTG9nZ2luZy9JRm9ybXVsYVBhcnNlckxvZ2dlci5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTG9nZ2luZy9JRm9ybXVsYVBhcnNlckxvZ2dlci5jcwpAQCAtMSw0NCArMSw0NiBAQAog77u/dXNpbmcgU3lzdGVtOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5Mb2dnaW5nCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBVc2VkIGZvciBsb2dnaW5nIGR1cmluZyBGb3JtdWxhUGFyc2luZwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGludGVyZmFjZSBJRm9ybXVsYVBhcnNlckxvZ2dlciA6IElEaXNwb3NhYmxlCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDYWxsZWQgZWFjaCB0aW1lIGFuIGV4Y2VwdGlvbiBvY2N1cnMgZHVyaW5nIGZvcm11bGEgcGFyc2luZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb250ZXh0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImV4Ij48L3BhcmFtPgotICAgICAgICB2b2lkIExvZyhQYXJzaW5nQ29udGV4dCBjb250ZXh0LCBFeGNlcHRpb24gZXgpOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDYWxsZWQgZWFjaCB0aW1lIGluZm9ybWF0aW9uIHNob3VsZCBiZSBsb2dnZWQgZHVyaW5nIGZvcm11bGEgcGFyc2luZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb250ZXh0Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPjwvcGFyYW0+Ci0gICAgICAgIHZvaWQgTG9nKFBhcnNpbmdDb250ZXh0IGNvbnRleHQsIHN0cmluZyBtZXNzYWdlKTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ2FsbGVkIHRvIGxvZyBhIG1lc3NhZ2Ugb3V0c2lkZSB0aGUgcGFyc2luZyBjb250ZXh0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPjwvcGFyYW0+Ci0gICAgICAgIHZvaWQgTG9nKHN0cmluZyBtZXNzYWdlKTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ2FsbGVkIGVhY2ggdGltZSBhIGNlbGwgd2l0aGluIHRoZSBjYWxjIGNoYWluIGlzIGFjY2Vzc2VkIGR1cmluZyBmb3JtdWxhIHBhcnNpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHZvaWQgTG9nQ2VsbENvdW50ZWQoKTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxvZ2dpbmc7CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ2FsbGVkIGVhY2ggdGltZSBhIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgZm9ybXVsYSBwYXJzaW5nLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZ1bmMiPjwvcGFyYW0+Ci0gICAgICAgIHZvaWQgTG9nRnVuY3Rpb24oc3RyaW5nIGZ1bmMpOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTb21lIGZ1bmN0aW9ucyBtZWFzdXJlIHBlcmZvcm1hbmNlLCBpZiBzbyB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZ1bmMiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWlsbGlzZWNvbmRzIj48L3BhcmFtPgotICAgICAgICB2b2lkIExvZ0Z1bmN0aW9uKHN0cmluZyBmdW5jLCBsb25nIG1pbGxpc2Vjb25kcyk7Ci0gICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIFVzZWQgZm9yIGxvZ2dpbmcgZHVyaW5nIEZvcm11bGFQYXJzaW5nCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGludGVyZmFjZSBJRm9ybXVsYVBhcnNlckxvZ2dlciA6IElEaXNwb3NhYmxlIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ2FsbGVkIGVhY2ggdGltZSBhbiBleGNlcHRpb24gb2NjdXJzIGR1cmluZyBmb3JtdWxhIHBhcnNpbmcuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29udGV4dCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJleCI+PC9wYXJhbT4KKyAgdm9pZCBMb2coUGFyc2luZ0NvbnRleHQgY29udGV4dCwgRXhjZXB0aW9uIGV4KTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDYWxsZWQgZWFjaCB0aW1lIGluZm9ybWF0aW9uIHNob3VsZCBiZSBsb2dnZWQgZHVyaW5nIGZvcm11bGEgcGFyc2luZy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb250ZXh0Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPjwvcGFyYW0+CisgIHZvaWQgTG9nKFBhcnNpbmdDb250ZXh0IGNvbnRleHQsIHN0cmluZyBtZXNzYWdlKTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDYWxsZWQgdG8gbG9nIGEgbWVzc2FnZSBvdXRzaWRlIHRoZSBwYXJzaW5nIGNvbnRleHQuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+PC9wYXJhbT4KKyAgdm9pZCBMb2coc3RyaW5nIG1lc3NhZ2UpOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENhbGxlZCBlYWNoIHRpbWUgYSBjZWxsIHdpdGhpbiB0aGUgY2FsYyBjaGFpbiBpcyBhY2Nlc3NlZCBkdXJpbmcgZm9ybXVsYSBwYXJzaW5nLgorICAvLy8gPC9zdW1tYXJ5PgorICB2b2lkIExvZ0NlbGxDb3VudGVkKCk7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ2FsbGVkIGVhY2ggdGltZSBhIGZ1bmN0aW9uIGlzIGNhbGxlZCBkdXJpbmcgZm9ybXVsYSBwYXJzaW5nLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImZ1bmMiPjwvcGFyYW0+CisgIHZvaWQgTG9nRnVuY3Rpb24oc3RyaW5nIGZ1bmMpOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNvbWUgZnVuY3Rpb25zIG1lYXN1cmUgcGVyZm9ybWFuY2UsIGlmIHNvIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iZnVuYyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJtaWxsaXNlY29uZHMiPjwvcGFyYW0+CisgIHZvaWQgTG9nRnVuY3Rpb24oc3RyaW5nIGZ1bmMsIGxvbmcgbWlsbGlzZWNvbmRzKTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9OYW1lVmFsdWVQcm92aWRlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9OYW1lVmFsdWVQcm92aWRlci5jcwppbmRleCA1MjEwYTMxLi5mN2IwYThkIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvTmFtZVZhbHVlUHJvdmlkZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL05hbWVWYWx1ZVByb3ZpZGVyLmNzCkBAIC0xLDM1ICsxLDE3IEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Civvu79uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKLXsKLSAgICBwdWJsaWMgY2xhc3MgTmFtZVZhbHVlUHJvdmlkZXIgOiBJTmFtZVZhbHVlUHJvdmlkZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgTmFtZVZhbHVlUHJvdmlkZXIoKQotICAgICAgICB7CitwdWJsaWMgY2xhc3MgTmFtZVZhbHVlUHJvdmlkZXIgOiBJTmFtZVZhbHVlUHJvdmlkZXIgeworICBwcml2YXRlIE5hbWVWYWx1ZVByb3ZpZGVyKCkge30KIAotICAgICAgICB9CisgIHB1YmxpYyBzdGF0aWMgSU5hbWVWYWx1ZVByb3ZpZGVyIEVtcHR5ID0+IG5ldyBOYW1lVmFsdWVQcm92aWRlcigpOwogCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgSU5hbWVWYWx1ZVByb3ZpZGVyIEVtcHR5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBuZXcgTmFtZVZhbHVlUHJvdmlkZXIoKTsgfQotICAgICAgICB9CisgIHB1YmxpYyBib29sIElzTmFtZWRWYWx1ZShzdHJpbmcga2V5LCBzdHJpbmcgd29ya3NoZWV0KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CiAKLSAgICAgICAgcHVibGljIGJvb2wgSXNOYW1lZFZhbHVlKHN0cmluZyBrZXksIHN0cmluZyB3b3Jrc2hlZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICBwdWJsaWMgb2JqZWN0IEdldE5hbWVkVmFsdWUoc3RyaW5nIGtleSkgeworICAgIHJldHVybiBudWxsOworICB9CiAKLSAgICAgICAgcHVibGljIG9iamVjdCBHZXROYW1lZFZhbHVlKHN0cmluZyBrZXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgUmVsb2FkKCkKLSAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9CisgIHB1YmxpYyB2b2lkIFJlbG9hZCgpIHt9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvUGFyc2VkVmFsdWUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvUGFyc2VkVmFsdWUuY3MKaW5kZXggNTFkN2QwOC4uNDMxMTJiNyAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1BhcnNlZFZhbHVlLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9QYXJzZWRWYWx1ZS5jcwpAQCAtMSwzNSArMSwxNSBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0Owor77u/bmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nCi17Ci0gICAgcHVibGljIGNsYXNzIFBhcnNlZFZhbHVlCi0gICAgewotICAgICAgICBwdWJsaWMgUGFyc2VkVmFsdWUob2JqZWN0IHZhbCwgaW50IHJvd0luZGV4LCBpbnQgY29sSW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZhbHVlID0gdmFsOwotICAgICAgICAgICAgUm93SW5kZXggPSByb3dJbmRleDsKLSAgICAgICAgICAgIENvbEluZGV4ID0gY29sSW5kZXg7Ci0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBQYXJzZWRWYWx1ZSB7CisgIHB1YmxpYyBQYXJzZWRWYWx1ZShvYmplY3QgdmFsLCBpbnQgcm93SW5kZXgsIGludCBjb2xJbmRleCkgeworICAgIFZhbHVlID0gdmFsOworICAgIFJvd0luZGV4ID0gcm93SW5kZXg7CisgICAgQ29sSW5kZXggPSBjb2xJbmRleDsKKyAgfQogCi0gICAgICAgIHB1YmxpYyBvYmplY3QgVmFsdWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7Ci0gICAgICAgIH0KKyAgcHVibGljIG9iamVjdCBWYWx1ZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KIAotICAgICAgICBwdWJsaWMgaW50IFJvd0luZGV4Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHByaXZhdGUgc2V0OwotICAgICAgICB9CisgIHB1YmxpYyBpbnQgUm93SW5kZXggeyBnZXQ7IHByaXZhdGUgc2V0OyB9CiAKLSAgICAgICAgcHVibGljIGludCBDb2xJbmRleAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBwcml2YXRlIHNldDsKLSAgICAgICAgfQotICAgIH0KKyAgcHVibGljIGludCBDb2xJbmRleCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9QYXJzaW5nQ29uZmlndXJhdGlvbi5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9QYXJzaW5nQ29uZmlndXJhdGlvbi5jcwppbmRleCBkZGRmMGI2Li43MTQ0MGIzIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ0NvbmZpZ3VyYXRpb24uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1BhcnNpbmdDb25maWd1cmF0aW9uLmNzCkBAIC0xLDc2ICsxLDYyIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9ucy5NYXRoOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5MZXhpY2FsQW5hbHlzaXM7Civvu791c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsLkZ1bmN0aW9uczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnM7Cit1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxleGljYWxBbmFseXNpczsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTG9nZ2luZzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZwotewotICAgIHB1YmxpYyBjbGFzcyBQYXJzaW5nQ29uZmlndXJhdGlvbgotICAgIHsKLSAgICAgICAgcHVibGljIHZpcnR1YWwgSUxleGVyIExleGVyIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7CiAKLSAgICAgICAgcHVibGljIElGb3JtdWxhUGFyc2VyTG9nZ2VyIExvZ2dlciB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KK3B1YmxpYyBjbGFzcyBQYXJzaW5nQ29uZmlndXJhdGlvbiB7CisgIHB1YmxpYyB2aXJ0dWFsIElMZXhlciBMZXhlciB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KIAotICAgICAgICBwdWJsaWMgSUV4cHJlc3Npb25HcmFwaEJ1aWxkZXIgR3JhcGhCdWlsZGVyIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorICBwdWJsaWMgSUZvcm11bGFQYXJzZXJMb2dnZXIgTG9nZ2VyIHsgZ2V0OyBwcml2YXRlIHNldDsgfQogCi0gICAgICAgIHB1YmxpYyBJRXhwcmVzc2lvbkNvbXBpbGVyIEV4cHJlc3Npb25Db21waWxlcnsgZ2V0OyBwcml2YXRlIHNldDsgfQorICBwdWJsaWMgSUV4cHJlc3Npb25HcmFwaEJ1aWxkZXIgR3JhcGhCdWlsZGVyIHsgZ2V0OyBwcml2YXRlIHNldDsgfQogCi0gICAgICAgIHB1YmxpYyBGdW5jdGlvblJlcG9zaXRvcnkgRnVuY3Rpb25SZXBvc2l0b3J5eyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgIHB1YmxpYyBJRXhwcmVzc2lvbkNvbXBpbGVyIEV4cHJlc3Npb25Db21waWxlciB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KIAotICAgICAgICBwcml2YXRlIFBhcnNpbmdDb25maWd1cmF0aW9uKCkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZ1bmN0aW9uUmVwb3NpdG9yeSA9IEZ1bmN0aW9uUmVwb3NpdG9yeS5DcmVhdGUoKTsKLSAgICAgICAgfQorICBwdWJsaWMgRnVuY3Rpb25SZXBvc2l0b3J5IEZ1bmN0aW9uUmVwb3NpdG9yeSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KIAotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgUGFyc2luZ0NvbmZpZ3VyYXRpb24gQ3JlYXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJzaW5nQ29uZmlndXJhdGlvbigpOwotICAgICAgICB9CisgIHByaXZhdGUgUGFyc2luZ0NvbmZpZ3VyYXRpb24oKSB7CisgICAgRnVuY3Rpb25SZXBvc2l0b3J5ID0gRnVuY3Rpb25SZXBvc2l0b3J5LkNyZWF0ZSgpOworICB9CiAKLSAgICAgICAgcHVibGljIFBhcnNpbmdDb25maWd1cmF0aW9uIFNldExleGVyKElMZXhlciBsZXhlcikKLSAgICAgICAgewotICAgICAgICAgICAgTGV4ZXIgPSBsZXhlcjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9CisgIGludGVybmFsIHN0YXRpYyBQYXJzaW5nQ29uZmlndXJhdGlvbiBDcmVhdGUoKSB7CisgICAgcmV0dXJuIG5ldygpOworICB9CiAKLSAgICAgICAgcHVibGljIFBhcnNpbmdDb25maWd1cmF0aW9uIFNldEdyYXBoQnVpbGRlcihJRXhwcmVzc2lvbkdyYXBoQnVpbGRlciBncmFwaEJ1aWxkZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEdyYXBoQnVpbGRlciA9IGdyYXBoQnVpbGRlcjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9CisgIHB1YmxpYyBQYXJzaW5nQ29uZmlndXJhdGlvbiBTZXRMZXhlcihJTGV4ZXIgbGV4ZXIpIHsKKyAgICBMZXhlciA9IGxleGVyOworICAgIHJldHVybiB0aGlzOworICB9CiAKLSAgICAgICAgcHVibGljIFBhcnNpbmdDb25maWd1cmF0aW9uIFNldEV4cHJlc2lvbkNvbXBpbGVyKElFeHByZXNzaW9uQ29tcGlsZXIgZXhwcmVzc2lvbkNvbXBpbGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeHByZXNzaW9uQ29tcGlsZXIgPSBleHByZXNzaW9uQ29tcGlsZXI7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQorICBwdWJsaWMgUGFyc2luZ0NvbmZpZ3VyYXRpb24gU2V0R3JhcGhCdWlsZGVyKElFeHByZXNzaW9uR3JhcGhCdWlsZGVyIGdyYXBoQnVpbGRlcikgeworICAgIEdyYXBoQnVpbGRlciA9IGdyYXBoQnVpbGRlcjsKKyAgICByZXR1cm4gdGhpczsKKyAgfQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEF0dGFjaGVzIGEgbG9nZ2VyLCBlcnJvcnMgYW5kIGxvZyBlbnRyaWVzIHdpbGwgYmUgd3JpdHRlbiB0byB0aGUgbG9nZ2VyIGR1cmluZyB0aGUgcGFyc2luZyBwcm9jZXNzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxvZ2dlciI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIFBhcnNpbmdDb25maWd1cmF0aW9uIEF0dGFjaExvZ2dlcihJRm9ybXVsYVBhcnNlckxvZ2dlciBsb2dnZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlcXVpcmUuVGhhdChsb2dnZXIpLk5hbWVkKCJsb2dnZXIiKS5Jc05vdE51bGwoKTsKLSAgICAgICAgICAgIExvZ2dlciA9IGxvZ2dlcjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9CisgIHB1YmxpYyBQYXJzaW5nQ29uZmlndXJhdGlvbiBTZXRFeHByZXNpb25Db21waWxlcihJRXhwcmVzc2lvbkNvbXBpbGVyIGV4cHJlc3Npb25Db21waWxlcikgeworICAgIEV4cHJlc3Npb25Db21waWxlciA9IGV4cHJlc3Npb25Db21waWxlcjsKKyAgICByZXR1cm4gdGhpczsKKyAgfQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIGlmIGEgbG9nZ2VyIGlzIGF0dGFjaGVkIGl0IHdpbGwgYmUgcmVtb3ZlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIFBhcnNpbmdDb25maWd1cmF0aW9uIERldGFjaExvZ2dlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExvZ2dlciA9IG51bGw7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQXR0YWNoZXMgYSBsb2dnZXIsIGVycm9ycyBhbmQgbG9nIGVudHJpZXMgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBsb2dnZXIgZHVyaW5nIHRoZSBwYXJzaW5nIHByb2Nlc3MuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibG9nZ2VyIj48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgUGFyc2luZ0NvbmZpZ3VyYXRpb24gQXR0YWNoTG9nZ2VyKElGb3JtdWxhUGFyc2VyTG9nZ2VyIGxvZ2dlcikgeworICAgIFJlcXVpcmUuVGhhdChsb2dnZXIpLk5hbWVkKCJsb2dnZXIiKS5Jc05vdE51bGwoKTsKKyAgICBMb2dnZXIgPSBsb2dnZXI7CisgICAgcmV0dXJuIHRoaXM7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBpZiBhIGxvZ2dlciBpcyBhdHRhY2hlZCBpdCB3aWxsIGJlIHJlbW92ZWQuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBQYXJzaW5nQ29uZmlndXJhdGlvbiBEZXRhY2hMb2dnZXIoKSB7CisgICAgTG9nZ2VyID0gbnVsbDsKKyAgICByZXR1cm4gdGhpczsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1BhcnNpbmdDb250ZXh0LmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1BhcnNpbmdDb250ZXh0LmNzCmluZGV4IDY0MWQxZDYuLjhlZWU4ODkgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9QYXJzaW5nQ29udGV4dC5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ0NvbnRleHQuY3MKQEAgLTEsNzYgKzEsNjAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuTGV4aWNhbEFuYWx5c2lzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeHByZXNzaW9uR3JhcGg7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkV4Y2VsVXRpbGl0aWVzOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZzsKK++7v3VzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CiB1c2luZyBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLkxvZ2dpbmc7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBQYXJzaW5nIGNvbnRleHQKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBQYXJzaW5nQ29udGV4dCA6IElQYXJzaW5nTGlmZXRpbWVFdmVudEhhbmRsZXIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgUGFyc2luZ0NvbnRleHQoKSB7IH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSA8c2VlIGNyZWY9IkZvcm11bGFQYXJzZXIiLz4gb2YgdGhlIGN1cnJlbnQgY29udGV4dC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEZvcm11bGFQYXJzZXIgUGFyc2VyIHsgZ2V0OyBzZXQ7IH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBQYXJzaW5nIGNvbnRleHQKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgUGFyc2luZ0NvbnRleHQgOiBJUGFyc2luZ0xpZmV0aW1lRXZlbnRIYW5kbGVyIHsKKyAgcHJpdmF0ZSBQYXJzaW5nQ29udGV4dCgpIHt9CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIDxzZWUgY3JlZj0iRXhjZWxEYXRhUHJvdmlkZXIiLz4gaXMgYW4gYWJzdHJhY3Rpb24gb24gdG9wIG9mCi0gICAgICAgIC8vLyBFeGNlbCwgaW4gdGhpcyBjYXNlIEVQUGx1cy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsRGF0YVByb3ZpZGVyIEV4Y2VsRGF0YVByb3ZpZGVyIHsgZ2V0OyBzZXQ7IH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIDxzZWUgY3JlZj0iRm9ybXVsYVBhcnNlciIvPiBvZiB0aGUgY3VycmVudCBjb250ZXh0LgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRm9ybXVsYVBhcnNlciBQYXJzZXIgeyBnZXQ7IHNldDsgfQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFV0aWxpdHkgZm9yIGhhbmRsaW5nIGFkZHJlc3NlcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgUmFuZ2VBZGRyZXNzRmFjdG9yeSBSYW5nZUFkZHJlc3NGYWN0b3J5IHsgZ2V0OyBzZXQ7IH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIDxzZWUgY3JlZj0iRXhjZWxEYXRhUHJvdmlkZXIiLz4gaXMgYW4gYWJzdHJhY3Rpb24gb24gdG9wIG9mCisgIC8vLyBFeGNlbCwgaW4gdGhpcyBjYXNlIEVQUGx1cy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsRGF0YVByb3ZpZGVyIEV4Y2VsRGF0YVByb3ZpZGVyIHsgZ2V0OyBzZXQ7IH0KIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyA8c2VlIGNyZWY9IklOYW1lVmFsdWVQcm92aWRlciIvPiBvZiB0aGUgY3VycmVudCBjb250ZXh0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBJTmFtZVZhbHVlUHJvdmlkZXIgTmFtZVZhbHVlUHJvdmlkZXIgeyBnZXQ7IHNldDsgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBVdGlsaXR5IGZvciBoYW5kbGluZyBhZGRyZXNzZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIFJhbmdlQWRkcmVzc0ZhY3RvcnkgUmFuZ2VBZGRyZXNzRmFjdG9yeSB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uZmlndXJhdGlvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgUGFyc2luZ0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbiB7IGdldDsgc2V0OyB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIDxzZWUgY3JlZj0iSU5hbWVWYWx1ZVByb3ZpZGVyIi8+IG9mIHRoZSBjdXJyZW50IGNvbnRleHQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIElOYW1lVmFsdWVQcm92aWRlciBOYW1lVmFsdWVQcm92aWRlciB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2NvcGVzLCBhIHNjb3BlIHJlcHJlc2VudHMgdGhlIHBhcnNpbmcgb2YgYSBjZWxsIG9yIGEgdmFsdWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBQYXJzaW5nU2NvcGVzIFNjb3BlcyB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29uZmlndXJhdGlvbgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgUGFyc2luZ0NvbmZpZ3VyYXRpb24gQ29uZmlndXJhdGlvbiB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGEgPHNlZSBjcmVmPSJJRm9ybXVsYVBhcnNlckxvZ2dlciIvPiBpcyBhdHRhY2hlZCB0byB0aGUgcGFyc2VyLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBEZWJ1ZwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gQ29uZmlndXJhdGlvbi5Mb2dnZXIgIT0gbnVsbDsgfQotICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNjb3BlcywgYSBzY29wZSByZXByZXNlbnRzIHRoZSBwYXJzaW5nIG9mIGEgY2VsbCBvciBhIHZhbHVlLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgUGFyc2luZ1Njb3BlcyBTY29wZXMgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmFjdG9yeSBtZXRob2QuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgUGFyc2luZ0NvbnRleHQgQ3JlYXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBuZXcgUGFyc2luZ0NvbnRleHQoKTsKLSAgICAgICAgICAgIGNvbnRleHQuQ29uZmlndXJhdGlvbiA9IFBhcnNpbmdDb25maWd1cmF0aW9uLkNyZWF0ZSgpOwotICAgICAgICAgICAgY29udGV4dC5TY29wZXMgPSBuZXcgUGFyc2luZ1Njb3Blcyhjb250ZXh0KTsKLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0OwotICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhIDxzZWUgY3JlZj0iSUZvcm11bGFQYXJzZXJMb2dnZXIiLz4gaXMgYXR0YWNoZWQgdG8gdGhlIHBhcnNlci4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgRGVidWcgPT4gQ29uZmlndXJhdGlvbi5Mb2dnZXIgIT0gbnVsbDsKIAotICAgICAgICB2b2lkIElQYXJzaW5nTGlmZXRpbWVFdmVudEhhbmRsZXIuUGFyc2luZ0NvbXBsZXRlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBGYWN0b3J5IG1ldGhvZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIHN0YXRpYyBQYXJzaW5nQ29udGV4dCBDcmVhdGUoKSB7CisgICAgdmFyIGNvbnRleHQgPSBuZXcgUGFyc2luZ0NvbnRleHQoKTsKKyAgICBjb250ZXh0LkNvbmZpZ3VyYXRpb24gPSBQYXJzaW5nQ29uZmlndXJhdGlvbi5DcmVhdGUoKTsKKyAgICBjb250ZXh0LlNjb3BlcyA9IG5ldyhjb250ZXh0KTsKKyAgICByZXR1cm4gY29udGV4dDsKKyAgfQorCisgIHZvaWQgSVBhcnNpbmdMaWZldGltZUV2ZW50SGFuZGxlci5QYXJzaW5nQ29tcGxldGVkKCkge30KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9QYXJzaW5nU2NvcGUuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvUGFyc2luZ1Njb3BlLmNzCmluZGV4IDMyMWU2OTMuLjFlODYxYzUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9QYXJzaW5nU2NvcGUuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1BhcnNpbmdTY29wZS5jcwpAQCAtMSw1NCArMSw0NSBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbFV0aWxpdGllczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFJlcHJlc2VudHMgYSBwYXJzaW5nIG9mIGEgc2luZ2xlIGlucHV0IG9yIHdvcmtib29rIGFkZHJzZXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgUGFyc2luZ1Njb3BlIDogSURpc3Bvc2FibGUKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUGFyc2luZ1Njb3BlcyBfcGFyc2luZ1Njb3BlczsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nOwogCi0gICAgICAgIHB1YmxpYyBQYXJzaW5nU2NvcGUoUGFyc2luZ1Njb3BlcyBwYXJzaW5nU2NvcGVzLCBSYW5nZUFkZHJlc3MgYWRkcmVzcykKLSAgICAgICAgICAgIDogdGhpcyhwYXJzaW5nU2NvcGVzLCBudWxsLCBhZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBSZXByZXNlbnRzIGEgcGFyc2luZyBvZiBhIHNpbmdsZSBpbnB1dCBvciB3b3JrYm9vayBhZGRyc2VzLgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBQYXJzaW5nU2NvcGUgOiBJRGlzcG9zYWJsZSB7CisgIHByaXZhdGUgcmVhZG9ubHkgUGFyc2luZ1Njb3BlcyBfcGFyc2luZ1Njb3BlczsKIAotICAgICAgICBwdWJsaWMgUGFyc2luZ1Njb3BlKFBhcnNpbmdTY29wZXMgcGFyc2luZ1Njb3BlcywgUGFyc2luZ1Njb3BlIHBhcmVudCwgUmFuZ2VBZGRyZXNzIGFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYXJzaW5nU2NvcGVzID0gcGFyc2luZ1Njb3BlczsKLSAgICAgICAgICAgIFBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgICAgIEFkZHJlc3MgPSBhZGRyZXNzOwotICAgICAgICAgICAgU2NvcGVJZCA9IEd1aWQuTmV3R3VpZCgpOwotICAgICAgICB9CisgIHB1YmxpYyBQYXJzaW5nU2NvcGUoUGFyc2luZ1Njb3BlcyBwYXJzaW5nU2NvcGVzLCBSYW5nZUFkZHJlc3MgYWRkcmVzcykKKyAgICAgIDogdGhpcyhwYXJzaW5nU2NvcGVzLCBudWxsLCBhZGRyZXNzKSB7fQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElkIG9mIHRoZSBzY29wZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEd1aWQgU2NvcGVJZCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgcHVibGljIFBhcnNpbmdTY29wZShQYXJzaW5nU2NvcGVzIHBhcnNpbmdTY29wZXMsIFBhcnNpbmdTY29wZSBwYXJlbnQsIFJhbmdlQWRkcmVzcyBhZGRyZXNzKSB7CisgICAgX3BhcnNpbmdTY29wZXMgPSBwYXJzaW5nU2NvcGVzOworICAgIFBhcmVudCA9IHBhcmVudDsKKyAgICBBZGRyZXNzID0gYWRkcmVzczsKKyAgICBTY29wZUlkID0gR3VpZC5OZXdHdWlkKCk7CisgIH0KIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgY2FsbGluZyBzY29wZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIFBhcnNpbmdTY29wZSBQYXJlbnQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElkIG9mIHRoZSBzY29wZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEd1aWQgU2NvcGVJZCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgYWRkcmVzcyBvZiB0aGUgY2VsbCBjdXJyZW50bHkgYmVlaW5nIHBhcnNlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIFJhbmdlQWRkcmVzcyBBZGRyZXNzIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgY2FsbGluZyBzY29wZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIFBhcnNpbmdTY29wZSBQYXJlbnQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVHJ1ZSBpZiB0aGUgY3VycmVudCBzY29wZSBpcyBhIFN1YnRvdGFsIGZ1bmN0aW9uIGJlZWluZyBleGVjdXRlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgSXNTdWJ0b3RhbCB7IGdldDsgc2V0OyB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBhZGRyZXNzIG9mIHRoZSBjZWxsIGN1cnJlbnRseSBiZWVpbmcgcGFyc2VkLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgUmFuZ2VBZGRyZXNzIEFkZHJlc3MgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CiAKLSAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYXJzaW5nU2NvcGVzLktpbGxTY29wZSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHJ1ZSBpZiB0aGUgY3VycmVudCBzY29wZSBpcyBhIFN1YnRvdGFsIGZ1bmN0aW9uIGJlZWluZyBleGVjdXRlZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgSXNTdWJ0b3RhbCB7IGdldDsgc2V0OyB9CisKKyAgcHVibGljIHZvaWQgRGlzcG9zZSgpIHsKKyAgICBfcGFyc2luZ1Njb3Blcy5LaWxsU2NvcGUodGhpcyk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9QYXJzaW5nU2NvcGVzLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1BhcnNpbmdTY29wZXMuY3MKaW5kZXggOTc4ZGYzMC4uNTFkN2JhZCAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1BhcnNpbmdTY29wZXMuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1BhcnNpbmdTY29wZXMuY3MKQEAgLTEsNjUgKzEsNTEgQEAKLe+7v3VzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhjZWxVdGlsaXRpZXM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzdGFjayBvbiB3aGljaCBpbnN0YW5jZXMgb2YgPHNlZSBjcmVmPSJQYXJzaW5nU2NvcGUiLz4KLSAgICAvLy8gYXJlIHB1dC4gRWFjaCBQYXJzaW5nU2NvcGUgcmVwcmVzZW50cyB0aGUgcGFyc2luZyBvZiBhbiBhZGRyZXNzIGluIHRoZSB3b3JrYm9vay4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBQYXJzaW5nU2NvcGVzCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElQYXJzaW5nTGlmZXRpbWVFdmVudEhhbmRsZXIgX2xpZmV0aW1lRXZlbnRIYW5kbGVyOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmc7CiAKLSAgICAgICAgcHVibGljIFBhcnNpbmdTY29wZXMoSVBhcnNpbmdMaWZldGltZUV2ZW50SGFuZGxlciBsaWZldGltZUV2ZW50SGFuZGxlcikKLSAgICAgICAgewotICAgICAgICAgICAgX2xpZmV0aW1lRXZlbnRIYW5kbGVyID0gbGlmZXRpbWVFdmVudEhhbmRsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBTdGFjazxQYXJzaW5nU2NvcGU+IF9zY29wZXMgPSBuZXcgU3RhY2s8UGFyc2luZ1Njb3BlPigpOworLy8vIDxzdW1tYXJ5PgorLy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHN0YWNrIG9uIHdoaWNoIGluc3RhbmNlcyBvZiA8c2VlIGNyZWY9IlBhcnNpbmdTY29wZSIvPgorLy8vIGFyZSBwdXQuIEVhY2ggUGFyc2luZ1Njb3BlIHJlcHJlc2VudHMgdGhlIHBhcnNpbmcgb2YgYW4gYWRkcmVzcyBpbiB0aGUgd29ya2Jvb2suCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIFBhcnNpbmdTY29wZXMgeworICBwcml2YXRlIHJlYWRvbmx5IElQYXJzaW5nTGlmZXRpbWVFdmVudEhhbmRsZXIgX2xpZmV0aW1lRXZlbnRIYW5kbGVyOwogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgPHNlZSBjcmVmPSJQYXJzaW5nU2NvcGUiLz4gYW5kIHB1dHMgaXQgb24gdG9wIG9mIHRoZSBzdGFjay4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgdmlydHVhbCBQYXJzaW5nU2NvcGUgTmV3U2NvcGUoUmFuZ2VBZGRyZXNzIGFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhcnNpbmdTY29wZSBzY29wZTsKLSAgICAgICAgICAgIGlmIChfc2NvcGVzLkNvdW50KCkgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNjb3BlID0gbmV3IFBhcnNpbmdTY29wZSh0aGlzLCBfc2NvcGVzLlBlZWsoKSwgYWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2NvcGUgPSBuZXcgUGFyc2luZ1Njb3BlKHRoaXMsIGFkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX3Njb3Blcy5QdXNoKHNjb3BlKTsKLSAgICAgICAgICAgIHJldHVybiBzY29wZTsKLSAgICAgICAgfQorICBwdWJsaWMgUGFyc2luZ1Njb3BlcyhJUGFyc2luZ0xpZmV0aW1lRXZlbnRIYW5kbGVyIGxpZmV0aW1lRXZlbnRIYW5kbGVyKSB7CisgICAgX2xpZmV0aW1lRXZlbnRIYW5kbGVyID0gbGlmZXRpbWVFdmVudEhhbmRsZXI7CisgIH0KIAorICBwcml2YXRlIFN0YWNrPFBhcnNpbmdTY29wZT4gX3Njb3BlcyA9IG5ldygpOwogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBjdXJyZW50IHBhcnNpbmcgc2NvcGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyB2aXJ0dWFsIFBhcnNpbmdTY29wZSBDdXJyZW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfc2NvcGVzLkNvdW50KCkgPiAwID8gX3Njb3Blcy5QZWVrKCkgOiBudWxsOyB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZW1vdmVzIHRoZSBjdXJyZW50IHNjb3BlLCBzZXR0aW5nIHRoZSBjYWxsaW5nIHNjb3BlIHRvIGN1cnJlbnQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFyc2luZ1Njb3BlIj48L3BhcmFtPgotICAgICAgICBwdWJsaWMgdmlydHVhbCB2b2lkIEtpbGxTY29wZShQYXJzaW5nU2NvcGUgcGFyc2luZ1Njb3BlKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc2NvcGVzLlBvcCgpOwotICAgICAgICAgICAgaWYgKF9zY29wZXMuQ291bnQoKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9saWZldGltZUV2ZW50SGFuZGxlci5QYXJzaW5nQ29tcGxldGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ3JlYXRlcyBhIG5ldyA8c2VlIGNyZWY9IlBhcnNpbmdTY29wZSIvPiBhbmQgcHV0cyBpdCBvbiB0b3Agb2YgdGhlIHN0YWNrLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyB2aXJ0dWFsIFBhcnNpbmdTY29wZSBOZXdTY29wZShSYW5nZUFkZHJlc3MgYWRkcmVzcykgeworICAgIFBhcnNpbmdTY29wZSBzY29wZTsKKyAgICBpZiAoX3Njb3Blcy5Db3VudCgpID4gMCkgeworICAgICAgc2NvcGUgPSBuZXcodGhpcywgX3Njb3Blcy5QZWVrKCksIGFkZHJlc3MpOworICAgIH0gZWxzZSB7CisgICAgICBzY29wZSA9IG5ldyh0aGlzLCBhZGRyZXNzKTsKICAgICB9CisgICAgX3Njb3Blcy5QdXNoKHNjb3BlKTsKKyAgICByZXR1cm4gc2NvcGU7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgY3VycmVudCBwYXJzaW5nIHNjb3BlLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgdmlydHVhbCBQYXJzaW5nU2NvcGUgQ3VycmVudCA9PiBfc2NvcGVzLkNvdW50KCkgPiAwID8gX3Njb3Blcy5QZWVrKCkgOiBudWxsOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJlbW92ZXMgdGhlIGN1cnJlbnQgc2NvcGUsIHNldHRpbmcgdGhlIGNhbGxpbmcgc2NvcGUgdG8gY3VycmVudC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJwYXJzaW5nU2NvcGUiPjwvcGFyYW0+CisgIHB1YmxpYyB2aXJ0dWFsIHZvaWQgS2lsbFNjb3BlKFBhcnNpbmdTY29wZSBwYXJzaW5nU2NvcGUpIHsKKyAgICBfc2NvcGVzLlBvcCgpOworICAgIGlmIChfc2NvcGVzLkNvdW50KCkgPT0gMCkgeworICAgICAgX2xpZmV0aW1lRXZlbnRIYW5kbGVyLlBhcnNpbmdDb21wbGV0ZWQoKTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvQXJndW1lbnRJbmZvLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9Bcmd1bWVudEluZm8uY3MKaW5kZXggOWNmMDg5My4uYTBhODI2ZiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9Bcmd1bWVudEluZm8uY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9Bcmd1bWVudEluZm8uY3MKQEAgLTEsMjUgKzEsMTYgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK++7v25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzCi17Ci0gICAgcHVibGljIGNsYXNzIEFyZ3VtZW50SW5mbzxUPgotICAgIHsKLSAgICAgICAgcHVibGljIEFyZ3VtZW50SW5mbyhUIHZhbCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWUgPSB2YWw7Ci0gICAgICAgIH0KK3B1YmxpYyBjbGFzcyBBcmd1bWVudEluZm88VD4geworICBwdWJsaWMgQXJndW1lbnRJbmZvKFQgdmFsKSB7CisgICAgVmFsdWUgPSB2YWw7CisgIH0KIAotICAgICAgICBwdWJsaWMgVCBWYWx1ZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgcHVibGljIFQgVmFsdWUgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CiAKLSAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorICBwdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CiAKLSAgICAgICAgcHVibGljIEFyZ3VtZW50SW5mbzxUPiBOYW1lZChzdHJpbmcgYXJnTmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgTmFtZSA9IGFyZ05hbWU7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotICAgIH0KKyAgcHVibGljIEFyZ3VtZW50SW5mbzxUPiBOYW1lZChzdHJpbmcgYXJnTmFtZSkgeworICAgIE5hbWUgPSBhcmdOYW1lOworICAgIHJldHVybiB0aGlzOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvVXRpbGl0aWVzL0V4dGVuc2lvbk1ldGhvZHMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvVXRpbGl0aWVzL0V4dGVuc2lvbk1ldGhvZHMuY3MKaW5kZXggMDQ1Zjc5My4uNzg2ZWM0ZiAxMDA2NDQKLS0tIGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9FeHRlbnNpb25NZXRob2RzLmNzCisrKyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvRXh0ZW5zaW9uTWV0aG9kcy5jcwpAQCAtMSwzMyArMSwyOSBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXMKLXsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4dGVuc2lvbk1ldGhvZHMKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBJc05vdE51bGxPckVtcHR5KHRoaXMgQXJndW1lbnRJbmZvPHN0cmluZz4gdmFsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkodmFsLlZhbHVlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24odmFsLk5hbWUgKyAiIGNhbm5vdCBiZSBudWxsIG9yIGVtcHR5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKIAotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgSXNOb3ROdWxsPFQ+KHRoaXMgQXJndW1lbnRJbmZvPFQ+IHZhbCkKLSAgICAgICAgICAgIHdoZXJlIFQgOiBjbGFzcwotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsLlZhbHVlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbih2YWwuTmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2wgSXNOdW1lcmljKHRoaXMgb2JqZWN0IG9iaikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gKG9iai5HZXRUeXBlKCkuSXNQcmltaXRpdmUgfHwgb2JqIGlzIGRvdWJsZSB8fCBvYmogaXMgZGVjaW1hbCB8fCBvYmogaXMgU3lzdGVtLkRhdGVUaW1lIHx8IG9iaiBpcyBUaW1lU3Bhbik7Ci0gICAgICAgIH0KK3B1YmxpYyBzdGF0aWMgY2xhc3MgRXh0ZW5zaW9uTWV0aG9kcyB7CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBJc05vdE51bGxPckVtcHR5KHRoaXMgQXJndW1lbnRJbmZvPHN0cmluZz4gdmFsKSB7CisgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KHZhbC5WYWx1ZSkpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbih2YWwuTmFtZSArICIgY2Fubm90IGJlIG51bGwgb3IgZW1wdHkiKTsKICAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgSXNOb3ROdWxsPFQ+KHRoaXMgQXJndW1lbnRJbmZvPFQ+IHZhbCkKKyAgICAgIHdoZXJlIFQgOiBjbGFzcyB7CisgICAgaWYgKHZhbC5WYWx1ZSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKHZhbC5OYW1lKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGJvb2wgSXNOdW1lcmljKHRoaXMgb2JqZWN0IG9iaikgeworICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKG9iai5HZXRUeXBlKCkuSXNQcmltaXRpdmUKKyAgICAgICAgICAgIHx8IG9iaiBpcyBkb3VibGUKKyAgICAgICAgICAgIHx8IG9iaiBpcyBkZWNpbWFsCisgICAgICAgICAgICB8fCBvYmogaXMgRGF0ZVRpbWUKKyAgICAgICAgICAgIHx8IG9iaiBpcyBUaW1lU3Bhbik7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvSWRQcm92aWRlci5jcyBiL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvSWRQcm92aWRlci5jcwppbmRleCA5ZGZjNmFlLi4xNWUwMmIzIDEwMDY0NAotLS0gYS9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvVXRpbGl0aWVzL0lkUHJvdmlkZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9JZFByb3ZpZGVyLmNzCkBAIC0xLDEyICsxLDUgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK++7v25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzCi17Ci0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIElkUHJvdmlkZXIKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBvYmplY3QgTmV3SWQoKTsKLSAgICB9CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSWRQcm92aWRlciB7CisgIHB1YmxpYyBhYnN0cmFjdCBvYmplY3QgTmV3SWQoKTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvSW50ZWdlcklkUHJvdmlkZXIuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvVXRpbGl0aWVzL0ludGVnZXJJZFByb3ZpZGVyLmNzCmluZGV4IDViMWIwYjEuLmQxYTM5ZjQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvSW50ZWdlcklkUHJvdmlkZXIuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9JbnRlZ2VySWRQcm92aWRlci5jcwpAQCAtMSwyMSArMSwxNCBAQAog77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXMKLXsKLSAgICBwdWJsaWMgY2xhc3MgSW50ZWdlcklkUHJvdmlkZXIgOiBJZFByb3ZpZGVyCi0gICAgewotICAgICAgICBwcml2YXRlIGludCBfbGFzdElkID0gaW50Lk1pblZhbHVlOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBvYmplY3QgTmV3SWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2xhc3RJZCA+PSBpbnQuTWF4VmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIklkUHJvdmlkZXIgcnVuIG91dCBvZiBpZDpzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gX2xhc3RJZCsrOwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgSW50ZWdlcklkUHJvdmlkZXIgOiBJZFByb3ZpZGVyIHsKKyAgcHJpdmF0ZSBpbnQgX2xhc3RJZCA9IGludC5NaW5WYWx1ZTsKKworICBwdWJsaWMgb3ZlcnJpZGUgb2JqZWN0IE5ld0lkKCkgeworICAgIGlmIChfbGFzdElkID49IGludC5NYXhWYWx1ZSkgeworICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIklkUHJvdmlkZXIgcnVuIG91dCBvZiBpZDpzIik7CiAgICAgfQorICAgIHJldHVybiBfbGFzdElkKys7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvUmVnZXhDb25zdGFudHMuY3MgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvVXRpbGl0aWVzL1JlZ2V4Q29uc3RhbnRzLmNzCmluZGV4IDZlMDA5YWEuLmRlYmEwNTggMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvUmVnZXhDb25zdGFudHMuY3MKKysrIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9SZWdleENvbnN0YW50cy5jcwpAQCAtMTMsMzYgKzEzLDM0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTMtMDMtMDEgKFByaW9yIGZpbGUgaGlzdG9yeSBvbiBodHRwczovL2dpdGh1Yi5jb20vc3dtYWwvRXhjZWxGb3JtdWxhUGFyc2VyKQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLkZvcm11bGFQYXJzaW5nLlV0aWxpdGllcwotewotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVnZXhDb25zdGFudHMKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgU2luZ2xlQ2VsbEFkZHJlc3MgPSBAIl4oKCdbXi9cXD8qXFtcXV17MSwzMX0nfFtBLVphLXpfXXsxLDMxfSkhKT9bQS1aXXsxLDN9WzEtOV17MX1bMC05XXswLDd9JCI7Ci0gICAgICAgIC8vQ2hhbmdlZCBKSyAyNi8yLTIwMTMKLSAgICAgICAgcHVibGljIGNvbnN0IHN0cmluZyBFeGNlbEFkZHJlc3MgPSBAIl4oKCdbXi9cXD8qXFtcXV17MSwzMX0nfFtBLVphLXpfXXsxLDMxfSkhKT9bXCRdezAsMX0oW0EtWl18W0EtWl17MSwzfVtcJF17MCwxfVsxLTldezF9WzAtOV17MCw3fSkoXDooezAsMX1bQS1aXXxbQS1aXXsxLDN9W1wkXXswLDF9WzEtOV17MX1bMC05XXswLDd9KSl7MCwxfSQiOwotICAgICAgICAvL3B1YmxpYyBjb25zdCBzdHJpbmcgRXhjZWxBZGRyZXNzID0gQCJeKFtcJF17MCwxfShbQS1aXXsxLDN9W1wkXXswLDF9WzAtOV17MSw3fSkoXDooW1wkXXswLDF9W0EtWl17MSwzfVtcJF17MCwxfVswLTldezEsN30pezAsMX0pfChbXCRdezAsMX1bQS1aXXsxLDN9XDpbXCRdezAsMX1bQS1aXXsxLDN9KXwoW1wkXXswLDF9WzAtOV17MSw3fVw6W1wkXXswLDF9WzAtOV17MSw3fSkpJCI7Ci0gICAgICAgIHB1YmxpYyBjb25zdCBzdHJpbmcgQm9vbGVhbiA9IEAiXih0cnVlfGZhbHNlKSQiOwotICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIERlY2ltYWwgPSBAIl5bMC05XStcLlswLTldKyQiOwotICAgICAgICBwdWJsaWMgY29uc3Qgc3RyaW5nIEludGVnZXIgPSBAIl5bMC05XSskIjsKLSAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXM7CisKK3B1YmxpYyBzdGF0aWMgY2xhc3MgUmVnZXhDb25zdGFudHMgeworICBwdWJsaWMgY29uc3Qgc3RyaW5nIFNpbmdsZUNlbGxBZGRyZXNzID0KKyAgICAgIEAiXigoJ1teL1xcPypcW1xdXXsxLDMxfSd8W0EtWmEtel9dezEsMzF9KSEpP1tBLVpdezEsM31bMS05XXsxfVswLTldezAsN30kIjsKKworICAvL0NoYW5nZWQgSksgMjYvMi0yMDEzCisgIHB1YmxpYyBjb25zdCBzdHJpbmcgRXhjZWxBZGRyZXNzID0KKyAgICAgIEAiXigoJ1teL1xcPypcW1xdXXsxLDMxfSd8W0EtWmEtel9dezEsMzF9KSEpP1tcJF17MCwxfShbQS1aXXxbQS1aXXsxLDN9W1wkXXswLDF9WzEtOV17MX1bMC05XXswLDd9KShcOih7MCwxfVtBLVpdfFtBLVpdezEsM31bXCRdezAsMX1bMS05XXsxfVswLTldezAsN30pKXswLDF9JCI7CisKKyAgLy9wdWJsaWMgY29uc3Qgc3RyaW5nIEV4Y2VsQWRkcmVzcyA9IEAiXihbXCRdezAsMX0oW0EtWl17MSwzfVtcJF17MCwxfVswLTldezEsN30pKFw6KFtcJF17MCwxfVtBLVpdezEsM31bXCRdezAsMX1bMC05XXsxLDd9KXswLDF9KXwoW1wkXXswLDF9W0EtWl17MSwzfVw6W1wkXXswLDF9W0EtWl17MSwzfSl8KFtcJF17MCwxfVswLTldezEsN31cOltcJF17MCwxfVswLTldezEsN30pKSQiOworICBwdWJsaWMgY29uc3Qgc3RyaW5nIEJvb2xlYW4gPSAiXih0cnVlfGZhbHNlKSQiOworICBwdWJsaWMgY29uc3Qgc3RyaW5nIERlY2ltYWwgPSBAIl5bMC05XStcLlswLTldKyQiOworICBwdWJsaWMgY29uc3Qgc3RyaW5nIEludGVnZXIgPSAiXlswLTldKyQiOwogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9SZXF1aXJlLmNzIGIvRVBQbHVzL0Zvcm11bGFQYXJzaW5nL1V0aWxpdGllcy9SZXF1aXJlLmNzCmluZGV4IDQ0M2VlNTAuLjM1ZDUzY2QgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9Gb3JtdWxhUGFyc2luZy9VdGlsaXRpZXMvUmVxdWlyZS5jcworKysgYi9FUFBsdXMvRm9ybXVsYVBhcnNpbmcvVXRpbGl0aWVzL1JlcXVpcmUuY3MKQEAgLTEsMTUgKzEsNyBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0Owor77u/bmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuVXRpbGl0aWVzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5VdGlsaXRpZXMKLXsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlcXVpcmUKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQXJndW1lbnRJbmZvPFQ+IFRoYXQ8VD4oVCBhcmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJndW1lbnRJbmZvPFQ+KGFyZyk7Ci0gICAgICAgIH0KLSAgICB9CitwdWJsaWMgc3RhdGljIGNsYXNzIFJlcXVpcmUgeworICBwdWJsaWMgc3RhdGljIEFyZ3VtZW50SW5mbzxUPiBUaGF0PFQ+KFQgYXJnKSB7CisgICAgcmV0dXJuIG5ldyhhcmcpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvSVJhbmdlSUQuY3MgYi9FUFBsdXMvSVJhbmdlSUQuY3MKaW5kZXggNmM5NjUyNC4uOGVhZDIxZCAxMDA2NDQKLS0tIGEvRVBQbHVzL0lSYW5nZUlELmNzCisrKyBiL0VQUGx1cy9JUmFuZ2VJRC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsNDIgKzEzLDMzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbiAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMC0wMi0wNAogICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIElkIGZyb20gYSBjZWxsLCBjb2x1bW4gb3Igcm93LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJmYWNlIElSYW5nZUlECi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGlzIGlzIHRoZSBpZCBmb3IgYSBjZWxsLCByb3cgb3IgY29sdW1uLgotICAgICAgICAvLy8gVGhlIGlkIGlzIGEgY29tcG9zaXQgb2YgdGhlIFNoZWV0SUQsIHRoZSByb3cgbnVtYmVyIGFuZCB0aGUgY29sdW1uIG51bWJlci4KLSAgICAgICAgLy8vIEJpdCAxLTE0IFNoZWV0SUQsIEJpdCAxNS0yOCBDb2x1bW4gbnVtYmVyICgwIGlmIGVudGlyZSBjb2x1bW4pLCBCaXQgMjktIFJvdyBudW1iZXIgKDAgaWYgZW50aXJlIHJvdykuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHVsb25nIFJhbmdlSUQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgc2V0OwotICAgICAgICB9Ci0gICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWw7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBJZCBmcm9tIGEgY2VsbCwgY29sdW1uIG9yIHJvdy4KKy8vLyA8L3N1bW1hcnk+CitpbnRlcm5hbCBpbnRlcmZhY2UgSVJhbmdlSWQgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGlzIGlzIHRoZSBpZCBmb3IgYSBjZWxsLCByb3cgb3IgY29sdW1uLgorICAvLy8gVGhlIGlkIGlzIGEgY29tcG9zaXQgb2YgdGhlIFNoZWV0SUQsIHRoZSByb3cgbnVtYmVyIGFuZCB0aGUgY29sdW1uIG51bWJlci4KKyAgLy8vIEJpdCAxLTE0IFNoZWV0SUQsIEJpdCAxNS0yOCBDb2x1bW4gbnVtYmVyICgwIGlmIGVudGlyZSBjb2x1bW4pLCBCaXQgMjktIFJvdyBudW1iZXIgKDAgaWYgZW50aXJlIHJvdykuCisgIC8vLyA8L3N1bW1hcnk+CisgIHVsb25nIFJhbmdlSUQgeyBnZXQ7IHNldDsgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL09mZmljZVByb3BlcnRpZXMuY3MgYi9FUFBsdXMvT2ZmaWNlUHJvcGVydGllcy5jcwppbmRleCBkOWU4M2JhLi42MmRmN2U1IDEwMDY0NAotLS0gYS9FUFBsdXMvT2ZmaWNlUHJvcGVydGllcy5jcworKysgYi9FUFBsdXMvT2ZmaWNlUHJvcGVydGllcy5jcwpAQCAtMTMsMTcgKzEzLDE3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBL77+9bGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQpAQCAtMzEsNTE4ICszMSw0NDggQEAKICAqIEphbiBL77+9bGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNwogICogUmF6aXEgWW9yayAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgQ3JlYXRlZCAmIE1vZGlmaWVkICAgIDIwMTQtMDgtMjAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgU3lzdGVtLklPOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uSU87Cit1c2luZyBTeXN0ZW0uWG1sOwordXNpbmcgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmc7CiB1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBwcm9wZXJ0aWVzIGJhZyBvZiB0aGUgcGFja2FnZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBPZmZpY2VQcm9wZXJ0aWVzIDogWG1sSGVscGVyCi0gICAgewotICAgICAgICAjcmVnaW9uIFByaXZhdGUgUHJvcGVydGllcwotICAgICAgICBwcml2YXRlIFhtbERvY3VtZW50IF94bWxQcm9wZXJ0aWVzQ29yZTsKLSAgICAgICAgcHJpdmF0ZSBYbWxEb2N1bWVudCBfeG1sUHJvcGVydGllc0V4dGVuZGVkOwotICAgICAgICBwcml2YXRlIFhtbERvY3VtZW50IF94bWxQcm9wZXJ0aWVzQ3VzdG9tOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWw7CiAKLSAgICAgICAgcHJpdmF0ZSBVcmkgX3VyaVByb3BlcnRpZXNDb3JlID0gbmV3IFVyaSgiL2RvY1Byb3BzL2NvcmUueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSk7Ci0gICAgICAgIHByaXZhdGUgVXJpIF91cmlQcm9wZXJ0aWVzRXh0ZW5kZWQgPSBuZXcgVXJpKCIvZG9jUHJvcHMvYXBwLnhtbCIsIFVyaUtpbmQuUmVsYXRpdmUpOwotICAgICAgICBwcml2YXRlIFVyaSBfdXJpUHJvcGVydGllc0N1c3RvbSA9IG5ldyBVcmkoIi9kb2NQcm9wcy9jdXN0b20ueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSk7CisvLy8gPHN1bW1hcnk+CisvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBwcm9wZXJ0aWVzIGJhZyBvZiB0aGUgcGFja2FnZQorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBzZWFsZWQgY2xhc3MgT2ZmaWNlUHJvcGVydGllcyA6IFhtbEhlbHBlciB7CisgIHByaXZhdGUgWG1sRG9jdW1lbnQgX3htbFByb3BlcnRpZXNDb3JlOworICBwcml2YXRlIFhtbERvY3VtZW50IF94bWxQcm9wZXJ0aWVzRXh0ZW5kZWQ7CisgIHByaXZhdGUgWG1sRG9jdW1lbnQgX3htbFByb3BlcnRpZXNDdXN0b207CiAKLSAgICAgICAgWG1sSGVscGVyIF9jb3JlSGVscGVyOwotICAgICAgICBYbWxIZWxwZXIgX2V4dGVuZGVkSGVscGVyOwotICAgICAgICBYbWxIZWxwZXIgX2N1c3RvbUhlbHBlcjsKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFBhY2thZ2UgX3BhY2thZ2U7Ci0gICAgICAgICNlbmRyZWdpb24KKyAgcHJpdmF0ZSBVcmkgX3VyaVByb3BlcnRpZXNDb3JlID0gbmV3KCIvZG9jUHJvcHMvY29yZS54bWwiLCBVcmlLaW5kLlJlbGF0aXZlKTsKKyAgcHJpdmF0ZSBVcmkgX3VyaVByb3BlcnRpZXNFeHRlbmRlZCA9IG5ldygiL2RvY1Byb3BzL2FwcC54bWwiLCBVcmlLaW5kLlJlbGF0aXZlKTsKKyAgcHJpdmF0ZSBVcmkgX3VyaVByb3BlcnRpZXNDdXN0b20gPSBuZXcoIi9kb2NQcm9wcy9jdXN0b20ueG1sIiwgVXJpS2luZC5SZWxhdGl2ZSk7CiAKLSAgICAgICAgI3JlZ2lvbiBFeGNlbFByb3BlcnRpZXMgQ29uc3RydWN0b3IKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIGFsbCB0aGUgb2ZmaWNlIGRvY3VtZW50IHByb3BlcnRpZXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFja2FnZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJucyI+PC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgT2ZmaWNlUHJvcGVydGllcyhFeGNlbFBhY2thZ2UgcGFja2FnZSwgWG1sTmFtZXNwYWNlTWFuYWdlciBucykgOgotICAgICAgICAgICAgYmFzZShucykKLSAgICAgICAgewotICAgICAgICAgICAgX3BhY2thZ2UgPSBwYWNrYWdlOworICBwcml2YXRlIFhtbEhlbHBlciBfY29yZUhlbHBlcjsKKyAgcHJpdmF0ZSBYbWxIZWxwZXIgX2V4dGVuZGVkSGVscGVyOworICBwcml2YXRlIFhtbEhlbHBlciBfY3VzdG9tSGVscGVyOworICBwcml2YXRlIEV4Y2VsUGFja2FnZSBfcGFja2FnZTsKIAotICAgICAgICAgICAgX2NvcmVIZWxwZXIgPSBYbWxIZWxwZXJGYWN0b3J5LkNyZWF0ZShucywgQ29yZVByb3BlcnRpZXNYbWwuU2VsZWN0U2luZ2xlTm9kZSgiY3A6Y29yZVByb3BlcnRpZXMiLCBOYW1lU3BhY2VNYW5hZ2VyKSk7Ci0gICAgICAgICAgICBfZXh0ZW5kZWRIZWxwZXIgPSBYbWxIZWxwZXJGYWN0b3J5LkNyZWF0ZShucywgRXh0ZW5kZWRQcm9wZXJ0aWVzWG1sKTsKLSAgICAgICAgICAgIF9jdXN0b21IZWxwZXIgPSBYbWxIZWxwZXJGYWN0b3J5LkNyZWF0ZShucywgQ3VzdG9tUHJvcGVydGllc1htbCk7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byBhbGwgdGhlIG9mZmljZSBkb2N1bWVudCBwcm9wZXJ0aWVzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InBhY2thZ2UiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibnMiPjwvcGFyYW0+CisgIGludGVybmFsIE9mZmljZVByb3BlcnRpZXMoRXhjZWxQYWNrYWdlIHBhY2thZ2UsIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMpCisgICAgICA6IGJhc2UobnMpIHsKKyAgICBfcGFja2FnZSA9IHBhY2thZ2U7CiAKLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgICNyZWdpb24gQ29yZVByb3BlcnRpZXNYbWwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBYTUwgZG9jdW1lbnQgdGhhdCBob2xkcyBhbGwgdGhlIGNvZGUgCi0gICAgICAgIC8vLyBkb2N1bWVudCBwcm9wZXJ0aWVzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgWG1sRG9jdW1lbnQgQ29yZVByb3BlcnRpZXNYbWwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF94bWxQcm9wZXJ0aWVzQ29yZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHhtbCA9IHN0cmluZy5Gb3JtYXQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiID8+PGNwOmNvcmVQcm9wZXJ0aWVzIHhtbG5zOmNwPVwiezB9XCIgeG1sbnM6ZGM9XCJ7MX1cIiB4bWxuczpkY3Rlcm1zPVwiezJ9XCIgeG1sbnM6ZGNtaXR5cGU9XCJ7M31cIiB4bWxuczp4c2k9XCJ7NH1cIj48L2NwOmNvcmVQcm9wZXJ0aWVzPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBFeGNlbFBhY2thZ2Uuc2NoZW1hQ29yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5zY2hlbWFEYywKLSAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5zY2hlbWFEY1Rlcm1zLAotICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLnNjaGVtYURjbWlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLnNjaGVtYVhzaSk7CisgICAgX2NvcmVIZWxwZXIgPSBYbWxIZWxwZXJGYWN0b3J5LkNyZWF0ZSgKKyAgICAgICAgbnMsCisgICAgICAgIENvcmVQcm9wZXJ0aWVzWG1sLlNlbGVjdFNpbmdsZU5vZGUoImNwOmNvcmVQcm9wZXJ0aWVzIiwgTmFtZVNwYWNlTWFuYWdlcikpOworICAgIF9leHRlbmRlZEhlbHBlciA9IFhtbEhlbHBlckZhY3RvcnkuQ3JlYXRlKG5zLCBFeHRlbmRlZFByb3BlcnRpZXNYbWwpOworICAgIF9jdXN0b21IZWxwZXIgPSBYbWxIZWxwZXJGYWN0b3J5LkNyZWF0ZShucywgQ3VzdG9tUHJvcGVydGllc1htbCk7CisgIH0KIAotICAgICAgICAgICAgICAgICAgICBfeG1sUHJvcGVydGllc0NvcmUgPSBHZXRYbWxEb2N1bWVudCh4bWwsIF91cmlQcm9wZXJ0aWVzQ29yZSwgQCJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtcGFja2FnZS5jb3JlLXByb3BlcnRpZXMreG1sIiwgQCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMvbWV0YWRhdGEvY29yZS1wcm9wZXJ0aWVzIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAoX3htbFByb3BlcnRpZXNDb3JlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFhNTCBkb2N1bWVudCB0aGF0IGhvbGRzIGFsbCB0aGUgY29kZQorICAvLy8gZG9jdW1lbnQgcHJvcGVydGllcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIFhtbERvY3VtZW50IENvcmVQcm9wZXJ0aWVzWG1sIHsKKyAgICBnZXQgeworICAgICAgaWYgKF94bWxQcm9wZXJ0aWVzQ29yZSA9PSBudWxsKSB7CisgICAgICAgIHN0cmluZyB4bWwgPSBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiID8+PGNwOmNvcmVQcm9wZXJ0aWVzIHhtbG5zOmNwPVwiezB9XCIgeG1sbnM6ZGM9XCJ7MX1cIiB4bWxuczpkY3Rlcm1zPVwiezJ9XCIgeG1sbnM6ZGNtaXR5cGU9XCJ7M31cIiB4bWxuczp4c2k9XCJ7NH1cIj48L2NwOmNvcmVQcm9wZXJ0aWVzPiIsCisgICAgICAgICAgICBFeGNlbFBhY2thZ2UuX3NjaGVtYUNvcmUsCisgICAgICAgICAgICBFeGNlbFBhY2thZ2UuX3NjaGVtYURjLAorICAgICAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFEY1Rlcm1zLAorICAgICAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFEY21pVHlwZSwKKyAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5fc2NoZW1hWHNpKTsKIAotICAgICAgICBwcml2YXRlIFhtbERvY3VtZW50IEdldFhtbERvY3VtZW50KHN0cmluZyBzdGFydFhtbCwgVXJpIHVyaSwgc3RyaW5nIGNvbnRlbnRUeXBlLCBzdHJpbmcgcmVsYXRpb25zaGlwKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxEb2N1bWVudCB4bWxEb2M7Ci0gICAgICAgICAgICBpZiAoX3BhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKHVyaSkpCi0gICAgICAgICAgICAgICAgeG1sRG9jID0gX3BhY2thZ2UuR2V0WG1sRnJvbVVyaSh1cmkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhtbERvYyA9IG5ldyBYbWxEb2N1bWVudCgpOwotICAgICAgICAgICAgICAgIHhtbERvYy5Mb2FkWG1sKHN0YXJ0WG1sKTsKLQotICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHRoZSBwYXJ0IGFuZCBhZGQgdG8gdGhlIHBhY2thZ2UKLSAgICAgICAgICAgICAgICBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgcGFydCA9IF9wYWNrYWdlLlBhY2thZ2UuQ3JlYXRlUGFydCh1cmksIGNvbnRlbnRUeXBlKTsKLQotICAgICAgICAgICAgICAgIC8vIFNhdmUgaXQgdG8gdGhlIHBhY2thZ2UKLSAgICAgICAgICAgICAgICBTdHJlYW1Xcml0ZXIgc3RyZWFtID0gbmV3IFN0cmVhbVdyaXRlcihwYXJ0LkdldFN0cmVhbShGaWxlTW9kZS5DcmVhdGUsIEZpbGVBY2Nlc3MuV3JpdGUpKTsKLSAgICAgICAgICAgICAgICB4bWxEb2MuU2F2ZShzdHJlYW0pOwotICAgICAgICAgICAgICAgIC8vc3RyZWFtLkNsb3NlKCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBjcmVhdGUgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHRoZSB3b3JrYm9vayBhbmQgdGhlIG5ldyBzaGFyZWQgc3RyaW5ncyBwYXJ0Ci0gICAgICAgICAgICAgICAgX3BhY2thZ2UuUGFja2FnZS5DcmVhdGVSZWxhdGlvbnNoaXAoVXJpSGVscGVyLkdldFJlbGF0aXZlVXJpKG5ldyBVcmkoIi94bCIsIFVyaUtpbmQuUmVsYXRpdmUpLCB1cmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgcmVsYXRpb25zaGlwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB4bWxEb2M7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAjcmVnaW9uIENvcmUgUHJvcGVydGllcwotICAgICAgICBjb25zdCBzdHJpbmcgVGl0bGVQYXRoID0gImRjOnRpdGxlIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0cy9zZXRzIHRoZSB0aXRsZSBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGNvcmUgcHJvcGVydHkpCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVGl0bGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9jb3JlSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoVGl0bGVQYXRoKTsgfQotICAgICAgICAgICAgc2V0IHsgX2NvcmVIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhUaXRsZVBhdGgsIHZhbHVlKTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3Qgc3RyaW5nIFN1YmplY3RQYXRoID0gImRjOnN1YmplY3QiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzL3NldHMgdGhlIHN1YmplY3QgcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50IChjb3JlIHByb3BlcnR5KQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIFN1YmplY3QKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9jb3JlSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoU3ViamVjdFBhdGgpOyB9Ci0gICAgICAgICAgICBzZXQgeyBfY29yZUhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKFN1YmplY3RQYXRoLCB2YWx1ZSk7IH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHN0cmluZyBBdXRob3JQYXRoID0gImRjOmNyZWF0b3IiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzL3NldHMgdGhlIGF1dGhvciBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGNvcmUgcHJvcGVydHkpCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgQXV0aG9yCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfY29yZUhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKEF1dGhvclBhdGgpOyB9Ci0gICAgICAgICAgICBzZXQgeyBfY29yZUhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKEF1dGhvclBhdGgsIHZhbHVlKTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3Qgc3RyaW5nIENvbW1lbnRzUGF0aCA9ICJkYzpkZXNjcmlwdGlvbiI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldHMvc2V0cyB0aGUgY29tbWVudHMgcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50IChjb3JlIHByb3BlcnR5KQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIENvbW1lbnRzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfY29yZUhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKENvbW1lbnRzUGF0aCk7IH0KLSAgICAgICAgICAgIHNldCB7IF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoQ29tbWVudHNQYXRoLCB2YWx1ZSk7IH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHN0cmluZyBLZXl3b3Jkc1BhdGggPSAiY3A6a2V5d29yZHMiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzL3NldHMgdGhlIGtleXdvcmRzIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoY29yZSBwcm9wZXJ0eSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBLZXl3b3JkcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX2NvcmVIZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhLZXl3b3Jkc1BhdGgpOyB9Ci0gICAgICAgICAgICBzZXQgeyBfY29yZUhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKEtleXdvcmRzUGF0aCwgdmFsdWUpOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBzdHJpbmcgTGFzdE1vZGlmaWVkQnlQYXRoID0gImNwOmxhc3RNb2RpZmllZEJ5IjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0cy9zZXRzIHRoZSBsYXN0TW9kaWZpZWRCeSBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGNvcmUgcHJvcGVydHkpCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgTGFzdE1vZGlmaWVkQnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9jb3JlSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoTGFzdE1vZGlmaWVkQnlQYXRoKTsgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NvcmVIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhMYXN0TW9kaWZpZWRCeVBhdGgsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHN0cmluZyBMYXN0UHJpbnRlZFBhdGggPSAiY3A6bGFzdFByaW50ZWQiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzL3NldHMgdGhlIGxhc3RQcmludGVkIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoY29yZSBwcm9wZXJ0eSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBMYXN0UHJpbnRlZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX2NvcmVIZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhMYXN0UHJpbnRlZFBhdGgpOyB9Ci0gICAgICAgICAgICBzZXQgeyBfY29yZUhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKExhc3RQcmludGVkUGF0aCwgdmFsdWUpOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBzdHJpbmcgQ3JlYXRlZFBhdGggPSAiZGN0ZXJtczpjcmVhdGVkIjsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0JICAgIC8vLyBHZXRzL3NldHMgdGhlIGNyZWF0ZWQgcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50IChjb3JlIHByb3BlcnR5KQotCSAgICAvLy8gPC9zdW1tYXJ5PgotCSAgICBwdWJsaWMgRGF0ZVRpbWUgQ3JlYXRlZAotCSAgICB7Ci0JICAgICAgICBnZXQKLQkgICAgICAgIHsKLQkgICAgICAgICAgICBEYXRlVGltZSBkYXRlOwotCSAgICAgICAgICAgIHJldHVybiBEYXRlVGltZS5UcnlQYXJzZShfY29yZUhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKENyZWF0ZWRQYXRoKSwgb3V0IGRhdGUpID8gZGF0ZSA6IERhdGVUaW1lLk1pblZhbHVlOwotCSAgICAgICAgfQotCSAgICAgICAgc2V0Ci0JICAgICAgICB7Ci0JICAgICAgICAgICAgdmFyIGRhdGVTdHJpbmcgPSB2YWx1ZS5Ub1VuaXZlcnNhbFRpbWUoKS5Ub1N0cmluZygicyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgIloiOwotCSAgICAgICAgICAgIF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoQ3JlYXRlZFBhdGgsIGRhdGVTdHJpbmcpOwotICAgICAgICAgICAgICAgIF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoQ3JlYXRlZFBhdGggKyAiL0B4c2k6dHlwZSIsICJkY3Rlcm1zOlczQ0RURiIpOwotCSAgICAgICAgfQotCSAgICB9Ci0KLSAgICAgICAgY29uc3Qgc3RyaW5nIENhdGVnb3J5UGF0aCA9ICJjcDpjYXRlZ29yeSI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldHMvc2V0cyB0aGUgY2F0ZWdvcnkgcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50IChjb3JlIHByb3BlcnR5KQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIENhdGVnb3J5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfY29yZUhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKENhdGVnb3J5UGF0aCk7IH0KLSAgICAgICAgICAgIHNldCB7IF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoQ2F0ZWdvcnlQYXRoLCB2YWx1ZSk7IH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHN0cmluZyBDb250ZW50U3RhdHVzUGF0aCA9ICJjcDpjb250ZW50U3RhdHVzIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0cy9zZXRzIHRoZSBzdGF0dXMgcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50IChjb3JlIHByb3BlcnR5KQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIFN0YXR1cwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX2NvcmVIZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhDb250ZW50U3RhdHVzUGF0aCk7IH0KLSAgICAgICAgICAgIHNldCB7IF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoQ29udGVudFN0YXR1c1BhdGgsIHZhbHVlKTsgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAjcmVnaW9uIEV4dGVuZGVkIFByb3BlcnRpZXMKLSAgICAgICAgI3JlZ2lvbiBFeHRlbmRlZFByb3BlcnRpZXNYbWwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBYTUwgZG9jdW1lbnQgdGhhdCBob2xkcyB0aGUgZXh0ZW5kZWQgcHJvcGVydGllcyBvZiB0aGUgZG9jdW1lbnQgKGFwcC54bWwpCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBYbWxEb2N1bWVudCBFeHRlbmRlZFByb3BlcnRpZXNYbWwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF94bWxQcm9wZXJ0aWVzRXh0ZW5kZWQgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF94bWxQcm9wZXJ0aWVzRXh0ZW5kZWQgPSBHZXRYbWxEb2N1bWVudChzdHJpbmcuRm9ybWF0KCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIiA/PjxQcm9wZXJ0aWVzIHhtbG5zOnZ0PVwiezB9XCIgeG1sbnM9XCJ7MX1cIj48L1Byb3BlcnRpZXM+IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbFBhY2thZ2Uuc2NoZW1hVnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLnNjaGVtYUV4dGVuZGVkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIF91cmlQcm9wZXJ0aWVzRXh0ZW5kZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBAImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5leHRlbmRlZC1wcm9wZXJ0aWVzK3htbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBAImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvZXh0ZW5kZWQtcHJvcGVydGllcyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gKF94bWxQcm9wZXJ0aWVzRXh0ZW5kZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICBjb25zdCBzdHJpbmcgQXBwbGljYXRpb25QYXRoID0gInhwOlByb3BlcnRpZXMveHA6QXBwbGljYXRpb24iOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzL1NldCB0aGUgQXBwbGljYXRpb24gcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50IChleHRlbmRlZCBwcm9wZXJ0eSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBBcHBsaWNhdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gX2V4dGVuZGVkSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoQXBwbGljYXRpb25QYXRoKTsgfQotICAgICAgICAgICAgc2V0IHsgX2V4dGVuZGVkSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoQXBwbGljYXRpb25QYXRoLCB2YWx1ZSk7IH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHN0cmluZyBIeXBlcmxpbmtCYXNlUGF0aCA9ICJ4cDpQcm9wZXJ0aWVzL3hwOkh5cGVybGlua0Jhc2UiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzL3NldHMgdGhlIEh5cGVybGlua0Jhc2UgcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50IChleHRlbmRlZCBwcm9wZXJ0eSkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIFVyaSBIeXBlcmxpbmtCYXNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBuZXcgVXJpKF9leHRlbmRlZEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKEh5cGVybGlua0Jhc2VQYXRoKSwgVXJpS2luZC5BYnNvbHV0ZSk7IH0KLSAgICAgICAgICAgIHNldCB7IF9leHRlbmRlZEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKEh5cGVybGlua0Jhc2VQYXRoLCB2YWx1ZS5BYnNvbHV0ZVVyaSk7IH0KLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHN0cmluZyBBcHBWZXJzaW9uUGF0aCA9ICJ4cDpQcm9wZXJ0aWVzL3hwOkFwcFZlcnNpb24iOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzL1NldCB0aGUgQXBwVmVyc2lvbiBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGV4dGVuZGVkIHByb3BlcnR5KQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIEFwcFZlcnNpb24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9leHRlbmRlZEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKEFwcFZlcnNpb25QYXRoKTsgfQotICAgICAgICAgICAgc2V0IHsgX2V4dGVuZGVkSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoQXBwVmVyc2lvblBhdGgsIHZhbHVlKTsgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBDb21wYW55UGF0aCA9ICJ4cDpQcm9wZXJ0aWVzL3hwOkNvbXBhbnkiOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldHMvc2V0cyB0aGUgQ29tcGFueSBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGV4dGVuZGVkIHByb3BlcnR5KQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIENvbXBhbnkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9leHRlbmRlZEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKENvbXBhbnlQYXRoKTsgfQotICAgICAgICAgICAgc2V0IHsgX2V4dGVuZGVkSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoQ29tcGFueVBhdGgsIHZhbHVlKTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3Qgc3RyaW5nIE1hbmFnZXJQYXRoID0gInhwOlByb3BlcnRpZXMveHA6TWFuYWdlciI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldHMvc2V0cyB0aGUgTWFuYWdlciBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGV4dGVuZGVkIHByb3BlcnR5KQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIE1hbmFnZXIKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIF9leHRlbmRlZEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKE1hbmFnZXJQYXRoKTsgfQotICAgICAgICAgICAgc2V0IHsgX2V4dGVuZGVkSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoTWFuYWdlclBhdGgsIHZhbHVlKTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3Qgc3RyaW5nIE1vZGlmaWVkUGF0aCA9ICJkY3Rlcm1zOm1vZGlmaWVkIjsKLQkgICAgLy8vIDxzdW1tYXJ5PgotCSAgICAvLy8gR2V0cy9zZXRzIHRoZSBtb2RpZmllZCBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGNvcmUgcHJvcGVydHkpCi0JICAgIC8vLyA8L3N1bW1hcnk+Ci0JICAgIHB1YmxpYyBEYXRlVGltZSBNb2RpZmllZAotCSAgICB7Ci0JICAgICAgICBnZXQKLQkgICAgICAgIHsKLQkgICAgICAgICAgICBEYXRlVGltZSBkYXRlOwotCSAgICAgICAgICAgIHJldHVybiBEYXRlVGltZS5UcnlQYXJzZShfY29yZUhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKE1vZGlmaWVkUGF0aCksIG91dCBkYXRlKSA/IGRhdGUgOiBEYXRlVGltZS5NaW5WYWx1ZTsKLQkgICAgICAgIH0KLQkgICAgICAgIHNldAotCSAgICAgICAgewotCSAgICAgICAgICAgIHZhciBkYXRlU3RyaW5nID0gdmFsdWUuVG9Vbml2ZXJzYWxUaW1lKCkuVG9TdHJpbmcoInMiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArICJaIjsKLQkgICAgICAgICAgICBfY29yZUhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKE1vZGlmaWVkUGF0aCwgZGF0ZVN0cmluZyk7Ci0gICAgICAgICAgICAgICAgX2NvcmVIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhNb2RpZmllZFBhdGggKyAiL0B4c2k6dHlwZSIsICJkY3Rlcm1zOlczQ0RURiIpOwotCSAgICAgICAgfQotCSAgICB9Ci0KLSAgICAgICAgI3JlZ2lvbiBHZXQgYW5kIFNldCBFeHRlbmRlZCBQcm9wZXJ0aWVzCi0gICAgICAgIHByaXZhdGUgc3RyaW5nIEdldEV4dGVuZGVkUHJvcGVydHlWYWx1ZShzdHJpbmcgcHJvcGVydHlOYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcgcmV0VmFsdWUgPSBudWxsOwotICAgICAgICAgICAgc3RyaW5nIHNlYXJjaFN0cmluZyA9IHN0cmluZy5Gb3JtYXQoInhwOlByb3BlcnRpZXMveHA6ezB9IiwgcHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIFhtbE5vZGUgbm9kZSA9IEV4dGVuZGVkUHJvcGVydGllc1htbC5TZWxlY3RTaW5nbGVOb2RlKHNlYXJjaFN0cmluZywgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldFZhbHVlID0gbm9kZS5Jbm5lclRleHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0VmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgI3JlZ2lvbiBDdXN0b20gUHJvcGVydGllcwotCi0gICAgICAgICNyZWdpb24gQ3VzdG9tUHJvcGVydGllc1htbAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFhNTCBkb2N1bWVudCB3aGljaCBob2xkcyB0aGUgZG9jdW1lbnQncyBjdXN0b20gcHJvcGVydGllcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgWG1sRG9jdW1lbnQgQ3VzdG9tUHJvcGVydGllc1htbAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3htbFByb3BlcnRpZXNDdXN0b20gPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF94bWxQcm9wZXJ0aWVzQ3VzdG9tID0gR2V0WG1sRG9jdW1lbnQoc3RyaW5nLkZvcm1hdCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCIgPz48UHJvcGVydGllcyB4bWxuczp2dD1cInswfVwiIHhtbG5zPVwiezF9XCI+PC9Qcm9wZXJ0aWVzPiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLnNjaGVtYVZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5zY2hlbWFDdXN0b20pLAotICAgICAgICAgICAgICAgICAgICAgICAgIF91cmlQcm9wZXJ0aWVzQ3VzdG9tLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBAImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5jdXN0b20tcHJvcGVydGllcyt4bWwiLAotICAgICAgICAgICAgICAgICAgICAgICAgIEAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL29mZmljZURvY3VtZW50LzIwMDYvcmVsYXRpb25zaGlwcy9jdXN0b20tcHJvcGVydGllcyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gKF94bWxQcm9wZXJ0aWVzQ3VzdG9tKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgI3JlZ2lvbiBHZXQgYW5kIFNldCBDdXN0b20gUHJvcGVydGllcwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzIHRoZSB2YWx1ZSBvZiBhIGN1c3RvbSBwcm9wZXJ0eQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb3BlcnR5TmFtZSI+VGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eTwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIG9iamVjdCBHZXRDdXN0b21Qcm9wZXJ0eVZhbHVlKHN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBzZWFyY2hTdHJpbmcgPSBzdHJpbmcuRm9ybWF0KCJjdHA6UHJvcGVydGllcy9jdHA6cHJvcGVydHlbQG5hbWU9J3swfSddIiwgcHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIFhtbEVsZW1lbnQgbm9kZSA9IEN1c3RvbVByb3BlcnRpZXNYbWwuU2VsZWN0U2luZ2xlTm9kZShzZWFyY2hTdHJpbmcsIE5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7Ci0gICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyB2YWx1ZSA9IG5vZGUuTGFzdENoaWxkLklubmVyVGV4dDsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vZGUuTGFzdENoaWxkLkxvY2FsTmFtZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgImZpbGV0aW1lIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lIGR0OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERhdGVUaW1lLlRyeVBhcnNlKHZhbHVlLCBvdXQgZHQpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiaTQiOgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKHZhbHVlLCBvdXQgaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgInI4IjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvdWJsZS5UcnlQYXJzZSh2YWx1ZSwgTnVtYmVyU3R5bGVzLkFueSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IGQpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlICJib29sIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAidHJ1ZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PSAiZmFsc2UiKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBbGxvd3MgeW91IHRvIHNldCB0aGUgdmFsdWUgb2YgYSBjdXJyZW50IGN1c3RvbSBwcm9wZXJ0eSBvciBjcmVhdGUgeW91ciBvd24gY3VzdG9tIHByb3BlcnR5LiAgCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icHJvcGVydHlOYW1lIj5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZShzdHJpbmcgcHJvcGVydHlOYW1lLCBvYmplY3QgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbE5vZGUgYWxsUHJvcHMgPSBDdXN0b21Qcm9wZXJ0aWVzWG1sLlNlbGVjdFNpbmdsZU5vZGUoQCJjdHA6UHJvcGVydGllcyIsIE5hbWVTcGFjZU1hbmFnZXIpOwotCi0gICAgICAgICAgICB2YXIgcHJvcCA9IHN0cmluZy5Gb3JtYXQoImN0cDpQcm9wZXJ0aWVzL2N0cDpwcm9wZXJ0eVtAbmFtZT0nezB9J10iLCBwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgWG1sRWxlbWVudCBub2RlID0gQ3VzdG9tUHJvcGVydGllc1htbC5TZWxlY3RTaW5nbGVOb2RlKHByb3AsIE5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7Ci0gICAgICAgICAgICBpZiAobm9kZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBwaWQ7Ci0gICAgICAgICAgICAgICAgdmFyIE1heE5vZGUgPSBDdXN0b21Qcm9wZXJ0aWVzWG1sLlNlbGVjdFNpbmdsZU5vZGUoImN0cDpQcm9wZXJ0aWVzL2N0cDpwcm9wZXJ0eVtub3QoQHBpZCA8PSBwcmVjZWRpbmctc2libGluZzo6Y3RwOnByb3BlcnR5L0BwaWQpIGFuZCBub3QoQHBpZCA8PSBmb2xsb3dpbmctc2libGluZzo6Y3RwOnByb3BlcnR5L0BwaWQpXSIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIGlmIChNYXhOb2RlID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwaWQgPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWludC5UcnlQYXJzZShNYXhOb2RlLkF0dHJpYnV0ZXNbInBpZCJdLlZhbHVlLCBvdXQgcGlkKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcGlkID0gMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwaWQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbm9kZSA9IEN1c3RvbVByb3BlcnRpZXNYbWwuQ3JlYXRlRWxlbWVudCgicHJvcGVydHkiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hQ3VzdG9tKTsKLSAgICAgICAgICAgICAgICBub2RlLlNldEF0dHJpYnV0ZSgiZm10aWQiLCAie0Q1Q0RENTA1LTJFOUMtMTAxQi05Mzk3LTA4MDAyQjJDRjlBRX0iKTsKLSAgICAgICAgICAgICAgICBub2RlLlNldEF0dHJpYnV0ZSgicGlkIiwgcGlkLlRvU3RyaW5nKCkpOyAgLy8gY3VzdG9tIHByb3BlcnR5IHBpZAotICAgICAgICAgICAgICAgIG5vZGUuU2V0QXR0cmlidXRlKCJuYW1lIiwgcHJvcGVydHlOYW1lKTsKLQotICAgICAgICAgICAgICAgIGFsbFByb3BzLkFwcGVuZENoaWxkKG5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdoaWxlIChub2RlLkNoaWxkTm9kZXMuQ291bnQgPiAwKSBub2RlLlJlbW92ZUNoaWxkKG5vZGUuQ2hpbGROb2Rlc1swXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBYbWxFbGVtZW50IHZhbHVlRWxlbTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSBpcyBib29sKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlRWxlbSA9IEN1c3RvbVByb3BlcnRpZXNYbWwuQ3JlYXRlRWxlbWVudCgidnQiLCAiYm9vbCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFWdCk7Ci0gICAgICAgICAgICAgICAgdmFsdWVFbGVtLklubmVyVGV4dCA9IHZhbHVlLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGlzIERhdGVUaW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlRWxlbSA9IEN1c3RvbVByb3BlcnRpZXNYbWwuQ3JlYXRlRWxlbWVudCgidnQiLCAiZmlsZXRpbWUiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hVnQpOwotICAgICAgICAgICAgICAgIHZhbHVlRWxlbS5Jbm5lclRleHQgPSAoKERhdGVUaW1lKXZhbHVlKS5BZGRIb3VycygtMSkuVG9TdHJpbmcoInl5eXktTU0tZGRUSEg6bW06c3NaIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSBpcyBzaG9ydCB8fCB2YWx1ZSBpcyBpbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsdWVFbGVtID0gQ3VzdG9tUHJvcGVydGllc1htbC5DcmVhdGVFbGVtZW50KCJ2dCIsICJpNCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFWdCk7Ci0gICAgICAgICAgICAgICAgdmFsdWVFbGVtLklubmVyVGV4dCA9IHZhbHVlLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSBpcyBkb3VibGUgfHwgdmFsdWUgaXMgZGVjaW1hbCB8fCB2YWx1ZSBpcyBmbG9hdCB8fCB2YWx1ZSBpcyBsb25nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlRWxlbSA9IEN1c3RvbVByb3BlcnRpZXNYbWwuQ3JlYXRlRWxlbWVudCgidnQiLCAicjgiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hVnQpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpcyBkb3VibGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZUVsZW0uSW5uZXJUZXh0ID0gKChkb3VibGUpdmFsdWUpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSBpcyBmbG9hdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlRWxlbS5Jbm5lclRleHQgPSAoKGZsb2F0KXZhbHVlKS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaXMgZGVjaW1hbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlRWxlbS5Jbm5lclRleHQgPSAoKGRlY2ltYWwpdmFsdWUpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZUVsZW0uSW5uZXJUZXh0ID0gdmFsdWUuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsdWVFbGVtID0gQ3VzdG9tUHJvcGVydGllc1htbC5DcmVhdGVFbGVtZW50KCJ2dCIsICJscHdzdHIiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hVnQpOwotICAgICAgICAgICAgICAgIHZhbHVlRWxlbS5Jbm5lclRleHQgPSB2YWx1ZS5Ub1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9kZS5BcHBlbmRDaGlsZCh2YWx1ZUVsZW0pOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gU2F2ZQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTYXZlcyB0aGUgZG9jdW1lbnQgcHJvcGVydGllcyBiYWNrIHRvIHRoZSBwYWNrYWdlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCB2b2lkIFNhdmUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3htbFByb3BlcnRpZXNDb3JlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3BhY2thZ2UuU2F2ZVBhcnQoX3VyaVByb3BlcnRpZXNDb3JlLCBfeG1sUHJvcGVydGllc0NvcmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKF94bWxQcm9wZXJ0aWVzRXh0ZW5kZWQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcGFja2FnZS5TYXZlUGFydChfdXJpUHJvcGVydGllc0V4dGVuZGVkLCBfeG1sUHJvcGVydGllc0V4dGVuZGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChfeG1sUHJvcGVydGllc0N1c3RvbSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9wYWNrYWdlLlNhdmVQYXJ0KF91cmlQcm9wZXJ0aWVzQ3VzdG9tLCBfeG1sUHJvcGVydGllc0N1c3RvbSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0KKyAgICAgICAgX3htbFByb3BlcnRpZXNDb3JlID0gR2V0WG1sRG9jdW1lbnQoCisgICAgICAgICAgICB4bWwsCisgICAgICAgICAgICBfdXJpUHJvcGVydGllc0NvcmUsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLXBhY2thZ2UuY29yZS1wcm9wZXJ0aWVzK3htbCIsCisgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzL21ldGFkYXRhL2NvcmUtcHJvcGVydGllcyIpOworICAgICAgfQorICAgICAgcmV0dXJuIChfeG1sUHJvcGVydGllc0NvcmUpOwogICAgIH0KKyAgfQorCisgIHByaXZhdGUgWG1sRG9jdW1lbnQgR2V0WG1sRG9jdW1lbnQoCisgICAgICBzdHJpbmcgc3RhcnRYbWwsCisgICAgICBVcmkgdXJpLAorICAgICAgc3RyaW5nIGNvbnRlbnRUeXBlLAorICAgICAgc3RyaW5nIHJlbGF0aW9uc2hpcCkgeworICAgIFhtbERvY3VtZW50IHhtbERvYzsKKyAgICBpZiAoX3BhY2thZ2UuUGFja2FnZS5QYXJ0RXhpc3RzKHVyaSkpIHsKKyAgICAgIHhtbERvYyA9IF9wYWNrYWdlLkdldFhtbEZyb21VcmkodXJpKTsKKyAgICB9IGVsc2UgeworICAgICAgeG1sRG9jID0gbmV3KCk7CisgICAgICB4bWxEb2MuTG9hZFhtbChzdGFydFhtbCk7CisKKyAgICAgIC8vIENyZWF0ZSBhIHRoZSBwYXJ0IGFuZCBhZGQgdG8gdGhlIHBhY2thZ2UKKyAgICAgIFppcFBhY2thZ2VQYXJ0IHBhcnQgPSBfcGFja2FnZS5QYWNrYWdlLkNyZWF0ZVBhcnQodXJpLCBjb250ZW50VHlwZSk7CisKKyAgICAgIC8vIFNhdmUgaXQgdG8gdGhlIHBhY2thZ2UKKyAgICAgIFN0cmVhbVdyaXRlciBzdHJlYW0gPSBuZXcgU3RyZWFtV3JpdGVyKHBhcnQuR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5Xcml0ZSkpOworICAgICAgeG1sRG9jLlNhdmUoc3RyZWFtKTsKKyAgICAgIC8vc3RyZWFtLkNsb3NlKCk7CisKKyAgICAgIC8vIGNyZWF0ZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIHdvcmtib29rIGFuZCB0aGUgbmV3IHNoYXJlZCBzdHJpbmdzIHBhcnQKKyAgICAgIF9wYWNrYWdlLlBhY2thZ2UuQ3JlYXRlUmVsYXRpb25zaGlwKAorICAgICAgICAgIFVyaUhlbHBlci5HZXRSZWxhdGl2ZVVyaShuZXcoIi94bCIsIFVyaUtpbmQuUmVsYXRpdmUpLCB1cmkpLAorICAgICAgICAgIFRhcmdldE1vZGUuSW50ZXJuYWwsCisgICAgICAgICAgcmVsYXRpb25zaGlwKTsKKyAgICB9CisgICAgcmV0dXJuIHhtbERvYzsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF90aXRsZVBhdGggPSAiZGM6dGl0bGUiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldHMvc2V0cyB0aGUgdGl0bGUgcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50IChjb3JlIHByb3BlcnR5KQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIFRpdGxlIHsKKyAgICBnZXQgPT4gX2NvcmVIZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhfdGl0bGVQYXRoKTsKKyAgICBzZXQgPT4gX2NvcmVIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhfdGl0bGVQYXRoLCB2YWx1ZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfc3ViamVjdFBhdGggPSAiZGM6c3ViamVjdCI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0cy9zZXRzIHRoZSBzdWJqZWN0IHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoY29yZSBwcm9wZXJ0eSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBTdWJqZWN0IHsKKyAgICBnZXQgPT4gX2NvcmVIZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhfc3ViamVjdFBhdGgpOworICAgIHNldCA9PiBfY29yZUhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKF9zdWJqZWN0UGF0aCwgdmFsdWUpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2F1dGhvclBhdGggPSAiZGM6Y3JlYXRvciI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0cy9zZXRzIHRoZSBhdXRob3IgcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50IChjb3JlIHByb3BlcnR5KQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIEF1dGhvciB7CisgICAgZ2V0ID0+IF9jb3JlSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoX2F1dGhvclBhdGgpOworICAgIHNldCA9PiBfY29yZUhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKF9hdXRob3JQYXRoLCB2YWx1ZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfY29tbWVudHNQYXRoID0gImRjOmRlc2NyaXB0aW9uIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXRzL3NldHMgdGhlIGNvbW1lbnRzIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoY29yZSBwcm9wZXJ0eSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBDb21tZW50cyB7CisgICAgZ2V0ID0+IF9jb3JlSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoX2NvbW1lbnRzUGF0aCk7CisgICAgc2V0ID0+IF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoX2NvbW1lbnRzUGF0aCwgdmFsdWUpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2tleXdvcmRzUGF0aCA9ICJjcDprZXl3b3JkcyI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0cy9zZXRzIHRoZSBrZXl3b3JkcyBwcm9wZXJ0eSBvZiB0aGUgZG9jdW1lbnQgKGNvcmUgcHJvcGVydHkpCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgS2V5d29yZHMgeworICAgIGdldCA9PiBfY29yZUhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKF9rZXl3b3Jkc1BhdGgpOworICAgIHNldCA9PiBfY29yZUhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKF9rZXl3b3Jkc1BhdGgsIHZhbHVlKTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9sYXN0TW9kaWZpZWRCeVBhdGggPSAiY3A6bGFzdE1vZGlmaWVkQnkiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldHMvc2V0cyB0aGUgbGFzdE1vZGlmaWVkQnkgcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50IChjb3JlIHByb3BlcnR5KQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIExhc3RNb2RpZmllZEJ5IHsKKyAgICBnZXQgPT4gX2NvcmVIZWxwZXIuR2V0WG1sTm9kZVN0cmluZyhfbGFzdE1vZGlmaWVkQnlQYXRoKTsKKyAgICBzZXQgPT4gX2NvcmVIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhfbGFzdE1vZGlmaWVkQnlQYXRoLCB2YWx1ZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfbGFzdFByaW50ZWRQYXRoID0gImNwOmxhc3RQcmludGVkIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXRzL3NldHMgdGhlIGxhc3RQcmludGVkIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoY29yZSBwcm9wZXJ0eSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBMYXN0UHJpbnRlZCB7CisgICAgZ2V0ID0+IF9jb3JlSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoX2xhc3RQcmludGVkUGF0aCk7CisgICAgc2V0ID0+IF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoX2xhc3RQcmludGVkUGF0aCwgdmFsdWUpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2NyZWF0ZWRQYXRoID0gImRjdGVybXM6Y3JlYXRlZCI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0cy9zZXRzIHRoZSBjcmVhdGVkIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoY29yZSBwcm9wZXJ0eSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIERhdGVUaW1lIENyZWF0ZWQgeworICAgIGdldCB7CisgICAgICBEYXRlVGltZSBkYXRlOworICAgICAgcmV0dXJuIERhdGVUaW1lLlRyeVBhcnNlKF9jb3JlSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoX2NyZWF0ZWRQYXRoKSwgb3V0IGRhdGUpCisgICAgICAgICAgPyBkYXRlCisgICAgICAgICAgOiBEYXRlVGltZS5NaW5WYWx1ZTsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHZhciBkYXRlU3RyaW5nID0gdmFsdWUuVG9Vbml2ZXJzYWxUaW1lKCkuVG9TdHJpbmcoInMiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArICJaIjsKKyAgICAgIF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoX2NyZWF0ZWRQYXRoLCBkYXRlU3RyaW5nKTsKKyAgICAgIF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoX2NyZWF0ZWRQYXRoICsgIi9AeHNpOnR5cGUiLCAiZGN0ZXJtczpXM0NEVEYiKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfY2F0ZWdvcnlQYXRoID0gImNwOmNhdGVnb3J5IjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXRzL3NldHMgdGhlIGNhdGVnb3J5IHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoY29yZSBwcm9wZXJ0eSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBDYXRlZ29yeSB7CisgICAgZ2V0ID0+IF9jb3JlSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoX2NhdGVnb3J5UGF0aCk7CisgICAgc2V0ID0+IF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoX2NhdGVnb3J5UGF0aCwgdmFsdWUpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2NvbnRlbnRTdGF0dXNQYXRoID0gImNwOmNvbnRlbnRTdGF0dXMiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldHMvc2V0cyB0aGUgc3RhdHVzIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoY29yZSBwcm9wZXJ0eSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBTdGF0dXMgeworICAgIGdldCA9PiBfY29yZUhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKF9jb250ZW50U3RhdHVzUGF0aCk7CisgICAgc2V0ID0+IF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoX2NvbnRlbnRTdGF0dXNQYXRoLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFhNTCBkb2N1bWVudCB0aGF0IGhvbGRzIHRoZSBleHRlbmRlZCBwcm9wZXJ0aWVzIG9mIHRoZSBkb2N1bWVudCAoYXBwLnhtbCkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIFhtbERvY3VtZW50IEV4dGVuZGVkUHJvcGVydGllc1htbCB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfeG1sUHJvcGVydGllc0V4dGVuZGVkID09IG51bGwpIHsKKyAgICAgICAgX3htbFByb3BlcnRpZXNFeHRlbmRlZCA9IEdldFhtbERvY3VtZW50KAorICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCIgPz48UHJvcGVydGllcyB4bWxuczp2dD1cInswfVwiIHhtbG5zPVwiezF9XCI+PC9Qcm9wZXJ0aWVzPiIsCisgICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFWdCwKKyAgICAgICAgICAgICAgICBFeGNlbFBhY2thZ2UuX3NjaGVtYUV4dGVuZGVkKSwKKyAgICAgICAgICAgIF91cmlQcm9wZXJ0aWVzRXh0ZW5kZWQsCisgICAgICAgICAgICAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LmV4dGVuZGVkLXByb3BlcnRpZXMreG1sIiwKKyAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL2V4dGVuZGVkLXByb3BlcnRpZXMiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAoX3htbFByb3BlcnRpZXNFeHRlbmRlZCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2FwcGxpY2F0aW9uUGF0aCA9ICJ4cDpQcm9wZXJ0aWVzL3hwOkFwcGxpY2F0aW9uIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXRzL1NldCB0aGUgQXBwbGljYXRpb24gcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50IChleHRlbmRlZCBwcm9wZXJ0eSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBBcHBsaWNhdGlvbiB7CisgICAgZ2V0ID0+IF9leHRlbmRlZEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKF9hcHBsaWNhdGlvblBhdGgpOworICAgIHNldCA9PiBfZXh0ZW5kZWRIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhfYXBwbGljYXRpb25QYXRoLCB2YWx1ZSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfaHlwZXJsaW5rQmFzZVBhdGggPSAieHA6UHJvcGVydGllcy94cDpIeXBlcmxpbmtCYXNlIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXRzL3NldHMgdGhlIEh5cGVybGlua0Jhc2UgcHJvcGVydHkgb2YgdGhlIGRvY3VtZW50IChleHRlbmRlZCBwcm9wZXJ0eSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIFVyaSBIeXBlcmxpbmtCYXNlIHsKKyAgICBnZXQgPT4gbmV3KF9leHRlbmRlZEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKF9oeXBlcmxpbmtCYXNlUGF0aCksIFVyaUtpbmQuQWJzb2x1dGUpOworICAgIHNldCA9PiBfZXh0ZW5kZWRIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhfaHlwZXJsaW5rQmFzZVBhdGgsIHZhbHVlLkFic29sdXRlVXJpKTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9hcHBWZXJzaW9uUGF0aCA9ICJ4cDpQcm9wZXJ0aWVzL3hwOkFwcFZlcnNpb24iOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldHMvU2V0IHRoZSBBcHBWZXJzaW9uIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoZXh0ZW5kZWQgcHJvcGVydHkpCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgQXBwVmVyc2lvbiB7CisgICAgZ2V0ID0+IF9leHRlbmRlZEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKF9hcHBWZXJzaW9uUGF0aCk7CisgICAgc2V0ID0+IF9leHRlbmRlZEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKF9hcHBWZXJzaW9uUGF0aCwgdmFsdWUpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2NvbXBhbnlQYXRoID0gInhwOlByb3BlcnRpZXMveHA6Q29tcGFueSI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0cy9zZXRzIHRoZSBDb21wYW55IHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoZXh0ZW5kZWQgcHJvcGVydHkpCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgQ29tcGFueSB7CisgICAgZ2V0ID0+IF9leHRlbmRlZEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKF9jb21wYW55UGF0aCk7CisgICAgc2V0ID0+IF9leHRlbmRlZEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKF9jb21wYW55UGF0aCwgdmFsdWUpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX21hbmFnZXJQYXRoID0gInhwOlByb3BlcnRpZXMveHA6TWFuYWdlciI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gR2V0cy9zZXRzIHRoZSBNYW5hZ2VyIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoZXh0ZW5kZWQgcHJvcGVydHkpCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgTWFuYWdlciB7CisgICAgZ2V0ID0+IF9leHRlbmRlZEhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKF9tYW5hZ2VyUGF0aCk7CisgICAgc2V0ID0+IF9leHRlbmRlZEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKF9tYW5hZ2VyUGF0aCwgdmFsdWUpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX21vZGlmaWVkUGF0aCA9ICJkY3Rlcm1zOm1vZGlmaWVkIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHZXRzL3NldHMgdGhlIG1vZGlmaWVkIHByb3BlcnR5IG9mIHRoZSBkb2N1bWVudCAoY29yZSBwcm9wZXJ0eSkKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIERhdGVUaW1lIE1vZGlmaWVkIHsKKyAgICBnZXQgeworICAgICAgRGF0ZVRpbWUgZGF0ZTsKKyAgICAgIHJldHVybiBEYXRlVGltZS5UcnlQYXJzZShfY29yZUhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKF9tb2RpZmllZFBhdGgpLCBvdXQgZGF0ZSkKKyAgICAgICAgICA/IGRhdGUKKyAgICAgICAgICA6IERhdGVUaW1lLk1pblZhbHVlOworICAgIH0KKyAgICBzZXQgeworICAgICAgdmFyIGRhdGVTdHJpbmcgPSB2YWx1ZS5Ub1VuaXZlcnNhbFRpbWUoKS5Ub1N0cmluZygicyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgIloiOworICAgICAgX2NvcmVIZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhfbW9kaWZpZWRQYXRoLCBkYXRlU3RyaW5nKTsKKyAgICAgIF9jb3JlSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoX21vZGlmaWVkUGF0aCArICIvQHhzaTp0eXBlIiwgImRjdGVybXM6VzNDRFRGIik7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdHJpbmcgR2V0RXh0ZW5kZWRQcm9wZXJ0eVZhbHVlKHN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICBzdHJpbmcgcmV0VmFsdWUgPSBudWxsOworICAgIHN0cmluZyBzZWFyY2hTdHJpbmcgPSBzdHJpbmcuRm9ybWF0KCJ4cDpQcm9wZXJ0aWVzL3hwOnswfSIsIHByb3BlcnR5TmFtZSk7CisgICAgWG1sTm9kZSBub2RlID0gRXh0ZW5kZWRQcm9wZXJ0aWVzWG1sLlNlbGVjdFNpbmdsZU5vZGUoc2VhcmNoU3RyaW5nLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICByZXRWYWx1ZSA9IG5vZGUuSW5uZXJUZXh0OworICAgIH0KKyAgICByZXR1cm4gcmV0VmFsdWU7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFhNTCBkb2N1bWVudCB3aGljaCBob2xkcyB0aGUgZG9jdW1lbnQncyBjdXN0b20gcHJvcGVydGllcworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgWG1sRG9jdW1lbnQgQ3VzdG9tUHJvcGVydGllc1htbCB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfeG1sUHJvcGVydGllc0N1c3RvbSA9PSBudWxsKSB7CisgICAgICAgIF94bWxQcm9wZXJ0aWVzQ3VzdG9tID0gR2V0WG1sRG9jdW1lbnQoCisgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIiA/PjxQcm9wZXJ0aWVzIHhtbG5zOnZ0PVwiezB9XCIgeG1sbnM9XCJ7MX1cIj48L1Byb3BlcnRpZXM+IiwKKyAgICAgICAgICAgICAgICBFeGNlbFBhY2thZ2UuX3NjaGVtYVZ0LAorICAgICAgICAgICAgICAgIEV4Y2VsUGFja2FnZS5fc2NoZW1hQ3VzdG9tKSwKKyAgICAgICAgICAgIF91cmlQcm9wZXJ0aWVzQ3VzdG9tLAorICAgICAgICAgICAgImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5jdXN0b20tcHJvcGVydGllcyt4bWwiLAorICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvY3VzdG9tLXByb3BlcnRpZXMiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAoX3htbFByb3BlcnRpZXNDdXN0b20pOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldHMgdGhlIHZhbHVlIG9mIGEgY3VzdG9tIHByb3BlcnR5CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJvcGVydHlOYW1lIj5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHByb3BlcnR5PC9yZXR1cm5zPgorICBwdWJsaWMgb2JqZWN0IEdldEN1c3RvbVByb3BlcnR5VmFsdWUoc3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgIHN0cmluZyBzZWFyY2hTdHJpbmcgPSBzdHJpbmcuRm9ybWF0KCJjdHA6UHJvcGVydGllcy9jdHA6cHJvcGVydHlbQG5hbWU9J3swfSddIiwgcHJvcGVydHlOYW1lKTsKKyAgICBYbWxFbGVtZW50IG5vZGUgPQorICAgICAgICBDdXN0b21Qcm9wZXJ0aWVzWG1sLlNlbGVjdFNpbmdsZU5vZGUoc2VhcmNoU3RyaW5nLCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgIGlmIChub2RlICE9IG51bGwpIHsKKyAgICAgIHN0cmluZyB2YWx1ZSA9IG5vZGUuTGFzdENoaWxkLklubmVyVGV4dDsKKyAgICAgIHN3aXRjaCAobm9kZS5MYXN0Q2hpbGQuTG9jYWxOYW1lKSB7CisgICAgICAgIGNhc2UgImZpbGV0aW1lIjoKKyAgICAgICAgICBEYXRlVGltZSBkdDsKKyAgICAgICAgICBpZiAoRGF0ZVRpbWUuVHJ5UGFyc2UodmFsdWUsIG91dCBkdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBkdDsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGNhc2UgImk0IjoKKyAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKHZhbHVlLCBvdXQgaSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgY2FzZSAicjgiOgorICAgICAgICAgIGRvdWJsZSBkOworICAgICAgICAgIGlmIChkb3VibGUuVHJ5UGFyc2UodmFsdWUsIE51bWJlclN0eWxlcy5BbnksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCBkKSkgeworICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICBjYXNlICJib29sIjoKKyAgICAgICAgICBpZiAodmFsdWUgPT0gInRydWUiKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHZhbHVlID09ICJmYWxzZSIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFsbG93cyB5b3UgdG8gc2V0IHRoZSB2YWx1ZSBvZiBhIGN1cnJlbnQgY3VzdG9tIHByb3BlcnR5IG9yIGNyZWF0ZSB5b3VyIG93biBjdXN0b20gcHJvcGVydHkuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icHJvcGVydHlOYW1lIj5UaGUgbmFtZSBvZiB0aGUgcHJvcGVydHk8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5PC9wYXJhbT4KKyAgcHVibGljIHZvaWQgU2V0Q3VzdG9tUHJvcGVydHlWYWx1ZShzdHJpbmcgcHJvcGVydHlOYW1lLCBvYmplY3QgdmFsdWUpIHsKKyAgICBYbWxOb2RlIGFsbFByb3BzID0gQ3VzdG9tUHJvcGVydGllc1htbC5TZWxlY3RTaW5nbGVOb2RlKCJjdHA6UHJvcGVydGllcyIsIE5hbWVTcGFjZU1hbmFnZXIpOworCisgICAgdmFyIHByb3AgPSBzdHJpbmcuRm9ybWF0KCJjdHA6UHJvcGVydGllcy9jdHA6cHJvcGVydHlbQG5hbWU9J3swfSddIiwgcHJvcGVydHlOYW1lKTsKKyAgICBYbWxFbGVtZW50IG5vZGUgPSBDdXN0b21Qcm9wZXJ0aWVzWG1sLlNlbGVjdFNpbmdsZU5vZGUocHJvcCwgTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKyAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICBpbnQgcGlkOworICAgICAgdmFyIG1heE5vZGUgPSBDdXN0b21Qcm9wZXJ0aWVzWG1sLlNlbGVjdFNpbmdsZU5vZGUoCisgICAgICAgICAgImN0cDpQcm9wZXJ0aWVzL2N0cDpwcm9wZXJ0eVtub3QoQHBpZCA8PSBwcmVjZWRpbmctc2libGluZzo6Y3RwOnByb3BlcnR5L0BwaWQpIGFuZCBub3QoQHBpZCA8PSBmb2xsb3dpbmctc2libGluZzo6Y3RwOnByb3BlcnR5L0BwaWQpXSIsCisgICAgICAgICAgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICBpZiAobWF4Tm9kZSA9PSBudWxsKSB7CisgICAgICAgIHBpZCA9IDI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWludC5UcnlQYXJzZShtYXhOb2RlLkF0dHJpYnV0ZXNbInBpZCJdLlZhbHVlLCBvdXQgcGlkKSkgeworICAgICAgICAgIHBpZCA9IDI7CisgICAgICAgIH0KKyAgICAgICAgcGlkKys7CisgICAgICB9CisgICAgICBub2RlID0gQ3VzdG9tUHJvcGVydGllc1htbC5DcmVhdGVFbGVtZW50KCJwcm9wZXJ0eSIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hQ3VzdG9tKTsKKyAgICAgIG5vZGUuU2V0QXR0cmlidXRlKCJmbXRpZCIsICJ7RDVDREQ1MDUtMkU5Qy0xMDFCLTkzOTctMDgwMDJCMkNGOUFFfSIpOworICAgICAgbm9kZS5TZXRBdHRyaWJ1dGUoInBpZCIsIHBpZC5Ub1N0cmluZygpKTsgLy8gY3VzdG9tIHByb3BlcnR5IHBpZAorICAgICAgbm9kZS5TZXRBdHRyaWJ1dGUoIm5hbWUiLCBwcm9wZXJ0eU5hbWUpOworCisgICAgICBhbGxQcm9wcy5BcHBlbmRDaGlsZChub2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgd2hpbGUgKG5vZGUuQ2hpbGROb2Rlcy5Db3VudCA+IDApIHsKKyAgICAgICAgbm9kZS5SZW1vdmVDaGlsZChub2RlLkNoaWxkTm9kZXNbMF0pOworICAgICAgfQorICAgIH0KKyAgICBYbWxFbGVtZW50IHZhbHVlRWxlbTsKKyAgICBpZiAodmFsdWUgaXMgYm9vbCkgeworICAgICAgdmFsdWVFbGVtID0gQ3VzdG9tUHJvcGVydGllc1htbC5DcmVhdGVFbGVtZW50KCJ2dCIsICJib29sIiwgRXhjZWxQYWNrYWdlLl9zY2hlbWFWdCk7CisgICAgICB2YWx1ZUVsZW0uSW5uZXJUZXh0ID0gdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgRGF0ZVRpbWUpIHsKKyAgICAgIHZhbHVlRWxlbSA9IEN1c3RvbVByb3BlcnRpZXNYbWwuQ3JlYXRlRWxlbWVudCgidnQiLCAiZmlsZXRpbWUiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYVZ0KTsKKyAgICAgIHZhbHVlRWxlbS5Jbm5lclRleHQgPSAoKERhdGVUaW1lKXZhbHVlKS5BZGRIb3VycygtMSkuVG9TdHJpbmcoInl5eXktTU0tZGRUSEg6bW06c3NaIik7CisgICAgfSBlbHNlIGlmICh2YWx1ZSBpcyBzaG9ydCB8fCB2YWx1ZSBpcyBpbnQpIHsKKyAgICAgIHZhbHVlRWxlbSA9IEN1c3RvbVByb3BlcnRpZXNYbWwuQ3JlYXRlRWxlbWVudCgidnQiLCAiaTQiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYVZ0KTsKKyAgICAgIHZhbHVlRWxlbS5Jbm5lclRleHQgPSB2YWx1ZS5Ub1N0cmluZygpOworICAgIH0gZWxzZSBpZiAodmFsdWUgaXMgZG91YmxlIHx8IHZhbHVlIGlzIGRlY2ltYWwgfHwgdmFsdWUgaXMgZmxvYXQgfHwgdmFsdWUgaXMgbG9uZykgeworICAgICAgdmFsdWVFbGVtID0gQ3VzdG9tUHJvcGVydGllc1htbC5DcmVhdGVFbGVtZW50KCJ2dCIsICJyOCIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hVnQpOworICAgICAgaWYgKHZhbHVlIGlzIGRvdWJsZSkgeworICAgICAgICB2YWx1ZUVsZW0uSW5uZXJUZXh0ID0gKChkb3VibGUpdmFsdWUpLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpcyBmbG9hdCkgeworICAgICAgICB2YWx1ZUVsZW0uSW5uZXJUZXh0ID0gKChmbG9hdCl2YWx1ZSkuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICB9IGVsc2UgaWYgKHZhbHVlIGlzIGRlY2ltYWwpIHsKKyAgICAgICAgdmFsdWVFbGVtLklubmVyVGV4dCA9ICgoZGVjaW1hbCl2YWx1ZSkuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YWx1ZUVsZW0uSW5uZXJUZXh0ID0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdmFsdWVFbGVtID0gQ3VzdG9tUHJvcGVydGllc1htbC5DcmVhdGVFbGVtZW50KCJ2dCIsICJscHdzdHIiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYVZ0KTsKKyAgICAgIHZhbHVlRWxlbS5Jbm5lclRleHQgPSB2YWx1ZS5Ub1N0cmluZygpOworICAgIH0KKyAgICBub2RlLkFwcGVuZENoaWxkKHZhbHVlRWxlbSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTYXZlcyB0aGUgZG9jdW1lbnQgcHJvcGVydGllcyBiYWNrIHRvIHRoZSBwYWNrYWdlLgorICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCB2b2lkIFNhdmUoKSB7CisgICAgaWYgKF94bWxQcm9wZXJ0aWVzQ29yZSAhPSBudWxsKSB7CisgICAgICBfcGFja2FnZS5TYXZlUGFydChfdXJpUHJvcGVydGllc0NvcmUsIF94bWxQcm9wZXJ0aWVzQ29yZSk7CisgICAgfQorICAgIGlmIChfeG1sUHJvcGVydGllc0V4dGVuZGVkICE9IG51bGwpIHsKKyAgICAgIF9wYWNrYWdlLlNhdmVQYXJ0KF91cmlQcm9wZXJ0aWVzRXh0ZW5kZWQsIF94bWxQcm9wZXJ0aWVzRXh0ZW5kZWQpOworICAgIH0KKyAgICBpZiAoX3htbFByb3BlcnRpZXNDdXN0b20gIT0gbnVsbCkgeworICAgICAgX3BhY2thZ2UuU2F2ZVBhcnQoX3VyaVByb3BlcnRpZXNDdXN0b20sIF94bWxQcm9wZXJ0aWVzQ3VzdG9tKTsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvWmlwUGFja2FnZS5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvWmlwUGFja2FnZS5jcwppbmRleCAxMmUzNDMxLi40ZGJlZDU2IDEwMDY0NAotLS0gYS9FUFBsdXMvUGFja2FnaW5nL1ppcFBhY2thZ2UuY3MKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9aaXBQYWNrYWdlLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywzMDUgKzEzLDI3MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTI1LU9jdC0yMDEyCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uSU87CiB1c2luZyBTeXN0ZW0uSU8uQ29tcHJlc3Npb247Cit1c2luZyBTeXN0ZW0uTGlucTsKK3VzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7Ci1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmcKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFNwZWNpZmllcyB3aGV0aGVyIHRoZSB0YXJnZXQgaXMgaW5zaWRlIG9yIG91dHNpZGUgdGhlIFN5c3RlbS5JTy5QYWNrYWdpbmcuUGFja2FnZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIFRhcmdldE1vZGUKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSByZWxhdGlvbnNoaXAgcmVmZXJlbmNlcyBhIHBhcnQgdGhhdCBpcyBpbnNpZGUgdGhlIHBhY2thZ2UuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEludGVybmFsID0gMCwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHJlbGF0aW9uc2hpcCByZWZlcmVuY2VzIGEgcmVzb3VyY2UgdGhhdCBpcyBleHRlcm5hbCB0byB0aGUgcGFja2FnZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgRXh0ZXJuYWwgPSAxLAorCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmc7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBTcGVjaWZpZXMgd2hldGhlciB0aGUgdGFyZ2V0IGlzIGluc2lkZSBvciBvdXRzaWRlIHRoZSBTeXN0ZW0uSU8uUGFja2FnaW5nLlBhY2thZ2UuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gVGFyZ2V0TW9kZSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSByZWxhdGlvbnNoaXAgcmVmZXJlbmNlcyBhIHBhcnQgdGhhdCBpcyBpbnNpZGUgdGhlIHBhY2thZ2UuCisgIC8vLyA8L3N1bW1hcnk+CisgIEludGVybmFsID0gMCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgcmVsYXRpb25zaGlwIHJlZmVyZW5jZXMgYSByZXNvdXJjZSB0aGF0IGlzIGV4dGVybmFsIHRvIHRoZSBwYWNrYWdlLgorICAvLy8gPC9zdW1tYXJ5PgorICBFeHRlcm5hbCA9IDEsCit9CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBSZXByZXNlbnQgYW4gT09YTUwgWmlwIHBhY2thZ2UuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIFppcFBhY2thZ2UgOiBaaXBQYWNrYWdlUmVsYXRpb25zaGlwQmFzZSB7CisgIGludGVybmFsIGNsYXNzIENvbnRlbnRUeXBlIHsKKyAgICBpbnRlcm5hbCBzdHJpbmcgTmFtZTsKKyAgICBpbnRlcm5hbCBib29sIElzRXh0ZW5zaW9uOworICAgIGludGVybmFsIHN0cmluZyBNYXRjaDsKKworICAgIHB1YmxpYyBDb250ZW50VHlwZShzdHJpbmcgbmFtZSwgYm9vbCBpc0V4dGVuc2lvbiwgc3RyaW5nIG1hdGNoKSB7CisgICAgICBOYW1lID0gbmFtZTsKKyAgICAgIElzRXh0ZW5zaW9uID0gaXNFeHRlbnNpb247CisgICAgICBNYXRjaCA9IG1hdGNoOwogICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFJlcHJlc2VudCBhbiBPT1hNTCBaaXAgcGFja2FnZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBaaXBQYWNrYWdlIDogWmlwUGFja2FnZVJlbGF0aW9uc2hpcEJhc2UKLSAgICB7Ci0gICAgICAgIGludGVybmFsIGNsYXNzIENvbnRlbnRUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludGVybmFsIHN0cmluZyBOYW1lOwotICAgICAgICAgICAgaW50ZXJuYWwgYm9vbCBJc0V4dGVuc2lvbjsKLSAgICAgICAgICAgIGludGVybmFsIHN0cmluZyBNYXRjaDsKLSAgICAgICAgICAgIHB1YmxpYyBDb250ZW50VHlwZShzdHJpbmcgbmFtZSwgYm9vbCBpc0V4dGVuc2lvbiwgc3RyaW5nIG1hdGNoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5hbWUgPSBuYW1lOwotICAgICAgICAgICAgICAgIElzRXh0ZW5zaW9uID0gaXNFeHRlbnNpb247Ci0gICAgICAgICAgICAgICAgTWF0Y2ggPSBtYXRjaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBEaWN0aW9uYXJ5PHN0cmluZywgWmlwUGFja2FnZVBhcnQ+IFBhcnRzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBaaXBQYWNrYWdlUGFydD4oU3RyaW5nQ29tcGFyZXIuSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpOwotICAgICAgICBpbnRlcm5hbCBEaWN0aW9uYXJ5PHN0cmluZywgQ29udGVudFR5cGU+IF9jb250ZW50VHlwZXMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIENvbnRlbnRUeXBlPihTdHJpbmdDb21wYXJlci5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSk7Ci0gICAgICAgIGludGVybmFsIFppcFBhY2thZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGROZXcoKTsKLSAgICAgICAgfQorICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZE5ldygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jb250ZW50VHlwZXMuQWRkKCJ4bWwiLCBuZXcgQ29udGVudFR5cGUoRXhjZWxQYWNrYWdlLnNjaGVtYVhtbEV4dGVuc2lvbiwgdHJ1ZSwgInhtbCIpKTsKLSAgICAgICAgICAgIF9jb250ZW50VHlwZXMuQWRkKCJyZWxzIiwgbmV3IENvbnRlbnRUeXBlKEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxzRXh0ZW5zaW9uLCB0cnVlLCAicmVscyIpKTsKLSAgICAgICAgfQorICBwcml2YXRlIERpY3Rpb25hcnk8c3RyaW5nLCBaaXBQYWNrYWdlUGFydD4gUGFydHMgPSBuZXcoU3RyaW5nQ29tcGFyZXIuSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpOworICBpbnRlcm5hbCBEaWN0aW9uYXJ5PHN0cmluZywgQ29udGVudFR5cGU+IF9jb250ZW50VHlwZXMgPSBuZXcoCisgICAgICBTdHJpbmdDb21wYXJlci5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSk7CiAKLSAgICAgICAgaW50ZXJuYWwgWmlwUGFja2FnZShTdHJlYW0gc3RyZWFtKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sIGhhc0NvbnRlbnRUeXBlWG1sID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGwgfHwgc3RyZWFtLkxlbmd0aCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFkZE5ldygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciByZWxzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBaaXBBcmNoaXZlRW50cnk+KCk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtLlNlZWsoMCwgU2Vla09yaWdpbi5CZWdpbik7Ci0gICAgICAgICAgICAgICAgdXNpbmcgdmFyIHppcCA9IG5ldyBaaXBBcmNoaXZlKHN0cmVhbSwgWmlwQXJjaGl2ZU1vZGUuUmVhZCwgbGVhdmVPcGVuOiB0cnVlKTsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgZSBpbiB6aXAuRW50cmllcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlLkxlbmd0aCA+IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLkZ1bGxOYW1lIC5FcXVhbHMoIltjb250ZW50X3R5cGVzXS54bWwiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB2YXIgaW5wdXRTdHJlYW0gPSBlLk9wZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRDb250ZW50VHlwZXMoaW5wdXRTdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnRUeXBlWG1sID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGUuRnVsbE5hbWUgLkVxdWFscygiX3JlbHMvLnJlbHMiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkgCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdmFyIGlucHV0U3RyZWFtID0gZS5PcGVuKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZFJlbGF0aW9uKGlucHV0U3RyZWFtLCAiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuRnVsbE5hbWUuRW5kc1dpdGgoIi5yZWxzIiwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxzLkFkZChHZXRVcmlLZXkoZS5GdWxsTmFtZSksIGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB2YXIgaW5wdXRTdHJlYW0gPSBlLk9wZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnQgPSBuZXcgWmlwUGFja2FnZVBhcnQodGhpcywgZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQuU3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5Db3B5VG8ocGFydC5TdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0cy5BZGQoR2V0VXJpS2V5KGUuRnVsbE5hbWUpLCBwYXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHAgaW4gUGFydHMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSA9IFBhdGguR2V0RmlsZU5hbWUocC5LZXkpOwotICAgICAgICAgICAgICAgICAgICBzdHJpbmcgZXh0ZW5zaW9uID0gUGF0aC5HZXRFeHRlbnNpb24ocC5LZXkpOwotICAgICAgICAgICAgICAgICAgICBzdHJpbmcgcmVsRmlsZSA9IHN0cmluZy5Gb3JtYXQoInswfV9yZWxzL3sxfS5yZWxzIiwgcC5LZXkuU3Vic3RyaW5nKDAsIHAuS2V5Lkxlbmd0aCAtIG5hbWUuTGVuZ3RoKSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWxzLlRyeUdldFZhbHVlKHJlbEZpbGUsIG91dCB2YXIgemlwQXJjaGl2ZUVudHJ5KSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgdmFyIGlucHV0U3RyZWFtID0gemlwQXJjaGl2ZUVudHJ5Lk9wZW4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHAuVmFsdWUuUmVhZFJlbGF0aW9uKGlucHV0U3RyZWFtLCBwLlZhbHVlLlVyaS5PcmlnaW5hbFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKF9jb250ZW50VHlwZXMuVHJ5R2V0VmFsdWUocC5LZXksIG91dCB2YXIgdHlwZSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHAuVmFsdWUuQ29udGVudFR5cGUgPSB0eXBlLk5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZXh0ZW5zaW9uLkxlbmd0aCA+IDEgJiYgX2NvbnRlbnRUeXBlcy5Db250YWluc0tleShleHRlbnNpb24uU3Vic3RyaW5nKDEpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcC5WYWx1ZS5Db250ZW50VHlwZSA9IF9jb250ZW50VHlwZXNbZXh0ZW5zaW9uLlN1YnN0cmluZygxKV0uTmFtZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnRUeXBlWG1sKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWREYXRhRXhjZXB0aW9uKCJUaGUgZmlsZSBpcyBub3QgYW4gdmFsaWQgUGFja2FnZSBmaWxlLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBpbnRlcm5hbCBaaXBQYWNrYWdlKCkgeworICAgIEFkZE5ldygpOworICB9CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZENvbnRlbnRUeXBlcyhTdHJlYW0gaW5wdXRTdHJlYW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBkb2MgPSBuZXcgWG1sRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIFhtbEhlbHBlci5Mb2FkWG1sU2FmZShkb2MsIGlucHV0U3RyZWFtKTsKKyAgcHJpdmF0ZSB2b2lkIEFkZE5ldygpIHsKKyAgICBfY29udGVudFR5cGVzLkFkZCgieG1sIiwgbmV3KEV4Y2VsUGFja2FnZS5fc2NoZW1hWG1sRXh0ZW5zaW9uLCB0cnVlLCAieG1sIikpOworICAgIF9jb250ZW50VHlwZXMuQWRkKCJyZWxzIiwgbmV3KEV4Y2VsUGFja2FnZS5fc2NoZW1hUmVsc0V4dGVuc2lvbiwgdHJ1ZSwgInJlbHMiKSk7CisgIH0KIAotICAgICAgICAgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBjIGluIGRvYy5Eb2N1bWVudEVsZW1lbnQuQ2hpbGROb2RlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb250ZW50VHlwZSBjdDsKLSAgICAgICAgICAgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoYy5HZXRBdHRyaWJ1dGUoIkV4dGVuc2lvbiIpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGN0ID0gbmV3IENvbnRlbnRUeXBlKGMuR2V0QXR0cmlidXRlKCJDb250ZW50VHlwZSIpLCBmYWxzZSwgYy5HZXRBdHRyaWJ1dGUoIlBhcnROYW1lIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjdCA9IG5ldyBDb250ZW50VHlwZShjLkdldEF0dHJpYnV0ZSgiQ29udGVudFR5cGUiKSwgdHJ1ZSwgYy5HZXRBdHRyaWJ1dGUoIkV4dGVuc2lvbiIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgX2NvbnRlbnRUeXBlcy5BZGQoR2V0VXJpS2V5KGN0Lk1hdGNoKSwgY3QpOworICBpbnRlcm5hbCBaaXBQYWNrYWdlKFN0cmVhbSBzdHJlYW0pIHsKKyAgICBib29sIGhhc0NvbnRlbnRUeXBlWG1sID0gZmFsc2U7CisgICAgaWYgKHN0cmVhbSA9PSBudWxsIHx8IHN0cmVhbS5MZW5ndGggPT0gMCkgeworICAgICAgQWRkTmV3KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHZhciByZWxzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBaaXBBcmNoaXZlRW50cnk+KCk7CisgICAgICBzdHJlYW0uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKKyAgICAgIHVzaW5nIHZhciB6aXAgPSBuZXcgWmlwQXJjaGl2ZShzdHJlYW0sIFppcEFyY2hpdmVNb2RlLlJlYWQsIGxlYXZlT3BlbjogdHJ1ZSk7CisgICAgICBmb3JlYWNoICh2YXIgZSBpbiB6aXAuRW50cmllcykgeworICAgICAgICBpZiAoZS5MZW5ndGggPiAwKSB7CisgICAgICAgICAgaWYgKGUuRnVsbE5hbWUuRXF1YWxzKAorICAgICAgICAgICAgICAiW2NvbnRlbnRfdHlwZXNdLnhtbCIsCisgICAgICAgICAgICAgIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKSB7CisgICAgICAgICAgICB1c2luZyB2YXIgaW5wdXRTdHJlYW0gPSBlLk9wZW4oKTsKKyAgICAgICAgICAgIEFkZENvbnRlbnRUeXBlcyhpbnB1dFN0cmVhbSk7CisgICAgICAgICAgICBoYXNDb250ZW50VHlwZVhtbCA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIGlmIChlLkZ1bGxOYW1lLkVxdWFscygKKyAgICAgICAgICAgICAgIl9yZWxzLy5yZWxzIiwKKyAgICAgICAgICAgICAgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpIHsKKyAgICAgICAgICAgIHVzaW5nIHZhciBpbnB1dFN0cmVhbSA9IGUuT3BlbigpOworICAgICAgICAgICAgUmVhZFJlbGF0aW9uKGlucHV0U3RyZWFtLCAiIik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChlLkZ1bGxOYW1lLkVuZHNXaXRoKCIucmVscyIsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKSB7CisgICAgICAgICAgICAgIHJlbHMuQWRkKEdldFVyaUtleShlLkZ1bGxOYW1lKSwgZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICB1c2luZyB2YXIgaW5wdXRTdHJlYW0gPSBlLk9wZW4oKTsKKyAgICAgICAgICAgICAgdmFyIHBhcnQgPSBuZXcgWmlwUGFja2FnZVBhcnQodGhpcywgZSk7CisgICAgICAgICAgICAgIHBhcnQuU3RyZWFtID0gbmV3KCk7CisgICAgICAgICAgICAgIGlucHV0U3RyZWFtLkNvcHlUbyhwYXJ0LlN0cmVhbSk7CisgICAgICAgICAgICAgIFBhcnRzLkFkZChHZXRVcmlLZXkoZS5GdWxsTmFtZSksIHBhcnQpOwogICAgICAgICAgICAgfQorICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgICNyZWdpb24gTWV0aG9kcwotICAgICAgICBpbnRlcm5hbCBaaXBQYWNrYWdlUGFydCBDcmVhdGVQYXJ0KFVyaSBwYXJ0VXJpLCBzdHJpbmcgY29udGVudFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVQYXJ0KHBhcnRVcmksIGNvbnRlbnRUeXBlLCBDb21wcmVzc2lvbkxldmVsLkRlZmF1bHQpOworICAgICAgfQorICAgICAgZm9yZWFjaCAodmFyIHAgaW4gUGFydHMpIHsKKyAgICAgICAgc3RyaW5nIG5hbWUgPSBQYXRoLkdldEZpbGVOYW1lKHAuS2V5KTsKKyAgICAgICAgc3RyaW5nIGV4dGVuc2lvbiA9IFBhdGguR2V0RXh0ZW5zaW9uKHAuS2V5KTsKKyAgICAgICAgc3RyaW5nIHJlbEZpbGUgPSBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgInswfV9yZWxzL3sxfS5yZWxzIiwKKyAgICAgICAgICAgIHAuS2V5LlN1YnN0cmluZygwLCBwLktleS5MZW5ndGggLSBuYW1lLkxlbmd0aCksCisgICAgICAgICAgICBuYW1lKTsKKyAgICAgICAgaWYgKHJlbHMuVHJ5R2V0VmFsdWUocmVsRmlsZSwgb3V0IHZhciB6aXBBcmNoaXZlRW50cnkpKSB7CisgICAgICAgICAgdXNpbmcgdmFyIGlucHV0U3RyZWFtID0gemlwQXJjaGl2ZUVudHJ5Lk9wZW4oKTsKKyAgICAgICAgICBwLlZhbHVlLlJlYWRSZWxhdGlvbihpbnB1dFN0cmVhbSwgcC5WYWx1ZS5VcmkuT3JpZ2luYWxTdHJpbmcpOwogICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIFppcFBhY2thZ2VQYXJ0IENyZWF0ZVBhcnQoVXJpIHBhcnRVcmksIHN0cmluZyBjb250ZW50VHlwZSwgQ29tcHJlc3Npb25MZXZlbCBjb21wcmVzc2lvbkxldmVsKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUGFydEV4aXN0cyhwYXJ0VXJpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlBhcnQgYWxyZWFkeSBleGlzdCIpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdmFyIHBhcnQgPSBuZXcgWmlwUGFja2FnZVBhcnQodGhpcywgcGFydFVyaSwgY29udGVudFR5cGUsIGNvbXByZXNzaW9uTGV2ZWwpOwotICAgICAgICAgICAgX2NvbnRlbnRUeXBlcy5BZGQoR2V0VXJpS2V5KHBhcnQuVXJpLk9yaWdpbmFsU3RyaW5nKSwgbmV3IENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlLCBmYWxzZSwgcGFydC5VcmkuT3JpZ2luYWxTdHJpbmcpKTsKLSAgICAgICAgICAgIFBhcnRzLkFkZChHZXRVcmlLZXkocGFydC5VcmkuT3JpZ2luYWxTdHJpbmcpLCBwYXJ0KTsKLSAgICAgICAgICAgIHJldHVybiBwYXJ0OworICAgICAgICBpZiAoX2NvbnRlbnRUeXBlcy5UcnlHZXRWYWx1ZShwLktleSwgb3V0IHZhciB0eXBlKSkgeworICAgICAgICAgIHAuVmFsdWUuQ29udGVudFR5cGUgPSB0eXBlLk5hbWU7CisgICAgICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uLkxlbmd0aCA+IDEgJiYgX2NvbnRlbnRUeXBlcy5Db250YWluc0tleShleHRlbnNpb24uU3Vic3RyaW5nKDEpKSkgeworICAgICAgICAgIHAuVmFsdWUuQ29udGVudFR5cGUgPSBfY29udGVudFR5cGVzW2V4dGVuc2lvbi5TdWJzdHJpbmcoMSldLk5hbWU7CiAgICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgWmlwUGFja2FnZVBhcnQgR2V0UGFydChVcmkgcGFydFVyaSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFBhcnRFeGlzdHMocGFydFVyaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBhcnRzLlNpbmdsZSh4ID0+IHguS2V5LkVxdWFscyhHZXRVcmlLZXkocGFydFVyaS5PcmlnaW5hbFN0cmluZyksU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpLlZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiUGFydCBkb2VzIG5vdCBleGlzdC4iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgR2V0VXJpS2V5KHN0cmluZyB1cmkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyByZXQgPSB1cmk7Ci0gICAgICAgICAgICBpZiAocmV0WzBdICE9ICcvJykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXQgPSAiLyIgKyByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGJvb2wgUGFydEV4aXN0cyhVcmkgcGFydFVyaSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHVyaUtleSA9IEdldFVyaUtleShwYXJ0VXJpLk9yaWdpbmFsU3RyaW5nLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgcmV0dXJuIFBhcnRzLktleXMuQW55KHggPT4geC5FcXVhbHModXJpS2V5LCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgIGludGVybmFsIHZvaWQgRGVsZXRlUGFydChVcmkgVXJpKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZGVsTGlzdD1uZXcgTGlzdDxvYmplY3RbXT4oKTsgCi0gICAgICAgICAgICBmb3JlYWNoICh2YXIgcCBpbiBQYXJ0cy5WYWx1ZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHIgaW4gcC5HZXRSZWxhdGlvbnNoaXBzKCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoVXJpSGVscGVyLlJlc29sdmVQYXJ0VXJpKHAuVXJpLCByLlRhcmdldFVyaSkuT3JpZ2luYWxTdHJpbmcuRXF1YWxzKFVyaS5PcmlnaW5hbFN0cmluZywgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCi0gICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbExpc3QuQWRkKG5ldyBvYmplY3RbXXtyLklkLCBwfSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgbyBpbiBkZWxMaXN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgoWmlwUGFja2FnZVBhcnQpb1sxXSkuRGVsZXRlUmVsYXRpb25zaGlwKG9bMF0uVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgcmVscyA9IEdldFBhcnQoVXJpKS5HZXRSZWxhdGlvbnNoaXBzKCk7Ci0gICAgICAgICAgICB3aGlsZSAocmVscy5Db3VudCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVscy5SZW1vdmUocmVscy5GaXJzdCgpLklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbHM9bnVsbDsKLSAgICAgICAgICAgIF9jb250ZW50VHlwZXMuUmVtb3ZlKEdldFVyaUtleShVcmkuT3JpZ2luYWxTdHJpbmcpKTsKLSAgICAgICAgICAgIC8vcmVtb3ZlIGFsbCByZWxhdGlvbnMKLSAgICAgICAgICAgIFBhcnRzLlJlbW92ZShHZXRVcmlLZXkoVXJpLk9yaWdpbmFsU3RyaW5nKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCB2b2lkIFNhdmUoU3RyZWFtIHN0cmVhbSkKLSAgICAgICAgewotICAgICAgICAgICAgdXNpbmcgdmFyIHppcEFyY2hpdmUgPSBuZXcgWmlwQXJjaGl2ZShzdHJlYW0sIFppcEFyY2hpdmVNb2RlLkNyZWF0ZSwgbGVhdmVPcGVuOiB0cnVlKTsKLSAgICAgICAgICAgIC8qKioqIENvbnRlbnRUeXBlKioqKi8KLSAgICAgICAgICAgIHZhciBjb250ZW50VHlwZXNFbnRyeSA9IHppcEFyY2hpdmUuQ3JlYXRlRW50cnkoIltDb250ZW50X1R5cGVzXS54bWwiKTsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgY29udGVudFR5cGVzV3JpdGVyID0gbmV3IFN0cmVhbVdyaXRlcihjb250ZW50VHlwZXNFbnRyeS5PcGVuKCkpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlc1dyaXRlci5Xcml0ZShHZXRDb250ZW50VHlwZVhtbCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qKioqIFRvcCBSZWxzICoqKiovCi0gICAgICAgICAgICBfcmVscy5Xcml0ZVppcCh6aXBBcmNoaXZlLCAiX3JlbHNcXC5yZWxzIik7Ci0gICAgICAgICAgICBaaXBQYWNrYWdlUGFydCBzc1BhcnQ9bnVsbDsKLSAgICAgICAgICAgIGZvcmVhY2godmFyIHBhcnQgaW4gUGFydHMuVmFsdWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwYXJ0LkNvbnRlbnRUeXBlICE9IEV4Y2VsUGFja2FnZS5jb250ZW50VHlwZVNoYXJlZFN0cmluZykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcnQuV3JpdGVaaXAoemlwQXJjaGl2ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNzUGFydCA9IHBhcnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9TaGFyZWQgc3RyaW5ncyBtdXN0IGJlIHNhdmVkIGFmdGVyIGFsbCB3b3Jrc2hlZXRzLiBUaGUgc3MgZGljdGlvbmFyeSBpcyBwb3B1bGF0ZWQgd2hlbiB0aGF0IHdvcmtoZWV0cyBhcmUgc2F2ZWQgKHRvIGdldCB0aGUgYmVzdCBwZXJmb3JtYW5jZSkuCi0gICAgICAgICAgICBpZiAoc3NQYXJ0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3NQYXJ0LldyaXRlWmlwKHppcEFyY2hpdmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9yZXR1cm4gbXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0cmluZyBHZXRDb250ZW50VHlwZVhtbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgeG1sID0gbmV3IFN0cmluZ0J1aWxkZXIoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz48VHlwZXMgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L2NvbnRlbnQtdHlwZXNcIj4iKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKENvbnRlbnRUeXBlIGN0IGluIF9jb250ZW50VHlwZXMuVmFsdWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjdC5Jc0V4dGVuc2lvbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbC5BcHBlbmRGb3JtYXQoIjxEZWZhdWx0IENvbnRlbnRUeXBlPVwiezB9XCIgRXh0ZW5zaW9uPVwiezF9XCIvPiIsIGN0Lk5hbWUsIGN0Lk1hdGNoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiPE92ZXJyaWRlIENvbnRlbnRUeXBlPVwiezB9XCIgUGFydE5hbWU9XCJ7MX1cIiAvPiIsIGN0Lk5hbWUsIEdldFVyaUtleShjdC5NYXRjaCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhtbC5BcHBlbmQoIjwvVHlwZXM+Iik7Ci0gICAgICAgICAgICByZXR1cm4geG1sLlRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29tcHJlc3Npb25MZXZlbCBfY29tcHJlc3Npb24gPSBDb21wcmVzc2lvbkxldmVsLkRlZmF1bHQ7Ci0gICAgICAgIHB1YmxpYyBDb21wcmVzc2lvbkxldmVsIENvbXByZXNzaW9uIAotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9jb21wcmVzc2lvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYXJ0IGluIFBhcnRzLlZhbHVlcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0LkNvbXByZXNzaW9uTGV2ZWwgPT0gX2NvbXByZXNzaW9uKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LkNvbXByZXNzaW9uTGV2ZWwgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfY29tcHJlc3Npb24gPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFoYXNDb250ZW50VHlwZVhtbCkgeworICAgICAgICB0aHJvdyBuZXcgSW52YWxpZERhdGFFeGNlcHRpb24oIlRoZSBmaWxlIGlzIG5vdCBhbiB2YWxpZCBQYWNrYWdlIGZpbGUuIik7CisgICAgICB9CiAgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIEFkZENvbnRlbnRUeXBlcyhTdHJlYW0gaW5wdXRTdHJlYW0pIHsKKyAgICB2YXIgZG9jID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgWG1sSGVscGVyLkxvYWRYbWxTYWZlKGRvYywgaW5wdXRTdHJlYW0pOworCisgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBjIGluIGRvYy5Eb2N1bWVudEVsZW1lbnQuQ2hpbGROb2RlcykgeworICAgICAgQ29udGVudFR5cGUgY3Q7CisgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoYy5HZXRBdHRyaWJ1dGUoIkV4dGVuc2lvbiIpKSkgeworICAgICAgICBjdCA9IG5ldyhjLkdldEF0dHJpYnV0ZSgiQ29udGVudFR5cGUiKSwgZmFsc2UsIGMuR2V0QXR0cmlidXRlKCJQYXJ0TmFtZSIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGN0ID0gbmV3KGMuR2V0QXR0cmlidXRlKCJDb250ZW50VHlwZSIpLCB0cnVlLCBjLkdldEF0dHJpYnV0ZSgiRXh0ZW5zaW9uIikpOworICAgICAgfQorICAgICAgX2NvbnRlbnRUeXBlcy5BZGQoR2V0VXJpS2V5KGN0Lk1hdGNoKSwgY3QpOworICAgIH0KKyAgfQorCisgIGludGVybmFsIFppcFBhY2thZ2VQYXJ0IENyZWF0ZVBhcnQoVXJpIHBhcnRVcmksIHN0cmluZyBjb250ZW50VHlwZSkgeworICAgIHJldHVybiBDcmVhdGVQYXJ0KHBhcnRVcmksIGNvbnRlbnRUeXBlLCBDb21wcmVzc2lvbkxldmVsLkRlZmF1bHQpOworICB9CisKKyAgaW50ZXJuYWwgWmlwUGFja2FnZVBhcnQgQ3JlYXRlUGFydCgKKyAgICAgIFVyaSBwYXJ0VXJpLAorICAgICAgc3RyaW5nIGNvbnRlbnRUeXBlLAorICAgICAgQ29tcHJlc3Npb25MZXZlbCBjb21wcmVzc2lvbkxldmVsKSB7CisgICAgaWYgKFBhcnRFeGlzdHMocGFydFVyaSkpIHsKKyAgICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiUGFydCBhbHJlYWR5IGV4aXN0IikpOworICAgIH0KKworICAgIHZhciBwYXJ0ID0gbmV3IFppcFBhY2thZ2VQYXJ0KHRoaXMsIHBhcnRVcmksIGNvbnRlbnRUeXBlLCBjb21wcmVzc2lvbkxldmVsKTsKKyAgICBfY29udGVudFR5cGVzLkFkZCgKKyAgICAgICAgR2V0VXJpS2V5KHBhcnQuVXJpLk9yaWdpbmFsU3RyaW5nKSwKKyAgICAgICAgbmV3KGNvbnRlbnRUeXBlLCBmYWxzZSwgcGFydC5VcmkuT3JpZ2luYWxTdHJpbmcpKTsKKyAgICBQYXJ0cy5BZGQoR2V0VXJpS2V5KHBhcnQuVXJpLk9yaWdpbmFsU3RyaW5nKSwgcGFydCk7CisgICAgcmV0dXJuIHBhcnQ7CisgIH0KKworICBpbnRlcm5hbCBaaXBQYWNrYWdlUGFydCBHZXRQYXJ0KFVyaSBwYXJ0VXJpKSB7CisgICAgaWYgKFBhcnRFeGlzdHMocGFydFVyaSkpIHsKKyAgICAgIHJldHVybiBQYXJ0cworICAgICAgICAgIC5TaW5nbGUoeCA9PgorICAgICAgICAgICAgICB4LktleS5FcXVhbHMoCisgICAgICAgICAgICAgICAgICBHZXRVcmlLZXkocGFydFVyaS5PcmlnaW5hbFN0cmluZyksCisgICAgICAgICAgICAgICAgICBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkKKyAgICAgICAgICAuVmFsdWU7CisgICAgfQorICAgIHRocm93IChuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiUGFydCBkb2VzIG5vdCBleGlzdC4iKSk7CisgIH0KKworICBpbnRlcm5hbCBzdHJpbmcgR2V0VXJpS2V5KHN0cmluZyB1cmkpIHsKKyAgICBzdHJpbmcgcmV0ID0gdXJpOworICAgIGlmIChyZXRbMF0gIT0gJy8nKSB7CisgICAgICByZXQgPSAiLyIgKyByZXQ7CisgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICBpbnRlcm5hbCBib29sIFBhcnRFeGlzdHMoVXJpIHBhcnRVcmkpIHsKKyAgICB2YXIgdXJpS2V5ID0gR2V0VXJpS2V5KHBhcnRVcmkuT3JpZ2luYWxTdHJpbmcuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgcmV0dXJuIFBhcnRzLktleXMuQW55KHggPT4geC5FcXVhbHModXJpS2V5LCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSk7CisgIH0KKworICBpbnRlcm5hbCB2b2lkIERlbGV0ZVBhcnQoVXJpIHVyaSkgeworICAgIHZhciBkZWxMaXN0ID0gbmV3IExpc3Q8b2JqZWN0W10+KCk7CisgICAgZm9yZWFjaCAodmFyIHAgaW4gUGFydHMuVmFsdWVzKSB7CisgICAgICBmb3JlYWNoICh2YXIgciBpbiBwLkdldFJlbGF0aW9uc2hpcHMoKSkgeworICAgICAgICBpZiAoVXJpSGVscGVyCisgICAgICAgICAgICAuUmVzb2x2ZVBhcnRVcmkocC5VcmksIHIuVGFyZ2V0VXJpKQorICAgICAgICAgICAgLk9yaWdpbmFsU3RyaW5nLkVxdWFscygKKyAgICAgICAgICAgICAgICB1cmkuT3JpZ2luYWxTdHJpbmcsCisgICAgICAgICAgICAgICAgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpIHsKKyAgICAgICAgICBkZWxMaXN0LkFkZChuZXcgb2JqZWN0W10geyByLklkLCBwIH0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGZvcmVhY2ggKHZhciBvIGluIGRlbExpc3QpIHsKKyAgICAgICgoWmlwUGFja2FnZVBhcnQpb1sxXSkuRGVsZXRlUmVsYXRpb25zaGlwKG9bMF0uVG9TdHJpbmcoKSk7CisgICAgfQorICAgIHZhciByZWxzID0gR2V0UGFydCh1cmkpLkdldFJlbGF0aW9uc2hpcHMoKTsKKyAgICB3aGlsZSAocmVscy5Db3VudCA+IDApIHsKKyAgICAgIHJlbHMuUmVtb3ZlKHJlbHMuRmlyc3QoKS5JZCk7CisgICAgfQorICAgIHJlbHMgPSBudWxsOworICAgIF9jb250ZW50VHlwZXMuUmVtb3ZlKEdldFVyaUtleSh1cmkuT3JpZ2luYWxTdHJpbmcpKTsKKyAgICAvL3JlbW92ZSBhbGwgcmVsYXRpb25zCisgICAgUGFydHMuUmVtb3ZlKEdldFVyaUtleSh1cmkuT3JpZ2luYWxTdHJpbmcpKTsKKyAgfQorCisgIGludGVybmFsIHZvaWQgU2F2ZShTdHJlYW0gc3RyZWFtKSB7CisgICAgdXNpbmcgdmFyIHppcEFyY2hpdmUgPSBuZXcgWmlwQXJjaGl2ZShzdHJlYW0sIFppcEFyY2hpdmVNb2RlLkNyZWF0ZSwgbGVhdmVPcGVuOiB0cnVlKTsKKyAgICAvKioqKiBDb250ZW50VHlwZSoqKiovCisgICAgdmFyIGNvbnRlbnRUeXBlc0VudHJ5ID0gemlwQXJjaGl2ZS5DcmVhdGVFbnRyeSgiW0NvbnRlbnRfVHlwZXNdLnhtbCIpOworICAgIHVzaW5nICh2YXIgY29udGVudFR5cGVzV3JpdGVyID0gbmV3IFN0cmVhbVdyaXRlcihjb250ZW50VHlwZXNFbnRyeS5PcGVuKCkpKSB7CisgICAgICBjb250ZW50VHlwZXNXcml0ZXIuV3JpdGUoR2V0Q29udGVudFR5cGVYbWwoKSk7CisgICAgfQorICAgIC8qKioqIFRvcCBSZWxzICoqKiovCisgICAgX3JlbHMuV3JpdGVaaXAoemlwQXJjaGl2ZSwgIl9yZWxzXFwucmVscyIpOworICAgIFppcFBhY2thZ2VQYXJ0IHNzUGFydCA9IG51bGw7CisgICAgZm9yZWFjaCAodmFyIHBhcnQgaW4gUGFydHMuVmFsdWVzKSB7CisgICAgICBpZiAocGFydC5Db250ZW50VHlwZSAhPSBFeGNlbFBhY2thZ2UuX2NvbnRlbnRUeXBlU2hhcmVkU3RyaW5nKSB7CisgICAgICAgIHBhcnQuV3JpdGVaaXAoemlwQXJjaGl2ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzc1BhcnQgPSBwYXJ0OworICAgICAgfQorICAgIH0KKyAgICAvL1NoYXJlZCBzdHJpbmdzIG11c3QgYmUgc2F2ZWQgYWZ0ZXIgYWxsIHdvcmtzaGVldHMuIFRoZSBzcyBkaWN0aW9uYXJ5IGlzIHBvcHVsYXRlZCB3aGVuIHRoYXQgd29ya2hlZXRzIGFyZSBzYXZlZCAodG8gZ2V0IHRoZSBiZXN0IHBlcmZvcm1hbmNlKS4KKyAgICBpZiAoc3NQYXJ0ICE9IG51bGwpIHsKKyAgICAgIHNzUGFydC5Xcml0ZVppcCh6aXBBcmNoaXZlKTsKKyAgICB9CisgICAgLy9yZXR1cm4gbXM7CisgIH0KKworICBwcml2YXRlIHN0cmluZyBHZXRDb250ZW50VHlwZVhtbCgpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHhtbCA9IG5ldyBTdHJpbmdCdWlsZGVyKAorICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCI/PjxUeXBlcyB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvY29udGVudC10eXBlc1wiPiIpOworICAgIGZvcmVhY2ggKENvbnRlbnRUeXBlIGN0IGluIF9jb250ZW50VHlwZXMuVmFsdWVzKSB7CisgICAgICBpZiAoY3QuSXNFeHRlbnNpb24pIHsKKyAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgiPERlZmF1bHQgQ29udGVudFR5cGU9XCJ7MH1cIiBFeHRlbnNpb249XCJ7MX1cIi8+IiwgY3QuTmFtZSwgY3QuTWF0Y2gpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgeG1sLkFwcGVuZEZvcm1hdCgKKyAgICAgICAgICAgICI8T3ZlcnJpZGUgQ29udGVudFR5cGU9XCJ7MH1cIiBQYXJ0TmFtZT1cInsxfVwiIC8+IiwKKyAgICAgICAgICAgIGN0Lk5hbWUsCisgICAgICAgICAgICBHZXRVcmlLZXkoY3QuTWF0Y2gpKTsKKyAgICAgIH0KKyAgICB9CisgICAgeG1sLkFwcGVuZCgiPC9UeXBlcz4iKTsKKyAgICByZXR1cm4geG1sLlRvU3RyaW5nKCk7CisgIH0KKworICBwcml2YXRlIENvbXByZXNzaW9uTGV2ZWwgX2NvbXByZXNzaW9uID0gQ29tcHJlc3Npb25MZXZlbC5EZWZhdWx0OworCisgIHB1YmxpYyBDb21wcmVzc2lvbkxldmVsIENvbXByZXNzaW9uIHsKKyAgICBnZXQgPT4gX2NvbXByZXNzaW9uOworICAgIHNldCB7CisgICAgICBmb3JlYWNoICh2YXIgcGFydCBpbiBQYXJ0cy5WYWx1ZXMpIHsKKyAgICAgICAgaWYgKHBhcnQuQ29tcHJlc3Npb25MZXZlbCA9PSBfY29tcHJlc3Npb24pIHsKKyAgICAgICAgICBwYXJ0LkNvbXByZXNzaW9uTGV2ZWwgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgX2NvbXByZXNzaW9uID0gdmFsdWU7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL1ppcFBhY2thZ2VQYXJ0LmNzIGIvRVBQbHVzL1BhY2thZ2luZy9aaXBQYWNrYWdlUGFydC5jcwppbmRleCAwNmNhODEwLi40MDc0MjhkIDEwMDY0NAotLS0gYS9FUFBsdXMvUGFja2FnaW5nL1ppcFBhY2thZ2VQYXJ0LmNzCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvWmlwUGFja2FnZVBhcnQuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDE0OSArMTMsMTM1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjUtT2N0LTIwMTIKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uSU87CiB1c2luZyBTeXN0ZW0uSU8uQ29tcHJlc3Npb247CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZwotewotICAgIGludGVybmFsIGNsYXNzIFppcFBhY2thZ2VQYXJ0IDogWmlwUGFja2FnZVJlbGF0aW9uc2hpcEJhc2UsIElEaXNwb3NhYmxlCi0gICAgewotICAgICAgICBpbnRlcm5hbCBkZWxlZ2F0ZSB2b2lkIFNhdmVIYW5kbGVyRGVsZWdhdGUoU3RyZWFtV3JpdGVyIHN0cmVhbVdyaXRlcik7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmc7CiAKLSAgICAgICAgaW50ZXJuYWwgWmlwUGFja2FnZVBhcnQoWmlwUGFja2FnZSBwYWNrYWdlLCBaaXBBcmNoaXZlRW50cnkgZW50cnkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhY2thZ2UgPSBwYWNrYWdlOwotICAgICAgICAgICAgU2F2ZUhhbmRsZXIgPSBudWxsOwotICAgICAgICAgICAgVXJpID0gbmV3IFVyaShwYWNrYWdlLkdldFVyaUtleShlbnRyeS5GdWxsTmFtZSksIFVyaUtpbmQuUmVsYXRpdmUpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIFppcFBhY2thZ2VQYXJ0KFppcFBhY2thZ2UgcGFja2FnZSwgVXJpIHBhcnRVcmksIHN0cmluZyBjb250ZW50VHlwZSwgQ29tcHJlc3Npb25MZXZlbCBjb21wcmVzc2lvbkxldmVsKQotICAgICAgICB7Ci0gICAgICAgICAgICBQYWNrYWdlID0gcGFja2FnZTsKLSAgICAgICAgICAgIC8vRW50cnkgPSBuZXcgWmlwRW50cnkoKTsKLSAgICAgICAgICAgIC8vRW50cnkuRmlsZU5hbWUgPSBwYXJ0VXJpLk9yaWdpbmFsU3RyaW5nLlJlcGxhY2UoJy8nLCdcXCcpOwotICAgICAgICAgICAgVXJpID0gcGFydFVyaTsKLSAgICAgICAgICAgIENvbnRlbnRUeXBlID0gY29udGVudFR5cGU7Ci0gICAgICAgICAgICBDb21wcmVzc2lvbkxldmVsID0gY29tcHJlc3Npb25MZXZlbDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBaaXBQYWNrYWdlIFBhY2thZ2UgeyBnZXQ7IHNldDsgfQotICAgICAgICBpbnRlcm5hbCBDb21wcmVzc2lvbkxldmVsIENvbXByZXNzaW9uTGV2ZWw7Ci0gICAgICAgIE1lbW9yeVN0cmVhbSBfc3RyZWFtID0gbnVsbDsKLSAgICAgICAgaW50ZXJuYWwgTWVtb3J5U3RyZWFtIFN0cmVhbQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3N0cmVhbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9zdHJlYW0gPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBaaXBQYWNrYWdlUmVsYXRpb25zaGlwIENyZWF0ZVJlbGF0aW9uc2hpcChVcmkgdGFyZ2V0VXJpLCBUYXJnZXRNb2RlIHRhcmdldE1vZGUsIHN0cmluZyByZWxhdGlvbnNoaXBUeXBlKQotICAgICAgICB7CitpbnRlcm5hbCBjbGFzcyBaaXBQYWNrYWdlUGFydCA6IFppcFBhY2thZ2VSZWxhdGlvbnNoaXBCYXNlLCBJRGlzcG9zYWJsZSB7CisgIGludGVybmFsIGRlbGVnYXRlIHZvaWQgU2F2ZUhhbmRsZXJEZWxlZ2F0ZShTdHJlYW1Xcml0ZXIgc3RyZWFtV3JpdGVyKTsKIAotICAgICAgICAgICAgdmFyIHJlbCA9IGJhc2UuQ3JlYXRlUmVsYXRpb25zaGlwKHRhcmdldFVyaSwgdGFyZ2V0TW9kZSwgcmVsYXRpb25zaGlwVHlwZSk7Ci0gICAgICAgICAgICByZWwuU291cmNlVXJpID0gVXJpOwotICAgICAgICAgICAgcmV0dXJuIHJlbDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBNZW1vcnlTdHJlYW0gR2V0U3RyZWFtKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEdldFN0cmVhbShGaWxlTW9kZS5PcGVuT3JDcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBNZW1vcnlTdHJlYW0gR2V0U3RyZWFtKEZpbGVNb2RlIGZpbGVNb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5SZWFkV3JpdGUpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIE1lbW9yeVN0cmVhbSBHZXRTdHJlYW0oRmlsZU1vZGUgZmlsZU1vZGUsIEZpbGVBY2Nlc3MgZmlsZUFjY2VzcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9zdHJlYW0gPT0gbnVsbCB8fCBmaWxlTW9kZSA9PSBGaWxlTW9kZS5DcmVhdGVOZXcgfHwgZmlsZU1vZGUgPT0gRmlsZU1vZGUuQ3JlYXRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9zdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3N0cmVhbS5TZWVrKDAsIFNlZWtPcmlnaW4uQmVnaW4pOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBfc3RyZWFtOwotICAgICAgICB9CisgIGludGVybmFsIFppcFBhY2thZ2VQYXJ0KFppcFBhY2thZ2UgcGFja2FnZSwgWmlwQXJjaGl2ZUVudHJ5IGVudHJ5KSB7CisgICAgUGFja2FnZSA9IHBhY2thZ2U7CisgICAgU2F2ZUhhbmRsZXIgPSBudWxsOworICAgIFVyaSA9IG5ldyhwYWNrYWdlLkdldFVyaUtleShlbnRyeS5GdWxsTmFtZSksIFVyaUtpbmQuUmVsYXRpdmUpOworICB9CiAKLSAgICAgICAgc3RyaW5nIF9jb250ZW50VHlwZSA9ICIiOwotICAgICAgICBwdWJsaWMgc3RyaW5nIENvbnRlbnRUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY29udGVudFR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KF9jb250ZW50VHlwZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoUGFja2FnZS5fY29udGVudFR5cGVzLkNvbnRhaW5zS2V5KFBhY2thZ2UuR2V0VXJpS2V5KFVyaS5PcmlnaW5hbFN0cmluZykpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQYWNrYWdlLl9jb250ZW50VHlwZXMuUmVtb3ZlKFBhY2thZ2UuR2V0VXJpS2V5KFVyaS5PcmlnaW5hbFN0cmluZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgUGFja2FnZS5fY29udGVudFR5cGVzLkFkZChQYWNrYWdlLkdldFVyaUtleShVcmkuT3JpZ2luYWxTdHJpbmcpLCBuZXcgWmlwUGFja2FnZS5Db250ZW50VHlwZSh2YWx1ZSwgZmFsc2UsIFVyaS5PcmlnaW5hbFN0cmluZykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9jb250ZW50VHlwZSA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBVcmkgVXJpIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotICAgICAgICBpbnRlcm5hbCBTYXZlSGFuZGxlckRlbGVnYXRlIFNhdmVIYW5kbGVyCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCB2b2lkIFdyaXRlWmlwKFppcEFyY2hpdmUgemlwQXJjaGl2ZSkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIGI7Ci0gICAgICAgICAgICBpZiAoU2F2ZUhhbmRsZXIgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiID0gR2V0U3RyZWFtKCkuVG9BcnJheSgpOwotICAgICAgICAgICAgICAgIGlmIChiLkxlbmd0aCA9PSAwKSAgIC8vTWFrZSBzdXJlIHRoZSBmaWxlIGlzbid0IGVtcHR5LiBEb3ROZXRaaXAgc3RyZWFtcyBkb2VzIG5vdCBzZWVtcyB0byBoYW5kbGUgemVybyBzaXplZCBmaWxlcy4KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdmFyIHppcEVudHJ5ID0gemlwQXJjaGl2ZS5DcmVhdGVFbnRyeShVcmkuT3JpZ2luYWxTdHJpbmcpOwotICAgICAgICAgICAgICAgIHVzaW5nIHZhciBvcyA9IHppcEVudHJ5Lk9wZW4oKTsKLSAgICAgICAgICAgICAgICBvcy5Xcml0ZShiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgemlwRW50cnkgPSB6aXBBcmNoaXZlLkNyZWF0ZUVudHJ5KFVyaS5PcmlnaW5hbFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgdXNpbmcgdmFyIHN0cmVhbVdyaXRlciA9IG5ldyBTdHJlYW1Xcml0ZXIoemlwRW50cnkuT3BlbigpKTsKLSAgICAgICAgICAgICAgICBTYXZlSGFuZGxlcihzdHJlYW1Xcml0ZXIpOwotICAgICAgICAgICAgfQorICBpbnRlcm5hbCBaaXBQYWNrYWdlUGFydCgKKyAgICAgIFppcFBhY2thZ2UgcGFja2FnZSwKKyAgICAgIFVyaSBwYXJ0VXJpLAorICAgICAgc3RyaW5nIGNvbnRlbnRUeXBlLAorICAgICAgQ29tcHJlc3Npb25MZXZlbCBjb21wcmVzc2lvbkxldmVsKSB7CisgICAgUGFja2FnZSA9IHBhY2thZ2U7CisgICAgLy9FbnRyeSA9IG5ldyBaaXBFbnRyeSgpOworICAgIC8vRW50cnkuRmlsZU5hbWUgPSBwYXJ0VXJpLk9yaWdpbmFsU3RyaW5nLlJlcGxhY2UoJy8nLCdcXCcpOworICAgIFVyaSA9IHBhcnRVcmk7CisgICAgQ29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKKyAgICBDb21wcmVzc2lvbkxldmVsID0gY29tcHJlc3Npb25MZXZlbDsKKyAgfQogCi0gICAgICAgICAgICBpZiAoX3JlbHMuQ291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyBmID0gVXJpLk9yaWdpbmFsU3RyaW5nOwotICAgICAgICAgICAgICAgIHZhciBuYW1lID0gUGF0aC5HZXRGaWxlTmFtZShmKTsKLSAgICAgICAgICAgICAgICBfcmVscy5Xcml0ZVppcCh6aXBBcmNoaXZlLCAkIntmLlN1YnN0cmluZygwLCBmLkxlbmd0aCAtIG5hbWUuTGVuZ3RoKX1fcmVscy97bmFtZX0ucmVscyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYiA9IG51bGw7Ci0gICAgICAgIH0KKyAgaW50ZXJuYWwgWmlwUGFja2FnZSBQYWNrYWdlIHsgZ2V0OyBzZXQ7IH0KIAorICBpbnRlcm5hbCBDb21wcmVzc2lvbkxldmVsIENvbXByZXNzaW9uTGV2ZWw7CisgIHByaXZhdGUgTWVtb3J5U3RyZWFtIF9zdHJlYW07CiAKLSAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9zdHJlYW0uQ2xvc2UoKTsKLSAgICAgICAgICAgIF9zdHJlYW0uRGlzcG9zZSgpOwotICAgICAgICB9CisgIGludGVybmFsIE1lbW9yeVN0cmVhbSBTdHJlYW0geworICAgIGdldCA9PiBfc3RyZWFtOworICAgIHNldCA9PiBfc3RyZWFtID0gdmFsdWU7CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBaaXBQYWNrYWdlUmVsYXRpb25zaGlwIENyZWF0ZVJlbGF0aW9uc2hpcCgKKyAgICAgIFVyaSB0YXJnZXRVcmksCisgICAgICBUYXJnZXRNb2RlIHRhcmdldE1vZGUsCisgICAgICBzdHJpbmcgcmVsYXRpb25zaGlwVHlwZSkgeworICAgIHZhciByZWwgPSBiYXNlLkNyZWF0ZVJlbGF0aW9uc2hpcCh0YXJnZXRVcmksIHRhcmdldE1vZGUsIHJlbGF0aW9uc2hpcFR5cGUpOworICAgIHJlbC5Tb3VyY2VVcmkgPSBVcmk7CisgICAgcmV0dXJuIHJlbDsKKyAgfQorCisgIGludGVybmFsIE1lbW9yeVN0cmVhbSBHZXRTdHJlYW0oKSB7CisgICAgcmV0dXJuIEdldFN0cmVhbShGaWxlTW9kZS5PcGVuT3JDcmVhdGUsIEZpbGVBY2Nlc3MuUmVhZFdyaXRlKTsKKyAgfQorCisgIGludGVybmFsIE1lbW9yeVN0cmVhbSBHZXRTdHJlYW0oRmlsZU1vZGUgZmlsZU1vZGUpIHsKKyAgICByZXR1cm4gR2V0U3RyZWFtKEZpbGVNb2RlLkNyZWF0ZSwgRmlsZUFjY2Vzcy5SZWFkV3JpdGUpOworICB9CisKKyAgaW50ZXJuYWwgTWVtb3J5U3RyZWFtIEdldFN0cmVhbShGaWxlTW9kZSBmaWxlTW9kZSwgRmlsZUFjY2VzcyBmaWxlQWNjZXNzKSB7CisgICAgaWYgKF9zdHJlYW0gPT0gbnVsbCB8fCBmaWxlTW9kZSA9PSBGaWxlTW9kZS5DcmVhdGVOZXcgfHwgZmlsZU1vZGUgPT0gRmlsZU1vZGUuQ3JlYXRlKSB7CisgICAgICBfc3RyZWFtID0gbmV3KCk7CisgICAgfSBlbHNlIHsKKyAgICAgIF9zdHJlYW0uU2VlaygwLCBTZWVrT3JpZ2luLkJlZ2luKTsKICAgICB9CisgICAgcmV0dXJuIF9zdHJlYW07CisgIH0KKworICBwcml2YXRlIHN0cmluZyBfY29udGVudFR5cGUgPSAiIjsKKworICBwdWJsaWMgc3RyaW5nIENvbnRlbnRUeXBlIHsKKyAgICBnZXQgPT4gX2NvbnRlbnRUeXBlOworICAgIGludGVybmFsIHNldCB7CisgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KF9jb250ZW50VHlwZSkpIHsKKyAgICAgICAgaWYgKFBhY2thZ2UuX2NvbnRlbnRUeXBlcy5Db250YWluc0tleShQYWNrYWdlLkdldFVyaUtleShVcmkuT3JpZ2luYWxTdHJpbmcpKSkgeworICAgICAgICAgIFBhY2thZ2UuX2NvbnRlbnRUeXBlcy5SZW1vdmUoUGFja2FnZS5HZXRVcmlLZXkoVXJpLk9yaWdpbmFsU3RyaW5nKSk7CisgICAgICAgICAgUGFja2FnZS5fY29udGVudFR5cGVzLkFkZCgKKyAgICAgICAgICAgICAgUGFja2FnZS5HZXRVcmlLZXkoVXJpLk9yaWdpbmFsU3RyaW5nKSwKKyAgICAgICAgICAgICAgbmV3KHZhbHVlLCBmYWxzZSwgVXJpLk9yaWdpbmFsU3RyaW5nKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIF9jb250ZW50VHlwZSA9IHZhbHVlOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBVcmkgVXJpIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgIGludGVybmFsIFNhdmVIYW5kbGVyRGVsZWdhdGUgU2F2ZUhhbmRsZXIgeyBnZXQ7IHNldDsgfQorCisgIGludGVybmFsIHZvaWQgV3JpdGVaaXAoWmlwQXJjaGl2ZSB6aXBBcmNoaXZlKSB7CisgICAgYnl0ZVtdIGI7CisgICAgaWYgKFNhdmVIYW5kbGVyID09IG51bGwpIHsKKyAgICAgIGIgPSBHZXRTdHJlYW0oKS5Ub0FycmF5KCk7CisgICAgICBpZiAoYi5MZW5ndGgKKyAgICAgICAgICA9PSAwKSAvL01ha2Ugc3VyZSB0aGUgZmlsZSBpc24ndCBlbXB0eS4gRG90TmV0WmlwIHN0cmVhbXMgZG9lcyBub3Qgc2VlbXMgdG8gaGFuZGxlIHplcm8gc2l6ZWQgZmlsZXMuCisgICAgICB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHZhciB6aXBFbnRyeSA9IHppcEFyY2hpdmUuQ3JlYXRlRW50cnkoVXJpLk9yaWdpbmFsU3RyaW5nKTsKKyAgICAgIHVzaW5nIHZhciBvcyA9IHppcEVudHJ5Lk9wZW4oKTsKKyAgICAgIG9zLldyaXRlKGIpOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgemlwRW50cnkgPSB6aXBBcmNoaXZlLkNyZWF0ZUVudHJ5KFVyaS5PcmlnaW5hbFN0cmluZyk7CisgICAgICB1c2luZyB2YXIgc3RyZWFtV3JpdGVyID0gbmV3IFN0cmVhbVdyaXRlcih6aXBFbnRyeS5PcGVuKCkpOworICAgICAgU2F2ZUhhbmRsZXIoc3RyZWFtV3JpdGVyKTsKKyAgICB9CisKKyAgICBpZiAoX3JlbHMuQ291bnQgPiAwKSB7CisgICAgICBzdHJpbmcgZiA9IFVyaS5PcmlnaW5hbFN0cmluZzsKKyAgICAgIHZhciBuYW1lID0gUGF0aC5HZXRGaWxlTmFtZShmKTsKKyAgICAgIF9yZWxzLldyaXRlWmlwKHppcEFyY2hpdmUsICQie2YuU3Vic3RyaW5nKDAsIGYuTGVuZ3RoIC0gbmFtZS5MZW5ndGgpfV9yZWxzL3tuYW1lfS5yZWxzIik7CisgICAgfQorICAgIGIgPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgRGlzcG9zZSgpIHsKKyAgICBfc3RyZWFtLkNsb3NlKCk7CisgICAgX3N0cmVhbS5EaXNwb3NlKCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvWmlwUGFja2FnZVJlbGF0aW9uc2hpcC5jcyBiL0VQUGx1cy9QYWNrYWdpbmcvWmlwUGFja2FnZVJlbGF0aW9uc2hpcC5jcwppbmRleCA3YmI3YTUwLi4xNWM0NTM5IDEwMDY0NAotLS0gYS9FUFBsdXMvUGFja2FnaW5nL1ppcFBhY2thZ2VSZWxhdGlvbnNoaXAuY3MKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9aaXBQYWNrYWdlUmVsYXRpb25zaGlwLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywzNSArMTMsMzQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyNS1PY3QtMjAxMgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nCi17Ci0gICAgcHVibGljIGNsYXNzIFppcFBhY2thZ2VSZWxhdGlvbnNoaXAKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBVcmkgVGFyZ2V0VXJpIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZzsKIAotICAgICAgICBwdWJsaWMgVXJpIFNvdXJjZVVyaSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CitwdWJsaWMgY2xhc3MgWmlwUGFja2FnZVJlbGF0aW9uc2hpcCB7CisgIHB1YmxpYyBVcmkgVGFyZ2V0VXJpIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KIAotICAgICAgICBwdWJsaWMgc3RyaW5nIFJlbGF0aW9uc2hpcFR5cGUgeyBnZXQ7IGludGVybmFsIHNldDsgfQorICBwdWJsaWMgVXJpIFNvdXJjZVVyaSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CiAKLSAgICAgICAgcHVibGljIFRhcmdldE1vZGUgVGFyZ2V0TW9kZSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisgIHB1YmxpYyBzdHJpbmcgUmVsYXRpb25zaGlwVHlwZSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CiAKLSAgICAgICAgcHVibGljIHN0cmluZyBJZCB7IGdldDsgaW50ZXJuYWwgc2V0OyB9Ci0gICAgfQorICBwdWJsaWMgVGFyZ2V0TW9kZSBUYXJnZXRNb2RlIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKworICBwdWJsaWMgc3RyaW5nIElkIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9QYWNrYWdpbmcvWmlwUGFja2FnZVJlbGF0aW9uc2hpcEJhc2UuY3MgYi9FUFBsdXMvUGFja2FnaW5nL1ppcFBhY2thZ2VSZWxhdGlvbnNoaXBCYXNlLmNzCmluZGV4IGIwYmQxMjQuLjZjMDQxMWYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9QYWNrYWdpbmcvWmlwUGFja2FnZVJlbGF0aW9uc2hpcEJhc2UuY3MKKysrIGIvRVBQbHVzL1BhY2thZ2luZy9aaXBQYWNrYWdlUmVsYXRpb25zaGlwQmFzZS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTEzICsxMywxMTMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyNS1PY3QtMjAxMgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5JTzsKIHVzaW5nIFN5c3RlbS5YbWw7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZwotewotICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBaaXBQYWNrYWdlUmVsYXRpb25zaGlwQmFzZQotICAgIHsKLSAgICAgICAgcHJvdGVjdGVkIFppcFBhY2thZ2VSZWxhdGlvbnNoaXBDb2xsZWN0aW9uIF9yZWxzID0gbmV3IFppcFBhY2thZ2VSZWxhdGlvbnNoaXBDb2xsZWN0aW9uKCk7Ci0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBpbnQgbWF4UklkID0gMTsKLSAgICAgICAgaW50ZXJuYWwgdm9pZCBEZWxldGVSZWxhdGlvbnNoaXAoc3RyaW5nIGlkKQotICAgICAgICB7Ci0gICAgICAgICAgICBfcmVscy5SZW1vdmUoaWQpOwotICAgICAgICAgICAgVXBkYXRlTWF4UklkKGlkLCByZWYgbWF4UklkKTsKLSAgICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBVcGRhdGVNYXhSSWQoc3RyaW5nIGlkLCByZWYgaW50IG1heFJJZCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlkLlN0YXJ0c1dpdGgoInJJZCIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBudW07Ci0gICAgICAgICAgICAgICAgaWYgKGludC5UcnlQYXJzZShpZC5TdWJzdHJpbmcoMyksIG91dCBudW0pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG51bSA9PSBtYXhSSWQgLSAxKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhSSWQtLTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCB2aXJ0dWFsIFppcFBhY2thZ2VSZWxhdGlvbnNoaXAgQ3JlYXRlUmVsYXRpb25zaGlwKFVyaSB0YXJnZXRVcmksIFRhcmdldE1vZGUgdGFyZ2V0TW9kZSwgc3RyaW5nIHJlbGF0aW9uc2hpcFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZWwgPSBuZXcgWmlwUGFja2FnZVJlbGF0aW9uc2hpcCgpOwotICAgICAgICAgICAgcmVsLlRhcmdldFVyaSA9IHRhcmdldFVyaTsKLSAgICAgICAgICAgIHJlbC5UYXJnZXRNb2RlID0gdGFyZ2V0TW9kZTsKLSAgICAgICAgICAgIHJlbC5SZWxhdGlvbnNoaXBUeXBlID0gcmVsYXRpb25zaGlwVHlwZTsKLSAgICAgICAgICAgIHJlbC5JZCA9ICJySWQiICsgKG1heFJJZCsrKS5Ub1N0cmluZygpOwotICAgICAgICAgICAgX3JlbHMuQWRkKHJlbCk7Ci0gICAgICAgICAgICByZXR1cm4gcmVsOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGJvb2wgUmVsYXRpb25zaGlwRXhpc3RzKHN0cmluZyBpZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9yZWxzLkNvbnRhaW5zS2V5KGlkKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBaaXBQYWNrYWdlUmVsYXRpb25zaGlwQ29sbGVjdGlvbiBHZXRSZWxhdGlvbnNoaXBzQnlUeXBlKHN0cmluZyBzY2hlbWEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfcmVscy5HZXRSZWxhdGlvbnNoaXBzQnlUeXBlKHNjaGVtYSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgWmlwUGFja2FnZVJlbGF0aW9uc2hpcENvbGxlY3Rpb24gR2V0UmVsYXRpb25zaGlwcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfcmVsczsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBaaXBQYWNrYWdlUmVsYXRpb25zaGlwIEdldFJlbGF0aW9uc2hpcChzdHJpbmcgaWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfcmVsc1tpZF07Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBSZWFkUmVsYXRpb24oU3RyZWFtIGlucHV0U3RyZWFtLCBzdHJpbmcgc291cmNlKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZG9jID0gbmV3IFhtbERvY3VtZW50KCk7Ci0gICAgICAgICAgICBYbWxIZWxwZXIuTG9hZFhtbFNhZmUoZG9jLCBpbnB1dFN0cmVhbSk7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmc7CiAKLSAgICAgICAgICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgYyBpbiBkb2MuRG9jdW1lbnRFbGVtZW50LkNoaWxkTm9kZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJlbCA9IG5ldyBaaXBQYWNrYWdlUmVsYXRpb25zaGlwKCk7Ci0gICAgICAgICAgICAgICAgcmVsLklkID0gYy5HZXRBdHRyaWJ1dGUoIklkIik7Ci0gICAgICAgICAgICAgICAgcmVsLlJlbGF0aW9uc2hpcFR5cGUgPSBjLkdldEF0dHJpYnV0ZSgiVHlwZSIpOwotICAgICAgICAgICAgICAgIHJlbC5UYXJnZXRNb2RlID0gYy5HZXRBdHRyaWJ1dGUoIlRhcmdldE1vZGUiKS5FcXVhbHMoImV4dGVybmFsIixTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSA/IFRhcmdldE1vZGUuRXh0ZXJuYWwgOiBUYXJnZXRNb2RlLkludGVybmFsOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVsLlRhcmdldFVyaSA9IG5ldyBVcmkoYy5HZXRBdHRyaWJ1dGUoIlRhcmdldCIpLCBVcmlLaW5kLlJlbGF0aXZlT3JBYnNvbHV0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvL1RoZSBVUkkgaXMgbm90IGEgdmFsaWQgVVJJLiBFbmNvZGUgaXQgdG8gbWFrZSBpIHZhbGlkLgotICAgICAgICAgICAgICAgICAgICByZWwuVGFyZ2V0VXJpID0gbmV3IFVyaShVcmkuRXNjYXBlVXJpU3RyaW5nKCJJbnZhbGlkOlVSSSAiK2MuR2V0QXR0cmlidXRlKCJUYXJnZXQiKSksIFVyaUtpbmQuUmVsYXRpdmVPckFic29sdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShzb3VyY2UpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVsLlNvdXJjZVVyaSA9IG5ldyBVcmkoc291cmNlLCBVcmlLaW5kLlJlbGF0aXZlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJlbC5JZC5TdGFydHNXaXRoKCJyaWQiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpZDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGludC5UcnlQYXJzZShyZWwuSWQuU3Vic3RyaW5nKDMpLCBvdXQgaWQpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPj0gbWF4UklkICYmIGlkIDwgaW50Lk1heFZhbHVlIC0gMTAwMDApIC8vTm90IGxpa2x5IHRvIGhhdmUgdGhpcyBoaWdoIGlkJ3MgYnV0IG1ha2Ugc3VyZSB3ZSBoYXZlIHNwYWNlIHRvIGF2b2lkIG92ZXJmbG93LgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJJZCA9IGlkICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfcmVscy5BZGQocmVsKTsKLSAgICAgICAgICAgIH0KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBaaXBQYWNrYWdlUmVsYXRpb25zaGlwQmFzZSB7CisgIHByb3RlY3RlZCBaaXBQYWNrYWdlUmVsYXRpb25zaGlwQ29sbGVjdGlvbiBfcmVscyA9IG5ldygpOworICBwcm90ZWN0ZWQgaW50ZXJuYWwgaW50IG1heFJJZCA9IDE7CisKKyAgaW50ZXJuYWwgdm9pZCBEZWxldGVSZWxhdGlvbnNoaXAoc3RyaW5nIGlkKSB7CisgICAgX3JlbHMuUmVtb3ZlKGlkKTsKKyAgICBVcGRhdGVNYXhSSWQoaWQsIHJlZiBtYXhSSWQpOworICB9CisKKyAgcHJvdGVjdGVkIHZvaWQgVXBkYXRlTWF4UklkKHN0cmluZyBpZCwgcmVmIGludCBtYXhSSWQpIHsKKyAgICBpZiAoaWQuU3RhcnRzV2l0aCgicklkIikpIHsKKyAgICAgIGludCBudW07CisgICAgICBpZiAoaW50LlRyeVBhcnNlKGlkLlN1YnN0cmluZygzKSwgb3V0IG51bSkpIHsKKyAgICAgICAgaWYgKG51bSA9PSBtYXhSSWQgLSAxKSB7CisgICAgICAgICAgbWF4UklkLS07CiAgICAgICAgIH0KKyAgICAgIH0KICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICB9CisKKyAgaW50ZXJuYWwgdmlydHVhbCBaaXBQYWNrYWdlUmVsYXRpb25zaGlwIENyZWF0ZVJlbGF0aW9uc2hpcCgKKyAgICAgIFVyaSB0YXJnZXRVcmksCisgICAgICBUYXJnZXRNb2RlIHRhcmdldE1vZGUsCisgICAgICBzdHJpbmcgcmVsYXRpb25zaGlwVHlwZSkgeworICAgIHZhciByZWwgPSBuZXcgWmlwUGFja2FnZVJlbGF0aW9uc2hpcCgpOworICAgIHJlbC5UYXJnZXRVcmkgPSB0YXJnZXRVcmk7CisgICAgcmVsLlRhcmdldE1vZGUgPSB0YXJnZXRNb2RlOworICAgIHJlbC5SZWxhdGlvbnNoaXBUeXBlID0gcmVsYXRpb25zaGlwVHlwZTsKKyAgICByZWwuSWQgPSAicklkIiArIChtYXhSSWQrKyk7CisgICAgX3JlbHMuQWRkKHJlbCk7CisgICAgcmV0dXJuIHJlbDsKKyAgfQorCisgIGludGVybmFsIGJvb2wgUmVsYXRpb25zaGlwRXhpc3RzKHN0cmluZyBpZCkgeworICAgIHJldHVybiBfcmVscy5Db250YWluc0tleShpZCk7CisgIH0KKworICBpbnRlcm5hbCBaaXBQYWNrYWdlUmVsYXRpb25zaGlwQ29sbGVjdGlvbiBHZXRSZWxhdGlvbnNoaXBzQnlUeXBlKHN0cmluZyBzY2hlbWEpIHsKKyAgICByZXR1cm4gX3JlbHMuR2V0UmVsYXRpb25zaGlwc0J5VHlwZShzY2hlbWEpOworICB9CisKKyAgaW50ZXJuYWwgWmlwUGFja2FnZVJlbGF0aW9uc2hpcENvbGxlY3Rpb24gR2V0UmVsYXRpb25zaGlwcygpIHsKKyAgICByZXR1cm4gX3JlbHM7CisgIH0KKworICBpbnRlcm5hbCBaaXBQYWNrYWdlUmVsYXRpb25zaGlwIEdldFJlbGF0aW9uc2hpcChzdHJpbmcgaWQpIHsKKyAgICByZXR1cm4gX3JlbHNbaWRdOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBSZWFkUmVsYXRpb24oU3RyZWFtIGlucHV0U3RyZWFtLCBzdHJpbmcgc291cmNlKSB7CisgICAgdmFyIGRvYyA9IG5ldyBYbWxEb2N1bWVudCgpOworICAgIFhtbEhlbHBlci5Mb2FkWG1sU2FmZShkb2MsIGlucHV0U3RyZWFtKTsKKworICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgYyBpbiBkb2MuRG9jdW1lbnRFbGVtZW50LkNoaWxkTm9kZXMpIHsKKyAgICAgIHZhciByZWwgPSBuZXcgWmlwUGFja2FnZVJlbGF0aW9uc2hpcCgpOworICAgICAgcmVsLklkID0gYy5HZXRBdHRyaWJ1dGUoIklkIik7CisgICAgICByZWwuUmVsYXRpb25zaGlwVHlwZSA9IGMuR2V0QXR0cmlidXRlKCJUeXBlIik7CisgICAgICByZWwuVGFyZ2V0TW9kZSA9IGMuR2V0QXR0cmlidXRlKCJUYXJnZXRNb2RlIikKKyAgICAgICAgICAuRXF1YWxzKCJleHRlcm5hbCIsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpCisgICAgICAgICAgPyBUYXJnZXRNb2RlLkV4dGVybmFsCisgICAgICAgICAgOiBUYXJnZXRNb2RlLkludGVybmFsOworICAgICAgdHJ5IHsKKyAgICAgICAgcmVsLlRhcmdldFVyaSA9IG5ldyhjLkdldEF0dHJpYnV0ZSgiVGFyZ2V0IiksIFVyaUtpbmQuUmVsYXRpdmVPckFic29sdXRlKTsKKyAgICAgIH0gY2F0Y2ggeworICAgICAgICAvL1RoZSBVUkkgaXMgbm90IGEgdmFsaWQgVVJJLiBFbmNvZGUgaXQgdG8gbWFrZSBpIHZhbGlkLgorICAgICAgICByZWwuVGFyZ2V0VXJpID0gbmV3KAorICAgICAgICAgICAgVXJpLkVzY2FwZVVyaVN0cmluZygiSW52YWxpZDpVUkkgIiArIGMuR2V0QXR0cmlidXRlKCJUYXJnZXQiKSksCisgICAgICAgICAgICBVcmlLaW5kLlJlbGF0aXZlT3JBYnNvbHV0ZSk7CisgICAgICB9CisgICAgICBpZiAoIXN0cmluZy5Jc051bGxPckVtcHR5KHNvdXJjZSkpIHsKKyAgICAgICAgcmVsLlNvdXJjZVVyaSA9IG5ldyhzb3VyY2UsIFVyaUtpbmQuUmVsYXRpdmUpOworICAgICAgfQorICAgICAgaWYgKHJlbC5JZC5TdGFydHNXaXRoKCJyaWQiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkgeworICAgICAgICBpbnQgaWQ7CisgICAgICAgIGlmIChpbnQuVHJ5UGFyc2UocmVsLklkLlN1YnN0cmluZygzKSwgb3V0IGlkKSkgeworICAgICAgICAgIGlmIChpZCA+PSBtYXhSSWQKKyAgICAgICAgICAgICAgJiYgaWQKKyAgICAgICAgICAgICAgICAgIDwgaW50Lk1heFZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgLSAxMDAwMCkgLy9Ob3QgbGlrbHkgdG8gaGF2ZSB0aGlzIGhpZ2ggaWQncyBidXQgbWFrZSBzdXJlIHdlIGhhdmUgc3BhY2UgdG8gYXZvaWQgb3ZlcmZsb3cuCisgICAgICAgICAgeworICAgICAgICAgICAgbWF4UklkID0gaWQgKyAxOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgX3JlbHMuQWRkKHJlbCk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9FUFBsdXMvUGFja2FnaW5nL1ppcFBhY2thZ2VSZWxhdGlvbnNoaXBDb2xsZWN0aW9uLmNzIGIvRVBQbHVzL1BhY2thZ2luZy9aaXBQYWNrYWdlUmVsYXRpb25zaGlwQ29sbGVjdGlvbi5jcwppbmRleCAwODIwMzIyLi5kYWIxMDMwIDEwMDY0NAotLS0gYS9FUFBsdXMvUGFja2FnaW5nL1ppcFBhY2thZ2VSZWxhdGlvbnNoaXBDb2xsZWN0aW9uLmNzCisrKyBiL0VQUGx1cy9QYWNrYWdpbmcvWmlwUGFja2FnZVJlbGF0aW9uc2hpcENvbGxlY3Rpb24uY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDkzICsxMyw4NSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTI1LU9jdC0yMDEyCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uSU87CiB1c2luZyBTeXN0ZW0uSU8uQ29tcHJlc3Npb247CiB1c2luZyBTeXN0ZW0uU2VjdXJpdHk7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZwotewotICAgIHB1YmxpYyBjbGFzcyBaaXBQYWNrYWdlUmVsYXRpb25zaGlwQ29sbGVjdGlvbiA6IElFbnVtZXJhYmxlPFppcFBhY2thZ2VSZWxhdGlvbnNoaXA+Ci0gICAgewotICAgICAgICBpbnRlcm5hbCBwcm90ZWN0ZWQgRGljdGlvbmFyeTxzdHJpbmcsIFppcFBhY2thZ2VSZWxhdGlvbnNoaXA+IF9yZWxzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBaaXBQYWNrYWdlUmVsYXRpb25zaGlwPihTdHJpbmdDb21wYXJlci5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSk7Ci0gICAgICAgIGludGVybmFsIHZvaWQgQWRkKFppcFBhY2thZ2VSZWxhdGlvbnNoaXAgaXRlbSkKLSAgICAgICAgewotICAgICAgICAgICAgX3JlbHMuQWRkKGl0ZW0uSWQsIGl0ZW0pOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBJRW51bWVyYXRvcjxaaXBQYWNrYWdlUmVsYXRpb25zaGlwPiBHZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9yZWxzLlZhbHVlcy5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZzsKIAotICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3JlbHMuVmFsdWVzLkdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgfQorcHVibGljIGNsYXNzIFppcFBhY2thZ2VSZWxhdGlvbnNoaXBDb2xsZWN0aW9uIDogSUVudW1lcmFibGU8WmlwUGFja2FnZVJlbGF0aW9uc2hpcD4geworICBwcm90ZWN0ZWQgaW50ZXJuYWwgRGljdGlvbmFyeTxzdHJpbmcsIFppcFBhY2thZ2VSZWxhdGlvbnNoaXA+IF9yZWxzID0gbmV3KAorICAgICAgU3RyaW5nQ29tcGFyZXIuSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpOwogCi0gICAgICAgIGludGVybmFsIHZvaWQgUmVtb3ZlKHN0cmluZyBpZCkKLSAgICAgICAgewotICAgICAgICAgICAgX3JlbHMuUmVtb3ZlKGlkKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBib29sIENvbnRhaW5zS2V5KHN0cmluZyBpZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9yZWxzLkNvbnRhaW5zS2V5KGlkKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBaaXBQYWNrYWdlUmVsYXRpb25zaGlwIHRoaXNbc3RyaW5nIGlkXQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3JlbHNbaWRdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIFppcFBhY2thZ2VSZWxhdGlvbnNoaXBDb2xsZWN0aW9uIEdldFJlbGF0aW9uc2hpcHNCeVR5cGUoc3RyaW5nIHJlbGF0aW9uc2hpcFR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZXQgPSBuZXcgWmlwUGFja2FnZVJlbGF0aW9uc2hpcENvbGxlY3Rpb24oKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciByZWwgaW4gX3JlbHMuVmFsdWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChyZWwuUmVsYXRpb25zaGlwVHlwZSA9PSByZWxhdGlvbnNoaXBUeXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0LkFkZChyZWwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KKyAgaW50ZXJuYWwgdm9pZCBBZGQoWmlwUGFja2FnZVJlbGF0aW9uc2hpcCBpdGVtKSB7CisgICAgX3JlbHMuQWRkKGl0ZW0uSWQsIGl0ZW0pOworICB9CiAKLSAgICAgICAgaW50ZXJuYWwgdm9pZCBXcml0ZVppcChaaXBBcmNoaXZlIHppcEFyY2hpdmUsIHN0cmluZyBmaWxlbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGVudHJ5ID0gemlwQXJjaGl2ZS5DcmVhdGVFbnRyeShmaWxlbmFtZSk7Ci0gICAgICAgICAgICB1c2luZyB2YXIgd3JpdGVyID0gbmV3IFN0cmVhbVdyaXRlcihlbnRyeS5PcGVuKCkpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgd3JpdGVyLldyaXRlKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIj8+PFJlbGF0aW9uc2hpcHMgeG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHNcIj4iKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciByZWwgaW4gX3JlbHMuVmFsdWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgiPFJlbGF0aW9uc2hpcCBJZD1cInswfVwiIFR5cGU9XCJ7MX1cIiBUYXJnZXQ9XCJ7Mn1cInszfS8+IiwgU2VjdXJpdHlFbGVtZW50LkVzY2FwZShyZWwuSWQpLCByZWwuUmVsYXRpb25zaGlwVHlwZSwgU2VjdXJpdHlFbGVtZW50LkVzY2FwZShyZWwuVGFyZ2V0VXJpLk9yaWdpbmFsU3RyaW5nKSwgcmVsLlRhcmdldE1vZGUgPT0gVGFyZ2V0TW9kZS5FeHRlcm5hbCA/ICIgVGFyZ2V0TW9kZT1cIkV4dGVybmFsXCIiIDogIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVyLldyaXRlKCI8L1JlbGF0aW9uc2hpcHM+Iik7Ci0gICAgICAgIH0KKyAgcHVibGljIElFbnVtZXJhdG9yPFppcFBhY2thZ2VSZWxhdGlvbnNoaXA+IEdldEVudW1lcmF0b3IoKSB7CisgICAgcmV0dXJuIF9yZWxzLlZhbHVlcy5HZXRFbnVtZXJhdG9yKCk7CisgIH0KIAotICAgICAgICBwdWJsaWMgaW50IENvdW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfcmVscy5Db3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkgeworICAgIHJldHVybiBfcmVscy5WYWx1ZXMuR2V0RW51bWVyYXRvcigpOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBSZW1vdmUoc3RyaW5nIGlkKSB7CisgICAgX3JlbHMuUmVtb3ZlKGlkKTsKKyAgfQorCisgIGludGVybmFsIGJvb2wgQ29udGFpbnNLZXkoc3RyaW5nIGlkKSB7CisgICAgcmV0dXJuIF9yZWxzLkNvbnRhaW5zS2V5KGlkKTsKKyAgfQorCisgIGludGVybmFsIFppcFBhY2thZ2VSZWxhdGlvbnNoaXAgdGhpc1tzdHJpbmcgaWRdID0+IF9yZWxzW2lkXTsKKworICBpbnRlcm5hbCBaaXBQYWNrYWdlUmVsYXRpb25zaGlwQ29sbGVjdGlvbiBHZXRSZWxhdGlvbnNoaXBzQnlUeXBlKHN0cmluZyByZWxhdGlvbnNoaXBUeXBlKSB7CisgICAgdmFyIHJldCA9IG5ldyBaaXBQYWNrYWdlUmVsYXRpb25zaGlwQ29sbGVjdGlvbigpOworICAgIGZvcmVhY2ggKHZhciByZWwgaW4gX3JlbHMuVmFsdWVzKSB7CisgICAgICBpZiAocmVsLlJlbGF0aW9uc2hpcFR5cGUgPT0gcmVsYXRpb25zaGlwVHlwZSkgeworICAgICAgICByZXQuQWRkKHJlbCk7CisgICAgICB9CiAgICAgfQorICAgIHJldHVybiByZXQ7CisgIH0KKworICBpbnRlcm5hbCB2b2lkIFdyaXRlWmlwKFppcEFyY2hpdmUgemlwQXJjaGl2ZSwgc3RyaW5nIGZpbGVuYW1lKSB7CisgICAgdmFyIGVudHJ5ID0gemlwQXJjaGl2ZS5DcmVhdGVFbnRyeShmaWxlbmFtZSk7CisgICAgdXNpbmcgdmFyIHdyaXRlciA9IG5ldyBTdHJlYW1Xcml0ZXIoZW50cnkuT3BlbigpKTsKKworICAgIHdyaXRlci5Xcml0ZSgKKyAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz48UmVsYXRpb25zaGlwcyB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9wYWNrYWdlLzIwMDYvcmVsYXRpb25zaGlwc1wiPiIpOworICAgIGZvcmVhY2ggKHZhciByZWwgaW4gX3JlbHMuVmFsdWVzKSB7CisgICAgICB3cml0ZXIuV3JpdGUoCisgICAgICAgICAgIjxSZWxhdGlvbnNoaXAgSWQ9XCJ7MH1cIiBUeXBlPVwiezF9XCIgVGFyZ2V0PVwiezJ9XCJ7M30vPiIsCisgICAgICAgICAgU2VjdXJpdHlFbGVtZW50LkVzY2FwZShyZWwuSWQpLAorICAgICAgICAgIHJlbC5SZWxhdGlvbnNoaXBUeXBlLAorICAgICAgICAgIFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUocmVsLlRhcmdldFVyaS5PcmlnaW5hbFN0cmluZyksCisgICAgICAgICAgcmVsLlRhcmdldE1vZGUgPT0gVGFyZ2V0TW9kZS5FeHRlcm5hbCA/ICIgVGFyZ2V0TW9kZT1cIkV4dGVybmFsXCIiIDogIiIpOworICAgIH0KKyAgICB3cml0ZXIuV3JpdGUoIjwvUmVsYXRpb25zaGlwcz4iKTsKKyAgfQorCisgIHB1YmxpYyBpbnQgQ291bnQgeworICAgIGdldCB7IHJldHVybiBfcmVscy5Db3VudDsgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9FUFBsdXMvUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKaW5kZXggYjRiMzJhZC4uMmZjOTEzNyAxMDA2NDQKLS0tIGEvRVBQbHVzL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyBiL0VQUGx1cy9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTcgKzEzLDE3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMTAtU0VQLTIwMDkKQEAgLTM0LDE5ICszNCwyMiBAQAogdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwogdXNpbmcgU3lzdGVtLlNlY3VyaXR5OwogCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAorLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZwogLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KIFthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiRVBQbHVzIDQuMC40IildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RGVzY3JpcHRpb24oIkFsbG93cyBFeGNlbCBmaWxlcyh4bHN4O3hsc20pIHRvIGJlIGNyZWF0ZWQgb24gdGhlIHNlcnZlci4gU2VlIGVwcGx1cy5jb2RlcGxleC5jb20iKV0KK1thc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigKKyAgICAiQWxsb3dzIEV4Y2VsIGZpbGVzKHhsc3g7eGxzbSkgdG8gYmUgY3JlYXRlZCBvbiB0aGUgc2VydmVyLiBTZWUgZXBwbHVzLmNvZGVwbGV4LmNvbSIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUNvbmZpZ3VyYXRpb24oIiIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUNvbXBhbnkoIkVQUGx1cyIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseVByb2R1Y3QoIkVQUGx1cyA0LjAuNCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IDIwMDktIMKpSmFuIEvDpGxsbWFuLiBQYXJ0cyBvZiB0aGUgSW50ZXJmYWNlIGNvbWVzIGZyb20gRXhjZWxQYWNrYWdlLXByb2plY3QiKV0KK1thc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoCisgICAgIkNvcHlyaWdodCAyMDA5LSDCqUphbiBLw6RsbG1hbi4gUGFydHMgb2YgdGhlIEludGVyZmFjZSBjb21lcyBmcm9tIEV4Y2VsUGFja2FnZS1wcm9qZWN0IildCiBbYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCJUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChMR1BMKSIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQogW2Fzc2VtYmx5OiBDb21WaXNpYmxlKGZhbHNlKV0KLVthc3NlbWJseTogSW50ZXJuYWxzVmlzaWJsZVRvKCJFUFBsdXNUZXN0LCBQdWJsaWNLZXk9MDAyNDAwMDAwNDgwMDAwMDk0MDAwMDAwMDYwMjAwMDAwMDI0MDAwMDUyNTM0MTMxMDAwNDAwMDAwMTAwMDEwMDFkZDExMzA4ZWM5M2E2ZWJjZWM3MjdlMTgzYTg5NzJkYzZmOTVjMjNlY2MzNGFhMDRmNDBjYmZjOWMxN2IwOGI0YTBlYTVjMDBkY2QyMDNiYWNlNDRkMTVhMzBjZTg3OTZlMzgxNzZhZTg4ZTk2MGNlZmY5Y2M0MzlhYjkzODczOGJhMGU2MDNlM2QxNTVmYzI5ODc5OWIzOTFjMDA0ZmMwZWI0MzkzZGQyNTRjZTI1ZGIzNDFlYjQzMzAzZTRjNDg4Yzk1MDBlMTI2ZjEyODg1OTRmMDcxMGVjN2Q2NDJlOWM3MmU3NmRkODYwNjQ5ZjFjNDgyNDljMDBlMzFmYmEiKV0KK1thc3NlbWJseTogSW50ZXJuYWxzVmlzaWJsZVRvKAorICAgICJFUFBsdXNUZXN0LCBQdWJsaWNLZXk9MDAyNDAwMDAwNDgwMDAwMDk0MDAwMDAwMDYwMjAwMDAwMDI0MDAwMDUyNTM0MTMxMDAwNDAwMDAwMTAwMDEwMDFkZDExMzA4ZWM5M2E2ZWJjZWM3MjdlMTgzYTg5NzJkYzZmOTVjMjNlY2MzNGFhMDRmNDBjYmZjOWMxN2IwOGI0YTBlYTVjMDBkY2QyMDNiYWNlNDRkMTVhMzBjZTg3OTZlMzgxNzZhZTg4ZTk2MGNlZmY5Y2M0MzlhYjkzODczOGJhMGU2MDNlM2QxNTVmYzI5ODc5OWIzOTFjMDA0ZmMwZWI0MzkzZGQyNTRjZTI1ZGIzNDFlYjQzMzAzZTRjNDg4Yzk1MDBlMTI2ZjEyODg1OTRmMDcxMGVjN2Q2NDJlOWM3MmU3NmRkODYwNjQ5ZjFjNDgyNDljMDBlMzFmYmEiKV0KIAogLy8gVGhlIGZvbGxvd2luZyBHVUlEIGlzIGZvciB0aGUgSUQgb2YgdGhlIHR5cGVsaWIgaWYgdGhpcyBwcm9qZWN0IGlzIGV4cG9zZWQgdG8gQ09NCiBbYXNzZW1ibHk6IEd1aWQoIjlkZDQzYjhkLWM0ZmUtNGE4Yi1hZDZlLTQ3ZWY4M2JiYmIwMSIpXQpAQCAtNTQsMTIgKzU3LDEyIEBACiAvLyBWZXJzaW9uIGluZm9ybWF0aW9uIGZvciBhbiBhc3NlbWJseSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZvdXIgdmFsdWVzOgogLy8KIC8vICAgICAgTWFqb3IgVmVyc2lvbgotLy8gICAgICBNaW5vciBWZXJzaW9uIAorLy8gICAgICBNaW5vciBWZXJzaW9uCiAvLyAgICAgIEJ1aWxkIE51bWJlcgogLy8gICAgICBSZXZpc2lvbgogLy8KLS8vIFlvdSBjYW4gc3BlY2lmeSBhbGwgdGhlIHZhbHVlcyBvciB5b3UgY2FuIGRlZmF1bHQgdGhlIFJldmlzaW9uIGFuZCBCdWlsZCBOdW1iZXJzIAorLy8gWW91IGNhbiBzcGVjaWZ5IGFsbCB0aGUgdmFsdWVzIG9yIHlvdSBjYW4gZGVmYXVsdCB0aGUgUmV2aXNpb24gYW5kIEJ1aWxkIE51bWJlcnMKIC8vIGJ5IHVzaW5nIHRoZSAnKicgYXMgc2hvd24gYmVsb3c6CiBbYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiNC4wLjQuMCIpXQogW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCI0LjAuNC4wIildCi1bYXNzZW1ibHk6IEFsbG93UGFydGlhbGx5VHJ1c3RlZENhbGxlcnNdClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorW2Fzc2VtYmx5OiBBbGxvd1BhcnRpYWxseVRydXN0ZWRDYWxsZXJzXQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1JhbmdlQ29sbGVjdGlvbi5jcyBiL0VQUGx1cy9SYW5nZUNvbGxlY3Rpb24uY3MKaW5kZXggMmUzNDQzZS4uOTBmYmZiOSAxMDA2NDQKLS0tIGEvRVBQbHVzL1JhbmdlQ29sbGVjdGlvbi5jcworKysgYi9FUFBsdXMvUmFuZ2VDb2xsZWN0aW9uLmNzCkBAIC0xLDI0ICsxLDMgQEAKLe+7vwotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKQEAgLTM0LDMwNCArMTMsMjY5IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDEwLTAyLTA0CiAgKiBKYW4gS8OkbGxtYW4JCSAgICBMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAgMjAxMS0xMi0yNwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLkRyYXdpbmcuVm1sO25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGlzIHRoZSBzdG9yZSBmb3IgYWxsIFJvd3MsIENvbHVtbnMgYW5kIENlbGxzLgotICAgIC8vLyBJdCBpcyBhIERpY3Rpb25hcnkgaW1wbGVtZW50YXRpb24gdGhhdCBhbGxvd3MgeW91IHRvIGNoYW5nZSB0aGUgS2V5ICh0aGUgUm93SUQsIENvbHVtbklEIG9yIENlbGxJRCApCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBpbnRlcm5hbCBjbGFzcyBSYW5nZUNvbGxlY3Rpb24gOiBJRW51bWVyYXRvcjxJUmFuZ2VJRD4sIElFbnVtZXJhYmxlLCBJRGlzcG9zYWJsZQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBJbmRleEl0ZW0KLSAgICAgICAgewotICAgICAgICAgICAgaW50ZXJuYWwgSW5kZXhJdGVtKHVsb25nIGNlbGxJZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSYW5nZUlEID0gY2VsbElkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWwgSW5kZXhJdGVtKHVsb25nIGNlbGxJZCwgaW50IGxpc3RQb2ludGVyKQotCSAgICAgICAgewotICAgICAgICAgICAgICAgIFJhbmdlSUQgPSBjZWxsSWQ7Ci0gICAgICAgICAgICAgICAgTGlzdFBvaW50ZXI9bGlzdFBvaW50ZXI7Ci0JICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCB1bG9uZyBSYW5nZUlEOwotICAgICAgICAgICAgaW50ZXJuYWwgaW50IExpc3RQb2ludGVyOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbXBhcmVzIGFuIEluZGV4SXRlbQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBjbGFzcyBDb21wYXJlIDogSUNvbXBhcmVyPEluZGV4SXRlbT4KLSAgICAgICAgewotICAgICAgICAgICAgI3JlZ2lvbiBJQ29tcGFyZXI8SW5kZXhJdGVtPiBNZW1iZXJzCi0gICAgICAgICAgICBpbnQgSUNvbXBhcmVyPEluZGV4SXRlbT4uQ29tcGFyZShJbmRleEl0ZW0geCwgSW5kZXhJdGVtIHkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHguUmFuZ2VJRCA8IHkuUmFuZ2VJRCA/IC0xIDogeC5SYW5nZUlEID4geS5SYW5nZUlEID8gMSA6IDA7Ci0gICAgICAgICAgICB9Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIAotICAgICAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICB9Ci0gICAgICAgIEluZGV4SXRlbVtdIF9jZWxsSW5kZXg7Ci0gICAgICAgIExpc3Q8SVJhbmdlSUQ+IF9jZWxsczsKLSAgICAgICAgc3RhdGljIHJlYWRvbmx5IENvbXBhcmUgX2NvbXBhcmVyPW5ldyBDb21wYXJlKCk7IAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGEgbmV3IGNvbGxlY3Rpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjZWxscyI+VGhlIENlbGxzLiBUaGlzIGxpc3QgbXVzdCBiZSBzb3J0ZWQ8L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCBSYW5nZUNvbGxlY3Rpb24oTGlzdDxJUmFuZ2VJRD4gY2VsbHMpCi0gICAgICAgIHsgICAKLSAgICAgICAgICAgIF9jZWxscyA9IGNlbGxzOwotICAgICAgICAgICAgSW5pdFNpemUoX2NlbGxzKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2NlbGxzLkNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NlbGxJbmRleFtpXSA9IG5ldyBJbmRleEl0ZW0oY2VsbHNbaV0uUmFuZ2VJRCwgaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgflJhbmdlQ29sbGVjdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9jZWxscyA9IG51bGw7Ci0gICAgICAgICAgICBfY2VsbEluZGV4ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm4gdGhlIGl0ZW0gd2l0aCB0aGUgUmFuZ2VJRAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJhbmdlSUQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIGludGVybmFsIElSYW5nZUlEIHRoaXNbdWxvbmcgUmFuZ2VJRF0KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9jZWxsc1tfY2VsbEluZGV4W0luZGV4T2YoUmFuZ2VJRCldLkxpc3RQb2ludGVyXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm4gc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIHNvcnRlZCBsaXN0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iSW5kZXgiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIGludGVybmFsIElSYW5nZUlEIHRoaXNbaW50IEluZGV4XQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2NlbGxzW19jZWxsSW5kZXhbSW5kZXhdLkxpc3RQb2ludGVyXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBpbnQgQ291bnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9jZWxscy5Db3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCB2b2lkIEFkZChJUmFuZ2VJRCBjZWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgaXggPSBJbmRleE9mKGNlbGwuUmFuZ2VJRCk7Ci0gICAgICAgICAgICBpZiAoaXggPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiSXRlbSBhbHJlYWR5IGV4aXN0cyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEluc2VydCh+aXgsIGNlbGwpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHZvaWQgRGVsZXRlKHVsb25nIGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGl4ID0gSW5kZXhPZihrZXkpOwotICAgICAgICAgICAgaWYgKGl4IDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiS2V5IGRvZXMgbm90IGV4aXN0cyIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBsaXN0UG9pbnRlciA9IF9jZWxsSW5kZXhbaXhdLkxpc3RQb2ludGVyOwotICAgICAgICAgICAgQXJyYXkuQ29weShfY2VsbEluZGV4LCBpeCArIDEsIF9jZWxsSW5kZXgsIGl4LCBfY2VsbHMuQ291bnQgLSBpeCAtIDEpOwotICAgICAgICAgICAgX2NlbGxzLlJlbW92ZUF0KGxpc3RQb2ludGVyKTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sOwogCi0gICAgICAgICAgICAvL0l0ZW0gaXMgcmVtb3ZlZCBzdWJ0cmFjdCBvbmUgZnJvbSBhbGwgaXRlbXMgd2l0aCBncmVhdGVyIExpc3RQb2ludGVyCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9jZWxscy5Db3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfY2VsbEluZGV4W2ldLkxpc3RQb2ludGVyID49IGxpc3RQb2ludGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2NlbGxJbmRleFtpXS5MaXN0UG9pbnRlci0tOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGludCBJbmRleE9mKHVsb25nIGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEFycmF5LkJpbmFyeVNlYXJjaDxJbmRleEl0ZW0+KF9jZWxsSW5kZXgsIDAsIF9jZWxscy5Db3VudCwgbmV3IEluZGV4SXRlbShrZXkpLCBfY29tcGFyZXIpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGJvb2wgQ29udGFpbnNLZXkodWxvbmcga2V5KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gSW5kZXhPZihrZXkpIDwgMCA/IGZhbHNlIDogdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgX3NpemUgeyBnZXQ7IHNldDsgfQotICAgICAgICAjcmVnaW9uICJSYW5nZUlEIG1hbmlwdWxhdGlvbiBtZXRob2RzIgotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbnNlcnQgYSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY29sbGVjaW9uIGJ1dCBkb250IHVwZGF0ZSB0aGUgY2VsbCBvbmx5IHRoZSBpbmRleAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd0lEIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd3MiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5JbmRleCBvZiBmaXJzdCByYW5nZUl0ZW08L3JldHVybnM+Ci0gICAgICAgIGludGVybmFsIGludCBJbnNlcnRSb3dzVXBkYXRlSW5kZXgodWxvbmcgcm93SUQsIGludCByb3dzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBJbmRleE9mKHJvd0lEKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gfmluZGV4OyAvL05vIG1hdGNoIGZvdW5kIGludmVydCB0byBnZXQgc3RhcnQgY2VsbAotICAgICAgICAgICAgdWxvbmcgcm93QWRkID0gKCgodWxvbmcpcm93cykgPDwgMjkpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IGluZGV4OyBpIDwgX2NlbGxzLkNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NlbGxJbmRleFtpXS5SYW5nZUlEICs9IHJvd0FkZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpbmRleDsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbnNlcnQgYSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY29sbGVjaW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93SUQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icm93cyI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkluZGV4IG9mIGZpcnN0IHJhbmdlSXRlbTwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgaW50IEluc2VydFJvd3ModWxvbmcgcm93SUQsIGludCByb3dzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBJbmRleE9mKHJvd0lEKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gfmluZGV4OyAvL05vIG1hdGNoIGZvdW5kIGludmVydCB0byBnZXQgc3RhcnQgY2VsbAotICAgICAgICAgICAgdWxvbmcgcm93QWRkPSgoKHVsb25nKXJvd3MpIDw8IDI5KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBpbmRleDsgaSA8IF9jZWxscy5Db3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jZWxsSW5kZXhbaV0uUmFuZ2VJRCArPSByb3dBZGQ7Ci0gICAgICAgICAgICAgICAgX2NlbGxzW19jZWxsSW5kZXhbaV0uTGlzdFBvaW50ZXJdLlJhbmdlSUQgKz0gcm93QWRkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERlbGV0ZSByb3dzIGZyb20gdGhlIGNvbGxlY2lvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd0lEIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJvd3MiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idXBkYXRlQ2VsbHMiPlVwZGF0ZSByYW5nZSBpZCdzIG9uIGNlbGxzPC9wYXJhbT4KLSAgICAgICAgaW50ZXJuYWwgaW50IERlbGV0ZVJvd3ModWxvbmcgcm93SUQsIGludCByb3dzLCBib29sIHVwZGF0ZUNlbGxzKQotICAgICAgICB7Ci0gICAgICAgICAgICB1bG9uZyByb3dBZGQgPSAoKCh1bG9uZylyb3dzKSA8PCAyOSk7Ci0gICAgICAgICAgICB2YXIgaW5kZXggPSBJbmRleE9mKHJvd0lEKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIGluZGV4ID0gfmluZGV4OyAvL05vIG1hdGNoIGZvdW5kIGludmVydCB0byBnZXQgc3RhcnQgY2VsbAotCi0gICAgICAgICAgICBpZiAoaW5kZXggPj0gX2NlbGxzLkNvdW50IHx8IF9jZWxsSW5kZXhbaW5kZXhdID09IG51bGwpIHJldHVybiAtMTsgICAvL05vIHJvdyBhYm92ZSB0aGlzIHJvdwotICAgICAgICAgICAgd2hpbGUgKGluZGV4IDwgX2NlbGxzLkNvdW50ICYmIF9jZWxsSW5kZXhbaW5kZXhdLlJhbmdlSUQgPCByb3dJRCArIHJvd0FkZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEZWxldGUoX2NlbGxJbmRleFtpbmRleF0uUmFuZ2VJRCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCB1cGRJbmRleCA9IEluZGV4T2Yocm93SUQgKyByb3dBZGQpOwotICAgICAgICAgICAgaWYgKHVwZEluZGV4IDwgMCkgdXBkSW5kZXggPSB+dXBkSW5kZXg7IC8vTm8gbWF0Y2ggZm91bmQgaW52ZXJ0IHRvIGdldCBzdGFydCBjZWxsCi0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSB1cGRJbmRleDsgaSA8IF9jZWxscy5Db3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jZWxsSW5kZXhbaV0uUmFuZ2VJRCAtPSByb3dBZGQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy9DaGFuZ2UgdGhlIGluZGV4Ci0gICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUNlbGxzKSBfY2VsbHNbX2NlbGxJbmRleFtpXS5MaXN0UG9pbnRlcl0uUmFuZ2VJRCAtPSByb3dBZGQ7ICAgIC8vQ2hhbmdlIHRoZSBjZWxsL3JvdyBvciBjb2x1bW4gb2JqZWN0Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBJbnNlcnRDb2x1bW4odWxvbmcgQ29sdW1uSUQsIGludCBjb2x1bW5zKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiV29ya2luZyBvbiBpdC4uLiIpKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCB2b2lkIERlbGV0ZUNvbHVtbih1bG9uZyBDb2x1bW5JRCxpbnQgY29sdW1ucykKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIldvcmtpbmcgb24gaXQuLi4iKSk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAjcmVnaW9uICJQcml2YXRlIE1ldGhvZHMiCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluaXQgdGhlIHNpemUgc3RhcnRpbmcgZnJvbSAxMjggaXRlbXMuIERvdWJsZSB0aGUgc2l6ZSB1bnRpbCB0aGUgbGlzdCBmaXRzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Il9jZWxscyI+PC9wYXJhbT4KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEluaXRTaXplKExpc3Q8SVJhbmdlSUQ+IF9jZWxscykKLSAgICAgICAgewotICAgICAgICAgICAgX3NpemUgPSAxMjg7Ci0gICAgICAgICAgICB3aGlsZSAoX2NlbGxzLkNvdW50ID4gX3NpemUpIF9zaXplIDw8PSAxOwotICAgICAgICAgICAgX2NlbGxJbmRleCA9IG5ldyBJbmRleEl0ZW1bX3NpemVdOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENoZWNrIHRoZSBzaXplIGFuZCBkb3VibGUgdGhlIHNpemUgaWYgb3V0IG9mIGJvdW5kCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBDaGVja1NpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX2NlbGxzLkNvdW50ID49IF9zaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9zaXplIDw8PSAxOwotICAgICAgICAgICAgICAgIEFycmF5LlJlc2l6ZShyZWYgX2NlbGxJbmRleCwgX3NpemUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBJbnNlcnQoaW50IGl4LCBJUmFuZ2VJRCBjZWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBDaGVja1NpemUoKTsKLSAgICAgICAgICAgIEFycmF5LkNvcHkoX2NlbGxJbmRleCwgaXgsIF9jZWxsSW5kZXgsIGl4ICsgMSwgX2NlbGxzLkNvdW50IC0gaXgpOwotICAgICAgICAgICAgX2NlbGxJbmRleFtpeF0gPSBuZXcgSW5kZXhJdGVtKGNlbGwuUmFuZ2VJRCwgX2NlbGxzLkNvdW50KTsKLSAgICAgICAgICAgIF9jZWxscy5BZGQoY2VsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gSUVudW1lcmF0b3I8SVJhbmdlSUQ+IE1lbWJlcnMKLQotICAgICAgICBJUmFuZ2VJRCBJRW51bWVyYXRvcjxJUmFuZ2VJRD4uQ3VycmVudAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gSURpc3Bvc2FibGUgZm9yIHRoZSBlbnVtZXJhdG9yIE1lbWJlcnMKLQotICAgICAgICB2b2lkIElEaXNwb3NhYmxlLkRpc3Bvc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfaXggPSAtMTsKLSAgICAgICAgfQotCi0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAjcmVnaW9uIElFbnVtZXJhdG9yIE1lbWJlcnMKLSAgICAgICAgaW50IF9peCA9IC0xOwotICAgICAgICBvYmplY3QgSUVudW1lcmF0b3IuQ3VycmVudAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9jZWxsc1tfY2VsbEluZGV4W19peF0uTGlzdFBvaW50ZXJdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBJRW51bWVyYXRvci5Nb3ZlTmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgX2l4Kys7Ci0gICAgICAgICAgIHJldHVybiBfaXggPCBfY2VsbHMuQ291bnQ7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIElFbnVtZXJhdG9yLlJlc2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgX2l4ID0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgI3JlZ2lvbiBJRW51bWVyYWJsZSBNZW1iZXJzCi0KLSAgICAgICAgSUVudW1lcmF0b3IgSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzLk1lbWJlcndpc2VDbG9uZSgpIGFzIElFbnVtZXJhdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgI2VuZHJlZ2lvbgorLy8vIDxzdW1tYXJ5PgorLy8vIFRoaXMgaXMgdGhlIHN0b3JlIGZvciBhbGwgUm93cywgQ29sdW1ucyBhbmQgQ2VsbHMuCisvLy8gSXQgaXMgYSBEaWN0aW9uYXJ5IGltcGxlbWVudGF0aW9uIHRoYXQgYWxsb3dzIHlvdSB0byBjaGFuZ2UgdGhlIEtleSAodGhlIFJvd0lELCBDb2x1bW5JRCBvciBDZWxsSUQgKQorLy8vIDwvc3VtbWFyeT4KK2ludGVybmFsIGNsYXNzIFJhbmdlQ29sbGVjdGlvbiA6IElFbnVtZXJhdG9yPElSYW5nZUlkPiwgSUVudW1lcmFibGUsIElEaXNwb3NhYmxlIHsKKyAgcHJpdmF0ZSBjbGFzcyBJbmRleEl0ZW0geworICAgIGludGVybmFsIEluZGV4SXRlbSh1bG9uZyBjZWxsSWQpIHsKKyAgICAgIFJhbmdlSUQgPSBjZWxsSWQ7CiAgICAgfQorCisgICAgaW50ZXJuYWwgSW5kZXhJdGVtKHVsb25nIGNlbGxJZCwgaW50IGxpc3RQb2ludGVyKSB7CisgICAgICBSYW5nZUlEID0gY2VsbElkOworICAgICAgTGlzdFBvaW50ZXIgPSBsaXN0UG9pbnRlcjsKKyAgICB9CisKKyAgICBpbnRlcm5hbCB1bG9uZyBSYW5nZUlEOworICAgIGludGVybmFsIGludCBMaXN0UG9pbnRlcjsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENvbXBhcmVzIGFuIEluZGV4SXRlbQorICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCBjbGFzcyBDb21wYXJlIDogSUNvbXBhcmVyPEluZGV4SXRlbT4geworICAgIGludCBJQ29tcGFyZXI8SW5kZXhJdGVtPi5Db21wYXJlKEluZGV4SXRlbSB4LCBJbmRleEl0ZW0geSkgeworICAgICAgcmV0dXJuIHguUmFuZ2VJRCA8IHkuUmFuZ2VJRAorICAgICAgICAgID8gLTEKKyAgICAgICAgICA6IHguUmFuZ2VJRCA+IHkuUmFuZ2VJRAorICAgICAgICAgICAgICA/IDEKKyAgICAgICAgICAgICAgOiAwOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgSW5kZXhJdGVtW10gX2NlbGxJbmRleDsKKyAgcHJpdmF0ZSBMaXN0PElSYW5nZUlkPiBfY2VsbHM7CisgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IENvbXBhcmUgX2NvbXBhcmVyID0gbmV3KCk7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ3JlYXRlcyBhIG5ldyBjb2xsZWN0aW9uCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iY2VsbHMiPlRoZSBDZWxscy4gVGhpcyBsaXN0IG11c3QgYmUgc29ydGVkPC9wYXJhbT4KKyAgaW50ZXJuYWwgUmFuZ2VDb2xsZWN0aW9uKExpc3Q8SVJhbmdlSWQ+IGNlbGxzKSB7CisgICAgX2NlbGxzID0gY2VsbHM7CisgICAgSW5pdFNpemUoX2NlbGxzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IF9jZWxscy5Db3VudDsgaSsrKSB7CisgICAgICBfY2VsbEluZGV4W2ldID0gbmV3KGNlbGxzW2ldLlJhbmdlSUQsIGkpOworICAgIH0KKyAgfQorCisgIH5SYW5nZUNvbGxlY3Rpb24oKSB7CisgICAgX2NlbGxzID0gbnVsbDsKKyAgICBfY2VsbEluZGV4ID0gbnVsbDsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybiB0aGUgaXRlbSB3aXRoIHRoZSBSYW5nZUlECisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icmFuZ2VJZCI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgaW50ZXJuYWwgSVJhbmdlSWQgdGhpc1t1bG9uZyByYW5nZUlkXSA9PiBfY2VsbHNbX2NlbGxJbmRleFtJbmRleE9mKHJhbmdlSWQpXS5MaXN0UG9pbnRlcl07CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJuIHNwZWNpZmllZCBpbmRleCBmcm9tIHRoZSBzb3J0ZWQgbGlzdAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBpbnRlcm5hbCBJUmFuZ2VJZCB0aGlzW2ludCBpbmRleF0geworICAgIGdldCB7IHJldHVybiBfY2VsbHNbX2NlbGxJbmRleFtpbmRleF0uTGlzdFBvaW50ZXJdOyB9CisgIH0KKworICBpbnRlcm5hbCBpbnQgQ291bnQgeworICAgIGdldCB7IHJldHVybiBfY2VsbHMuQ291bnQ7IH0KKyAgfQorCisgIGludGVybmFsIHZvaWQgQWRkKElSYW5nZUlkIGNlbGwpIHsKKyAgICB2YXIgaXggPSBJbmRleE9mKGNlbGwuUmFuZ2VJRCk7CisgICAgaWYgKGl4ID49IDApIHsKKyAgICAgIHRocm93IChuZXcoIkl0ZW0gYWxyZWFkeSBleGlzdHMiKSk7CisgICAgfQorICAgIEluc2VydCh+aXgsIGNlbGwpOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBEZWxldGUodWxvbmcga2V5KSB7CisgICAgdmFyIGl4ID0gSW5kZXhPZihrZXkpOworICAgIGlmIChpeCA8IDApIHsKKyAgICAgIHRocm93IChuZXcoIktleSBkb2VzIG5vdCBleGlzdHMiKSk7CisgICAgfQorICAgIGludCBsaXN0UG9pbnRlciA9IF9jZWxsSW5kZXhbaXhdLkxpc3RQb2ludGVyOworICAgIEFycmF5LkNvcHkoX2NlbGxJbmRleCwgaXggKyAxLCBfY2VsbEluZGV4LCBpeCwgX2NlbGxzLkNvdW50IC0gaXggLSAxKTsKKyAgICBfY2VsbHMuUmVtb3ZlQXQobGlzdFBvaW50ZXIpOworCisgICAgLy9JdGVtIGlzIHJlbW92ZWQgc3VidHJhY3Qgb25lIGZyb20gYWxsIGl0ZW1zIHdpdGggZ3JlYXRlciBMaXN0UG9pbnRlcgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX2NlbGxzLkNvdW50OyBpKyspIHsKKyAgICAgIGlmIChfY2VsbEluZGV4W2ldLkxpc3RQb2ludGVyID49IGxpc3RQb2ludGVyKSB7CisgICAgICAgIF9jZWxsSW5kZXhbaV0uTGlzdFBvaW50ZXItLTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbnRlcm5hbCBpbnQgSW5kZXhPZih1bG9uZyBrZXkpIHsKKyAgICByZXR1cm4gQXJyYXkuQmluYXJ5U2VhcmNoKF9jZWxsSW5kZXgsIDAsIF9jZWxscy5Db3VudCwgbmV3KGtleSksIF9jb21wYXJlcik7CisgIH0KKworICBpbnRlcm5hbCBib29sIENvbnRhaW5zS2V5KHVsb25nIGtleSkgeworICAgIHJldHVybiBJbmRleE9mKGtleSkgPCAwID8gZmFsc2UgOiB0cnVlOworICB9CisKKyAgcHJpdmF0ZSBpbnQgX3NpemUgeyBnZXQ7IHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluc2VydCBhIG51bWJlciBvZiByb3dzIGluIHRoZSBjb2xsZWNpb24gYnV0IGRvbnQgdXBkYXRlIHRoZSBjZWxsIG9ubHkgdGhlIGluZGV4CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icm93SWQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icm93cyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPkluZGV4IG9mIGZpcnN0IHJhbmdlSXRlbTwvcmV0dXJucz4KKyAgaW50ZXJuYWwgaW50IEluc2VydFJvd3NVcGRhdGVJbmRleCh1bG9uZyByb3dJZCwgaW50IHJvd3MpIHsKKyAgICBpbnQgaW5kZXggPSBJbmRleE9mKHJvd0lkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICBpbmRleCA9IH5pbmRleDsgLy9ObyBtYXRjaCBmb3VuZCBpbnZlcnQgdG8gZ2V0IHN0YXJ0IGNlbGwKKyAgICB9CisgICAgdWxvbmcgcm93QWRkID0gKCgodWxvbmcpcm93cykgPDwgMjkpOworICAgIGZvciAoaW50IGkgPSBpbmRleDsgaSA8IF9jZWxscy5Db3VudDsgaSsrKSB7CisgICAgICBfY2VsbEluZGV4W2ldLlJhbmdlSUQgKz0gcm93QWRkOworICAgIH0KKyAgICByZXR1cm4gaW5kZXg7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbnNlcnQgYSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgY29sbGVjaW9uCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icm93SWQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icm93cyI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPkluZGV4IG9mIGZpcnN0IHJhbmdlSXRlbTwvcmV0dXJucz4KKyAgaW50ZXJuYWwgaW50IEluc2VydFJvd3ModWxvbmcgcm93SWQsIGludCByb3dzKSB7CisgICAgaW50IGluZGV4ID0gSW5kZXhPZihyb3dJZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgaW5kZXggPSB+aW5kZXg7IC8vTm8gbWF0Y2ggZm91bmQgaW52ZXJ0IHRvIGdldCBzdGFydCBjZWxsCisgICAgfQorICAgIHVsb25nIHJvd0FkZCA9ICgoKHVsb25nKXJvd3MpIDw8IDI5KTsKKyAgICBmb3IgKGludCBpID0gaW5kZXg7IGkgPCBfY2VsbHMuQ291bnQ7IGkrKykgeworICAgICAgX2NlbGxJbmRleFtpXS5SYW5nZUlEICs9IHJvd0FkZDsKKyAgICAgIF9jZWxsc1tfY2VsbEluZGV4W2ldLkxpc3RQb2ludGVyXS5SYW5nZUlEICs9IHJvd0FkZDsKKyAgICB9CisgICAgcmV0dXJuIGluZGV4OworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRGVsZXRlIHJvd3MgZnJvbSB0aGUgY29sbGVjaW9uCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icm93SWQiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icm93cyI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ1cGRhdGVDZWxscyI+VXBkYXRlIHJhbmdlIGlkJ3Mgb24gY2VsbHM8L3BhcmFtPgorICBpbnRlcm5hbCBpbnQgRGVsZXRlUm93cyh1bG9uZyByb3dJZCwgaW50IHJvd3MsIGJvb2wgdXBkYXRlQ2VsbHMpIHsKKyAgICB1bG9uZyByb3dBZGQgPSAoKCh1bG9uZylyb3dzKSA8PCAyOSk7CisgICAgdmFyIGluZGV4ID0gSW5kZXhPZihyb3dJZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgaW5kZXggPSB+aW5kZXg7IC8vTm8gbWF0Y2ggZm91bmQgaW52ZXJ0IHRvIGdldCBzdGFydCBjZWxsCisgICAgfQorCisgICAgaWYgKGluZGV4ID49IF9jZWxscy5Db3VudCB8fCBfY2VsbEluZGV4W2luZGV4XSA9PSBudWxsKSB7CisgICAgICByZXR1cm4gLTE7IC8vTm8gcm93IGFib3ZlIHRoaXMgcm93CisgICAgfQorICAgIHdoaWxlIChpbmRleCA8IF9jZWxscy5Db3VudCAmJiBfY2VsbEluZGV4W2luZGV4XS5SYW5nZUlEIDwgcm93SWQgKyByb3dBZGQpIHsKKyAgICAgIERlbGV0ZShfY2VsbEluZGV4W2luZGV4XS5SYW5nZUlEKTsKKyAgICB9CisKKyAgICBpbnQgdXBkSW5kZXggPSBJbmRleE9mKHJvd0lkICsgcm93QWRkKTsKKyAgICBpZiAodXBkSW5kZXggPCAwKSB7CisgICAgICB1cGRJbmRleCA9IH51cGRJbmRleDsgLy9ObyBtYXRjaCBmb3VuZCBpbnZlcnQgdG8gZ2V0IHN0YXJ0IGNlbGwKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gdXBkSW5kZXg7IGkgPCBfY2VsbHMuQ291bnQ7IGkrKykgeworICAgICAgX2NlbGxJbmRleFtpXS5SYW5nZUlEIC09IHJvd0FkZDsgLy9DaGFuZ2UgdGhlIGluZGV4CisgICAgICBpZiAodXBkYXRlQ2VsbHMpIHsKKyAgICAgICAgX2NlbGxzW19jZWxsSW5kZXhbaV0uTGlzdFBvaW50ZXJdLlJhbmdlSUQgLT0gcm93QWRkOyAvL0NoYW5nZSB0aGUgY2VsbC9yb3cgb3IgY29sdW1uIG9iamVjdAorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5kZXg7CisgIH0KKworICBpbnRlcm5hbCB2b2lkIEluc2VydENvbHVtbih1bG9uZyBjb2x1bW5JZCwgaW50IGNvbHVtbnMpIHsKKyAgICB0aHJvdyAobmV3KCJXb3JraW5nIG9uIGl0Li4uIikpOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBEZWxldGVDb2x1bW4odWxvbmcgY29sdW1uSWQsIGludCBjb2x1bW5zKSB7CisgICAgdGhyb3cgKG5ldygiV29ya2luZyBvbiBpdC4uLiIpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluaXQgdGhlIHNpemUgc3RhcnRpbmcgZnJvbSAxMjggaXRlbXMuIERvdWJsZSB0aGUgc2l6ZSB1bnRpbCB0aGUgbGlzdCBmaXRzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Il9jZWxscyI+PC9wYXJhbT4KKyAgcHJpdmF0ZSB2b2lkIEluaXRTaXplKExpc3Q8SVJhbmdlSWQ+IGNlbGxzKSB7CisgICAgX3NpemUgPSAxMjg7CisgICAgd2hpbGUgKGNlbGxzLkNvdW50ID4gX3NpemUpIHsKKyAgICAgIF9zaXplIDw8PSAxOworICAgIH0KKyAgICBfY2VsbEluZGV4ID0gbmV3IEluZGV4SXRlbVtfc2l6ZV07CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDaGVjayB0aGUgc2l6ZSBhbmQgZG91YmxlIHRoZSBzaXplIGlmIG91dCBvZiBib3VuZAorICAvLy8gPC9zdW1tYXJ5PgorICBwcml2YXRlIHZvaWQgQ2hlY2tTaXplKCkgeworICAgIGlmIChfY2VsbHMuQ291bnQgPj0gX3NpemUpIHsKKyAgICAgIF9zaXplIDw8PSAxOworICAgICAgQXJyYXkuUmVzaXplKHJlZiBfY2VsbEluZGV4LCBfc2l6ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIEluc2VydChpbnQgaXgsIElSYW5nZUlkIGNlbGwpIHsKKyAgICBDaGVja1NpemUoKTsKKyAgICBBcnJheS5Db3B5KF9jZWxsSW5kZXgsIGl4LCBfY2VsbEluZGV4LCBpeCArIDEsIF9jZWxscy5Db3VudCAtIGl4KTsKKyAgICBfY2VsbEluZGV4W2l4XSA9IG5ldyhjZWxsLlJhbmdlSUQsIF9jZWxscy5Db3VudCk7CisgICAgX2NlbGxzLkFkZChjZWxsKTsKKyAgfQorCisgIElSYW5nZUlkIElFbnVtZXJhdG9yPElSYW5nZUlkPi5DdXJyZW50IHsKKyAgICBnZXQgeyB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsgfQorICB9CisKKyAgdm9pZCBJRGlzcG9zYWJsZS5EaXNwb3NlKCkgeworICAgIF9peCA9IC0xOworICB9CisKKyAgcHJpdmF0ZSBpbnQgX2l4ID0gLTE7CisKKyAgb2JqZWN0IElFbnVtZXJhdG9yLkN1cnJlbnQgeworICAgIGdldCB7IHJldHVybiBfY2VsbHNbX2NlbGxJbmRleFtfaXhdLkxpc3RQb2ludGVyXTsgfQorICB9CisKKyAgYm9vbCBJRW51bWVyYXRvci5Nb3ZlTmV4dCgpIHsKKyAgICBfaXgrKzsKKyAgICByZXR1cm4gX2l4IDwgX2NlbGxzLkNvdW50OworICB9CisKKyAgdm9pZCBJRW51bWVyYXRvci5SZXNldCgpIHsKKyAgICBfaXggPSAtMTsKKyAgfQorCisgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKSB7CisgICAgcmV0dXJuIE1lbWJlcndpc2VDbG9uZSgpIGFzIElFbnVtZXJhdG9yOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRHhmL0R4ZlN0eWxlQmFzZS5jcyBiL0VQUGx1cy9TdHlsZS9EeGYvRHhmU3R5bGVCYXNlLmNzCmluZGV4IGJiYWE2YmQuLjdiYmJjZDAgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9EeGYvRHhmU3R5bGVCYXNlLmNzCisrKyBiL0VQUGx1cy9TdHlsZS9EeGYvRHhmU3R5bGVCYXNlLmNzCkBAIC0xLDk4ICsxLDc5IEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLkR4ZgotewotICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEeGZTdHlsZUJhc2U8VD4KLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBFeGNlbFN0eWxlcyBfc3R5bGVzOwotICAgICAgICBpbnRlcm5hbCBEeGZTdHlsZUJhc2UoRXhjZWxTdHlsZXMgc3R5bGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc3R5bGVzID0gc3R5bGVzOwotICAgICAgICAgICAgQWxsb3dDaGFuZ2UgPSBmYWxzZTsgLy9Eb24ndCB0b3VjaCB0aGlzIHZhbHVlIGluIHRoZSBzdHlsZXMueG1sIChieSBkZWZhdWx0KS4gV2hlbiBEeGZzIGlzIGZ1bGx5IGltcGxlbWVudGVkIHRoaXMgY2FuIGJlIHJlbW92ZWQuCi0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIGFic3RyYWN0IHN0cmluZyBJZCB7IGdldDsgfQotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgYWJzdHJhY3QgYm9vbCBIYXNWYWx1ZXtnZXQ7fQotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgYWJzdHJhY3Qgdm9pZCBDcmVhdGVOb2RlcyhYbWxIZWxwZXIgaGVscGVyLCBzdHJpbmcgcGF0aCk7Ci0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBhYnN0cmFjdCBUIENsb25lKCk7Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIFNldFZhbHVlQ29sb3IoWG1sSGVscGVyIGhlbHBlcixzdHJpbmcgcGF0aCwgRXhjZWxEeGZDb2xvciBjb2xvcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvbG9yICE9IG51bGwgJiYgY29sb3IuSGFzVmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbG9yLkNvbG9yICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXRWYWx1ZShoZWxwZXIsIHBhdGggKyAiL0ByZ2IiLCBjb2xvci5Db2xvci5WYWx1ZS5Ub0FyZ2IoKS5Ub1N0cmluZygieCIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sb3IuQXV0byAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2V0VmFsdWVCb29sKGhlbHBlciwgcGF0aCArICIvQGF1dG8iLCBjb2xvci5BdXRvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sb3IuVGhlbWUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNldFZhbHVlKGhlbHBlciwgcGF0aCArICIvQHRoZW1lIiwgY29sb3IuVGhlbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xvci5JbmRleCAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2V0VmFsdWUoaGVscGVyLCBwYXRoICsgIi9AaW5kZXhlZCIsIGNvbG9yLkluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbG9yLlRpbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNldFZhbHVlKGhlbHBlciwgcGF0aCArICIvQHRpbnQiLCBjb2xvci5UaW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2FtZSBhcyBTZXRWYWx1ZSBidXQgd2lsbCBzZXQgZmlyc3QgY2hhciB0byBsb3dlciBjYXNlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImhlbHBlciI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXRoIj48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InYiPjwvcGFyYW0+Ci0gICAgICAgIHByb3RlY3RlZCB2b2lkIFNldFZhbHVlRW51bShYbWxIZWxwZXIgaGVscGVyLCBzdHJpbmcgcGF0aCwgRW51bSB2KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodiA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhlbHBlci5EZWxldGVOb2RlKHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzID0gdi5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgIHMgPSBzLlN1YnN0cmluZygwLCAxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgcy5TdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICAgICAgaGVscGVyLlNldFhtbE5vZGVTdHJpbmcocGF0aCwgcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgU2V0VmFsdWUoWG1sSGVscGVyIGhlbHBlciwgc3RyaW5nIHBhdGgsIG9iamVjdCB2KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodiA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhlbHBlci5EZWxldGVOb2RlKHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKHBhdGgsIHYuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgU2V0VmFsdWVCb29sKFhtbEhlbHBlciBoZWxwZXIsIHN0cmluZyBwYXRoLCBib29sPyB2KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodiA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhlbHBlci5EZWxldGVOb2RlKHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhlbHBlci5TZXRYbWxOb2RlQm9vbChwYXRoLCAoYm9vbCl2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgc3RyaW5nIEdldEFzU3RyaW5nKG9iamVjdCB2KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKHYgPz8gIiIpLlRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSXMgdGhpcyB2YWx1ZSBhbGxvd2VkIHRvIGJlIGNoYW5nZWQ/Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBib29sIEFsbG93Q2hhbmdlIHsgZ2V0OyBzZXQ7IH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLkR4ZjsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIER4ZlN0eWxlQmFzZTxUPiB7CisgIHByb3RlY3RlZCBFeGNlbFN0eWxlcyBfc3R5bGVzOworCisgIGludGVybmFsIER4ZlN0eWxlQmFzZShFeGNlbFN0eWxlcyBzdHlsZXMpIHsKKyAgICBfc3R5bGVzID0gc3R5bGVzOworICAgIEFsbG93Q2hhbmdlID0gZmFsc2U7IC8vRG9uJ3QgdG91Y2ggdGhpcyB2YWx1ZSBpbiB0aGUgc3R5bGVzLnhtbCAoYnkgZGVmYXVsdCkuIFdoZW4gRHhmcyBpcyBmdWxseSBpbXBsZW1lbnRlZCB0aGlzIGNhbiBiZSByZW1vdmVkLgorICB9CisKKyAgcHJvdGVjdGVkIGludGVybmFsIGFic3RyYWN0IHN0cmluZyBJZCB7IGdldDsgfQorCisgIHByb3RlY3RlZCBpbnRlcm5hbCBhYnN0cmFjdCBib29sIEhhc1ZhbHVlIHsgZ2V0OyB9CisKKyAgcHJvdGVjdGVkIGludGVybmFsIGFic3RyYWN0IHZvaWQgQ3JlYXRlTm9kZXMoWG1sSGVscGVyIGhlbHBlciwgc3RyaW5nIHBhdGgpOworCisgIHByb3RlY3RlZCBpbnRlcm5hbCBhYnN0cmFjdCBUIENsb25lKCk7CisKKyAgcHJvdGVjdGVkIHZvaWQgU2V0VmFsdWVDb2xvcihYbWxIZWxwZXIgaGVscGVyLCBzdHJpbmcgcGF0aCwgRXhjZWxEeGZDb2xvciBjb2xvcikgeworICAgIGlmIChjb2xvciAhPSBudWxsICYmIGNvbG9yLkhhc1ZhbHVlKSB7CisgICAgICBpZiAoY29sb3IuQ29sb3IgIT0gbnVsbCkgeworICAgICAgICBTZXRWYWx1ZShoZWxwZXIsIHBhdGggKyAiL0ByZ2IiLCBjb2xvci5Db2xvci5WYWx1ZS5Ub0FyZ2IoKS5Ub1N0cmluZygieCIpKTsKKyAgICAgIH0gZWxzZSBpZiAoY29sb3IuQXV0byAhPSBudWxsKSB7CisgICAgICAgIFNldFZhbHVlQm9vbChoZWxwZXIsIHBhdGggKyAiL0BhdXRvIiwgY29sb3IuQXV0byk7CisgICAgICB9IGVsc2UgaWYgKGNvbG9yLlRoZW1lICE9IG51bGwpIHsKKyAgICAgICAgU2V0VmFsdWUoaGVscGVyLCBwYXRoICsgIi9AdGhlbWUiLCBjb2xvci5UaGVtZSk7CisgICAgICB9IGVsc2UgaWYgKGNvbG9yLkluZGV4ICE9IG51bGwpIHsKKyAgICAgICAgU2V0VmFsdWUoaGVscGVyLCBwYXRoICsgIi9AaW5kZXhlZCIsIGNvbG9yLkluZGV4KTsKKyAgICAgIH0KKyAgICAgIGlmIChjb2xvci5UaW50ICE9IG51bGwpIHsKKyAgICAgICAgU2V0VmFsdWUoaGVscGVyLCBwYXRoICsgIi9AdGludCIsIGNvbG9yLlRpbnQpOworICAgICAgfQogICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNhbWUgYXMgU2V0VmFsdWUgYnV0IHdpbGwgc2V0IGZpcnN0IGNoYXIgdG8gbG93ZXIgY2FzZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJoZWxwZXIiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icGF0aCI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ2Ij48L3BhcmFtPgorICBwcm90ZWN0ZWQgdm9pZCBTZXRWYWx1ZUVudW0oWG1sSGVscGVyIGhlbHBlciwgc3RyaW5nIHBhdGgsIEVudW0gdikgeworICAgIGlmICh2ID09IG51bGwpIHsKKyAgICAgIGhlbHBlci5EZWxldGVOb2RlKHBhdGgpOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgcyA9IHYuVG9TdHJpbmcoKTsKKyAgICAgIHMgPSBzLlN1YnN0cmluZygwLCAxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgcy5TdWJzdHJpbmcoMSk7CisgICAgICBoZWxwZXIuU2V0WG1sTm9kZVN0cmluZyhwYXRoLCBzKTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBTZXRWYWx1ZShYbWxIZWxwZXIgaGVscGVyLCBzdHJpbmcgcGF0aCwgb2JqZWN0IHYpIHsKKyAgICBpZiAodiA9PSBudWxsKSB7CisgICAgICBoZWxwZXIuRGVsZXRlTm9kZShwYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgaGVscGVyLlNldFhtbE5vZGVTdHJpbmcocGF0aCwgdi5Ub1N0cmluZygpKTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgdm9pZCBTZXRWYWx1ZUJvb2woWG1sSGVscGVyIGhlbHBlciwgc3RyaW5nIHBhdGgsIGJvb2w/IHYpIHsKKyAgICBpZiAodiA9PSBudWxsKSB7CisgICAgICBoZWxwZXIuRGVsZXRlTm9kZShwYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgaGVscGVyLlNldFhtbE5vZGVCb29sKHBhdGgsIChib29sKXYpOworICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBpbnRlcm5hbCBzdHJpbmcgR2V0QXNTdHJpbmcob2JqZWN0IHYpIHsKKyAgICByZXR1cm4gKHYgPz8gIiIpLlRvU3RyaW5nKCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJcyB0aGlzIHZhbHVlIGFsbG93ZWQgdG8gYmUgY2hhbmdlZD8KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHJvdGVjdGVkIGludGVybmFsIGJvb2wgQWxsb3dDaGFuZ2UgeyBnZXQ7IHNldDsgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkJvcmRlci5jcyBiL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZCb3JkZXIuY3MKaW5kZXggYjNmZDA5Ni4uMTJiY2M4NCAxMDA2NDQKLS0tIGEvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkJvcmRlci5jcworKysgYi9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmQm9yZGVyLmNzCkBAIC0xLDEwNiArMSw4MSBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLkR4ZjsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuRHhmCi17Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRHhmQm9yZGVyQmFzZSA6IER4ZlN0eWxlQmFzZTxFeGNlbER4ZkJvcmRlckJhc2U+Ci0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbER4ZkJvcmRlckJhc2UoRXhjZWxTdHlsZXMgc3R5bGVzKQotICAgICAgICAgICAgOiBiYXNlKHN0eWxlcykKLSAgICAgICAgewotICAgICAgICAgICAgTGVmdD1uZXcgRXhjZWxEeGZCb3JkZXJJdGVtKF9zdHlsZXMpOwotICAgICAgICAgICAgUmlnaHQgPSBuZXcgRXhjZWxEeGZCb3JkZXJJdGVtKF9zdHlsZXMpOwotICAgICAgICAgICAgVG9wID0gbmV3IEV4Y2VsRHhmQm9yZGVySXRlbShfc3R5bGVzKTsKLSAgICAgICAgICAgIEJvdHRvbSA9IG5ldyBFeGNlbER4ZkJvcmRlckl0ZW0oX3N0eWxlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTGVmdCBib3JkZXIgc3R5bGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsRHhmQm9yZGVySXRlbSBMZWZ0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIGludGVybmFsIHNldDsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSaWdodCBib3JkZXIgc3R5bGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsRHhmQm9yZGVySXRlbSBSaWdodAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVG9wIGJvcmRlciBzdHlsZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxEeGZCb3JkZXJJdGVtIFRvcAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQm90dG9tIGJvcmRlciBzdHlsZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxEeGZCb3JkZXJJdGVtIEJvdHRvbQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLy8vIERpYWdvbmFsIGJvcmRlciBzdHlsZQotICAgICAgICAvLy8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vcHVibGljIEV4Y2VsRHhmQm9yZGVySXRlbSBEaWFnb25hbAotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgZ2V0OwotICAgICAgICAvLyAgICBwcml2YXRlIHNldDsKLSAgICAgICAgLy99Ci0gICAgICAgIC8vLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8vLyBBIGRpYWdvbmFsIGZyb20gdGhlIGJvdHRvbSBsZWZ0IHRvIHRvcCByaWdodCBvZiB0aGUgY2VsbAotICAgICAgICAvLy8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vcHVibGljIGJvb2wgRGlhZ29uYWxVcAotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgZ2V0OwotICAgICAgICAvLyAgICBzZXQ7Ci0gICAgICAgIC8vfQotICAgICAgICAvLy8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vLy8gQSBkaWFnb25hbCBmcm9tIHRoZSB0b3AgbGVmdCB0byBib3R0b20gcmlnaHQgb2YgdGhlIGNlbGwKLSAgICAgICAgLy8vLy8gPC9zdW1tYXJ5PgotICAgICAgICAvL3B1YmxpYyBib29sIERpYWdvbmFsRG93bgotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgZ2V0OwotICAgICAgICAvLyAgICBzZXQ7Ci0gICAgICAgIC8vfQorcHVibGljIGNsYXNzIEV4Y2VsRHhmQm9yZGVyQmFzZSA6IER4ZlN0eWxlQmFzZTxFeGNlbER4ZkJvcmRlckJhc2U+IHsKKyAgaW50ZXJuYWwgRXhjZWxEeGZCb3JkZXJCYXNlKEV4Y2VsU3R5bGVzIHN0eWxlcykKKyAgICAgIDogYmFzZShzdHlsZXMpIHsKKyAgICBMZWZ0ID0gbmV3KF9zdHlsZXMpOworICAgIFJpZ2h0ID0gbmV3KF9zdHlsZXMpOworICAgIFRvcCA9IG5ldyhfc3R5bGVzKTsKKyAgICBCb3R0b20gPSBuZXcoX3N0eWxlcyk7CisgIH0KIAotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBUb3AuSWQgKyBCb3R0b20uSWQgKyBMZWZ0LklkICsgUmlnaHQuSWQvKiArIERpYWdvbmFsLklkICsgR2V0QXNTdHJpbmcoRGlhZ29uYWxVcCkgKyBHZXRBc1N0cmluZyhEaWFnb25hbERvd24pKi87Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTGVmdCBib3JkZXIgc3R5bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsRHhmQm9yZGVySXRlbSBMZWZ0IHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KIAotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgdm9pZCBDcmVhdGVOb2RlcyhYbWxIZWxwZXIgaGVscGVyLCBzdHJpbmcgcGF0aCkKLSAgICAgICAgewotICAgICAgICAgICAgTGVmdC5DcmVhdGVOb2RlcyhoZWxwZXIsIHBhdGggKyAiL2Q6bGVmdCIpOwotICAgICAgICAgICAgUmlnaHQuQ3JlYXRlTm9kZXMoaGVscGVyLCBwYXRoICsgIi9kOnJpZ2h0Iik7Ci0gICAgICAgICAgICBUb3AuQ3JlYXRlTm9kZXMoaGVscGVyLCBwYXRoICsgIi9kOnRvcCIpOwotICAgICAgICAgICAgQm90dG9tLkNyZWF0ZU5vZGVzKGhlbHBlciwgcGF0aCArICIvZDpib3R0b20iKTsKLSAgICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgYm9vbCBIYXNWYWx1ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIExlZnQuSGFzVmFsdWUgfHwKLSAgICAgICAgICAgICAgICAgICAgUmlnaHQuSGFzVmFsdWUgfHwKLSAgICAgICAgICAgICAgICAgICAgVG9wLkhhc1ZhbHVlIHx8Ci0gICAgICAgICAgICAgICAgICAgIEJvdHRvbS5IYXNWYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgRXhjZWxEeGZCb3JkZXJCYXNlIENsb25lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbER4ZkJvcmRlckJhc2UoX3N0eWxlcykgeyBCb3R0b20gPSBCb3R0b20uQ2xvbmUoKSwgVG9wPVRvcC5DbG9uZSgpLCBMZWZ0PUxlZnQuQ2xvbmUoKSwgUmlnaHQ9UmlnaHQuQ2xvbmUoKSB9OwotICAgICAgICB9Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSaWdodCBib3JkZXIgc3R5bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsRHhmQm9yZGVySXRlbSBSaWdodCB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVG9wIGJvcmRlciBzdHlsZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxEeGZCb3JkZXJJdGVtIFRvcCB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQm90dG9tIGJvcmRlciBzdHlsZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxEeGZCb3JkZXJJdGVtIEJvdHRvbSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgLy8vLy8gPHN1bW1hcnk+CisgIC8vLy8vIERpYWdvbmFsIGJvcmRlciBzdHlsZQorICAvLy8vLyA8L3N1bW1hcnk+CisgIC8vcHVibGljIEV4Y2VsRHhmQm9yZGVySXRlbSBEaWFnb25hbAorICAvL3sKKyAgLy8gICAgZ2V0OworICAvLyAgICBwcml2YXRlIHNldDsKKyAgLy99CisgIC8vLy8vIDxzdW1tYXJ5PgorICAvLy8vLyBBIGRpYWdvbmFsIGZyb20gdGhlIGJvdHRvbSBsZWZ0IHRvIHRvcCByaWdodCBvZiB0aGUgY2VsbAorICAvLy8vLyA8L3N1bW1hcnk+CisgIC8vcHVibGljIGJvb2wgRGlhZ29uYWxVcAorICAvL3sKKyAgLy8gICAgZ2V0OworICAvLyAgICBzZXQ7CisgIC8vfQorICAvLy8vLyA8c3VtbWFyeT4KKyAgLy8vLy8gQSBkaWFnb25hbCBmcm9tIHRoZSB0b3AgbGVmdCB0byBib3R0b20gcmlnaHQgb2YgdGhlIGNlbGwKKyAgLy8vLy8gPC9zdW1tYXJ5PgorICAvL3B1YmxpYyBib29sIERpYWdvbmFsRG93bgorICAvL3sKKyAgLy8gICAgZ2V0OworICAvLyAgICBzZXQ7CisgIC8vfQorCisgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQgPT4KKyAgICBUb3AuSWQKKyAgICAgICAgKyBCb3R0b20uSWQKKyAgICAgICAgKyBMZWZ0LklkCisgICAgICAgICsgUmlnaHQuSWQgLyogKyBEaWFnb25hbC5JZCArIEdldEFzU3RyaW5nKERpYWdvbmFsVXApICsgR2V0QXNTdHJpbmcoRGlhZ29uYWxEb3duKSovOworCisgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIENyZWF0ZU5vZGVzKFhtbEhlbHBlciBoZWxwZXIsIHN0cmluZyBwYXRoKSB7CisgICAgTGVmdC5DcmVhdGVOb2RlcyhoZWxwZXIsIHBhdGggKyAiL2Q6bGVmdCIpOworICAgIFJpZ2h0LkNyZWF0ZU5vZGVzKGhlbHBlciwgcGF0aCArICIvZDpyaWdodCIpOworICAgIFRvcC5DcmVhdGVOb2RlcyhoZWxwZXIsIHBhdGggKyAiL2Q6dG9wIik7CisgICAgQm90dG9tLkNyZWF0ZU5vZGVzKGhlbHBlciwgcGF0aCArICIvZDpib3R0b20iKTsKKyAgfQorCisgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBib29sIEhhc1ZhbHVlID0+CisgICAgTGVmdC5IYXNWYWx1ZSB8fCBSaWdodC5IYXNWYWx1ZSB8fCBUb3AuSGFzVmFsdWUgfHwgQm90dG9tLkhhc1ZhbHVlOworCisgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBFeGNlbER4ZkJvcmRlckJhc2UgQ2xvbmUoKSB7CisgICAgcmV0dXJuIG5ldyhfc3R5bGVzKSB7CisgICAgICBCb3R0b20gPSBCb3R0b20uQ2xvbmUoKSwKKyAgICAgIFRvcCA9IFRvcC5DbG9uZSgpLAorICAgICAgTGVmdCA9IExlZnQuQ2xvbmUoKSwKKyAgICAgIFJpZ2h0ID0gUmlnaHQuQ2xvbmUoKSwKKyAgICB9OworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmQm9yZGVySXRlbS5jcyBiL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZCb3JkZXJJdGVtLmNzCmluZGV4IDkyMjNiZWEuLmYwNjg2MDUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZCb3JkZXJJdGVtLmNzCisrKyBiL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZCb3JkZXJJdGVtLmNzCkBAIC0xLDQ0ICsxLDI5IEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuRHhmOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5EeGYKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxEeGZCb3JkZXJJdGVtIDogRHhmU3R5bGVCYXNlPEV4Y2VsRHhmQm9yZGVySXRlbT4KLSAgICB7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsRHhmQm9yZGVySXRlbShFeGNlbFN0eWxlcyBzdHlsZXMpIDoKLSAgICAgICAgICAgIGJhc2Uoc3R5bGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb2xvcj1uZXcgRXhjZWxEeGZDb2xvcihzdHlsZXMpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBFeGNlbEJvcmRlclN0eWxlPyBTdHlsZSB7IGdldDsgc2V0O30KLSAgICAgICAgcHVibGljIEV4Y2VsRHhmQ29sb3IgQ29sb3IgeyBnZXQ7IGludGVybmFsIHNldDsgfQorcHVibGljIGNsYXNzIEV4Y2VsRHhmQm9yZGVySXRlbSA6IER4ZlN0eWxlQmFzZTxFeGNlbER4ZkJvcmRlckl0ZW0+IHsKKyAgaW50ZXJuYWwgRXhjZWxEeGZCb3JkZXJJdGVtKEV4Y2VsU3R5bGVzIHN0eWxlcykKKyAgICAgIDogYmFzZShzdHlsZXMpIHsKKyAgICBDb2xvciA9IG5ldyhzdHlsZXMpOworICB9CiAKLSAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0QXNTdHJpbmcoU3R5bGUpICsgInwiICsgKENvbG9yID09IG51bGwgPyAiIiA6IENvbG9yLklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBwdWJsaWMgRXhjZWxCb3JkZXJTdHlsZT8gU3R5bGUgeyBnZXQ7IHNldDsgfQogCi0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIENyZWF0ZU5vZGVzKFhtbEhlbHBlciBoZWxwZXIsIHN0cmluZyBwYXRoKQotICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgICBTZXRWYWx1ZUVudW0oaGVscGVyLCBwYXRoICsgIi9Ac3R5bGUiLCBTdHlsZSk7Ci0gICAgICAgICAgICBTZXRWYWx1ZUNvbG9yKGhlbHBlciwgcGF0aCArICIvZDpjb2xvciIsIENvbG9yKTsKLSAgICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgYm9vbCBIYXNWYWx1ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0eWxlICE9IG51bGwgfHwgQ29sb3IuSGFzVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIEV4Y2VsRHhmQm9yZGVySXRlbSBDbG9uZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxEeGZCb3JkZXJJdGVtKF9zdHlsZXMpIHsgU3R5bGUgPSBTdHlsZSwgQ29sb3IgPSBDb2xvciB9OwotICAgICAgICB9Ci0gICAgfQorICBwdWJsaWMgRXhjZWxEeGZDb2xvciBDb2xvciB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZCA9PgorICAgIEdldEFzU3RyaW5nKFN0eWxlKSArICJ8IiArIChDb2xvciA9PSBudWxsID8gIiIgOiBDb2xvci5JZCk7CisKKyAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIHZvaWQgQ3JlYXRlTm9kZXMoWG1sSGVscGVyIGhlbHBlciwgc3RyaW5nIHBhdGgpIHsKKyAgICBTZXRWYWx1ZUVudW0oaGVscGVyLCBwYXRoICsgIi9Ac3R5bGUiLCBTdHlsZSk7CisgICAgU2V0VmFsdWVDb2xvcihoZWxwZXIsIHBhdGggKyAiL2Q6Y29sb3IiLCBDb2xvcik7CisgIH0KKworICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgYm9vbCBIYXNWYWx1ZSA9PiBTdHlsZSAhPSBudWxsIHx8IENvbG9yLkhhc1ZhbHVlOworCisgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBFeGNlbER4ZkJvcmRlckl0ZW0gQ2xvbmUoKSB7CisgICAgcmV0dXJuIG5ldyhfc3R5bGVzKSB7CisgICAgICBTdHlsZSA9IFN0eWxlLAorICAgICAgQ29sb3IgPSBDb2xvciwKKyAgICB9OworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmQ29sb3IuY3MgYi9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmQ29sb3IuY3MKaW5kZXggMGFkN2VlOC4uNGU2YzRmOSAxMDA2NDQKLS0tIGEvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkNvbG9yLmNzCisrKyBiL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZDb2xvci5jcwpAQCAtMSw0NiArMSw0NyBAQAot77u/dXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwordXNpbmcgU3lzdGVtOwogdXNpbmcgU3lzdGVtLkRyYXdpbmc7Ci11c2luZyBTeXN0ZW0uWG1sOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5EeGYKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxEeGZDb2xvciA6IER4ZlN0eWxlQmFzZTxFeGNlbER4ZkNvbG9yPgorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuRHhmOwogCi0gICAgewotICAgICAgICBwdWJsaWMgRXhjZWxEeGZDb2xvcihFeGNlbFN0eWxlcyBzdHlsZXMpIDogYmFzZShzdHlsZXMpCi0gICAgICAgIHsKK3B1YmxpYyBjbGFzcyBFeGNlbER4ZkNvbG9yIDogRHhmU3R5bGVCYXNlPEV4Y2VsRHhmQ29sb3I+IHsKKyAgcHVibGljIEV4Y2VsRHhmQ29sb3IoRXhjZWxTdHlsZXMgc3R5bGVzKQorICAgICAgOiBiYXNlKHN0eWxlcykge30KIAotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBpbnQ/IFRoZW1lIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgcHVibGljIGludD8gSW5kZXggeyBnZXQ7IHNldDsgfQotICAgICAgICBwdWJsaWMgYm9vbD8gQXV0byB7IGdldDsgc2V0OyB9Ci0gICAgICAgIHB1YmxpYyBkb3VibGU/IFRpbnQgeyBnZXQ7IHNldDsgfQotICAgICAgICBwdWJsaWMgQ29sb3I/IENvbG9yIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gR2V0QXNTdHJpbmcoVGhlbWUpICsgInwiICsgR2V0QXNTdHJpbmcoSW5kZXgpICsgInwiICsgR2V0QXNTdHJpbmcoQXV0bykgKyAifCIgKyBHZXRBc1N0cmluZyhUaW50KSArICJ8IiArIEdldEFzU3RyaW5nKENvbG9yPT1udWxsID8gIiIgOiAoKENvbG9yKUNvbG9yLlZhbHVlKS5Ub0FyZ2IoKS5Ub1N0cmluZygieCIpKTsgfQotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBFeGNlbER4ZkNvbG9yIENsb25lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbER4ZkNvbG9yKF9zdHlsZXMpIHsgVGhlbWUgPSBUaGVtZSwgSW5kZXggPSBJbmRleCwgQ29sb3IgPSBDb2xvciwgQXV0byA9IEF1dG8sIFRpbnQgPSBUaW50IH07Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIGJvb2wgSGFzVmFsdWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRoZW1lICE9IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggIT0gbnVsbCB8fAotICAgICAgICAgICAgICAgICAgICAgICBBdXRvICE9IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgVGludCAhPSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIENvbG9yICE9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIHZvaWQgQ3JlYXRlTm9kZXMoWG1sSGVscGVyIGhlbHBlciwgc3RyaW5nIHBhdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgfQorICBwdWJsaWMgaW50PyBUaGVtZSB7IGdldDsgc2V0OyB9CisKKyAgcHVibGljIGludD8gSW5kZXggeyBnZXQ7IHNldDsgfQorCisgIHB1YmxpYyBib29sPyBBdXRvIHsgZ2V0OyBzZXQ7IH0KKworICBwdWJsaWMgZG91YmxlPyBUaW50IHsgZ2V0OyBzZXQ7IH0KKworICBwdWJsaWMgQ29sb3I/IENvbG9yIHsgZ2V0OyBzZXQ7IH0KKworICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkID0+CisgICAgR2V0QXNTdHJpbmcoVGhlbWUpCisgICAgICAgICsgInwiCisgICAgICAgICsgR2V0QXNTdHJpbmcoSW5kZXgpCisgICAgICAgICsgInwiCisgICAgICAgICsgR2V0QXNTdHJpbmcoQXV0bykKKyAgICAgICAgKyAifCIKKyAgICAgICAgKyBHZXRBc1N0cmluZyhUaW50KQorICAgICAgICArICJ8IgorICAgICAgICArIEdldEFzU3RyaW5nKENvbG9yID09IG51bGwgPyAiIiA6IENvbG9yLlZhbHVlLlRvQXJnYigpLlRvU3RyaW5nKCJ4IikpOworCisgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBFeGNlbER4ZkNvbG9yIENsb25lKCkgeworICAgIHJldHVybiBuZXcoX3N0eWxlcykgeworICAgICAgVGhlbWUgPSBUaGVtZSwKKyAgICAgIEluZGV4ID0gSW5kZXgsCisgICAgICBDb2xvciA9IENvbG9yLAorICAgICAgQXV0byA9IEF1dG8sCisgICAgICBUaW50ID0gVGludCwKKyAgICB9OworICB9CisKKyAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIGJvb2wgSGFzVmFsdWUgPT4KKyAgICBUaGVtZSAhPSBudWxsIHx8IEluZGV4ICE9IG51bGwgfHwgQXV0byAhPSBudWxsIHx8IFRpbnQgIT0gbnVsbCB8fCBDb2xvciAhPSBudWxsOworCisgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIENyZWF0ZU5vZGVzKFhtbEhlbHBlciBoZWxwZXIsIHN0cmluZyBwYXRoKSB7CisgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZGaWxsLmNzIGIvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkZpbGwuY3MKaW5kZXggMjZhOGMxMC4uZjRiZjFkMyAxMDA2NDQKLS0tIGEvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkZpbGwuY3MKKysrIGIvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkZpbGwuY3MKQEAgLTEsNTcgKzEsNDYgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOwotdXNpbmcgU3lzdGVtLlhtbDsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLkR4ZjsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuRHhmCi17Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRHhmRmlsbCA6IER4ZlN0eWxlQmFzZTxFeGNlbER4ZkZpbGw+Ci0gICAgewotICAgICAgICBwdWJsaWMgRXhjZWxEeGZGaWxsKEV4Y2VsU3R5bGVzIHN0eWxlcykKLSAgICAgICAgICAgIDogYmFzZShzdHlsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhdHRlcm5Db2xvciA9IG5ldyBFeGNlbER4ZkNvbG9yKHN0eWxlcyk7Ci0gICAgICAgICAgICBCYWNrZ3JvdW5kQ29sb3IgPSBuZXcgRXhjZWxEeGZDb2xvcihzdHlsZXMpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBFeGNlbEZpbGxTdHlsZT8gUGF0dGVyblR5cGUgeyBnZXQ7IHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgY29sb3Igb2YgdGhlIHBhdHRlcm4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsRHhmQ29sb3IgUGF0dGVybkNvbG9yIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGJhY2tncm91bmQgY29sb3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsRHhmQ29sb3IgQmFja2dyb3VuZENvbG9yIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KK3B1YmxpYyBjbGFzcyBFeGNlbER4ZkZpbGwgOiBEeGZTdHlsZUJhc2U8RXhjZWxEeGZGaWxsPiB7CisgIHB1YmxpYyBFeGNlbER4ZkZpbGwoRXhjZWxTdHlsZXMgc3R5bGVzKQorICAgICAgOiBiYXNlKHN0eWxlcykgeworICAgIFBhdHRlcm5Db2xvciA9IG5ldyhzdHlsZXMpOworICAgIEJhY2tncm91bmRDb2xvciA9IG5ldyhzdHlsZXMpOworICB9CiAKLSAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0QXNTdHJpbmcoUGF0dGVyblR5cGUpICsgInwiICsgKFBhdHRlcm5Db2xvciA9PSBudWxsID8gIiIgOiBQYXR0ZXJuQ29sb3IuSWQpICsgInwiICsgKEJhY2tncm91bmRDb2xvciA9PSBudWxsID8gIiIgOiBCYWNrZ3JvdW5kQ29sb3IuSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIENyZWF0ZU5vZGVzKFhtbEhlbHBlciBoZWxwZXIsIHN0cmluZyBwYXRoKQotICAgICAgICB7Ci0gICAgICAgICAgICBoZWxwZXIuQ3JlYXRlTm9kZShwYXRoKTsKLSAgICAgICAgICAgIFNldFZhbHVlRW51bShoZWxwZXIsIHBhdGggKyAiL2Q6cGF0dGVybkZpbGwvQHBhdHRlcm5UeXBlIiwgUGF0dGVyblR5cGUpOwotICAgICAgICAgICAgU2V0VmFsdWVDb2xvcihoZWxwZXIsIHBhdGggKyAiL2Q6cGF0dGVybkZpbGwvZDpmZ0NvbG9yIiwgUGF0dGVybkNvbG9yKTsKLSAgICAgICAgICAgIFNldFZhbHVlQ29sb3IoaGVscGVyLCBwYXRoICsgIi9kOnBhdHRlcm5GaWxsL2Q6YmdDb2xvciIsIEJhY2tncm91bmRDb2xvcik7Ci0gICAgICAgIH0KKyAgcHVibGljIEV4Y2VsRmlsbFN0eWxlPyBQYXR0ZXJuVHlwZSB7IGdldDsgc2V0OyB9CiAKLSAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIGJvb2wgSGFzVmFsdWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBQYXR0ZXJuVHlwZSAhPSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgIFBhdHRlcm5Db2xvci5IYXNWYWx1ZSB8fAotICAgICAgICAgICAgICAgICAgICBCYWNrZ3JvdW5kQ29sb3IuSGFzVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIEV4Y2VsRHhmRmlsbCBDbG9uZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxEeGZGaWxsKF9zdHlsZXMpIHtQYXR0ZXJuVHlwZT1QYXR0ZXJuVHlwZSwgUGF0dGVybkNvbG9yPVBhdHRlcm5Db2xvci5DbG9uZSgpLCBCYWNrZ3JvdW5kQ29sb3I9QmFja2dyb3VuZENvbG9yLkNsb25lKCl9OwotICAgICAgICB9Ci0gICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgY29sb3Igb2YgdGhlIHBhdHRlcm4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsRHhmQ29sb3IgUGF0dGVybkNvbG9yIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgYmFja2dyb3VuZCBjb2xvcgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxEeGZDb2xvciBCYWNrZ3JvdW5kQ29sb3IgeyBnZXQ7IGludGVybmFsIHNldDsgfQorCisgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQgPT4KKyAgICBHZXRBc1N0cmluZyhQYXR0ZXJuVHlwZSkKKyAgICAgICAgKyAifCIKKyAgICAgICAgKyAoUGF0dGVybkNvbG9yID09IG51bGwgPyAiIiA6IFBhdHRlcm5Db2xvci5JZCkKKyAgICAgICAgKyAifCIKKyAgICAgICAgKyAoQmFja2dyb3VuZENvbG9yID09IG51bGwgPyAiIiA6IEJhY2tncm91bmRDb2xvci5JZCk7CisKKyAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIHZvaWQgQ3JlYXRlTm9kZXMoWG1sSGVscGVyIGhlbHBlciwgc3RyaW5nIHBhdGgpIHsKKyAgICBoZWxwZXIuQ3JlYXRlTm9kZShwYXRoKTsKKyAgICBTZXRWYWx1ZUVudW0oaGVscGVyLCBwYXRoICsgIi9kOnBhdHRlcm5GaWxsL0BwYXR0ZXJuVHlwZSIsIFBhdHRlcm5UeXBlKTsKKyAgICBTZXRWYWx1ZUNvbG9yKGhlbHBlciwgcGF0aCArICIvZDpwYXR0ZXJuRmlsbC9kOmZnQ29sb3IiLCBQYXR0ZXJuQ29sb3IpOworICAgIFNldFZhbHVlQ29sb3IoaGVscGVyLCBwYXRoICsgIi9kOnBhdHRlcm5GaWxsL2Q6YmdDb2xvciIsIEJhY2tncm91bmRDb2xvcik7CisgIH0KKworICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgYm9vbCBIYXNWYWx1ZSA9PgorICAgIFBhdHRlcm5UeXBlICE9IG51bGwgfHwgUGF0dGVybkNvbG9yLkhhc1ZhbHVlIHx8IEJhY2tncm91bmRDb2xvci5IYXNWYWx1ZTsKKworICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgRXhjZWxEeGZGaWxsIENsb25lKCkgeworICAgIHJldHVybiBuZXcoX3N0eWxlcykgeworICAgICAgUGF0dGVyblR5cGUgPSBQYXR0ZXJuVHlwZSwKKyAgICAgIFBhdHRlcm5Db2xvciA9IFBhdHRlcm5Db2xvci5DbG9uZSgpLAorICAgICAgQmFja2dyb3VuZENvbG9yID0gQmFja2dyb3VuZENvbG9yLkNsb25lKCksCisgICAgfTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkZvbnRCYXNlLmNzIGIvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZkZvbnRCYXNlLmNzCmluZGV4IGMzMjZmOTguLmFhZTdkNjEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZGb250QmFzZS5jcworKysgYi9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmRm9udEJhc2UuY3MKQEAgLTEsODUgKzEsNzIgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5EcmF3aW5nOwotdXNpbmcgU3lzdGVtLlhtbDsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLkR4ZjsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuRHhmCi17Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRHhmRm9udEJhc2UgOiBEeGZTdHlsZUJhc2U8RXhjZWxEeGZGb250QmFzZT4KLSAgICB7Ci0gICAgICAgIHB1YmxpYyBFeGNlbER4ZkZvbnRCYXNlKEV4Y2VsU3R5bGVzIHN0eWxlcykKLSAgICAgICAgICAgIDogYmFzZShzdHlsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvbG9yID0gbmV3IEV4Y2VsRHhmQ29sb3Ioc3R5bGVzKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGb250IGJvbGQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2w/IEJvbGQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgc2V0OwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvbnQgSXRhbGljCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sPyBJdGFsaWMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgc2V0OwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvbnQtU3RyaWtlb3V0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sPyBTdHJpa2UgeyBnZXQ7IHNldDsgfQotICAgICAgICAvL3B1YmxpYyBmbG9hdD8gU2l6ZSB7IGdldDsgc2V0OyB9Ci0gICAgICAgIHB1YmxpYyBFeGNlbER4ZkNvbG9yIENvbG9yIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgLy9wdWJsaWMgc3RyaW5nIE5hbWUgeyBnZXQ7IHNldDsgfQotICAgICAgICAvL3B1YmxpYyBpbnQ/IEZhbWlseSB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8vLyBGb250LVZlcnRpY2FsIEFsaWduCi0gICAgICAgIC8vLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy9wdWJsaWMgRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQ/IFZlcnRpY2FsQWxpZ24KLSAgICAgICAgLy97Ci0gICAgICAgIC8vICAgIGdldDsKLSAgICAgICAgLy8gICAgc2V0OwotICAgICAgICAvL30KK3B1YmxpYyBjbGFzcyBFeGNlbER4ZkZvbnRCYXNlIDogRHhmU3R5bGVCYXNlPEV4Y2VsRHhmRm9udEJhc2U+IHsKKyAgcHVibGljIEV4Y2VsRHhmRm9udEJhc2UoRXhjZWxTdHlsZXMgc3R5bGVzKQorICAgICAgOiBiYXNlKHN0eWxlcykgeworICAgIENvbG9yID0gbmV3KHN0eWxlcyk7CisgIH0KIAotICAgICAgICBwdWJsaWMgRXhjZWxVbmRlckxpbmVUeXBlPyBVbmRlcmxpbmUgeyBnZXQ7IHNldDsgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBGb250IGJvbGQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2w/IEJvbGQgeyBnZXQ7IHNldDsgfQogCi0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldEFzU3RyaW5nKEJvbGQpICsgInwiICsgR2V0QXNTdHJpbmcoSXRhbGljKSArICJ8IiArIEdldEFzU3RyaW5nKFN0cmlrZSkgKyAifCIgKyAoQ29sb3IgPT1udWxsID8gIiIgOiBDb2xvci5JZCkgKyAifCIgLyorIEdldEFzU3RyaW5nKFZlcnRpY2FsQWxpZ24pICsgInwiKi8gKyBHZXRBc1N0cmluZyhVbmRlcmxpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEZvbnQgSXRhbGljCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sPyBJdGFsaWMgeyBnZXQ7IHNldDsgfQogCi0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIENyZWF0ZU5vZGVzKFhtbEhlbHBlciBoZWxwZXIsIHN0cmluZyBwYXRoKQotICAgICAgICB7Ci0gICAgICAgICAgICBoZWxwZXIuQ3JlYXRlTm9kZShwYXRoKTsKLSAgICAgICAgICAgIFNldFZhbHVlQm9vbChoZWxwZXIsIHBhdGggKyAiL2Q6Yi9AdmFsIiwgQm9sZCk7Ci0gICAgICAgICAgICBTZXRWYWx1ZUJvb2woaGVscGVyLCBwYXRoICsgIi9kOmkvQHZhbCIsIEl0YWxpYyk7Ci0gICAgICAgICAgICBTZXRWYWx1ZUJvb2woaGVscGVyLCBwYXRoICsgIi9kOnN0cmlrZSIsIFN0cmlrZSk7Ci0gICAgICAgICAgICBTZXRWYWx1ZShoZWxwZXIsIHBhdGggKyAiL2Q6dS9AdmFsIiwgVW5kZXJsaW5lKTsKLSAgICAgICAgICAgIFNldFZhbHVlQ29sb3IoaGVscGVyLCBwYXRoICsgIi9kOmNvbG9yIiwgQ29sb3IpOwotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBib29sIEhhc1ZhbHVlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBCb2xkICE9IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgSXRhbGljICE9IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgU3RyaWtlICE9IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgVW5kZXJsaW5lICE9IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IuSGFzVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIEV4Y2VsRHhmRm9udEJhc2UgQ2xvbmUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRHhmRm9udEJhc2UoX3N0eWxlcykgeyBCb2xkID0gQm9sZCwgQ29sb3IgPSBDb2xvci5DbG9uZSgpLCBJdGFsaWMgPSBJdGFsaWMsIFN0cmlrZSA9IFN0cmlrZSwgVW5kZXJsaW5lID0gVW5kZXJsaW5lIH07Ci0gICAgICAgIH0KLSAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEZvbnQtU3RyaWtlb3V0CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sPyBTdHJpa2UgeyBnZXQ7IHNldDsgfQorCisgIC8vcHVibGljIGZsb2F0PyBTaXplIHsgZ2V0OyBzZXQ7IH0KKyAgcHVibGljIEV4Y2VsRHhmQ29sb3IgQ29sb3IgeyBnZXQ7IHNldDsgfQorCisgIC8vcHVibGljIHN0cmluZyBOYW1lIHsgZ2V0OyBzZXQ7IH0KKyAgLy9wdWJsaWMgaW50PyBGYW1pbHkgeyBnZXQ7IHNldDsgfQorICAvLy8vLyA8c3VtbWFyeT4KKyAgLy8vLy8gRm9udC1WZXJ0aWNhbCBBbGlnbgorICAvLy8vLyA8L3N1bW1hcnk+CisgIC8vcHVibGljIEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250PyBWZXJ0aWNhbEFsaWduCisgIC8veworICAvLyAgICBnZXQ7CisgIC8vICAgIHNldDsKKyAgLy99CisKKyAgcHVibGljIEV4Y2VsVW5kZXJMaW5lVHlwZT8gVW5kZXJsaW5lIHsgZ2V0OyBzZXQ7IH0KKworICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkID0+CisgICAgR2V0QXNTdHJpbmcoQm9sZCkKKyAgICAgICAgKyAifCIKKyAgICAgICAgKyBHZXRBc1N0cmluZyhJdGFsaWMpCisgICAgICAgICsgInwiCisgICAgICAgICsgR2V0QXNTdHJpbmcoU3RyaWtlKQorICAgICAgICArICJ8IgorICAgICAgICArIChDb2xvciA9PSBudWxsID8gIiIgOiBDb2xvci5JZCkKKyAgICAgICAgKyAifCIgLyorIEdldEFzU3RyaW5nKFZlcnRpY2FsQWxpZ24pICsgInwiKi8KKyAgICAgICAgKyBHZXRBc1N0cmluZyhVbmRlcmxpbmUpOworCisgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIENyZWF0ZU5vZGVzKFhtbEhlbHBlciBoZWxwZXIsIHN0cmluZyBwYXRoKSB7CisgICAgaGVscGVyLkNyZWF0ZU5vZGUocGF0aCk7CisgICAgU2V0VmFsdWVCb29sKGhlbHBlciwgcGF0aCArICIvZDpiL0B2YWwiLCBCb2xkKTsKKyAgICBTZXRWYWx1ZUJvb2woaGVscGVyLCBwYXRoICsgIi9kOmkvQHZhbCIsIEl0YWxpYyk7CisgICAgU2V0VmFsdWVCb29sKGhlbHBlciwgcGF0aCArICIvZDpzdHJpa2UiLCBTdHJpa2UpOworICAgIFNldFZhbHVlKGhlbHBlciwgcGF0aCArICIvZDp1L0B2YWwiLCBVbmRlcmxpbmUpOworICAgIFNldFZhbHVlQ29sb3IoaGVscGVyLCBwYXRoICsgIi9kOmNvbG9yIiwgQ29sb3IpOworICB9CisKKyAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIGJvb2wgSGFzVmFsdWUgPT4KKyAgICBCb2xkICE9IG51bGwgfHwgSXRhbGljICE9IG51bGwgfHwgU3RyaWtlICE9IG51bGwgfHwgVW5kZXJsaW5lICE9IG51bGwgfHwgQ29sb3IuSGFzVmFsdWU7CisKKyAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIEV4Y2VsRHhmRm9udEJhc2UgQ2xvbmUoKSB7CisgICAgcmV0dXJuIG5ldyhfc3R5bGVzKSB7CisgICAgICBCb2xkID0gQm9sZCwKKyAgICAgIENvbG9yID0gQ29sb3IuQ2xvbmUoKSwKKyAgICAgIEl0YWxpYyA9IEl0YWxpYywKKyAgICAgIFN0cmlrZSA9IFN0cmlrZSwKKyAgICAgIFVuZGVybGluZSA9IFVuZGVybGluZSwKKyAgICB9OworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmTnVtYmVyRm9ybWF0LmNzIGIvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4Zk51bWJlckZvcm1hdC5jcwppbmRleCAxZDZmZmQwLi5lMDAxMTRjIDEwMDY0NAotLS0gYS9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmTnVtYmVyRm9ybWF0LmNzCisrKyBiL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZOdW1iZXJGb3JtYXQuY3MKQEAgLTEsMTA1ICsxLDc3IEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuRHhmOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5EeGYKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxEeGZOdW1iZXJGb3JtYXQgOiBEeGZTdHlsZUJhc2U8RXhjZWxEeGZOdW1iZXJGb3JtYXQ+Ci0gICAgewotICAgICAgICBwdWJsaWMgRXhjZWxEeGZOdW1iZXJGb3JtYXQoRXhjZWxTdHlsZXMgc3R5bGVzKSA6IGJhc2Uoc3R5bGVzKQotICAgICAgICB7CitwdWJsaWMgY2xhc3MgRXhjZWxEeGZOdW1iZXJGb3JtYXQgOiBEeGZTdHlsZUJhc2U8RXhjZWxEeGZOdW1iZXJGb3JtYXQ+IHsKKyAgcHVibGljIEV4Y2VsRHhmTnVtYmVyRm9ybWF0KEV4Y2VsU3R5bGVzIHN0eWxlcykKKyAgICAgIDogYmFzZShzdHlsZXMpIHt9CiAKLSAgICAgICAgfQotICAgICAgICBpbnQgX251bUZtdElEPWludC5NaW5WYWx1ZTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSWQgZm9yIG51bWJlciBmb3JtYXQKLSAgICAgICAgLy8vIAotICAgICAgICAvLy8gQnVpbGQgaW4gSUQncwotICAgICAgICAvLy8gCi0gICAgICAgIC8vLyAwICAgR2VuZXJhbCAKLSAgICAgICAgLy8vIDEgICAwIAotICAgICAgICAvLy8gMiAgIDAuMDAgCi0gICAgICAgIC8vLyAzICAgIywjIzAgCi0gICAgICAgIC8vLyA0ICAgIywjIzAuMDAgCi0gICAgICAgIC8vLyA5ICAgMCUgCi0gICAgICAgIC8vLyAxMCAgMC4wMCUgCi0gICAgICAgIC8vLyAxMSAgMC4wMEUrMDAgCi0gICAgICAgIC8vLyAxMiAgIyA/Lz8gCi0gICAgICAgIC8vLyAxMyAgIyA/Py8/PyAKLSAgICAgICAgLy8vIDE0ICBtbS1kZC15eSAKLSAgICAgICAgLy8vIDE1ICBkLW1tbS15eSAKLSAgICAgICAgLy8vIDE2ICBkLW1tbSAKLSAgICAgICAgLy8vIDE3ICBtbW0teXkgCi0gICAgICAgIC8vLyAxOCAgaDptbSBBTS9QTSAKLSAgICAgICAgLy8vIDE5ICBoOm1tOnNzIEFNL1BNIAotICAgICAgICAvLy8gMjAgIGg6bW0gCi0gICAgICAgIC8vLyAyMSAgaDptbTpzcyAKLSAgICAgICAgLy8vIDIyICBtL2QveXkgaDptbSAKLSAgICAgICAgLy8vIDM3ICAjLCMjMCA7KCMsIyMwKSAKLSAgICAgICAgLy8vIDM4ICAjLCMjMCA7W1JlZF0oIywjIzApIAotICAgICAgICAvLy8gMzkgICMsIyMwLjAwOygjLCMjMC4wMCkgCi0gICAgICAgIC8vLyA0MCAgIywjIzAuMDA7W1JlZF0oIywjIzAuMDApIAotICAgICAgICAvLy8gNDUgIG1tOnNzIAotICAgICAgICAvLy8gNDYgIFtoXTptbTpzcyAKLSAgICAgICAgLy8vIDQ3ICBtbXNzLjAgCi0gICAgICAgIC8vLyA0OCAgIyMwLjBFKzAgCi0gICAgICAgIC8vLyA0OSAgQAotICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgICAgICAgICAgIAotICAgICAgICBwdWJsaWMgaW50IE51bUZtdElEIAotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9udW1GbXRJRDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9udW1GbXRJRCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN0cmluZyBfZm9ybWF0PSIiOwotICAgICAgICBwdWJsaWMgc3RyaW5nIEZvcm1hdAotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9mb3JtYXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZm9ybWF0ID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgTnVtRm10SUQgPSBFeGNlbE51bWJlckZvcm1hdC5HZXRGcm9tQnVpbGRJZEZyb21Gb3JtYXQodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIHByaXZhdGUgaW50IF9udW1GbXRJRCA9IGludC5NaW5WYWx1ZTsKIAotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBGb3JtYXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWQgZm9yIG51bWJlciBmb3JtYXQKKyAgLy8vCisgIC8vLyBCdWlsZCBpbiBJRCdzCisgIC8vLworICAvLy8gMCAgIEdlbmVyYWwKKyAgLy8vIDEgICAwCisgIC8vLyAyICAgMC4wMAorICAvLy8gMyAgICMsIyMwCisgIC8vLyA0ICAgIywjIzAuMDAKKyAgLy8vIDkgICAwJQorICAvLy8gMTAgIDAuMDAlCisgIC8vLyAxMSAgMC4wMEUrMDAKKyAgLy8vIDEyICAjID8vPworICAvLy8gMTMgICMgPz8vPz8KKyAgLy8vIDE0ICBtbS1kZC15eQorICAvLy8gMTUgIGQtbW1tLXl5CisgIC8vLyAxNiAgZC1tbW0KKyAgLy8vIDE3ICBtbW0teXkKKyAgLy8vIDE4ICBoOm1tIEFNL1BNCisgIC8vLyAxOSAgaDptbTpzcyBBTS9QTQorICAvLy8gMjAgIGg6bW0KKyAgLy8vIDIxICBoOm1tOnNzCisgIC8vLyAyMiAgbS9kL3l5IGg6bW0KKyAgLy8vIDM3ICAjLCMjMCA7KCMsIyMwKQorICAvLy8gMzggICMsIyMwIDtbUmVkXSgjLCMjMCkKKyAgLy8vIDM5ICAjLCMjMC4wMDsoIywjIzAuMDApCisgIC8vLyA0MCAgIywjIzAuMDA7W1JlZF0oIywjIzAuMDApCisgIC8vLyA0NSAgbW06c3MKKyAgLy8vIDQ2ICBbaF06bW06c3MKKyAgLy8vIDQ3ICBtbXNzLjAKKyAgLy8vIDQ4ICAjIzAuMEUrMAorICAvLy8gNDkgIEAKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBOdW1GbXRJRCB7CisgICAgZ2V0ID0+IF9udW1GbXRJRDsKKyAgICBpbnRlcm5hbCBzZXQgPT4gX251bUZtdElEID0gdmFsdWU7CisgIH0KIAotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgdm9pZCBDcmVhdGVOb2RlcyhYbWxIZWxwZXIgaGVscGVyLCBzdHJpbmcgcGF0aCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKE51bUZtdElEIDwgMCAmJiAhc3RyaW5nLklzTnVsbE9yRW1wdHkoRm9ybWF0KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBOdW1GbXRJRCA9IF9zdHlsZXMuX25leHREZnhOdW1GbXRJRCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaGVscGVyLkNyZWF0ZU5vZGUocGF0aCk7Ci0gICAgICAgICAgICBTZXRWYWx1ZShoZWxwZXIsIHBhdGggKyAiL0BudW1GbXRJZCIsIE51bUZtdElEKTsKLSAgICAgICAgICAgIFNldFZhbHVlKGhlbHBlciwgcGF0aCArICIvQGZvcm1hdENvZGUiLCBGb3JtYXQpOwotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBib29sIEhhc1ZhbHVlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCAKLSAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgcmV0dXJuICFzdHJpbmcuSXNOdWxsT3JFbXB0eShGb3JtYXQpOyAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgRXhjZWxEeGZOdW1iZXJGb3JtYXQgQ2xvbmUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsRHhmTnVtYmVyRm9ybWF0KF9zdHlsZXMpIHsgTnVtRm10SUQgPSBOdW1GbXRJRCwgRm9ybWF0ID0gRm9ybWF0IH07Ci0gICAgICAgIH0KKyAgcHJpdmF0ZSBzdHJpbmcgX2Zvcm1hdCA9ICIiOworCisgIHB1YmxpYyBzdHJpbmcgRm9ybWF0IHsKKyAgICBnZXQgPT4gX2Zvcm1hdDsKKyAgICBzZXQgeworICAgICAgX2Zvcm1hdCA9IHZhbHVlOworICAgICAgTnVtRm10SUQgPSBFeGNlbE51bWJlckZvcm1hdC5HZXRGcm9tQnVpbGRJZEZyb21Gb3JtYXQodmFsdWUpOwogICAgIH0KKyAgfQorCisgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQgPT4gRm9ybWF0OworCisgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIENyZWF0ZU5vZGVzKFhtbEhlbHBlciBoZWxwZXIsIHN0cmluZyBwYXRoKSB7CisgICAgaWYgKE51bUZtdElEIDwgMCAmJiAhc3RyaW5nLklzTnVsbE9yRW1wdHkoRm9ybWF0KSkgeworICAgICAgTnVtRm10SUQgPSBfc3R5bGVzLl9uZXh0RGZ4TnVtRm10SUQrKzsKKyAgICB9CisgICAgaGVscGVyLkNyZWF0ZU5vZGUocGF0aCk7CisgICAgU2V0VmFsdWUoaGVscGVyLCBwYXRoICsgIi9AbnVtRm10SWQiLCBOdW1GbXRJRCk7CisgICAgU2V0VmFsdWUoaGVscGVyLCBwYXRoICsgIi9AZm9ybWF0Q29kZSIsIEZvcm1hdCk7CisgIH0KKworICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgYm9vbCBIYXNWYWx1ZSA9PiAhc3RyaW5nLklzTnVsbE9yRW1wdHkoRm9ybWF0KTsKKworICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgRXhjZWxEeGZOdW1iZXJGb3JtYXQgQ2xvbmUoKSB7CisgICAgcmV0dXJuIG5ldyhfc3R5bGVzKSB7CisgICAgICBOdW1GbXRJRCA9IE51bUZtdElELAorICAgICAgRm9ybWF0ID0gRm9ybWF0LAorICAgIH07CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZTdHlsZS5jcyBiL0VQUGx1cy9TdHlsZS9EeGYvRXhjZWxEeGZTdHlsZS5jcwppbmRleCBjMjE0M2U4Li40Y2I4YmJhIDEwMDY0NAotLS0gYS9FUFBsdXMvU3R5bGUvRHhmL0V4Y2VsRHhmU3R5bGUuY3MKKysrIGIvRVBQbHVzL1N0eWxlL0R4Zi9FeGNlbER4ZlN0eWxlLmNzCkBAIC0xLDE1MyArMSwxNTUgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uWG1sOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5EeGYKLXsKLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxEeGZTdHlsZUNvbmRpdGlvbmFsRm9ybWF0dGluZyA6IER4ZlN0eWxlQmFzZTxFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nPgotICAgIHsKLSAgICAgICAgWG1sSGVscGVySW5zdGFuY2UgX2hlbHBlcjsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxEeGZTdHlsZUNvbmRpdGlvbmFsRm9ybWF0dGluZyhYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIsIFhtbE5vZGUgdG9wTm9kZSwgRXhjZWxTdHlsZXMgc3R5bGVzKSA6IGJhc2Uoc3R5bGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBOdW1iZXJGb3JtYXQgPSBuZXcgRXhjZWxEeGZOdW1iZXJGb3JtYXQoX3N0eWxlcyk7Ci0gICAgICAgICAgICBGb250ID0gbmV3IEV4Y2VsRHhmRm9udEJhc2UoX3N0eWxlcyk7Ci0gICAgICAgICAgICBCb3JkZXIgPSBuZXcgRXhjZWxEeGZCb3JkZXJCYXNlKF9zdHlsZXMpOwotICAgICAgICAgICAgRmlsbCA9IG5ldyBFeGNlbER4ZkZpbGwoX3N0eWxlcyk7Ci0gICAgICAgICAgICBpZiAodG9wTm9kZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9oZWxwZXIgPSBuZXcgWG1sSGVscGVySW5zdGFuY2UobmFtZVNwYWNlTWFuYWdlciwgdG9wTm9kZSk7Ci0gICAgICAgICAgICAgICAgTnVtYmVyRm9ybWF0Lk51bUZtdElEID0gX2hlbHBlci5HZXRYbWxOb2RlSW50KCJkOm51bUZtdC9AbnVtRm10SWQiKTsKLSAgICAgICAgICAgICAgICBOdW1iZXJGb3JtYXQuRm9ybWF0ID0gX2hlbHBlci5HZXRYbWxOb2RlU3RyaW5nKCJkOm51bUZtdC9AZm9ybWF0Q29kZSIpOyAKLSAgICAgICAgICAgICAgICBpZiAoTnVtYmVyRm9ybWF0Lk51bUZtdElEIDwgMTY0ICYmIHN0cmluZy5Jc051bGxPckVtcHR5KE51bWJlckZvcm1hdC5Gb3JtYXQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTnVtYmVyRm9ybWF0LkZvcm1hdCA9IEV4Y2VsTnVtYmVyRm9ybWF0LkdldEZyb21CdWlsZEluRnJvbUlEKE51bWJlckZvcm1hdC5OdW1GbXRJRCk7Ci0gICAgICAgICAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuRHhmOwogCi0gICAgICAgICAgICAgICAgRm9udC5Cb2xkID0gX2hlbHBlci5HZXRYbWxOb2RlQm9vbE51bGxhYmxlKCJkOmZvbnQvZDpiL0B2YWwiKTsKLSAgICAgICAgICAgICAgICBGb250Lkl0YWxpYyA9IF9oZWxwZXIuR2V0WG1sTm9kZUJvb2xOdWxsYWJsZSgiZDpmb250L2Q6aS9AdmFsIik7Ci0gICAgICAgICAgICAgICAgRm9udC5TdHJpa2UgPSBfaGVscGVyLkdldFhtbE5vZGVCb29sTnVsbGFibGUoImQ6Zm9udC9kOnN0cmlrZSIpOwotICAgICAgICAgICAgICAgIEZvbnQuVW5kZXJsaW5lID0gR2V0VW5kZXJMaW5lRW51bShfaGVscGVyLkdldFhtbE5vZGVTdHJpbmcoImQ6Zm9udC9kOnUvQHZhbCIpKTsKLSAgICAgICAgICAgICAgICBGb250LkNvbG9yID0gR2V0Q29sb3IoX2hlbHBlciwgImQ6Zm9udC9kOmNvbG9yIik7CitwdWJsaWMgY2xhc3MgRXhjZWxEeGZTdHlsZUNvbmRpdGlvbmFsRm9ybWF0dGluZyA6IER4ZlN0eWxlQmFzZTxFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nPiB7CisgIHByaXZhdGUgWG1sSGVscGVySW5zdGFuY2UgX2hlbHBlcjsKIAotICAgICAgICAgICAgICAgIEJvcmRlci5MZWZ0ID0gR2V0Qm9yZGVySXRlbShfaGVscGVyLCAiZDpib3JkZXIvZDpsZWZ0Iik7Ci0gICAgICAgICAgICAgICAgQm9yZGVyLlJpZ2h0ID0gR2V0Qm9yZGVySXRlbShfaGVscGVyLCAiZDpib3JkZXIvZDpyaWdodCIpOwotICAgICAgICAgICAgICAgIEJvcmRlci5Cb3R0b20gPSBHZXRCb3JkZXJJdGVtKF9oZWxwZXIsICJkOmJvcmRlci9kOmJvdHRvbSIpOwotICAgICAgICAgICAgICAgIEJvcmRlci5Ub3AgPSBHZXRCb3JkZXJJdGVtKF9oZWxwZXIsICJkOmJvcmRlci9kOnRvcCIpOworICBpbnRlcm5hbCBFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nKAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLAorICAgICAgWG1sTm9kZSB0b3BOb2RlLAorICAgICAgRXhjZWxTdHlsZXMgc3R5bGVzKQorICAgICAgOiBiYXNlKHN0eWxlcykgeworICAgIE51bWJlckZvcm1hdCA9IG5ldyhfc3R5bGVzKTsKKyAgICBGb250ID0gbmV3KF9zdHlsZXMpOworICAgIEJvcmRlciA9IG5ldyhfc3R5bGVzKTsKKyAgICBGaWxsID0gbmV3KF9zdHlsZXMpOworICAgIGlmICh0b3BOb2RlICE9IG51bGwpIHsKKyAgICAgIF9oZWxwZXIgPSBuZXcobmFtZVNwYWNlTWFuYWdlciwgdG9wTm9kZSk7CisgICAgICBOdW1iZXJGb3JtYXQuTnVtRm10SUQgPSBfaGVscGVyLkdldFhtbE5vZGVJbnQoImQ6bnVtRm10L0BudW1GbXRJZCIpOworICAgICAgTnVtYmVyRm9ybWF0LkZvcm1hdCA9IF9oZWxwZXIuR2V0WG1sTm9kZVN0cmluZygiZDpudW1GbXQvQGZvcm1hdENvZGUiKTsKKyAgICAgIGlmIChOdW1iZXJGb3JtYXQuTnVtRm10SUQgPCAxNjQgJiYgc3RyaW5nLklzTnVsbE9yRW1wdHkoTnVtYmVyRm9ybWF0LkZvcm1hdCkpIHsKKyAgICAgICAgTnVtYmVyRm9ybWF0LkZvcm1hdCA9IEV4Y2VsTnVtYmVyRm9ybWF0LkdldEZyb21CdWlsZEluRnJvbUlkKE51bWJlckZvcm1hdC5OdW1GbXRJRCk7CisgICAgICB9CiAKLSAgICAgICAgICAgICAgICBGaWxsLlBhdHRlcm5UeXBlID0gR2V0UGF0dGVyblR5cGVFbnVtKF9oZWxwZXIuR2V0WG1sTm9kZVN0cmluZygiZDpmaWxsL2Q6cGF0dGVybkZpbGwvQHBhdHRlcm5UeXBlIikpOwotICAgICAgICAgICAgICAgIEZpbGwuQmFja2dyb3VuZENvbG9yID0gR2V0Q29sb3IoX2hlbHBlciwgImQ6ZmlsbC9kOnBhdHRlcm5GaWxsL2Q6YmdDb2xvci8iKTsKLSAgICAgICAgICAgICAgICBGaWxsLlBhdHRlcm5Db2xvciA9IEdldENvbG9yKF9oZWxwZXIsICJkOmZpbGwvZDpwYXR0ZXJuRmlsbC9kOmZnQ29sb3IvIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2hlbHBlciA9IG5ldyBYbWxIZWxwZXJJbnN0YW5jZShuYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9oZWxwZXIuU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgImZvbnQiLCAibnVtRm10IiwgImZpbGwiLCAiYm9yZGVyIiB9OwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgRXhjZWxEeGZCb3JkZXJJdGVtIEdldEJvcmRlckl0ZW0oWG1sSGVscGVySW5zdGFuY2UgaGVscGVyLCBzdHJpbmcgcGF0aCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxEeGZCb3JkZXJJdGVtIGJpID0gbmV3IEV4Y2VsRHhmQm9yZGVySXRlbShfc3R5bGVzKTsKLSAgICAgICAgICAgIGJpLlN0eWxlID0gR2V0Qm9yZGVyU3R5bGVFbnVtKGhlbHBlci5HZXRYbWxOb2RlU3RyaW5nKHBhdGgrIi9Ac3R5bGUiKSk7Ci0gICAgICAgICAgICBiaS5Db2xvciA9IEdldENvbG9yKGhlbHBlciwgcGF0aCsiL2Q6Y29sb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBiaTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIEV4Y2VsQm9yZGVyU3R5bGUgR2V0Qm9yZGVyU3R5bGVFbnVtKHN0cmluZyBzdHlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0eWxlID09ICIiKSByZXR1cm4gRXhjZWxCb3JkZXJTdHlsZS5Ob25lOwotICAgICAgICAgICAgc3RyaW5nIHNJblN0eWxlID0gc3R5bGUuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyBzdHlsZS5TdWJzdHJpbmcoMSwgc3R5bGUuTGVuZ3RoIC0gMSk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEV4Y2VsQm9yZGVyU3R5bGUpRW51bS5QYXJzZSh0eXBlb2YoRXhjZWxCb3JkZXJTdHlsZSksIHNJblN0eWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsQm9yZGVyU3R5bGUuTm9uZTsKLSAgICAgICAgICAgIH0KKyAgICAgIEZvbnQuQm9sZCA9IF9oZWxwZXIuR2V0WG1sTm9kZUJvb2xOdWxsYWJsZSgiZDpmb250L2Q6Yi9AdmFsIik7CisgICAgICBGb250Lkl0YWxpYyA9IF9oZWxwZXIuR2V0WG1sTm9kZUJvb2xOdWxsYWJsZSgiZDpmb250L2Q6aS9AdmFsIik7CisgICAgICBGb250LlN0cmlrZSA9IF9oZWxwZXIuR2V0WG1sTm9kZUJvb2xOdWxsYWJsZSgiZDpmb250L2Q6c3RyaWtlIik7CisgICAgICBGb250LlVuZGVybGluZSA9IEdldFVuZGVyTGluZUVudW0oX2hlbHBlci5HZXRYbWxOb2RlU3RyaW5nKCJkOmZvbnQvZDp1L0B2YWwiKSk7CisgICAgICBGb250LkNvbG9yID0gR2V0Q29sb3IoX2hlbHBlciwgImQ6Zm9udC9kOmNvbG9yIik7CiAKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIEV4Y2VsRmlsbFN0eWxlIEdldFBhdHRlcm5UeXBlRW51bShzdHJpbmcgcGF0dGVyblR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwYXR0ZXJuVHlwZSA9PSAiIikgcmV0dXJuIEV4Y2VsRmlsbFN0eWxlLk5vbmU7Ci0gICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IHBhdHRlcm5UeXBlLlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgcGF0dGVyblR5cGUuU3Vic3RyaW5nKDEsIHBhdHRlcm5UeXBlLkxlbmd0aCAtIDEpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChFeGNlbEZpbGxTdHlsZSlFbnVtLlBhcnNlKHR5cGVvZihFeGNlbEZpbGxTdHlsZSksIHBhdHRlcm5UeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRmlsbFN0eWxlLk5vbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBFeGNlbER4ZkNvbG9yIEdldENvbG9yKFhtbEhlbHBlckluc3RhbmNlIGhlbHBlciwgc3RyaW5nIHBhdGgpCi0gICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIEV4Y2VsRHhmQ29sb3IgcmV0ID0gbmV3IEV4Y2VsRHhmQ29sb3IoX3N0eWxlcyk7Ci0gICAgICAgICAgICByZXQuVGhlbWUgPSBoZWxwZXIuR2V0WG1sTm9kZUludE51bGwocGF0aCArICIvQHRoZW1lIik7Ci0gICAgICAgICAgICByZXQuSW5kZXggPSBoZWxwZXIuR2V0WG1sTm9kZUludE51bGwocGF0aCArICIvQGluZGV4ZWQiKTsKLSAgICAgICAgICAgIHN0cmluZyByZ2I9aGVscGVyLkdldFhtbE5vZGVTdHJpbmcocGF0aCArICIvQHJnYiIpOwotICAgICAgICAgICAgaWYocmdiIT0iIikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXQuQ29sb3IgPSBDb2xvci5Gcm9tQXJnYiggaW50LlBhcnNlKHJnYi5TdWJzdHJpbmcoMCwgMiksIFN5c3RlbS5HbG9iYWxpemF0aW9uLk51bWJlclN0eWxlcy5BbGxvd0hleFNwZWNpZmllciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5QYXJzZShyZ2IuU3Vic3RyaW5nKDIsIDIpLCBTeXN0ZW0uR2xvYmFsaXphdGlvbi5OdW1iZXJTdHlsZXMuQWxsb3dIZXhTcGVjaWZpZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQuUGFyc2UocmdiLlN1YnN0cmluZyg0LCAyKSwgU3lzdGVtLkdsb2JhbGl6YXRpb24uTnVtYmVyU3R5bGVzLkFsbG93SGV4U3BlY2lmaWVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LlBhcnNlKHJnYi5TdWJzdHJpbmcoNiwgMiksIFN5c3RlbS5HbG9iYWxpemF0aW9uLk51bWJlclN0eWxlcy5BbGxvd0hleFNwZWNpZmllcikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0LkF1dG8gPSBoZWxwZXIuR2V0WG1sTm9kZUJvb2xOdWxsYWJsZShwYXRoICsgIi9AYXV0byIpOwotICAgICAgICAgICAgcmV0LlRpbnQgPSBoZWxwZXIuR2V0WG1sTm9kZURvdWJsZU51bGwocGF0aCArICIvQHRpbnQiKTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBFeGNlbFVuZGVyTGluZVR5cGU/IEdldFVuZGVyTGluZUVudW0oc3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2godmFsdWUuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICJzaW5nbGUiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxVbmRlckxpbmVUeXBlLlNpbmdsZTsKLSAgICAgICAgICAgICAgICBjYXNlICJkb3VibGUiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxVbmRlckxpbmVUeXBlLkRvdWJsZTsKLSAgICAgICAgICAgICAgICBjYXNlICJzaW5nbGVhY2NvdW50aW5nIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsVW5kZXJMaW5lVHlwZS5TaW5nbGVBY2NvdW50aW5nOwotICAgICAgICAgICAgICAgIGNhc2UgImRvdWJsZWFjY291bnRpbmciOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxVbmRlckxpbmVUeXBlLkRvdWJsZUFjY291bnRpbmc7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgaW50IER4ZklkIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgcHVibGljIEV4Y2VsRHhmRm9udEJhc2UgRm9udCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIHB1YmxpYyBFeGNlbER4Zk51bWJlckZvcm1hdCBOdW1iZXJGb3JtYXQgeyBnZXQ7IHNldDsgfQotICAgICAgICBwdWJsaWMgRXhjZWxEeGZGaWxsIEZpbGwgeyBnZXQ7IHNldDsgfQotICAgICAgICBwdWJsaWMgRXhjZWxEeGZCb3JkZXJCYXNlIEJvcmRlciB7IGdldDsgc2V0OyB9Ci0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlckZvcm1hdC5JZCArIEZvbnQuSWQgKyBCb3JkZXIuSWQgKyBGaWxsLklkICsKLSAgICAgICAgICAgICAgICAgICAgKEFsbG93Q2hhbmdlID8gIiIgOiBEeGZJZC5Ub1N0cmluZygpKTsvL0lmIGFsbG93Y2hhbmdlIGlzIGZhbHNlIHdlIGFkZCB0aGUgZHhmSUQgdG8gZW5zdXJlIGl0J3Mgbm90IHVzZWQgd2hlbiBjb25kaXRpb25hbCBmb3JtYXR0aW5nIGlzIHVwZGF0ZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nIENsb25lKCkKLSAgICAgICAgewotIAkgICAgICAgdmFyIHM9bmV3IEV4Y2VsRHhmU3R5bGVDb25kaXRpb25hbEZvcm1hdHRpbmcoX2hlbHBlci5OYW1lU3BhY2VNYW5hZ2VyLCBudWxsLCBfc3R5bGVzKTsKLSAgICAgICAgICAgcy5Gb250ID0gRm9udC5DbG9uZSgpOwotICAgICAgICAgICBzLk51bWJlckZvcm1hdCA9IE51bWJlckZvcm1hdC5DbG9uZSgpOwotICAgICAgICAgICBzLkZpbGwgPSBGaWxsLkNsb25lKCk7Ci0gICAgICAgICAgIHMuQm9yZGVyID0gQm9yZGVyLkNsb25lKCk7Ci0gICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9CisgICAgICBCb3JkZXIuTGVmdCA9IEdldEJvcmRlckl0ZW0oX2hlbHBlciwgImQ6Ym9yZGVyL2Q6bGVmdCIpOworICAgICAgQm9yZGVyLlJpZ2h0ID0gR2V0Qm9yZGVySXRlbShfaGVscGVyLCAiZDpib3JkZXIvZDpyaWdodCIpOworICAgICAgQm9yZGVyLkJvdHRvbSA9IEdldEJvcmRlckl0ZW0oX2hlbHBlciwgImQ6Ym9yZGVyL2Q6Ym90dG9tIik7CisgICAgICBCb3JkZXIuVG9wID0gR2V0Qm9yZGVySXRlbShfaGVscGVyLCAiZDpib3JkZXIvZDp0b3AiKTsKIAotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgdm9pZCBDcmVhdGVOb2RlcyhYbWxIZWxwZXIgaGVscGVyLCBzdHJpbmcgcGF0aCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoRm9udC5IYXNWYWx1ZSkgRm9udC5DcmVhdGVOb2RlcyhoZWxwZXIsICJkOmZvbnQiKTsKLSAgICAgICAgICAgIGlmIChOdW1iZXJGb3JtYXQuSGFzVmFsdWUpIE51bWJlckZvcm1hdC5DcmVhdGVOb2RlcyhoZWxwZXIsICJkOm51bUZtdCIpOyAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKEZpbGwuSGFzVmFsdWUpIEZpbGwuQ3JlYXRlTm9kZXMoaGVscGVyLCAiZDpmaWxsIik7Ci0gICAgICAgICAgICBpZiAoQm9yZGVyLkhhc1ZhbHVlKSBCb3JkZXIuQ3JlYXRlTm9kZXMoaGVscGVyLCAiZDpib3JkZXIiKTsKLSAgICAgICAgfQotICAgICAgICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgYm9vbCBIYXNWYWx1ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gRm9udC5IYXNWYWx1ZSB8fCBOdW1iZXJGb3JtYXQuSGFzVmFsdWUgfHwgRmlsbC5IYXNWYWx1ZSB8fCBCb3JkZXIuSGFzVmFsdWU7IH0KLSAgICAgICAgfQorICAgICAgRmlsbC5QYXR0ZXJuVHlwZSA9IEdldFBhdHRlcm5UeXBlRW51bSgKKyAgICAgICAgICBfaGVscGVyLkdldFhtbE5vZGVTdHJpbmcoImQ6ZmlsbC9kOnBhdHRlcm5GaWxsL0BwYXR0ZXJuVHlwZSIpKTsKKyAgICAgIEZpbGwuQmFja2dyb3VuZENvbG9yID0gR2V0Q29sb3IoX2hlbHBlciwgImQ6ZmlsbC9kOnBhdHRlcm5GaWxsL2Q6YmdDb2xvci8iKTsKKyAgICAgIEZpbGwuUGF0dGVybkNvbG9yID0gR2V0Q29sb3IoX2hlbHBlciwgImQ6ZmlsbC9kOnBhdHRlcm5GaWxsL2Q6ZmdDb2xvci8iKTsKKyAgICB9IGVsc2UgeworICAgICAgX2hlbHBlciA9IG5ldyhuYW1lU3BhY2VNYW5hZ2VyKTsKICAgICB9CisgICAgX2hlbHBlci5TY2hlbWFOb2RlT3JkZXIgPSBuZXdbXSB7ICJmb250IiwgIm51bUZtdCIsICJmaWxsIiwgImJvcmRlciIgfTsKKyAgfQorCisgIHByaXZhdGUgRXhjZWxEeGZCb3JkZXJJdGVtIEdldEJvcmRlckl0ZW0oWG1sSGVscGVySW5zdGFuY2UgaGVscGVyLCBzdHJpbmcgcGF0aCkgeworICAgIEV4Y2VsRHhmQm9yZGVySXRlbSBiaSA9IG5ldyBFeGNlbER4ZkJvcmRlckl0ZW0oX3N0eWxlcyk7CisgICAgYmkuU3R5bGUgPSBHZXRCb3JkZXJTdHlsZUVudW0oaGVscGVyLkdldFhtbE5vZGVTdHJpbmcocGF0aCArICIvQHN0eWxlIikpOworICAgIGJpLkNvbG9yID0gR2V0Q29sb3IoaGVscGVyLCBwYXRoICsgIi9kOmNvbG9yIik7CisgICAgcmV0dXJuIGJpOworICB9CisKKyAgcHJpdmF0ZSBFeGNlbEJvcmRlclN0eWxlIEdldEJvcmRlclN0eWxlRW51bShzdHJpbmcgc3R5bGUpIHsKKyAgICBpZiAoc3R5bGUgPT0gIiIpIHsKKyAgICAgIHJldHVybiBFeGNlbEJvcmRlclN0eWxlLk5vbmU7CisgICAgfQorICAgIHN0cmluZyBzSW5TdHlsZSA9CisgICAgICAgIHN0eWxlLlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpCisgICAgICAgICAgICArIHN0eWxlLlN1YnN0cmluZygxLCBzdHlsZS5MZW5ndGggLSAxKTsKKyAgICB0cnkgeworICAgICAgcmV0dXJuIChFeGNlbEJvcmRlclN0eWxlKUVudW0uUGFyc2UodHlwZW9mKEV4Y2VsQm9yZGVyU3R5bGUpLCBzSW5TdHlsZSk7CisgICAgfSBjYXRjaCB7CisgICAgICByZXR1cm4gRXhjZWxCb3JkZXJTdHlsZS5Ob25lOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgRXhjZWxGaWxsU3R5bGUgR2V0UGF0dGVyblR5cGVFbnVtKHN0cmluZyBwYXR0ZXJuVHlwZSkgeworICAgIGlmIChwYXR0ZXJuVHlwZSA9PSAiIikgeworICAgICAgcmV0dXJuIEV4Y2VsRmlsbFN0eWxlLk5vbmU7CisgICAgfQorICAgIHBhdHRlcm5UeXBlID0KKyAgICAgICAgcGF0dGVyblR5cGUuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkKKyAgICAgICAgICAgICsgcGF0dGVyblR5cGUuU3Vic3RyaW5nKDEsIHBhdHRlcm5UeXBlLkxlbmd0aCAtIDEpOworICAgIHRyeSB7CisgICAgICByZXR1cm4gKEV4Y2VsRmlsbFN0eWxlKUVudW0uUGFyc2UodHlwZW9mKEV4Y2VsRmlsbFN0eWxlKSwgcGF0dGVyblR5cGUpOworICAgIH0gY2F0Y2ggeworICAgICAgcmV0dXJuIEV4Y2VsRmlsbFN0eWxlLk5vbmU7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBFeGNlbER4ZkNvbG9yIEdldENvbG9yKFhtbEhlbHBlckluc3RhbmNlIGhlbHBlciwgc3RyaW5nIHBhdGgpIHsKKyAgICBFeGNlbER4ZkNvbG9yIHJldCA9IG5ldyBFeGNlbER4ZkNvbG9yKF9zdHlsZXMpOworICAgIHJldC5UaGVtZSA9IGhlbHBlci5HZXRYbWxOb2RlSW50TnVsbChwYXRoICsgIi9AdGhlbWUiKTsKKyAgICByZXQuSW5kZXggPSBoZWxwZXIuR2V0WG1sTm9kZUludE51bGwocGF0aCArICIvQGluZGV4ZWQiKTsKKyAgICBzdHJpbmcgcmdiID0gaGVscGVyLkdldFhtbE5vZGVTdHJpbmcocGF0aCArICIvQHJnYiIpOworICAgIGlmIChyZ2IgIT0gIiIpIHsKKyAgICAgIHJldC5Db2xvciA9IENvbG9yLkZyb21BcmdiKAorICAgICAgICAgIGludC5QYXJzZShyZ2IuU3Vic3RyaW5nKDAsIDIpLCBOdW1iZXJTdHlsZXMuQWxsb3dIZXhTcGVjaWZpZXIpLAorICAgICAgICAgIGludC5QYXJzZShyZ2IuU3Vic3RyaW5nKDIsIDIpLCBOdW1iZXJTdHlsZXMuQWxsb3dIZXhTcGVjaWZpZXIpLAorICAgICAgICAgIGludC5QYXJzZShyZ2IuU3Vic3RyaW5nKDQsIDIpLCBOdW1iZXJTdHlsZXMuQWxsb3dIZXhTcGVjaWZpZXIpLAorICAgICAgICAgIGludC5QYXJzZShyZ2IuU3Vic3RyaW5nKDYsIDIpLCBOdW1iZXJTdHlsZXMuQWxsb3dIZXhTcGVjaWZpZXIpKTsKKyAgICB9CisgICAgcmV0LkF1dG8gPSBoZWxwZXIuR2V0WG1sTm9kZUJvb2xOdWxsYWJsZShwYXRoICsgIi9AYXV0byIpOworICAgIHJldC5UaW50ID0gaGVscGVyLkdldFhtbE5vZGVEb3VibGVOdWxsKHBhdGggKyAiL0B0aW50Iik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorCisgIHByaXZhdGUgRXhjZWxVbmRlckxpbmVUeXBlPyBHZXRVbmRlckxpbmVFbnVtKHN0cmluZyB2YWx1ZSkgeworICAgIHN3aXRjaCAodmFsdWUuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSkgeworICAgICAgY2FzZSAic2luZ2xlIjoKKyAgICAgICAgcmV0dXJuIEV4Y2VsVW5kZXJMaW5lVHlwZS5TaW5nbGU7CisgICAgICBjYXNlICJkb3VibGUiOgorICAgICAgICByZXR1cm4gRXhjZWxVbmRlckxpbmVUeXBlLkRvdWJsZTsKKyAgICAgIGNhc2UgInNpbmdsZWFjY291bnRpbmciOgorICAgICAgICByZXR1cm4gRXhjZWxVbmRlckxpbmVUeXBlLlNpbmdsZUFjY291bnRpbmc7CisgICAgICBjYXNlICJkb3VibGVhY2NvdW50aW5nIjoKKyAgICAgICAgcmV0dXJuIEV4Y2VsVW5kZXJMaW5lVHlwZS5Eb3VibGVBY2NvdW50aW5nOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgaW50IER4ZklkIHsgZ2V0OyBzZXQ7IH0KKworICBwdWJsaWMgRXhjZWxEeGZGb250QmFzZSBGb250IHsgZ2V0OyBzZXQ7IH0KKworICBwdWJsaWMgRXhjZWxEeGZOdW1iZXJGb3JtYXQgTnVtYmVyRm9ybWF0IHsgZ2V0OyBzZXQ7IH0KKworICBwdWJsaWMgRXhjZWxEeGZGaWxsIEZpbGwgeyBnZXQ7IHNldDsgfQorCisgIHB1YmxpYyBFeGNlbER4ZkJvcmRlckJhc2UgQm9yZGVyIHsgZ2V0OyBzZXQ7IH0KKworICBwcm90ZWN0ZWQgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkID0+CisgICAgTnVtYmVyRm9ybWF0LklkICsgRm9udC5JZCArIEJvcmRlci5JZCArIEZpbGwuSWQgKyAoQWxsb3dDaGFuZ2UgPyAiIiA6IER4ZklkLlRvU3RyaW5nKCkpOyAvL0lmIGFsbG93Y2hhbmdlIGlzIGZhbHNlIHdlIGFkZCB0aGUgZHhmSUQgdG8gZW5zdXJlIGl0J3Mgbm90IHVzZWQgd2hlbiBjb25kaXRpb25hbCBmb3JtYXR0aW5nIGlzIHVwZGF0ZWQpOworCisgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSBFeGNlbER4ZlN0eWxlQ29uZGl0aW9uYWxGb3JtYXR0aW5nIENsb25lKCkgeworICAgIHZhciBzID0gbmV3IEV4Y2VsRHhmU3R5bGVDb25kaXRpb25hbEZvcm1hdHRpbmcoX2hlbHBlci5OYW1lU3BhY2VNYW5hZ2VyLCBudWxsLCBfc3R5bGVzKTsKKyAgICBzLkZvbnQgPSBGb250LkNsb25lKCk7CisgICAgcy5OdW1iZXJGb3JtYXQgPSBOdW1iZXJGb3JtYXQuQ2xvbmUoKTsKKyAgICBzLkZpbGwgPSBGaWxsLkNsb25lKCk7CisgICAgcy5Cb3JkZXIgPSBCb3JkZXIuQ2xvbmUoKTsKKyAgICByZXR1cm4gczsKKyAgfQorCisgIHByb3RlY3RlZCBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIENyZWF0ZU5vZGVzKFhtbEhlbHBlciBoZWxwZXIsIHN0cmluZyBwYXRoKSB7CisgICAgaWYgKEZvbnQuSGFzVmFsdWUpIHsKKyAgICAgIEZvbnQuQ3JlYXRlTm9kZXMoaGVscGVyLCAiZDpmb250Iik7CisgICAgfQorICAgIGlmIChOdW1iZXJGb3JtYXQuSGFzVmFsdWUpIHsKKyAgICAgIE51bWJlckZvcm1hdC5DcmVhdGVOb2RlcyhoZWxwZXIsICJkOm51bUZtdCIpOworICAgIH0KKyAgICBpZiAoRmlsbC5IYXNWYWx1ZSkgeworICAgICAgRmlsbC5DcmVhdGVOb2RlcyhoZWxwZXIsICJkOmZpbGwiKTsKKyAgICB9CisgICAgaWYgKEJvcmRlci5IYXNWYWx1ZSkgeworICAgICAgQm9yZGVyLkNyZWF0ZU5vZGVzKGhlbHBlciwgImQ6Ym9yZGVyIik7CisgICAgfQorICB9CisKKyAgcHJvdGVjdGVkIGludGVybmFsIG92ZXJyaWRlIGJvb2wgSGFzVmFsdWUgPT4KKyAgICBGb250Lkhhc1ZhbHVlIHx8IE51bWJlckZvcm1hdC5IYXNWYWx1ZSB8fCBGaWxsLkhhc1ZhbHVlIHx8IEJvcmRlci5IYXNWYWx1ZTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9FeGNlbEJvcmRlci5jcyBiL0VQUGx1cy9TdHlsZS9FeGNlbEJvcmRlci5jcwppbmRleCBkMmRiN2MzLi5iZjA3NDMyIDEwMDY0NAotLS0gYS9FUFBsdXMvU3R5bGUvRXhjZWxCb3JkZXIuY3MKKysrIGIvRVBQbHVzL1N0eWxlL0V4Y2VsQm9yZGVyLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxNjYgKzEzLDE5MCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENlbGwgQm9yZGVyIHN0eWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEJvcmRlciA6IFN0eWxlQmFzZQotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgQm9yZGVyKEV4Y2VsU3R5bGVzIHN0eWxlcywgT2ZmaWNlT3BlblhtbC5YbWxIZWxwZXIuQ2hhbmdlZEV2ZW50SGFuZGxlciBDaGFuZ2VkRXZlbnQsIGludCBQb3NpdGlvbklELCBzdHJpbmcgYWRkcmVzcywgaW50IGluZGV4KSA6Ci0gICAgICAgICAgICBiYXNlKHN0eWxlcywgQ2hhbmdlZEV2ZW50LCBQb3NpdGlvbklELCBhZGRyZXNzKQotCSAgICB7Ci0gICAgICAgICAgICBJbmRleCA9IGluZGV4OwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIExlZnQgYm9yZGVyIHN0eWxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW0gTGVmdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQm9yZGVySXRlbShfc3R5bGVzLCBfQ2hhbmdlZEV2ZW50LCBfcG9zaXRpb25JRCwgX2FkZHJlc3MsIGVTdHlsZUNsYXNzLkJvcmRlckxlZnQsIHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJpZ2h0IGJvcmRlciBzdHlsZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxCb3JkZXJJdGVtIFJpZ2h0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxCb3JkZXJJdGVtKF9zdHlsZXMsIF9DaGFuZ2VkRXZlbnQsIF9wb3NpdGlvbklELCBfYWRkcmVzcywgZVN0eWxlQ2xhc3MuQm9yZGVyUmlnaHQsIHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRvcCBib3JkZXIgc3R5bGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQm9yZGVySXRlbSBUb3AKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEJvcmRlckl0ZW0oX3N0eWxlcywgX0NoYW5nZWRFdmVudCwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzLCBlU3R5bGVDbGFzcy5Cb3JkZXJUb3AsIHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEJvdHRvbSBib3JkZXIgc3R5bGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQm9yZGVySXRlbSBCb3R0b20KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlbEJvcmRlckl0ZW0oX3N0eWxlcywgX0NoYW5nZWRFdmVudCwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzLCBlU3R5bGVDbGFzcy5Cb3JkZXJCb3R0b20sIHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIDBEaWFnb25hbCBib3JkZXIgc3R5bGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQm9yZGVySXRlbSBEaWFnb25hbAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQm9yZGVySXRlbShfc3R5bGVzLCBfQ2hhbmdlZEV2ZW50LCBfcG9zaXRpb25JRCwgX2FkZHJlc3MsIGVTdHlsZUNsYXNzLkJvcmRlckRpYWdvbmFsLCB0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBIGRpYWdvbmFsIGZyb20gdGhlIGJvdHRvbSBsZWZ0IHRvIHRvcCByaWdodCBvZiB0aGUgY2VsbAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBEaWFnb25hbFVwIAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoSW5kZXggPj0wKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQm9yZGVyc1tJbmRleF0uRGlhZ29uYWxVcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkJvcmRlciwgZVN0eWxlUHJvcGVydHkuQm9yZGVyRGlhZ29uYWxVcCwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgZGlhZ29uYWwgZnJvbSB0aGUgdG9wIGxlZnQgdG8gYm90dG9tIHJpZ2h0IG9mIHRoZSBjZWxsCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIERpYWdvbmFsRG93biAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEluZGV4ID49IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Cb3JkZXJzW0luZGV4XS5EaWFnb25hbERvd247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Cb3JkZXIsIGVTdHlsZVByb3BlcnR5LkJvcmRlckRpYWdvbmFsRG93biwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gVG9wLklkICsgQm90dG9tLklkICtMZWZ0LklkICsgUmlnaHQuSWQgKyBEaWFnb25hbC5JZCArIERpYWdvbmFsVXAgKyBEaWFnb25hbERvd247IH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXQgdGhlIGJvcmRlciBzdHlsZSBhcm91bmQgdGhlIHJhbmdlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlN0eWxlIj5UaGUgYm9yZGVyIHN0eWxlPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgQm9yZGVyQXJvdW5kKEV4Y2VsQm9yZGVyU3R5bGUgU3R5bGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhZGRyID0gbmV3IEV4Y2VsQWRkcmVzcyhfYWRkcmVzcyk7Ci0gICAgICAgICAgICBTZXRCb3JkZXJBcm91bmRTdHlsZShTdHlsZSwgYWRkcik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2V0IHRoZSBib3JkZXIgc3R5bGUgYXJvdW5kIHRoZSByYW5nZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJTdHlsZSI+VGhlIGJvcmRlciBzdHlsZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iQ29sb3IiPlRoZSBjb2xvciBvZiB0aGUgYm9yZGVyPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgQm9yZGVyQXJvdW5kKEV4Y2VsQm9yZGVyU3R5bGUgU3R5bGUsIFN5c3RlbS5EcmF3aW5nLkNvbG9yIENvbG9yKQotICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgICB2YXIgYWRkcj1uZXcgRXhjZWxBZGRyZXNzKF9hZGRyZXNzKTsKLSAgICAgICAgICAgIFNldEJvcmRlckFyb3VuZFN0eWxlKFN0eWxlLCBhZGRyKTsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwogCi0gICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Cb3JkZXJUb3AsIGVTdHlsZVByb3BlcnR5LkNvbG9yLCBDb2xvci5Ub0FyZ2IoKS5Ub1N0cmluZygiWCIpLCBfcG9zaXRpb25JRCwgbmV3IEV4Y2VsQWRkcmVzcyhhZGRyLl9mcm9tUm93LCBhZGRyLl9mcm9tQ29sLCBhZGRyLl9mcm9tUm93LCBhZGRyLl90b0NvbCkuQWRkcmVzcykpOwotICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuQm9yZGVyQm90dG9tLCBlU3R5bGVQcm9wZXJ0eS5Db2xvciwgQ29sb3IuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKSwgX3Bvc2l0aW9uSUQsIG5ldyBFeGNlbEFkZHJlc3MoYWRkci5fdG9Sb3csIGFkZHIuX2Zyb21Db2wsIGFkZHIuX3RvUm93LCBhZGRyLl90b0NvbCkuQWRkcmVzcykpOwotICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuQm9yZGVyTGVmdCwgZVN0eWxlUHJvcGVydHkuQ29sb3IsIENvbG9yLlRvQXJnYigpLlRvU3RyaW5nKCJYIiksIF9wb3NpdGlvbklELCBuZXcgRXhjZWxBZGRyZXNzKGFkZHIuX2Zyb21Sb3csIGFkZHIuX2Zyb21Db2wsIGFkZHIuX3RvUm93LCBhZGRyLl9mcm9tQ29sKS5BZGRyZXNzKSk7Ci0gICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Cb3JkZXJSaWdodCwgZVN0eWxlUHJvcGVydHkuQ29sb3IsIENvbG9yLlRvQXJnYigpLlRvU3RyaW5nKCJYIiksIF9wb3NpdGlvbklELCBuZXcgRXhjZWxBZGRyZXNzKGFkZHIuX2Zyb21Sb3csIGFkZHIuX3RvQ29sLCBhZGRyLl90b1JvdywgYWRkci5fdG9Db2wpLkFkZHJlc3MpKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGU7CiAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEJvcmRlckFyb3VuZFN0eWxlKEV4Y2VsQm9yZGVyU3R5bGUgU3R5bGUsIEV4Y2VsQWRkcmVzcyBhZGRyKQotICAgICAgICB7Ci0gICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Cb3JkZXJUb3AsIGVTdHlsZVByb3BlcnR5LlN0eWxlLCBTdHlsZSwgX3Bvc2l0aW9uSUQsIG5ldyBFeGNlbEFkZHJlc3MoYWRkci5fZnJvbVJvdywgYWRkci5fZnJvbUNvbCwgYWRkci5fZnJvbVJvdywgYWRkci5fdG9Db2wpLkFkZHJlc3MpKTsKLSAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkJvcmRlckJvdHRvbSwgZVN0eWxlUHJvcGVydHkuU3R5bGUsIFN0eWxlLCBfcG9zaXRpb25JRCwgbmV3IEV4Y2VsQWRkcmVzcyhhZGRyLl90b1JvdywgYWRkci5fZnJvbUNvbCwgYWRkci5fdG9Sb3csIGFkZHIuX3RvQ29sKS5BZGRyZXNzKSk7Ci0gICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Cb3JkZXJMZWZ0LCBlU3R5bGVQcm9wZXJ0eS5TdHlsZSwgU3R5bGUsIF9wb3NpdGlvbklELCBuZXcgRXhjZWxBZGRyZXNzKGFkZHIuX2Zyb21Sb3csIGFkZHIuX2Zyb21Db2wsIGFkZHIuX3RvUm93LCBhZGRyLl9mcm9tQ29sKS5BZGRyZXNzKSk7Ci0gICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Cb3JkZXJSaWdodCwgZVN0eWxlUHJvcGVydHkuU3R5bGUsIFN0eWxlLCBfcG9zaXRpb25JRCwgbmV3IEV4Y2VsQWRkcmVzcyhhZGRyLl9mcm9tUm93LCBhZGRyLl90b0NvbCwgYWRkci5fdG9Sb3csIGFkZHIuX3RvQ29sKS5BZGRyZXNzKSk7Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBDZWxsIEJvcmRlciBzdHlsZQorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBzZWFsZWQgY2xhc3MgQm9yZGVyIDogU3R5bGVCYXNlIHsKKyAgaW50ZXJuYWwgQm9yZGVyKAorICAgICAgRXhjZWxTdHlsZXMgc3R5bGVzLAorICAgICAgWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgY2hhbmdlZEV2ZW50LAorICAgICAgaW50IHBvc2l0aW9uSWQsCisgICAgICBzdHJpbmcgYWRkcmVzcywKKyAgICAgIGludCBpbmRleCkKKyAgICAgIDogYmFzZShzdHlsZXMsIGNoYW5nZWRFdmVudCwgcG9zaXRpb25JZCwgYWRkcmVzcykgeworICAgIEluZGV4ID0gaW5kZXg7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMZWZ0IGJvcmRlciBzdHlsZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxCb3JkZXJJdGVtIExlZnQgPT4KKyAgICBuZXcoX3N0eWxlcywgX0NoYW5nZWRFdmVudCwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzLCBlU3R5bGVDbGFzcy5Cb3JkZXJMZWZ0LCB0aGlzKTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSaWdodCBib3JkZXIgc3R5bGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsQm9yZGVySXRlbSBSaWdodCA9PgorICAgIG5ldyhfc3R5bGVzLCBfQ2hhbmdlZEV2ZW50LCBfcG9zaXRpb25JRCwgX2FkZHJlc3MsIGVTdHlsZUNsYXNzLkJvcmRlclJpZ2h0LCB0aGlzKTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUb3AgYm9yZGVyIHN0eWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW0gVG9wID0+CisgICAgbmV3KF9zdHlsZXMsIF9DaGFuZ2VkRXZlbnQsIF9wb3NpdGlvbklELCBfYWRkcmVzcywgZVN0eWxlQ2xhc3MuQm9yZGVyVG9wLCB0aGlzKTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBCb3R0b20gYm9yZGVyIHN0eWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW0gQm90dG9tID0+CisgICAgbmV3KF9zdHlsZXMsIF9DaGFuZ2VkRXZlbnQsIF9wb3NpdGlvbklELCBfYWRkcmVzcywgZVN0eWxlQ2xhc3MuQm9yZGVyQm90dG9tLCB0aGlzKTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyAwRGlhZ29uYWwgYm9yZGVyIHN0eWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW0gRGlhZ29uYWwgPT4KKyAgICBuZXcoX3N0eWxlcywgX0NoYW5nZWRFdmVudCwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzLCBlU3R5bGVDbGFzcy5Cb3JkZXJEaWFnb25hbCwgdGhpcyk7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSBkaWFnb25hbCBmcm9tIHRoZSBib3R0b20gbGVmdCB0byB0b3AgcmlnaHQgb2YgdGhlIGNlbGwKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgRGlhZ29uYWxVcCB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChJbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnNbSW5kZXhdLkRpYWdvbmFsVXA7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQorICAgIHNldCA9PgorICAgICAgX0NoYW5nZWRFdmVudCgKKyAgICAgICAgICB0aGlzLAorICAgICAgICAgIG5ldyhlU3R5bGVDbGFzcy5Cb3JkZXIsIGVTdHlsZVByb3BlcnR5LkJvcmRlckRpYWdvbmFsVXAsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgZGlhZ29uYWwgZnJvbSB0aGUgdG9wIGxlZnQgdG8gYm90dG9tIHJpZ2h0IG9mIHRoZSBjZWxsCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIERpYWdvbmFsRG93biB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChJbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnNbSW5kZXhdLkRpYWdvbmFsRG93bjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc2V0ID0+CisgICAgICBfQ2hhbmdlZEV2ZW50KAorICAgICAgICAgIHRoaXMsCisgICAgICAgICAgbmV3KGVTdHlsZUNsYXNzLkJvcmRlciwgZVN0eWxlUHJvcGVydHkuQm9yZGVyRGlhZ29uYWxEb3duLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQgPT4KKyAgICBUb3AuSWQgKyBCb3R0b20uSWQgKyBMZWZ0LklkICsgUmlnaHQuSWQgKyBEaWFnb25hbC5JZCArIERpYWdvbmFsVXAgKyBEaWFnb25hbERvd247CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2V0IHRoZSBib3JkZXIgc3R5bGUgYXJvdW5kIHRoZSByYW5nZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJzdHlsZSI+VGhlIGJvcmRlciBzdHlsZTwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIEJvcmRlckFyb3VuZChFeGNlbEJvcmRlclN0eWxlIHN0eWxlKSB7CisgICAgdmFyIGFkZHIgPSBuZXcgRXhjZWxBZGRyZXNzKF9hZGRyZXNzKTsKKyAgICBTZXRCb3JkZXJBcm91bmRTdHlsZShzdHlsZSwgYWRkcik7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTZXQgdGhlIGJvcmRlciBzdHlsZSBhcm91bmQgdGhlIHJhbmdlLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InN0eWxlIj5UaGUgYm9yZGVyIHN0eWxlPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJjb2xvciI+VGhlIGNvbG9yIG9mIHRoZSBib3JkZXI8L3BhcmFtPgorICBwdWJsaWMgdm9pZCBCb3JkZXJBcm91bmQoRXhjZWxCb3JkZXJTdHlsZSBzdHlsZSwgQ29sb3IgY29sb3IpIHsKKyAgICB2YXIgYWRkciA9IG5ldyBFeGNlbEFkZHJlc3MoX2FkZHJlc3MpOworICAgIFNldEJvcmRlckFyb3VuZFN0eWxlKHN0eWxlLCBhZGRyKTsKKworICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgIHRoaXMsCisgICAgICAgIG5ldygKKyAgICAgICAgICAgIGVTdHlsZUNsYXNzLkJvcmRlclRvcCwKKyAgICAgICAgICAgIGVTdHlsZVByb3BlcnR5LkNvbG9yLAorICAgICAgICAgICAgY29sb3IuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKSwKKyAgICAgICAgICAgIF9wb3NpdGlvbklELAorICAgICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzcyhhZGRyLl9mcm9tUm93LCBhZGRyLl9mcm9tQ29sLCBhZGRyLl9mcm9tUm93LCBhZGRyLl90b0NvbCkuQWRkcmVzcykpOworICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgIHRoaXMsCisgICAgICAgIG5ldygKKyAgICAgICAgICAgIGVTdHlsZUNsYXNzLkJvcmRlckJvdHRvbSwKKyAgICAgICAgICAgIGVTdHlsZVByb3BlcnR5LkNvbG9yLAorICAgICAgICAgICAgY29sb3IuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKSwKKyAgICAgICAgICAgIF9wb3NpdGlvbklELAorICAgICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzcyhhZGRyLl90b1JvdywgYWRkci5fZnJvbUNvbCwgYWRkci5fdG9Sb3csIGFkZHIuX3RvQ29sKS5BZGRyZXNzKSk7CisgICAgX0NoYW5nZWRFdmVudCgKKyAgICAgICAgdGhpcywKKyAgICAgICAgbmV3KAorICAgICAgICAgICAgZVN0eWxlQ2xhc3MuQm9yZGVyTGVmdCwKKyAgICAgICAgICAgIGVTdHlsZVByb3BlcnR5LkNvbG9yLAorICAgICAgICAgICAgY29sb3IuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKSwKKyAgICAgICAgICAgIF9wb3NpdGlvbklELAorICAgICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzcyhhZGRyLl9mcm9tUm93LCBhZGRyLl9mcm9tQ29sLCBhZGRyLl90b1JvdywgYWRkci5fZnJvbUNvbCkuQWRkcmVzcykpOworICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgIHRoaXMsCisgICAgICAgIG5ldygKKyAgICAgICAgICAgIGVTdHlsZUNsYXNzLkJvcmRlclJpZ2h0LAorICAgICAgICAgICAgZVN0eWxlUHJvcGVydHkuQ29sb3IsCisgICAgICAgICAgICBjb2xvci5Ub0FyZ2IoKS5Ub1N0cmluZygiWCIpLAorICAgICAgICAgICAgX3Bvc2l0aW9uSUQsCisgICAgICAgICAgICBuZXcgRXhjZWxBZGRyZXNzKGFkZHIuX2Zyb21Sb3csIGFkZHIuX3RvQ29sLCBhZGRyLl90b1JvdywgYWRkci5fdG9Db2wpLkFkZHJlc3MpKTsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBTZXRCb3JkZXJBcm91bmRTdHlsZShFeGNlbEJvcmRlclN0eWxlIHN0eWxlLCBFeGNlbEFkZHJlc3MgYWRkcikgeworICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgIHRoaXMsCisgICAgICAgIG5ldygKKyAgICAgICAgICAgIGVTdHlsZUNsYXNzLkJvcmRlclRvcCwKKyAgICAgICAgICAgIGVTdHlsZVByb3BlcnR5LlN0eWxlLAorICAgICAgICAgICAgc3R5bGUsCisgICAgICAgICAgICBfcG9zaXRpb25JRCwKKyAgICAgICAgICAgIG5ldyBFeGNlbEFkZHJlc3MoYWRkci5fZnJvbVJvdywgYWRkci5fZnJvbUNvbCwgYWRkci5fZnJvbVJvdywgYWRkci5fdG9Db2wpLkFkZHJlc3MpKTsKKyAgICBfQ2hhbmdlZEV2ZW50KAorICAgICAgICB0aGlzLAorICAgICAgICBuZXcoCisgICAgICAgICAgICBlU3R5bGVDbGFzcy5Cb3JkZXJCb3R0b20sCisgICAgICAgICAgICBlU3R5bGVQcm9wZXJ0eS5TdHlsZSwKKyAgICAgICAgICAgIHN0eWxlLAorICAgICAgICAgICAgX3Bvc2l0aW9uSUQsCisgICAgICAgICAgICBuZXcgRXhjZWxBZGRyZXNzKGFkZHIuX3RvUm93LCBhZGRyLl9mcm9tQ29sLCBhZGRyLl90b1JvdywgYWRkci5fdG9Db2wpLkFkZHJlc3MpKTsKKyAgICBfQ2hhbmdlZEV2ZW50KAorICAgICAgICB0aGlzLAorICAgICAgICBuZXcoCisgICAgICAgICAgICBlU3R5bGVDbGFzcy5Cb3JkZXJMZWZ0LAorICAgICAgICAgICAgZVN0eWxlUHJvcGVydHkuU3R5bGUsCisgICAgICAgICAgICBzdHlsZSwKKyAgICAgICAgICAgIF9wb3NpdGlvbklELAorICAgICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzcyhhZGRyLl9mcm9tUm93LCBhZGRyLl9mcm9tQ29sLCBhZGRyLl90b1JvdywgYWRkci5fZnJvbUNvbCkuQWRkcmVzcykpOworICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgIHRoaXMsCisgICAgICAgIG5ldygKKyAgICAgICAgICAgIGVTdHlsZUNsYXNzLkJvcmRlclJpZ2h0LAorICAgICAgICAgICAgZVN0eWxlUHJvcGVydHkuU3R5bGUsCisgICAgICAgICAgICBzdHlsZSwKKyAgICAgICAgICAgIF9wb3NpdGlvbklELAorICAgICAgICAgICAgbmV3IEV4Y2VsQWRkcmVzcyhhZGRyLl9mcm9tUm93LCBhZGRyLl90b0NvbCwgYWRkci5fdG9Sb3csIGFkZHIuX3RvQ29sKS5BZGRyZXNzKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9FeGNlbEJvcmRlckl0ZW0uY3MgYi9FUFBsdXMvU3R5bGUvRXhjZWxCb3JkZXJJdGVtLmNzCmluZGV4IDc3OTRkOWEuLmY0NmY1NWEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9FeGNlbEJvcmRlckl0ZW0uY3MKKysrIGIvRVBQbHVzL1N0eWxlL0V4Y2VsQm9yZGVySXRlbS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTAwICsxMyw5MSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQ2VsbCBib3JkZXIgc3R5bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxCb3JkZXJJdGVtIDogU3R5bGVCYXNlCi0gICAgewotICAgICAgICBlU3R5bGVDbGFzcyBfY2xzOwotICAgICAgICBTdHlsZUJhc2UgX3BhcmVudDsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxCb3JkZXJJdGVtIChFeGNlbFN0eWxlcyBzdHlsZXMsIE9mZmljZU9wZW5YbWwuWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgQ2hhbmdlZEV2ZW50LCBpbnQgd29ya3NoZWV0SUQsIHN0cmluZyBhZGRyZXNzLCBlU3R5bGVDbGFzcyBjbHMsIFN0eWxlQmFzZSBwYXJlbnQpIDogCi0gICAgICAgICAgICBiYXNlKHN0eWxlcywgQ2hhbmdlZEV2ZW50LCB3b3Jrc2hlZXRJRCwgYWRkcmVzcykKLQkgICAgewotICAgICAgICAgICAgX2Nscz1jbHM7Ci0gICAgICAgICAgICBfcGFyZW50ID0gcGFyZW50OwotCSAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBsaW5lIHN0eWxlIG9mIHRoZSBib3JkZXIKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQm9yZGVyU3R5bGUgU3R5bGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFNvdXJjZSgpLlN0eWxlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoX2NscywgZVN0eWxlUHJvcGVydHkuU3R5bGUsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbENvbG9yIF9jb2xvcj1udWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgY29sb3Igb2YgdGhlIGJvcmRlcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxDb2xvciBDb2xvcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2NvbG9yID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfY29sb3IgPSBuZXcgRXhjZWxDb2xvcihfc3R5bGVzLCBfQ2hhbmdlZEV2ZW50LCBfcG9zaXRpb25JRCwgX2FkZHJlc3MsIF9jbHMsIF9wYXJlbnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2NvbG9yOwotICAgICAgICAgICAgfQotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZTsKIAotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIFN0eWxlICsgQ29sb3IuSWQ7IH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIFNldEluZGV4KGludCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgX3BhcmVudC5JbmRleCA9IGluZGV4OwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgRXhjZWxCb3JkZXJJdGVtWG1sIEdldFNvdXJjZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpeCA9IF9wYXJlbnQuSW5kZXggPCAwID8gMCA6IF9wYXJlbnQuSW5kZXg7CisvLy8gPHN1bW1hcnk+CisvLy8gQ2VsbCBib3JkZXIgc3R5bGUKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsQm9yZGVySXRlbSA6IFN0eWxlQmFzZSB7CisgIHByaXZhdGUgZVN0eWxlQ2xhc3MgX2NsczsKKyAgcHJpdmF0ZSBTdHlsZUJhc2UgX3BhcmVudDsKIAotICAgICAgICAgICAgc3dpdGNoKF9jbHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJUb3A6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnNbaXhdLlRvcDsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlckJvdHRvbToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQm9yZGVyc1tpeF0uQm90dG9tOwotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyTGVmdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQm9yZGVyc1tpeF0uTGVmdDsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlclJpZ2h0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Cb3JkZXJzW2l4XS5SaWdodDsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlckRpYWdvbmFsOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Cb3JkZXJzW2l4XS5EaWFnb25hbDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIGNsYXNzIGZvciBCb3JkZXJpdGVtIik7Ci0gICAgICAgICAgICB9CisgIGludGVybmFsIEV4Y2VsQm9yZGVySXRlbSgKKyAgICAgIEV4Y2VsU3R5bGVzIHN0eWxlcywKKyAgICAgIFhtbEhlbHBlci5DaGFuZ2VkRXZlbnRIYW5kbGVyIGNoYW5nZWRFdmVudCwKKyAgICAgIGludCB3b3Jrc2hlZXRJZCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgZVN0eWxlQ2xhc3MgY2xzLAorICAgICAgU3R5bGVCYXNlIHBhcmVudCkKKyAgICAgIDogYmFzZShzdHlsZXMsIGNoYW5nZWRFdmVudCwgd29ya3NoZWV0SWQsIGFkZHJlc3MpIHsKKyAgICBfY2xzID0gY2xzOworICAgIF9wYXJlbnQgPSBwYXJlbnQ7CisgIH0KIAotICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBsaW5lIHN0eWxlIG9mIHRoZSBib3JkZXIKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsQm9yZGVyU3R5bGUgU3R5bGUgeworICAgIGdldCA9PiBHZXRTb3VyY2UoKS5TdHlsZTsKKyAgICBzZXQgPT4gX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcoX2NscywgZVN0eWxlUHJvcGVydHkuU3R5bGUsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgfQorCisgIHByaXZhdGUgRXhjZWxDb2xvciBfY29sb3I7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIGNvbG9yIG9mIHRoZSBib3JkZXIKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsQ29sb3IgQ29sb3IgeworICAgIGdldCB7CisgICAgICBpZiAoX2NvbG9yID09IG51bGwpIHsKKyAgICAgICAgX2NvbG9yID0gbmV3KF9zdHlsZXMsIF9DaGFuZ2VkRXZlbnQsIF9wb3NpdGlvbklELCBfYWRkcmVzcywgX2NscywgX3BhcmVudCk7CisgICAgICB9CisgICAgICByZXR1cm4gX2NvbG9yOwogICAgIH0KKyAgfQorCisgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZCA9PiBTdHlsZSArIENvbG9yLklkOworCisgIGludGVybmFsIG92ZXJyaWRlIHZvaWQgU2V0SW5kZXgoaW50IGluZGV4KSB7CisgICAgX3BhcmVudC5JbmRleCA9IGluZGV4OworICB9CisKKyAgcHJpdmF0ZSBFeGNlbEJvcmRlckl0ZW1YbWwgR2V0U291cmNlKCkgeworICAgIGludCBpeCA9IF9wYXJlbnQuSW5kZXggPCAwID8gMCA6IF9wYXJlbnQuSW5kZXg7CisKKyAgICBzd2l0Y2ggKF9jbHMpIHsKKyAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyVG9wOgorICAgICAgICByZXR1cm4gX3N0eWxlcy5Cb3JkZXJzW2l4XS5Ub3A7CisgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlckJvdHRvbToKKyAgICAgICAgcmV0dXJuIF9zdHlsZXMuQm9yZGVyc1tpeF0uQm90dG9tOworICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJMZWZ0OgorICAgICAgICByZXR1cm4gX3N0eWxlcy5Cb3JkZXJzW2l4XS5MZWZ0OworICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJSaWdodDoKKyAgICAgICAgcmV0dXJuIF9zdHlsZXMuQm9yZGVyc1tpeF0uUmlnaHQ7CisgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlckRpYWdvbmFsOgorICAgICAgICByZXR1cm4gX3N0eWxlcy5Cb3JkZXJzW2l4XS5EaWFnb25hbDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldygiSW52YWxpZCBjbGFzcyBmb3IgQm9yZGVyaXRlbSIpOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0V4Y2VsQ29sb3IuY3MgYi9FUFBsdXMvU3R5bGUvRXhjZWxDb2xvci5jcwppbmRleCAzM2QxOTU3Li45MzVmNzhlIDEwMDY0NAotLS0gYS9FUFBsdXMvU3R5bGUvRXhjZWxDb2xvci5jcworKysgYi9FUFBsdXMvU3R5bGUvRXhjZWxDb2xvci5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMjQ1ICsxMywyMTMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKIHVzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBDb2xvciBmb3IgY2VsbHN0eWxpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxDb2xvciA6ICBTdHlsZUJhc2UKLSAgICB7Ci0gICAgICAgIGVTdHlsZUNsYXNzIF9jbHM7Ci0gICAgICAgIFN0eWxlQmFzZSBfcGFyZW50OwotICAgICAgICBpbnRlcm5hbCBFeGNlbENvbG9yKEV4Y2VsU3R5bGVzIHN0eWxlcywgT2ZmaWNlT3BlblhtbC5YbWxIZWxwZXIuQ2hhbmdlZEV2ZW50SGFuZGxlciBDaGFuZ2VkRXZlbnQsIGludCB3b3Jrc2hlZXRJRCwgc3RyaW5nIGFkZHJlc3MsIGVTdHlsZUNsYXNzIGNscywgU3R5bGVCYXNlIHBhcmVudCkgOiAKLSAgICAgICAgICAgIGJhc2Uoc3R5bGVzLCBDaGFuZ2VkRXZlbnQsIHdvcmtzaGVldElELCBhZGRyZXNzKQotICAgICAgICAgICAgCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgICAgICAgICBfY2xzID0gY2xzOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB0aGVtZSBjb2xvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIFRoZW1lCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRTb3VyY2UoKS5UaGVtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgdGludCB2YWx1ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZGVjaW1hbCBUaW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRTb3VyY2UoKS5UaW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID4gMSB8fCB2YWx1ZSA8IC0xKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlZhbHVlIG11c3QgYmUgYmV0d2VlbiAtMSBhbmQgMSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoX2NscywgZVN0eWxlUHJvcGVydHkuVGludCwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBSR0IgdmFsdWUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBSZ2IKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFNvdXJjZSgpLlJnYjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKF9jbHMsIGVTdHlsZVByb3BlcnR5LkNvbG9yLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGluZGV4ZWQgY29sb3IgbnVtYmVyLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IEluZGV4ZWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFNvdXJjZSgpLkluZGV4ZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhfY2xzLCBlU3R5bGVQcm9wZXJ0eS5JbmRleGVkQ29sb3IsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXQgdGhlIGNvbG9yIG9mIHRoZSBvYmplY3QKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2xvciI+VGhlIGNvbG9yPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgU2V0Q29sb3IoQ29sb3IgY29sb3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJnYiA9IGNvbG9yLlRvQXJnYigpLlRvU3RyaW5nKCJYIik7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlOwogCisvLy8gPHN1bW1hcnk+CisvLy8gQ29sb3IgZm9yIGNlbGxzdHlsaW5nCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbENvbG9yIDogU3R5bGVCYXNlIHsKKyAgcHJpdmF0ZSBlU3R5bGVDbGFzcyBfY2xzOworICBwcml2YXRlIFN0eWxlQmFzZSBfcGFyZW50OwogCi0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRoZW1lICsgVGludCArIFJnYiArIEluZGV4ZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBFeGNlbENvbG9yWG1sIEdldFNvdXJjZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluZGV4ID0gX3BhcmVudC5JbmRleCA8IDAgPyAwIDogX3BhcmVudC5JbmRleDsKLSAgICAgICAgICAgIHN3aXRjaChfY2xzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuRmlsbEJhY2tncm91bmRDb2xvcjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuRmlsbHNbSW5kZXhdLkJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkZpbGxQYXR0ZXJuQ29sb3I6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkZpbGxzW0luZGV4XS5QYXR0ZXJuQ29sb3I7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Gb250OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Gb250c1tJbmRleF0uQ29sb3I7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJMZWZ0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Cb3JkZXJzW0luZGV4XS5MZWZ0LkNvbG9yOwotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyVG9wOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Cb3JkZXJzW0luZGV4XS5Ub3AuQ29sb3I7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJSaWdodDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQm9yZGVyc1tJbmRleF0uUmlnaHQuQ29sb3I7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJCb3R0b206Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnNbSW5kZXhdLkJvdHRvbS5Db2xvcjsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlckRpYWdvbmFsOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Cb3JkZXJzW0luZGV4XS5EaWFnb25hbC5Db2xvcjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHN0eWxlLWNsYXNzIGZvciBDb2xvciIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIFNldEluZGV4KGludCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgX3BhcmVudC5JbmRleCA9IGluZGV4OwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybiB0aGUgUkdCIHZhbHVlIGZvciB0aGUgY29sb3Igb2JqZWN0IHRoYXQgdXNlcyB0aGUgSW5kZXhlZCBvciBUaW50IHByb3BlcnR5Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGhlQ29sb3IiPlRoZSBjb2xvciBvYmplY3Q8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIFJHQiBjb2xvciBzdGFydGluZyB3aXRoIGEgIzwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0cmluZyBMb29rdXBDb2xvcihFeGNlbENvbG9yIHRoZUNvbG9yKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL1RoYW5rcyB0byBuZWF2ZXMgZm9yIGNvbnRyaWJ1dGluZyB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgIGludCBpVGludCA9IDA7Ci0gICAgICAgICAgICBzdHJpbmcgdHJhbnNsYXRlZFJHQiA9ICIiOworICBpbnRlcm5hbCBFeGNlbENvbG9yKAorICAgICAgRXhjZWxTdHlsZXMgc3R5bGVzLAorICAgICAgWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgY2hhbmdlZEV2ZW50LAorICAgICAgaW50IHdvcmtzaGVldElkLAorICAgICAgc3RyaW5nIGFkZHJlc3MsCisgICAgICBlU3R5bGVDbGFzcyBjbHMsCisgICAgICBTdHlsZUJhc2UgcGFyZW50KQorICAgICAgOiBiYXNlKHN0eWxlcywgY2hhbmdlZEV2ZW50LCB3b3Jrc2hlZXRJZCwgYWRkcmVzcykgeworICAgIF9wYXJlbnQgPSBwYXJlbnQ7CisgICAgX2NscyA9IGNsczsKKyAgfQogCi0gICAgICAgICAgICAvLyByZWZlcmVuY2UgZXh0cmFjdGVkIGZyb20gRUNNQS0zNzYsIFBhcnQgNCwgU2VjdGlvbiAzLjguMjYKLSAgICAgICAgICAgIHN0cmluZ1tdIHJnYkxvb2t1cCA9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIiNGRjAwMDAwMCIsIC8vIDAKLSAgICAgICAgICAgICAgICAiI0ZGRkZGRkZGIiwKLSAgICAgICAgICAgICAgICAiI0ZGRkYwMDAwIiwKLSAgICAgICAgICAgICAgICAiI0ZGMDBGRjAwIiwKLSAgICAgICAgICAgICAgICAiI0ZGMDAwMEZGIiwKLSAgICAgICAgICAgICAgICAiI0ZGRkZGRjAwIiwKLSAgICAgICAgICAgICAgICAiI0ZGRkYwMEZGIiwKLSAgICAgICAgICAgICAgICAiI0ZGMDBGRkZGIiwKLSAgICAgICAgICAgICAgICAiI0ZGMDAwMDAwIiwgLy8gOAotICAgICAgICAgICAgICAgICIjRkZGRkZGRkYiLAotICAgICAgICAgICAgICAgICIjRkZGRjAwMDAiLAotICAgICAgICAgICAgICAgICIjRkYwMEZGMDAiLAotICAgICAgICAgICAgICAgICIjRkYwMDAwRkYiLAotICAgICAgICAgICAgICAgICIjRkZGRkZGMDAiLAotICAgICAgICAgICAgICAgICIjRkZGRjAwRkYiLAotICAgICAgICAgICAgICAgICIjRkYwMEZGRkYiLAotICAgICAgICAgICAgICAgICIjRkY4MDAwMDAiLAotICAgICAgICAgICAgICAgICIjRkYwMDgwMDAiLAotICAgICAgICAgICAgICAgICIjRkYwMDAwODAiLAotICAgICAgICAgICAgICAgICIjRkY4MDgwMDAiLAotICAgICAgICAgICAgICAgICIjRkY4MDAwODAiLAotICAgICAgICAgICAgICAgICIjRkYwMDgwODAiLAotICAgICAgICAgICAgICAgICIjRkZDMEMwQzAiLAotICAgICAgICAgICAgICAgICIjRkY4MDgwODAiLAotICAgICAgICAgICAgICAgICIjRkY5OTk5RkYiLAotICAgICAgICAgICAgICAgICIjRkY5OTMzNjYiLAotICAgICAgICAgICAgICAgICIjRkZGRkZGQ0MiLAotICAgICAgICAgICAgICAgICIjRkZDQ0ZGRkYiLAotICAgICAgICAgICAgICAgICIjRkY2NjAwNjYiLAotICAgICAgICAgICAgICAgICIjRkZGRjgwODAiLAotICAgICAgICAgICAgICAgICIjRkYwMDY2Q0MiLAotICAgICAgICAgICAgICAgICIjRkZDQ0NDRkYiLAotICAgICAgICAgICAgICAgICIjRkYwMDAwODAiLAotICAgICAgICAgICAgICAgICIjRkZGRjAwRkYiLAotICAgICAgICAgICAgICAgICIjRkZGRkZGMDAiLAotICAgICAgICAgICAgICAgICIjRkYwMEZGRkYiLAotICAgICAgICAgICAgICAgICIjRkY4MDAwODAiLAotICAgICAgICAgICAgICAgICIjRkY4MDAwMDAiLAotICAgICAgICAgICAgICAgICIjRkYwMDgwODAiLAotICAgICAgICAgICAgICAgICIjRkYwMDAwRkYiLAotICAgICAgICAgICAgICAgICIjRkYwMENDRkYiLAotICAgICAgICAgICAgICAgICIjRkZDQ0ZGRkYiLAotICAgICAgICAgICAgICAgICIjRkZDQ0ZGQ0MiLAotICAgICAgICAgICAgICAgICIjRkZGRkZGOTkiLAotICAgICAgICAgICAgICAgICIjRkY5OUNDRkYiLAotICAgICAgICAgICAgICAgICIjRkZGRjk5Q0MiLAotICAgICAgICAgICAgICAgICIjRkZDQzk5RkYiLAotICAgICAgICAgICAgICAgICIjRkZGRkNDOTkiLAotICAgICAgICAgICAgICAgICIjRkYzMzY2RkYiLAotICAgICAgICAgICAgICAgICIjRkYzM0NDQ0MiLAotICAgICAgICAgICAgICAgICIjRkY5OUNDMDAiLAotICAgICAgICAgICAgICAgICIjRkZGRkNDMDAiLAotICAgICAgICAgICAgICAgICIjRkZGRjk5MDAiLAotICAgICAgICAgICAgICAgICIjRkZGRjY2MDAiLAotICAgICAgICAgICAgICAgICIjRkY2NjY2OTkiLAotICAgICAgICAgICAgICAgICIjRkY5Njk2OTYiLAotICAgICAgICAgICAgICAgICIjRkYwMDMzNjYiLAotICAgICAgICAgICAgICAgICIjRkYzMzk5NjYiLAotICAgICAgICAgICAgICAgICIjRkYwMDMzMDAiLAotICAgICAgICAgICAgICAgICIjRkYzMzMzMDAiLAotICAgICAgICAgICAgICAgICIjRkY5OTMzMDAiLAotICAgICAgICAgICAgICAgICIjRkY5OTMzNjYiLAotICAgICAgICAgICAgICAgICIjRkYzMzMzOTkiLAotICAgICAgICAgICAgICAgICIjRkYzMzMzMzMiLCAvLyA2MwotICAgICAgICAgICAgfTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIHRoZW1lIGNvbG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgVGhlbWUgPT4gR2V0U291cmNlKCkuVGhlbWU7CiAKLSAgICAgICAgICAgIGlmICgoMCA8PSB0aGVDb2xvci5JbmRleGVkKSAmJiAocmdiTG9va3VwLkxlbmd0aCA+IHRoZUNvbG9yLkluZGV4ZWQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIGNvbG9yaW5nIGJ5IHByZS1zZXQgY29sb3IgY29kZXMKLSAgICAgICAgICAgICAgICB0cmFuc2xhdGVkUkdCID0gcmdiTG9va3VwW3RoZUNvbG9yLkluZGV4ZWRdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAobnVsbCAhPSB0aGVDb2xvci5SZ2IgJiYgMCA8IHRoZUNvbG9yLlJnYi5MZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gY29sb3JpbmcgYnkgUkdCIHZhbHVlICgiRkZSUkdHQkIiKQotICAgICAgICAgICAgICAgIHRyYW5zbGF0ZWRSR0IgPSAiIyIgKyB0aGVDb2xvci5SZ2I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gY29sb3JpbmcgYnkgc2hhZGVzIG9mIGdyZXkgKC0xIC0+IDApCi0gICAgICAgICAgICAgICAgaVRpbnQgPSAoKGludCkodGhlQ29sb3IuVGludCAqIDE2MCkgKyAweDgwKTsKLSAgICAgICAgICAgICAgICB0cmFuc2xhdGVkUkdCID0gKChpbnQpKGRlY2ltYWwuUm91bmQodGhlQ29sb3IuVGludCAqIC01MTIpKSkuVG9TdHJpbmcoIlgiKTsKLSAgICAgICAgICAgICAgICB0cmFuc2xhdGVkUkdCID0gIiNGRiIgKyB0cmFuc2xhdGVkUkdCICsgdHJhbnNsYXRlZFJHQiArIHRyYW5zbGF0ZWRSR0I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVkUkdCOwotICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSB0aW50IHZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBkZWNpbWFsIFRpbnQgeworICAgIGdldCA9PiBHZXRTb3VyY2UoKS5UaW50OworICAgIHNldCB7CisgICAgICBpZiAodmFsdWUgPiAxIHx8IHZhbHVlIDwgLTEpIHsKKyAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlZhbHVlIG11c3QgYmUgYmV0d2VlbiAtMSBhbmQgMSIpKTsKKyAgICAgIH0KKyAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3KF9jbHMsIGVTdHlsZVByb3BlcnR5LlRpbnQsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKICAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgUkdCIHZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgUmdiIHsKKyAgICBnZXQgPT4gR2V0U291cmNlKCkuUmdiOworICAgIGludGVybmFsIHNldCA9PgorICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcoX2NscywgZVN0eWxlUHJvcGVydHkuQ29sb3IsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBpbmRleGVkIGNvbG9yIG51bWJlci4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBJbmRleGVkIHsKKyAgICBnZXQgPT4gR2V0U291cmNlKCkuSW5kZXhlZDsKKyAgICBzZXQgPT4KKyAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3KF9jbHMsIGVTdHlsZVByb3BlcnR5LkluZGV4ZWRDb2xvciwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2V0IHRoZSBjb2xvciBvZiB0aGUgb2JqZWN0CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iY29sb3IiPlRoZSBjb2xvcjwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIFNldENvbG9yKENvbG9yIGNvbG9yKSB7CisgICAgUmdiID0gY29sb3IuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKTsKKyAgfQorCisgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZCA9PiBUaGVtZSArIFRpbnQgKyBSZ2IgKyBJbmRleGVkOworCisgIHByaXZhdGUgRXhjZWxDb2xvclhtbCBHZXRTb3VyY2UoKSB7CisgICAgSW5kZXggPSBfcGFyZW50LkluZGV4IDwgMCA/IDAgOiBfcGFyZW50LkluZGV4OworICAgIHN3aXRjaCAoX2NscykgeworICAgICAgY2FzZSBlU3R5bGVDbGFzcy5GaWxsQmFja2dyb3VuZENvbG9yOgorICAgICAgICByZXR1cm4gX3N0eWxlcy5GaWxsc1tJbmRleF0uQmFja2dyb3VuZENvbG9yOworICAgICAgY2FzZSBlU3R5bGVDbGFzcy5GaWxsUGF0dGVybkNvbG9yOgorICAgICAgICByZXR1cm4gX3N0eWxlcy5GaWxsc1tJbmRleF0uUGF0dGVybkNvbG9yOworICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Gb250OgorICAgICAgICByZXR1cm4gX3N0eWxlcy5Gb250c1tJbmRleF0uQ29sb3I7CisgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlckxlZnQ6CisgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnNbSW5kZXhdLkxlZnQuQ29sb3I7CisgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlclRvcDoKKyAgICAgICAgcmV0dXJuIF9zdHlsZXMuQm9yZGVyc1tJbmRleF0uVG9wLkNvbG9yOworICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJSaWdodDoKKyAgICAgICAgcmV0dXJuIF9zdHlsZXMuQm9yZGVyc1tJbmRleF0uUmlnaHQuQ29sb3I7CisgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlckJvdHRvbToKKyAgICAgICAgcmV0dXJuIF9zdHlsZXMuQm9yZGVyc1tJbmRleF0uQm90dG9tLkNvbG9yOworICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJEaWFnb25hbDoKKyAgICAgICAgcmV0dXJuIF9zdHlsZXMuQm9yZGVyc1tJbmRleF0uRGlhZ29uYWwuQ29sb3I7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAobmV3KCJJbnZhbGlkIHN0eWxlLWNsYXNzIGZvciBDb2xvciIpKTsKKyAgICB9CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSB2b2lkIFNldEluZGV4KGludCBpbmRleCkgeworICAgIF9wYXJlbnQuSW5kZXggPSBpbmRleDsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybiB0aGUgUkdCIHZhbHVlIGZvciB0aGUgY29sb3Igb2JqZWN0IHRoYXQgdXNlcyB0aGUgSW5kZXhlZCBvciBUaW50IHByb3BlcnR5CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idGhlQ29sb3IiPlRoZSBjb2xvciBvYmplY3Q8L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIFJHQiBjb2xvciBzdGFydGluZyB3aXRoIGEgIzwvcmV0dXJucz4KKyAgcHVibGljIHN0cmluZyBMb29rdXBDb2xvcihFeGNlbENvbG9yIHRoZUNvbG9yKSB7CisgICAgLy9UaGFua3MgdG8gbmVhdmVzIGZvciBjb250cmlidXRpbmcgdGhpcyBtZXRob2QuCisgICAgaW50IGlUaW50ID0gMDsKKyAgICBzdHJpbmcgdHJhbnNsYXRlZFJnYiA9ICIiOworCisgICAgLy8gcmVmZXJlbmNlIGV4dHJhY3RlZCBmcm9tIEVDTUEtMzc2LCBQYXJ0IDQsIFNlY3Rpb24gMy44LjI2CisgICAgc3RyaW5nW10gcmdiTG9va3VwID0geworICAgICAgIiNGRjAwMDAwMCIsIC8vIDAKKyAgICAgICIjRkZGRkZGRkYiLAorICAgICAgIiNGRkZGMDAwMCIsCisgICAgICAiI0ZGMDBGRjAwIiwKKyAgICAgICIjRkYwMDAwRkYiLAorICAgICAgIiNGRkZGRkYwMCIsCisgICAgICAiI0ZGRkYwMEZGIiwKKyAgICAgICIjRkYwMEZGRkYiLAorICAgICAgIiNGRjAwMDAwMCIsIC8vIDgKKyAgICAgICIjRkZGRkZGRkYiLAorICAgICAgIiNGRkZGMDAwMCIsCisgICAgICAiI0ZGMDBGRjAwIiwKKyAgICAgICIjRkYwMDAwRkYiLAorICAgICAgIiNGRkZGRkYwMCIsCisgICAgICAiI0ZGRkYwMEZGIiwKKyAgICAgICIjRkYwMEZGRkYiLAorICAgICAgIiNGRjgwMDAwMCIsCisgICAgICAiI0ZGMDA4MDAwIiwKKyAgICAgICIjRkYwMDAwODAiLAorICAgICAgIiNGRjgwODAwMCIsCisgICAgICAiI0ZGODAwMDgwIiwKKyAgICAgICIjRkYwMDgwODAiLAorICAgICAgIiNGRkMwQzBDMCIsCisgICAgICAiI0ZGODA4MDgwIiwKKyAgICAgICIjRkY5OTk5RkYiLAorICAgICAgIiNGRjk5MzM2NiIsCisgICAgICAiI0ZGRkZGRkNDIiwKKyAgICAgICIjRkZDQ0ZGRkYiLAorICAgICAgIiNGRjY2MDA2NiIsCisgICAgICAiI0ZGRkY4MDgwIiwKKyAgICAgICIjRkYwMDY2Q0MiLAorICAgICAgIiNGRkNDQ0NGRiIsCisgICAgICAiI0ZGMDAwMDgwIiwKKyAgICAgICIjRkZGRjAwRkYiLAorICAgICAgIiNGRkZGRkYwMCIsCisgICAgICAiI0ZGMDBGRkZGIiwKKyAgICAgICIjRkY4MDAwODAiLAorICAgICAgIiNGRjgwMDAwMCIsCisgICAgICAiI0ZGMDA4MDgwIiwKKyAgICAgICIjRkYwMDAwRkYiLAorICAgICAgIiNGRjAwQ0NGRiIsCisgICAgICAiI0ZGQ0NGRkZGIiwKKyAgICAgICIjRkZDQ0ZGQ0MiLAorICAgICAgIiNGRkZGRkY5OSIsCisgICAgICAiI0ZGOTlDQ0ZGIiwKKyAgICAgICIjRkZGRjk5Q0MiLAorICAgICAgIiNGRkNDOTlGRiIsCisgICAgICAiI0ZGRkZDQzk5IiwKKyAgICAgICIjRkYzMzY2RkYiLAorICAgICAgIiNGRjMzQ0NDQyIsCisgICAgICAiI0ZGOTlDQzAwIiwKKyAgICAgICIjRkZGRkNDMDAiLAorICAgICAgIiNGRkZGOTkwMCIsCisgICAgICAiI0ZGRkY2NjAwIiwKKyAgICAgICIjRkY2NjY2OTkiLAorICAgICAgIiNGRjk2OTY5NiIsCisgICAgICAiI0ZGMDAzMzY2IiwKKyAgICAgICIjRkYzMzk5NjYiLAorICAgICAgIiNGRjAwMzMwMCIsCisgICAgICAiI0ZGMzMzMzAwIiwKKyAgICAgICIjRkY5OTMzMDAiLAorICAgICAgIiNGRjk5MzM2NiIsCisgICAgICAiI0ZGMzMzMzk5IiwKKyAgICAgICIjRkYzMzMzMzMiLCAvLyA2MworICAgIH07CisKKyAgICBpZiAoKDAgPD0gdGhlQ29sb3IuSW5kZXhlZCkgJiYgKHJnYkxvb2t1cC5MZW5ndGggPiB0aGVDb2xvci5JbmRleGVkKSkgeworICAgICAgLy8gY29sb3JpbmcgYnkgcHJlLXNldCBjb2xvciBjb2RlcworICAgICAgdHJhbnNsYXRlZFJnYiA9IHJnYkxvb2t1cFt0aGVDb2xvci5JbmRleGVkXTsKKyAgICB9IGVsc2UgaWYgKG51bGwgIT0gdGhlQ29sb3IuUmdiICYmIDAgPCB0aGVDb2xvci5SZ2IuTGVuZ3RoKSB7CisgICAgICAvLyBjb2xvcmluZyBieSBSR0IgdmFsdWUgKCJGRlJSR0dCQiIpCisgICAgICB0cmFuc2xhdGVkUmdiID0gIiMiICsgdGhlQ29sb3IuUmdiOworICAgIH0gZWxzZSB7CisgICAgICAvLyBjb2xvcmluZyBieSBzaGFkZXMgb2YgZ3JleSAoLTEgLT4gMCkKKyAgICAgIGlUaW50ID0gKChpbnQpKHRoZUNvbG9yLlRpbnQgKiAxNjApICsgMHg4MCk7CisgICAgICB0cmFuc2xhdGVkUmdiID0gKChpbnQpKGRlY2ltYWwuUm91bmQodGhlQ29sb3IuVGludCAqIC01MTIpKSkuVG9TdHJpbmcoIlgiKTsKKyAgICAgIHRyYW5zbGF0ZWRSZ2IgPSAiI0ZGIiArIHRyYW5zbGF0ZWRSZ2IgKyB0cmFuc2xhdGVkUmdiICsgdHJhbnNsYXRlZFJnYjsKKyAgICB9CisKKyAgICByZXR1cm4gdHJhbnNsYXRlZFJnYjsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0V4Y2VsRmlsbC5jcyBiL0VQUGx1cy9TdHlsZS9FeGNlbEZpbGwuY3MKaW5kZXggZjk1NzE1NC4uZDFhNWVhNiAxMDA2NDQKLS0tIGEvRVBQbHVzL1N0eWxlL0V4Y2VsRmlsbC5jcworKysgYi9FUFBsdXMvU3R5bGUvRXhjZWxGaWxsLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMjYgKzEzLDEyNyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhlIGJhY2tncm91bmQgZmlsbCBvZiBhIGNlbGwKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbEZpbGwgOiBTdHlsZUJhc2UKLSAgICB7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsRmlsbChFeGNlbFN0eWxlcyBzdHlsZXMsIE9mZmljZU9wZW5YbWwuWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgQ2hhbmdlZEV2ZW50LCBpbnQgUG9zaXRpb25JRCwgc3RyaW5nIGFkZHJlc3MsIGludCBpbmRleCkgOgotICAgICAgICAgICAgYmFzZShzdHlsZXMsIENoYW5nZWRFdmVudCwgUG9zaXRpb25JRCwgYWRkcmVzcykKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlOwogCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluZGV4ID0gaW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHBhdHRlcm4gZm9yIHNvbGlkIGZpbGxzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxGaWxsU3R5bGUgUGF0dGVyblR5cGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEluZGV4ID09IGludC5NaW5WYWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbEZpbGxTdHlsZS5Ob25lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5GaWxsc1tJbmRleF0uUGF0dGVyblR5cGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9ncmFkaWVudCAhPSBudWxsKSBfZ3JhZGllbnQgPSBudWxsOwotICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkZpbGwsIGVTdHlsZVByb3BlcnR5LlBhdHRlcm5UeXBlLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxDb2xvciBfcGF0dGVybkNvbG9yID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGNvbG9yIG9mIHRoZSBwYXR0ZXJuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENvbG9yIFBhdHRlcm5Db2xvcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3BhdHRlcm5Db2xvciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3BhdHRlcm5Db2xvciA9IG5ldyBFeGNlbENvbG9yKF9zdHlsZXMsIF9DaGFuZ2VkRXZlbnQsIF9wb3NpdGlvbklELCBfYWRkcmVzcywgZVN0eWxlQ2xhc3MuRmlsbFBhdHRlcm5Db2xvciwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfZ3JhZGllbnQgIT0gbnVsbCkgX2dyYWRpZW50ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9wYXR0ZXJuQ29sb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxDb2xvciBfYmFja2dyb3VuZENvbG9yID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGJhY2tncm91bmQgY29sb3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQ29sb3IgQmFja2dyb3VuZENvbG9yCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfYmFja2dyb3VuZENvbG9yID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfYmFja2dyb3VuZENvbG9yID0gbmV3IEV4Y2VsQ29sb3IoX3N0eWxlcywgX0NoYW5nZWRFdmVudCwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzLCBlU3R5bGVDbGFzcy5GaWxsQmFja2dyb3VuZENvbG9yLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKF9ncmFkaWVudCAhPSBudWxsKSBfZ3JhZGllbnQgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2JhY2tncm91bmRDb2xvcjsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbEdyYWRpZW50RmlsbCBfZ3JhZGllbnQ9bnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWNjZXNzIHRvIHByb3BlcnRpZXMgZm9yIGdyYWRpZW50IGZpbGwuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEdyYWRpZW50RmlsbCBHcmFkaWVudCAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9ncmFkaWVudCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBfZ3JhZGllbnQgPSBuZXcgRXhjZWxHcmFkaWVudEZpbGwoX3N0eWxlcywgX0NoYW5nZWRFdmVudCwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzLCBJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIF9iYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBfcGF0dGVybkNvbG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9ncmFkaWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9ncmFkaWVudCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhdHRlcm5UeXBlICsgUGF0dGVybkNvbG9yLklkICsgQmFja2dyb3VuZENvbG9yLklkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2dyYWRpZW50LklkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIFRoZSBiYWNrZ3JvdW5kIGZpbGwgb2YgYSBjZWxsCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsRmlsbCA6IFN0eWxlQmFzZSB7CisgIGludGVybmFsIEV4Y2VsRmlsbCgKKyAgICAgIEV4Y2VsU3R5bGVzIHN0eWxlcywKKyAgICAgIFhtbEhlbHBlci5DaGFuZ2VkRXZlbnRIYW5kbGVyIGNoYW5nZWRFdmVudCwKKyAgICAgIGludCBwb3NpdGlvbklkLAorICAgICAgc3RyaW5nIGFkZHJlc3MsCisgICAgICBpbnQgaW5kZXgpCisgICAgICA6IGJhc2Uoc3R5bGVzLCBjaGFuZ2VkRXZlbnQsIHBvc2l0aW9uSWQsIGFkZHJlc3MpIHsKKyAgICBJbmRleCA9IGluZGV4OworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIHBhdHRlcm4gZm9yIHNvbGlkIGZpbGxzLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxGaWxsU3R5bGUgUGF0dGVyblR5cGUgeworICAgIGdldCB7CisgICAgICBpZiAoSW5kZXggPT0gaW50Lk1pblZhbHVlKSB7CisgICAgICAgIHJldHVybiBFeGNlbEZpbGxTdHlsZS5Ob25lOworICAgICAgfQorICAgICAgcmV0dXJuIF9zdHlsZXMuRmlsbHNbSW5kZXhdLlBhdHRlcm5UeXBlOwogICAgIH0KKyAgICBzZXQgeworICAgICAgaWYgKF9ncmFkaWVudCAhPSBudWxsKSB7CisgICAgICAgIF9ncmFkaWVudCA9IG51bGw7CisgICAgICB9CisgICAgICBfQ2hhbmdlZEV2ZW50KAorICAgICAgICAgIHRoaXMsCisgICAgICAgICAgbmV3KGVTdHlsZUNsYXNzLkZpbGwsIGVTdHlsZVByb3BlcnR5LlBhdHRlcm5UeXBlLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBFeGNlbENvbG9yIF9wYXR0ZXJuQ29sb3I7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIGNvbG9yIG9mIHRoZSBwYXR0ZXJuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbENvbG9yIFBhdHRlcm5Db2xvciB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfcGF0dGVybkNvbG9yID09IG51bGwpIHsKKyAgICAgICAgX3BhdHRlcm5Db2xvciA9IG5ldygKKyAgICAgICAgICAgIF9zdHlsZXMsCisgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50LAorICAgICAgICAgICAgX3Bvc2l0aW9uSUQsCisgICAgICAgICAgICBfYWRkcmVzcywKKyAgICAgICAgICAgIGVTdHlsZUNsYXNzLkZpbGxQYXR0ZXJuQ29sb3IsCisgICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgaWYgKF9ncmFkaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgX2dyYWRpZW50ID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIF9wYXR0ZXJuQ29sb3I7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBFeGNlbENvbG9yIF9iYWNrZ3JvdW5kQ29sb3I7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIGJhY2tncm91bmQgY29sb3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsQ29sb3IgQmFja2dyb3VuZENvbG9yIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9iYWNrZ3JvdW5kQ29sb3IgPT0gbnVsbCkgeworICAgICAgICBfYmFja2dyb3VuZENvbG9yID0gbmV3KAorICAgICAgICAgICAgX3N0eWxlcywKKyAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQsCisgICAgICAgICAgICBfcG9zaXRpb25JRCwKKyAgICAgICAgICAgIF9hZGRyZXNzLAorICAgICAgICAgICAgZVN0eWxlQ2xhc3MuRmlsbEJhY2tncm91bmRDb2xvciwKKyAgICAgICAgICAgIHRoaXMpOworICAgICAgICBpZiAoX2dyYWRpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICBfZ3JhZGllbnQgPSBudWxsOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gX2JhY2tncm91bmRDb2xvcjsKKyAgICB9CisgIH0KKworICBwcml2YXRlIEV4Y2VsR3JhZGllbnRGaWxsIF9ncmFkaWVudDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBY2Nlc3MgdG8gcHJvcGVydGllcyBmb3IgZ3JhZGllbnQgZmlsbC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsR3JhZGllbnRGaWxsIEdyYWRpZW50IHsKKyAgICBnZXQgeworICAgICAgaWYgKF9ncmFkaWVudCA9PSBudWxsKSB7CisgICAgICAgIF9ncmFkaWVudCA9IG5ldyhfc3R5bGVzLCBfQ2hhbmdlZEV2ZW50LCBfcG9zaXRpb25JRCwgX2FkZHJlc3MsIEluZGV4KTsKKyAgICAgICAgX2JhY2tncm91bmRDb2xvciA9IG51bGw7CisgICAgICAgIF9wYXR0ZXJuQ29sb3IgPSBudWxsOworICAgICAgfQorICAgICAgcmV0dXJuIF9ncmFkaWVudDsKKyAgICB9CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQgeworICAgIGdldCB7CisgICAgICBpZiAoX2dyYWRpZW50ID09IG51bGwpIHsKKyAgICAgICAgcmV0dXJuIFBhdHRlcm5UeXBlICsgUGF0dGVybkNvbG9yLklkICsgQmFja2dyb3VuZENvbG9yLklkOworICAgICAgfQorICAgICAgcmV0dXJuIF9ncmFkaWVudC5JZDsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9FeGNlbEZvbnQuY3MgYi9FUFBsdXMvU3R5bGUvRXhjZWxGb250LmNzCmluZGV4IDQ3MDJkODMuLjM2YmViODMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9FeGNlbEZvbnQuY3MKKysrIGIvRVBQbHVzL1N0eWxlL0V4Y2VsRm9udC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMjIzICsxMywxODEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uRHJhd2luZzsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENlbGwgc3R5bGUgRm9udAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbEZvbnQgOiBTdHlsZUJhc2UKLSAgICB7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsRm9udChFeGNlbFN0eWxlcyBzdHlsZXMsIE9mZmljZU9wZW5YbWwuWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgQ2hhbmdlZEV2ZW50LCBpbnQgUG9zaXRpb25JRCwgc3RyaW5nIGFkZHJlc3MsIGludCBpbmRleCkgOgotICAgICAgICAgICAgYmFzZShzdHlsZXMsIENoYW5nZWRFdmVudCwgUG9zaXRpb25JRCwgYWRkcmVzcykKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlOwogCi0gICAgICAgIHsKLSAgICAgICAgICAgIEluZGV4ID0gaW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIG5hbWUgb2YgdGhlIGZvbnQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkZvbnRzW0luZGV4XS5OYW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuRm9udCwgZVN0eWxlUHJvcGVydHkuTmFtZSwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBTaXplIG9mIHRoZSBmb250Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBmbG9hdCBTaXplCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkZvbnRzW0luZGV4XS5TaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuRm9udCwgZVN0eWxlUHJvcGVydHkuU2l6ZSwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvbnQgZmFtaWx5Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgRmFtaWx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkZvbnRzW0luZGV4XS5GYW1pbHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Gb250LCBlU3R5bGVQcm9wZXJ0eS5GYW1pbHksIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDZWxsIGNvbG9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENvbG9yIENvbG9yCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxDb2xvcihfc3R5bGVzLCBfQ2hhbmdlZEV2ZW50LCBfcG9zaXRpb25JRCwgX2FkZHJlc3MsIGVTdHlsZUNsYXNzLkZvbnQsIHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNjaGVtZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIFNjaGVtZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Gb250c1tJbmRleF0uU2NoZW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuRm9udCwgZVN0eWxlUHJvcGVydHkuU2NoZW1lLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRm9udC1ib2xkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEJvbGQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuRm9udHNbSW5kZXhdLkJvbGQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Gb250LCBlU3R5bGVQcm9wZXJ0eS5Cb2xkLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRm9udC1pdGFsaWMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgSXRhbGljCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkZvbnRzW0luZGV4XS5JdGFsaWM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Gb250LCBlU3R5bGVQcm9wZXJ0eS5JdGFsaWMsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGb250LVN0cmlrZW91dAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTdHJpa2UKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuRm9udHNbSW5kZXhdLlN0cmlrZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkZvbnQsIGVTdHlsZVByb3BlcnR5LlN0cmlrZSwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvbnQtVW5kZXJsaW5lCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFVuZGVyTGluZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Gb250c1tJbmRleF0uVW5kZXJMaW5lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVW5kZXJMaW5lVHlwZSA9IEV4Y2VsVW5kZXJMaW5lVHlwZS5TaW5nbGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFVuZGVyTGluZVR5cGUgPSBFeGNlbFVuZGVyTGluZVR5cGUuTm9uZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy9fQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5Gb250LCBlU3R5bGVQcm9wZXJ0eS5VbmRlcmxpbmVUeXBlLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIEV4Y2VsVW5kZXJMaW5lVHlwZSBVbmRlckxpbmVUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkZvbnRzW0luZGV4XS5VbmRlckxpbmVUeXBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuRm9udCwgZVN0eWxlUHJvcGVydHkuVW5kZXJsaW5lVHlwZSwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvbnQtVmVydGljYWwgQWxpZ24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250IFZlcnRpY2FsQWxpZ24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9zdHlsZXMuRm9udHNbSW5kZXhdLlZlcnRpY2FsQWxpZ24gPT0gIiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQuTm9uZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udClFbnVtLlBhcnNlKHR5cGVvZihFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udCksIF9zdHlsZXMuRm9udHNbSW5kZXhdLlZlcnRpY2FsQWxpZ24sIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkZvbnQsIGVTdHlsZVByb3BlcnR5LlZlcnRpY2FsQWxpZ24sIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXQgdGhlIGZvbnQgZnJvbSBhIEZvbnQgb2JqZWN0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRm9udCI+PC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgU2V0RnJvbUZvbnQoRm9udCBGb250KQotICAgICAgICB7Ci0gICAgICAgICAgICBOYW1lID0gRm9udC5OYW1lOwotICAgICAgICAgICAgLy9GYW1pbHk9Zm50LkZvbnRGYW1pbHkuOwotICAgICAgICAgICAgU2l6ZSA9IChpbnQpRm9udC5TaXplOwotICAgICAgICAgICAgU3RyaWtlID0gRm9udC5TdHJpa2VvdXQ7Ci0gICAgICAgICAgICBCb2xkID0gRm9udC5Cb2xkOwotICAgICAgICAgICAgVW5kZXJMaW5lID0gRm9udC5VbmRlcmxpbmU7Ci0gICAgICAgICAgICBJdGFsaWMgPSBGb250Lkl0YWxpYzsKLSAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIENlbGwgc3R5bGUgRm9udAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxGb250IDogU3R5bGVCYXNlIHsKKyAgaW50ZXJuYWwgRXhjZWxGb250KAorICAgICAgRXhjZWxTdHlsZXMgc3R5bGVzLAorICAgICAgWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgY2hhbmdlZEV2ZW50LAorICAgICAgaW50IHBvc2l0aW9uSWQsCisgICAgICBzdHJpbmcgYWRkcmVzcywKKyAgICAgIGludCBpbmRleCkKKyAgICAgIDogYmFzZShzdHlsZXMsIGNoYW5nZWRFdmVudCwgcG9zaXRpb25JZCwgYWRkcmVzcykgeworICAgIEluZGV4ID0gaW5kZXg7CisgIH0KIAotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBOYW1lICsgU2l6ZS5Ub1N0cmluZygpICsgRmFtaWx5LlRvU3RyaW5nKCkgKyBTY2hlbWUuVG9TdHJpbmcoKSArIEJvbGQuVG9TdHJpbmcoKVswXSArIEl0YWxpYy5Ub1N0cmluZygpWzBdICsgU3RyaWtlLlRvU3RyaW5nKClbMF0gKyBVbmRlckxpbmUuVG9TdHJpbmcoKVswXSArIFZlcnRpY2FsQWxpZ247Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIG5hbWUgb2YgdGhlIGZvbnQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBOYW1lIHsKKyAgICBnZXQgPT4gX3N0eWxlcy5Gb250c1tJbmRleF0uTmFtZTsKKyAgICBzZXQgPT4KKyAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3KGVTdHlsZUNsYXNzLkZvbnQsIGVTdHlsZVByb3BlcnR5Lk5hbWUsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBTaXplIG9mIHRoZSBmb250CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBmbG9hdCBTaXplIHsKKyAgICBnZXQgPT4gX3N0eWxlcy5Gb250c1tJbmRleF0uU2l6ZTsKKyAgICBzZXQgPT4KKyAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3KGVTdHlsZUNsYXNzLkZvbnQsIGVTdHlsZVByb3BlcnR5LlNpemUsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEZvbnQgZmFtaWx5CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgRmFtaWx5IHsKKyAgICBnZXQgPT4gX3N0eWxlcy5Gb250c1tJbmRleF0uRmFtaWx5OworICAgIHNldCA9PgorICAgICAgX0NoYW5nZWRFdmVudCgKKyAgICAgICAgICB0aGlzLAorICAgICAgICAgIG5ldyhlU3R5bGVDbGFzcy5Gb250LCBlU3R5bGVQcm9wZXJ0eS5GYW1pbHksIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENlbGwgY29sb3IKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsQ29sb3IgQ29sb3IgPT4KKyAgICBuZXcoX3N0eWxlcywgX0NoYW5nZWRFdmVudCwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzLCBlU3R5bGVDbGFzcy5Gb250LCB0aGlzKTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTY2hlbWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBTY2hlbWUgeworICAgIGdldCA9PiBfc3R5bGVzLkZvbnRzW0luZGV4XS5TY2hlbWU7CisgICAgc2V0ID0+CisgICAgICBfQ2hhbmdlZEV2ZW50KAorICAgICAgICAgIHRoaXMsCisgICAgICAgICAgbmV3KGVTdHlsZUNsYXNzLkZvbnQsIGVTdHlsZVByb3BlcnR5LlNjaGVtZSwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRm9udC1ib2xkCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIEJvbGQgeworICAgIGdldCA9PiBfc3R5bGVzLkZvbnRzW0luZGV4XS5Cb2xkOworICAgIHNldCA9PgorICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcoZVN0eWxlQ2xhc3MuRm9udCwgZVN0eWxlUHJvcGVydHkuQm9sZCwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRm9udC1pdGFsaWMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgSXRhbGljIHsKKyAgICBnZXQgPT4gX3N0eWxlcy5Gb250c1tJbmRleF0uSXRhbGljOworICAgIHNldCA9PgorICAgICAgX0NoYW5nZWRFdmVudCgKKyAgICAgICAgICB0aGlzLAorICAgICAgICAgIG5ldyhlU3R5bGVDbGFzcy5Gb250LCBlU3R5bGVQcm9wZXJ0eS5JdGFsaWMsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEZvbnQtU3RyaWtlb3V0CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIFN0cmlrZSB7CisgICAgZ2V0ID0+IF9zdHlsZXMuRm9udHNbSW5kZXhdLlN0cmlrZTsKKyAgICBzZXQgPT4KKyAgICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgICAgdGhpcywKKyAgICAgICAgICBuZXcoZVN0eWxlQ2xhc3MuRm9udCwgZVN0eWxlUHJvcGVydHkuU3RyaWtlLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBGb250LVVuZGVybGluZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBVbmRlckxpbmUgeworICAgIGdldCA9PiBfc3R5bGVzLkZvbnRzW0luZGV4XS5VbmRlckxpbmU7CisgICAgc2V0IHsKKyAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICBVbmRlckxpbmVUeXBlID0gRXhjZWxVbmRlckxpbmVUeXBlLlNpbmdsZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFVuZGVyTGluZVR5cGUgPSBFeGNlbFVuZGVyTGluZVR5cGUuTm9uZTsKKyAgICAgIH0KKyAgICAgIC8vX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuRm9udCwgZVN0eWxlUHJvcGVydHkuVW5kZXJsaW5lVHlwZSwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwogICAgIH0KKyAgfQorCisgIHB1YmxpYyBFeGNlbFVuZGVyTGluZVR5cGUgVW5kZXJMaW5lVHlwZSB7CisgICAgZ2V0ID0+IF9zdHlsZXMuRm9udHNbSW5kZXhdLlVuZGVyTGluZVR5cGU7CisgICAgc2V0ID0+CisgICAgICBfQ2hhbmdlZEV2ZW50KAorICAgICAgICAgIHRoaXMsCisgICAgICAgICAgbmV3KGVTdHlsZUNsYXNzLkZvbnQsIGVTdHlsZVByb3BlcnR5LlVuZGVybGluZVR5cGUsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEZvbnQtVmVydGljYWwgQWxpZ24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250IFZlcnRpY2FsQWxpZ24geworICAgIGdldCB7CisgICAgICBpZiAoX3N0eWxlcy5Gb250c1tJbmRleF0uVmVydGljYWxBbGlnbiA9PSAiIikgeworICAgICAgICByZXR1cm4gRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQuTm9uZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAoRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQpCisgICAgICAgIEVudW0uUGFyc2UodHlwZW9mKEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250KSwgX3N0eWxlcy5Gb250c1tJbmRleF0uVmVydGljYWxBbGlnbiwgdHJ1ZSk7CisgICAgfQorICAgIHNldCA9PgorICAgICAgX0NoYW5nZWRFdmVudCgKKyAgICAgICAgICB0aGlzLAorICAgICAgICAgIG5ldyhlU3R5bGVDbGFzcy5Gb250LCBlU3R5bGVQcm9wZXJ0eS5WZXJ0aWNhbEFsaWduLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTZXQgdGhlIGZvbnQgZnJvbSBhIEZvbnQgb2JqZWN0CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iZm9udCI+PC9wYXJhbT4KKyAgcHVibGljIHZvaWQgU2V0RnJvbUZvbnQoRm9udCBmb250KSB7CisgICAgTmFtZSA9IGZvbnQuTmFtZTsKKyAgICAvL0ZhbWlseT1mbnQuRm9udEZhbWlseS47CisgICAgU2l6ZSA9IChpbnQpZm9udC5TaXplOworICAgIFN0cmlrZSA9IGZvbnQuU3RyaWtlb3V0OworICAgIEJvbGQgPSBmb250LkJvbGQ7CisgICAgVW5kZXJMaW5lID0gZm9udC5VbmRlcmxpbmU7CisgICAgSXRhbGljID0gZm9udC5JdGFsaWM7CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQgPT4KKyAgICBOYW1lCisgICAgICAgICsgU2l6ZQorICAgICAgICArIEZhbWlseQorICAgICAgICArIFNjaGVtZQorICAgICAgICArIEJvbGQuVG9TdHJpbmcoKVswXQorICAgICAgICArIEl0YWxpYy5Ub1N0cmluZygpWzBdCisgICAgICAgICsgU3RyaWtlLlRvU3RyaW5nKClbMF0KKyAgICAgICAgKyBVbmRlckxpbmUuVG9TdHJpbmcoKVswXQorICAgICAgICArIFZlcnRpY2FsQWxpZ247CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRXhjZWxHcmFkaWVudEZpbGwuY3MgYi9FUFBsdXMvU3R5bGUvRXhjZWxHcmFkaWVudEZpbGwuY3MKaW5kZXggMTYwNjMxNi4uMTZlNzNjOCAxMDA2NDQKLS0tIGEvRVBQbHVzL1N0eWxlL0V4Y2VsR3JhZGllbnRGaWxsLmNzCisrKyBiL0VQUGx1cy9TdHlsZS9FeGNlbEdyYWRpZW50RmlsbC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTc2ICsxMywxNzkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhlIGJhY2tncm91bmQgZmlsbCBvZiBhIGNlbGwKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbEdyYWRpZW50RmlsbCA6IFN0eWxlQmFzZQotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxHcmFkaWVudEZpbGwoRXhjZWxTdHlsZXMgc3R5bGVzLCBPZmZpY2VPcGVuWG1sLlhtbEhlbHBlci5DaGFuZ2VkRXZlbnRIYW5kbGVyIENoYW5nZWRFdmVudCwgaW50IFBvc2l0aW9uSUQsIHN0cmluZyBhZGRyZXNzLCBpbnQgaW5kZXgpIDoKLSAgICAgICAgICAgIGJhc2Uoc3R5bGVzLCBDaGFuZ2VkRXZlbnQsIFBvc2l0aW9uSUQsIGFkZHJlc3MpCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZTsKIAotICAgICAgICB7Ci0gICAgICAgICAgICBJbmRleCA9IGluZGV4OwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFuZ2xlIG9mIHRoZSBsaW5lYXIgZ3JhZGllbnQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZSBEZWdyZWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoRXhjZWxHcmFkaWVudEZpbGxYbWwpX3N0eWxlcy5GaWxsc1tJbmRleF0pLkRlZ3JlZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkdyYWRpZW50RmlsbCwgZVN0eWxlUHJvcGVydHkuR3JhZGllbnREZWdyZWUsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMaW5lYXIgb3IgUGF0aCBncmFkaWVudAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxGaWxsR3JhZGllbnRUeXBlIFR5cGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoRXhjZWxHcmFkaWVudEZpbGxYbWwpX3N0eWxlcy5GaWxsc1tJbmRleF0pLlR5cGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5HcmFkaWVudEZpbGwsIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50VHlwZSwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNwZWNpZmllcyBpbiBwZXJjZW50YWdlIGZvcm1hdChmcm9tIHRoZSB0b3AgdG8gdGhlIGJvdHRvbSkgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b3AgZWRnZSBvZiB0aGUgaW5uZXIgcmVjdGFuZ2xlIChjb2xvciAxKS4gRm9yIHRvcCwgMCBtZWFucyB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGlubmVyIHJlY3RhbmdsZSBpcyBvbiB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGNlbGwsIGFuZCAxIG1lYW5zIGl0IGlzIG9uIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgY2VsbC4gKGFwcGxpZXMgdG8gRnJvbSBDb3JuZXIgYW5kIEZyb20gQ2VudGVyIGdyYWRpZW50cykuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgVG9wCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoKEV4Y2VsR3JhZGllbnRGaWxsWG1sKV9zdHlsZXMuRmlsbHNbSW5kZXhdKS5Ub3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHwgdmFsdWUgPiAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5HcmFkaWVudEZpbGwsIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50VG9wLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIGluIHBlcmNlbnRhZ2UgZm9ybWF0IChmcm9tIHRoZSB0b3AgdG8gdGhlIGJvdHRvbSkgdGhlIHBvc2l0aW9uIG9mIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgaW5uZXIgcmVjdGFuZ2xlIChjb2xvciAxKS4gRm9yIGJvdHRvbSwgMCBtZWFucyB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGlubmVyIHJlY3RhbmdsZSBpcyBvbiB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGNlbGwsIGFuZCAxIG1lYW5zIGl0IGlzIG9uIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgY2VsbC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZSBCb3R0b20KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoRXhjZWxHcmFkaWVudEZpbGxYbWwpX3N0eWxlcy5GaWxsc1tJbmRleF0pLkJvdHRvbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfCB2YWx1ZSA+IDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiVmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLkdyYWRpZW50RmlsbCwgZVN0eWxlUHJvcGVydHkuR3JhZGllbnRCb3R0b20sIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgaW4gcGVyY2VudGFnZSBmb3JtYXQgKGZyb20gdGhlIGxlZnQgdG8gdGhlIHJpZ2h0KSB0aGUgcG9zaXRpb24gb2YgdGhlIGxlZnQgZWRnZSBvZiB0aGUgaW5uZXIgcmVjdGFuZ2xlIChjb2xvciAxKS4gRm9yIGxlZnQsIDAgbWVhbnMgdGhlIGxlZnQgZWRnZSBvZiB0aGUgaW5uZXIgcmVjdGFuZ2xlIGlzIG9uIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNlbGwsIGFuZCAxIG1lYW5zIGl0IGlzIG9uIHRoZSByaWdodCBlZGdlIG9mIHRoZSBjZWxsLiAoYXBwbGllcyB0byBGcm9tIENvcm5lciBhbmQgRnJvbSBDZW50ZXIgZ3JhZGllbnRzKS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZSBMZWZ0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoKEV4Y2VsR3JhZGllbnRGaWxsWG1sKV9zdHlsZXMuRmlsbHNbSW5kZXhdKS5MZWZ0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCB8IHZhbHVlID4gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJWYWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuR3JhZGllbnRGaWxsLCBlU3R5bGVQcm9wZXJ0eS5HcmFkaWVudExlZnQsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgaW4gcGVyY2VudGFnZSBmb3JtYXQgKGZyb20gdGhlIGxlZnQgdG8gdGhlIHJpZ2h0KSB0aGUgcG9zaXRpb24gb2YgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGlubmVyIHJlY3RhbmdsZSAoY29sb3IgMSkuIEZvciByaWdodCwgMCBtZWFucyB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgaW5uZXIgcmVjdGFuZ2xlIGlzIG9uIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNlbGwsIGFuZCAxIG1lYW5zIGl0IGlzIG9uIHRoZSByaWdodCBlZGdlIG9mIHRoZSBjZWxsLiAoYXBwbGllcyB0byBGcm9tIENvcm5lciBhbmQgRnJvbSBDZW50ZXIgZ3JhZGllbnRzKS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZSBSaWdodAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChFeGNlbEdyYWRpZW50RmlsbFhtbClfc3R5bGVzLkZpbGxzW0luZGV4XSkuUmlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwIHwgdmFsdWUgPiAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlZhbHVlIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5HcmFkaWVudEZpbGwsIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50UmlnaHQsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbENvbG9yIF9ncmFkaWVudENvbG9yMSA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdyYWRpZW50IENvbG9yIDEKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQ29sb3IgQ29sb3IxCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZ3JhZGllbnRDb2xvcjEgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9ncmFkaWVudENvbG9yMSA9IG5ldyBFeGNlbENvbG9yKF9zdHlsZXMsIF9DaGFuZ2VkRXZlbnQsIF9wb3NpdGlvbklELCBfYWRkcmVzcywgZVN0eWxlQ2xhc3MuRmlsbEdyYWRpZW50Q29sb3IxLCB0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9ncmFkaWVudENvbG9yMTsKKy8vLyA8c3VtbWFyeT4KKy8vLyBUaGUgYmFja2dyb3VuZCBmaWxsIG9mIGEgY2VsbAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbEdyYWRpZW50RmlsbCA6IFN0eWxlQmFzZSB7CisgIGludGVybmFsIEV4Y2VsR3JhZGllbnRGaWxsKAorICAgICAgRXhjZWxTdHlsZXMgc3R5bGVzLAorICAgICAgWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgY2hhbmdlZEV2ZW50LAorICAgICAgaW50IHBvc2l0aW9uSWQsCisgICAgICBzdHJpbmcgYWRkcmVzcywKKyAgICAgIGludCBpbmRleCkKKyAgICAgIDogYmFzZShzdHlsZXMsIGNoYW5nZWRFdmVudCwgcG9zaXRpb25JZCwgYWRkcmVzcykgeworICAgIEluZGV4ID0gaW5kZXg7CisgIH0KIAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsQ29sb3IgX2dyYWRpZW50Q29sb3IyID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR3JhZGllbnQgQ29sb3IgMgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxDb2xvciBDb2xvcjIKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9ncmFkaWVudENvbG9yMiA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2dyYWRpZW50Q29sb3IyID0gbmV3IEV4Y2VsQ29sb3IoX3N0eWxlcywgX0NoYW5nZWRFdmVudCwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzLCBlU3R5bGVDbGFzcy5GaWxsR3JhZGllbnRDb2xvcjIsIHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2dyYWRpZW50Q29sb3IyOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBbmdsZSBvZiB0aGUgbGluZWFyIGdyYWRpZW50CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBkb3VibGUgRGVncmVlIHsKKyAgICBnZXQgPT4gKChFeGNlbEdyYWRpZW50RmlsbFhtbClfc3R5bGVzLkZpbGxzW0luZGV4XSkuRGVncmVlOworICAgIHNldCA9PgorICAgICAgX0NoYW5nZWRFdmVudCgKKyAgICAgICAgICB0aGlzLAorICAgICAgICAgIG5ldygKKyAgICAgICAgICAgICAgZVN0eWxlQ2xhc3MuR3JhZGllbnRGaWxsLAorICAgICAgICAgICAgICBlU3R5bGVQcm9wZXJ0eS5HcmFkaWVudERlZ3JlZSwKKyAgICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICAgIF9wb3NpdGlvbklELAorICAgICAgICAgICAgICBfYWRkcmVzcykpOworICB9CiAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlZ3JlZS5Ub1N0cmluZygpICsgVHlwZSArIENvbG9yMS5JZCArIENvbG9yMi5JZCArIFRvcC5Ub1N0cmluZygpICsgQm90dG9tLlRvU3RyaW5nKCkgKyBMZWZ0LlRvU3RyaW5nKCkgKyBSaWdodC5Ub1N0cmluZygpOyB9Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTGluZWFyIG9yIFBhdGggZ3JhZGllbnQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsRmlsbEdyYWRpZW50VHlwZSBUeXBlIHsKKyAgICBnZXQgPT4gKChFeGNlbEdyYWRpZW50RmlsbFhtbClfc3R5bGVzLkZpbGxzW0luZGV4XSkuVHlwZTsKKyAgICBzZXQgPT4KKyAgICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgICAgdGhpcywKKyAgICAgICAgICBuZXcoZVN0eWxlQ2xhc3MuR3JhZGllbnRGaWxsLCBlU3R5bGVQcm9wZXJ0eS5HcmFkaWVudFR5cGUsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNwZWNpZmllcyBpbiBwZXJjZW50YWdlIGZvcm1hdChmcm9tIHRoZSB0b3AgdG8gdGhlIGJvdHRvbSkgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b3AgZWRnZSBvZiB0aGUgaW5uZXIgcmVjdGFuZ2xlIChjb2xvciAxKS4gRm9yIHRvcCwgMCBtZWFucyB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGlubmVyIHJlY3RhbmdsZSBpcyBvbiB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGNlbGwsIGFuZCAxIG1lYW5zIGl0IGlzIG9uIHRoZSBib3R0b20gZWRnZSBvZiB0aGUgY2VsbC4gKGFwcGxpZXMgdG8gRnJvbSBDb3JuZXIgYW5kIEZyb20gQ2VudGVyIGdyYWRpZW50cykuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBkb3VibGUgVG9wIHsKKyAgICBnZXQgPT4gKChFeGNlbEdyYWRpZW50RmlsbFhtbClfc3R5bGVzLkZpbGxzW0luZGV4XSkuVG9wOworICAgIHNldCB7CisgICAgICBpZiAodmFsdWUgPCAwIHwgdmFsdWUgPiAxKSB7CisgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJWYWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMSIpKTsKKyAgICAgIH0KKyAgICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgICAgdGhpcywKKyAgICAgICAgICBuZXcoZVN0eWxlQ2xhc3MuR3JhZGllbnRGaWxsLCBlU3R5bGVQcm9wZXJ0eS5HcmFkaWVudFRvcCwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwogICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNwZWNpZmllcyBpbiBwZXJjZW50YWdlIGZvcm1hdCAoZnJvbSB0aGUgdG9wIHRvIHRoZSBib3R0b20pIHRoZSBwb3NpdGlvbiBvZiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGlubmVyIHJlY3RhbmdsZSAoY29sb3IgMSkuIEZvciBib3R0b20sIDAgbWVhbnMgdGhlIGJvdHRvbSBlZGdlIG9mIHRoZSBpbm5lciByZWN0YW5nbGUgaXMgb24gdGhlIHRvcCBlZGdlIG9mIHRoZSBjZWxsLCBhbmQgMSBtZWFucyBpdCBpcyBvbiB0aGUgYm90dG9tIGVkZ2Ugb2YgdGhlIGNlbGwuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBkb3VibGUgQm90dG9tIHsKKyAgICBnZXQgPT4gKChFeGNlbEdyYWRpZW50RmlsbFhtbClfc3R5bGVzLkZpbGxzW0luZGV4XSkuQm90dG9tOworICAgIHNldCB7CisgICAgICBpZiAodmFsdWUgPCAwIHwgdmFsdWUgPiAxKSB7CisgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJWYWx1ZSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMSIpKTsKKyAgICAgIH0KKyAgICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgICAgdGhpcywKKyAgICAgICAgICBuZXcoCisgICAgICAgICAgICAgIGVTdHlsZUNsYXNzLkdyYWRpZW50RmlsbCwKKyAgICAgICAgICAgICAgZVN0eWxlUHJvcGVydHkuR3JhZGllbnRCb3R0b20sCisgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICBfcG9zaXRpb25JRCwKKyAgICAgICAgICAgICAgX2FkZHJlc3MpKTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTcGVjaWZpZXMgaW4gcGVyY2VudGFnZSBmb3JtYXQgKGZyb20gdGhlIGxlZnQgdG8gdGhlIHJpZ2h0KSB0aGUgcG9zaXRpb24gb2YgdGhlIGxlZnQgZWRnZSBvZiB0aGUgaW5uZXIgcmVjdGFuZ2xlIChjb2xvciAxKS4gRm9yIGxlZnQsIDAgbWVhbnMgdGhlIGxlZnQgZWRnZSBvZiB0aGUgaW5uZXIgcmVjdGFuZ2xlIGlzIG9uIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNlbGwsIGFuZCAxIG1lYW5zIGl0IGlzIG9uIHRoZSByaWdodCBlZGdlIG9mIHRoZSBjZWxsLiAoYXBwbGllcyB0byBGcm9tIENvcm5lciBhbmQgRnJvbSBDZW50ZXIgZ3JhZGllbnRzKS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGRvdWJsZSBMZWZ0IHsKKyAgICBnZXQgPT4gKChFeGNlbEdyYWRpZW50RmlsbFhtbClfc3R5bGVzLkZpbGxzW0luZGV4XSkuTGVmdDsKKyAgICBzZXQgeworICAgICAgaWYgKHZhbHVlIDwgMCB8IHZhbHVlID4gMSkgeworICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiVmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEiKSk7CisgICAgICB9CisgICAgICBfQ2hhbmdlZEV2ZW50KAorICAgICAgICAgIHRoaXMsCisgICAgICAgICAgbmV3KGVTdHlsZUNsYXNzLkdyYWRpZW50RmlsbCwgZVN0eWxlUHJvcGVydHkuR3JhZGllbnRMZWZ0LCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU3BlY2lmaWVzIGluIHBlcmNlbnRhZ2UgZm9ybWF0IChmcm9tIHRoZSBsZWZ0IHRvIHRoZSByaWdodCkgdGhlIHBvc2l0aW9uIG9mIHRoZSByaWdodCBlZGdlIG9mIHRoZSBpbm5lciByZWN0YW5nbGUgKGNvbG9yIDEpLiBGb3IgcmlnaHQsIDAgbWVhbnMgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGlubmVyIHJlY3RhbmdsZSBpcyBvbiB0aGUgbGVmdCBlZGdlIG9mIHRoZSBjZWxsLCBhbmQgMSBtZWFucyBpdCBpcyBvbiB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgY2VsbC4gKGFwcGxpZXMgdG8gRnJvbSBDb3JuZXIgYW5kIEZyb20gQ2VudGVyIGdyYWRpZW50cykuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBkb3VibGUgUmlnaHQgeworICAgIGdldCA9PiAoKEV4Y2VsR3JhZGllbnRGaWxsWG1sKV9zdHlsZXMuRmlsbHNbSW5kZXhdKS5SaWdodDsKKyAgICBzZXQgeworICAgICAgaWYgKHZhbHVlIDwgMCB8IHZhbHVlID4gMSkgeworICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiVmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEiKSk7CisgICAgICB9CisgICAgICBfQ2hhbmdlZEV2ZW50KAorICAgICAgICAgIHRoaXMsCisgICAgICAgICAgbmV3KAorICAgICAgICAgICAgICBlU3R5bGVDbGFzcy5HcmFkaWVudEZpbGwsCisgICAgICAgICAgICAgIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50UmlnaHQsCisgICAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgICBfcG9zaXRpb25JRCwKKyAgICAgICAgICAgICAgX2FkZHJlc3MpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIEV4Y2VsQ29sb3IgX2dyYWRpZW50Q29sb3IxOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdyYWRpZW50IENvbG9yIDEKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsQ29sb3IgQ29sb3IxIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9ncmFkaWVudENvbG9yMSA9PSBudWxsKSB7CisgICAgICAgIF9ncmFkaWVudENvbG9yMSA9IG5ldygKKyAgICAgICAgICAgIF9zdHlsZXMsCisgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50LAorICAgICAgICAgICAgX3Bvc2l0aW9uSUQsCisgICAgICAgICAgICBfYWRkcmVzcywKKyAgICAgICAgICAgIGVTdHlsZUNsYXNzLkZpbGxHcmFkaWVudENvbG9yMSwKKyAgICAgICAgICAgIHRoaXMpOworICAgICAgfQorICAgICAgcmV0dXJuIF9ncmFkaWVudENvbG9yMTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIEV4Y2VsQ29sb3IgX2dyYWRpZW50Q29sb3IyOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdyYWRpZW50IENvbG9yIDIKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsQ29sb3IgQ29sb3IyIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9ncmFkaWVudENvbG9yMiA9PSBudWxsKSB7CisgICAgICAgIF9ncmFkaWVudENvbG9yMiA9IG5ldygKKyAgICAgICAgICAgIF9zdHlsZXMsCisgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50LAorICAgICAgICAgICAgX3Bvc2l0aW9uSUQsCisgICAgICAgICAgICBfYWRkcmVzcywKKyAgICAgICAgICAgIGVTdHlsZUNsYXNzLkZpbGxHcmFkaWVudENvbG9yMiwKKyAgICAgICAgICAgIHRoaXMpOworICAgICAgfQorICAgICAgcmV0dXJuIF9ncmFkaWVudENvbG9yMjsKKyAgICB9CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQgPT4KKyAgICBEZWdyZWUuVG9TdHJpbmcoKSArIFR5cGUgKyBDb2xvcjEuSWQgKyBDb2xvcjIuSWQgKyBUb3AgKyBCb3R0b20gKyBMZWZ0ICsgUmlnaHQ7CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRXhjZWxOdW1iZXJGb3JtYXQuY3MgYi9FUFBsdXMvU3R5bGUvRXhjZWxOdW1iZXJGb3JtYXQuY3MKaW5kZXggY2QyZmQ0MC4uZDE4NDFkZiAxMDA2NDQKLS0tIGEvRVBQbHVzL1N0eWxlL0V4Y2VsTnVtYmVyRm9ybWF0LmNzCisrKyBiL0VQUGx1cy9TdHlsZS9FeGNlbE51bWJlckZvcm1hdC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMjE2ICsxMywyMDIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGUgbnVtYmVyZm9ybWF0IG9mIHRoZSBjZWxsCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsTnVtYmVyRm9ybWF0IDogU3R5bGVCYXNlCi0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbE51bWJlckZvcm1hdChFeGNlbFN0eWxlcyBzdHlsZXMsIE9mZmljZU9wZW5YbWwuWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgQ2hhbmdlZEV2ZW50LCBpbnQgUG9zaXRpb25JRCwgc3RyaW5nIEFkZHJlc3MsIGludCBpbmRleCkgOgotICAgICAgICAgICAgYmFzZShzdHlsZXMsIENoYW5nZWRFdmVudCwgUG9zaXRpb25JRCwgQWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgSW5kZXggPSBpbmRleDsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgbnVtZXJpYyBpbmRleCBmcm9yIHRoZSBmb3JtYXQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBOdW1GbXRJRCAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEluZGV4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9zZXQKLSAgICAgICAgICAgIC8vewotICAgICAgICAgICAgLy8gICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuTnVtYmVyZm9ybWF0LCAiTnVtRm10SUQiLCB2YWx1ZSwgX3dvcmtTaGVldElELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgLy99Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIG51bWJlcmZvcm1hdCAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBGb3JtYXQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpPTA7aTxfc3R5bGVzLk51bWJlckZvcm1hdHMuQ291bnQ7aSsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYoSW5kZXg9PV9zdHlsZXMuTnVtYmVyRm9ybWF0c1tpXS5OdW1GbXRJZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuTnVtYmVyRm9ybWF0c1tpXS5Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJnZW5lcmFsIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5OdW1iZXJmb3JtYXQsIGVTdHlsZVByb3BlcnR5LkZvcm1hdCwgKHN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSA/ICJHZW5lcmFsIiA6IHZhbHVlKSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlOwogCi0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZvcm1hdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgbnVtZXJpYyBmb3JtYXQgaXMgYSBidWlsZC1pbiBmcm9tLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBCdWlsZEluIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorLy8vIDxzdW1tYXJ5PgorLy8vIFRoZSBudW1iZXJmb3JtYXQgb2YgdGhlIGNlbGwKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsTnVtYmVyRm9ybWF0IDogU3R5bGVCYXNlIHsKKyAgaW50ZXJuYWwgRXhjZWxOdW1iZXJGb3JtYXQoCisgICAgICBFeGNlbFN0eWxlcyBzdHlsZXMsCisgICAgICBYbWxIZWxwZXIuQ2hhbmdlZEV2ZW50SGFuZGxlciBjaGFuZ2VkRXZlbnQsCisgICAgICBpbnQgcG9zaXRpb25JZCwKKyAgICAgIHN0cmluZyBhZGRyZXNzLAorICAgICAgaW50IGluZGV4KQorICAgICAgOiBiYXNlKHN0eWxlcywgY2hhbmdlZEV2ZW50LCBwb3NpdGlvbklkLCBhZGRyZXNzKSB7CisgICAgSW5kZXggPSBpbmRleDsKKyAgfQogCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgR2V0RnJvbUJ1aWxkSW5Gcm9tSUQoaW50IF9udW1GbXRJZCkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChfbnVtRm10SWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkdlbmVyYWwiOwotICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIwIjsKLSAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiMC4wMCI7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiMsIyMwIjsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIywjIzAuMDAiOwotICAgICAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIwJSI7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIwLjAwJSI7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIwLjAwRSswMCI7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIjID8vPyI7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIjID8/Lz8/IjsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm1tLWRkLXl5IjsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImQtbW1tLXl5IjsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImQtbW1tIjsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm1tbS15eSI7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJoOm1tIEFNL1BNIjsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImg6bW06c3MgQU0vUE0iOwotICAgICAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiaDptbSI7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJoOm1tOnNzIjsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm0vZC95eSBoOm1tIjsKLSAgICAgICAgICAgICAgICBjYXNlIDM3OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiMsIyMwIDsoIywjIzApIjsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiMsIyMwIDtbUmVkXSgjLCMjMCkiOwotICAgICAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiIywjIzAuMDA7KCMsIyMwLjAwKSI7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIjLCMjMC4wMDtbUmVkXSgjLCMjMC4wMCkiOwotICAgICAgICAgICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAibW06c3MiOwotICAgICAgICAgICAgICAgIGNhc2UgNDY6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAiW2hdOm1tOnNzIjsKLSAgICAgICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm1tc3MuMCI7Ci0gICAgICAgICAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIjIzAuMCI7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJAIjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgbnVtZXJpYyBpbmRleCBmcm9yIHRoZSBmb3JtYXQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBOdW1GbXRJRCA9PiBJbmRleDsKKworICAvL3NldAorICAvL3sKKyAgLy8gICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuTnVtYmVyZm9ybWF0LCAiTnVtRm10SUQiLCB2YWx1ZSwgX3dvcmtTaGVldElELCBfYWRkcmVzcykpOworICAvL30KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIG51bWJlcmZvcm1hdAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIEZvcm1hdCB7CisgICAgZ2V0IHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX3N0eWxlcy5OdW1iZXJGb3JtYXRzLkNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKEluZGV4ID09IF9zdHlsZXMuTnVtYmVyRm9ybWF0c1tpXS5OdW1GbXRJZCkgeworICAgICAgICAgIHJldHVybiBfc3R5bGVzLk51bWJlckZvcm1hdHNbaV0uRm9ybWF0OwogICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBpbnQgR2V0RnJvbUJ1aWxkSWRGcm9tRm9ybWF0KHN0cmluZyBmb3JtYXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgIkdlbmVyYWwiOgotICAgICAgICAgICAgICAgIGNhc2UgIiI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIGNhc2UgIjAiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgICAgICBjYXNlICIwLjAwIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICAgICAgY2FzZSAiIywjIzAiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgICAgICAgICBjYXNlICIjLCMjMC4wMCI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiA0OwotICAgICAgICAgICAgICAgIGNhc2UgIjAlIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDk7Ci0gICAgICAgICAgICAgICAgY2FzZSAiMC4wMCUiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTA7Ci0gICAgICAgICAgICAgICAgY2FzZSAiMC4wMEUrMDAiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTE7Ci0gICAgICAgICAgICAgICAgY2FzZSAiIyA/Lz8iOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTI7Ci0gICAgICAgICAgICAgICAgY2FzZSAiIyA/Py8/PyI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxMzsKLSAgICAgICAgICAgICAgICBjYXNlICJtbS1kZC15eSI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxNDsKLSAgICAgICAgICAgICAgICBjYXNlICJkLW1tbS15eSI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxNTsKLSAgICAgICAgICAgICAgICBjYXNlICJkLW1tbSI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxNjsKLSAgICAgICAgICAgICAgICBjYXNlICJtbW0teXkiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTc7Ci0gICAgICAgICAgICAgICAgY2FzZSAiaDptbSBBTS9QTSI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxODsKLSAgICAgICAgICAgICAgICBjYXNlICJoOm1tOnNzIEFNL1BNIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE5OwotICAgICAgICAgICAgICAgIGNhc2UgImg6bW0iOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMjA7Ci0gICAgICAgICAgICAgICAgY2FzZSAiaDptbTpzcyI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAyMTsKLSAgICAgICAgICAgICAgICBjYXNlICJtL2QveXkgaDptbSI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAyMjsKLSAgICAgICAgICAgICAgICBjYXNlICIjLCMjMCA7KCMsIyMwKSI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAzNzsKLSAgICAgICAgICAgICAgICBjYXNlICIjLCMjMCA7W1JlZF0oIywjIzApIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM4OwotICAgICAgICAgICAgICAgIGNhc2UgIiMsIyMwLjAwOygjLCMjMC4wMCkiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzk7Ci0gICAgICAgICAgICAgICAgY2FzZSAiIywjIzAuMDA7W1JlZF0oIywjIzAuMDApIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQwOwotICAgICAgICAgICAgICAgIGNhc2UgIm1tOnNzIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ1OwotICAgICAgICAgICAgICAgIGNhc2UgIltoXTptbTpzcyI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiA0NjsKLSAgICAgICAgICAgICAgICBjYXNlICJtbXNzLjAiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDc7Ci0gICAgICAgICAgICAgICAgY2FzZSAiIyMwLjAiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDg7Ci0gICAgICAgICAgICAgICAgY2FzZSAiQCI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiA0OTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50Lk1pblZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gImdlbmVyYWwiOwogICAgIH0KKyAgICBzZXQgPT4KKyAgICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgICAgdGhpcywKKyAgICAgICAgICBuZXcoCisgICAgICAgICAgICAgIGVTdHlsZUNsYXNzLk51bWJlcmZvcm1hdCwKKyAgICAgICAgICAgICAgZVN0eWxlUHJvcGVydHkuRm9ybWF0LAorICAgICAgICAgICAgICAoc3RyaW5nLklzTnVsbE9yRW1wdHkodmFsdWUpID8gIkdlbmVyYWwiIDogdmFsdWUpLAorICAgICAgICAgICAgICBfcG9zaXRpb25JRCwKKyAgICAgICAgICAgICAgX2FkZHJlc3MpKTsKKyAgfQorCisgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZCA9PiBGb3JtYXQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhlIG51bWVyaWMgZm9ybWF0IGlzIGEgYnVpbGQtaW4gZnJvbS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQnVpbGRJbiB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldEZyb21CdWlsZEluRnJvbUlkKGludCBudW1GbXRJZCkgeworICAgIHN3aXRjaCAobnVtRm10SWQpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgcmV0dXJuICJHZW5lcmFsIjsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgcmV0dXJuICIwIjsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgcmV0dXJuICIwLjAwIjsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgcmV0dXJuICIjLCMjMCI7CisgICAgICBjYXNlIDQ6CisgICAgICAgIHJldHVybiAiIywjIzAuMDAiOworICAgICAgY2FzZSA5OgorICAgICAgICByZXR1cm4gIjAlIjsKKyAgICAgIGNhc2UgMTA6CisgICAgICAgIHJldHVybiAiMC4wMCUiOworICAgICAgY2FzZSAxMToKKyAgICAgICAgcmV0dXJuICIwLjAwRSswMCI7CisgICAgICBjYXNlIDEyOgorICAgICAgICByZXR1cm4gIiMgPy8/IjsKKyAgICAgIGNhc2UgMTM6CisgICAgICAgIHJldHVybiAiIyA/Py8/PyI7CisgICAgICBjYXNlIDE0OgorICAgICAgICByZXR1cm4gIm1tLWRkLXl5IjsKKyAgICAgIGNhc2UgMTU6CisgICAgICAgIHJldHVybiAiZC1tbW0teXkiOworICAgICAgY2FzZSAxNjoKKyAgICAgICAgcmV0dXJuICJkLW1tbSI7CisgICAgICBjYXNlIDE3OgorICAgICAgICByZXR1cm4gIm1tbS15eSI7CisgICAgICBjYXNlIDE4OgorICAgICAgICByZXR1cm4gImg6bW0gQU0vUE0iOworICAgICAgY2FzZSAxOToKKyAgICAgICAgcmV0dXJuICJoOm1tOnNzIEFNL1BNIjsKKyAgICAgIGNhc2UgMjA6CisgICAgICAgIHJldHVybiAiaDptbSI7CisgICAgICBjYXNlIDIxOgorICAgICAgICByZXR1cm4gImg6bW06c3MiOworICAgICAgY2FzZSAyMjoKKyAgICAgICAgcmV0dXJuICJtL2QveXkgaDptbSI7CisgICAgICBjYXNlIDM3OgorICAgICAgICByZXR1cm4gIiMsIyMwIDsoIywjIzApIjsKKyAgICAgIGNhc2UgMzg6CisgICAgICAgIHJldHVybiAiIywjIzAgO1tSZWRdKCMsIyMwKSI7CisgICAgICBjYXNlIDM5OgorICAgICAgICByZXR1cm4gIiMsIyMwLjAwOygjLCMjMC4wMCkiOworICAgICAgY2FzZSA0MDoKKyAgICAgICAgcmV0dXJuICIjLCMjMC4wMDtbUmVkXSgjLCMjMC4wMCkiOworICAgICAgY2FzZSA0NToKKyAgICAgICAgcmV0dXJuICJtbTpzcyI7CisgICAgICBjYXNlIDQ2OgorICAgICAgICByZXR1cm4gIltoXTptbTpzcyI7CisgICAgICBjYXNlIDQ3OgorICAgICAgICByZXR1cm4gIm1tc3MuMCI7CisgICAgICBjYXNlIDQ4OgorICAgICAgICByZXR1cm4gIiMjMC4wIjsKKyAgICAgIGNhc2UgNDk6CisgICAgICAgIHJldHVybiAiQCI7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gc3RyaW5nLkVtcHR5OworICAgIH0KKyAgfQorCisgIGludGVybmFsIHN0YXRpYyBpbnQgR2V0RnJvbUJ1aWxkSWRGcm9tRm9ybWF0KHN0cmluZyBmb3JtYXQpIHsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgY2FzZSAiR2VuZXJhbCI6CisgICAgICBjYXNlICIiOgorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGNhc2UgIjAiOgorICAgICAgICByZXR1cm4gMTsKKyAgICAgIGNhc2UgIjAuMDAiOgorICAgICAgICByZXR1cm4gMjsKKyAgICAgIGNhc2UgIiMsIyMwIjoKKyAgICAgICAgcmV0dXJuIDM7CisgICAgICBjYXNlICIjLCMjMC4wMCI6CisgICAgICAgIHJldHVybiA0OworICAgICAgY2FzZSAiMCUiOgorICAgICAgICByZXR1cm4gOTsKKyAgICAgIGNhc2UgIjAuMDAlIjoKKyAgICAgICAgcmV0dXJuIDEwOworICAgICAgY2FzZSAiMC4wMEUrMDAiOgorICAgICAgICByZXR1cm4gMTE7CisgICAgICBjYXNlICIjID8vPyI6CisgICAgICAgIHJldHVybiAxMjsKKyAgICAgIGNhc2UgIiMgPz8vPz8iOgorICAgICAgICByZXR1cm4gMTM7CisgICAgICBjYXNlICJtbS1kZC15eSI6CisgICAgICAgIHJldHVybiAxNDsKKyAgICAgIGNhc2UgImQtbW1tLXl5IjoKKyAgICAgICAgcmV0dXJuIDE1OworICAgICAgY2FzZSAiZC1tbW0iOgorICAgICAgICByZXR1cm4gMTY7CisgICAgICBjYXNlICJtbW0teXkiOgorICAgICAgICByZXR1cm4gMTc7CisgICAgICBjYXNlICJoOm1tIEFNL1BNIjoKKyAgICAgICAgcmV0dXJuIDE4OworICAgICAgY2FzZSAiaDptbTpzcyBBTS9QTSI6CisgICAgICAgIHJldHVybiAxOTsKKyAgICAgIGNhc2UgImg6bW0iOgorICAgICAgICByZXR1cm4gMjA7CisgICAgICBjYXNlICJoOm1tOnNzIjoKKyAgICAgICAgcmV0dXJuIDIxOworICAgICAgY2FzZSAibS9kL3l5IGg6bW0iOgorICAgICAgICByZXR1cm4gMjI7CisgICAgICBjYXNlICIjLCMjMCA7KCMsIyMwKSI6CisgICAgICAgIHJldHVybiAzNzsKKyAgICAgIGNhc2UgIiMsIyMwIDtbUmVkXSgjLCMjMCkiOgorICAgICAgICByZXR1cm4gMzg7CisgICAgICBjYXNlICIjLCMjMC4wMDsoIywjIzAuMDApIjoKKyAgICAgICAgcmV0dXJuIDM5OworICAgICAgY2FzZSAiIywjIzAuMDA7W1JlZF0oIywjIzAuMDApIjoKKyAgICAgICAgcmV0dXJuIDQwOworICAgICAgY2FzZSAibW06c3MiOgorICAgICAgICByZXR1cm4gNDU7CisgICAgICBjYXNlICJbaF06bW06c3MiOgorICAgICAgICByZXR1cm4gNDY7CisgICAgICBjYXNlICJtbXNzLjAiOgorICAgICAgICByZXR1cm4gNDc7CisgICAgICBjYXNlICIjIzAuMCI6CisgICAgICAgIHJldHVybiA0ODsKKyAgICAgIGNhc2UgIkAiOgorICAgICAgICByZXR1cm4gNDk7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gaW50Lk1pblZhbHVlOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0V4Y2VsUGFyYWdyYXBoLmNzIGIvRVBQbHVzL1N0eWxlL0V4Y2VsUGFyYWdyYXBoLmNzCmluZGV4IGVmNzQ1YWYuLmE3NThhODMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9FeGNlbFBhcmFncmFwaC5jcworKysgYi9FUFBsdXMvU3R5bGUvRXhjZWxQYXJhZ3JhcGguY3MKQEAgLTEzLDU1ICsxMyw0OCBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7CisKIHVzaW5nIFN5c3RlbS5YbWw7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBIYW5kZWxzIHBhcmFncmFwaCB0ZXh0Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsUGFyYWdyYXBoIDogRXhjZWxUZXh0Rm9udAotICAgIHsKLSAgICAgICAgcHVibGljIEV4Y2VsUGFyYWdyYXBoKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgcm9vdE5vZGUsIHN0cmluZyBwYXRoLCBzdHJpbmdbXSBzY2hlbWFOb2RlT3JkZXIpIDogCi0gICAgICAgICAgICBiYXNlKG5zLCByb290Tm9kZSwgcGF0aCArICJhOnJQciIsIHNjaGVtYU5vZGVPcmRlcikKLSAgICAgICAgeyAKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlOwogCi0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIFRleHRQYXRoID0gIi4uL2E6dCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRleHQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBUZXh0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKFRleHRQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZVRvcE5vZGUoKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRleHRQYXRoLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9CisvLy8gPHN1bW1hcnk+CisvLy8gSGFuZGVscyBwYXJhZ3JhcGggdGV4dAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxQYXJhZ3JhcGggOiBFeGNlbFRleHRGb250IHsKKyAgcHVibGljIEV4Y2VsUGFyYWdyYXBoKAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBucywKKyAgICAgIFhtbE5vZGUgcm9vdE5vZGUsCisgICAgICBzdHJpbmcgcGF0aCwKKyAgICAgIHN0cmluZ1tdIHNjaGVtYU5vZGVPcmRlcikKKyAgICAgIDogYmFzZShucywgcm9vdE5vZGUsIHBhdGggKyAiYTpyUHIiLCBzY2hlbWFOb2RlT3JkZXIpIHt9CiAKLSAgICAgICAgfQorICBwcml2YXRlIGNvbnN0IHN0cmluZyBfdGV4dFBhdGggPSAiLi4vYTp0IjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUZXh0CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgVGV4dCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVTdHJpbmcoX3RleHRQYXRoKTsKKyAgICBzZXQgeworICAgICAgQ3JlYXRlVG9wTm9kZSgpOworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfdGV4dFBhdGgsIHZhbHVlKTsKICAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9FeGNlbFBhcmFncmFwaENvbGxlY3Rpb24uY3MgYi9FUFBsdXMvU3R5bGUvRXhjZWxQYXJhZ3JhcGhDb2xsZWN0aW9uLmNzCmluZGV4IDcwNDkxNjIuLjhjOTY3MjQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9FeGNlbFBhcmFncmFwaENvbGxlY3Rpb24uY3MKKysrIGIvRVBQbHVzL1N0eWxlL0V4Y2VsUGFyYWdyYXBoQ29sbGVjdGlvbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTY1ICsxMywxMzMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5EcmF3aW5nOwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIGNvbGxlY3Rpb24gb2YgUGFyYWdyYXBoIG9iamVjdHMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFBhcmFncmFwaENvbGxlY3Rpb24gOiBYbWxIZWxwZXIsIElFbnVtZXJhYmxlPEV4Y2VsUGFyYWdyYXBoPgotICAgIHsKLSAgICAgICAgTGlzdDxFeGNlbFBhcmFncmFwaD4gX2xpc3QgPSBuZXcgTGlzdDxFeGNlbFBhcmFncmFwaD4oKTsKLSAgICAgICAgc3RyaW5nIF9wYXRoOwotICAgICAgICBpbnRlcm5hbCBFeGNlbFBhcmFncmFwaENvbGxlY3Rpb24oWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLCBzdHJpbmcgcGF0aCwgc3RyaW5nW10gc2NoZW1hTm9kZU9yZGVyKSA6Ci0gICAgICAgICAgICBiYXNlKG5zLCB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbmwgPSB0b3BOb2RlLlNlbGVjdE5vZGVzKHBhdGggKyAiL2E6ciIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gc2NoZW1hTm9kZU9yZGVyOwotICAgICAgICAgICAgaWYgKG5sICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBuIGluIG5sKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2xpc3QuQWRkKG5ldyBFeGNlbFBhcmFncmFwaChucywgbiwgIiIsc2NoZW1hTm9kZU9yZGVyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX3BhdGggPSBwYXRoOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBFeGNlbFBhcmFncmFwaCB0aGlzW2ludCBJbmRleF0KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9saXN0W0luZGV4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgaW50IENvdW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfbGlzdC5Db3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGQgYSByaWNoIHRleHQgc3RyaW5nCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iVGV4dCI+VGhlIHRleHQgdG8gYWRkPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIEV4Y2VsUGFyYWdyYXBoIEFkZChzdHJpbmcgVGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sRG9jdW1lbnQgZG9jOwotICAgICAgICAgICAgaWYgKFRvcE5vZGUgaXMgWG1sRG9jdW1lbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG9jID0gVG9wTm9kZSBhcyBYbWxEb2N1bWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkb2MgPSBUb3BOb2RlLk93bmVyRG9jdW1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBYbWxOb2RlIHBhcmVudE5vZGU9VG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9wYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnROb2RlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfcGF0aCk7Ci0gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfcGF0aCwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHZhciBub2RlID0gZG9jLkNyZWF0ZUVsZW1lbnQoImEiLCAiciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFEcmF3aW5ncyk7Ci0gICAgICAgICAgICBwYXJlbnROb2RlLkFwcGVuZENoaWxkKG5vZGUpOwotICAgICAgICAgICAgdmFyIGNoaWxkTm9kZSA9IGRvYy5DcmVhdGVFbGVtZW50KCJhIiwgInJQciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFEcmF3aW5ncyk7Ci0gICAgICAgICAgICBub2RlLkFwcGVuZENoaWxkKGNoaWxkTm9kZSk7Ci0gICAgICAgICAgICB2YXIgcnQgPSBuZXcgRXhjZWxQYXJhZ3JhcGgoTmFtZVNwYWNlTWFuYWdlciwgbm9kZSwgIiIsIFNjaGVtYU5vZGVPcmRlcik7Ci0gICAgICAgICAgICBydC5Db21wbGV4Rm9udCA9ICJDYWxpYnJpIjsKLSAgICAgICAgICAgIHJ0LkxhdGluRm9udCA9ICJDYWxpYnJpIjsgCi0gICAgICAgICAgICBydC5TaXplID0gMTE7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZTsKIAotICAgICAgICAgICAgcnQuVGV4dCA9IFRleHQ7Ci0gICAgICAgICAgICBfbGlzdC5BZGQocnQpOwotICAgICAgICAgICAgcmV0dXJuIHJ0OwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2xpc3QuQ2xlYXIoKTsKLSAgICAgICAgICAgIFRvcE5vZGUuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgUmVtb3ZlQXQoaW50IEluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbm9kZSA9IF9saXN0W0luZGV4XS5Ub3BOb2RlOwotICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBub2RlLk5hbWUgIT0gImE6ciIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuUGFyZW50Tm9kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChub2RlKTsKLSAgICAgICAgICAgIF9saXN0LlJlbW92ZUF0KEluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoRXhjZWxSaWNoVGV4dCBJdGVtKQotICAgICAgICB7Ci0gICAgICAgICAgICBUb3BOb2RlLlJlbW92ZUNoaWxkKEl0ZW0uVG9wTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHN0cmluZyBUZXh0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIF9saXN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGl0ZW0uVGV4dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKENvdW50ID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBZGQodmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aGlzWzBdLlRleHQgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGl4ID0gQ291bnQtMTsgaXggPiAwOyBpeC0tKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmVBdChpeCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI3JlZ2lvbiBJRW51bWVyYWJsZTxFeGNlbFJpY2hUZXh0PiBNZW1iZXJzCisvLy8gPHN1bW1hcnk+CisvLy8gQSBjb2xsZWN0aW9uIG9mIFBhcmFncmFwaCBvYmplY3RzCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsUGFyYWdyYXBoQ29sbGVjdGlvbiA6IFhtbEhlbHBlciwgSUVudW1lcmFibGU8RXhjZWxQYXJhZ3JhcGg+IHsKKyAgcHJpdmF0ZSBMaXN0PEV4Y2VsUGFyYWdyYXBoPiBfbGlzdCA9IG5ldygpOworICBwcml2YXRlIHN0cmluZyBfcGF0aDsKIAotICAgICAgICBJRW51bWVyYXRvcjxFeGNlbFBhcmFncmFwaD4gSUVudW1lcmFibGU8RXhjZWxQYXJhZ3JhcGg+LkdldEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gSUVudW1lcmFibGUgTWVtYmVycwotCi0gICAgICAgIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYXRvciBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfbGlzdC5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAjZW5kcmVnaW9uCisgIGludGVybmFsIEV4Y2VsUGFyYWdyYXBoQ29sbGVjdGlvbigKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsCisgICAgICBYbWxOb2RlIHRvcE5vZGUsCisgICAgICBzdHJpbmcgcGF0aCwKKyAgICAgIHN0cmluZ1tdIHNjaGVtYU5vZGVPcmRlcikKKyAgICAgIDogYmFzZShucywgdG9wTm9kZSkgeworICAgIHZhciBubCA9IHRvcE5vZGUuU2VsZWN0Tm9kZXMocGF0aCArICIvYTpyIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgU2NoZW1hTm9kZU9yZGVyID0gc2NoZW1hTm9kZU9yZGVyOworICAgIGlmIChubCAhPSBudWxsKSB7CisgICAgICBmb3JlYWNoIChYbWxOb2RlIG4gaW4gbmwpIHsKKyAgICAgICAgX2xpc3QuQWRkKG5ldyhucywgbiwgIiIsIHNjaGVtYU5vZGVPcmRlcikpOworICAgICAgfQogICAgIH0KKyAgICBfcGF0aCA9IHBhdGg7CisgIH0KKworICBwdWJsaWMgRXhjZWxQYXJhZ3JhcGggdGhpc1tpbnQgaW5kZXhdID0+IF9saXN0W2luZGV4XTsKKworICBwdWJsaWMgaW50IENvdW50ID0+IF9saXN0LkNvdW50OworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBhIHJpY2ggdGV4dCBzdHJpbmcKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0ZXh0Ij5UaGUgdGV4dCB0byBhZGQ8L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxQYXJhZ3JhcGggQWRkKHN0cmluZyB0ZXh0KSB7CisgICAgWG1sRG9jdW1lbnQgZG9jOworICAgIGlmIChUb3BOb2RlIGlzIFhtbERvY3VtZW50KSB7CisgICAgICBkb2MgPSBUb3BOb2RlIGFzIFhtbERvY3VtZW50OworICAgIH0gZWxzZSB7CisgICAgICBkb2MgPSBUb3BOb2RlLk93bmVyRG9jdW1lbnQ7CisgICAgfQorICAgIFhtbE5vZGUgcGFyZW50Tm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfcGF0aCwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgeworICAgICAgQ3JlYXRlTm9kZShfcGF0aCk7CisgICAgICBwYXJlbnROb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9wYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICB9CisKKyAgICB2YXIgbm9kZSA9IGRvYy5DcmVhdGVFbGVtZW50KCJhIiwgInIiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYURyYXdpbmdzKTsKKyAgICBwYXJlbnROb2RlLkFwcGVuZENoaWxkKG5vZGUpOworICAgIHZhciBjaGlsZE5vZGUgPSBkb2MuQ3JlYXRlRWxlbWVudCgiYSIsICJyUHIiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYURyYXdpbmdzKTsKKyAgICBub2RlLkFwcGVuZENoaWxkKGNoaWxkTm9kZSk7CisgICAgdmFyIHJ0ID0gbmV3IEV4Y2VsUGFyYWdyYXBoKE5hbWVTcGFjZU1hbmFnZXIsIG5vZGUsICIiLCBTY2hlbWFOb2RlT3JkZXIpOworICAgIHJ0LkNvbXBsZXhGb250ID0gIkNhbGlicmkiOworICAgIHJ0LkxhdGluRm9udCA9ICJDYWxpYnJpIjsKKyAgICBydC5TaXplID0gMTE7CisKKyAgICBydC5UZXh0ID0gdGV4dDsKKyAgICBfbGlzdC5BZGQocnQpOworICAgIHJldHVybiBydDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIENsZWFyKCkgeworICAgIF9saXN0LkNsZWFyKCk7CisgICAgVG9wTm9kZS5SZW1vdmVBbGwoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIFJlbW92ZUF0KGludCBpbmRleCkgeworICAgIHZhciBub2RlID0gX2xpc3RbaW5kZXhdLlRvcE5vZGU7CisgICAgd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBub2RlLk5hbWUgIT0gImE6ciIpIHsKKyAgICAgIG5vZGUgPSBub2RlLlBhcmVudE5vZGU7CisgICAgfQorICAgIG5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChub2RlKTsKKyAgICBfbGlzdC5SZW1vdmVBdChpbmRleCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBSZW1vdmUoRXhjZWxSaWNoVGV4dCBpdGVtKSB7CisgICAgVG9wTm9kZS5SZW1vdmVDaGlsZChpdGVtLlRvcE5vZGUpOworICB9CisKKyAgcHVibGljIHN0cmluZyBUZXh0IHsKKyAgICBnZXQgeworICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiBfbGlzdCkgeworICAgICAgICBzYi5BcHBlbmQoaXRlbS5UZXh0KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICAgIH0KKyAgICBzZXQgeworICAgICAgaWYgKENvdW50ID09IDApIHsKKyAgICAgICAgQWRkKHZhbHVlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHRoaXNbMF0uVGV4dCA9IHZhbHVlOworICAgICAgICBpbnQgY291bnQgPSBDb3VudDsKKyAgICAgICAgZm9yIChpbnQgaXggPSBDb3VudCAtIDE7IGl4ID4gMDsgaXgtLSkgeworICAgICAgICAgIFJlbW92ZUF0KGl4KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIElFbnVtZXJhdG9yPEV4Y2VsUGFyYWdyYXBoPiBJRW51bWVyYWJsZTxFeGNlbFBhcmFncmFwaD4uR2V0RW51bWVyYXRvcigpIHsKKyAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOworICB9CisKKyAgSUVudW1lcmF0b3IgSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpIHsKKyAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRXhjZWxSaWNoVGV4dC5jcyBiL0VQUGx1cy9TdHlsZS9FeGNlbFJpY2hUZXh0LmNzCmluZGV4IGJjNzRmYTYuLjIyMDc2NTYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9FeGNlbFJpY2hUZXh0LmNzCisrKyBiL0VQUGx1cy9TdHlsZS9FeGNlbFJpY2hUZXh0LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxNyArMTMsMTcgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKQEAgLTMxLDI5MSArMzEsMjc3IEBACiAgKiBSaWNoYXJkIFRhbGxlbnQJCQkJCUZpeCBpbmFkdmVydGVudCByZW1vdmFsIG9mIFhNTCBub2RlCQkJCQkyMDEyLTEwLTMxCiAgKiBSaWNoYXJkIFRhbGxlbnQJCQkJCVJlbW92ZSBWZXJ0QWxpZ24gbm9kZSBpZiBubyBhbGlnbm1lbnQgc3BlY2lmaWVkCQkyMDEyLTEwLTMxCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBTeXN0ZW0uRHJhd2luZzsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlhtbDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEEgcmljaHRleHQgcGFydAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsUmljaFRleHQgOiBYbWxIZWxwZXIKLSAgICB7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsUmljaFRleHQoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFJpY2hUZXh0Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSA6Ci0gICAgICAgICAgICBiYXNlKG5zLCB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXI9bmV3IHN0cmluZ1tdIHsiclByIiwgInQiLCAiYiIsICJpIiwic3RyaWtlIiwgInUiLCAidmVydEFsaWduIiAsICJzeiIsICJjb2xvciIsICJyRm9udCIsICJmYW1pbHkiLCAic2NoZW1lIiwgImNoYXJzZXQifTsKLSAgICAgICAgICAgIF9jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBkZWxlZ2F0ZSB2b2lkIENhbGxiYWNrRGVsZWdhdGUoKTsKLSAgICAgICAgQ2FsbGJhY2tEZWxlZ2F0ZSBfY2FsbGJhY2s7Ci0gICAgICAgIGludGVybmFsIHZvaWQgU2V0Q2FsbGJhY2soQ2FsbGJhY2tEZWxlZ2F0ZSBjYWxsYmFjaykKLSAgICAgICAgewotICAgICAgICAgICAgX2NhbGxiYWNrPWNhbGxiYWNrOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBURVhUX1BBVEg9ImQ6dCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB0ZXh0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVGV4dCAKLSAgICAgICAgeyAKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlOwogCi0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBCdWcgMTUxNTEKLSAgICAgICAgICAgICAgICBpZiAoVG9wTm9kZS5OYW1lID09ICJ0IikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRvcE5vZGUuSW5uZXJUZXh0OwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoVEVYVF9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jb2xsZWN0aW9uLkNvbnZlcnRSaWNodGV4dCgpOwotICAgICAgICAgICAgICAgIC8vIERvbid0IHJlbW92ZSBpZiBibGFuayAtLSBzZXR0aW5nIGEgYmxhbmsgcmljaCB0ZXh0IHZhbHVlIG9uIGEgbm9kZSBpcyBjb21tb24sCi0gICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGUgd2hlbiBhcHBseWluZyBib3RoIGJvbGQgYW5kIGl0YWxpYyB0byB0ZXh0LgotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVEVYVF9QQVRILCB2YWx1ZSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGlmIChQcmVzZXJ2ZVNwYWNlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBlbGVtID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKFRFWFRfUEFUSCwgTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgZWxlbS5TZXRBdHRyaWJ1dGUoInhtbDpzcGFjZSIsICJwcmVzZXJ2ZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIF9jYWxsYmFjaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFByZXNlcnZlcyB3aGl0ZXNwYWNlLiBEZWZhdWx0IHRydWUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgUHJlc2VydmVTcGFjZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGVsZW0gPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoVEVYVF9QQVRILCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChlbGVtICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5HZXRBdHRyaWJ1dGUoInhtbDpzcGFjZSIpPT0icHJlc2VydmUiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29sbGVjdGlvbi5Db252ZXJ0UmljaHRleHQoKTsKLSAgICAgICAgICAgICAgICBYbWxFbGVtZW50IGVsZW0gPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoVEVYVF9QQVRILCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgICAgIGlmIChlbGVtICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uU2V0QXR0cmlidXRlKCJ4bWw6c3BhY2UiLCAicHJlc2VydmUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uUmVtb3ZlQXR0cmlidXRlKCJ4bWw6c3BhY2UiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIF9jYWxsYmFjaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBCT0xEX1BBVEggPSAiZDpyUHIvZDpiIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQm9sZCB0ZXh0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEJvbGQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEV4aXN0Tm9kZShCT0xEX1BBVEgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NvbGxlY3Rpb24uQ29udmVydFJpY2h0ZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShCT0xEX1BBVEgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKEJPTERfUEFUSCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKF9jYWxsYmFjayE9bnVsbCkgX2NhbGxiYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIElUQUxJQ19QQVRIID0gImQ6clByL2Q6aSI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEl0YWxpYyB0ZXh0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEl0YWxpYwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvL3JldHVybiBHZXRYbWxOb2RlQm9vbChJVEFMSUNfUEFUSCwgZmFsc2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBFeGlzdE5vZGUoSVRBTElDX1BBVEgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NvbGxlY3Rpb24uQ29udmVydFJpY2h0ZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShJVEFMSUNfUEFUSCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoSVRBTElDX1BBVEgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIF9jYWxsYmFjaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBTVFJJS0VfUEFUSCA9ICJkOnJQci9kOnN0cmlrZSI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFN0cmlrZS1vdXQgdGV4dAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTdHJpa2UKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEV4aXN0Tm9kZShTVFJJS0VfUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29sbGVjdGlvbi5Db252ZXJ0UmljaHRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKFNUUklLRV9QQVRIKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShTVFJJS0VfUEFUSCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChfY2FsbGJhY2sgIT0gbnVsbCkgX2NhbGxiYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIFVOREVSTElORV9QQVRIID0gImQ6clByL2Q6dSI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFVuZGVybGluZWQgdGV4dAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBVbmRlckxpbmUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEV4aXN0Tm9kZShVTkRFUkxJTkVfUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29sbGVjdGlvbi5Db252ZXJ0UmljaHRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKFVOREVSTElORV9QQVRIKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZShVTkRFUkxJTkVfUEFUSCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChfY2FsbGJhY2sgIT0gbnVsbCkgX2NhbGxiYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBBIHJpY2h0ZXh0IHBhcnQKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxSaWNoVGV4dCA6IFhtbEhlbHBlciB7CisgIGludGVybmFsIEV4Y2VsUmljaFRleHQoCisgICAgICBYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLAorICAgICAgWG1sTm9kZSB0b3BOb2RlLAorICAgICAgRXhjZWxSaWNoVGV4dENvbGxlY3Rpb24gY29sbGVjdGlvbikKKyAgICAgIDogYmFzZShucywgdG9wTm9kZSkgeworICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ld1tdIHsKKyAgICAgICJyUHIiLAorICAgICAgInQiLAorICAgICAgImIiLAorICAgICAgImkiLAorICAgICAgInN0cmlrZSIsCisgICAgICAidSIsCisgICAgICAidmVydEFsaWduIiwKKyAgICAgICJzeiIsCisgICAgICAiY29sb3IiLAorICAgICAgInJGb250IiwKKyAgICAgICJmYW1pbHkiLAorICAgICAgInNjaGVtZSIsCisgICAgICAiY2hhcnNldCIsCisgICAgfTsKKyAgICBfY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247CisgIH0KIAotICAgICAgICBjb25zdCBzdHJpbmcgVkVSVF9BTElHTl9QQVRIID0gImQ6clByL2Q6dmVydEFsaWduL0B2YWwiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBWZXJ0aWNhbCBBbGlnbm1lbnQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250IFZlcnRpY2FsQWxpZ24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHY9R2V0WG1sTm9kZVN0cmluZyhWRVJUX0FMSUdOX1BBVEgpOwotICAgICAgICAgICAgICAgIGlmKHY9PSIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250Lk5vbmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250KUVudW0uUGFyc2UodHlwZW9mKEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250KSwgdiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2gKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250Lk5vbmU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29sbGVjdGlvbi5Db252ZXJ0UmljaHRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQuTm9uZSkKLSAgICAgICAgICAgICAgICB7Ci0JCQkJCS8vIElmIEV4Y2VsIDIwMTAgZW5jb3VudGVycyBhIHZlcnRpY2FsIGFsaWduIHZhbHVlIG9mIGJsYW5rLCBpdCB3aWxsIG5vdCBsb2FkCi0JCQkJCS8vIHRoZSBzcHJlYWRzaGVldC4gU28gaWYgTm9uZSBpcyBzcGVjaWZpZWQsIGRlbGV0ZSB0aGUgbm9kZSwgaXQgd2lsbCBiZSAKLQkJCQkJLy8gcmVjcmVhdGVkIGlmIGEgbmV3IHZhbHVlIGlzIGFwcGxpZWQgbGF0ZXIuCi0JCQkJCURlbGV0ZU5vZGUoVkVSVF9BTElHTl9QQVRIKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTZXRYbWxOb2RlU3RyaW5nKFZFUlRfQUxJR05fUEFUSCwgdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VySW52YXJpYW50KCkpOwotCQkJCX0KLSAgICAgICAgICAgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIF9jYWxsYmFjaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBTSVpFX1BBVEggPSAiZDpyUHIvZDpzei9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRm9udCBzaXplCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBmbG9hdCBTaXplCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDb252ZXJ0LlRvU2luZ2xlKEdldFhtbE5vZGVEZWNpbWFsKFNJWkVfUEFUSCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NvbGxlY3Rpb24uQ29udmVydFJpY2h0ZXh0KCk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhTSVpFX1BBVEgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIF9jYWxsYmFjaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBGT05UX1BBVEggPSAiZDpyUHIvZDpyRm9udC9AdmFsIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTmFtZSBvZiB0aGUgZm9udAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIEZvbnROYW1lCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKEZPTlRfUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29sbGVjdGlvbi5Db252ZXJ0UmljaHRleHQoKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEZPTlRfUEFUSCwgdmFsdWUpOwotICAgICAgICAgICAgICAgIGlmIChfY2FsbGJhY2sgIT0gbnVsbCkgX2NhbGxiYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIENPTE9SX1BBVEggPSAiZDpyUHIvZDpjb2xvci9AcmdiIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGV4dCBjb2xvcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgQ29sb3IgQ29sb3IKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGNvbCA9IEdldFhtbE5vZGVTdHJpbmcoQ09MT1JfUEFUSCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbCA9PSAiIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xvci5FbXB0eTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKGludC5QYXJzZShjb2wsIFN5c3RlbS5HbG9iYWxpemF0aW9uLk51bWJlclN0eWxlcy5BbGxvd0hleFNwZWNpZmllcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jb2xsZWN0aW9uLkNvbnZlcnRSaWNodGV4dCgpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoQ09MT1JfUEFUSCwgdmFsdWUuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKS8qLlN1YnN0cmluZygyLCA2KSovKTsKLSAgICAgICAgICAgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIF9jYWxsYmFjaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIGludGVybmFsIGRlbGVnYXRlIHZvaWQgQ2FsbGJhY2tEZWxlZ2F0ZSgpOwogCi0gICAgICAgIHB1YmxpYyBFeGNlbFJpY2hUZXh0Q29sbGVjdGlvbiBfY29sbGVjdGlvbiB7IGdldDsgc2V0OyB9CisgIHByaXZhdGUgQ2FsbGJhY2tEZWxlZ2F0ZSBfY2FsbGJhY2s7CisKKyAgaW50ZXJuYWwgdm9pZCBTZXRDYWxsYmFjayhDYWxsYmFja0RlbGVnYXRlIGNhbGxiYWNrKSB7CisgICAgX2NhbGxiYWNrID0gY2FsbGJhY2s7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfdGV4dFBhdGggPSAiZDp0IjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgdGV4dAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIFRleHQgeworICAgIGdldCB7CisgICAgICAvLyBCdWcgMTUxNTEKKyAgICAgIGlmIChUb3BOb2RlLk5hbWUgPT0gInQiKSB7CisgICAgICAgIHJldHVybiBUb3BOb2RlLklubmVyVGV4dDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKF90ZXh0UGF0aCk7CiAgICAgfQorICAgIHNldCB7CisgICAgICBfY29sbGVjdGlvbi5Db252ZXJ0UmljaHRleHQoKTsKKyAgICAgIC8vIERvbid0IHJlbW92ZSBpZiBibGFuayAtLSBzZXR0aW5nIGEgYmxhbmsgcmljaCB0ZXh0IHZhbHVlIG9uIGEgbm9kZSBpcyBjb21tb24sCisgICAgICAvLyBmb3IgZXhhbXBsZSB3aGVuIGFwcGx5aW5nIGJvdGggYm9sZCBhbmQgaXRhbGljIHRvIHRleHQuCisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF90ZXh0UGF0aCwgdmFsdWUsIGZhbHNlKTsKKyAgICAgIGlmIChQcmVzZXJ2ZVNwYWNlKSB7CisgICAgICAgIFhtbEVsZW1lbnQgZWxlbSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfdGV4dFBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7CisgICAgICAgIGVsZW0uU2V0QXR0cmlidXRlKCJ4bWw6c3BhY2UiLCAicHJlc2VydmUiKTsKKyAgICAgIH0KKyAgICAgIGlmIChfY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICBfY2FsbGJhY2soKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQcmVzZXJ2ZXMgd2hpdGVzcGFjZS4gRGVmYXVsdCB0cnVlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIFByZXNlcnZlU3BhY2UgeworICAgIGdldCB7CisgICAgICBYbWxFbGVtZW50IGVsZW0gPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX3RleHRQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgaWYgKGVsZW0gIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gZWxlbS5HZXRBdHRyaWJ1dGUoInhtbDpzcGFjZSIpID09ICJwcmVzZXJ2ZSI7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNldCB7CisgICAgICBfY29sbGVjdGlvbi5Db252ZXJ0UmljaHRleHQoKTsKKyAgICAgIFhtbEVsZW1lbnQgZWxlbSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfdGV4dFBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7CisgICAgICBpZiAoZWxlbSAhPSBudWxsKSB7CisgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgIGVsZW0uU2V0QXR0cmlidXRlKCJ4bWw6c3BhY2UiLCAicHJlc2VydmUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBlbGVtLlJlbW92ZUF0dHJpYnV0ZSgieG1sOnNwYWNlIik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChfY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICBfY2FsbGJhY2soKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYm9sZFBhdGggPSAiZDpyUHIvZDpiIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBCb2xkIHRleHQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQm9sZCB7CisgICAgZ2V0ID0+IEV4aXN0Tm9kZShfYm9sZFBhdGgpOworICAgIHNldCB7CisgICAgICBfY29sbGVjdGlvbi5Db252ZXJ0UmljaHRleHQoKTsKKyAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICBDcmVhdGVOb2RlKF9ib2xkUGF0aCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBEZWxldGVOb2RlKF9ib2xkUGF0aCk7CisgICAgICB9CisgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgX2NhbGxiYWNrKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2l0YWxpY1BhdGggPSAiZDpyUHIvZDppIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJdGFsaWMgdGV4dAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBJdGFsaWMgeworICAgIGdldCA9PgorICAgICAgLy9yZXR1cm4gR2V0WG1sTm9kZUJvb2woSVRBTElDX1BBVEgsIGZhbHNlKTsKKyAgICAgIEV4aXN0Tm9kZShfaXRhbGljUGF0aCk7CisgICAgc2V0IHsKKyAgICAgIF9jb2xsZWN0aW9uLkNvbnZlcnRSaWNodGV4dCgpOworICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIENyZWF0ZU5vZGUoX2l0YWxpY1BhdGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRGVsZXRlTm9kZShfaXRhbGljUGF0aCk7CisgICAgICB9CisgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgX2NhbGxiYWNrKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3N0cmlrZVBhdGggPSAiZDpyUHIvZDpzdHJpa2UiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFN0cmlrZS1vdXQgdGV4dAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBTdHJpa2UgeworICAgIGdldCA9PiBFeGlzdE5vZGUoX3N0cmlrZVBhdGgpOworICAgIHNldCB7CisgICAgICBfY29sbGVjdGlvbi5Db252ZXJ0UmljaHRleHQoKTsKKyAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICBDcmVhdGVOb2RlKF9zdHJpa2VQYXRoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERlbGV0ZU5vZGUoX3N0cmlrZVBhdGgpOworICAgICAgfQorICAgICAgaWYgKF9jYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgIF9jYWxsYmFjaygpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF91bmRlcmxpbmVQYXRoID0gImQ6clByL2Q6dSI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVW5kZXJsaW5lZCB0ZXh0CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIFVuZGVyTGluZSB7CisgICAgZ2V0ID0+IEV4aXN0Tm9kZShfdW5kZXJsaW5lUGF0aCk7CisgICAgc2V0IHsKKyAgICAgIF9jb2xsZWN0aW9uLkNvbnZlcnRSaWNodGV4dCgpOworICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIENyZWF0ZU5vZGUoX3VuZGVybGluZVBhdGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRGVsZXRlTm9kZShfdW5kZXJsaW5lUGF0aCk7CisgICAgICB9CisgICAgICBpZiAoX2NhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgX2NhbGxiYWNrKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3ZlcnRBbGlnblBhdGggPSAiZDpyUHIvZDp2ZXJ0QWxpZ24vQHZhbCI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVmVydGljYWwgQWxpZ25tZW50CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udCBWZXJ0aWNhbEFsaWduIHsKKyAgICBnZXQgeworICAgICAgc3RyaW5nIHYgPSBHZXRYbWxOb2RlU3RyaW5nKF92ZXJ0QWxpZ25QYXRoKTsKKyAgICAgIGlmICh2ID09ICIiKSB7CisgICAgICAgIHJldHVybiBFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udC5Ob25lOworICAgICAgfQorICAgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIChFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udClFbnVtLlBhcnNlKHR5cGVvZihFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udCksIHYsIHRydWUpOworICAgICAgfSBjYXRjaCB7CisgICAgICAgIHJldHVybiBFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udC5Ob25lOworICAgICAgfQorICAgIH0KKyAgICBzZXQgeworICAgICAgX2NvbGxlY3Rpb24uQ29udmVydFJpY2h0ZXh0KCk7CisgICAgICBpZiAodmFsdWUgPT0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQuTm9uZSkgeworICAgICAgICAvLyBJZiBFeGNlbCAyMDEwIGVuY291bnRlcnMgYSB2ZXJ0aWNhbCBhbGlnbiB2YWx1ZSBvZiBibGFuaywgaXQgd2lsbCBub3QgbG9hZAorICAgICAgICAvLyB0aGUgc3ByZWFkc2hlZXQuIFNvIGlmIE5vbmUgaXMgc3BlY2lmaWVkLCBkZWxldGUgdGhlIG5vZGUsIGl0IHdpbGwgYmUKKyAgICAgICAgLy8gcmVjcmVhdGVkIGlmIGEgbmV3IHZhbHVlIGlzIGFwcGxpZWQgbGF0ZXIuCisgICAgICAgIERlbGV0ZU5vZGUoX3ZlcnRBbGlnblBhdGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfdmVydEFsaWduUGF0aCwgdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VySW52YXJpYW50KCkpOworICAgICAgfQorICAgICAgaWYgKF9jYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgIF9jYWxsYmFjaygpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9zaXplUGF0aCA9ICJkOnJQci9kOnN6L0B2YWwiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEZvbnQgc2l6ZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZmxvYXQgU2l6ZSB7CisgICAgZ2V0ID0+IENvbnZlcnQuVG9TaW5nbGUoR2V0WG1sTm9kZURlY2ltYWwoX3NpemVQYXRoKSk7CisgICAgc2V0IHsKKyAgICAgIF9jb2xsZWN0aW9uLkNvbnZlcnRSaWNodGV4dCgpOworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc2l6ZVBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgIGlmIChfY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICBfY2FsbGJhY2soKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZm9udFBhdGggPSAiZDpyUHIvZDpyRm9udC9AdmFsIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOYW1lIG9mIHRoZSBmb250CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgRm9udE5hbWUgeworICAgIGdldCA9PiBHZXRYbWxOb2RlU3RyaW5nKF9mb250UGF0aCk7CisgICAgc2V0IHsKKyAgICAgIF9jb2xsZWN0aW9uLkNvbnZlcnRSaWNodGV4dCgpOworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfZm9udFBhdGgsIHZhbHVlKTsKKyAgICAgIGlmIChfY2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICBfY2FsbGJhY2soKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfY29sb3JQYXRoID0gImQ6clByL2Q6Y29sb3IvQHJnYiI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGV4dCBjb2xvcgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgQ29sb3IgQ29sb3IgeworICAgIGdldCB7CisgICAgICBzdHJpbmcgY29sID0gR2V0WG1sTm9kZVN0cmluZyhfY29sb3JQYXRoKTsKKyAgICAgIGlmIChjb2wgPT0gIiIpIHsKKyAgICAgICAgcmV0dXJuIENvbG9yLkVtcHR5OworICAgICAgfQorICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKGludC5QYXJzZShjb2wsIE51bWJlclN0eWxlcy5BbGxvd0hleFNwZWNpZmllcikpOworICAgIH0KKyAgICBzZXQgeworICAgICAgX2NvbGxlY3Rpb24uQ29udmVydFJpY2h0ZXh0KCk7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgIF9jb2xvclBhdGgsCisgICAgICAgICAgdmFsdWUKKyAgICAgICAgICAgICAgLlRvQXJnYigpCisgICAgICAgICAgICAgIC5Ub1N0cmluZygKKyAgICAgICAgICAgICAgICAgICJYIikgLyouU3Vic3RyaW5nKDIsIDYpKi8pOworICAgICAgaWYgKF9jYWxsYmFjayAhPSBudWxsKSB7CisgICAgICAgIF9jYWxsYmFjaygpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHB1YmxpYyBFeGNlbFJpY2hUZXh0Q29sbGVjdGlvbiBfY29sbGVjdGlvbiB7IGdldDsgc2V0OyB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRXhjZWxSaWNoVGV4dENvbGxlY3Rpb24uY3MgYi9FUFBsdXMvU3R5bGUvRXhjZWxSaWNoVGV4dENvbGxlY3Rpb24uY3MKaW5kZXggYzI4YmY5MS4uNDk2NDMxZCAxMDA2NDQKLS0tIGEvRVBQbHVzL1N0eWxlL0V4Y2VsUmljaFRleHRDb2xsZWN0aW9uLmNzCisrKyBiL0VQUGx1cy9TdHlsZS9FeGNlbFJpY2hUZXh0Q29sbGVjdGlvbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMjUyICsxMywyNDUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07CisKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLkRyYXdpbmc7Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIHVzaW5nIFN5c3RlbS5MaW5xOwogdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgU3lzdGVtLkRyYXdpbmc7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENvbGxlY3Rpb24gb2YgUmljaHRleHQgb2JqZWN0cwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsUmljaFRleHRDb2xsZWN0aW9uIDogWG1sSGVscGVyLCBJRW51bWVyYWJsZTxFeGNlbFJpY2hUZXh0PgotICAgIHsKLSAgICAgICAgTGlzdDxFeGNlbFJpY2hUZXh0PiBfbGlzdCA9IG5ldyBMaXN0PEV4Y2VsUmljaFRleHQ+KCk7Ci0gICAgICAgIEV4Y2VsUmFuZ2VCYXNlIF9jZWxscz1udWxsOwotICAgICAgICBpbnRlcm5hbCBFeGNlbFJpY2hUZXh0Q29sbGVjdGlvbihYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIHRvcE5vZGUpIDoKLSAgICAgICAgICAgIGJhc2UobnMsIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBubCA9IHRvcE5vZGUuU2VsZWN0Tm9kZXMoImQ6cnxkOnQiLCBOYW1lU3BhY2VNYW5hZ2VyKTsgIC8vIEJ1ZyAxNTE1MQotICAgICAgICAgICAgaWYgKG5sICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAoWG1sTm9kZSBuIGluIG5sKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2xpc3QuQWRkKG5ldyBFeGNlbFJpY2hUZXh0KG5zLCBuLHRoaXMpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxSaWNoVGV4dENvbGxlY3Rpb24oWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFJhbmdlQmFzZSBjZWxscykgOgotICAgICAgICAgICAgdGhpcyhucywgdG9wTm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgX2NlbGxzID0gY2VsbHM7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb2xsZWN0aW9uIGNvbnRhaW5pbmcgdGhlIHJpY2h0ZXh0IG9iamVjdHMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJbmRleCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIEV4Y2VsUmljaFRleHQgdGhpc1tpbnQgSW5kZXhdCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBpdGVtPV9saXN0W0luZGV4XTsKLSAgICAgICAgICAgICAgICBpZihfY2VsbHMhPW51bGwpIGl0ZW0uU2V0Q2FsbGJhY2soVXBkYXRlQ2VsbHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEl0ZW1zIGluIHRoZSBsaXN0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgQ291bnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9saXN0LkNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZCBhIHJpY2ggdGV4dCBzdHJpbmcKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJUZXh0Ij5UaGUgdGV4dCB0byBhZGQ8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgRXhjZWxSaWNoVGV4dCBBZGQoc3RyaW5nIFRleHQpCi0gICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgICAgIENvbnZlcnRSaWNodGV4dCgpOwotICAgICAgICAgICAgWG1sRG9jdW1lbnQgZG9jOwotICAgICAgICAgICAgaWYgKFRvcE5vZGUgaXMgWG1sRG9jdW1lbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZG9jID0gVG9wTm9kZSBhcyBYbWxEb2N1bWVudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkb2MgPSBUb3BOb2RlLk93bmVyRG9jdW1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgbm9kZSA9IGRvYy5DcmVhdGVFbGVtZW50KCJkIiwgInIiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICBUb3BOb2RlLkFwcGVuZENoaWxkKG5vZGUpOwotICAgICAgICAgICAgdmFyIHJ0ID0gbmV3IEV4Y2VsUmljaFRleHQoTmFtZVNwYWNlTWFuYWdlciwgbm9kZSwgdGhpcyk7Ci0gICAgICAgICAgICBpZiAoX2xpc3QuQ291bnQgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEV4Y2VsUmljaFRleHQgcHJldkl0ZW0gPSBfbGlzdFtfbGlzdC5Db3VudCAtIDFdOwotICAgICAgICAgICAgICAgIHJ0LkZvbnROYW1lID0gcHJldkl0ZW0uRm9udE5hbWU7Ci0gICAgICAgICAgICAgICAgcnQuU2l6ZSA9IHByZXZJdGVtLlNpemU7Ci0gICAgICAgICAgICAgICAgaWYgKHByZXZJdGVtLkNvbG9yLklzRW1wdHkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBydC5Db2xvciA9IENvbG9yLkJsYWNrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBydC5Db2xvciA9IHByZXZJdGVtLkNvbG9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBydC5QcmVzZXJ2ZVNwYWNlID0gcnQuUHJlc2VydmVTcGFjZTsKLSAgICAgICAgICAgICAgICBydC5Cb2xkID0gcHJldkl0ZW0uQm9sZDsKLSAgICAgICAgICAgICAgICBydC5JdGFsaWMgPSBwcmV2SXRlbS5JdGFsaWM7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJ0LlVuZGVyTGluZSA9IHByZXZJdGVtLlVuZGVyTGluZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKF9jZWxscyA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJ0LkZvbnROYW1lID0gIkNhbGlicmkiOwotICAgICAgICAgICAgICAgIHJ0LlNpemUgPSAxMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc3R5bGUgPSBfY2VsbHMuT2Zmc2V0KDAsIDApLlN0eWxlOwotICAgICAgICAgICAgICAgIHJ0LkZvbnROYW1lID0gc3R5bGUuRm9udC5OYW1lOwotICAgICAgICAgICAgICAgIHJ0LlNpemUgPSBzdHlsZS5Gb250LlNpemU7Ci0gICAgICAgICAgICAgICAgcnQuQm9sZCA9IHN0eWxlLkZvbnQuQm9sZDsKLSAgICAgICAgICAgICAgICBydC5JdGFsaWMgPSBzdHlsZS5Gb250Lkl0YWxpYzsKLSAgICAgICAgICAgICAgICBfY2VsbHMuSXNSaWNoVGV4dCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBydC5UZXh0ID0gVGV4dDsKLSAgICAgICAgICAgIHJ0LlByZXNlcnZlU3BhY2UgPSB0cnVlOwotICAgICAgICAgICAgaWYoX2NlbGxzIT1udWxsKSAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBydC5TZXRDYWxsYmFjayhVcGRhdGVDZWxscyk7Ci0gICAgICAgICAgICAgICAgVXBkYXRlQ2VsbHMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9saXN0LkFkZChydCk7Ci0gICAgICAgICAgICByZXR1cm4gcnQ7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlOwogCi0gICAgICAgIGludGVybmFsIHZvaWQgQ29udmVydFJpY2h0ZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9jZWxscyA9PSBudWxsKSByZXR1cm47Ci0gICAgICAgICAgICB2YXIgaXNSdCA9IF9jZWxscy5Xb3Jrc2hlZXQuX2ZsYWdzLkdldEZsYWdWYWx1ZShfY2VsbHMuX2Zyb21Sb3csIF9jZWxscy5fZnJvbUNvbCwgQ2VsbEZsYWdzLlJpY2hUZXh0KTsKLSAgICAgICAgICAgIGlmIChDb3VudCA9PSAxICYmIGlzUnQgPT0gZmFsc2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NlbGxzLldvcmtzaGVldC5fZmxhZ3MuU2V0RmxhZ1ZhbHVlKF9jZWxscy5fZnJvbVJvdywgX2NlbGxzLl9mcm9tQ29sLCB0cnVlLCBDZWxsRmxhZ3MuUmljaFRleHQpOwotICAgICAgICAgICAgICAgIHZhciBzID0gX2NlbGxzLldvcmtzaGVldC5fc3R5bGVzLkdldFZhbHVlKF9jZWxscy5fZnJvbVJvdywgX2NlbGxzLl9mcm9tQ29sKTsKLSAgICAgICAgICAgICAgICAvL3ZhciBmbnQgPSBjZWxsLlN0eWxlLkZvbnQ7Ci0gICAgICAgICAgICAgICAgdmFyIGZudCA9IF9jZWxscy5Xb3Jrc2hlZXQuV29ya2Jvb2suU3R5bGVzLkdldFN0eWxlT2JqZWN0KHMsIF9jZWxscy5Xb3Jrc2hlZXQuUG9zaXRpb25JRCwgRXhjZWxBZGRyZXNzQmFzZS5HZXRBZGRyZXNzKF9jZWxscy5fZnJvbVJvdywgX2NlbGxzLl9mcm9tQ29sKSkuRm9udDsKLSAgICAgICAgICAgICAgICB0aGlzWzBdLlByZXNlcnZlU3BhY2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIHRoaXNbMF0uQm9sZCA9IGZudC5Cb2xkOwotICAgICAgICAgICAgICAgIHRoaXNbMF0uRm9udE5hbWUgPSBmbnQuTmFtZTsKLSAgICAgICAgICAgICAgICB0aGlzWzBdLkl0YWxpYyA9IGZudC5JdGFsaWM7Ci0gICAgICAgICAgICAgICAgdGhpc1swXS5TaXplID0gZm50LlNpemU7Ci0gICAgICAgICAgICAgICAgdGhpc1swXS5VbmRlckxpbmUgPSBmbnQuVW5kZXJMaW5lOworLy8vIDxzdW1tYXJ5PgorLy8vIENvbGxlY3Rpb24gb2YgUmljaHRleHQgb2JqZWN0cworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbFJpY2hUZXh0Q29sbGVjdGlvbiA6IFhtbEhlbHBlciwgSUVudW1lcmFibGU8RXhjZWxSaWNoVGV4dD4geworICBwcml2YXRlIExpc3Q8RXhjZWxSaWNoVGV4dD4gX2xpc3QgPSBuZXcoKTsKKyAgcHJpdmF0ZSBFeGNlbFJhbmdlQmFzZSBfY2VsbHM7CiAKLSAgICAgICAgICAgICAgICBpbnQgaGV4OwotICAgICAgICAgICAgICAgIGlmIChmbnQuQ29sb3IuUmdiICE9ICIiICYmIGludC5UcnlQYXJzZShmbnQuQ29sb3IuUmdiLCBOdW1iZXJTdHlsZXMuSGV4TnVtYmVyLCBudWxsLCBvdXQgaGV4KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXNbMF0uQ29sb3IgPSBDb2xvci5Gcm9tQXJnYihoZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCB2b2lkIFVwZGF0ZUNlbGxzKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2NlbGxzLlNldFZhbHVlUmljaFRleHQoVG9wTm9kZS5Jbm5lclhtbCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ2xlYXIgdGhlIGNvbGxlY3Rpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbGlzdC5DbGVhcigpOwotICAgICAgICAgICAgVG9wTm9kZS5SZW1vdmVBbGwoKTsKLSAgICAgICAgICAgIFVwZGF0ZUNlbGxzKCk7Ci0gICAgICAgICAgICBpZiAoX2NlbGxzICE9IG51bGwpIF9jZWxscy5Jc1JpY2hUZXh0ID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVtb3ZlcyBhbiBpdGVtIGF0IHRoZSBzcGVjaWZpYyBpbmRleAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkluZGV4Ij48L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmVBdChpbnQgSW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRvcE5vZGUuUmVtb3ZlQ2hpbGQoX2xpc3RbSW5kZXhdLlRvcE5vZGUpOwotICAgICAgICAgICAgX2xpc3QuUmVtb3ZlQXQoSW5kZXgpOwotICAgICAgICAgICAgaWYgKF9jZWxscyAhPSBudWxsICYmIF9saXN0LkNvdW50PT0wKSBfY2VsbHMuSXNSaWNoVGV4dCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlbW92ZXMgYW4gaXRlbQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ikl0ZW0iPjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZShFeGNlbFJpY2hUZXh0IEl0ZW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRvcE5vZGUuUmVtb3ZlQ2hpbGQoSXRlbS5Ub3BOb2RlKTsKLSAgICAgICAgICAgIF9saXN0LlJlbW92ZShJdGVtKTsKLSAgICAgICAgICAgIGlmIChfY2VsbHMgIT0gbnVsbCAmJiBfbGlzdC5Db3VudCA9PSAwKSBfY2VsbHMuSXNSaWNoVGV4dCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIC8vcHVibGljIHZvaWQgSW5zZXJ0KGludCBpbmRleCwgc3RyaW5nIFRleHQpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBfbGlzdC5JbnNlcnQoaW5kZXgsIGl0ZW0pOwotICAgICAgICAvL30KLSAgICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB0ZXh0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVGV4dAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiPW5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gX2xpc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoaXRlbS5UZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQ291bnQgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFkZCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXNbMF0uVGV4dCA9IHZhbHVlOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpeCA9IDE7IGl4IDwgQ291bnQ7IGl4KyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92ZUF0KGl4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAjcmVnaW9uIElFbnVtZXJhYmxlPEV4Y2VsUmljaFRleHQ+IE1lbWJlcnMKLQotICAgICAgICBJRW51bWVyYXRvcjxFeGNlbFJpY2hUZXh0PiBJRW51bWVyYWJsZTxFeGNlbFJpY2hUZXh0Pi5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9saXN0LlNlbGVjdCh4ID0+IHsgeC5TZXRDYWxsYmFjayhVcGRhdGVDZWxscyk7IHJldHVybiB4OyB9KS5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgI3JlZ2lvbiBJRW51bWVyYWJsZSBNZW1iZXJzCi0KLSAgICAgICAgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhdG9yIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9saXN0LlNlbGVjdCh4ID0+IHsgeC5TZXRDYWxsYmFjayhVcGRhdGVDZWxscyk7IHJldHVybiB4OyB9KS5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAjZW5kcmVnaW9uCisgIGludGVybmFsIEV4Y2VsUmljaFRleHRDb2xsZWN0aW9uKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgdG9wTm9kZSkKKyAgICAgIDogYmFzZShucywgdG9wTm9kZSkgeworICAgIHZhciBubCA9IHRvcE5vZGUuU2VsZWN0Tm9kZXMoImQ6cnxkOnQiLCBOYW1lU3BhY2VNYW5hZ2VyKTsgLy8gQnVnIDE1MTUxCisgICAgaWYgKG5sICE9IG51bGwpIHsKKyAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbiBpbiBubCkgeworICAgICAgICBfbGlzdC5BZGQobmV3KG5zLCBuLCB0aGlzKSk7CisgICAgICB9CiAgICAgfQorICB9CisKKyAgaW50ZXJuYWwgRXhjZWxSaWNoVGV4dENvbGxlY3Rpb24oWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFJhbmdlQmFzZSBjZWxscykKKyAgICAgIDogdGhpcyhucywgdG9wTm9kZSkgeworICAgIF9jZWxscyA9IGNlbGxzOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ29sbGVjdGlvbiBjb250YWluaW5nIHRoZSByaWNodGV4dCBvYmplY3RzCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iaW5kZXgiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFJpY2hUZXh0IHRoaXNbaW50IGluZGV4XSB7CisgICAgZ2V0IHsKKyAgICAgIHZhciBpdGVtID0gX2xpc3RbaW5kZXhdOworICAgICAgaWYgKF9jZWxscyAhPSBudWxsKSB7CisgICAgICAgIGl0ZW0uU2V0Q2FsbGJhY2soVXBkYXRlQ2VsbHMpOworICAgICAgfQorICAgICAgcmV0dXJuIGl0ZW07CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSXRlbXMgaW4gdGhlIGxpc3QKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBDb3VudCA9PiBfbGlzdC5Db3VudDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgYSByaWNoIHRleHQgc3RyaW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0idGV4dCI+VGhlIHRleHQgdG8gYWRkPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIEV4Y2VsUmljaFRleHQgQWRkKHN0cmluZyB0ZXh0KSB7CisgICAgQ29udmVydFJpY2h0ZXh0KCk7CisgICAgWG1sRG9jdW1lbnQgZG9jOworICAgIGlmIChUb3BOb2RlIGlzIFhtbERvY3VtZW50KSB7CisgICAgICBkb2MgPSBUb3BOb2RlIGFzIFhtbERvY3VtZW50OworICAgIH0gZWxzZSB7CisgICAgICBkb2MgPSBUb3BOb2RlLk93bmVyRG9jdW1lbnQ7CisgICAgfQorICAgIHZhciBub2RlID0gZG9jLkNyZWF0ZUVsZW1lbnQoImQiLCAiciIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgVG9wTm9kZS5BcHBlbmRDaGlsZChub2RlKTsKKyAgICB2YXIgcnQgPSBuZXcgRXhjZWxSaWNoVGV4dChOYW1lU3BhY2VNYW5hZ2VyLCBub2RlLCB0aGlzKTsKKyAgICBpZiAoX2xpc3QuQ291bnQgPiAwKSB7CisgICAgICBFeGNlbFJpY2hUZXh0IHByZXZJdGVtID0gX2xpc3RbX2xpc3QuQ291bnQgLSAxXTsKKyAgICAgIHJ0LkZvbnROYW1lID0gcHJldkl0ZW0uRm9udE5hbWU7CisgICAgICBydC5TaXplID0gcHJldkl0ZW0uU2l6ZTsKKyAgICAgIGlmIChwcmV2SXRlbS5Db2xvci5Jc0VtcHR5KSB7CisgICAgICAgIHJ0LkNvbG9yID0gQ29sb3IuQmxhY2s7CisgICAgICB9IGVsc2UgeworICAgICAgICBydC5Db2xvciA9IHByZXZJdGVtLkNvbG9yOworICAgICAgfQorICAgICAgcnQuUHJlc2VydmVTcGFjZSA9IHJ0LlByZXNlcnZlU3BhY2U7CisgICAgICBydC5Cb2xkID0gcHJldkl0ZW0uQm9sZDsKKyAgICAgIHJ0Lkl0YWxpYyA9IHByZXZJdGVtLkl0YWxpYzsKKyAgICAgIHJ0LlVuZGVyTGluZSA9IHByZXZJdGVtLlVuZGVyTGluZTsKKyAgICB9IGVsc2UgaWYgKF9jZWxscyA9PSBudWxsKSB7CisgICAgICBydC5Gb250TmFtZSA9ICJDYWxpYnJpIjsKKyAgICAgIHJ0LlNpemUgPSAxMTsKKyAgICB9IGVsc2UgeworICAgICAgdmFyIHN0eWxlID0gX2NlbGxzLk9mZnNldCgwLCAwKS5TdHlsZTsKKyAgICAgIHJ0LkZvbnROYW1lID0gc3R5bGUuRm9udC5OYW1lOworICAgICAgcnQuU2l6ZSA9IHN0eWxlLkZvbnQuU2l6ZTsKKyAgICAgIHJ0LkJvbGQgPSBzdHlsZS5Gb250LkJvbGQ7CisgICAgICBydC5JdGFsaWMgPSBzdHlsZS5Gb250Lkl0YWxpYzsKKyAgICAgIF9jZWxscy5Jc1JpY2hUZXh0ID0gdHJ1ZTsKKyAgICB9CisgICAgcnQuVGV4dCA9IHRleHQ7CisgICAgcnQuUHJlc2VydmVTcGFjZSA9IHRydWU7CisgICAgaWYgKF9jZWxscyAhPSBudWxsKSB7CisgICAgICBydC5TZXRDYWxsYmFjayhVcGRhdGVDZWxscyk7CisgICAgICBVcGRhdGVDZWxscygpOworICAgIH0KKyAgICBfbGlzdC5BZGQocnQpOworICAgIHJldHVybiBydDsKKyAgfQorCisgIGludGVybmFsIHZvaWQgQ29udmVydFJpY2h0ZXh0KCkgeworICAgIGlmIChfY2VsbHMgPT0gbnVsbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgaXNSdCA9IF9jZWxscy5Xb3Jrc2hlZXQuX2ZsYWdzLkdldEZsYWdWYWx1ZSgKKyAgICAgICAgX2NlbGxzLl9mcm9tUm93LAorICAgICAgICBfY2VsbHMuX2Zyb21Db2wsCisgICAgICAgIENlbGxGbGFncy5SaWNoVGV4dCk7CisgICAgaWYgKENvdW50ID09IDEgJiYgaXNSdCA9PSBmYWxzZSkgeworICAgICAgX2NlbGxzLldvcmtzaGVldC5fZmxhZ3MuU2V0RmxhZ1ZhbHVlKAorICAgICAgICAgIF9jZWxscy5fZnJvbVJvdywKKyAgICAgICAgICBfY2VsbHMuX2Zyb21Db2wsCisgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICBDZWxsRmxhZ3MuUmljaFRleHQpOworICAgICAgdmFyIHMgPSBfY2VsbHMuV29ya3NoZWV0Ll9zdHlsZXMuR2V0VmFsdWUoX2NlbGxzLl9mcm9tUm93LCBfY2VsbHMuX2Zyb21Db2wpOworICAgICAgLy92YXIgZm50ID0gY2VsbC5TdHlsZS5Gb250OworICAgICAgdmFyIGZudCA9IF9jZWxscy5Xb3Jrc2hlZXQuV29ya2Jvb2suU3R5bGVzCisgICAgICAgICAgLkdldFN0eWxlT2JqZWN0KAorICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICBfY2VsbHMuV29ya3NoZWV0LlBvc2l0aW9uSUQsCisgICAgICAgICAgICAgIEV4Y2VsQ2VsbEJhc2UuR2V0QWRkcmVzcyhfY2VsbHMuX2Zyb21Sb3csIF9jZWxscy5fZnJvbUNvbCkpCisgICAgICAgICAgLkZvbnQ7CisgICAgICB0aGlzWzBdLlByZXNlcnZlU3BhY2UgPSB0cnVlOworICAgICAgdGhpc1swXS5Cb2xkID0gZm50LkJvbGQ7CisgICAgICB0aGlzWzBdLkZvbnROYW1lID0gZm50Lk5hbWU7CisgICAgICB0aGlzWzBdLkl0YWxpYyA9IGZudC5JdGFsaWM7CisgICAgICB0aGlzWzBdLlNpemUgPSBmbnQuU2l6ZTsKKyAgICAgIHRoaXNbMF0uVW5kZXJMaW5lID0gZm50LlVuZGVyTGluZTsKKworICAgICAgaW50IGhleDsKKyAgICAgIGlmIChmbnQuQ29sb3IuUmdiICE9ICIiCisgICAgICAgICAgJiYgaW50LlRyeVBhcnNlKGZudC5Db2xvci5SZ2IsIE51bWJlclN0eWxlcy5IZXhOdW1iZXIsIG51bGwsIG91dCBoZXgpKSB7CisgICAgICAgIHRoaXNbMF0uQ29sb3IgPSBDb2xvci5Gcm9tQXJnYihoZXgpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGludGVybmFsIHZvaWQgVXBkYXRlQ2VsbHMoKSB7CisgICAgX2NlbGxzLlNldFZhbHVlUmljaFRleHQoVG9wTm9kZS5Jbm5lclhtbCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDbGVhciB0aGUgY29sbGVjdGlvbgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgdm9pZCBDbGVhcigpIHsKKyAgICBfbGlzdC5DbGVhcigpOworICAgIFRvcE5vZGUuUmVtb3ZlQWxsKCk7CisgICAgVXBkYXRlQ2VsbHMoKTsKKyAgICBpZiAoX2NlbGxzICE9IG51bGwpIHsKKyAgICAgIF9jZWxscy5Jc1JpY2hUZXh0ID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmVtb3ZlcyBhbiBpdGVtIGF0IHRoZSBzcGVjaWZpYyBpbmRleAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgorICBwdWJsaWMgdm9pZCBSZW1vdmVBdChpbnQgaW5kZXgpIHsKKyAgICBUb3BOb2RlLlJlbW92ZUNoaWxkKF9saXN0W2luZGV4XS5Ub3BOb2RlKTsKKyAgICBfbGlzdC5SZW1vdmVBdChpbmRleCk7CisgICAgaWYgKF9jZWxscyAhPSBudWxsICYmIF9saXN0LkNvdW50ID09IDApIHsKKyAgICAgIF9jZWxscy5Jc1JpY2hUZXh0ID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmVtb3ZlcyBhbiBpdGVtCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbSI+PC9wYXJhbT4KKyAgcHVibGljIHZvaWQgUmVtb3ZlKEV4Y2VsUmljaFRleHQgaXRlbSkgeworICAgIFRvcE5vZGUuUmVtb3ZlQ2hpbGQoaXRlbS5Ub3BOb2RlKTsKKyAgICBfbGlzdC5SZW1vdmUoaXRlbSk7CisgICAgaWYgKF9jZWxscyAhPSBudWxsICYmIF9saXN0LkNvdW50ID09IDApIHsKKyAgICAgIF9jZWxscy5Jc1JpY2hUZXh0ID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy9wdWJsaWMgdm9pZCBJbnNlcnQoaW50IGluZGV4LCBzdHJpbmcgVGV4dCkKKyAgLy97CisgIC8vICAgIF9saXN0Lkluc2VydChpbmRleCwgaXRlbSk7CisgIC8vfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSB0ZXh0CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgVGV4dCB7CisgICAgZ2V0IHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gX2xpc3QpIHsKKyAgICAgICAgc2IuQXBwZW5kKGl0ZW0uVGV4dCk7CisgICAgICB9CisgICAgICByZXR1cm4gc2IuVG9TdHJpbmcoKTsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIGlmIChDb3VudCA9PSAwKSB7CisgICAgICAgIEFkZCh2YWx1ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB0aGlzWzBdLlRleHQgPSB2YWx1ZTsKKyAgICAgICAgZm9yIChpbnQgaXggPSAxOyBpeCA8IENvdW50OyBpeCsrKSB7CisgICAgICAgICAgUmVtb3ZlQXQoaXgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgSUVudW1lcmF0b3I8RXhjZWxSaWNoVGV4dD4gSUVudW1lcmFibGU8RXhjZWxSaWNoVGV4dD4uR2V0RW51bWVyYXRvcigpIHsKKyAgICByZXR1cm4gX2xpc3QKKyAgICAgICAgLlNlbGVjdCh4ID0+IHsKKyAgICAgICAgICB4LlNldENhbGxiYWNrKFVwZGF0ZUNlbGxzKTsKKyAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgfSkKKyAgICAgICAgLkdldEVudW1lcmF0b3IoKTsKKyAgfQorCisgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKSB7CisgICAgcmV0dXJuIF9saXN0CisgICAgICAgIC5TZWxlY3QoeCA9PiB7CisgICAgICAgICAgeC5TZXRDYWxsYmFjayhVcGRhdGVDZWxscyk7CisgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgIH0pCisgICAgICAgIC5HZXRFbnVtZXJhdG9yKCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9FeGNlbFJpY2hUZXh0SHRtbFV0aWxpdHkuY3MgYi9FUFBsdXMvU3R5bGUvRXhjZWxSaWNoVGV4dEh0bWxVdGlsaXR5LmNzCmluZGV4IDgyNzQ1NDUuLjgzZTM3YzYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9FeGNlbFJpY2hUZXh0SHRtbFV0aWxpdHkuY3MKKysrIGIvRVBQbHVzL1N0eWxlL0V4Y2VsUmljaFRleHRIdG1sVXRpbGl0eS5jcwpAQCAtMTMsMTg4ICsxMywxNzUgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUmljaGFyZCBUYWxsZW50CQlJbml0aWFsIFJlbGVhc2UJCQkJMjAxMi0wOC0xMwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Cit1c2luZyBTeXN0ZW0uV2ViOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZQotewotCXB1YmxpYyBjbGFzcyBFeGNlbFJpY2hUZXh0SHRtbFV0aWxpdHkKLQl7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZTsKIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBQcm92aWRlcyBiYXNpYyBIVE1MIHN1cHBvcnQgYnkgY29udmVydGluZyB3ZWxsLWJlaGF2ZWQgSFRNTCBpbnRvIGFwcHJvcHJpYXRlIFJpY2hUZXh0IGJsb2Nrcy4KLQkJLy8vIEhUTUwgc3VwcG9ydCBpcyBsaW1pdGVkLCBhbmQgZG9lcyBub3QgaW5jbHVkZSBmb250IGNvbG9ycywgc2l6ZXMsIG9yIHR5cGVmYWNlcyBhdCB0aGlzIHRpbWUsCi0JCS8vLyBhbmQgYWxzbyBkb2VzIG5vdCBzdXBwb3J0IENTUyBzdHlsZSBhdHRyaWJ1dGVzLiBJdCBkb2VzIHN1cHBvcnQgbGluZSBicmVha3MgdXNpbmcgdGhlIEJSIHRhZy4KLQkJLy8vCi0JCS8vLyBUaGlzIHJvdXRpbmUgcGFyc2VzIHRoZSBIVE1MIGludG8gUmVnRXggcGFpcmluZ3Mgb2YgYW4gSFRNTCB0YWcgYW5kIHRoZSB0ZXh0IHVudGlsIHRoZSBORVhUIAotCQkvLy8gdGFnIChpZiBhbnkpLiBUaGUgdGFnIGlzIHBhcnNlZCB0byBkZXRlcm1pbmUgdGhlIHNldHRpbmcgY2hhbmdlIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGxhc3Qgc2V0Ci0JCS8vLyBvZiBzZXR0aW5ncywgYW5kIGlmIHRoZSB0ZXh0IGlzIG5vdCBibGFuaywgYSBuZXcgYmxvY2sgaXMgYWRkZWQgdG8gcmljaCB0ZXh0LgotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InJhbmdlIj48L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9Imh0bWwiPlRoZSBIVE1MIHRvIHBhcnNlIGludG8gUmljaFRleHQ8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9ImRlZmF1bHRGb250TmFtZSI+PC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJkZWZhdWx0Rm9udFNpemUiPjwvcGFyYW0+CitwdWJsaWMgY2xhc3MgRXhjZWxSaWNoVGV4dEh0bWxVdGlsaXR5IHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUHJvdmlkZXMgYmFzaWMgSFRNTCBzdXBwb3J0IGJ5IGNvbnZlcnRpbmcgd2VsbC1iZWhhdmVkIEhUTUwgaW50byBhcHByb3ByaWF0ZSBSaWNoVGV4dCBibG9ja3MuCisgIC8vLyBIVE1MIHN1cHBvcnQgaXMgbGltaXRlZCwgYW5kIGRvZXMgbm90IGluY2x1ZGUgZm9udCBjb2xvcnMsIHNpemVzLCBvciB0eXBlZmFjZXMgYXQgdGhpcyB0aW1lLAorICAvLy8gYW5kIGFsc28gZG9lcyBub3Qgc3VwcG9ydCBDU1Mgc3R5bGUgYXR0cmlidXRlcy4gSXQgZG9lcyBzdXBwb3J0IGxpbmUgYnJlYWtzIHVzaW5nIHRoZSBCUiB0YWcuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIHBhcnNlcyB0aGUgSFRNTCBpbnRvIFJlZ0V4IHBhaXJpbmdzIG9mIGFuIEhUTUwgdGFnIGFuZCB0aGUgdGV4dCB1bnRpbCB0aGUgTkVYVAorICAvLy8gdGFnIChpZiBhbnkpLiBUaGUgdGFnIGlzIHBhcnNlZCB0byBkZXRlcm1pbmUgdGhlIHNldHRpbmcgY2hhbmdlIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGxhc3Qgc2V0CisgIC8vLyBvZiBzZXR0aW5ncywgYW5kIGlmIHRoZSB0ZXh0IGlzIG5vdCBibGFuaywgYSBuZXcgYmxvY2sgaXMgYWRkZWQgdG8gcmljaCB0ZXh0LgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InJhbmdlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Imh0bWwiPlRoZSBIVE1MIHRvIHBhcnNlIGludG8gUmljaFRleHQ8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImRlZmF1bHRGb250TmFtZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJkZWZhdWx0Rm9udFNpemUiPjwvcGFyYW0+CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBTZXRSaWNoVGV4dEZyb21IdG1sKAorICAgICAgRXhjZWxSYW5nZSByYW5nZSwKKyAgICAgIHN0cmluZyBodG1sLAorICAgICAgc3RyaW5nIGRlZmF1bHRGb250TmFtZSwKKyAgICAgIHNob3J0IGRlZmF1bHRGb250U2l6ZSkgeworICAgIC8vIFJlc2V0IHRoZSBjZWxsIHZhbHVlLCBqdXN0IGluIGNhc2UgdGhlcmUgaXMgYW4gZXhpc3RpbmcgUmljaFRleHQgdmFsdWUuCisgICAgcmFuZ2UuVmFsdWUgPSAiIjsKIAotCQlwdWJsaWMgc3RhdGljIHZvaWQgU2V0UmljaFRleHRGcm9tSHRtbChFeGNlbFJhbmdlIHJhbmdlLCBzdHJpbmcgaHRtbCwgc3RyaW5nIGRlZmF1bHRGb250TmFtZSwgc2hvcnQgZGVmYXVsdEZvbnRTaXplKQotCQl7Ci0JCQkvLyBSZXNldCB0aGUgY2VsbCB2YWx1ZSwganVzdCBpbiBjYXNlIHRoZXJlIGlzIGFuIGV4aXN0aW5nIFJpY2hUZXh0IHZhbHVlLgotCQkJcmFuZ2UuVmFsdWUgPSAiIjsKKyAgICAvLyBTYW5pdHkgY2hlY2sgZm9yIGJsYW5rIHZhbHVlcywgc2tpcHMgY3JlYXRpbmcgUmVnZXggb2JqZWN0cyBmb3IgcGVyZm9ybWFuY2UuCisgICAgaWYgKFN0cmluZy5Jc051bGxPckVtcHR5KGh0bWwpKSB7CisgICAgICByYW5nZS5Jc1JpY2hUZXh0ID0gZmFsc2U7CisgICAgICByZXR1cm47CisgICAgfQogCi0JCQkvLyBTYW5pdHkgY2hlY2sgZm9yIGJsYW5rIHZhbHVlcywgc2tpcHMgY3JlYXRpbmcgUmVnZXggb2JqZWN0cyBmb3IgcGVyZm9ybWFuY2UuCi0JCQlpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkoaHRtbCkpCi0JCQl7Ci0JCQkJcmFuZ2UuSXNSaWNoVGV4dCA9IGZhbHNlOwotCQkJCXJldHVybjsKLQkJCX0KKyAgICAvLyBDaGFuZ2UgYWxsIEJSIHRhZ3MgdG8gbGluZSBicmVha3MuIGh0dHA6Ly9lcHBsdXMuY29kZXBsZXguY29tL2Rpc2N1c3Npb25zLzIzODY5Mi8KKyAgICAvLyBDZWxscyB3aXRoIGxpbmUgYnJlYWtzIGFyZW4ndCBuZWNlc3NhcmlseSBjb25zaWRlcmVkIHJpY2ggdGV4dCwgc28gdGhpcyBpcyBwZXJmb3JtZWQKKyAgICAvLyBiZWZvcmUgcGFyc2luZyB0aGUgSFRNTCB0YWdzLgorICAgIGh0bWwgPSBSZWdleC5SZXBsYWNlKAorICAgICAgICBodG1sLAorICAgICAgICAiPGJyW14+XSo+IiwKKyAgICAgICAgIlxyXG4iLAorICAgICAgICBSZWdleE9wdGlvbnMuQ29tcGlsZWQgfCBSZWdleE9wdGlvbnMuSWdub3JlQ2FzZSk7CiAKLQkJCS8vIENoYW5nZSBhbGwgQlIgdGFncyB0byBsaW5lIGJyZWFrcy4gaHR0cDovL2VwcGx1cy5jb2RlcGxleC5jb20vZGlzY3Vzc2lvbnMvMjM4NjkyLwotCQkJLy8gQ2VsbHMgd2l0aCBsaW5lIGJyZWFrcyBhcmVuJ3QgbmVjZXNzYXJpbHkgY29uc2lkZXJlZCByaWNoIHRleHQsIHNvIHRoaXMgaXMgcGVyZm9ybWVkCi0JCQkvLyBiZWZvcmUgcGFyc2luZyB0aGUgSFRNTCB0YWdzLgotCQkJaHRtbCA9IFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9ucy5SZWdleC5SZXBsYWNlKGh0bWwsIEAiPGJyW14+XSo+IiwgIlxyXG4iLCBSZWdleE9wdGlvbnMuQ29tcGlsZWQgfCBSZWdleE9wdGlvbnMuSWdub3JlQ2FzZSk7CisgICAgc3RyaW5nIHRhZzsKKyAgICBzdHJpbmcgdGV4dDsKKyAgICBFeGNlbFJpY2hUZXh0IHRoaXNydCA9IG51bGw7CisgICAgYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKIAotCQkJc3RyaW5nIHRhZzsKLQkJCXN0cmluZyB0ZXh0OwotCQkJRXhjZWxSaWNoVGV4dCB0aGlzcnQgPSBudWxsOwotCQkJYm9vbCBpc0ZpcnN0ID0gdHJ1ZTsKKyAgICAvLyBHZXQgYWxsIHBhaXJzIG9mIGxlZ2l0aW1hdGUgdGFncyBhbmQgdGhlIHRleHQgYmV0d2VlbiB0aGVtLiBUaGlzIGxvb3Agd2lsbAorICAgIC8vIG9ubHkgZXhlY3V0ZSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgc3RhcnQgb3IgZW5kIHRhZy4KKyAgICBmb3JlYWNoIChNYXRjaCBtIGluIFJlZ2V4Lk1hdGNoZXMoCisgICAgICAgIGh0bWwsCisgICAgICAgIEAiPCgvP1thLXpdKylbXjw+XSo+KFtcc1xTXSo/KSg/PTwvP1thLXpdK1tePD5dKj58JCkiLAorICAgICAgICBSZWdleE9wdGlvbnMuQ29tcGlsZWQgfCBSZWdleE9wdGlvbnMuSWdub3JlQ2FzZSkpIHsKKyAgICAgIGlmIChpc0ZpcnN0KSB7CisgICAgICAgIC8vIE9uIHRoZSB2ZXJ5IGZpcnN0IG1hdGNoLCBzZXQgdXAgdGhlIGluaXRpYWwgcmljaCB0ZXh0IG9iamVjdCB3aXRoCisgICAgICAgIC8vIHRoZSBkZWZhdWx0cyBmb3IgdGhlIHRleHQgQkVGT1JFIHRoZSBtYXRjaC4KKyAgICAgICAgcmFuZ2UuSXNSaWNoVGV4dCA9IHRydWU7CisgICAgICAgIHRoaXNydCA9IHJhbmdlLlJpY2hUZXh0LkFkZChDbGVhblRleHQoaHRtbC5TdWJzdHJpbmcoMCwgbS5JbmRleCkpKTsgLy8gTWF5IGJlIDAtbGVuZ3RoCisgICAgICAgIHRoaXNydC5TaXplID0gZGVmYXVsdEZvbnRTaXplOyAvLyBTZXQgdGhlIGRlZmF1bHQgZm9udCBzaXplCisgICAgICAgIHRoaXNydC5Gb250TmFtZSA9IGRlZmF1bHRGb250TmFtZTsgLy8gU2V0IHRoZSBkZWZhdWx0IGZvbnQgbmFtZQorICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBHZXQgdGhlIHRhZyBhbmQgdGhlIGJsb2NrIG9mIHRleHQgdW50aWwgdGhlIE5FWFQgdGFnIG9yIEVPUy4gSWYgdGhlcmUgYXJlIEhUTUwgZW50aXRpZXMKKyAgICAgIC8vIGVuY29kZWQsIHVuZW5jb2RlIHRoZW0sIHRoZXkgc2hvdWxkIGJlIHBhc3NlZCB0byBSaWNoVGV4dCBhcyBub3JtYWwgY2hhcmFjdGVycyAob3RoZXIKKyAgICAgIC8vIHRoYW4gbm9uLWJyZWFraW5nIHNwYWNlcywgd2hpY2ggc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggbm9ybWFsIHNwYWNlcywgdGhleSBicmVhayBFeGNlbC4KKyAgICAgIHRhZyA9IG0uR3JvdXBzWzFdLkNhcHR1cmVzWzBdLlZhbHVlOworICAgICAgdGV4dCA9IENsZWFuVGV4dChtLkdyb3Vwc1syXS5DYXB0dXJlc1swXS5WYWx1ZSk7CiAKLQkJCS8vIEdldCBhbGwgcGFpcnMgb2YgbGVnaXRpbWF0ZSB0YWdzIGFuZCB0aGUgdGV4dCBiZXR3ZWVuIHRoZW0uIFRoaXMgbG9vcCB3aWxsCi0JCQkvLyBvbmx5IGV4ZWN1dGUgaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHN0YXJ0IG9yIGVuZCB0YWcuCi0JCQlmb3JlYWNoIChNYXRjaCBtIGluIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9ucy5SZWdleC5NYXRjaGVzKGh0bWwsIEAiPCgvP1thLXpdKylbXjw+XSo+KFtcc1xTXSo/KSg/PTwvP1thLXpdK1tePD5dKj58JCkiLCBSZWdleE9wdGlvbnMuQ29tcGlsZWQgfCBSZWdleE9wdGlvbnMuSWdub3JlQ2FzZSkpCi0JCQl7Ci0JCQkJaWYgKGlzRmlyc3QpCi0JCQkJewotCQkJCQkvLyBPbiB0aGUgdmVyeSBmaXJzdCBtYXRjaCwgc2V0IHVwIHRoZSBpbml0aWFsIHJpY2ggdGV4dCBvYmplY3Qgd2l0aAotCQkJCQkvLyB0aGUgZGVmYXVsdHMgZm9yIHRoZSB0ZXh0IEJFRk9SRSB0aGUgbWF0Y2guCi0JCQkJCXJhbmdlLklzUmljaFRleHQgPSB0cnVlOwotCQkJCQl0aGlzcnQgPSByYW5nZS5SaWNoVGV4dC5BZGQoQ2xlYW5UZXh0KGh0bWwuU3Vic3RyaW5nKDAsIG0uSW5kZXgpKSk7CS8vIE1heSBiZSAwLWxlbmd0aAotCQkJCQl0aGlzcnQuU2l6ZSA9IGRlZmF1bHRGb250U2l6ZTsJCQkJCQkJCQkJLy8gU2V0IHRoZSBkZWZhdWx0IGZvbnQgc2l6ZQotCQkJCQl0aGlzcnQuRm9udE5hbWUgPSBkZWZhdWx0Rm9udE5hbWU7CQkJCQkJCQkJLy8gU2V0IHRoZSBkZWZhdWx0IGZvbnQgbmFtZQotCQkJCQlpc0ZpcnN0ID0gZmFsc2U7Ci0JCQkJfQotCQkJCS8vIEdldCB0aGUgdGFnIGFuZCB0aGUgYmxvY2sgb2YgdGV4dCB1bnRpbCB0aGUgTkVYVCB0YWcgb3IgRU9TLiBJZiB0aGVyZSBhcmUgSFRNTCBlbnRpdGllcwotCQkJCS8vIGVuY29kZWQsIHVuZW5jb2RlIHRoZW0sIHRoZXkgc2hvdWxkIGJlIHBhc3NlZCB0byBSaWNoVGV4dCBhcyBub3JtYWwgY2hhcmFjdGVycyAob3RoZXIKLQkJCQkvLyB0aGFuIG5vbi1icmVha2luZyBzcGFjZXMsIHdoaWNoIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIG5vcm1hbCBzcGFjZXMsIHRoZXkgYnJlYWsgRXhjZWwuCi0JCQkJdGFnID0gbS5Hcm91cHNbMV0uQ2FwdHVyZXNbMF0uVmFsdWU7Ci0JCQkJdGV4dCA9IENsZWFuVGV4dChtLkdyb3Vwc1syXS5DYXB0dXJlc1swXS5WYWx1ZSk7CisgICAgICBpZiAodGhpc3J0LlRleHQgPT0gIiIpIHsKKyAgICAgICAgLy8gVGhlIG1vc3QgcmVjZW50IHJpY2ggdGV4dCBibG9jayB3YXNuJ3QgKmFjdHVhbGx5KiB1c2VkIGxhc3QgdGltZSBhcm91bmQsIHNvIHVwZGF0ZQorICAgICAgICAvLyB0aGUgdGV4dCBhbmQga2VlcCBpdCBhcyB0aGUgImN1cnJlbnQiIGJsb2NrLiBUaGlzIGhhcHBlbnMgd2l0aCB0aGUgZmlyc3QgYmxvY2sgaWYKKyAgICAgICAgLy8gaXQgc3RhcnRzIHdpdGggYSB0YWcsIGFuZCBtYXkgaGFwcGVuIGxhdGVyIGlmIHRhZ3MgY29tZSBvbmUgcmlnaHQgYWZ0ZXIgdGhlIG90aGVyLgorICAgICAgICB0aGlzcnQuVGV4dCA9IHRleHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBUaGUgY3VycmVudCByaWNoIHRleHQgYmxvY2sgaGFzIHNvbWUgdGV4dCwgc28gY3JlYXRlIGEgbmV3IG9uZS4gUmljaFRleHQuQWRkKCkKKyAgICAgICAgLy8gYXV0b21hdGljYWxseSBhcHBsaWVzIHRoZSBzZXR0aW5ncyBmcm9tIHRoZSBwcmV2aW91cyBibG9jaywgb3RoZXIgdGhhbiB2ZXJ0aWNhbAorICAgICAgICAvLyBhbGlnbm1lbnQuCisgICAgICAgIHRoaXNydCA9IHJhbmdlLlJpY2hUZXh0LkFkZCh0ZXh0KTsKKyAgICAgIH0KKyAgICAgIC8vIE92ZXJyaWRlIHRoZSBzZXR0aW5ncyBiYXNlZCBvbiB0aGUgY3VycmVudCB0YWcsIGtlZXAgYWxsIG90aGVyIHNldHRpbmdzLgorICAgICAgU2V0U3R5bGVGcm9tVGFnKHRhZywgdGhpc3J0KTsKKyAgICB9CiAKLQkJCQlpZiAodGhpc3J0LlRleHQgPT0gIiIpCi0JCQkJewotCQkJCQkvLyBUaGUgbW9zdCByZWNlbnQgcmljaCB0ZXh0IGJsb2NrIHdhc24ndCAqYWN0dWFsbHkqIHVzZWQgbGFzdCB0aW1lIGFyb3VuZCwgc28gdXBkYXRlCi0JCQkJCS8vIHRoZSB0ZXh0IGFuZCBrZWVwIGl0IGFzIHRoZSAiY3VycmVudCIgYmxvY2suIFRoaXMgaGFwcGVucyB3aXRoIHRoZSBmaXJzdCBibG9jayBpZgotCQkJCQkvLyBpdCBzdGFydHMgd2l0aCBhIHRhZywgYW5kIG1heSBoYXBwZW4gbGF0ZXIgaWYgdGFncyBjb21lIG9uZSByaWdodCBhZnRlciB0aGUgb3RoZXIuCi0JCQkJCXRoaXNydC5UZXh0ID0gdGV4dDsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJLy8gVGhlIGN1cnJlbnQgcmljaCB0ZXh0IGJsb2NrIGhhcyBzb21lIHRleHQsIHNvIGNyZWF0ZSBhIG5ldyBvbmUuIFJpY2hUZXh0LkFkZCgpCi0JCQkJCS8vIGF1dG9tYXRpY2FsbHkgYXBwbGllcyB0aGUgc2V0dGluZ3MgZnJvbSB0aGUgcHJldmlvdXMgYmxvY2ssIG90aGVyIHRoYW4gdmVydGljYWwKLQkJCQkJLy8gYWxpZ25tZW50LgotCQkJCQl0aGlzcnQgPSByYW5nZS5SaWNoVGV4dC5BZGQodGV4dCk7Ci0JCQkJfQotCQkJCS8vIE92ZXJyaWRlIHRoZSBzZXR0aW5ncyBiYXNlZCBvbiB0aGUgY3VycmVudCB0YWcsIGtlZXAgYWxsIG90aGVyIHNldHRpbmdzLgotCQkJCVNldFN0eWxlRnJvbVRhZyh0YWcsIHRoaXNydCk7Ci0JCQl9CisgICAgaWYgKHRoaXNydCA9PSBudWxsKSB7CisgICAgICAvLyBObyBIVE1MIHRhZ3Mgd2VyZSBmb3VuZCwgc28gdHJlYXQgdGhpcyBhcyBhIG5vcm1hbCB0ZXh0IHZhbHVlLgorICAgICAgcmFuZ2UuSXNSaWNoVGV4dCA9IGZhbHNlOworICAgICAgcmFuZ2UuVmFsdWUgPSBDbGVhblRleHQoaHRtbCk7CisgICAgfSBlbHNlIGlmIChTdHJpbmcuSXNOdWxsT3JFbXB0eSh0aGlzcnQuVGV4dCkpIHsKKyAgICAgIC8vIFJpY2ggdGV4dCB3YXMgZm91bmQsIGJ1dCB0aGUgbGFzdCBub2RlIGNvbnRhaW5zIG5vIHRleHQsIHNvIHJlbW92ZSBpdC4gVGhpcyBjYW4gaGFwcGVuIGlmLAorICAgICAgLy8gc2F5LCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgaXMgYW4gZW5kIHRhZyBvciB1bnN1cHBvcnRlZCB0YWcgKGNvbW1vbikuCisgICAgICByYW5nZS5SaWNoVGV4dC5SZW1vdmUodGhpc3J0KTsKIAotCQkJaWYgKHRoaXNydCA9PSBudWxsKQotCQkJewotCQkJCS8vIE5vIEhUTUwgdGFncyB3ZXJlIGZvdW5kLCBzbyB0cmVhdCB0aGlzIGFzIGEgbm9ybWFsIHRleHQgdmFsdWUuCi0JCQkJcmFuZ2UuSXNSaWNoVGV4dCA9IGZhbHNlOwotCQkJCXJhbmdlLlZhbHVlID0gQ2xlYW5UZXh0KGh0bWwpOwotCQkJfQotCQkJZWxzZSBpZiAoU3RyaW5nLklzTnVsbE9yRW1wdHkodGhpc3J0LlRleHQpKQotCQkJewotCQkJCS8vIFJpY2ggdGV4dCB3YXMgZm91bmQsIGJ1dCB0aGUgbGFzdCBub2RlIGNvbnRhaW5zIG5vIHRleHQsIHNvIHJlbW92ZSBpdC4gVGhpcyBjYW4gaGFwcGVuIGlmLAotCQkJCS8vIHNheSwgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIGlzIGFuIGVuZCB0YWcgb3IgdW5zdXBwb3J0ZWQgdGFnIChjb21tb24pLgotCQkJCXJhbmdlLlJpY2hUZXh0LlJlbW92ZSh0aGlzcnQpOworICAgICAgLy8gRmFpbHNhZmUgLS0gdGhlIEhUTUwgbWF5IGJlIGp1c3QgdGFncywgbm8gdGV4dCwgaW4gd2hpY2ggY2FzZSB0aGVyZSBtYXkgYmUgbm8gcmljaCB0ZXh0CisgICAgICAvLyBkaXJlY3RpdmVzIHRoYXQgcmVtYWluLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCB0dXJuIG9mZiByaWNoIHRleHQgYW5kIHRyZWF0IHRoaXMgbGlrZSBhIGJsYW5rCisgICAgICAvLyBjZWxsIHZhbHVlLgorICAgICAgaWYgKHJhbmdlLlJpY2hUZXh0LkNvdW50ID09IDApIHsKKyAgICAgICAgcmFuZ2UuSXNSaWNoVGV4dCA9IGZhbHNlOworICAgICAgICByYW5nZS5WYWx1ZSA9ICIiOworICAgICAgfQorICAgIH0KKyAgfQogCi0JCQkJLy8gRmFpbHNhZmUgLS0gdGhlIEhUTUwgbWF5IGJlIGp1c3QgdGFncywgbm8gdGV4dCwgaW4gd2hpY2ggY2FzZSB0aGVyZSBtYXkgYmUgbm8gcmljaCB0ZXh0Ci0JCQkJLy8gZGlyZWN0aXZlcyB0aGF0IHJlbWFpbi4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgdHVybiBvZmYgcmljaCB0ZXh0IGFuZCB0cmVhdCB0aGlzIGxpa2UgYSBibGFuawotCQkJCS8vIGNlbGwgdmFsdWUuCi0JCQkJaWYgKHJhbmdlLlJpY2hUZXh0LkNvdW50ID09IDApCi0JCQkJewotCQkJCQlyYW5nZS5Jc1JpY2hUZXh0ID0gZmFsc2U7Ci0JCQkJCXJhbmdlLlZhbHVlID0gIiI7Ci0JCQkJfQorICBwcml2YXRlIHN0YXRpYyB2b2lkIFNldFN0eWxlRnJvbVRhZyhzdHJpbmcgdGFnLCBFeGNlbFJpY2hUZXh0IHNldHRpbmdzKSB7CisgICAgc3dpdGNoICh0YWcuVG9Mb3dlcigpKSB7CisgICAgICBjYXNlICJiIjoKKyAgICAgIGNhc2UgInN0cm9uZyI6CisgICAgICAgIHNldHRpbmdzLkJvbGQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgImkiOgorICAgICAgY2FzZSAiZW0iOgorICAgICAgICBzZXR0aW5ncy5JdGFsaWMgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgInUiOgorICAgICAgICBzZXR0aW5ncy5VbmRlckxpbmUgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgInMiOgorICAgICAgY2FzZSAic3RyaWtlIjoKKyAgICAgICAgc2V0dGluZ3MuU3RyaWtlID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICJzdXAiOgorICAgICAgICBzZXR0aW5ncy5WZXJ0aWNhbEFsaWduID0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQuU3VwZXJzY3JpcHQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAic3ViIjoKKyAgICAgICAgc2V0dGluZ3MuVmVydGljYWxBbGlnbiA9IEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250LlN1YnNjcmlwdDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICIvYiI6CisgICAgICBjYXNlICIvc3Ryb25nIjoKKyAgICAgICAgc2V0dGluZ3MuQm9sZCA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgIi9pIjoKKyAgICAgIGNhc2UgIi9lbSI6CisgICAgICAgIHNldHRpbmdzLkl0YWxpYyA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgIi91IjoKKyAgICAgICAgc2V0dGluZ3MuVW5kZXJMaW5lID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAiL3MiOgorICAgICAgY2FzZSAiL3N0cmlrZSI6CisgICAgICAgIHNldHRpbmdzLlN0cmlrZSA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgIi9zdXAiOgorICAgICAgY2FzZSAiL3N1YiI6CisgICAgICAgIHNldHRpbmdzLlZlcnRpY2FsQWxpZ24gPSBFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udC5Ob25lOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KIAotCQkJfQotCi0JCX0KLQotCQlwcml2YXRlIHN0YXRpYyB2b2lkIFNldFN0eWxlRnJvbVRhZyhzdHJpbmcgdGFnLCBFeGNlbFJpY2hUZXh0IHNldHRpbmdzKQotCQl7Ci0JCQlzd2l0Y2ggKHRhZy5Ub0xvd2VyKCkpCi0JCQl7Ci0JCQkJY2FzZSAiYiI6Ci0JCQkJY2FzZSAic3Ryb25nIjoKLQkJCQkJc2V0dGluZ3MuQm9sZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgImkiOgotCQkJCWNhc2UgImVtIjoKLQkJCQkJc2V0dGluZ3MuSXRhbGljID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAidSI6Ci0JCQkJCXNldHRpbmdzLlVuZGVyTGluZSA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgInMiOgotCQkJCWNhc2UgInN0cmlrZSI6Ci0JCQkJCXNldHRpbmdzLlN0cmlrZSA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgInN1cCI6Ci0JCQkJCXNldHRpbmdzLlZlcnRpY2FsQWxpZ24gPSBFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udC5TdXBlcnNjcmlwdDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAic3ViIjoKLQkJCQkJc2V0dGluZ3MuVmVydGljYWxBbGlnbiA9IEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250LlN1YnNjcmlwdDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAiL2IiOgotCQkJCWNhc2UgIi9zdHJvbmciOgotCQkJCQlzZXR0aW5ncy5Cb2xkID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgIi9pIjoKLQkJCQljYXNlICIvZW0iOgotCQkJCQlzZXR0aW5ncy5JdGFsaWMgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAiL3UiOgotCQkJCQlzZXR0aW5ncy5VbmRlckxpbmUgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAiL3MiOgotCQkJCWNhc2UgIi9zdHJpa2UiOgotCQkJCQlzZXR0aW5ncy5TdHJpa2UgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAiL3N1cCI6Ci0JCQkJY2FzZSAiL3N1YiI6Ci0JCQkJCXNldHRpbmdzLlZlcnRpY2FsQWxpZ24gPSBFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udC5Ob25lOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQkvLyB1bnN1cHBvcnRlZCBIVE1MLCBubyBzdHlsZSBjaGFuZ2UKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHN0YXRpYyBzdHJpbmcgQ2xlYW5UZXh0KHN0cmluZyBzKQotCQl7Ci0JCQkvLyBOZWVkIHRvIGNvbnZlcnQgSFRNTCBlbnRpdGllcyAobmFtZWQgb3IgbnVtYmVyZWQpIGludG8gYWN0dWFsIFVuaWNvZGUgY2hhcmFjdGVycwotCQkJcyA9IFN5c3RlbS5XZWIuSHR0cFV0aWxpdHkuSHRtbERlY29kZShzKTsKLQkJCS8vIFJlbW92ZSBhbnkgbm9uLWJyZWFraW5nIHNwYWNlcywga2lsbHMgRXhjZWwKLQkJCXMgPSBzLlJlcGxhY2UoIlx1MDBBMCIsICIgIik7Ci0JCQlyZXR1cm4gczsKLQkJfQotCi0JfQorICBwcml2YXRlIHN0YXRpYyBzdHJpbmcgQ2xlYW5UZXh0KHN0cmluZyBzKSB7CisgICAgLy8gTmVlZCB0byBjb252ZXJ0IEhUTUwgZW50aXRpZXMgKG5hbWVkIG9yIG51bWJlcmVkKSBpbnRvIGFjdHVhbCBVbmljb2RlIGNoYXJhY3RlcnMKKyAgICBzID0gSHR0cFV0aWxpdHkuSHRtbERlY29kZShzKTsKKyAgICAvLyBSZW1vdmUgYW55IG5vbi1icmVha2luZyBzcGFjZXMsIGtpbGxzIEV4Y2VsCisgICAgcyA9IHMuUmVwbGFjZSgiXHUwMEEwIiwgIiAiKTsKKyAgICByZXR1cm4gczsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0V4Y2VsU3R5bGUuY3MgYi9FUFBsdXMvU3R5bGUvRXhjZWxTdHlsZS5jcwppbmRleCBhM2VkYWFlLi5mOWFkOTQzIDEwMDY0NAotLS0gYS9FUFBsdXMvU3R5bGUvRXhjZWxTdHlsZS5jcworKysgYi9FUFBsdXMvU3R5bGUvRXhjZWxTdHlsZS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMjQwICsxMywyMTYgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRvcGxldmVsIGNsYXNzIGZvciBjZWxsIHN0eWxpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxTdHlsZSA6IFN0eWxlQmFzZQotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxTdHlsZShFeGNlbFN0eWxlcyBzdHlsZXMsIE9mZmljZU9wZW5YbWwuWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgQ2hhbmdlZEV2ZW50LCBpbnQgcG9zaXRpb25JRCwgc3RyaW5nIEFkZHJlc3MsIGludCB4ZnNJZCkgOgotICAgICAgICAgICAgYmFzZShzdHlsZXMsIENoYW5nZWRFdmVudCwgcG9zaXRpb25JRCwgQWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgSW5kZXggPSB4ZnNJZDsKLSAgICAgICAgICAgIEV4Y2VsWGZzIHhmczsKLSAgICAgICAgICAgIGlmIChwb3NpdGlvbklEID4gLTEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeGZzID0gX3N0eWxlcy5DZWxsWGZzW3hmc0lkXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4ZnMgPSBfc3R5bGVzLkNlbGxTdHlsZVhmc1t4ZnNJZF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHlsZXMgPSBzdHlsZXM7Ci0gICAgICAgICAgICBQb3NpdGlvbklEID0gcG9zaXRpb25JRDsKLSAgICAgICAgICAgIE51bWJlcmZvcm1hdCA9IG5ldyBFeGNlbE51bWJlckZvcm1hdChzdHlsZXMsIENoYW5nZWRFdmVudCwgUG9zaXRpb25JRCwgQWRkcmVzcywgeGZzLk51bWJlckZvcm1hdElkKTsKLSAgICAgICAgICAgIEZvbnQgPSBuZXcgRXhjZWxGb250KHN0eWxlcywgQ2hhbmdlZEV2ZW50LCBQb3NpdGlvbklELCBBZGRyZXNzLCB4ZnMuRm9udElkKTsKLSAgICAgICAgICAgIEZpbGwgPSBuZXcgRXhjZWxGaWxsKHN0eWxlcywgQ2hhbmdlZEV2ZW50LCBQb3NpdGlvbklELCBBZGRyZXNzLCB4ZnMuRmlsbElkKTsKLSAgICAgICAgICAgIEJvcmRlciA9IG5ldyBCb3JkZXIoc3R5bGVzLCBDaGFuZ2VkRXZlbnQsIFBvc2l0aW9uSUQsIEFkZHJlc3MsIHhmcy5Cb3JkZXJJZCk7IAotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE51bWJlcmZvcm1hdAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxOdW1iZXJGb3JtYXQgTnVtYmVyZm9ybWF0IHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRm9udCBzdHlsaW5nCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEZvbnQgRm9udCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZpbGwgU3R5bGluZwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxGaWxsIEZpbGwgeyBnZXQ7IHNldDsgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBCb3JkZXIgCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBCb3JkZXIgQm9yZGVyIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGhvcml6b250YWwgYWxpZ25tZW50IGluIHRoZSBjZWxsCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQgSG9yaXpvbnRhbEFsaWdubWVudAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5DZWxsWGZzW0luZGV4XS5Ib3Jpem9udGFsQWxpZ25tZW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuU3R5bGUsIGVTdHlsZVByb3BlcnR5Lkhvcml6b250YWxBbGlnbiwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgaW4gdGhlIGNlbGwKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsVmVydGljYWxBbGlnbm1lbnQgVmVydGljYWxBbGlnbm1lbnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQ2VsbFhmc1tJbmRleF0uVmVydGljYWxBbGlnbm1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5TdHlsZSwgZVN0eWxlUHJvcGVydHkuVmVydGljYWxBbGlnbiwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdyYXAgdGhlIHRleHQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgV3JhcFRleHQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQ2VsbFhmc1tJbmRleF0uV3JhcFRleHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5TdHlsZSwgZVN0eWxlUHJvcGVydHkuV3JhcFRleHQsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZWFkaW5nb3JkZXIKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsUmVhZGluZ09yZGVyIFJlYWRpbmdPcmRlcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5DZWxsWGZzW0luZGV4XS5SZWFkaW5nT3JkZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5TdHlsZSwgZVN0eWxlUHJvcGVydHkuUmVhZGluZ09yZGVyLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2hyaW5rIHRoZSB0ZXh0IHRvIGZpdAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaHJpbmtUb0ZpdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5DZWxsWGZzW0luZGV4XS5TaHJpbmtUb0ZpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQodGhpcywgbmV3IFN0eWxlQ2hhbmdlRXZlbnRBcmdzKGVTdHlsZUNsYXNzLlN0eWxlLCBlU3R5bGVQcm9wZXJ0eS5TaHJpbmtUb0ZpdCwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBtYXJnaW4gYmV0d2VlbiB0aGUgYm9yZGVyIGFuZCB0aGUgdGV4dAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IEluZGVudAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5DZWxsWGZzW0luZGV4XS5JbmRlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPDAgfHwgdmFsdWUgPiAyNTApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJJbmRlbnQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1MCIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuU3R5bGUsIGVTdHlsZVByb3BlcnR5LkluZGVudCwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRleHQgb3JpZW50YXRpb24gaW4gZGVncmVlcy4gVmFsdWVzIHJhbmdlIGZyb20gMCB0byAxODAuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgVGV4dFJvdGF0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkNlbGxYZnNbSW5kZXhdLlRleHRSb3RhdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxODApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJUZXh0Um90YXRpb24gb3V0IG9mIHJhbmdlLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5TdHlsZSwgZVN0eWxlUHJvcGVydHkuVGV4dFJvdGF0aW9uLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSWYgdHJ1ZSB0aGUgY2VsbCBpcyBsb2NrZWQgZm9yIGVkaXRpbmcgd2hlbiB0aGUgc2hlZXQgaXMgcHJvdGVjdGVkCi0gICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJFeGNlbFdvcmtzaGVldC5Qcm90ZWN0aW9uIi8+Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIExvY2tlZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5DZWxsWGZzW0luZGV4XS5Mb2NrZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5TdHlsZSwgZVN0eWxlUHJvcGVydHkuTG9ja2VkLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSWYgdHJ1ZSB0aGUgZm9ybXVsYSBpcyBoaWRkZW4gd2hlbiB0aGUgc2hlZXQgaXMgcHJvdGVjdGVkLgotICAgICAgICAvLy8gPHNlZWFsc28gY3JlZj0iRXhjZWxXb3Jrc2hlZXQuUHJvdGVjdGlvbiIvPgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBIaWRkZW4KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuQ2VsbFhmc1tJbmRleF0uSGlkZGVuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX0NoYW5nZWRFdmVudCh0aGlzLCBuZXcgU3R5bGVDaGFuZ2VFdmVudEFyZ3MoZVN0eWxlQ2xhc3MuU3R5bGUsIGVTdHlsZVByb3BlcnR5LkhpZGRlbiwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZTsKIAotCi0gICAgICAgIGNvbnN0IHN0cmluZyB4ZklkUGF0aCA9ICJAeGZJZCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBpbmRleCBpbiB0aGUgc3R5bGUgY29sbGVjdGlvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IFhmSWQgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkNlbGxYZnNbSW5kZXhdLlhmSWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfQ2hhbmdlZEV2ZW50KHRoaXMsIG5ldyBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcy5TdHlsZSwgZVN0eWxlUHJvcGVydHkuWGZJZCwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGludCBQb3NpdGlvbklECi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbFN0eWxlcyBTdHlsZXMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgc2V0OwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgCi0gICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgIHJldHVybiBOdW1iZXJmb3JtYXQuSWQgKyAifCIgKyBGb250LklkICsgInwiICsgRmlsbC5JZCArICJ8IiArIEJvcmRlci5JZCArICJ8IiArIFZlcnRpY2FsQWxpZ25tZW50ICsgInwiICsgSG9yaXpvbnRhbEFsaWdubWVudCArICJ8IiArIFdyYXBUZXh0LlRvU3RyaW5nKCkgKyAifCIgKyBSZWFkaW5nT3JkZXIuVG9TdHJpbmcoKSArICJ8IiArIFhmSWQuVG9TdHJpbmcoKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQorLy8vIDxzdW1tYXJ5PgorLy8vIFRvcGxldmVsIGNsYXNzIGZvciBjZWxsIHN0eWxpbmcKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsU3R5bGUgOiBTdHlsZUJhc2UgeworICBpbnRlcm5hbCBFeGNlbFN0eWxlKAorICAgICAgRXhjZWxTdHlsZXMgc3R5bGVzLAorICAgICAgWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgY2hhbmdlZEV2ZW50LAorICAgICAgaW50IHBvc2l0aW9uSWQsCisgICAgICBzdHJpbmcgYWRkcmVzcywKKyAgICAgIGludCB4ZnNJZCkKKyAgICAgIDogYmFzZShzdHlsZXMsIGNoYW5nZWRFdmVudCwgcG9zaXRpb25JZCwgYWRkcmVzcykgeworICAgIEluZGV4ID0geGZzSWQ7CisgICAgRXhjZWxYZnMgeGZzOworICAgIGlmIChwb3NpdGlvbklkID4gLTEpIHsKKyAgICAgIHhmcyA9IF9zdHlsZXMuQ2VsbFhmc1t4ZnNJZF07CisgICAgfSBlbHNlIHsKKyAgICAgIHhmcyA9IF9zdHlsZXMuQ2VsbFN0eWxlWGZzW3hmc0lkXTsKICAgICB9CisgICAgU3R5bGVzID0gc3R5bGVzOworICAgIFBvc2l0aW9uSUQgPSBwb3NpdGlvbklkOworICAgIE51bWJlcmZvcm1hdCA9IG5ldyhzdHlsZXMsIGNoYW5nZWRFdmVudCwgUG9zaXRpb25JRCwgYWRkcmVzcywgeGZzLk51bWJlckZvcm1hdElkKTsKKyAgICBGb250ID0gbmV3KHN0eWxlcywgY2hhbmdlZEV2ZW50LCBQb3NpdGlvbklELCBhZGRyZXNzLCB4ZnMuRm9udElkKTsKKyAgICBGaWxsID0gbmV3KHN0eWxlcywgY2hhbmdlZEV2ZW50LCBQb3NpdGlvbklELCBhZGRyZXNzLCB4ZnMuRmlsbElkKTsKKyAgICBCb3JkZXIgPSBuZXcoc3R5bGVzLCBjaGFuZ2VkRXZlbnQsIFBvc2l0aW9uSUQsIGFkZHJlc3MsIHhmcy5Cb3JkZXJJZCk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOdW1iZXJmb3JtYXQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsTnVtYmVyRm9ybWF0IE51bWJlcmZvcm1hdCB7IGdldDsgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRm9udCBzdHlsaW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEZvbnQgRm9udCB7IGdldDsgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRmlsbCBTdHlsaW5nCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEZpbGwgRmlsbCB7IGdldDsgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQm9yZGVyCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBCb3JkZXIgQm9yZGVyIHsgZ2V0OyBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgaG9yaXpvbnRhbCBhbGlnbm1lbnQgaW4gdGhlIGNlbGwKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudCBIb3Jpem9udGFsQWxpZ25tZW50IHsKKyAgICBnZXQgPT4gX3N0eWxlcy5DZWxsWGZzW0luZGV4XS5Ib3Jpem9udGFsQWxpZ25tZW50OworICAgIHNldCA9PgorICAgICAgX0NoYW5nZWRFdmVudCgKKyAgICAgICAgICB0aGlzLAorICAgICAgICAgIG5ldyhlU3R5bGVDbGFzcy5TdHlsZSwgZVN0eWxlUHJvcGVydHkuSG9yaXpvbnRhbEFsaWduLCB2YWx1ZSwgX3Bvc2l0aW9uSUQsIF9hZGRyZXNzKSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgdmVydGljYWwgYWxpZ25tZW50IGluIHRoZSBjZWxsCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFZlcnRpY2FsQWxpZ25tZW50IFZlcnRpY2FsQWxpZ25tZW50IHsKKyAgICBnZXQgPT4gX3N0eWxlcy5DZWxsWGZzW0luZGV4XS5WZXJ0aWNhbEFsaWdubWVudDsKKyAgICBzZXQgPT4KKyAgICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgICAgdGhpcywKKyAgICAgICAgICBuZXcoZVN0eWxlQ2xhc3MuU3R5bGUsIGVTdHlsZVByb3BlcnR5LlZlcnRpY2FsQWxpZ24sIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFdyYXAgdGhlIHRleHQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgV3JhcFRleHQgeworICAgIGdldCA9PiBfc3R5bGVzLkNlbGxYZnNbSW5kZXhdLldyYXBUZXh0OworICAgIHNldCA9PgorICAgICAgX0NoYW5nZWRFdmVudCgKKyAgICAgICAgICB0aGlzLAorICAgICAgICAgIG5ldyhlU3R5bGVDbGFzcy5TdHlsZSwgZVN0eWxlUHJvcGVydHkuV3JhcFRleHQsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJlYWRpbmdvcmRlcgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxSZWFkaW5nT3JkZXIgUmVhZGluZ09yZGVyIHsKKyAgICBnZXQgPT4gX3N0eWxlcy5DZWxsWGZzW0luZGV4XS5SZWFkaW5nT3JkZXI7CisgICAgc2V0ID0+CisgICAgICBfQ2hhbmdlZEV2ZW50KAorICAgICAgICAgIHRoaXMsCisgICAgICAgICAgbmV3KGVTdHlsZUNsYXNzLlN0eWxlLCBlU3R5bGVQcm9wZXJ0eS5SZWFkaW5nT3JkZXIsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNocmluayB0aGUgdGV4dCB0byBmaXQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgU2hyaW5rVG9GaXQgeworICAgIGdldCA9PiBfc3R5bGVzLkNlbGxYZnNbSW5kZXhdLlNocmlua1RvRml0OworICAgIHNldCA9PgorICAgICAgX0NoYW5nZWRFdmVudCgKKyAgICAgICAgICB0aGlzLAorICAgICAgICAgIG5ldyhlU3R5bGVDbGFzcy5TdHlsZSwgZVN0eWxlUHJvcGVydHkuU2hyaW5rVG9GaXQsIHZhbHVlLCBfcG9zaXRpb25JRCwgX2FkZHJlc3MpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBtYXJnaW4gYmV0d2VlbiB0aGUgYm9yZGVyIGFuZCB0aGUgdGV4dAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IEluZGVudCB7CisgICAgZ2V0ID0+IF9zdHlsZXMuQ2VsbFhmc1tJbmRleF0uSW5kZW50OworICAgIHNldCB7CisgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMjUwKSB7CisgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJJbmRlbnQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDI1MCIpKTsKKyAgICAgIH0KKyAgICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgICAgdGhpcywKKyAgICAgICAgICBuZXcoZVN0eWxlQ2xhc3MuU3R5bGUsIGVTdHlsZVByb3BlcnR5LkluZGVudCwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRleHQgb3JpZW50YXRpb24gaW4gZGVncmVlcy4gVmFsdWVzIHJhbmdlIGZyb20gMCB0byAxODAuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgVGV4dFJvdGF0aW9uIHsKKyAgICBnZXQgPT4gX3N0eWxlcy5DZWxsWGZzW0luZGV4XS5UZXh0Um90YXRpb247CisgICAgc2V0IHsKKyAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiAxODApIHsKKyAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiVGV4dFJvdGF0aW9uIG91dCBvZiByYW5nZS4iKTsKKyAgICAgIH0KKyAgICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgICAgdGhpcywKKyAgICAgICAgICBuZXcoZVN0eWxlQ2xhc3MuU3R5bGUsIGVTdHlsZVByb3BlcnR5LlRleHRSb3RhdGlvbiwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElmIHRydWUgdGhlIGNlbGwgaXMgbG9ja2VkIGZvciBlZGl0aW5nIHdoZW4gdGhlIHNoZWV0IGlzIHByb3RlY3RlZAorICAvLy8gPHNlZWFsc28gY3JlZj0iRXhjZWxXb3Jrc2hlZXQuUHJvdGVjdGlvbiIvPgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBMb2NrZWQgeworICAgIGdldCA9PiBfc3R5bGVzLkNlbGxYZnNbSW5kZXhdLkxvY2tlZDsKKyAgICBzZXQgPT4KKyAgICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgICAgdGhpcywKKyAgICAgICAgICBuZXcoZVN0eWxlQ2xhc3MuU3R5bGUsIGVTdHlsZVByb3BlcnR5LkxvY2tlZCwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdHJ1ZSB0aGUgZm9ybXVsYSBpcyBoaWRkZW4gd2hlbiB0aGUgc2hlZXQgaXMgcHJvdGVjdGVkLgorICAvLy8gPHNlZWFsc28gY3JlZj0iRXhjZWxXb3Jrc2hlZXQuUHJvdGVjdGlvbiIvPgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBIaWRkZW4geworICAgIGdldCA9PiBfc3R5bGVzLkNlbGxYZnNbSW5kZXhdLkhpZGRlbjsKKyAgICBzZXQgPT4KKyAgICAgIF9DaGFuZ2VkRXZlbnQoCisgICAgICAgICAgdGhpcywKKyAgICAgICAgICBuZXcoZVN0eWxlQ2xhc3MuU3R5bGUsIGVTdHlsZVByb3BlcnR5LkhpZGRlbiwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3hmSWRQYXRoID0gIkB4ZklkIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgaW5kZXggaW4gdGhlIHN0eWxlIGNvbGxlY3Rpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBYZklkIHsKKyAgICBnZXQgPT4gX3N0eWxlcy5DZWxsWGZzW0luZGV4XS5YZklkOworICAgIHNldCA9PgorICAgICAgX0NoYW5nZWRFdmVudCgKKyAgICAgICAgICB0aGlzLAorICAgICAgICAgIG5ldyhlU3R5bGVDbGFzcy5TdHlsZSwgZVN0eWxlUHJvcGVydHkuWGZJZCwgdmFsdWUsIF9wb3NpdGlvbklELCBfYWRkcmVzcykpOworICB9CisKKyAgaW50ZXJuYWwgaW50IFBvc2l0aW9uSUQgeyBnZXQ7IHNldDsgfQorCisgIGludGVybmFsIEV4Y2VsU3R5bGVzIFN0eWxlcyB7IGdldDsgc2V0OyB9CisKKyAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkID0+CisgICAgTnVtYmVyZm9ybWF0LklkCisgICAgICAgICsgInwiCisgICAgICAgICsgRm9udC5JZAorICAgICAgICArICJ8IgorICAgICAgICArIEZpbGwuSWQKKyAgICAgICAgKyAifCIKKyAgICAgICAgKyBCb3JkZXIuSWQKKyAgICAgICAgKyAifCIKKyAgICAgICAgKyBWZXJ0aWNhbEFsaWdubWVudAorICAgICAgICArICJ8IgorICAgICAgICArIEhvcml6b250YWxBbGlnbm1lbnQKKyAgICAgICAgKyAifCIKKyAgICAgICAgKyBXcmFwVGV4dAorICAgICAgICArICJ8IgorICAgICAgICArIFJlYWRpbmdPcmRlcgorICAgICAgICArICJ8IgorICAgICAgICArIFhmSWQ7CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvU3R5bGUvRXhjZWxUZXh0Rm9udC5jcyBiL0VQUGx1cy9TdHlsZS9FeGNlbFRleHRGb250LmNzCmluZGV4IDdhZjYyZTMuLjEzYjdhZTEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9FeGNlbFRleHRGb250LmNzCisrKyBiL0VQUGx1cy9TdHlsZS9FeGNlbFRleHRGb250LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywyOTUgKzEzLDI2MyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRHJhd2luZzsKIHVzaW5nIFN5c3RlbS5EcmF3aW5nOwordXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uWG1sOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gTGluZXN0eWxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlVW5kZXJMaW5lVHlwZQotICAgIHsKLSAgICAgICAgRGFzaCwKLSAgICAgICAgRGFzaEhlYXZ5LAotICAgICAgICBEYXNoTG9uZywgCi0gICAgICAgIERhc2hMb25nSGVhdnksCi0gICAgICAgIERvdWJsZSwKLSAgICAgICAgRG90RGFzaCwKLSAgICAgICAgRG90RGFzaEhlYXZ5LAotICAgICAgICBEb3REb3REYXNoLAotICAgICAgICBEb3REb3REYXNoSGVhdnksCi0gICAgICAgIERvdHRlZCwKLSAgICAgICAgRG90dGVkSGVhdnksCi0gICAgICAgIEhlYXZ5LAotICAgICAgICBOb25lLAotICAgICAgICBTaW5nbGUsCi0gICAgICAgIFdhdnksCi0gICAgICAgIFdhdnlEYmwsCi0gICAgICAgIFdhdnlIZWF2eSwKLSAgICAgICAgV29yZHMKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUeXBlIG9mIGZvbnQgc3RyaWtlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlU3RyaWtlVHlwZQotICAgIHsKLSAgICAgICAgRG91YmxlLAotICAgICAgICBObywKLSAgICAgICAgU2luZ2xlCi0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVXNlZCBieSBSaWNoLXRleHQgYW5kIFBhcmFncmFwaHMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxUZXh0Rm9udCA6IFhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgc3RyaW5nIF9wYXRoOwotICAgICAgICBYbWxOb2RlIF9yb290Tm9kZTsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxUZXh0Rm9udChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIsIFhtbE5vZGUgcm9vdE5vZGUsIHN0cmluZyBwYXRoLCBzdHJpbmdbXSBzY2hlbWFOb2RlT3JkZXIpCi0gICAgICAgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlciwgcm9vdE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNjaGVtYU5vZGVPcmRlciA9IHNjaGVtYU5vZGVPcmRlcjsKLSAgICAgICAgICAgIF9yb290Tm9kZSA9IHJvb3ROb2RlOwotICAgICAgICAgICAgaWYgKHBhdGggIT0gIiIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWG1sTm9kZSBub2RlID0gcm9vdE5vZGUuU2VsZWN0U2luZ2xlTm9kZShwYXRoLCBuYW1lc3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVG9wTm9kZSA9IG5vZGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgX3BhdGggPSBwYXRoOwotICAgICAgICB9Ci0gICAgICAgIHN0cmluZyBfZm9udExhdGluUGF0aCA9ICJhOmxhdGluL0B0eXBlZmFjZSI7Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgTGF0aW5Gb250Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKF9mb250TGF0aW5QYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZVRvcE5vZGUoKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9mb250TGF0aW5QYXRoLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlOwogCi0gICAgICAgIHByb3RlY3RlZCBpbnRlcm5hbCB2b2lkIENyZWF0ZVRvcE5vZGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoX3BhdGghPSIiICYmIFRvcE5vZGUgPT0gX3Jvb3ROb2RlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoX3BhdGgpOwotICAgICAgICAgICAgICAgIFRvcE5vZGUgPSBfcm9vdE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfcGF0aCwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIF9mb250Q3NQYXRoID0gImE6Y3MvQHR5cGVmYWNlIjsKLSAgICAgICAgcHVibGljIHN0cmluZyBDb21wbGV4Rm9udAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhfZm9udENzUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDcmVhdGVUb3BOb2RlKCk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfZm9udENzUGF0aCwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN0cmluZyBfYm9sZFBhdGggPSAiQGIiOwotICAgICAgICBwdWJsaWMgYm9vbCBCb2xkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbChfYm9sZFBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlVG9wTm9kZSgpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2JvbGRQYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIF91bmRlckxpbmVQYXRoID0gIkB1IjsKLSAgICAgICAgcHVibGljIGVVbmRlckxpbmVUeXBlIFVuZGVyTGluZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVHJhbnNsYXRlVW5kZXJsaW5lKEdldFhtbE5vZGVTdHJpbmcoX3VuZGVyTGluZVBhdGgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZVRvcE5vZGUoKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF91bmRlckxpbmVQYXRoLCBUcmFuc2xhdGVVbmRlcmxpbmVUZXh0KHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIF91bmRlckxpbmVDb2xvclBhdGggPSAiYTp1RmlsbC9hOnNvbGlkRmlsbC9hOnNyZ2JDbHIvQHZhbCI7Ci0gICAgICAgIHB1YmxpYyBDb2xvciBVbmRlckxpbmVDb2xvcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgY29sID0gR2V0WG1sTm9kZVN0cmluZyhfdW5kZXJMaW5lQ29sb3JQYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAoY29sID09ICIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkVtcHR5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sb3IuRnJvbUFyZ2IoaW50LlBhcnNlKGNvbCwgU3lzdGVtLkdsb2JhbGl6YXRpb24uTnVtYmVyU3R5bGVzLkFsbG93SGV4U3BlY2lmaWVyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlVG9wTm9kZSgpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3VuZGVyTGluZUNvbG9yUGF0aCwgdmFsdWUuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKS5TdWJzdHJpbmcoMiwgNikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN0cmluZyBfaXRhbGljUGF0aCA9ICJAaSI7Ci0gICAgICAgIHB1YmxpYyBib29sIEl0YWxpYwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woX2l0YWxpY1BhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlVG9wTm9kZSgpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2l0YWxpY1BhdGgsIHZhbHVlID8gIjEiIDogIjAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBzdHJpbmcgX3N0cmlrZVBhdGggPSAiQHN0cmlrZSI7Ci0gICAgICAgIHB1YmxpYyBlU3RyaWtlVHlwZSBTdHJpa2UKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRyYW5zbGF0ZVN0cmlrZShHZXRYbWxOb2RlU3RyaW5nKF9zdHJpa2VQYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDcmVhdGVUb3BOb2RlKCk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc3RyaWtlUGF0aCwgVHJhbnNsYXRlU3RyaWtlVGV4dCh2YWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN0cmluZyBfc2l6ZVBhdGggPSAiQHN6IjsKLSAgICAgICAgcHVibGljIGZsb2F0IFNpemUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoX3NpemVQYXRoKSAvIDEwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZVRvcE5vZGUoKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9zaXplUGF0aCwgKChpbnQpKHZhbHVlICogMTAwKSkuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIF9jb2xvclBhdGggPSAiYTpzb2xpZEZpbGwvYTpzcmdiQ2xyL0B2YWwiOwotICAgICAgICBwdWJsaWMgQ29sb3IgQ29sb3IKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGNvbCA9IEdldFhtbE5vZGVTdHJpbmcoX2NvbG9yUGF0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbCA9PSAiIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xvci5FbXB0eTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbG9yLkZyb21BcmdiKGludC5QYXJzZShjb2wsIFN5c3RlbS5HbG9iYWxpemF0aW9uLk51bWJlclN0eWxlcy5BbGxvd0hleFNwZWNpZmllcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENyZWF0ZVRvcE5vZGUoKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9jb2xvclBhdGgsIHZhbHVlLlRvQXJnYigpLlRvU3RyaW5nKCJYIikuU3Vic3RyaW5nKDIsIDYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAjcmVnaW9uICJUcmFuc2xhdGUgbWV0aG9kcyIKLSAgICAgICAgcHJpdmF0ZSBlVW5kZXJMaW5lVHlwZSBUcmFuc2xhdGVVbmRlcmxpbmUoc3RyaW5nIHRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAodGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICJzbmciOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVVuZGVyTGluZVR5cGUuU2luZ2xlOwotICAgICAgICAgICAgICAgIGNhc2UgImRibCI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlVW5kZXJMaW5lVHlwZS5Eb3VibGU7Ci0gICAgICAgICAgICAgICAgY2FzZSAiIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVVbmRlckxpbmVUeXBlLk5vbmU7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlVW5kZXJMaW5lVHlwZSlFbnVtLlBhcnNlKHR5cGVvZihlVW5kZXJMaW5lVHlwZSksIHRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIFRyYW5zbGF0ZVVuZGVybGluZVRleHQoZVVuZGVyTGluZVR5cGUgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBlVW5kZXJMaW5lVHlwZS5TaW5nbGU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAic25nIjsKLSAgICAgICAgICAgICAgICBjYXNlIGVVbmRlckxpbmVUeXBlLkRvdWJsZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJkYmwiOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZyByZXQgPSB2YWx1ZS5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0LlN1YnN0cmluZygwLCAxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgcmV0LlN1YnN0cmluZygxLCByZXQuTGVuZ3RoIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBlU3RyaWtlVHlwZSBUcmFuc2xhdGVTdHJpa2Uoc3RyaW5nIHRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAodGV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlICJkYmxTdHJpa2UiOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVN0cmlrZVR5cGUuRG91YmxlOwotICAgICAgICAgICAgICAgIGNhc2UgInNuZ1N0cmlrZSI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlU3RyaWtlVHlwZS5TaW5nbGU7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVTdHJpa2VUeXBlLk5vOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIFRyYW5zbGF0ZVN0cmlrZVRleHQoZVN0cmlrZVR5cGUgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3RyaWtlVHlwZS5TaW5nbGU6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAic25nU3RyaWtlIjsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHJpa2VUeXBlLkRvdWJsZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJkYmxTdHJpa2UiOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAibm9TdHJpa2UiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2V0IHRoZSBmb250IHN0eWxlIGZyb20gYSBmb250IG9iamVjdAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkZvbnQiPjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFNldEZyb21Gb250KEZvbnQgRm9udCkKLSAgICAgICAgewotICAgICAgICAgICAgTGF0aW5Gb250ID0gRm9udC5OYW1lOwotICAgICAgICAgICAgQ29tcGxleEZvbnQgPSBGb250Lk5hbWU7Ci0gICAgICAgICAgICBTaXplID0gRm9udC5TaXplOwotICAgICAgICAgICAgaWYgKEZvbnQuQm9sZCkgQm9sZCA9IEZvbnQuQm9sZDsKLSAgICAgICAgICAgIGlmIChGb250Lkl0YWxpYykgSXRhbGljID0gRm9udC5JdGFsaWM7Ci0gICAgICAgICAgICBpZiAoRm9udC5VbmRlcmxpbmUpIFVuZGVyTGluZSA9IGVVbmRlckxpbmVUeXBlLlNpbmdsZTsKLSAgICAgICAgICAgIGlmIChGb250LlN0cmlrZW91dCkgU3RyaWtlID0gZVN0cmlrZVR5cGUuU2luZ2xlOwotICAgICAgICB9CisvLy8gPHN1bW1hcnk+CisvLy8gTGluZXN0eWxlCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gZVVuZGVyTGluZVR5cGUgeworICBEYXNoLAorICBEYXNoSGVhdnksCisgIERhc2hMb25nLAorICBEYXNoTG9uZ0hlYXZ5LAorICBEb3VibGUsCisgIERvdERhc2gsCisgIERvdERhc2hIZWF2eSwKKyAgRG90RG90RGFzaCwKKyAgRG90RG90RGFzaEhlYXZ5LAorICBEb3R0ZWQsCisgIERvdHRlZEhlYXZ5LAorICBIZWF2eSwKKyAgTm9uZSwKKyAgU2luZ2xlLAorICBXYXZ5LAorICBXYXZ5RGJsLAorICBXYXZ5SGVhdnksCisgIFdvcmRzLAorfQorCisvLy8gPHN1bW1hcnk+CisvLy8gVHlwZSBvZiBmb250IHN0cmlrZQorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVTdHJpa2VUeXBlIHsKKyAgRG91YmxlLAorICBObywKKyAgU2luZ2xlLAorfQorCisvLy8gPHN1bW1hcnk+CisvLy8gVXNlZCBieSBSaWNoLXRleHQgYW5kIFBhcmFncmFwaHMuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsVGV4dEZvbnQgOiBYbWxIZWxwZXIgeworICBwcml2YXRlIHN0cmluZyBfcGF0aDsKKyAgcHJpdmF0ZSBYbWxOb2RlIF9yb290Tm9kZTsKKworICBpbnRlcm5hbCBFeGNlbFRleHRGb250KAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyLAorICAgICAgWG1sTm9kZSByb290Tm9kZSwKKyAgICAgIHN0cmluZyBwYXRoLAorICAgICAgc3RyaW5nW10gc2NoZW1hTm9kZU9yZGVyKQorICAgICAgOiBiYXNlKG5hbWVzcGFjZU1hbmFnZXIsIHJvb3ROb2RlKSB7CisgICAgU2NoZW1hTm9kZU9yZGVyID0gc2NoZW1hTm9kZU9yZGVyOworICAgIF9yb290Tm9kZSA9IHJvb3ROb2RlOworICAgIGlmIChwYXRoICE9ICIiKSB7CisgICAgICBYbWxOb2RlIG5vZGUgPSByb290Tm9kZS5TZWxlY3RTaW5nbGVOb2RlKHBhdGgsIG5hbWVzcGFjZU1hbmFnZXIpOworICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICBUb3BOb2RlID0gbm9kZTsKKyAgICAgIH0KICAgICB9CisgICAgX3BhdGggPSBwYXRoOworICB9CisKKyAgcHJpdmF0ZSBzdHJpbmcgX2ZvbnRMYXRpblBhdGggPSAiYTpsYXRpbi9AdHlwZWZhY2UiOworCisgIHB1YmxpYyBzdHJpbmcgTGF0aW5Gb250IHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZyhfZm9udExhdGluUGF0aCk7CisgICAgc2V0IHsKKyAgICAgIENyZWF0ZVRvcE5vZGUoKTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2ZvbnRMYXRpblBhdGgsIHZhbHVlKTsKKyAgICB9CisgIH0KKworICBwcm90ZWN0ZWQgaW50ZXJuYWwgdm9pZCBDcmVhdGVUb3BOb2RlKCkgeworICAgIGlmIChfcGF0aCAhPSAiIiAmJiBUb3BOb2RlID09IF9yb290Tm9kZSkgeworICAgICAgQ3JlYXRlTm9kZShfcGF0aCk7CisgICAgICBUb3BOb2RlID0gX3Jvb3ROb2RlLlNlbGVjdFNpbmdsZU5vZGUoX3BhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIF9mb250Q3NQYXRoID0gImE6Y3MvQHR5cGVmYWNlIjsKKworICBwdWJsaWMgc3RyaW5nIENvbXBsZXhGb250IHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZyhfZm9udENzUGF0aCk7CisgICAgc2V0IHsKKyAgICAgIENyZWF0ZVRvcE5vZGUoKTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2ZvbnRDc1BhdGgsIHZhbHVlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0cmluZyBfYm9sZFBhdGggPSAiQGIiOworCisgIHB1YmxpYyBib29sIEJvbGQgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbChfYm9sZFBhdGgpOworICAgIHNldCB7CisgICAgICBDcmVhdGVUb3BOb2RlKCk7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9ib2xkUGF0aCwgdmFsdWUgPyAiMSIgOiAiMCIpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIF91bmRlckxpbmVQYXRoID0gIkB1IjsKKworICBwdWJsaWMgZVVuZGVyTGluZVR5cGUgVW5kZXJMaW5lIHsKKyAgICBnZXQgPT4gVHJhbnNsYXRlVW5kZXJsaW5lKEdldFhtbE5vZGVTdHJpbmcoX3VuZGVyTGluZVBhdGgpKTsKKyAgICBzZXQgeworICAgICAgQ3JlYXRlVG9wTm9kZSgpOworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfdW5kZXJMaW5lUGF0aCwgVHJhbnNsYXRlVW5kZXJsaW5lVGV4dCh2YWx1ZSkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIF91bmRlckxpbmVDb2xvclBhdGggPSAiYTp1RmlsbC9hOnNvbGlkRmlsbC9hOnNyZ2JDbHIvQHZhbCI7CisKKyAgcHVibGljIENvbG9yIFVuZGVyTGluZUNvbG9yIHsKKyAgICBnZXQgeworICAgICAgc3RyaW5nIGNvbCA9IEdldFhtbE5vZGVTdHJpbmcoX3VuZGVyTGluZUNvbG9yUGF0aCk7CisgICAgICBpZiAoY29sID09ICIiKSB7CisgICAgICAgIHJldHVybiBDb2xvci5FbXB0eTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDb2xvci5Gcm9tQXJnYihpbnQuUGFyc2UoY29sLCBOdW1iZXJTdHlsZXMuQWxsb3dIZXhTcGVjaWZpZXIpKTsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIENyZWF0ZVRvcE5vZGUoKTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3VuZGVyTGluZUNvbG9yUGF0aCwgdmFsdWUuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKS5TdWJzdHJpbmcoMiwgNikpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIF9pdGFsaWNQYXRoID0gIkBpIjsKKworICBwdWJsaWMgYm9vbCBJdGFsaWMgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbChfaXRhbGljUGF0aCk7CisgICAgc2V0IHsKKyAgICAgIENyZWF0ZVRvcE5vZGUoKTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2l0YWxpY1BhdGgsIHZhbHVlID8gIjEiIDogIjAiKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0cmluZyBfc3RyaWtlUGF0aCA9ICJAc3RyaWtlIjsKKworICBwdWJsaWMgZVN0cmlrZVR5cGUgU3RyaWtlIHsKKyAgICBnZXQgPT4gVHJhbnNsYXRlU3RyaWtlKEdldFhtbE5vZGVTdHJpbmcoX3N0cmlrZVBhdGgpKTsKKyAgICBzZXQgeworICAgICAgQ3JlYXRlVG9wTm9kZSgpOworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc3RyaWtlUGF0aCwgVHJhbnNsYXRlU3RyaWtlVGV4dCh2YWx1ZSkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIF9zaXplUGF0aCA9ICJAc3oiOworCisgIHB1YmxpYyBmbG9hdCBTaXplIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUludChfc2l6ZVBhdGgpIC8gMTAwOworICAgIHNldCB7CisgICAgICBDcmVhdGVUb3BOb2RlKCk7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9zaXplUGF0aCwgKChpbnQpKHZhbHVlICogMTAwKSkuVG9TdHJpbmcoKSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdHJpbmcgX2NvbG9yUGF0aCA9ICJhOnNvbGlkRmlsbC9hOnNyZ2JDbHIvQHZhbCI7CisKKyAgcHVibGljIENvbG9yIENvbG9yIHsKKyAgICBnZXQgeworICAgICAgc3RyaW5nIGNvbCA9IEdldFhtbE5vZGVTdHJpbmcoX2NvbG9yUGF0aCk7CisgICAgICBpZiAoY29sID09ICIiKSB7CisgICAgICAgIHJldHVybiBDb2xvci5FbXB0eTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBDb2xvci5Gcm9tQXJnYihpbnQuUGFyc2UoY29sLCBOdW1iZXJTdHlsZXMuQWxsb3dIZXhTcGVjaWZpZXIpKTsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIENyZWF0ZVRvcE5vZGUoKTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2NvbG9yUGF0aCwgdmFsdWUuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKS5TdWJzdHJpbmcoMiwgNikpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZVVuZGVyTGluZVR5cGUgVHJhbnNsYXRlVW5kZXJsaW5lKHN0cmluZyB0ZXh0KSB7CisgICAgc3dpdGNoICh0ZXh0KSB7CisgICAgICBjYXNlICJzbmciOgorICAgICAgICByZXR1cm4gZVVuZGVyTGluZVR5cGUuU2luZ2xlOworICAgICAgY2FzZSAiZGJsIjoKKyAgICAgICAgcmV0dXJuIGVVbmRlckxpbmVUeXBlLkRvdWJsZTsKKyAgICAgIGNhc2UgIiI6CisgICAgICAgIHJldHVybiBlVW5kZXJMaW5lVHlwZS5Ob25lOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIChlVW5kZXJMaW5lVHlwZSlFbnVtLlBhcnNlKHR5cGVvZihlVW5kZXJMaW5lVHlwZSksIHRleHQpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIFRyYW5zbGF0ZVVuZGVybGluZVRleHQoZVVuZGVyTGluZVR5cGUgdmFsdWUpIHsKKyAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICBjYXNlIGVVbmRlckxpbmVUeXBlLlNpbmdsZToKKyAgICAgICAgcmV0dXJuICJzbmciOworICAgICAgY2FzZSBlVW5kZXJMaW5lVHlwZS5Eb3VibGU6CisgICAgICAgIHJldHVybiAiZGJsIjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN0cmluZyByZXQgPSB2YWx1ZS5Ub1N0cmluZygpOworICAgICAgICByZXR1cm4gcmV0LlN1YnN0cmluZygwLCAxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpCisgICAgICAgICAgICArIHJldC5TdWJzdHJpbmcoMSwgcmV0Lkxlbmd0aCAtIDEpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgZVN0cmlrZVR5cGUgVHJhbnNsYXRlU3RyaWtlKHN0cmluZyB0ZXh0KSB7CisgICAgc3dpdGNoICh0ZXh0KSB7CisgICAgICBjYXNlICJkYmxTdHJpa2UiOgorICAgICAgICByZXR1cm4gZVN0cmlrZVR5cGUuRG91YmxlOworICAgICAgY2FzZSAic25nU3RyaWtlIjoKKyAgICAgICAgcmV0dXJuIGVTdHJpa2VUeXBlLlNpbmdsZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBlU3RyaWtlVHlwZS5ObzsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0cmluZyBUcmFuc2xhdGVTdHJpa2VUZXh0KGVTdHJpa2VUeXBlIHZhbHVlKSB7CisgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgY2FzZSBlU3RyaWtlVHlwZS5TaW5nbGU6CisgICAgICAgIHJldHVybiAic25nU3RyaWtlIjsKKyAgICAgIGNhc2UgZVN0cmlrZVR5cGUuRG91YmxlOgorICAgICAgICByZXR1cm4gImRibFN0cmlrZSI7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gIm5vU3RyaWtlIjsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTZXQgdGhlIGZvbnQgc3R5bGUgZnJvbSBhIGZvbnQgb2JqZWN0CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iZm9udCI+PC9wYXJhbT4KKyAgcHVibGljIHZvaWQgU2V0RnJvbUZvbnQoRm9udCBmb250KSB7CisgICAgTGF0aW5Gb250ID0gZm9udC5OYW1lOworICAgIENvbXBsZXhGb250ID0gZm9udC5OYW1lOworICAgIFNpemUgPSBmb250LlNpemU7CisgICAgaWYgKGZvbnQuQm9sZCkgeworICAgICAgQm9sZCA9IGZvbnQuQm9sZDsKKyAgICB9CisgICAgaWYgKGZvbnQuSXRhbGljKSB7CisgICAgICBJdGFsaWMgPSBmb250Lkl0YWxpYzsKKyAgICB9CisgICAgaWYgKGZvbnQuVW5kZXJsaW5lKSB7CisgICAgICBVbmRlckxpbmUgPSBlVW5kZXJMaW5lVHlwZS5TaW5nbGU7CisgICAgfQorICAgIGlmIChmb250LlN0cmlrZW91dCkgeworICAgICAgU3RyaWtlID0gZVN0cmlrZVR5cGUuU2luZ2xlOworICAgIH0KKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL0lTdHlsZS5jcyBiL0VQUGx1cy9TdHlsZS9JU3R5bGUuY3MKaW5kZXggMzgyMzVhYS4uZjFmNDkyZSAxMDA2NDQKLS0tIGEvRVBQbHVzL1N0eWxlL0lTdHlsZS5jcworKysgYi9FUFBsdXMvU3R5bGUvSVN0eWxlLmNzCkBAIC0xMywzMiArMTMsMjkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlCi17Ci0gICAgaW50ZXJuYWwgaW50ZXJmYWNlIElTdHlsZQotICAgIHsKLSAgICAgICAgdm9pZCBTZXROZXdTdHlsZUlEKHN0cmluZyB2YWx1ZSk7Ci0gICAgICAgIHVsb25nIElkIHtnZXQ7fQotICAgICAgICBFeGNlbFN0eWxlIEV4Y2VsU3R5bGV7Z2V0O30KLSAgICB9CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlOworCitpbnRlcm5hbCBpbnRlcmZhY2UgSVN0eWxlIHsKKyAgdm9pZCBTZXROZXdTdHlsZUlkKHN0cmluZyB2YWx1ZSk7CisKKyAgdWxvbmcgSWQgeyBnZXQ7IH0KKworICBFeGNlbFN0eWxlIEV4Y2VsU3R5bGUgeyBnZXQ7IH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9TdHlsZUJhc2UuY3MgYi9FUFBsdXMvU3R5bGUvU3R5bGVCYXNlLmNzCmluZGV4IGFlZGRkZjIuLmZhMWIzOTAgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9TdHlsZUJhc2UuY3MKKysrIGIvRVBQbHVzL1N0eWxlL1N0eWxlQmFzZS5jcwpAQCAtMTMsMTcyICsxMywxNzYgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQm9yZGVyIGxpbmUgc3R5bGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIEV4Y2VsQm9yZGVyU3R5bGUKLSAgICB7Ci0gICAgICAgIE5vbmUsCi0gICAgICAgIEhhaXIsCi0gICAgICAgIERvdHRlZCwKLSAgICAgICAgRGFzaERvdCwKLSAgICAgICAgVGhpbiwKLSAgICAgICAgRGFzaERvdERvdCwKLSAgICAgICAgRGFzaGVkLAotICAgICAgICBNZWRpdW1EYXNoRG90RG90LAotICAgICAgICBNZWRpdW1EYXNoZWQsCi0gICAgICAgIE1lZGl1bURhc2hEb3QsCi0gICAgICAgIFRoaWNrLAotICAgICAgICBNZWRpdW0sCi0gICAgICAgIERvdWJsZQotICAgIH07Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBIb3Jpem9udGFsIHRleHQgYWxpZ25tZW50Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQKLSAgICB7Ci0gICAgICAgIEdlbmVyYWwsCi0gICAgICAgIExlZnQsCi0gICAgICAgIENlbnRlciwKLSAgICAgICAgQ2VudGVyQ29udGludW91cywKLSAgICAgICAgUmlnaHQsCi0gICAgICAgIEZpbGwsCi0gICAgICAgIERpc3RyaWJ1dGVkLAotICAgICAgICBKdXN0aWZ5Ci0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVmVydGljYWwgdGV4dCBhbGlnbm1lbnQKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIEV4Y2VsVmVydGljYWxBbGlnbm1lbnQKLSAgICB7Ci0gICAgICAgIFRvcCwKLSAgICAgICAgQ2VudGVyLAotICAgICAgICBCb3R0b20sCi0gICAgICAgIERpc3RyaWJ1dGVkLAotICAgICAgICBKdXN0aWZ5Ci0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRm9udC1WZXJ0aWNhbCBBbGlnbgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQKLSAgICB7Ci0gICAgICAgIE5vbmUsCi0gICAgICAgIFN1YnNjcmlwdCwKLSAgICAgICAgU3VwZXJzY3JpcHQKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBGb250LVVuZGVybGluZXN0eWxlIGZvciAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIEV4Y2VsVW5kZXJMaW5lVHlwZQotICAgIHsKLSAgICAgICAgTm9uZSwKLSAgICAgICAgU2luZ2xlLAotICAgICAgICBEb3VibGUsCi0gICAgICAgIFNpbmdsZUFjY291bnRpbmcsCi0gICAgICAgIERvdWJsZUFjY291bnRpbmcKLSAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBGaWxsIHBhdHRlcm4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIEV4Y2VsRmlsbFN0eWxlCi0gICAgewotICAgICAgICBOb25lLAotICAgICAgICBTb2xpZCwKLSAgICAgICAgRGFya0dyYXksCi0gICAgICAgIE1lZGl1bUdyYXksCi0gICAgICAgIExpZ2h0R3JheSwKLSAgICAgICAgR3JheTEyNSwKLSAgICAgICAgR3JheTA2MjUsCi0gICAgICAgIERhcmtWZXJ0aWNhbCwKLSAgICAgICAgRGFya0hvcml6b250YWwsCi0gICAgICAgIERhcmtEb3duLAotICAgICAgICBEYXJrVXAsCi0gICAgICAgIERhcmtHcmlkLAotICAgICAgICBEYXJrVHJlbGxpcywKLSAgICAgICAgTGlnaHRWZXJ0aWNhbCwKLSAgICAgICAgTGlnaHRIb3Jpem9udGFsLAotICAgICAgICBMaWdodERvd24sCi0gICAgICAgIExpZ2h0VXAsCi0gICAgICAgIExpZ2h0R3JpZCwKLSAgICAgICAgTGlnaHRUcmVsbGlzCi0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVHlwZSBvZiBncmFkaWVudCBmaWxsCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBFeGNlbEZpbGxHcmFkaWVudFR5cGUKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE5vIGdyYWRpZW50IGZpbGwuIAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBOb25lLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGlzIGdyYWRpZW50IGZpbGwgaXMgb2YgbGluZWFyIGdyYWRpZW50IHR5cGUuIExpbmVhciBncmFkaWVudCB0eXBlIG1lYW5zIHRoYXQgdGhlIHRyYW5zaXRpb24gZnJvbSBvbmUgY29sb3IgdG8gdGhlIG5leHQgaXMgYWxvbmcgYSBsaW5lIChlLmcuLCBob3Jpem9udGFsLCB2ZXJ0aWNhbCxkaWFnb25hbCwgZXRjLikKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgTGluZWFyLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGlzIGdyYWRpZW50IGZpbGwgaXMgb2YgcGF0aCBncmFkaWVudCB0eXBlLiBQYXRoIGdyYWRpZW50IHR5cGUgbWVhbnMgdGhlIHRoYXQgdGhlIGJvdW5kYXJ5IG9mIHRyYW5zaXRpb24gZnJvbSBvbmUgY29sb3IgdG8gdGhlIG5leHQgaXMgYSByZWN0YW5nbGUsIGRlZmluZWQgYnkgdG9wLGJvdHRvbSwgbGVmdCwgYW5kIHJpZ2h0IGF0dHJpYnV0ZXMgb24gdGhlIGdyYWRpZW50RmlsbCBlbGVtZW50LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBQYXRoCi0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhlIHJlYWRpbmcgb3JkZXIKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIEV4Y2VsUmVhZGluZ09yZGVyCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZWFkaW5nIG9yZGVyIGlzIGRldGVybWluZWQgYnkgc2Nhbm5pbmcgdGhlIHRleHQgZm9yIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXI6IGlmIGl0IGlzIGEgc3Ryb25nIHJpZ2h0LXRvLWxlZnQgY2hhcmFjdGVyLCB0aGUgcmVhZGluZyBvcmRlciBpcyByaWdodC10by1sZWZ0OyBvdGhlcndpc2UsIHRoZSByZWFkaW5nIG9yZGVyIGxlZnQtdG8tcmlnaHQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIENvbnRleHREZXBlbmRlbnQ9MCwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTGVmdCB0byBSaWdodAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBMZWZ0VG9SaWdodD0xLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSaWdodCB0byBMZWZ0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFJpZ2h0VG9MZWZ0PTIKLSAgICB9Ci0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIFN0eWxlQmFzZQotICAgIHsKLSAgICAgICAgcHJvdGVjdGVkIEV4Y2VsU3R5bGVzIF9zdHlsZXM7Ci0gICAgICAgIGludGVybmFsIE9mZmljZU9wZW5YbWwuWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgX0NoYW5nZWRFdmVudDsKLSAgICAgICAgcHJvdGVjdGVkIGludCBfcG9zaXRpb25JRDsKLSAgICAgICAgcHJvdGVjdGVkIHN0cmluZyBfYWRkcmVzczsKLSAgICAgICAgaW50ZXJuYWwgU3R5bGVCYXNlKEV4Y2VsU3R5bGVzIHN0eWxlcywgT2ZmaWNlT3BlblhtbC5YbWxIZWxwZXIuQ2hhbmdlZEV2ZW50SGFuZGxlciBDaGFuZ2VkRXZlbnQsIGludCBQb3NpdGlvbklELCBzdHJpbmcgQWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgX3N0eWxlcyA9IHN0eWxlczsKLSAgICAgICAgICAgIF9DaGFuZ2VkRXZlbnQgPSBDaGFuZ2VkRXZlbnQ7Ci0gICAgICAgICAgICBfYWRkcmVzcyA9IEFkZHJlc3M7Ci0gICAgICAgICAgICBfcG9zaXRpb25JRCA9IFBvc2l0aW9uSUQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgaW50IEluZGV4IHsgZ2V0OyBzZXQ7fQotICAgICAgICBpbnRlcm5hbCBhYnN0cmFjdCBzdHJpbmcgSWQge2dldDt9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZTsKIAotICAgICAgICBpbnRlcm5hbCB2aXJ0dWFsIHZvaWQgU2V0SW5kZXgoaW50IGluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBJbmRleCA9IGluZGV4OwotICAgICAgICB9Ci0gICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIEJvcmRlciBsaW5lIHN0eWxlCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gRXhjZWxCb3JkZXJTdHlsZSB7CisgIE5vbmUsCisgIEhhaXIsCisgIERvdHRlZCwKKyAgRGFzaERvdCwKKyAgVGhpbiwKKyAgRGFzaERvdERvdCwKKyAgRGFzaGVkLAorICBNZWRpdW1EYXNoRG90RG90LAorICBNZWRpdW1EYXNoZWQsCisgIE1lZGl1bURhc2hEb3QsCisgIFRoaWNrLAorICBNZWRpdW0sCisgIERvdWJsZSwKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIEhvcml6b250YWwgdGV4dCBhbGlnbm1lbnQKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgZW51bSBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQgeworICBHZW5lcmFsLAorICBMZWZ0LAorICBDZW50ZXIsCisgIENlbnRlckNvbnRpbnVvdXMsCisgIFJpZ2h0LAorICBGaWxsLAorICBEaXN0cmlidXRlZCwKKyAgSnVzdGlmeSwKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIFZlcnRpY2FsIHRleHQgYWxpZ25tZW50CisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudCB7CisgIFRvcCwKKyAgQ2VudGVyLAorICBCb3R0b20sCisgIERpc3RyaWJ1dGVkLAorICBKdXN0aWZ5LAorfQorCisvLy8gPHN1bW1hcnk+CisvLy8gRm9udC1WZXJ0aWNhbCBBbGlnbgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250IHsKKyAgTm9uZSwKKyAgU3Vic2NyaXB0LAorICBTdXBlcnNjcmlwdCwKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIEZvbnQtVW5kZXJsaW5lc3R5bGUgZm9yCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gRXhjZWxVbmRlckxpbmVUeXBlIHsKKyAgTm9uZSwKKyAgU2luZ2xlLAorICBEb3VibGUsCisgIFNpbmdsZUFjY291bnRpbmcsCisgIERvdWJsZUFjY291bnRpbmcsCit9CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBGaWxsIHBhdHRlcm4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgZW51bSBFeGNlbEZpbGxTdHlsZSB7CisgIE5vbmUsCisgIFNvbGlkLAorICBEYXJrR3JheSwKKyAgTWVkaXVtR3JheSwKKyAgTGlnaHRHcmF5LAorICBHcmF5MTI1LAorICBHcmF5MDYyNSwKKyAgRGFya1ZlcnRpY2FsLAorICBEYXJrSG9yaXpvbnRhbCwKKyAgRGFya0Rvd24sCisgIERhcmtVcCwKKyAgRGFya0dyaWQsCisgIERhcmtUcmVsbGlzLAorICBMaWdodFZlcnRpY2FsLAorICBMaWdodEhvcml6b250YWwsCisgIExpZ2h0RG93biwKKyAgTGlnaHRVcCwKKyAgTGlnaHRHcmlkLAorICBMaWdodFRyZWxsaXMsCit9CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBUeXBlIG9mIGdyYWRpZW50IGZpbGwKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgZW51bSBFeGNlbEZpbGxHcmFkaWVudFR5cGUgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBObyBncmFkaWVudCBmaWxsLgorICAvLy8gPC9zdW1tYXJ5PgorICBOb25lLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoaXMgZ3JhZGllbnQgZmlsbCBpcyBvZiBsaW5lYXIgZ3JhZGllbnQgdHlwZS4gTGluZWFyIGdyYWRpZW50IHR5cGUgbWVhbnMgdGhhdCB0aGUgdHJhbnNpdGlvbiBmcm9tIG9uZSBjb2xvciB0byB0aGUgbmV4dCBpcyBhbG9uZyBhIGxpbmUgKGUuZy4sIGhvcml6b250YWwsIHZlcnRpY2FsLGRpYWdvbmFsLCBldGMuKQorICAvLy8gPC9zdW1tYXJ5PgorICBMaW5lYXIsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhpcyBncmFkaWVudCBmaWxsIGlzIG9mIHBhdGggZ3JhZGllbnQgdHlwZS4gUGF0aCBncmFkaWVudCB0eXBlIG1lYW5zIHRoZSB0aGF0IHRoZSBib3VuZGFyeSBvZiB0cmFuc2l0aW9uIGZyb20gb25lIGNvbG9yIHRvIHRoZSBuZXh0IGlzIGEgcmVjdGFuZ2xlLCBkZWZpbmVkIGJ5IHRvcCxib3R0b20sIGxlZnQsIGFuZCByaWdodCBhdHRyaWJ1dGVzIG9uIHRoZSBncmFkaWVudEZpbGwgZWxlbWVudC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgUGF0aCwKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIFRoZSByZWFkaW5nIG9yZGVyCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gRXhjZWxSZWFkaW5nT3JkZXIgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZWFkaW5nIG9yZGVyIGlzIGRldGVybWluZWQgYnkgc2Nhbm5pbmcgdGhlIHRleHQgZm9yIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXI6IGlmIGl0IGlzIGEgc3Ryb25nIHJpZ2h0LXRvLWxlZnQgY2hhcmFjdGVyLCB0aGUgcmVhZGluZyBvcmRlciBpcyByaWdodC10by1sZWZ0OyBvdGhlcndpc2UsIHRoZSByZWFkaW5nIG9yZGVyIGxlZnQtdG8tcmlnaHQuCisgIC8vLyA8L3N1bW1hcnk+CisgIENvbnRleHREZXBlbmRlbnQgPSAwLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIExlZnQgdG8gUmlnaHQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgTGVmdFRvUmlnaHQgPSAxLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJpZ2h0IHRvIExlZnQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgUmlnaHRUb0xlZnQgPSAyLAorfQorCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3R5bGVCYXNlIHsKKyAgcHJvdGVjdGVkIEV4Y2VsU3R5bGVzIF9zdHlsZXM7CisgIGludGVybmFsIFhtbEhlbHBlci5DaGFuZ2VkRXZlbnRIYW5kbGVyIF9DaGFuZ2VkRXZlbnQ7CisgIHByb3RlY3RlZCBpbnQgX3Bvc2l0aW9uSUQ7CisgIHByb3RlY3RlZCBzdHJpbmcgX2FkZHJlc3M7CisKKyAgaW50ZXJuYWwgU3R5bGVCYXNlKAorICAgICAgRXhjZWxTdHlsZXMgc3R5bGVzLAorICAgICAgWG1sSGVscGVyLkNoYW5nZWRFdmVudEhhbmRsZXIgY2hhbmdlZEV2ZW50LAorICAgICAgaW50IHBvc2l0aW9uSWQsCisgICAgICBzdHJpbmcgYWRkcmVzcykgeworICAgIF9zdHlsZXMgPSBzdHlsZXM7CisgICAgX0NoYW5nZWRFdmVudCA9IGNoYW5nZWRFdmVudDsKKyAgICBfYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgX3Bvc2l0aW9uSUQgPSBwb3NpdGlvbklkOworICB9CisKKyAgaW50ZXJuYWwgaW50IEluZGV4IHsgZ2V0OyBzZXQ7IH0KKworICBpbnRlcm5hbCBhYnN0cmFjdCBzdHJpbmcgSWQgeyBnZXQ7IH0KKworICBpbnRlcm5hbCB2aXJ0dWFsIHZvaWQgU2V0SW5kZXgoaW50IGluZGV4KSB7CisgICAgSW5kZXggPSBpbmRleDsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL1N0eWxlQ2hhbmdlRXZlbnRBcmdzLmNzIGIvRVBQbHVzL1N0eWxlL1N0eWxlQ2hhbmdlRXZlbnRBcmdzLmNzCmluZGV4IGY2NzFkZjAuLjM1MmRjNTEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9TdHlsZUNoYW5nZUV2ZW50QXJncy5jcworKysgYi9FUFBsdXMvU3R5bGUvU3R5bGVDaGFuZ2VFdmVudEFyZ3MuY3MKQEAgLTEzLDEwMSArMTMsMTA3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCiAgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUKLXsKLSAgICBpbnRlcm5hbCBlbnVtIGVTdHlsZUNsYXNzCi0gICAgewotICAgICAgICBOdW1iZXJmb3JtYXQsCi0gICAgICAgIEZvbnQsICAgIAotICAgICAgICBCb3JkZXIsCi0gICAgICAgIEJvcmRlclRvcCwKLSAgICAgICAgQm9yZGVyTGVmdCwKLSAgICAgICAgQm9yZGVyQm90dG9tLAotICAgICAgICBCb3JkZXJSaWdodCwKLSAgICAgICAgQm9yZGVyRGlhZ29uYWwsCi0gICAgICAgIEZpbGwsCi0gICAgICAgIEdyYWRpZW50RmlsbCwKLSAgICAgICAgRmlsbEJhY2tncm91bmRDb2xvciwKLSAgICAgICAgRmlsbFBhdHRlcm5Db2xvciwKLSAgICAgICAgRmlsbEdyYWRpZW50Q29sb3IxLAotICAgICAgICBGaWxsR3JhZGllbnRDb2xvcjIsCi0gICAgICAgIE5hbWVkU3R5bGUsCi0gICAgICAgIFN0eWxlCi0gICAgfTsKLSAgICBpbnRlcm5hbCBlbnVtIGVTdHlsZVByb3BlcnR5Ci0gICAgewotICAgICAgICBGb3JtYXQsCi0gICAgICAgIE5hbWUsCi0gICAgICAgIFNpemUsCi0gICAgICAgIEJvbGQsCi0gICAgICAgIEl0YWxpYywKLSAgICAgICAgU3RyaWtlLAotICAgICAgICBDb2xvciwKLSAgICAgICAgVGludCwKLSAgICAgICAgSW5kZXhlZENvbG9yLAotICAgICAgICBBdXRvQ29sb3IsCi0gICAgICAgIEdyYWRpZW50Q29sb3IsCi0gICAgICAgIEZhbWlseSwKLSAgICAgICAgU2NoZW1lLAotICAgICAgICBVbmRlcmxpbmVUeXBlLAotICAgICAgICBIb3Jpem9udGFsQWxpZ24sCi0gICAgICAgIFZlcnRpY2FsQWxpZ24sCi0gICAgICAgIEJvcmRlciwKLSAgICAgICAgTmFtZWRTdHlsZSwKLSAgICAgICAgU3R5bGUsCi0gICAgICAgIFBhdHRlcm5UeXBlLAotICAgICAgICBSZWFkaW5nT3JkZXIsCi0gICAgICAgIFdyYXBUZXh0LAotICAgICAgICBUZXh0Um90YXRpb24sCi0gICAgICAgIExvY2tlZCwKLSAgICAgICAgSGlkZGVuLAotICAgICAgICBTaHJpbmtUb0ZpdCwKLSAgICAgICAgQm9yZGVyRGlhZ29uYWxVcCwKLSAgICAgICAgQm9yZGVyRGlhZ29uYWxEb3duLAotICAgICAgICBHcmFkaWVudERlZ3JlZSwKLSAgICAgICAgR3JhZGllbnRUeXBlLAotICAgICAgICBHcmFkaWVudFRvcCwKLSAgICAgICAgR3JhZGllbnRCb3R0b20sCi0gICAgICAgIEdyYWRpZW50TGVmdCwKLSAgICAgICAgR3JhZGllbnRSaWdodCwKLSAgICAgICAgWGZJZCwKLSAgICAgICAgSW5kZW50Ci0gICAgfQotICAgIGludGVybmFsIGNsYXNzIFN0eWxlQ2hhbmdlRXZlbnRBcmdzIDogRXZlbnRBcmdzCi0gICAgewotICAgICAgICBpbnRlcm5hbCBTdHlsZUNoYW5nZUV2ZW50QXJncyhlU3R5bGVDbGFzcyBzdHlsZWNsYXNzLCBlU3R5bGVQcm9wZXJ0eSBzdHlsZVByb3BlcnR5LCBvYmplY3QgdmFsdWUsIGludCBwb3NpdGlvbklELCBzdHJpbmcgYWRkcmVzcykKLSAgICAgICAgewotICAgICAgICAgICAgU3R5bGVDbGFzcyA9IHN0eWxlY2xhc3M7Ci0gICAgICAgICAgICBTdHlsZVByb3BlcnR5PXN0eWxlUHJvcGVydHk7Ci0gICAgICAgICAgICBWYWx1ZSA9IHZhbHVlOwotICAgICAgICAgICAgQWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgICAgICAgICBQb3NpdGlvbklEID0gcG9zaXRpb25JRDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBlU3R5bGVDbGFzcyBTdHlsZUNsYXNzOwotICAgICAgICBpbnRlcm5hbCBlU3R5bGVQcm9wZXJ0eSBTdHlsZVByb3BlcnR5OwotICAgICAgICAvL2ludGVybmFsIHN0cmluZyBQcm9wZXJ0eU5hbWU7Ci0gICAgICAgIGludGVybmFsIG9iamVjdCBWYWx1ZTsKLSAgICAgICAgaW50ZXJuYWwgaW50IFBvc2l0aW9uSUQgeyBnZXQ7IHNldDsgfQotICAgICAgICAvL2ludGVybmFsIHN0cmluZyBBZGRyZXNzOwotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgQWRkcmVzczsKLSAgICB9CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlOworCitpbnRlcm5hbCBlbnVtIGVTdHlsZUNsYXNzIHsKKyAgTnVtYmVyZm9ybWF0LAorICBGb250LAorICBCb3JkZXIsCisgIEJvcmRlclRvcCwKKyAgQm9yZGVyTGVmdCwKKyAgQm9yZGVyQm90dG9tLAorICBCb3JkZXJSaWdodCwKKyAgQm9yZGVyRGlhZ29uYWwsCisgIEZpbGwsCisgIEdyYWRpZW50RmlsbCwKKyAgRmlsbEJhY2tncm91bmRDb2xvciwKKyAgRmlsbFBhdHRlcm5Db2xvciwKKyAgRmlsbEdyYWRpZW50Q29sb3IxLAorICBGaWxsR3JhZGllbnRDb2xvcjIsCisgIE5hbWVkU3R5bGUsCisgIFN0eWxlLAorfQorCitpbnRlcm5hbCBlbnVtIGVTdHlsZVByb3BlcnR5IHsKKyAgRm9ybWF0LAorICBOYW1lLAorICBTaXplLAorICBCb2xkLAorICBJdGFsaWMsCisgIFN0cmlrZSwKKyAgQ29sb3IsCisgIFRpbnQsCisgIEluZGV4ZWRDb2xvciwKKyAgQXV0b0NvbG9yLAorICBHcmFkaWVudENvbG9yLAorICBGYW1pbHksCisgIFNjaGVtZSwKKyAgVW5kZXJsaW5lVHlwZSwKKyAgSG9yaXpvbnRhbEFsaWduLAorICBWZXJ0aWNhbEFsaWduLAorICBCb3JkZXIsCisgIE5hbWVkU3R5bGUsCisgIFN0eWxlLAorICBQYXR0ZXJuVHlwZSwKKyAgUmVhZGluZ09yZGVyLAorICBXcmFwVGV4dCwKKyAgVGV4dFJvdGF0aW9uLAorICBMb2NrZWQsCisgIEhpZGRlbiwKKyAgU2hyaW5rVG9GaXQsCisgIEJvcmRlckRpYWdvbmFsVXAsCisgIEJvcmRlckRpYWdvbmFsRG93biwKKyAgR3JhZGllbnREZWdyZWUsCisgIEdyYWRpZW50VHlwZSwKKyAgR3JhZGllbnRUb3AsCisgIEdyYWRpZW50Qm90dG9tLAorICBHcmFkaWVudExlZnQsCisgIEdyYWRpZW50UmlnaHQsCisgIFhmSWQsCisgIEluZGVudCwKK30KKworaW50ZXJuYWwgY2xhc3MgU3R5bGVDaGFuZ2VFdmVudEFyZ3MgOiBFdmVudEFyZ3MgeworICBpbnRlcm5hbCBTdHlsZUNoYW5nZUV2ZW50QXJncygKKyAgICAgIGVTdHlsZUNsYXNzIHN0eWxlY2xhc3MsCisgICAgICBlU3R5bGVQcm9wZXJ0eSBzdHlsZVByb3BlcnR5LAorICAgICAgb2JqZWN0IHZhbHVlLAorICAgICAgaW50IHBvc2l0aW9uSWQsCisgICAgICBzdHJpbmcgYWRkcmVzcykgeworICAgIFN0eWxlQ2xhc3MgPSBzdHlsZWNsYXNzOworICAgIFN0eWxlUHJvcGVydHkgPSBzdHlsZVByb3BlcnR5OworICAgIFZhbHVlID0gdmFsdWU7CisgICAgQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgUG9zaXRpb25JRCA9IHBvc2l0aW9uSWQ7CisgIH0KKworICBpbnRlcm5hbCBlU3R5bGVDbGFzcyBTdHlsZUNsYXNzOworICBpbnRlcm5hbCBlU3R5bGVQcm9wZXJ0eSBTdHlsZVByb3BlcnR5OworCisgIC8vaW50ZXJuYWwgc3RyaW5nIFByb3BlcnR5TmFtZTsKKyAgaW50ZXJuYWwgb2JqZWN0IFZhbHVlOworCisgIGludGVybmFsIGludCBQb3NpdGlvbklEIHsgZ2V0OyBzZXQ7IH0KKworICAvL2ludGVybmFsIHN0cmluZyBBZGRyZXNzOworICBpbnRlcm5hbCBzdHJpbmcgQWRkcmVzczsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxCb3JkZXJJdGVtWG1sLmNzIGIvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEJvcmRlckl0ZW1YbWwuY3MKaW5kZXggZTJmOTFiMi4uN2U5NDQ4MSAxMDA2NDQKLS0tIGEvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEJvcmRlckl0ZW1YbWwuY3MKKysrIGIvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEJvcmRlckl0ZW1YbWwuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDE0NSArMTMsMTIzIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCiAgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uWG1sOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5TdHlsZTsKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzcwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gWG1sIGFjY2VzcyBjbGFzcyBmb3IgYm9yZGVyIGl0ZW1zCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsQm9yZGVySXRlbVhtbCA6IFN0eWxlWG1sSGVscGVyCi0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbEJvcmRlckl0ZW1YbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKSA6IGJhc2UobmFtZVNwYWNlTWFuYWdlcikKLSAgICAgICAgewotICAgICAgICAgICAgX2JvcmRlclN0eWxlPUV4Y2VsQm9yZGVyU3R5bGUuTm9uZTsKLSAgICAgICAgICAgIF9jb2xvciA9IG5ldyBFeGNlbENvbG9yWG1sKE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsQm9yZGVySXRlbVhtbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbSwgWG1sTm9kZSB0b3BOb2RlKSA6Ci0gICAgICAgICAgICBiYXNlKG5zbSwgdG9wTm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRvcE5vZGUgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfYm9yZGVyU3R5bGUgPSBHZXRCb3JkZXJTdHlsZShHZXRYbWxOb2RlU3RyaW5nKCJAc3R5bGUiKSk7Ci0gICAgICAgICAgICAgICAgX2NvbG9yID0gbmV3IEV4Y2VsQ29sb3JYbWwobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2NvbG9yUGF0aCwgbnNtKSk7Ci0gICAgICAgICAgICAgICAgRXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeGlzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogCi0gICAgICAgIHByaXZhdGUgRXhjZWxCb3JkZXJTdHlsZSBHZXRCb3JkZXJTdHlsZShzdHJpbmcgc3R5bGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHN0eWxlPT0iIikgcmV0dXJuIEV4Y2VsQm9yZGVyU3R5bGUuTm9uZTsKLSAgICAgICAgICAgIHN0cmluZyBzSW5TdHlsZSA9IHN0eWxlLlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgc3R5bGUuU3Vic3RyaW5nKDEsIHN0eWxlLkxlbmd0aCAtIDEpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChFeGNlbEJvcmRlclN0eWxlKUVudW0uUGFyc2UodHlwZW9mKEV4Y2VsQm9yZGVyU3R5bGUpLCBzSW5TdHlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbEJvcmRlclN0eWxlLk5vbmU7Ci0gICAgICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7CiAKLSAgICAgICAgfQotICAgICAgICBFeGNlbEJvcmRlclN0eWxlIF9ib3JkZXJTdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuTm9uZTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ2VsbCBCb3JkZXIgc3R5bGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQm9yZGVyU3R5bGUgU3R5bGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9ib3JkZXJTdHlsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9ib3JkZXJTdHlsZSA9IHZhbHVlOwotICAgICAgICAgICAgICAgIEV4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxDb2xvclhtbCBfY29sb3IgPSBudWxsOwotICAgICAgICBjb25zdCBzdHJpbmcgX2NvbG9yUGF0aCA9ICJkOmNvbG9yIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQm9yZGVyIHN0eWxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENvbG9yWG1sIENvbG9yCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY29sb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY29sb3IgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChFeGlzdHMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3R5bGUgKyBDb2xvci5JZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJOb25lIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBYbWwgYWNjZXNzIGNsYXNzIGZvciBib3JkZXIgaXRlbXMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsQm9yZGVySXRlbVhtbCA6IFN0eWxlWG1sSGVscGVyIHsKKyAgaW50ZXJuYWwgRXhjZWxCb3JkZXJJdGVtWG1sKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlcikKKyAgICAgIDogYmFzZShuYW1lU3BhY2VNYW5hZ2VyKSB7CisgICAgX2JvcmRlclN0eWxlID0gRXhjZWxCb3JkZXJTdHlsZS5Ob25lOworICAgIF9jb2xvciA9IG5ldyhOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgfQogCi0gICAgICAgIGludGVybmFsIEV4Y2VsQm9yZGVySXRlbVhtbCBDb3B5KCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxCb3JkZXJJdGVtWG1sIGJvcmRlckl0ZW0gPSBuZXcgRXhjZWxCb3JkZXJJdGVtWG1sKE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgYm9yZGVySXRlbS5TdHlsZSA9IF9ib3JkZXJTdHlsZTsKLSAgICAgICAgICAgIGJvcmRlckl0ZW0uQ29sb3IgPSBfY29sb3IuQ29weSgpOwotICAgICAgICAgICAgcmV0dXJuIGJvcmRlckl0ZW07Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBYbWxOb2RlIENyZWF0ZVhtbE5vZGUoWG1sTm9kZSB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBUb3BOb2RlID0gdG9wTm9kZTsKLQotICAgICAgICAgICAgaWYgKFN0eWxlICE9IEV4Y2VsQm9yZGVyU3R5bGUuTm9uZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAc3R5bGUiLCBTZXRCb3JkZXJTdHJpbmcoU3R5bGUpKTsKLSAgICAgICAgICAgICAgICBpZiAoQ29sb3IuRXhpc3RzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ3JlYXRlTm9kZShfY29sb3JQYXRoKTsKLSAgICAgICAgICAgICAgICAgICAgdG9wTm9kZS5BcHBlbmRDaGlsZChDb2xvci5DcmVhdGVYbWxOb2RlKFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfY29sb3JQYXRoLE5hbWVTcGFjZU1hbmFnZXIpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFRvcE5vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0cmluZyBTZXRCb3JkZXJTdHJpbmcoRXhjZWxCb3JkZXJTdHlsZSBTdHlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIG5ld05hbWU9RW51bS5HZXROYW1lKHR5cGVvZihFeGNlbEJvcmRlclN0eWxlKSwgU3R5bGUpOwotICAgICAgICAgICAgcmV0dXJuIG5ld05hbWUuU3Vic3RyaW5nKDAsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyBuZXdOYW1lLlN1YnN0cmluZygxLCBuZXdOYW1lLkxlbmd0aCAtIDEpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBib29sIEV4aXN0cyB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgaW50ZXJuYWwgRXhjZWxCb3JkZXJJdGVtWG1sKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnNtLCBYbWxOb2RlIHRvcE5vZGUpCisgICAgICA6IGJhc2UobnNtLCB0b3BOb2RlKSB7CisgICAgaWYgKHRvcE5vZGUgIT0gbnVsbCkgeworICAgICAgX2JvcmRlclN0eWxlID0gR2V0Qm9yZGVyU3R5bGUoR2V0WG1sTm9kZVN0cmluZygiQHN0eWxlIikpOworICAgICAgX2NvbG9yID0gbmV3KG5zbSwgdG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9jb2xvclBhdGgsIG5zbSkpOworICAgICAgRXhpc3RzID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgRXhpc3RzID0gZmFsc2U7CiAgICAgfQorICB9CisKKyAgcHJpdmF0ZSBFeGNlbEJvcmRlclN0eWxlIEdldEJvcmRlclN0eWxlKHN0cmluZyBzdHlsZSkgeworICAgIGlmIChzdHlsZSA9PSAiIikgeworICAgICAgcmV0dXJuIEV4Y2VsQm9yZGVyU3R5bGUuTm9uZTsKKyAgICB9CisgICAgc3RyaW5nIHNJblN0eWxlID0KKyAgICAgICAgc3R5bGUuU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkKKyAgICAgICAgICAgICsgc3R5bGUuU3Vic3RyaW5nKDEsIHN0eWxlLkxlbmd0aCAtIDEpOworICAgIHRyeSB7CisgICAgICByZXR1cm4gKEV4Y2VsQm9yZGVyU3R5bGUpRW51bS5QYXJzZSh0eXBlb2YoRXhjZWxCb3JkZXJTdHlsZSksIHNJblN0eWxlKTsKKyAgICB9IGNhdGNoIHsKKyAgICAgIHJldHVybiBFeGNlbEJvcmRlclN0eWxlLk5vbmU7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBFeGNlbEJvcmRlclN0eWxlIF9ib3JkZXJTdHlsZSA9IEV4Y2VsQm9yZGVyU3R5bGUuTm9uZTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDZWxsIEJvcmRlciBzdHlsZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxCb3JkZXJTdHlsZSBTdHlsZSB7CisgICAgZ2V0ID0+IF9ib3JkZXJTdHlsZTsKKyAgICBzZXQgeworICAgICAgX2JvcmRlclN0eWxlID0gdmFsdWU7CisgICAgICBFeGlzdHMgPSB0cnVlOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgRXhjZWxDb2xvclhtbCBfY29sb3I7CisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9jb2xvclBhdGggPSAiZDpjb2xvciI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQm9yZGVyIHN0eWxlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbENvbG9yWG1sIENvbG9yIHsKKyAgICBnZXQgPT4gX2NvbG9yOworICAgIGludGVybmFsIHNldCA9PiBfY29sb3IgPSB2YWx1ZTsKKyAgfQorCisgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZCB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChFeGlzdHMpIHsKKyAgICAgICAgcmV0dXJuIFN0eWxlICsgQ29sb3IuSWQ7CisgICAgICB9CisgICAgICByZXR1cm4gIk5vbmUiOworICAgIH0KKyAgfQorCisgIGludGVybmFsIEV4Y2VsQm9yZGVySXRlbVhtbCBDb3B5KCkgeworICAgIEV4Y2VsQm9yZGVySXRlbVhtbCBib3JkZXJJdGVtID0gbmV3IEV4Y2VsQm9yZGVySXRlbVhtbChOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBib3JkZXJJdGVtLlN0eWxlID0gX2JvcmRlclN0eWxlOworICAgIGJvcmRlckl0ZW0uQ29sb3IgPSBfY29sb3IuQ29weSgpOworICAgIHJldHVybiBib3JkZXJJdGVtOworICB9CisKKyAgaW50ZXJuYWwgb3ZlcnJpZGUgWG1sTm9kZSBDcmVhdGVYbWxOb2RlKFhtbE5vZGUgdG9wTm9kZSkgeworICAgIFRvcE5vZGUgPSB0b3BOb2RlOworCisgICAgaWYgKFN0eWxlICE9IEV4Y2VsQm9yZGVyU3R5bGUuTm9uZSkgeworICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHN0eWxlIiwgU2V0Qm9yZGVyU3RyaW5nKFN0eWxlKSk7CisgICAgICBpZiAoQ29sb3IuRXhpc3RzKSB7CisgICAgICAgIENyZWF0ZU5vZGUoX2NvbG9yUGF0aCk7CisgICAgICAgIHRvcE5vZGUuQXBwZW5kQ2hpbGQoCisgICAgICAgICAgICBDb2xvci5DcmVhdGVYbWxOb2RlKFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfY29sb3JQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVG9wTm9kZTsKKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIFNldEJvcmRlclN0cmluZyhFeGNlbEJvcmRlclN0eWxlIHN0eWxlKSB7CisgICAgc3RyaW5nIG5ld05hbWUgPSBFbnVtLkdldE5hbWUodHlwZW9mKEV4Y2VsQm9yZGVyU3R5bGUpLCBzdHlsZSk7CisgICAgcmV0dXJuIG5ld05hbWUuU3Vic3RyaW5nKDAsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkKKyAgICAgICAgKyBuZXdOYW1lLlN1YnN0cmluZygxLCBuZXdOYW1lLkxlbmd0aCAtIDEpOworICB9CisKKyAgcHVibGljIGJvb2wgRXhpc3RzIHsgZ2V0OyBwcml2YXRlIHNldDsgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEJvcmRlclhtbC5jcyBiL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxCb3JkZXJYbWwuY3MKaW5kZXggNzAwZjMxOS4uOWE3ZTEyYyAxMDA2NDQKLS0tIGEvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEJvcmRlclhtbC5jcworKysgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsQm9yZGVyWG1sLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywyMDYgKzEzLDE1OSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7CisKIHVzaW5nIFN5c3RlbS5YbWw7Ci1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3MKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFhtbCBhY2Nlc3MgY2xhc3MgZm9yIGJvcmRlciB0b3AgbGV2ZWwKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxCb3JkZXJYbWwgOiBTdHlsZVhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxCb3JkZXJYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQotICAgICAgICAgICAgOiBiYXNlKG5hbWVTcGFjZU1hbmFnZXIpCi0gICAgICAgIHsKIAotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsQm9yZGVyWG1sKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnNtLCBYbWxOb2RlIHRvcE5vZGUpIDoKLSAgICAgICAgICAgIGJhc2UobnNtLCB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBfbGVmdCA9IG5ldyBFeGNlbEJvcmRlckl0ZW1YbWwobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUobGVmdFBhdGgsIG5zbSkpOwotICAgICAgICAgICAgX3JpZ2h0ID0gbmV3IEV4Y2VsQm9yZGVySXRlbVhtbChuc20sIHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShyaWdodFBhdGgsIG5zbSkpOwotICAgICAgICAgICAgX3RvcCA9IG5ldyBFeGNlbEJvcmRlckl0ZW1YbWwobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUodG9wUGF0aCwgbnNtKSk7Ci0gICAgICAgICAgICBfYm90dG9tID0gbmV3IEV4Y2VsQm9yZGVySXRlbVhtbChuc20sIHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShib3R0b21QYXRoLCBuc20pKTsKLSAgICAgICAgICAgIF9kaWFnb25hbCA9IG5ldyBFeGNlbEJvcmRlckl0ZW1YbWwobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoZGlhZ29uYWxQYXRoLCBuc20pKTsKLSAgICAgICAgICAgIF9kaWFnb25hbFVwID0gR2V0Qm9vbFZhbHVlKHRvcE5vZGUsIGRpYWdvbmFsVXBQYXRoKTsKLSAgICAgICAgICAgIF9kaWFnb25hbERvd24gPSBHZXRCb29sVmFsdWUodG9wTm9kZSwgZGlhZ29uYWxEb3duUGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBMZWZ0LklkICsgUmlnaHQuSWQgKyBUb3AuSWQgKyBCb3R0b20uSWQgKyBEaWFnb25hbC5JZCArIERpYWdvbmFsVXAuVG9TdHJpbmcoKSArIERpYWdvbmFsRG93bi5Ub1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBsZWZ0UGF0aCA9ICJkOmxlZnQiOwotICAgICAgICBFeGNlbEJvcmRlckl0ZW1YbWwgX2xlZnQgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMZWZ0IGJvcmRlciBzdHlsZSBwcm9wZXJ0aWVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW1YbWwgTGVmdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2xlZnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfbGVmdCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyByaWdodFBhdGggPSAiZDpyaWdodCI7Ci0gICAgICAgIEV4Y2VsQm9yZGVySXRlbVhtbCBfcmlnaHQgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSaWdodCBib3JkZXIgc3R5bGUgcHJvcGVydGllcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxCb3JkZXJJdGVtWG1sIFJpZ2h0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfcmlnaHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfcmlnaHQgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgdG9wUGF0aCA9ICJkOnRvcCI7Ci0gICAgICAgIEV4Y2VsQm9yZGVySXRlbVhtbCBfdG9wID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVG9wIGJvcmRlciBzdHlsZSBwcm9wZXJ0aWVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW1YbWwgVG9wCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfdG9wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWwgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3RvcCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBib3R0b21QYXRoID0gImQ6Ym90dG9tIjsKLSAgICAgICAgRXhjZWxCb3JkZXJJdGVtWG1sIF9ib3R0b20gPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBCb3R0b20gYm9yZGVyIHN0eWxlIHByb3BlcnRpZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQm9yZGVySXRlbVhtbCBCb3R0b20KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9ib3R0b207Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfYm90dG9tID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIGRpYWdvbmFsUGF0aCA9ICJkOmRpYWdvbmFsIjsKLSAgICAgICAgRXhjZWxCb3JkZXJJdGVtWG1sIF9kaWFnb25hbCA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERpYWdvbmFsIGJvcmRlciBzdHlsZSBwcm9wZXJ0aWVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW1YbWwgRGlhZ29uYWwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9kaWFnb25hbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9kaWFnb25hbCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBkaWFnb25hbFVwUGF0aCA9ICJAZGlhZ29uYWxVcCI7Ci0gICAgICAgIGJvb2wgX2RpYWdvbmFsVXAgPSBmYWxzZTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGlhZ29uYWwgdXAgYm9yZGVyCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIERpYWdvbmFsVXAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9kaWFnb25hbFVwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWwgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2RpYWdvbmFsVXAgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgZGlhZ29uYWxEb3duUGF0aCA9ICJAZGlhZ29uYWxEb3duIjsKLSAgICAgICAgYm9vbCBfZGlhZ29uYWxEb3duID0gZmFsc2U7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERpYWdvbmFsIGRvd24gYm9yZGVyCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIERpYWdvbmFsRG93bgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2RpYWdvbmFsRG93bjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9kaWFnb25hbERvd24gPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzOwogCi0gICAgICAgIGludGVybmFsIEV4Y2VsQm9yZGVyWG1sIENvcHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeGNlbEJvcmRlclhtbCBuZXdCb3JkZXIgPSBuZXcgRXhjZWxCb3JkZXJYbWwoTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICBuZXdCb3JkZXIuQm90dG9tID0gX2JvdHRvbS5Db3B5KCk7Ci0gICAgICAgICAgICBuZXdCb3JkZXIuRGlhZ29uYWwgPSBfZGlhZ29uYWwuQ29weSgpOwotICAgICAgICAgICAgbmV3Qm9yZGVyLkxlZnQgPSBfbGVmdC5Db3B5KCk7Ci0gICAgICAgICAgICBuZXdCb3JkZXIuUmlnaHQgPSBfcmlnaHQuQ29weSgpOwotICAgICAgICAgICAgbmV3Qm9yZGVyLlRvcCA9IF90b3AuQ29weSgpOwotICAgICAgICAgICAgbmV3Qm9yZGVyLkRpYWdvbmFsVXAgPSBfZGlhZ29uYWxVcDsKLSAgICAgICAgICAgIG5ld0JvcmRlci5EaWFnb25hbERvd24gPSBfZGlhZ29uYWxEb3duOworLy8vIDxzdW1tYXJ5PgorLy8vIFhtbCBhY2Nlc3MgY2xhc3MgZm9yIGJvcmRlciB0b3AgbGV2ZWwKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsQm9yZGVyWG1sIDogU3R5bGVYbWxIZWxwZXIgeworICBpbnRlcm5hbCBFeGNlbEJvcmRlclhtbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UobmFtZVNwYWNlTWFuYWdlcikge30KIAotICAgICAgICAgICAgcmV0dXJuIG5ld0JvcmRlcjsKKyAgaW50ZXJuYWwgRXhjZWxCb3JkZXJYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuc20sIFhtbE5vZGUgdG9wTm9kZSkKKyAgICAgIDogYmFzZShuc20sIHRvcE5vZGUpIHsKKyAgICBfbGVmdCA9IG5ldyhuc20sIHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfbGVmdFBhdGgsIG5zbSkpOworICAgIF9yaWdodCA9IG5ldyhuc20sIHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfcmlnaHRQYXRoLCBuc20pKTsKKyAgICBfdG9wID0gbmV3KG5zbSwgdG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF90b3BQYXRoLCBuc20pKTsKKyAgICBfYm90dG9tID0gbmV3KG5zbSwgdG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9ib3R0b21QYXRoLCBuc20pKTsKKyAgICBfZGlhZ29uYWwgPSBuZXcobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2RpYWdvbmFsUGF0aCwgbnNtKSk7CisgICAgX2RpYWdvbmFsVXAgPSBHZXRCb29sVmFsdWUodG9wTm9kZSwgX2RpYWdvbmFsVXBQYXRoKTsKKyAgICBfZGlhZ29uYWxEb3duID0gR2V0Qm9vbFZhbHVlKHRvcE5vZGUsIF9kaWFnb25hbERvd25QYXRoKTsKKyAgfQogCi0gICAgICAgIH0KKyAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkID0+CisgICAgTGVmdC5JZCArIFJpZ2h0LklkICsgVG9wLklkICsgQm90dG9tLklkICsgRGlhZ29uYWwuSWQgKyBEaWFnb25hbFVwICsgRGlhZ29uYWxEb3duOwogCi0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIFhtbE5vZGUgQ3JlYXRlWG1sTm9kZShYbWxOb2RlIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRvcE5vZGUgPSB0b3BOb2RlOwotICAgICAgICAgICAgQ3JlYXRlTm9kZShsZWZ0UGF0aCk7Ci0gICAgICAgICAgICB0b3BOb2RlLkFwcGVuZENoaWxkKF9sZWZ0LkNyZWF0ZVhtbE5vZGUoVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKGxlZnRQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSkpOwotICAgICAgICAgICAgQ3JlYXRlTm9kZShyaWdodFBhdGgpOwotICAgICAgICAgICAgdG9wTm9kZS5BcHBlbmRDaGlsZChfcmlnaHQuQ3JlYXRlWG1sTm9kZShUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUocmlnaHRQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSkpOwotICAgICAgICAgICAgQ3JlYXRlTm9kZSh0b3BQYXRoKTsKLSAgICAgICAgICAgIHRvcE5vZGUuQXBwZW5kQ2hpbGQoX3RvcC5DcmVhdGVYbWxOb2RlKFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSh0b3BQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSkpOwotICAgICAgICAgICAgQ3JlYXRlTm9kZShib3R0b21QYXRoKTsKLSAgICAgICAgICAgIHRvcE5vZGUuQXBwZW5kQ2hpbGQoX2JvdHRvbS5DcmVhdGVYbWxOb2RlKFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShib3R0b21QYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSkpOwotICAgICAgICAgICAgQ3JlYXRlTm9kZShkaWFnb25hbFBhdGgpOwotICAgICAgICAgICAgdG9wTm9kZS5BcHBlbmRDaGlsZChfZGlhZ29uYWwuQ3JlYXRlWG1sTm9kZShUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoZGlhZ29uYWxQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSkpOwotICAgICAgICAgICAgaWYgKF9kaWFnb25hbFVwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoZGlhZ29uYWxVcFBhdGgsICIxIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoX2RpYWdvbmFsRG93bikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKGRpYWdvbmFsRG93blBhdGgsICIxIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdG9wTm9kZTsKLSAgICAgICAgfQorICBwcml2YXRlIGNvbnN0IHN0cmluZyBfbGVmdFBhdGggPSAiZDpsZWZ0IjsKKyAgcHJpdmF0ZSBFeGNlbEJvcmRlckl0ZW1YbWwgX2xlZnQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTGVmdCBib3JkZXIgc3R5bGUgcHJvcGVydGllcworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxCb3JkZXJJdGVtWG1sIExlZnQgeworICAgIGdldCB7IHJldHVybiBfbGVmdDsgfQorICAgIGludGVybmFsIHNldCB7IF9sZWZ0ID0gdmFsdWU7IH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9yaWdodFBhdGggPSAiZDpyaWdodCI7CisgIHByaXZhdGUgRXhjZWxCb3JkZXJJdGVtWG1sIF9yaWdodDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSaWdodCBib3JkZXIgc3R5bGUgcHJvcGVydGllcworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxCb3JkZXJJdGVtWG1sIFJpZ2h0IHsKKyAgICBnZXQgeyByZXR1cm4gX3JpZ2h0OyB9CisgICAgaW50ZXJuYWwgc2V0IHsgX3JpZ2h0ID0gdmFsdWU7IH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF90b3BQYXRoID0gImQ6dG9wIjsKKyAgcHJpdmF0ZSBFeGNlbEJvcmRlckl0ZW1YbWwgX3RvcDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUb3AgYm9yZGVyIHN0eWxlIHByb3BlcnRpZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsQm9yZGVySXRlbVhtbCBUb3AgeworICAgIGdldCB7IHJldHVybiBfdG9wOyB9CisgICAgaW50ZXJuYWwgc2V0IHsgX3RvcCA9IHZhbHVlOyB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYm90dG9tUGF0aCA9ICJkOmJvdHRvbSI7CisgIHByaXZhdGUgRXhjZWxCb3JkZXJJdGVtWG1sIF9ib3R0b207CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQm90dG9tIGJvcmRlciBzdHlsZSBwcm9wZXJ0aWVzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW1YbWwgQm90dG9tIHsKKyAgICBnZXQgeyByZXR1cm4gX2JvdHRvbTsgfQorICAgIGludGVybmFsIHNldCB7IF9ib3R0b20gPSB2YWx1ZTsgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2RpYWdvbmFsUGF0aCA9ICJkOmRpYWdvbmFsIjsKKyAgcHJpdmF0ZSBFeGNlbEJvcmRlckl0ZW1YbWwgX2RpYWdvbmFsOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIERpYWdvbmFsIGJvcmRlciBzdHlsZSBwcm9wZXJ0aWVzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEJvcmRlckl0ZW1YbWwgRGlhZ29uYWwgeworICAgIGdldCB7IHJldHVybiBfZGlhZ29uYWw7IH0KKyAgICBpbnRlcm5hbCBzZXQgeyBfZGlhZ29uYWwgPSB2YWx1ZTsgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2RpYWdvbmFsVXBQYXRoID0gIkBkaWFnb25hbFVwIjsKKyAgcHJpdmF0ZSBib29sIF9kaWFnb25hbFVwOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIERpYWdvbmFsIHVwIGJvcmRlcgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBEaWFnb25hbFVwIHsKKyAgICBnZXQgeyByZXR1cm4gX2RpYWdvbmFsVXA7IH0KKyAgICBpbnRlcm5hbCBzZXQgeyBfZGlhZ29uYWxVcCA9IHZhbHVlOyB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZGlhZ29uYWxEb3duUGF0aCA9ICJAZGlhZ29uYWxEb3duIjsKKyAgcHJpdmF0ZSBib29sIF9kaWFnb25hbERvd247CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRGlhZ29uYWwgZG93biBib3JkZXIKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgRGlhZ29uYWxEb3duIHsKKyAgICBnZXQgeyByZXR1cm4gX2RpYWdvbmFsRG93bjsgfQorICAgIGludGVybmFsIHNldCB7IF9kaWFnb25hbERvd24gPSB2YWx1ZTsgfQorICB9CisKKyAgaW50ZXJuYWwgRXhjZWxCb3JkZXJYbWwgQ29weSgpIHsKKyAgICBFeGNlbEJvcmRlclhtbCBuZXdCb3JkZXIgPSBuZXcgRXhjZWxCb3JkZXJYbWwoTmFtZVNwYWNlTWFuYWdlcik7CisgICAgbmV3Qm9yZGVyLkJvdHRvbSA9IF9ib3R0b20uQ29weSgpOworICAgIG5ld0JvcmRlci5EaWFnb25hbCA9IF9kaWFnb25hbC5Db3B5KCk7CisgICAgbmV3Qm9yZGVyLkxlZnQgPSBfbGVmdC5Db3B5KCk7CisgICAgbmV3Qm9yZGVyLlJpZ2h0ID0gX3JpZ2h0LkNvcHkoKTsKKyAgICBuZXdCb3JkZXIuVG9wID0gX3RvcC5Db3B5KCk7CisgICAgbmV3Qm9yZGVyLkRpYWdvbmFsVXAgPSBfZGlhZ29uYWxVcDsKKyAgICBuZXdCb3JkZXIuRGlhZ29uYWxEb3duID0gX2RpYWdvbmFsRG93bjsKKworICAgIHJldHVybiBuZXdCb3JkZXI7CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBYbWxOb2RlIENyZWF0ZVhtbE5vZGUoWG1sTm9kZSB0b3BOb2RlKSB7CisgICAgVG9wTm9kZSA9IHRvcE5vZGU7CisgICAgQ3JlYXRlTm9kZShfbGVmdFBhdGgpOworICAgIHRvcE5vZGUuQXBwZW5kQ2hpbGQoX2xlZnQuQ3JlYXRlWG1sTm9kZShUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2xlZnRQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSkpOworICAgIENyZWF0ZU5vZGUoX3JpZ2h0UGF0aCk7CisgICAgdG9wTm9kZS5BcHBlbmRDaGlsZCgKKyAgICAgICAgX3JpZ2h0LkNyZWF0ZVhtbE5vZGUoVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9yaWdodFBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpKSk7CisgICAgQ3JlYXRlTm9kZShfdG9wUGF0aCk7CisgICAgdG9wTm9kZS5BcHBlbmRDaGlsZChfdG9wLkNyZWF0ZVhtbE5vZGUoVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF90b3BQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSkpOworICAgIENyZWF0ZU5vZGUoX2JvdHRvbVBhdGgpOworICAgIHRvcE5vZGUuQXBwZW5kQ2hpbGQoCisgICAgICAgIF9ib3R0b20uQ3JlYXRlWG1sTm9kZShUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2JvdHRvbVBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpKSk7CisgICAgQ3JlYXRlTm9kZShfZGlhZ29uYWxQYXRoKTsKKyAgICB0b3BOb2RlLkFwcGVuZENoaWxkKAorICAgICAgICBfZGlhZ29uYWwuQ3JlYXRlWG1sTm9kZShUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2RpYWdvbmFsUGF0aCwgTmFtZVNwYWNlTWFuYWdlcikpKTsKKyAgICBpZiAoX2RpYWdvbmFsVXApIHsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2RpYWdvbmFsVXBQYXRoLCAiMSIpOwogICAgIH0KKyAgICBpZiAoX2RpYWdvbmFsRG93bikgeworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfZGlhZ29uYWxEb3duUGF0aCwgIjEiKTsKKyAgICB9CisgICAgcmV0dXJuIHRvcE5vZGU7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxDb2xvclhtbC5jcyBiL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxDb2xvclhtbC5jcwppbmRleCBiNjM2MTE5Li5iYTFmZDExIDEwMDY0NAotLS0gYS9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsQ29sb3JYbWwuY3MKKysrIGIvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbENvbG9yWG1sLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywyMDcgKzEzLDE2OSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCSAgICAgICAgICAgICAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgMjAwOS0xMC0wMQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBTeXN0ZW0uRHJhd2luZzsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBYbWwgYWNjZXNzIGNsYXNzIGZvciBjb2xvcgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBFeGNlbENvbG9yWG1sIDogU3R5bGVYbWxIZWxwZXIKLSAgICB7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsQ29sb3JYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQotICAgICAgICAgICAgOiBiYXNlKG5hbWVTcGFjZU1hbmFnZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9hdXRvID0gZmFsc2U7Ci0gICAgICAgICAgICBfdGhlbWUgPSAiIjsKLSAgICAgICAgICAgIF90aW50ID0gMDsKLSAgICAgICAgICAgIF9yZ2IgPSAiIjsKLSAgICAgICAgICAgIF9pbmRleGVkID0gaW50Lk1pblZhbHVlOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsQ29sb3JYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuc20sIFhtbE5vZGUgdG9wTm9kZSkgOgotICAgICAgICAgICAgYmFzZShuc20sIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHRvcE5vZGU9PW51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2V4aXN0cz1mYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBfYXV0byA9IEdldFhtbE5vZGVCb29sKCJAYXV0byIpOwotICAgICAgICAgICAgICAgIF90aGVtZSA9IEdldFhtbE5vZGVTdHJpbmcoIkB0aGVtZSIpOwotICAgICAgICAgICAgICAgIF90aW50ID0gR2V0WG1sTm9kZURlY2ltYWxOdWxsKCJAdGludCIpPz9kZWNpbWFsLk1pblZhbHVlOwotICAgICAgICAgICAgICAgIF9yZ2IgPSBHZXRYbWxOb2RlU3RyaW5nKCJAcmdiIik7Ci0gICAgICAgICAgICAgICAgX2luZGV4ZWQgPSBHZXRYbWxOb2RlSW50TnVsbCgiQGluZGV4ZWQiKSA/PyBpbnQuTWluVmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2F1dG8uVG9TdHJpbmcoKSArICJ8IiArIF90aGVtZSArICJ8IiArIF90aW50ICsgInwiICsgX3JnYiArICJ8IiArIF9pbmRleGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJvb2wgX2F1dG87Ci0gICAgICAgIHB1YmxpYyBib29sIEF1dG8KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9hdXRvOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2F1dG8gPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBfZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBDbGVhcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN0cmluZyBfdGhlbWU7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZW1lIGNvbG9yIHZhbHVlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVGhlbWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF90aGVtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZWNpbWFsIF90aW50OwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaW50Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkZWNpbWFsIFRpbnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF90aW50ID09IGRlY2ltYWwuTWluVmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF90aW50ID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgX2V4aXN0cyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIF9yZ2I7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJHQiB2YWx1ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIFJnYgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3JnYjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9yZ2IgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBfZXhpc3RzPXRydWU7Ci0gICAgICAgICAgICAgICAgX2luZGV4ZWQgPSBpbnQuTWluVmFsdWU7Ci0gICAgICAgICAgICAgICAgX2F1dG8gPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgX2luZGV4ZWQ7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluZGV4ZWQgY29sb3IgdmFsdWUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBJbmRleGVkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoX2luZGV4ZWQgPT0gaW50Lk1pblZhbHVlID8gMCA6IF9pbmRleGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiA2NSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJJbmRleCBvdXQgb2YgcmFuZ2UiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIENsZWFyKCk7Ci0gICAgICAgICAgICAgICAgX2luZGV4ZWQgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBfZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCB2b2lkIENsZWFyKCkKLSAgICAgICAgewotICAgICAgICAgICAgX3RoZW1lID0gIiI7Ci0gICAgICAgICAgICBfdGludCA9IGRlY2ltYWwuTWluVmFsdWU7Ci0gICAgICAgICAgICBfaW5kZXhlZCA9IGludC5NaW5WYWx1ZTsKLSAgICAgICAgICAgIF9yZ2IgPSAiIjsKLSAgICAgICAgICAgIF9hdXRvID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0Q29sb3IoU3lzdGVtLkRyYXdpbmcuQ29sb3IgY29sb3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENsZWFyKCk7Ci0gICAgICAgICAgICBfcmdiID0gY29sb3IuVG9BcmdiKCkuVG9TdHJpbmcoIlgiKTsKLSAgICAgICAgfQordXNpbmcgU3lzdGVtLlhtbDsKIAotICAgICAgICBpbnRlcm5hbCBFeGNlbENvbG9yWG1sIENvcHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEV4Y2VsQ29sb3JYbWwoTmFtZVNwYWNlTWFuYWdlcikge19pbmRleGVkPV9pbmRleGVkLCBfdGludD1fdGludCwgX3JnYj1fcmdiLCBfdGhlbWU9X3RoZW1lLCBfYXV0bz1fYXV0bywgX2V4aXN0cz1fZXhpc3RzIH07Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKIAotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBYbWxOb2RlIENyZWF0ZVhtbE5vZGUoWG1sTm9kZSB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBUb3BOb2RlID0gdG9wTm9kZTsKLSAgICAgICAgICAgIGlmKF9yZ2IhPSIiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkByZ2IiLCBfcmdiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKF9pbmRleGVkID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGluZGV4ZWQiLCBfaW5kZXhlZC5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKF9hdXRvKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAYXV0byIsIF9hdXRvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAdGhlbWUiLCBfdGhlbWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoX3RpbnQgIT0gZGVjaW1hbC5NaW5WYWx1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAdGludCIsIF90aW50LlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBUb3BOb2RlOwotICAgICAgICB9CisvLy8gPHN1bW1hcnk+CisvLy8gWG1sIGFjY2VzcyBjbGFzcyBmb3IgY29sb3IKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsQ29sb3JYbWwgOiBTdHlsZVhtbEhlbHBlciB7CisgIGludGVybmFsIEV4Y2VsQ29sb3JYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKG5hbWVTcGFjZU1hbmFnZXIpIHsKKyAgICBfYXV0byA9IGZhbHNlOworICAgIF90aGVtZSA9ICIiOworICAgIF90aW50ID0gMDsKKyAgICBfcmdiID0gIiI7CisgICAgX2luZGV4ZWQgPSBpbnQuTWluVmFsdWU7CisgIH0KIAotICAgICAgICBib29sIF9leGlzdHM7Ci0gICAgICAgIGludGVybmFsIGJvb2wgRXhpc3RzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfZXhpc3RzOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgIGludGVybmFsIEV4Y2VsQ29sb3JYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuc20sIFhtbE5vZGUgdG9wTm9kZSkKKyAgICAgIDogYmFzZShuc20sIHRvcE5vZGUpIHsKKyAgICBpZiAodG9wTm9kZSA9PSBudWxsKSB7CisgICAgICBfZXhpc3RzID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIF9leGlzdHMgPSB0cnVlOworICAgICAgX2F1dG8gPSBHZXRYbWxOb2RlQm9vbCgiQGF1dG8iKTsKKyAgICAgIF90aGVtZSA9IEdldFhtbE5vZGVTdHJpbmcoIkB0aGVtZSIpOworICAgICAgX3RpbnQgPSBHZXRYbWxOb2RlRGVjaW1hbE51bGwoIkB0aW50IikgPz8gZGVjaW1hbC5NaW5WYWx1ZTsKKyAgICAgIF9yZ2IgPSBHZXRYbWxOb2RlU3RyaW5nKCJAcmdiIik7CisgICAgICBfaW5kZXhlZCA9IEdldFhtbE5vZGVJbnROdWxsKCJAaW5kZXhlZCIpID8/IGludC5NaW5WYWx1ZTsKICAgICB9CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQgPT4gX2F1dG8gKyAifCIgKyBfdGhlbWUgKyAifCIgKyBfdGludCArICJ8IiArIF9yZ2IgKyAifCIgKyBfaW5kZXhlZDsKKworICBwcml2YXRlIGJvb2wgX2F1dG87CisKKyAgcHVibGljIGJvb2wgQXV0byB7CisgICAgZ2V0ID0+IF9hdXRvOworICAgIHNldCB7CisgICAgICBfYXV0byA9IHZhbHVlOworICAgICAgX2V4aXN0cyA9IHRydWU7CisgICAgICBDbGVhcigpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIF90aGVtZTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGVtZSBjb2xvciB2YWx1ZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIFRoZW1lID0+IF90aGVtZTsKKworICBwcml2YXRlIGRlY2ltYWwgX3RpbnQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGludAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZGVjaW1hbCBUaW50IHsKKyAgICBnZXQgeworICAgICAgaWYgKF90aW50ID09IGRlY2ltYWwuTWluVmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICByZXR1cm4gX3RpbnQ7CisgICAgfQorICAgIHNldCB7CisgICAgICBfdGludCA9IHZhbHVlOworICAgICAgX2V4aXN0cyA9IHRydWU7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdHJpbmcgX3JnYjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSR0IgdmFsdWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBSZ2IgeworICAgIGdldCA9PiBfcmdiOworICAgIHNldCB7CisgICAgICBfcmdiID0gdmFsdWU7CisgICAgICBfZXhpc3RzID0gdHJ1ZTsKKyAgICAgIF9pbmRleGVkID0gaW50Lk1pblZhbHVlOworICAgICAgX2F1dG8gPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGludCBfaW5kZXhlZDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbmRleGVkIGNvbG9yIHZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgSW5kZXhlZCB7CisgICAgZ2V0ID0+IChfaW5kZXhlZCA9PSBpbnQuTWluVmFsdWUgPyAwIDogX2luZGV4ZWQpOworICAgIHNldCB7CisgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNjUpIHsKKyAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkluZGV4IG91dCBvZiByYW5nZSIpKTsKKyAgICAgIH0KKyAgICAgIENsZWFyKCk7CisgICAgICBfaW5kZXhlZCA9IHZhbHVlOworICAgICAgX2V4aXN0cyA9IHRydWU7CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgdm9pZCBDbGVhcigpIHsKKyAgICBfdGhlbWUgPSAiIjsKKyAgICBfdGludCA9IGRlY2ltYWwuTWluVmFsdWU7CisgICAgX2luZGV4ZWQgPSBpbnQuTWluVmFsdWU7CisgICAgX3JnYiA9ICIiOworICAgIF9hdXRvID0gZmFsc2U7CisgIH0KKworICBwdWJsaWMgdm9pZCBTZXRDb2xvcihDb2xvciBjb2xvcikgeworICAgIENsZWFyKCk7CisgICAgX3JnYiA9IGNvbG9yLlRvQXJnYigpLlRvU3RyaW5nKCJYIik7CisgIH0KKworICBpbnRlcm5hbCBFeGNlbENvbG9yWG1sIENvcHkoKSB7CisgICAgcmV0dXJuIG5ldyhOYW1lU3BhY2VNYW5hZ2VyKSB7CisgICAgICBfaW5kZXhlZCA9IF9pbmRleGVkLAorICAgICAgX3RpbnQgPSBfdGludCwKKyAgICAgIF9yZ2IgPSBfcmdiLAorICAgICAgX3RoZW1lID0gX3RoZW1lLAorICAgICAgX2F1dG8gPSBfYXV0bywKKyAgICAgIF9leGlzdHMgPSBfZXhpc3RzLAorICAgIH07CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBYbWxOb2RlIENyZWF0ZVhtbE5vZGUoWG1sTm9kZSB0b3BOb2RlKSB7CisgICAgVG9wTm9kZSA9IHRvcE5vZGU7CisgICAgaWYgKF9yZ2IgIT0gIiIpIHsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkByZ2IiLCBfcmdiKTsKKyAgICB9IGVsc2UgaWYgKF9pbmRleGVkID49IDApIHsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBpbmRleGVkIiwgX2luZGV4ZWQuVG9TdHJpbmcoKSk7CisgICAgfSBlbHNlIGlmIChfYXV0bykgeworICAgICAgU2V0WG1sTm9kZUJvb2woIkBhdXRvIiwgX2F1dG8pOworICAgIH0gZWxzZSB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAdGhlbWUiLCBfdGhlbWUpOworICAgIH0KKyAgICBpZiAoX3RpbnQgIT0gZGVjaW1hbC5NaW5WYWx1ZSkgeworICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHRpbnQiLCBfdGludC5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgfQorICAgIHJldHVybiBUb3BOb2RlOworICB9CisKKyAgcHJpdmF0ZSBib29sIF9leGlzdHM7CisKKyAgaW50ZXJuYWwgYm9vbCBFeGlzdHMgPT4gX2V4aXN0czsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxGaWxsWG1sLmNzIGIvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEZpbGxYbWwuY3MKaW5kZXggMmNlYTQyMy4uOThiN2M5ZCAxMDA2NDQKLS0tIGEvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEZpbGxYbWwuY3MKKysrIGIvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEZpbGxYbWwuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDE2MiArMTMsMTI2IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCiAgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uWG1sOwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBYbWwgYWNjZXNzIGNsYXNzIGZvciBmaWxscwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsRmlsbFhtbCA6IFN0eWxlWG1sSGVscGVyIAotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxGaWxsWG1sKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlcikKLSAgICAgICAgICAgIDogYmFzZShuYW1lU3BhY2VNYW5hZ2VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBfZmlsbFBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuTm9uZTsKLSAgICAgICAgICAgIF9iYWNrZ3JvdW5kQ29sb3IgPSBuZXcgRXhjZWxDb2xvclhtbChOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIF9wYXR0ZXJuQ29sb3IgPSBuZXcgRXhjZWxDb2xvclhtbChOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbEZpbGxYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuc20sIFhtbE5vZGUgdG9wTm9kZSk6Ci0gICAgICAgICAgICBiYXNlKG5zbSwgdG9wTm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgUGF0dGVyblR5cGUgPSBHZXRQYXR0ZXJuVHlwZShHZXRYbWxOb2RlU3RyaW5nKGZpbGxQYXR0ZXJuVHlwZVBhdGgpKTsKLSAgICAgICAgICAgIF9iYWNrZ3JvdW5kQ29sb3IgPSBuZXcgRXhjZWxDb2xvclhtbChuc20sIHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfYmFja2dyb3VuZENvbG9yUGF0aCwgbnNtKSk7Ci0gICAgICAgICAgICBfcGF0dGVybkNvbG9yID0gbmV3IEV4Y2VsQ29sb3JYbWwobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX3BhdHRlcm5Db2xvclBhdGgsIG5zbSkpOwotICAgICAgICB9CiAKLSAgICAgICAgcHJpdmF0ZSBFeGNlbEZpbGxTdHlsZSBHZXRQYXR0ZXJuVHlwZShzdHJpbmcgcGF0dGVyblR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwYXR0ZXJuVHlwZSA9PSAiIikgcmV0dXJuIEV4Y2VsRmlsbFN0eWxlLk5vbmU7Ci0gICAgICAgICAgICBwYXR0ZXJuVHlwZSA9IHBhdHRlcm5UeXBlLlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgcGF0dGVyblR5cGUuU3Vic3RyaW5nKDEsIHBhdHRlcm5UeXBlLkxlbmd0aCAtIDEpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChFeGNlbEZpbGxTdHlsZSlFbnVtLlBhcnNlKHR5cGVvZihFeGNlbEZpbGxTdHlsZSksIHBhdHRlcm5UeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsRmlsbFN0eWxlLk5vbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBQYXR0ZXJuVHlwZSArIFBhdHRlcm5Db2xvci5JZCArIEJhY2tncm91bmRDb2xvci5JZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgICAgIGNvbnN0IHN0cmluZyBmaWxsUGF0dGVyblR5cGVQYXRoID0gImQ6cGF0dGVybkZpbGwvQHBhdHRlcm5UeXBlIjsKLSAgICAgICAgcHJvdGVjdGVkIEV4Y2VsRmlsbFN0eWxlIF9maWxsUGF0dGVyblR5cGU7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENlbGwgZmlsbCBwYXR0ZXJuIHN0eWxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEZpbGxTdHlsZSBQYXR0ZXJuVHlwZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2ZpbGxQYXR0ZXJuVHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9maWxsUGF0dGVyblR5cGU9dmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIEV4Y2VsQ29sb3JYbWwgX3BhdHRlcm5Db2xvciA9IG51bGw7Ci0gICAgICAgIGNvbnN0IHN0cmluZyBfcGF0dGVybkNvbG9yUGF0aCA9ICJkOnBhdHRlcm5GaWxsL2Q6YmdDb2xvciI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBhdHRlcm4gY29sb3IKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQ29sb3JYbWwgUGF0dGVybkNvbG9yCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfcGF0dGVybkNvbG9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWwgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3BhdHRlcm5Db2xvciA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCBFeGNlbENvbG9yWG1sIF9iYWNrZ3JvdW5kQ29sb3IgPSBudWxsOwotICAgICAgICBjb25zdCBzdHJpbmcgX2JhY2tncm91bmRDb2xvclBhdGggPSAiZDpwYXR0ZXJuRmlsbC9kOmZnQ29sb3IiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDZWxsIGJhY2tncm91bmQgY29sb3IgCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENvbG9yWG1sIEJhY2tncm91bmRDb2xvcgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2JhY2tncm91bmRDb2xvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVybmFsIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9iYWNrZ3JvdW5kQ29sb3I9dmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzOwogCisvLy8gPHN1bW1hcnk+CisvLy8gWG1sIGFjY2VzcyBjbGFzcyBmb3IgZmlsbHMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxGaWxsWG1sIDogU3R5bGVYbWxIZWxwZXIgeworICBpbnRlcm5hbCBFeGNlbEZpbGxYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKG5hbWVTcGFjZU1hbmFnZXIpIHsKKyAgICBfZmlsbFBhdHRlcm5UeXBlID0gRXhjZWxGaWxsU3R5bGUuTm9uZTsKKyAgICBfYmFja2dyb3VuZENvbG9yID0gbmV3KE5hbWVTcGFjZU1hbmFnZXIpOworICAgIF9wYXR0ZXJuQ29sb3IgPSBuZXcoTmFtZVNwYWNlTWFuYWdlcik7CisgIH0KIAotICAgICAgICAvL2ludGVybmFsIEZpbGwgQ29weSgpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBGaWxsIG5ld0ZpbGwgPSBuZXcgRmlsbChOYW1lU3BhY2VNYW5hZ2VyLCBUb3BOb2RlLkNsb25lKCkpOwotICAgICAgICAvLyAgICByZXR1cm4gbmV3RmlsbDsKLSAgICAgICAgLy99CisgIGludGVybmFsIEV4Y2VsRmlsbFhtbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbSwgWG1sTm9kZSB0b3BOb2RlKQorICAgICAgOiBiYXNlKG5zbSwgdG9wTm9kZSkgeworICAgIFBhdHRlcm5UeXBlID0gR2V0UGF0dGVyblR5cGUoR2V0WG1sTm9kZVN0cmluZyhfZmlsbFBhdHRlcm5UeXBlUGF0aCkpOworICAgIF9iYWNrZ3JvdW5kQ29sb3IgPSBuZXcobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2JhY2tncm91bmRDb2xvclBhdGgsIG5zbSkpOworICAgIF9wYXR0ZXJuQ29sb3IgPSBuZXcobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX3BhdHRlcm5Db2xvclBhdGgsIG5zbSkpOworICB9CiAKLSAgICAgICAgaW50ZXJuYWwgdmlydHVhbCBFeGNlbEZpbGxYbWwgQ29weSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsRmlsbFhtbCBuZXdGaWxsID0gbmV3IEV4Y2VsRmlsbFhtbChOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIG5ld0ZpbGwuUGF0dGVyblR5cGUgPSBfZmlsbFBhdHRlcm5UeXBlOwotICAgICAgICAgICAgbmV3RmlsbC5CYWNrZ3JvdW5kQ29sb3IgPSBfYmFja2dyb3VuZENvbG9yLkNvcHkoKTsKLSAgICAgICAgICAgIG5ld0ZpbGwuUGF0dGVybkNvbG9yID0gX3BhdHRlcm5Db2xvci5Db3B5KCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3RmlsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIFhtbE5vZGUgQ3JlYXRlWG1sTm9kZShYbWxOb2RlIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRvcE5vZGUgPSB0b3BOb2RlOwotICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhmaWxsUGF0dGVyblR5cGVQYXRoLCBTZXRQYXR0ZXJuU3RyaW5nKF9maWxsUGF0dGVyblR5cGUpKTsKLSAgICAgICAgICAgIGlmIChQYXR0ZXJuVHlwZSAhPSBFeGNlbEZpbGxTdHlsZS5Ob25lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFhtbE5vZGUgcGF0dGVybiA9IHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShmaWxsUGF0dGVyblR5cGVQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICBpZiAoQmFja2dyb3VuZENvbG9yLkV4aXN0cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoX2JhY2tncm91bmRDb2xvclBhdGgpOwotICAgICAgICAgICAgICAgICAgICBCYWNrZ3JvdW5kQ29sb3IuQ3JlYXRlWG1sTm9kZSh0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2JhY2tncm91bmRDb2xvclBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFBhdHRlcm5Db2xvci5FeGlzdHMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZU5vZGUoX3BhdHRlcm5Db2xvclBhdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy90b3BOb2RlLkFwcGVuZENoaWxkKFBhdHRlcm5Db2xvci5DcmVhdGVYbWxOb2RlKHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfcGF0dGVybkNvbG9yUGF0aCwgTmFtZVNwYWNlTWFuYWdlcikpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBhdHRlcm5Db2xvci5DcmVhdGVYbWxOb2RlKHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfcGF0dGVybkNvbG9yUGF0aCwgTmFtZVNwYWNlTWFuYWdlcikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRvcE5vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0cmluZyBTZXRQYXR0ZXJuU3RyaW5nKEV4Y2VsRmlsbFN0eWxlIHBhdHRlcm4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBuZXdOYW1lID0gRW51bS5HZXROYW1lKHR5cGVvZihFeGNlbEZpbGxTdHlsZSksIHBhdHRlcm4pOwotICAgICAgICAgICAgcmV0dXJuIG5ld05hbWUuU3Vic3RyaW5nKDAsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyBuZXdOYW1lLlN1YnN0cmluZygxLCBuZXdOYW1lLkxlbmd0aCAtIDEpOwotICAgICAgICB9CisgIHByaXZhdGUgRXhjZWxGaWxsU3R5bGUgR2V0UGF0dGVyblR5cGUoc3RyaW5nIHBhdHRlcm5UeXBlKSB7CisgICAgaWYgKHBhdHRlcm5UeXBlID09ICIiKSB7CisgICAgICByZXR1cm4gRXhjZWxGaWxsU3R5bGUuTm9uZTsKICAgICB9CisgICAgcGF0dGVyblR5cGUgPQorICAgICAgICBwYXR0ZXJuVHlwZS5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKQorICAgICAgICAgICAgKyBwYXR0ZXJuVHlwZS5TdWJzdHJpbmcoMSwgcGF0dGVyblR5cGUuTGVuZ3RoIC0gMSk7CisgICAgdHJ5IHsKKyAgICAgIHJldHVybiAoRXhjZWxGaWxsU3R5bGUpRW51bS5QYXJzZSh0eXBlb2YoRXhjZWxGaWxsU3R5bGUpLCBwYXR0ZXJuVHlwZSk7CisgICAgfSBjYXRjaCB7CisgICAgICByZXR1cm4gRXhjZWxGaWxsU3R5bGUuTm9uZTsKKyAgICB9CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQgPT4gUGF0dGVyblR5cGUgKyBQYXR0ZXJuQ29sb3IuSWQgKyBCYWNrZ3JvdW5kQ29sb3IuSWQ7CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2ZpbGxQYXR0ZXJuVHlwZVBhdGggPSAiZDpwYXR0ZXJuRmlsbC9AcGF0dGVyblR5cGUiOworICBwcm90ZWN0ZWQgRXhjZWxGaWxsU3R5bGUgX2ZpbGxQYXR0ZXJuVHlwZTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDZWxsIGZpbGwgcGF0dGVybiBzdHlsZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxGaWxsU3R5bGUgUGF0dGVyblR5cGUgeworICAgIGdldCA9PiBfZmlsbFBhdHRlcm5UeXBlOworICAgIHNldCA9PiBfZmlsbFBhdHRlcm5UeXBlID0gdmFsdWU7CisgIH0KKworICBwcm90ZWN0ZWQgRXhjZWxDb2xvclhtbCBfcGF0dGVybkNvbG9yOworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfcGF0dGVybkNvbG9yUGF0aCA9ICJkOnBhdHRlcm5GaWxsL2Q6YmdDb2xvciI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUGF0dGVybiBjb2xvcgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxDb2xvclhtbCBQYXR0ZXJuQ29sb3IgeworICAgIGdldCA9PiBfcGF0dGVybkNvbG9yOworICAgIGludGVybmFsIHNldCA9PiBfcGF0dGVybkNvbG9yID0gdmFsdWU7CisgIH0KKworICBwcm90ZWN0ZWQgRXhjZWxDb2xvclhtbCBfYmFja2dyb3VuZENvbG9yOworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYmFja2dyb3VuZENvbG9yUGF0aCA9ICJkOnBhdHRlcm5GaWxsL2Q6ZmdDb2xvciI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ2VsbCBiYWNrZ3JvdW5kIGNvbG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbENvbG9yWG1sIEJhY2tncm91bmRDb2xvciB7CisgICAgZ2V0ID0+IF9iYWNrZ3JvdW5kQ29sb3I7CisgICAgaW50ZXJuYWwgc2V0ID0+IF9iYWNrZ3JvdW5kQ29sb3IgPSB2YWx1ZTsKKyAgfQorCisgIGludGVybmFsIHZpcnR1YWwgRXhjZWxGaWxsWG1sIENvcHkoKSB7CisgICAgRXhjZWxGaWxsWG1sIG5ld0ZpbGwgPSBuZXcgRXhjZWxGaWxsWG1sKE5hbWVTcGFjZU1hbmFnZXIpOworICAgIG5ld0ZpbGwuUGF0dGVyblR5cGUgPSBfZmlsbFBhdHRlcm5UeXBlOworICAgIG5ld0ZpbGwuQmFja2dyb3VuZENvbG9yID0gX2JhY2tncm91bmRDb2xvci5Db3B5KCk7CisgICAgbmV3RmlsbC5QYXR0ZXJuQ29sb3IgPSBfcGF0dGVybkNvbG9yLkNvcHkoKTsKKyAgICByZXR1cm4gbmV3RmlsbDsKKyAgfQorCisgIGludGVybmFsIG92ZXJyaWRlIFhtbE5vZGUgQ3JlYXRlWG1sTm9kZShYbWxOb2RlIHRvcE5vZGUpIHsKKyAgICBUb3BOb2RlID0gdG9wTm9kZTsKKyAgICBTZXRYbWxOb2RlU3RyaW5nKF9maWxsUGF0dGVyblR5cGVQYXRoLCBTZXRQYXR0ZXJuU3RyaW5nKF9maWxsUGF0dGVyblR5cGUpKTsKKyAgICBpZiAoUGF0dGVyblR5cGUgIT0gRXhjZWxGaWxsU3R5bGUuTm9uZSkgeworICAgICAgWG1sTm9kZSBwYXR0ZXJuID0gdG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9maWxsUGF0dGVyblR5cGVQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgIGlmIChCYWNrZ3JvdW5kQ29sb3IuRXhpc3RzKSB7CisgICAgICAgIENyZWF0ZU5vZGUoX2JhY2tncm91bmRDb2xvclBhdGgpOworICAgICAgICBCYWNrZ3JvdW5kQ29sb3IuQ3JlYXRlWG1sTm9kZSgKKyAgICAgICAgICAgIHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfYmFja2dyb3VuZENvbG9yUGF0aCwgTmFtZVNwYWNlTWFuYWdlcikpOworICAgICAgICBpZiAoUGF0dGVybkNvbG9yLkV4aXN0cykgeworICAgICAgICAgIENyZWF0ZU5vZGUoX3BhdHRlcm5Db2xvclBhdGgpOworICAgICAgICAgIC8vdG9wTm9kZS5BcHBlbmRDaGlsZChQYXR0ZXJuQ29sb3IuQ3JlYXRlWG1sTm9kZSh0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX3BhdHRlcm5Db2xvclBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpKSk7CisgICAgICAgICAgUGF0dGVybkNvbG9yLkNyZWF0ZVhtbE5vZGUodG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9wYXR0ZXJuQ29sb3JQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRvcE5vZGU7CisgIH0KKworICBwcml2YXRlIHN0cmluZyBTZXRQYXR0ZXJuU3RyaW5nKEV4Y2VsRmlsbFN0eWxlIHBhdHRlcm4pIHsKKyAgICBzdHJpbmcgbmV3TmFtZSA9IEVudW0uR2V0TmFtZSh0eXBlb2YoRXhjZWxGaWxsU3R5bGUpLCBwYXR0ZXJuKTsKKyAgICByZXR1cm4gbmV3TmFtZS5TdWJzdHJpbmcoMCwgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKQorICAgICAgICArIG5ld05hbWUuU3Vic3RyaW5nKDEsIG5ld05hbWUuTGVuZ3RoIC0gMSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxGb250WG1sLmNzIGIvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEZvbnRYbWwuY3MKaW5kZXggMDI0NzU5MS4uMTFiNmJiOSAxMDA2NDQKLS0tIGEvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEZvbnRYbWwuY3MKKysrIGIvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEZvbnRYbWwuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDMyMSArMTMsMjk0IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCiAgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbS5EcmF3aW5nOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIFN5c3RlbS5YbWw7Ci1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3MKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFhtbCBhY2Nlc3MgY2xhc3MgZm9yIGZvbnRzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsRm9udFhtbCA6IFN0eWxlWG1sSGVscGVyCi0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbEZvbnRYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQotICAgICAgICAgICAgOiBiYXNlKG5hbWVTcGFjZU1hbmFnZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9uYW1lID0gIiI7Ci0gICAgICAgICAgICBfc2l6ZSA9IDA7Ci0gICAgICAgICAgICBfZmFtaWx5ID0gaW50Lk1pblZhbHVlOwotICAgICAgICAgICAgX3NjaGVtZSA9ICIiOwotICAgICAgICAgICAgX2NvbG9yID0gX2NvbG9yID0gbmV3IEV4Y2VsQ29sb3JYbWwoTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICBfYm9sZCA9IGZhbHNlOwotICAgICAgICAgICAgX2l0YWxpYyA9IGZhbHNlOwotICAgICAgICAgICAgX3N0cmlrZSA9IGZhbHNlOwotICAgICAgICAgICAgX3VuZGVybGluZVR5cGUgPSBFeGNlbFVuZGVyTGluZVR5cGUuTm9uZSA7Ci0gICAgICAgICAgICBfdmVydGljYWxBbGlnbiA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsRm9udFhtbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbSwgWG1sTm9kZSB0b3BOb2RlKSA6Ci0gICAgICAgICAgICBiYXNlKG5zbSwgdG9wTm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgX25hbWUgPSBHZXRYbWxOb2RlU3RyaW5nKG5hbWVQYXRoKTsKLSAgICAgICAgICAgIF9zaXplID0gKGZsb2F0KUdldFhtbE5vZGVEZWNpbWFsKHNpemVQYXRoKTsKLSAgICAgICAgICAgIF9mYW1pbHkgPSBHZXRYbWxOb2RlSW50TnVsbChmYW1pbHlQYXRoKT8/aW50Lk1pblZhbHVlOwotICAgICAgICAgICAgX3NjaGVtZSA9IEdldFhtbE5vZGVTdHJpbmcoc2NoZW1lUGF0aCk7Ci0gICAgICAgICAgICBfY29sb3IgPSBuZXcgRXhjZWxDb2xvclhtbChuc20sIHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfY29sb3JQYXRoLCBuc20pKTsKLSAgICAgICAgICAgIF9ib2xkID0gR2V0Qm9vbFZhbHVlKHRvcE5vZGUsIGJvbGRQYXRoKTsKLSAgICAgICAgICAgIF9pdGFsaWMgPSBHZXRCb29sVmFsdWUodG9wTm9kZSwgaXRhbGljUGF0aCk7Ci0gICAgICAgICAgICBfc3RyaWtlID0gR2V0Qm9vbFZhbHVlKHRvcE5vZGUsIHN0cmlrZVBhdGgpOwotICAgICAgICAgICAgX3ZlcnRpY2FsQWxpZ24gPSBHZXRYbWxOb2RlU3RyaW5nKHZlcnRpY2FsQWxpZ25QYXRoKTsKLSAgICAgICAgICAgIGlmICh0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUodW5kZXJMaW5lZFBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHV0ID0gR2V0WG1sTm9kZVN0cmluZyh1bmRlckxpbmVkUGF0aCArICIvQHZhbCIpOwotICAgICAgICAgICAgICAgIGlmICh1dCA9PSAiIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF91bmRlcmxpbmVUeXBlID0gRXhjZWxVbmRlckxpbmVUeXBlLlNpbmdsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3VuZGVybGluZVR5cGUgPSAoRXhjZWxVbmRlckxpbmVUeXBlKUVudW0uUGFyc2UodHlwZW9mKEV4Y2VsVW5kZXJMaW5lVHlwZSksIHV0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3VuZGVybGluZVR5cGUgPSBFeGNlbFVuZGVyTGluZVR5cGUuTm9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogCi0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTmFtZSArICJ8IiArIFNpemUgKyAifCIgKyBGYW1pbHkgKyAifCIgKyBDb2xvci5JZCArICJ8IiArIFNjaGVtZSArICJ8IiArIEJvbGQuVG9TdHJpbmcoKSArICJ8IiArIEl0YWxpYy5Ub1N0cmluZygpICsgInwiICsgU3RyaWtlLlRvU3RyaW5nKCkgKyAifCIgKyBWZXJ0aWNhbEFsaWduICsgInwiICsgVW5kZXJMaW5lVHlwZS5Ub1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBuYW1lUGF0aCA9ICJkOm5hbWUvQHZhbCI7Ci0gICAgICAgIHN0cmluZyBfbmFtZTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIG5hbWUgb2YgdGhlIGZvbnQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNjaGVtZSA9ICIiOyAgICAgICAgLy9SZXNldCBzY2hlbWEgdG8gYXZvaWQgY29ycnVwdCBmaWxlIGlmIHVuc3VwcG9ydGVkIGZvbnQgaXMgc2VsZWN0ZWQuCi0gICAgICAgICAgICAgICAgX25hbWUgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgc2l6ZVBhdGggPSAiZDpzei9AdmFsIjsKLSAgICAgICAgZmxvYXQgX3NpemU7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvbnQgc2l6ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZmxvYXQgU2l6ZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3NpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfc2l6ZSA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBmYW1pbHlQYXRoID0gImQ6ZmFtaWx5L0B2YWwiOwotICAgICAgICBpbnQgX2ZhbWlseTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRm9udCBmYW1pbHkKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBGYW1pbHkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChfZmFtaWx5ID09IGludC5NaW5WYWx1ZSA/IDAgOiBfZmFtaWx5KTsgOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2ZhbWlseT12YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbENvbG9yWG1sIF9jb2xvciA9IG51bGw7Ci0gICAgICAgIGNvbnN0IHN0cmluZyBfY29sb3JQYXRoID0gImQ6Y29sb3IiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUZXh0IGNvbG9yCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbENvbG9yWG1sIENvbG9yCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY29sb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NvbG9yPXZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBzY2hlbWVQYXRoID0gImQ6c2NoZW1lL0B2YWwiOwotICAgICAgICBzdHJpbmcgX3NjaGVtZT0iIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRm9udCBTY2hlbWUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBTY2hlbWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zY2hlbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcml2YXRlIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9zY2hlbWU9dmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIGJvbGRQYXRoID0gImQ6YiI7Ci0gICAgICAgIGJvb2wgX2JvbGQ7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBmb250IGlzIGJvbGQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgQm9sZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2JvbGQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfYm9sZD12YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgaXRhbGljUGF0aCA9ICJkOmkiOwotICAgICAgICBib29sIF9pdGFsaWM7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBmb250IGlzIGl0YWxpYwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBJdGFsaWMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9pdGFsaWM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfaXRhbGljPXZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBzdHJpa2VQYXRoID0gImQ6c3RyaWtlIjsKLSAgICAgICAgYm9vbCBfc3RyaWtlOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgZm9udCBpcyBzdHJpa2VkIG91dAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTdHJpa2UKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zdHJpa2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfc3RyaWtlPXZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyB1bmRlckxpbmVkUGF0aCA9ICJkOnUiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgZm9udCBpcyB1bmRlcmxpbmVkLgotICAgICAgICAvLy8gV2hlbiBzZXQgdG8gdHJ1ZSBhIHRoZSB0ZXh0IGlzIHVuZGVybGluZWQgd2l0aCBhIHNpbmdsZSBsaW5lCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFVuZGVyTGluZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gVW5kZXJMaW5lVHlwZSE9RXhjZWxVbmRlckxpbmVUeXBlLk5vbmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfdW5kZXJsaW5lVHlwZT12YWx1ZSA/IEV4Y2VsVW5kZXJMaW5lVHlwZS5TaW5nbGUgOiBFeGNlbFVuZGVyTGluZVR5cGUuTm9uZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbFVuZGVyTGluZVR5cGUgX3VuZGVybGluZVR5cGU7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBmb250IGlzIHVuZGVybGluZWQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsVW5kZXJMaW5lVHlwZSBVbmRlckxpbmVUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfdW5kZXJsaW5lVHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF91bmRlcmxpbmVUeXBlID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIHZlcnRpY2FsQWxpZ25QYXRoID0gImQ6dmVydEFsaWduL0B2YWwiOwotICAgICAgICBzdHJpbmcgX3ZlcnRpY2FsQWxpZ247Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFZlcnRpY2FsIGFsaWduZWQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBWZXJ0aWNhbEFsaWduCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfdmVydGljYWxBbGlnbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF92ZXJ0aWNhbEFsaWduPXZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIFNldEZyb21Gb250KFN5c3RlbS5EcmF3aW5nLkZvbnQgRm9udCkKLSAgICAgICAgewotICAgICAgICAgICAgTmFtZT1Gb250Lk5hbWU7Ci0gICAgICAgICAgICAvL0ZhbWlseT1mbnQuRm9udEZhbWlseS47Ci0gICAgICAgICAgICBTaXplPShpbnQpRm9udC5TaXplOwotICAgICAgICAgICAgU3RyaWtlPUZvbnQuU3RyaWtlb3V0OwotICAgICAgICAgICAgQm9sZCA9IEZvbnQuQm9sZDsKLSAgICAgICAgICAgIFVuZGVyTGluZT1Gb250LlVuZGVybGluZTsKLSAgICAgICAgICAgIEl0YWxpYz1Gb250Lkl0YWxpYzsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbEZvbnRYbWwgQ29weSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsRm9udFhtbCBuZXdGb250ID0gbmV3IEV4Y2VsRm9udFhtbChOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIG5ld0ZvbnQuTmFtZSA9IF9uYW1lOwotICAgICAgICAgICAgbmV3Rm9udC5TaXplID0gX3NpemU7Ci0gICAgICAgICAgICBuZXdGb250LkZhbWlseSA9IF9mYW1pbHk7Ci0gICAgICAgICAgICBuZXdGb250LlNjaGVtZSA9IF9zY2hlbWU7Ci0gICAgICAgICAgICBuZXdGb250LkJvbGQgPSBfYm9sZDsKLSAgICAgICAgICAgIG5ld0ZvbnQuSXRhbGljID0gX2l0YWxpYzsKLSAgICAgICAgICAgIG5ld0ZvbnQuVW5kZXJMaW5lVHlwZSA9IF91bmRlcmxpbmVUeXBlOwotICAgICAgICAgICAgbmV3Rm9udC5TdHJpa2UgPSBfc3RyaWtlOwotICAgICAgICAgICAgbmV3Rm9udC5WZXJ0aWNhbEFsaWduID0gX3ZlcnRpY2FsQWxpZ247Ci0gICAgICAgICAgICBuZXdGb250LkNvbG9yID0gQ29sb3IuQ29weSgpOwotICAgICAgICAgICAgcmV0dXJuIG5ld0ZvbnQ7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKIAotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBYbWxOb2RlIENyZWF0ZVhtbE5vZGUoWG1sTm9kZSB0b3BFbGVtZW50KQotICAgICAgICB7Ci0gICAgICAgICAgICBUb3BOb2RlID0gdG9wRWxlbWVudDsKKy8vLyA8c3VtbWFyeT4KKy8vLyBYbWwgYWNjZXNzIGNsYXNzIGZvciBmb250cworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxGb250WG1sIDogU3R5bGVYbWxIZWxwZXIgeworICBpbnRlcm5hbCBFeGNlbEZvbnRYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKG5hbWVTcGFjZU1hbmFnZXIpIHsKKyAgICBfbmFtZSA9ICIiOworICAgIF9zaXplID0gMDsKKyAgICBfZmFtaWx5ID0gaW50Lk1pblZhbHVlOworICAgIF9zY2hlbWUgPSAiIjsKKyAgICBfY29sb3IgPSBfY29sb3IgPSBuZXcoTmFtZVNwYWNlTWFuYWdlcik7CisgICAgX2JvbGQgPSBmYWxzZTsKKyAgICBfaXRhbGljID0gZmFsc2U7CisgICAgX3N0cmlrZSA9IGZhbHNlOworICAgIF91bmRlcmxpbmVUeXBlID0gRXhjZWxVbmRlckxpbmVUeXBlLk5vbmU7CisgICAgX3ZlcnRpY2FsQWxpZ24gPSAiIjsKKyAgfQogCi0gICAgICAgICAgICBpZiAoX2JvbGQpIENyZWF0ZU5vZGUoYm9sZFBhdGgpOyBlbHNlIERlbGV0ZUFsbE5vZGUoYm9sZFBhdGgpOwotICAgICAgICAgICAgaWYgKF9pdGFsaWMpIENyZWF0ZU5vZGUoaXRhbGljUGF0aCk7IGVsc2UgRGVsZXRlQWxsTm9kZShpdGFsaWNQYXRoKTsKLSAgICAgICAgICAgIGlmIChfc3RyaWtlKSBDcmVhdGVOb2RlKHN0cmlrZVBhdGgpOyBlbHNlIERlbGV0ZUFsbE5vZGUoc3RyaWtlUGF0aCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChfdW5kZXJsaW5lVHlwZSA9PSBFeGNlbFVuZGVyTGluZVR5cGUuTm9uZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEZWxldGVBbGxOb2RlKHVuZGVyTGluZWRQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYoX3VuZGVybGluZVR5cGU9PUV4Y2VsVW5kZXJMaW5lVHlwZS5TaW5nbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ3JlYXRlTm9kZSh1bmRlckxpbmVkUGF0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHY9X3VuZGVybGluZVR5cGUuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHVuZGVyTGluZWRQYXRoICsgIi9AdmFsIiwgdi5TdWJzdHJpbmcoMCwgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArIHYuU3Vic3RyaW5nKDEpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKF92ZXJ0aWNhbEFsaWduIT0iIikgU2V0WG1sTm9kZVN0cmluZyh2ZXJ0aWNhbEFsaWduUGF0aCwgX3ZlcnRpY2FsQWxpZ24uVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZihfc2l6ZT4wKSBTZXRYbWxOb2RlU3RyaW5nKHNpemVQYXRoLCBfc2l6ZS5Ub1N0cmluZyhTeXN0ZW0uR2xvYmFsaXphdGlvbi5DdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICBpZiAoX2NvbG9yLkV4aXN0cykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDcmVhdGVOb2RlKF9jb2xvclBhdGgpOwotICAgICAgICAgICAgICAgIFRvcE5vZGUuQXBwZW5kQ2hpbGQoX2NvbG9yLkNyZWF0ZVhtbE5vZGUoVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9jb2xvclBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZighc3RyaW5nLklzTnVsbE9yRW1wdHkoX25hbWUpKSBTZXRYbWxOb2RlU3RyaW5nKG5hbWVQYXRoLCBfbmFtZSk7Ci0gICAgICAgICAgICBpZihfZmFtaWx5PmludC5NaW5WYWx1ZSkgU2V0WG1sTm9kZVN0cmluZyhmYW1pbHlQYXRoLCBfZmFtaWx5LlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgaWYgKF9zY2hlbWUgIT0gIiIpIFNldFhtbE5vZGVTdHJpbmcoc2NoZW1lUGF0aCwgX3NjaGVtZS5Ub1N0cmluZygpKTsKLQotICAgICAgICAgICAgcmV0dXJuIFRvcE5vZGU7Ci0gICAgICAgIH0KKyAgaW50ZXJuYWwgRXhjZWxGb250WG1sKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnNtLCBYbWxOb2RlIHRvcE5vZGUpCisgICAgICA6IGJhc2UobnNtLCB0b3BOb2RlKSB7CisgICAgX25hbWUgPSBHZXRYbWxOb2RlU3RyaW5nKF9uYW1lUGF0aCk7CisgICAgX3NpemUgPSAoZmxvYXQpR2V0WG1sTm9kZURlY2ltYWwoX3NpemVQYXRoKTsKKyAgICBfZmFtaWx5ID0gR2V0WG1sTm9kZUludE51bGwoX2ZhbWlseVBhdGgpID8/IGludC5NaW5WYWx1ZTsKKyAgICBfc2NoZW1lID0gR2V0WG1sTm9kZVN0cmluZyhfc2NoZW1lUGF0aCk7CisgICAgX2NvbG9yID0gbmV3KG5zbSwgdG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9jb2xvclBhdGgsIG5zbSkpOworICAgIF9ib2xkID0gR2V0Qm9vbFZhbHVlKHRvcE5vZGUsIF9ib2xkUGF0aCk7CisgICAgX2l0YWxpYyA9IEdldEJvb2xWYWx1ZSh0b3BOb2RlLCBfaXRhbGljUGF0aCk7CisgICAgX3N0cmlrZSA9IEdldEJvb2xWYWx1ZSh0b3BOb2RlLCBfc3RyaWtlUGF0aCk7CisgICAgX3ZlcnRpY2FsQWxpZ24gPSBHZXRYbWxOb2RlU3RyaW5nKF92ZXJ0aWNhbEFsaWduUGF0aCk7CisgICAgaWYgKHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfdW5kZXJMaW5lZFBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpICE9IG51bGwpIHsKKyAgICAgIHN0cmluZyB1dCA9IEdldFhtbE5vZGVTdHJpbmcoX3VuZGVyTGluZWRQYXRoICsgIi9AdmFsIik7CisgICAgICBpZiAodXQgPT0gIiIpIHsKKyAgICAgICAgX3VuZGVybGluZVR5cGUgPSBFeGNlbFVuZGVyTGluZVR5cGUuU2luZ2xlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3VuZGVybGluZVR5cGUgPSAoRXhjZWxVbmRlckxpbmVUeXBlKUVudW0uUGFyc2UodHlwZW9mKEV4Y2VsVW5kZXJMaW5lVHlwZSksIHV0LCB0cnVlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgX3VuZGVybGluZVR5cGUgPSBFeGNlbFVuZGVyTGluZVR5cGUuTm9uZTsKICAgICB9CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQgPT4KKyAgICBOYW1lCisgICAgICAgICsgInwiCisgICAgICAgICsgU2l6ZQorICAgICAgICArICJ8IgorICAgICAgICArIEZhbWlseQorICAgICAgICArICJ8IgorICAgICAgICArIENvbG9yLklkCisgICAgICAgICsgInwiCisgICAgICAgICsgU2NoZW1lCisgICAgICAgICsgInwiCisgICAgICAgICsgQm9sZAorICAgICAgICArICJ8IgorICAgICAgICArIEl0YWxpYworICAgICAgICArICJ8IgorICAgICAgICArIFN0cmlrZQorICAgICAgICArICJ8IgorICAgICAgICArIFZlcnRpY2FsQWxpZ24KKyAgICAgICAgKyAifCIKKyAgICAgICAgKyBVbmRlckxpbmVUeXBlOworCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9uYW1lUGF0aCA9ICJkOm5hbWUvQHZhbCI7CisgIHByaXZhdGUgc3RyaW5nIF9uYW1lOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBmb250CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgTmFtZSB7CisgICAgZ2V0IHsgcmV0dXJuIF9uYW1lOyB9CisgICAgc2V0IHsKKyAgICAgIFNjaGVtZSA9ICIiOyAvL1Jlc2V0IHNjaGVtYSB0byBhdm9pZCBjb3JydXB0IGZpbGUgaWYgdW5zdXBwb3J0ZWQgZm9udCBpcyBzZWxlY3RlZC4KKyAgICAgIF9uYW1lID0gdmFsdWU7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3NpemVQYXRoID0gImQ6c3ovQHZhbCI7CisgIHByaXZhdGUgZmxvYXQgX3NpemU7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRm9udCBzaXplCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBmbG9hdCBTaXplIHsKKyAgICBnZXQgeyByZXR1cm4gX3NpemU7IH0KKyAgICBzZXQgeyBfc2l6ZSA9IHZhbHVlOyB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZmFtaWx5UGF0aCA9ICJkOmZhbWlseS9AdmFsIjsKKyAgcHJpdmF0ZSBpbnQgX2ZhbWlseTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBGb250IGZhbWlseQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IEZhbWlseSB7CisgICAgZ2V0IHsKKyAgICAgIHJldHVybiAoX2ZhbWlseSA9PSBpbnQuTWluVmFsdWUgPyAwIDogX2ZhbWlseSk7CisgICAgICA7CisgICAgfQorICAgIHNldCB7IF9mYW1pbHkgPSB2YWx1ZTsgfQorICB9CisKKyAgcHJpdmF0ZSBFeGNlbENvbG9yWG1sIF9jb2xvcjsKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2NvbG9yUGF0aCA9ICJkOmNvbG9yIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUZXh0IGNvbG9yCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbENvbG9yWG1sIENvbG9yIHsKKyAgICBnZXQgeyByZXR1cm4gX2NvbG9yOyB9CisgICAgaW50ZXJuYWwgc2V0IHsgX2NvbG9yID0gdmFsdWU7IH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9zY2hlbWVQYXRoID0gImQ6c2NoZW1lL0B2YWwiOworICBwcml2YXRlIHN0cmluZyBfc2NoZW1lID0gIiI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRm9udCBTY2hlbWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBTY2hlbWUgeworICAgIGdldCB7IHJldHVybiBfc2NoZW1lOyB9CisgICAgcHJpdmF0ZSBzZXQgeyBfc2NoZW1lID0gdmFsdWU7IH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9ib2xkUGF0aCA9ICJkOmIiOworICBwcml2YXRlIGJvb2wgX2JvbGQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhlIGZvbnQgaXMgYm9sZAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBCb2xkIHsKKyAgICBnZXQgeyByZXR1cm4gX2JvbGQ7IH0KKyAgICBzZXQgeyBfYm9sZCA9IHZhbHVlOyB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfaXRhbGljUGF0aCA9ICJkOmkiOworICBwcml2YXRlIGJvb2wgX2l0YWxpYzsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgZm9udCBpcyBpdGFsaWMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgSXRhbGljIHsKKyAgICBnZXQgeyByZXR1cm4gX2l0YWxpYzsgfQorICAgIHNldCB7IF9pdGFsaWMgPSB2YWx1ZTsgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3N0cmlrZVBhdGggPSAiZDpzdHJpa2UiOworICBwcml2YXRlIGJvb2wgX3N0cmlrZTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgZm9udCBpcyBzdHJpa2VkIG91dAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBTdHJpa2UgeworICAgIGdldCB7IHJldHVybiBfc3RyaWtlOyB9CisgICAgc2V0IHsgX3N0cmlrZSA9IHZhbHVlOyB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfdW5kZXJMaW5lZFBhdGggPSAiZDp1IjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgZm9udCBpcyB1bmRlcmxpbmVkLgorICAvLy8gV2hlbiBzZXQgdG8gdHJ1ZSBhIHRoZSB0ZXh0IGlzIHVuZGVybGluZWQgd2l0aCBhIHNpbmdsZSBsaW5lCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIFVuZGVyTGluZSB7CisgICAgZ2V0IHsgcmV0dXJuIFVuZGVyTGluZVR5cGUgIT0gRXhjZWxVbmRlckxpbmVUeXBlLk5vbmU7IH0KKyAgICBzZXQgeyBfdW5kZXJsaW5lVHlwZSA9IHZhbHVlID8gRXhjZWxVbmRlckxpbmVUeXBlLlNpbmdsZSA6IEV4Y2VsVW5kZXJMaW5lVHlwZS5Ob25lOyB9CisgIH0KKworICBwcml2YXRlIEV4Y2VsVW5kZXJMaW5lVHlwZSBfdW5kZXJsaW5lVHlwZTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgZm9udCBpcyB1bmRlcmxpbmVkCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFVuZGVyTGluZVR5cGUgVW5kZXJMaW5lVHlwZSB7CisgICAgZ2V0IHsgcmV0dXJuIF91bmRlcmxpbmVUeXBlOyB9CisgICAgc2V0IHsgX3VuZGVybGluZVR5cGUgPSB2YWx1ZTsgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3ZlcnRpY2FsQWxpZ25QYXRoID0gImQ6dmVydEFsaWduL0B2YWwiOworICBwcml2YXRlIHN0cmluZyBfdmVydGljYWxBbGlnbjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBWZXJ0aWNhbCBhbGlnbmVkCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgVmVydGljYWxBbGlnbiB7CisgICAgZ2V0IHsgcmV0dXJuIF92ZXJ0aWNhbEFsaWduOyB9CisgICAgc2V0IHsgX3ZlcnRpY2FsQWxpZ24gPSB2YWx1ZTsgfQorICB9CisKKyAgcHVibGljIHZvaWQgU2V0RnJvbUZvbnQoRm9udCBmb250KSB7CisgICAgTmFtZSA9IGZvbnQuTmFtZTsKKyAgICAvL0ZhbWlseT1mbnQuRm9udEZhbWlseS47CisgICAgU2l6ZSA9IChpbnQpZm9udC5TaXplOworICAgIFN0cmlrZSA9IGZvbnQuU3RyaWtlb3V0OworICAgIEJvbGQgPSBmb250LkJvbGQ7CisgICAgVW5kZXJMaW5lID0gZm9udC5VbmRlcmxpbmU7CisgICAgSXRhbGljID0gZm9udC5JdGFsaWM7CisgIH0KKworICBpbnRlcm5hbCBFeGNlbEZvbnRYbWwgQ29weSgpIHsKKyAgICBFeGNlbEZvbnRYbWwgbmV3Rm9udCA9IG5ldyBFeGNlbEZvbnRYbWwoTmFtZVNwYWNlTWFuYWdlcik7CisgICAgbmV3Rm9udC5OYW1lID0gX25hbWU7CisgICAgbmV3Rm9udC5TaXplID0gX3NpemU7CisgICAgbmV3Rm9udC5GYW1pbHkgPSBfZmFtaWx5OworICAgIG5ld0ZvbnQuU2NoZW1lID0gX3NjaGVtZTsKKyAgICBuZXdGb250LkJvbGQgPSBfYm9sZDsKKyAgICBuZXdGb250Lkl0YWxpYyA9IF9pdGFsaWM7CisgICAgbmV3Rm9udC5VbmRlckxpbmVUeXBlID0gX3VuZGVybGluZVR5cGU7CisgICAgbmV3Rm9udC5TdHJpa2UgPSBfc3RyaWtlOworICAgIG5ld0ZvbnQuVmVydGljYWxBbGlnbiA9IF92ZXJ0aWNhbEFsaWduOworICAgIG5ld0ZvbnQuQ29sb3IgPSBDb2xvci5Db3B5KCk7CisgICAgcmV0dXJuIG5ld0ZvbnQ7CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBYbWxOb2RlIENyZWF0ZVhtbE5vZGUoWG1sTm9kZSB0b3BFbGVtZW50KSB7CisgICAgVG9wTm9kZSA9IHRvcEVsZW1lbnQ7CisKKyAgICBpZiAoX2JvbGQpIHsKKyAgICAgIENyZWF0ZU5vZGUoX2JvbGRQYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgRGVsZXRlQWxsTm9kZShfYm9sZFBhdGgpOworICAgIH0KKyAgICBpZiAoX2l0YWxpYykgeworICAgICAgQ3JlYXRlTm9kZShfaXRhbGljUGF0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIERlbGV0ZUFsbE5vZGUoX2l0YWxpY1BhdGgpOworICAgIH0KKyAgICBpZiAoX3N0cmlrZSkgeworICAgICAgQ3JlYXRlTm9kZShfc3RyaWtlUGF0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIERlbGV0ZUFsbE5vZGUoX3N0cmlrZVBhdGgpOworICAgIH0KKworICAgIGlmIChfdW5kZXJsaW5lVHlwZSA9PSBFeGNlbFVuZGVyTGluZVR5cGUuTm9uZSkgeworICAgICAgRGVsZXRlQWxsTm9kZShfdW5kZXJMaW5lZFBhdGgpOworICAgIH0gZWxzZSBpZiAoX3VuZGVybGluZVR5cGUgPT0gRXhjZWxVbmRlckxpbmVUeXBlLlNpbmdsZSkgeworICAgICAgQ3JlYXRlTm9kZShfdW5kZXJMaW5lZFBhdGgpOworICAgIH0gZWxzZSB7CisgICAgICB2YXIgdiA9IF91bmRlcmxpbmVUeXBlLlRvU3RyaW5nKCk7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgIF91bmRlckxpbmVkUGF0aCArICIvQHZhbCIsCisgICAgICAgICAgdi5TdWJzdHJpbmcoMCwgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArIHYuU3Vic3RyaW5nKDEpKTsKKyAgICB9CisKKyAgICBpZiAoX3ZlcnRpY2FsQWxpZ24gIT0gIiIpIHsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3ZlcnRpY2FsQWxpZ25QYXRoLCBfdmVydGljYWxBbGlnbik7CisgICAgfQorICAgIGlmIChfc2l6ZSA+IDApIHsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3NpemVQYXRoLCBfc2l6ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgfQorICAgIGlmIChfY29sb3IuRXhpc3RzKSB7CisgICAgICBDcmVhdGVOb2RlKF9jb2xvclBhdGgpOworICAgICAgVG9wTm9kZS5BcHBlbmRDaGlsZCgKKyAgICAgICAgICBfY29sb3IuQ3JlYXRlWG1sTm9kZShUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2NvbG9yUGF0aCwgTmFtZVNwYWNlTWFuYWdlcikpKTsKKyAgICB9CisgICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShfbmFtZSkpIHsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX25hbWVQYXRoLCBfbmFtZSk7CisgICAgfQorICAgIGlmIChfZmFtaWx5ID4gaW50Lk1pblZhbHVlKSB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9mYW1pbHlQYXRoLCBfZmFtaWx5LlRvU3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoX3NjaGVtZSAhPSAiIikgeworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc2NoZW1lUGF0aCwgX3NjaGVtZSk7CisgICAgfQorCisgICAgcmV0dXJuIFRvcE5vZGU7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxHcmFkaWVudEZpbGxYbWwuY3MgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsR3JhZGllbnRGaWxsWG1sLmNzCmluZGV4IGFkYWYwYTUuLjAwYWRmNWUgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxHcmFkaWVudEZpbGxYbWwuY3MKKysrIGIvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbEdyYWRpZW50RmlsbFhtbC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTg2ICsxMywxNzIgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKKwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3MKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFhtbCBhY2Nlc3MgY2xhc3MgZm9yIGdyYWRpZW50IGZpbGxzZGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxHcmFkaWVudEZpbGxYbWwgOiBFeGNlbEZpbGxYbWwKLSAgICB7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsR3JhZGllbnRGaWxsWG1sKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlcikKLSAgICAgICAgICAgIDogYmFzZShuYW1lU3BhY2VNYW5hZ2VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBHcmFkaWVudENvbG9yMSA9IG5ldyBFeGNlbENvbG9yWG1sKG5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgR3JhZGllbnRDb2xvcjIgPSBuZXcgRXhjZWxDb2xvclhtbChuYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbEdyYWRpZW50RmlsbFhtbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbSwgWG1sTm9kZSB0b3BOb2RlKSA6Ci0gICAgICAgICAgICBiYXNlKG5zbSwgdG9wTm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgRGVncmVlID0gR2V0WG1sTm9kZURvdWJsZShfZGVncmVlUGF0aCk7Ci0gICAgICAgICAgICBUeXBlID0gR2V0WG1sTm9kZVN0cmluZyhfdHlwZVBhdGgpPT0icGF0aCIgPyBFeGNlbEZpbGxHcmFkaWVudFR5cGUuUGF0aCA6IEV4Y2VsRmlsbEdyYWRpZW50VHlwZS5MaW5lYXI7Ci0gICAgICAgICAgICBHcmFkaWVudENvbG9yMSA9IG5ldyBFeGNlbENvbG9yWG1sKG5zbSwgdG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKF9ncmFkaWVudENvbG9yMVBhdGgsIG5zbSkpOwotICAgICAgICAgICAgR3JhZGllbnRDb2xvcjIgPSBuZXcgRXhjZWxDb2xvclhtbChuc20sIHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShfZ3JhZGllbnRDb2xvcjJQYXRoLCBuc20pKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgVG9wID0gR2V0WG1sTm9kZURvdWJsZShfdG9wUGF0aCk7Ci0gICAgICAgICAgICBCb3R0b20gPSBHZXRYbWxOb2RlRG91YmxlKF9ib3R0b21QYXRoKTsKLSAgICAgICAgICAgIExlZnQgPSBHZXRYbWxOb2RlRG91YmxlKF9sZWZ0UGF0aCk7Ci0gICAgICAgICAgICBSaWdodCA9IEdldFhtbE5vZGVEb3VibGUoX3JpZ2h0UGF0aCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF90eXBlUGF0aCA9ICJkOmdyYWRpZW50RmlsbC9AdHlwZSI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFR5cGUgb2YgZ3JhZGllbnQgZmlsbC4gCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEZpbGxHcmFkaWVudFR5cGUgVHlwZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9kZWdyZWVQYXRoID0gImQ6Z3JhZGllbnRGaWxsL0BkZWdyZWUiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBbmdsZSBvZiB0aGUgbGluZWFyIGdyYWRpZW50Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgRGVncmVlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIGludGVybmFsIHNldDsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgX2dyYWRpZW50Q29sb3IxUGF0aCA9ICJkOmdyYWRpZW50RmlsbC9kOnN0b3BbQHBvc2l0aW9uPVwiMFwiXS9kOmNvbG9yIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR3JhZGllbnQgY29sb3IgMQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxDb2xvclhtbCBHcmFkaWVudENvbG9yMSAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9ncmFkaWVudENvbG9yMlBhdGggPSAiZDpncmFkaWVudEZpbGwvZDpzdG9wW0Bwb3NpdGlvbj1cIjFcIl0vZDpjb2xvciI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdyYWRpZW50IGNvbG9yIDIKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsQ29sb3JYbWwgR3JhZGllbnRDb2xvcjIKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIF9ib3R0b21QYXRoID0gImQ6Z3JhZGllbnRGaWxsL0Bib3R0b20iOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQZXJjZW50YWdlIGZvcm1hdCBib3R0b20KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZSBCb3R0b20KLSAgICAgICAgeyAKLSAgICAgICAgICAgIGdldDsgCi0gICAgICAgICAgICBpbnRlcm5hbCBzZXQ7IAotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBfdG9wUGF0aCA9ICJkOmdyYWRpZW50RmlsbC9AdG9wIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUGVyY2VudGFnZSBmb3JtYXQgdG9wCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgVG9wCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIGludGVybmFsIHNldDsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgX2xlZnRQYXRoID0gImQ6Z3JhZGllbnRGaWxsL0BsZWZ0IjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUGVyY2VudGFnZSBmb3JtYXQgbGVmdAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZG91YmxlIExlZnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgaW50ZXJuYWwgc2V0OwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBfcmlnaHRQYXRoID0gImQ6Z3JhZGllbnRGaWxsL0ByaWdodCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBlcmNlbnRhZ2UgZm9ybWF0IHJpZ2h0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgUmlnaHQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgaW50ZXJuYWwgc2V0OwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5JZCArIERlZ3JlZS5Ub1N0cmluZygpICsgR3JhZGllbnRDb2xvcjEuSWQgKyBHcmFkaWVudENvbG9yMi5JZCArIFR5cGUgKyBMZWZ0LlRvU3RyaW5nKCkgKyBSaWdodC5Ub1N0cmluZygpICsgQm90dG9tLlRvU3RyaW5nKCkgKyBUb3AuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQordXNpbmcgU3lzdGVtLlhtbDsKIAotICAgICAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgRXhjZWxGaWxsWG1sIENvcHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeGNlbEdyYWRpZW50RmlsbFhtbCBuZXdGaWxsID0gbmV3IEV4Y2VsR3JhZGllbnRGaWxsWG1sKE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgbmV3RmlsbC5QYXR0ZXJuVHlwZSA9IGJhc2UuX2ZpbGxQYXR0ZXJuVHlwZTsKLSAgICAgICAgICAgIG5ld0ZpbGwuQmFja2dyb3VuZENvbG9yID0gX2JhY2tncm91bmRDb2xvci5Db3B5KCk7Ci0gICAgICAgICAgICBuZXdGaWxsLlBhdHRlcm5Db2xvciA9IF9wYXR0ZXJuQ29sb3IuQ29weSgpOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzOwogCi0gICAgICAgICAgICBuZXdGaWxsLkdyYWRpZW50Q29sb3IxID0gR3JhZGllbnRDb2xvcjEuQ29weSgpOwotICAgICAgICAgICAgbmV3RmlsbC5HcmFkaWVudENvbG9yMiA9IEdyYWRpZW50Q29sb3IyLkNvcHkoKTsKLSAgICAgICAgICAgIG5ld0ZpbGwuVHlwZSA9IFR5cGU7Ci0gICAgICAgICAgICBuZXdGaWxsLkRlZ3JlZSA9IERlZ3JlZTsKLSAgICAgICAgICAgIG5ld0ZpbGwuVG9wID0gVG9wOwotICAgICAgICAgICAgbmV3RmlsbC5Cb3R0b20gPSBCb3R0b207Ci0gICAgICAgICAgICBuZXdGaWxsLkxlZnQgPSBMZWZ0OwotICAgICAgICAgICAgbmV3RmlsbC5SaWdodCA9IFJpZ2h0OwotICAgICAgICAgICAgCi0gICAgICAgICAgICByZXR1cm4gbmV3RmlsbDsKLSAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIFhtbCBhY2Nlc3MgY2xhc3MgZm9yIGdyYWRpZW50IGZpbGxzZGUKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsR3JhZGllbnRGaWxsWG1sIDogRXhjZWxGaWxsWG1sIHsKKyAgaW50ZXJuYWwgRXhjZWxHcmFkaWVudEZpbGxYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKG5hbWVTcGFjZU1hbmFnZXIpIHsKKyAgICBHcmFkaWVudENvbG9yMSA9IG5ldyhuYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBHcmFkaWVudENvbG9yMiA9IG5ldyhuYW1lU3BhY2VNYW5hZ2VyKTsKKyAgfQogCi0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIFhtbE5vZGUgQ3JlYXRlWG1sTm9kZShYbWxOb2RlIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRvcE5vZGUgPSB0b3BOb2RlOwotICAgICAgICAgICAgQ3JlYXRlTm9kZSgiZDpncmFkaWVudEZpbGwiKTsKLSAgICAgICAgICAgIGlmKFR5cGU9PUV4Y2VsRmlsbEdyYWRpZW50VHlwZS5QYXRoKSBTZXRYbWxOb2RlU3RyaW5nKF90eXBlUGF0aCwgInBhdGgiKTsKLSAgICAgICAgICAgIGlmKCFkb3VibGUuSXNOYU4oRGVncmVlKSkgU2V0WG1sTm9kZVN0cmluZyhfZGVncmVlUGF0aCwgRGVncmVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgIGlmIChHcmFkaWVudENvbG9yMSE9bnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKioqIEdyYWRpZW50IGNvbG9yIG5vZGUgMSoqKi8KLSAgICAgICAgICAgICAgICB2YXIgbm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpncmFkaWVudEZpbGwiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB2YXIgc3RvcE5vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgic3RvcCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgICAgICBzdG9wTm9kZS5TZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgIjAiKTsKLSAgICAgICAgICAgICAgICBub2RlLkFwcGVuZENoaWxkKHN0b3BOb2RlKTsKLSAgICAgICAgICAgICAgICB2YXIgY29sb3JOb2RlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoImNvbG9yIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotICAgICAgICAgICAgICAgIHN0b3BOb2RlLkFwcGVuZENoaWxkKGNvbG9yTm9kZSk7Ci0gICAgICAgICAgICAgICAgR3JhZGllbnRDb2xvcjEuQ3JlYXRlWG1sTm9kZShjb2xvck5vZGUpOworICBpbnRlcm5hbCBFeGNlbEdyYWRpZW50RmlsbFhtbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zbSwgWG1sTm9kZSB0b3BOb2RlKQorICAgICAgOiBiYXNlKG5zbSwgdG9wTm9kZSkgeworICAgIERlZ3JlZSA9IEdldFhtbE5vZGVEb3VibGUoX2RlZ3JlZVBhdGgpOworICAgIFR5cGUgPQorICAgICAgICBHZXRYbWxOb2RlU3RyaW5nKF90eXBlUGF0aCkgPT0gInBhdGgiCisgICAgICAgICAgICA/IEV4Y2VsRmlsbEdyYWRpZW50VHlwZS5QYXRoCisgICAgICAgICAgICA6IEV4Y2VsRmlsbEdyYWRpZW50VHlwZS5MaW5lYXI7CisgICAgR3JhZGllbnRDb2xvcjEgPSBuZXcobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2dyYWRpZW50Q29sb3IxUGF0aCwgbnNtKSk7CisgICAgR3JhZGllbnRDb2xvcjIgPSBuZXcobnNtLCB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoX2dyYWRpZW50Q29sb3IyUGF0aCwgbnNtKSk7CiAKLSAgICAgICAgICAgICAgICAvKioqIEdyYWRpZW50IGNvbG9yIG5vZGUgMioqKi8KLSAgICAgICAgICAgICAgICBzdG9wTm9kZSA9IG5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzdG9wIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotICAgICAgICAgICAgICAgIHN0b3BOb2RlLlNldEF0dHJpYnV0ZSgicG9zaXRpb24iLCAiMSIpOwotICAgICAgICAgICAgICAgIG5vZGUuQXBwZW5kQ2hpbGQoc3RvcE5vZGUpOwotICAgICAgICAgICAgICAgIGNvbG9yTm9kZSA9IG5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJjb2xvciIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgICAgICBzdG9wTm9kZS5BcHBlbmRDaGlsZChjb2xvck5vZGUpOworICAgIFRvcCA9IEdldFhtbE5vZGVEb3VibGUoX3RvcFBhdGgpOworICAgIEJvdHRvbSA9IEdldFhtbE5vZGVEb3VibGUoX2JvdHRvbVBhdGgpOworICAgIExlZnQgPSBHZXRYbWxOb2RlRG91YmxlKF9sZWZ0UGF0aCk7CisgICAgUmlnaHQgPSBHZXRYbWxOb2RlRG91YmxlKF9yaWdodFBhdGgpOworICB9CiAKLSAgICAgICAgICAgICAgICBHcmFkaWVudENvbG9yMi5DcmVhdGVYbWxOb2RlKGNvbG9yTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWRvdWJsZS5Jc05hTihUb3ApKSBTZXRYbWxOb2RlU3RyaW5nKF90b3BQYXRoLCBUb3AuVG9TdHJpbmcoIkY1IixDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICBpZiAoIWRvdWJsZS5Jc05hTihCb3R0b20pKSBTZXRYbWxOb2RlU3RyaW5nKF9ib3R0b21QYXRoLCBCb3R0b20uVG9TdHJpbmcoIkY1IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgaWYgKCFkb3VibGUuSXNOYU4oTGVmdCkpIFNldFhtbE5vZGVTdHJpbmcoX2xlZnRQYXRoLCBMZWZ0LlRvU3RyaW5nKCJGNSIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgIGlmICghZG91YmxlLklzTmFOKFJpZ2h0KSkgU2V0WG1sTm9kZVN0cmluZyhfcmlnaHRQYXRoLCBSaWdodC5Ub1N0cmluZygiRjUiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF90eXBlUGF0aCA9ICJkOmdyYWRpZW50RmlsbC9AdHlwZSI7CiAKLSAgICAgICAgICAgIHJldHVybiB0b3BOb2RlOwotICAgICAgICB9CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFR5cGUgb2YgZ3JhZGllbnQgZmlsbC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsRmlsbEdyYWRpZW50VHlwZSBUeXBlIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZGVncmVlUGF0aCA9ICJkOmdyYWRpZW50RmlsbC9AZGVncmVlIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBbmdsZSBvZiB0aGUgbGluZWFyIGdyYWRpZW50CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBkb3VibGUgRGVncmVlIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZ3JhZGllbnRDb2xvcjFQYXRoID0gImQ6Z3JhZGllbnRGaWxsL2Q6c3RvcFtAcG9zaXRpb249XCIwXCJdL2Q6Y29sb3IiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdyYWRpZW50IGNvbG9yIDEKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsQ29sb3JYbWwgR3JhZGllbnRDb2xvcjEgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2dyYWRpZW50Q29sb3IyUGF0aCA9ICJkOmdyYWRpZW50RmlsbC9kOnN0b3BbQHBvc2l0aW9uPVwiMVwiXS9kOmNvbG9yIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHcmFkaWVudCBjb2xvciAyCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbENvbG9yWG1sIEdyYWRpZW50Q29sb3IyIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9ib3R0b21QYXRoID0gImQ6Z3JhZGllbnRGaWxsL0Bib3R0b20iOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFBlcmNlbnRhZ2UgZm9ybWF0IGJvdHRvbQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZG91YmxlIEJvdHRvbSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3RvcFBhdGggPSAiZDpncmFkaWVudEZpbGwvQHRvcCI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUGVyY2VudGFnZSBmb3JtYXQgdG9wCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBkb3VibGUgVG9wIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfbGVmdFBhdGggPSAiZDpncmFkaWVudEZpbGwvQGxlZnQiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFBlcmNlbnRhZ2UgZm9ybWF0IGxlZnQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGRvdWJsZSBMZWZ0IHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfcmlnaHRQYXRoID0gImQ6Z3JhZGllbnRGaWxsL0ByaWdodCI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUGVyY2VudGFnZSBmb3JtYXQgcmlnaHQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGRvdWJsZSBSaWdodCB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkID0+CisgICAgYmFzZS5JZCArIERlZ3JlZSArIEdyYWRpZW50Q29sb3IxLklkICsgR3JhZGllbnRDb2xvcjIuSWQgKyBUeXBlICsgTGVmdCArIFJpZ2h0ICsgQm90dG9tICsgVG9wOworCisgIGludGVybmFsIG92ZXJyaWRlIEV4Y2VsRmlsbFhtbCBDb3B5KCkgeworICAgIEV4Y2VsR3JhZGllbnRGaWxsWG1sIG5ld0ZpbGwgPSBuZXcgRXhjZWxHcmFkaWVudEZpbGxYbWwoTmFtZVNwYWNlTWFuYWdlcik7CisgICAgbmV3RmlsbC5QYXR0ZXJuVHlwZSA9IF9maWxsUGF0dGVyblR5cGU7CisgICAgbmV3RmlsbC5CYWNrZ3JvdW5kQ29sb3IgPSBfYmFja2dyb3VuZENvbG9yLkNvcHkoKTsKKyAgICBuZXdGaWxsLlBhdHRlcm5Db2xvciA9IF9wYXR0ZXJuQ29sb3IuQ29weSgpOworCisgICAgbmV3RmlsbC5HcmFkaWVudENvbG9yMSA9IEdyYWRpZW50Q29sb3IxLkNvcHkoKTsKKyAgICBuZXdGaWxsLkdyYWRpZW50Q29sb3IyID0gR3JhZGllbnRDb2xvcjIuQ29weSgpOworICAgIG5ld0ZpbGwuVHlwZSA9IFR5cGU7CisgICAgbmV3RmlsbC5EZWdyZWUgPSBEZWdyZWU7CisgICAgbmV3RmlsbC5Ub3AgPSBUb3A7CisgICAgbmV3RmlsbC5Cb3R0b20gPSBCb3R0b207CisgICAgbmV3RmlsbC5MZWZ0ID0gTGVmdDsKKyAgICBuZXdGaWxsLlJpZ2h0ID0gUmlnaHQ7CisKKyAgICByZXR1cm4gbmV3RmlsbDsKKyAgfQorCisgIGludGVybmFsIG92ZXJyaWRlIFhtbE5vZGUgQ3JlYXRlWG1sTm9kZShYbWxOb2RlIHRvcE5vZGUpIHsKKyAgICBUb3BOb2RlID0gdG9wTm9kZTsKKyAgICBDcmVhdGVOb2RlKCJkOmdyYWRpZW50RmlsbCIpOworICAgIGlmIChUeXBlID09IEV4Y2VsRmlsbEdyYWRpZW50VHlwZS5QYXRoKSB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF90eXBlUGF0aCwgInBhdGgiKTsKICAgICB9CisgICAgaWYgKCFkb3VibGUuSXNOYU4oRGVncmVlKSkgeworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfZGVncmVlUGF0aCwgRGVncmVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICB9CisgICAgaWYgKEdyYWRpZW50Q29sb3IxICE9IG51bGwpIHsKKyAgICAgIC8qKiogR3JhZGllbnQgY29sb3Igbm9kZSAxKioqLworICAgICAgdmFyIG5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6Z3JhZGllbnRGaWxsIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICB2YXIgc3RvcE5vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgic3RvcCIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgICBzdG9wTm9kZS5TZXRBdHRyaWJ1dGUoInBvc2l0aW9uIiwgIjAiKTsKKyAgICAgIG5vZGUuQXBwZW5kQ2hpbGQoc3RvcE5vZGUpOworICAgICAgdmFyIGNvbG9yTm9kZSA9IG5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJjb2xvciIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgICBzdG9wTm9kZS5BcHBlbmRDaGlsZChjb2xvck5vZGUpOworICAgICAgR3JhZGllbnRDb2xvcjEuQ3JlYXRlWG1sTm9kZShjb2xvck5vZGUpOworCisgICAgICAvKioqIEdyYWRpZW50IGNvbG9yIG5vZGUgMioqKi8KKyAgICAgIHN0b3BOb2RlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoInN0b3AiLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgc3RvcE5vZGUuU2V0QXR0cmlidXRlKCJwb3NpdGlvbiIsICIxIik7CisgICAgICBub2RlLkFwcGVuZENoaWxkKHN0b3BOb2RlKTsKKyAgICAgIGNvbG9yTm9kZSA9IG5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJjb2xvciIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgICBzdG9wTm9kZS5BcHBlbmRDaGlsZChjb2xvck5vZGUpOworCisgICAgICBHcmFkaWVudENvbG9yMi5DcmVhdGVYbWxOb2RlKGNvbG9yTm9kZSk7CisgICAgfQorICAgIGlmICghZG91YmxlLklzTmFOKFRvcCkpIHsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3RvcFBhdGgsIFRvcC5Ub1N0cmluZygiRjUiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgfQorICAgIGlmICghZG91YmxlLklzTmFOKEJvdHRvbSkpIHsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2JvdHRvbVBhdGgsIEJvdHRvbS5Ub1N0cmluZygiRjUiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgfQorICAgIGlmICghZG91YmxlLklzTmFOKExlZnQpKSB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9sZWZ0UGF0aCwgTGVmdC5Ub1N0cmluZygiRjUiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgfQorICAgIGlmICghZG91YmxlLklzTmFOKFJpZ2h0KSkgeworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfcmlnaHRQYXRoLCBSaWdodC5Ub1N0cmluZygiRjUiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRvcE5vZGU7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxOYW1lZFN0eWxlWG1sLmNzIGIvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbE5hbWVkU3R5bGVYbWwuY3MKaW5kZXggNzdkZTM5NC4uNTk5MDUyYyAxMDA2NDQKLS0tIGEvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbE5hbWVkU3R5bGVYbWwuY3MKKysrIGIvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbE5hbWVkU3R5bGVYbWwuY3MKQEAgLTEzLDEzMyArMTMsMTE1IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJICAgICAgICAgICAgICAgIEluaXRpYWwgUmVsZWFzZQkJICAgICAgICAyMDA5LTEwLTAxCiAgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKKwogdXNpbmcgU3lzdGVtLlhtbDsKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzcwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gWG1sIGFjY2VzcyBjbGFzcyBmb3IgbmFtZWQgc3R5bGVzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsTmFtZWRTdHlsZVhtbCA6IFN0eWxlWG1sSGVscGVyCi0gICAgewotICAgICAgICBFeGNlbFN0eWxlcyBfc3R5bGVzOwotICAgICAgICBpbnRlcm5hbCBFeGNlbE5hbWVkU3R5bGVYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLCBFeGNlbFN0eWxlcyBzdHlsZXMpCi0gICAgICAgICAgICA6IGJhc2UobmFtZVNwYWNlTWFuYWdlcikKLSAgICAgICAgewotICAgICAgICAgICAgX3N0eWxlcyA9IHN0eWxlczsKLSAgICAgICAgICAgIEJ1aWxkSW5JZCA9IGludC5NaW5WYWx1ZTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbE5hbWVkU3R5bGVYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBOYW1lU3BhY2VNYW5hZ2VyLCBYbWxOb2RlIHRvcE5vZGUsIEV4Y2VsU3R5bGVzIHN0eWxlcykgOgotICAgICAgICAgICAgYmFzZShOYW1lU3BhY2VNYW5hZ2VyLCB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHlsZVhmSWQgPSBHZXRYbWxOb2RlSW50KGlkUGF0aCk7Ci0gICAgICAgICAgICBOYW1lID0gR2V0WG1sTm9kZVN0cmluZyhuYW1lUGF0aCk7Ci0gICAgICAgICAgICBCdWlsZEluSWQgPSBHZXRYbWxOb2RlSW50KGJ1aWxkSW5JZFBhdGgpOwotICAgICAgICAgICAgQ3VzdG9tQnVpbGRpbiA9IEdldFhtbE5vZGVCb29sKGN1c3RvbUJ1aWx0aW5QYXRoKTsKIAotICAgICAgICAgICAgX3N0eWxlcyA9IHN0eWxlczsKLSAgICAgICAgICAgIF9zdHlsZSA9IG5ldyBFeGNlbFN0eWxlKHN0eWxlcywgc3R5bGVzLk5hbWVkU3R5bGVQcm9wZXJ0eUNoYW5nZSwgLTEsIE5hbWUsIF9zdHlsZVhmSWQpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIG92ZXJyaWRlIHN0cmluZyBJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgX3N0eWxlWGZJZD0wOwotICAgICAgICBjb25zdCBzdHJpbmcgaWRQYXRoID0gIkB4ZklkIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTmFtZWQgc3R5bGUgaW5kZXgKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBTdHlsZVhmSWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZVhmSWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfc3R5bGVYZklkID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50IF94ZklkID0gaW50Lk1pblZhbHVlOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTdHlsZSBpbmRleAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBpbnQgWGZJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3hmSWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfeGZJZCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBidWlsZEluSWRQYXRoID0gIkBidWlsdGluSWQiOwotICAgICAgICBwdWJsaWMgaW50IEJ1aWxkSW5JZCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBjdXN0b21CdWlsdGluUGF0aCA9ICJAY3VzdG9tQnVpbHRpbiI7Ci0gICAgICAgIHB1YmxpYyBib29sIEN1c3RvbUJ1aWxkaW4geyBnZXQ7IHNldDsgfQotICAgICAgICBjb25zdCBzdHJpbmcgbmFtZVBhdGggPSAiQG5hbWUiOwotICAgICAgICBzdHJpbmcgX25hbWU7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE5hbWUgb2YgdGhlIHN0eWxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX25hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfbmFtZSA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsU3R5bGUgX3N0eWxlID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHN0eWxlIG9iamVjdAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxTdHlsZSBTdHlsZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWwgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3N0eWxlID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKIAotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBYbWxOb2RlIENyZWF0ZVhtbE5vZGUoWG1sTm9kZSB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBUb3BOb2RlID0gdG9wTm9kZTsKLSAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcobmFtZVBhdGgsIF9uYW1lKTsKLSAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkB4ZklkIiwgX3N0eWxlcy5DZWxsU3R5bGVYZnNbU3R5bGVYZklkXS5uZXdJRC5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIGlmIChCdWlsZEluSWQ+PTApIFNldFhtbE5vZGVTdHJpbmcoIkBidWlsdGluSWQiLCBCdWlsZEluSWQuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBpZihDdXN0b21CdWlsZGluKSBTZXRYbWxOb2RlQm9vbChjdXN0b21CdWlsdGluUGF0aCwgdHJ1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gVG9wTm9kZTsgICAgICAgICAgICAKLSAgICAgICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIFhtbCBhY2Nlc3MgY2xhc3MgZm9yIG5hbWVkIHN0eWxlcworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxOYW1lZFN0eWxlWG1sIDogU3R5bGVYbWxIZWxwZXIgeworICBwcml2YXRlIEV4Y2VsU3R5bGVzIF9zdHlsZXM7CisKKyAgaW50ZXJuYWwgRXhjZWxOYW1lZFN0eWxlWG1sKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlciwgRXhjZWxTdHlsZXMgc3R5bGVzKQorICAgICAgOiBiYXNlKG5hbWVTcGFjZU1hbmFnZXIpIHsKKyAgICBfc3R5bGVzID0gc3R5bGVzOworICAgIEJ1aWxkSW5JZCA9IGludC5NaW5WYWx1ZTsKKyAgfQorCisgIGludGVybmFsIEV4Y2VsTmFtZWRTdHlsZVhtbCgKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlciwKKyAgICAgIFhtbE5vZGUgdG9wTm9kZSwKKyAgICAgIEV4Y2VsU3R5bGVzIHN0eWxlcykKKyAgICAgIDogYmFzZShuYW1lU3BhY2VNYW5hZ2VyLCB0b3BOb2RlKSB7CisgICAgU3R5bGVYZklkID0gR2V0WG1sTm9kZUludChfaWRQYXRoKTsKKyAgICBOYW1lID0gR2V0WG1sTm9kZVN0cmluZyhfbmFtZVBhdGgpOworICAgIEJ1aWxkSW5JZCA9IEdldFhtbE5vZGVJbnQoX2J1aWxkSW5JZFBhdGgpOworICAgIEN1c3RvbUJ1aWxkaW4gPSBHZXRYbWxOb2RlQm9vbChfY3VzdG9tQnVpbHRpblBhdGgpOworCisgICAgX3N0eWxlcyA9IHN0eWxlczsKKyAgICBfc3R5bGUgPSBuZXcoc3R5bGVzLCBzdHlsZXMuTmFtZWRTdHlsZVByb3BlcnR5Q2hhbmdlLCAtMSwgTmFtZSwgX3N0eWxlWGZJZCk7CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQgPT4gTmFtZTsKKworICBwcml2YXRlIGludCBfc3R5bGVYZklkOworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfaWRQYXRoID0gIkB4ZklkIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOYW1lZCBzdHlsZSBpbmRleAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IFN0eWxlWGZJZCB7CisgICAgZ2V0ID0+IF9zdHlsZVhmSWQ7CisgICAgc2V0ID0+IF9zdHlsZVhmSWQgPSB2YWx1ZTsKKyAgfQorCisgIHByaXZhdGUgaW50IF94ZklkID0gaW50Lk1pblZhbHVlOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFN0eWxlIGluZGV4CisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIGludCBYZklkIHsKKyAgICBnZXQgPT4gX3hmSWQ7CisgICAgc2V0ID0+IF94ZklkID0gdmFsdWU7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfYnVpbGRJbklkUGF0aCA9ICJAYnVpbHRpbklkIjsKKworICBwdWJsaWMgaW50IEJ1aWxkSW5JZCB7IGdldDsgc2V0OyB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2N1c3RvbUJ1aWx0aW5QYXRoID0gIkBjdXN0b21CdWlsdGluIjsKKworICBwdWJsaWMgYm9vbCBDdXN0b21CdWlsZGluIHsgZ2V0OyBzZXQ7IH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfbmFtZVBhdGggPSAiQG5hbWUiOworICBwcml2YXRlIHN0cmluZyBfbmFtZTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOYW1lIG9mIHRoZSBzdHlsZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIE5hbWUgeworICAgIGdldCA9PiBfbmFtZTsKKyAgICBpbnRlcm5hbCBzZXQgPT4gX25hbWUgPSB2YWx1ZTsKKyAgfQorCisgIHByaXZhdGUgRXhjZWxTdHlsZSBfc3R5bGU7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIHN0eWxlIG9iamVjdAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxTdHlsZSBTdHlsZSB7CisgICAgZ2V0ID0+IF9zdHlsZTsKKyAgICBpbnRlcm5hbCBzZXQgPT4gX3N0eWxlID0gdmFsdWU7CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBYbWxOb2RlIENyZWF0ZVhtbE5vZGUoWG1sTm9kZSB0b3BOb2RlKSB7CisgICAgVG9wTm9kZSA9IHRvcE5vZGU7CisgICAgU2V0WG1sTm9kZVN0cmluZyhfbmFtZVBhdGgsIF9uYW1lKTsKKyAgICBTZXRYbWxOb2RlU3RyaW5nKCJAeGZJZCIsIF9zdHlsZXMuQ2VsbFN0eWxlWGZzW1N0eWxlWGZJZF0ubmV3SUQuVG9TdHJpbmcoKSk7CisgICAgaWYgKEJ1aWxkSW5JZCA+PSAwKSB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAYnVpbHRpbklkIiwgQnVpbGRJbklkLlRvU3RyaW5nKCkpOwogICAgIH0KKyAgICBpZiAoQ3VzdG9tQnVpbGRpbikgeworICAgICAgU2V0WG1sTm9kZUJvb2woX2N1c3RvbUJ1aWx0aW5QYXRoLCB0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIFRvcE5vZGU7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxOdW1iZXJGb3JtYXRYbWwuY3MgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsTnVtYmVyRm9ybWF0WG1sLmNzCmluZGV4IDQxMGEyZGQuLjBkMGI0NmYgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxOdW1iZXJGb3JtYXRYbWwuY3MKKysrIGIvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbE51bWJlckZvcm1hdFhtbC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsNjU4ICsxMyw2OTEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Cit1c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzcwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gWG1sIGFjY2VzcyBjbGFzcyBmb3IgbnVtYmVyIGZvcm1hdHMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxOdW1iZXJGb3JtYXRYbWwgOiBTdHlsZVhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxOdW1iZXJGb3JtYXRYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKSA6IGJhc2UobmFtZVNwYWNlTWFuYWdlcikKLSAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgIH0gICAgICAgIAotICAgICAgICBpbnRlcm5hbCBFeGNlbE51bWJlckZvcm1hdFhtbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIsIGJvb2wgYnVpbGRJbik6IGJhc2UobmFtZVNwYWNlTWFuYWdlcikKLSAgICAgICAgewotICAgICAgICAgICAgQnVpbGRJbiA9IGJ1aWxkSW47Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxOdW1iZXJGb3JtYXRYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuc20sIFhtbE5vZGUgdG9wTm9kZSkgOgotICAgICAgICAgICAgYmFzZShuc20sIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9udW1GbXRJZCA9IEdldFhtbE5vZGVJbnQoIkBudW1GbXRJZCIpOwotICAgICAgICAgICAgX2Zvcm1hdCA9IEdldFhtbE5vZGVTdHJpbmcoIkBmb3JtYXRDb2RlIik7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGJvb2wgQnVpbGRJbiB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KLSAgICAgICAgaW50IF9udW1GbXRJZDsKLS8vICAgICAgICBjb25zdCBzdHJpbmcgaWRQYXRoID0gIkBudW1GbXRJZCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElkIGZvciBudW1iZXIgZm9ybWF0Ci0gICAgICAgIC8vLyAKLSAgICAgICAgLy8vIEJ1aWxkIGluIElEJ3MKLSAgICAgICAgLy8vIAotICAgICAgICAvLy8gMCAgIEdlbmVyYWwgCi0gICAgICAgIC8vLyAxICAgMCAKLSAgICAgICAgLy8vIDIgICAwLjAwIAotICAgICAgICAvLy8gMyAgICMsIyMwIAotICAgICAgICAvLy8gNCAgICMsIyMwLjAwIAotICAgICAgICAvLy8gOSAgIDAlIAotICAgICAgICAvLy8gMTAgIDAuMDAlIAotICAgICAgICAvLy8gMTEgIDAuMDBFKzAwIAotICAgICAgICAvLy8gMTIgICMgPy8/IAotICAgICAgICAvLy8gMTMgICMgPz8vPz8gCi0gICAgICAgIC8vLyAxNCAgbW0tZGQteXkgCi0gICAgICAgIC8vLyAxNSAgZC1tbW0teXkgCi0gICAgICAgIC8vLyAxNiAgZC1tbW0gCi0gICAgICAgIC8vLyAxNyAgbW1tLXl5IAotICAgICAgICAvLy8gMTggIGg6bW0gQU0vUE0gCi0gICAgICAgIC8vLyAxOSAgaDptbTpzcyBBTS9QTSAKLSAgICAgICAgLy8vIDIwICBoOm1tIAotICAgICAgICAvLy8gMjEgIGg6bW06c3MgCi0gICAgICAgIC8vLyAyMiAgbS9kL3l5IGg6bW0gCi0gICAgICAgIC8vLyAzNyAgIywjIzAgOygjLCMjMCkgCi0gICAgICAgIC8vLyAzOCAgIywjIzAgO1tSZWRdKCMsIyMwKSAKLSAgICAgICAgLy8vIDM5ICAjLCMjMC4wMDsoIywjIzAuMDApIAotICAgICAgICAvLy8gNDAgICMsIyMwLjAwO1tSZWRdKCMsIyMwLjAwKSAKLSAgICAgICAgLy8vIDQ1ICBtbTpzcyAKLSAgICAgICAgLy8vIDQ2ICBbaF06bW06c3MgCi0gICAgICAgIC8vLyA0NyAgbW1zcy4wIAotICAgICAgICAvLy8gNDggICMjMC4wRSswIAotICAgICAgICAvLy8gNDkgIEAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4gICAgICAgICAgICAKLSAgICAgICAgcHVibGljIGludCBOdW1GbXRJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX251bUZtdElkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX251bUZtdElkID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfZm9ybWF0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBmbXRQYXRoID0gIkBmb3JtYXRDb2RlIjsKLSAgICAgICAgc3RyaW5nIF9mb3JtYXQgPSBzdHJpbmcuRW1wdHk7Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgRm9ybWF0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfZm9ybWF0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX251bUZtdElkID0gRXhjZWxOdW1iZXJGb3JtYXQuR2V0RnJvbUJ1aWxkSWRGcm9tRm9ybWF0KHZhbHVlKTsKLSAgICAgICAgICAgICAgICBfZm9ybWF0ID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEdldE5ld0lEKGludCBOdW1GbXRJZCwgc3RyaW5nIEZvcm1hdCkKLSAgICAgICAgewotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoTnVtRm10SWQgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE51bUZtdElkID0gRXhjZWxOdW1iZXJGb3JtYXQuR2V0RnJvbUJ1aWxkSWRGcm9tRm9ybWF0KEZvcm1hdCk7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE51bUZtdElkLlRvU3RyaW5nKCk7Ci0gICAgICAgIH0KK3VzaW5nIFN5c3RlbS5YbWw7CiAKLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgQWRkQnVpbGRJbihYbWxOYW1lc3BhY2VNYW5hZ2VyIE5hbWVTcGFjZU1hbmFnZXIsIEV4Y2VsU3R5bGVDb2xsZWN0aW9uPEV4Y2VsTnVtYmVyRm9ybWF0WG1sPiBOdW1iZXJGb3JtYXRzKQotICAgICAgICB7Ci0gICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiR2VuZXJhbCIsbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsdHJ1ZSl7TnVtRm10SWQ9MCxGb3JtYXQ9IkdlbmVyYWwifSk7Ci0gICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiMCIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLHRydWUpIHsgTnVtRm10SWQgPSAxLCBGb3JtYXQgPSAiMCIgfSk7Ci0gICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiMC4wMCIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLHRydWUpIHsgTnVtRm10SWQgPSAyLCBGb3JtYXQgPSAiMC4wMCIgfSk7Ci0gICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiIywjIzAiLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDMsIEZvcm1hdCA9ICIjLCMjMCIgfSk7Ci0gICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiIywjIzAuMDAiLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDQsIEZvcm1hdCA9ICIjLCMjMC4wMCIgfSk7Ci0gICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiMCUiLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlcix0cnVlKSB7IE51bUZtdElkID0gOSwgRm9ybWF0ID0gIjAlIiB9KTsKLSAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCIwLjAwJSIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLHRydWUpIHsgTnVtRm10SWQgPSAxMCwgRm9ybWF0ID0gIjAuMDAlIiB9KTsKLSAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCIwLjAwRSswMCIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gMTEsIEZvcm1hdCA9ICIwLjAwRSswMCIgfSk7Ci0gICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiIyA/Lz8iLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDEyLCBGb3JtYXQgPSAiIyA/Lz8iIH0pOwotICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoIiMgPz8vPz8iLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlcix0cnVlKSB7IE51bUZtdElkID0gMTMsIEZvcm1hdCA9ICIjID8/Lz8/IiB9KTsKLSAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCJtbS1kZC15eSIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLHRydWUpIHsgTnVtRm10SWQgPSAxNCwgRm9ybWF0ID0gIm1tLWRkLXl5IiB9KTsKLSAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCJkLW1tbS15eSIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gMTUsIEZvcm1hdCA9ICJkLW1tbS15eSIgfSk7Ci0gICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiZC1tbW0iLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDE2LCBGb3JtYXQgPSAiZC1tbW0iIH0pOwotICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoIm1tbS15eSIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gMTcsIEZvcm1hdCA9ICJtbW0teXkiIH0pOwotICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoImg6bW0gQU0vUE0iLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDE4LCBGb3JtYXQgPSAiaDptbSBBTS9QTSIgfSk7Ci0gICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiaDptbTpzcyBBTS9QTSIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gMTksIEZvcm1hdCA9ICJoOm1tOnNzIEFNL1BNIiB9KTsKLSAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCJoOm1tIiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsgTnVtRm10SWQgPSAyMCwgRm9ybWF0ID0gImg6bW0iIH0pOwotICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoImg6bW06c3MiLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDIxLCBGb3JtYXQgPSAiaDptbTpzcyIgfSk7Ci0gICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgibS9kL3l5IGg6bW0iLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDIyLCBGb3JtYXQgPSAibS9kL3l5IGg6bW0iIH0pOwotICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoIiMsIyMwIDsoIywjIzApIiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsgTnVtRm10SWQgPSAzNywgRm9ybWF0ID0gIiMsIyMwIDsoIywjIzApIiB9KTsKLSAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCIjLCMjMCA7W1JlZF0oIywjIzApIiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsgTnVtRm10SWQgPSAzOCwgRm9ybWF0ID0gIiMsIyMwIDtbUmVkXSgjLCMjMCkiIH0pOwotICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoIiMsIyMwLjAwOygjLCMjMC4wMCkiLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDM5LCBGb3JtYXQgPSAiIywjIzAuMDA7KCMsIyMwLjAwKSIgfSk7Ci0gICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiIywjIzAuMDA7W1JlZF0oIywjIzAuMDApIiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsgTnVtRm10SWQgPSA0MCwgRm9ybWF0ID0gIiMsIyMwLjAwO1tSZWRdKCMsIykiIH0pOwotICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5BZGQoIm1tOnNzIiwgbmV3IEV4Y2VsTnVtYmVyRm9ybWF0WG1sKE5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsgTnVtRm10SWQgPSA0NSwgRm9ybWF0ID0gIm1tOnNzIiB9KTsKLSAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCJbaF06bW06c3MiLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDQ2LCBGb3JtYXQgPSAiW2hdOm1tOnNzIiB9KTsKLSAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCJtbXNzLjAiLCBuZXcgRXhjZWxOdW1iZXJGb3JtYXRYbWwoTmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeyBOdW1GbXRJZCA9IDQ3LCBGb3JtYXQgPSAibW1zcy4wIiB9KTsKLSAgICAgICAgICAgIE51bWJlckZvcm1hdHMuQWRkKCIjIzAuMCIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gNDgsIEZvcm1hdCA9ICIjIzAuMCIgfSk7Ci0gICAgICAgICAgICBOdW1iZXJGb3JtYXRzLkFkZCgiQCIsIG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7IE51bUZtdElkID0gNDksIEZvcm1hdCA9ICJAIiB9KTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKIAotICAgICAgICAgICAgTnVtYmVyRm9ybWF0cy5OZXh0SWQgPSAxNjQ7IC8vU3RhcnQgZm9yIGN1c3RvbSBmb3JtYXRzLgotICAgICAgICB9CisvLy8gPHN1bW1hcnk+CisvLy8gWG1sIGFjY2VzcyBjbGFzcyBmb3IgbnVtYmVyIGZvcm1hdHMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgc2VhbGVkIGNsYXNzIEV4Y2VsTnVtYmVyRm9ybWF0WG1sIDogU3R5bGVYbWxIZWxwZXIgeworICBpbnRlcm5hbCBFeGNlbE51bWJlckZvcm1hdFhtbChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UobmFtZVNwYWNlTWFuYWdlcikge30KIAotICAgICAgICBpbnRlcm5hbCBvdmVycmlkZSBYbWxOb2RlIENyZWF0ZVhtbE5vZGUoWG1sTm9kZSB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBUb3BOb2RlID0gdG9wTm9kZTsKLSAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBudW1GbXRJZCIsIE51bUZtdElkLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGZvcm1hdENvZGUiLCBGb3JtYXQpOwotICAgICAgICAgICAgcmV0dXJuIFRvcE5vZGU7Ci0gICAgICAgIH0KKyAgaW50ZXJuYWwgRXhjZWxOdW1iZXJGb3JtYXRYbWwoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLCBib29sIGJ1aWxkSW4pCisgICAgICA6IGJhc2UobmFtZVNwYWNlTWFuYWdlcikgeworICAgIEJ1aWxkSW4gPSBidWlsZEluOworICB9CiAKLSAgICAgICAgaW50ZXJuYWwgZW51bSBlRm9ybWF0VHlwZQotICAgICAgICB7Ci0gICAgICAgICAgICBVbmtub3duID0gMCwKLSAgICAgICAgICAgIE51bWJlciA9IDEsCi0gICAgICAgICAgICBEYXRlVGltZSA9IDIsCi0gICAgICAgIH0KLSAgICAgICAgRXhjZWxGb3JtYXRUcmFuc2xhdG9yIF90cmFuc2xhdG9yID0gbnVsbDsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxGb3JtYXRUcmFuc2xhdG9yIEZvcm1hdFRyYW5zbGF0b3IKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF90cmFuc2xhdG9yID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfdHJhbnNsYXRvciA9IG5ldyBFeGNlbEZvcm1hdFRyYW5zbGF0b3IoRm9ybWF0LCBOdW1GbXRJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfdHJhbnNsYXRvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAjcmVnaW9uIEV4Y2VsIC0tPiAuTmV0IEZvcm1hdAotICAgICAgICBpbnRlcm5hbCBjbGFzcyBFeGNlbEZvcm1hdFRyYW5zbGF0b3IKLSAgICAgICAgewotICAgICAgICAgICAgaW50ZXJuYWwgRXhjZWxGb3JtYXRUcmFuc2xhdG9yKHN0cmluZyBmb3JtYXQsIGludCBudW1GbXRJRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobnVtRm10SUQgPT0gMTQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOZXRGb3JtYXQgPSBOZXRGb3JtYXRGb3JXaWR0aCA9ICJkIjsKLSAgICAgICAgICAgICAgICAgICAgTmV0VGV4dEZvcm1hdCA9IE5ldFRleHRGb3JtYXRGb3JXaWR0aCA9ICIiOwotICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSA9IGVGb3JtYXRUeXBlLkRhdGVUaW1lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChmb3JtYXQuRXF1YWxzKCJnZW5lcmFsIixTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIE5ldEZvcm1hdCA9IE5ldEZvcm1hdEZvcldpZHRoID0gIjAuIyMjIyMiOwotICAgICAgICAgICAgICAgICAgICBOZXRUZXh0Rm9ybWF0ID0gTmV0VGV4dEZvcm1hdEZvcldpZHRoID0gIiI7Ci0gICAgICAgICAgICAgICAgICAgIERhdGFUeXBlID0gZUZvcm1hdFR5cGUuTnVtYmVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBUb05ldEZvcm1hdChmb3JtYXQsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgVG9OZXRGb3JtYXQoZm9ybWF0LCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWwgc3RyaW5nIE5ldFRleHRGb3JtYXQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzdHJpbmcgTmV0Rm9ybWF0IHsgZ2V0OyBwcml2YXRlIHNldDsgfQotICAgICAgICAgICAgQ3VsdHVyZUluZm8gX2NpID0gbnVsbDsKLSAgICAgICAgICAgIGludGVybmFsIEN1bHR1cmVJbmZvIEN1bHR1cmUKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfY2kgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEN1bHR1cmVJbmZvLkN1cnJlbnRDdWx0dXJlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBfY2k7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHByaXZhdGUgc2V0Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfY2kgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBlRm9ybWF0VHlwZSBEYXRhVHlwZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KLSAgICAgICAgICAgIGludGVybmFsIHN0cmluZyBOZXRUZXh0Rm9ybWF0Rm9yV2lkdGggeyBnZXQ7IHByaXZhdGUgc2V0OyB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzdHJpbmcgTmV0Rm9ybWF0Rm9yV2lkdGggeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisgIGludGVybmFsIEV4Y2VsTnVtYmVyRm9ybWF0WG1sKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnNtLCBYbWxOb2RlIHRvcE5vZGUpCisgICAgICA6IGJhc2UobnNtLCB0b3BOb2RlKSB7CisgICAgX251bUZtdElkID0gR2V0WG1sTm9kZUludCgiQG51bUZtdElkIik7CisgICAgX2Zvcm1hdCA9IEdldFhtbE5vZGVTdHJpbmcoIkBmb3JtYXRDb2RlIik7CisgIH0KIAotICAgICAgICAgICAgLy9pbnRlcm5hbCBzdHJpbmcgRnJhY3Rpb25Gb3JtYXRJbnRlZ2VyIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotICAgICAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEZyYWN0aW9uRm9ybWF0IHsgZ2V0OyBwcml2YXRlIHNldDsgfQotICAgICAgICAgICAgLy9pbnRlcm5hbCBzdHJpbmcgRnJhY3Rpb25Gb3JtYXQyIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorICBwdWJsaWMgYm9vbCBCdWlsZEluIHsgZ2V0OyBwcml2YXRlIHNldDsgfQogCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgVG9OZXRGb3JtYXQoc3RyaW5nIEV4Y2VsRm9ybWF0LCBib29sIGZvckNvbFdpZHRoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERhdGFUeXBlID0gZUZvcm1hdFR5cGUuVW5rbm93bjsKLSAgICAgICAgICAgICAgICBpbnQgc2VjQ291bnQgPSAwOwotICAgICAgICAgICAgICAgIGJvb2wgaXNUZXh0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc0JyYWNrZXQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzdHJpbmcgYnJhY2tldFRleHQgPSAiIjsKLSAgICAgICAgICAgICAgICBib29sIHByZXZCc2xzaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJvb2wgdXNlTWludXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYm9vbCBwcmV2VW5kZXJTY29yZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJvb2wgaWdub3JlTmV4dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGludCBmcmFjdGlvblBvcyA9IC0xOwotICAgICAgICAgICAgICAgIHN0cmluZyBzcGVjaWFsRGF0ZUZvcm1hdCA9ICIiOwotICAgICAgICAgICAgICAgIGJvb2wgY29udGFpbnNBbVBtID0gRXhjZWxGb3JtYXQuQ29udGFpbnMoIkFNL1BNIik7Ci0gICAgICAgICAgICAgICAgTGlzdDxpbnQ+IGxzdERlYz1uZXcgTGlzdDxpbnQ+KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgQ3VsdHVyZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdmFyIGZvcm1hdCA9ICIiOwotICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gIiI7Ci0gICAgICAgICAgICAgICAgY2hhciBjbGM7CisgIHByaXZhdGUgaW50IF9udW1GbXRJZDsKIAotICAgICAgICAgICAgICAgIGlmIChjb250YWluc0FtUG0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBFeGNlbEZvcm1hdCA9IFJlZ2V4LlJlcGxhY2UoRXhjZWxGb3JtYXQsICJBTS9QTSIsICIiKTsKLSAgICAgICAgICAgICAgICAgICAgRGF0YVR5cGUgPSBlRm9ybWF0VHlwZS5EYXRlVGltZTsKLSAgICAgICAgICAgICAgICB9CisgIC8vICAgICAgICBjb25zdCBzdHJpbmcgaWRQYXRoID0gIkBudW1GbXRJZCI7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElkIGZvciBudW1iZXIgZm9ybWF0CisgIC8vLworICAvLy8gQnVpbGQgaW4gSUQncworICAvLy8KKyAgLy8vIDAgICBHZW5lcmFsCisgIC8vLyAxICAgMAorICAvLy8gMiAgIDAuMDAKKyAgLy8vIDMgICAjLCMjMAorICAvLy8gNCAgICMsIyMwLjAwCisgIC8vLyA5ICAgMCUKKyAgLy8vIDEwICAwLjAwJQorICAvLy8gMTEgIDAuMDBFKzAwCisgIC8vLyAxMiAgIyA/Lz8KKyAgLy8vIDEzICAjID8/Lz8/CisgIC8vLyAxNCAgbW0tZGQteXkKKyAgLy8vIDE1ICBkLW1tbS15eQorICAvLy8gMTYgIGQtbW1tCisgIC8vLyAxNyAgbW1tLXl5CisgIC8vLyAxOCAgaDptbSBBTS9QTQorICAvLy8gMTkgIGg6bW06c3MgQU0vUE0KKyAgLy8vIDIwICBoOm1tCisgIC8vLyAyMSAgaDptbTpzcworICAvLy8gMjIgIG0vZC95eSBoOm1tCisgIC8vLyAzNyAgIywjIzAgOygjLCMjMCkKKyAgLy8vIDM4ICAjLCMjMCA7W1JlZF0oIywjIzApCisgIC8vLyAzOSAgIywjIzAuMDA7KCMsIyMwLjAwKQorICAvLy8gNDAgICMsIyMwLjAwO1tSZWRdKCMsIyMwLjAwKQorICAvLy8gNDUgIG1tOnNzCisgIC8vLyA0NiAgW2hdOm1tOnNzCisgIC8vLyA0NyAgbW1zcy4wCisgIC8vLyA0OCAgIyMwLjBFKzAKKyAgLy8vIDQ5ICBACisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgTnVtRm10SWQgeworICAgIGdldCA9PiBfbnVtRm10SWQ7CisgICAgc2V0ID0+IF9udW1GbXRJZCA9IHZhbHVlOworICB9CiAKLSAgICAgICAgICAgICAgICBmb3IgKGludCBwb3MgPSAwOyBwb3MgPCBFeGNlbEZvcm1hdC5MZW5ndGg7IHBvcysrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gRXhjZWxGb3JtYXRbcG9zXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJyInKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc1RleHQgPSAhaXNUZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZU5leHQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlTmV4dCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNUZXh0ICYmICFpc0JyYWNrZXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNCcmFja2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICddJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQnJhY2tldCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnJhY2tldFRleHRbMF0gPT0gJyQnKSAgLy9Mb2NhbCBJbmZvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ1tdIGxpID0gUmVnZXguU3BsaXQoYnJhY2tldFRleHQsICItIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlbMF0uTGVuZ3RoID4gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIlwiIiArIGxpWzBdLlN1YnN0cmluZygxLCBsaVswXS5MZW5ndGggLSAxKSArICJcIiIpOyAgICAgLy9DdXJyZW5jeSBzeW1ib2wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaS5MZW5ndGggPiAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaVsxXS5FcXVhbHMoImY4MDAiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxEYXRlRm9ybWF0ID0gIkQiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsaVsxXS5FcXVhbHMoImY0MDAiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxEYXRlRm9ybWF0ID0gIlQiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbnVtID0gaW50LlBhcnNlKGxpWzFdLCBOdW1iZXJTdHlsZXMuSGV4TnVtYmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1bHR1cmUgPSBDdWx0dXJlSW5mby5HZXRDdWx0dXJlSW5mbyhudW0gJiAweEZGRkYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1bHR1cmUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYnJhY2tldFRleHRbMF09PSd0JykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJoaCIpOyAvL1RPRE86VGhpcyB3aWxsIG5vdCBiZSBjb3JyZWN0IGZvciBkYXRlcyBvdmVyIDI0SC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChicmFja2V0VGV4dFswXSA9PSAnaCcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxEYXRlRm9ybWF0ID0gImhoIjsgLy9UT0RPOlRoaXMgd2lsbCBub3QgYmUgY29ycmVjdCBmb3IgZGF0ZXMgb3ZlciAyNEguCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhY2tldFRleHQgKz0gYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcmV2VW5kZXJTY29yZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9yQ29sV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIlwiezB9XCIiLCBjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlVuZGVyU2NvcmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAnOycpIC8vV2UgdXNlIGZpcnN0IHBhcnQgKGZvciBwb3NpdGl2ZSBvbmx5IGF0IHRoaXMgc3RhZ2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNDb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGF0YVR5cGUgPT0gZUZvcm1hdFR5cGUuRGF0ZVRpbWUgfHwgc2VjQ291bnQgPT0gMykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9BZGQgcW91dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGF0YVR5cGUgPT0gZUZvcm1hdFR5cGUuRGF0ZVRpbWUpIFNldERlY2ltYWwobHN0RGVjLCBzYik7IC8vUmVtb3ZlPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHN0RGVjID0gbmV3IExpc3Q8aW50PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gc2IuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGMgPSBjLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKVswXTsgIC8vTG93ZXJjYXNlIGNoYXJhY3RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1NldCB0aGUgZGF0ZXR5cGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERhdGFUeXBlID09IGVGb3JtYXRUeXBlLlVua25vd24pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09ICcwJyB8fCBjID09ICcjJyB8fCBjID09ICcuJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhVHlwZSA9IGVGb3JtYXRUeXBlLk51bWJlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsYyA9PSAneScgfHwgY2xjID09ICdtJyB8fCBjbGMgPT0gJ2QnIHx8IGNsYyA9PSAnaCcgfHwgY2xjID09ICdtJyB8fCBjbGMgPT0gJ3MnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFUeXBlID0gZUZvcm1hdFR5cGUuRGF0ZVRpbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkID0+IF9mb3JtYXQ7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZCc2xzaCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gJy4nIHx8IGMgPT0gJywnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgnXFwnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZChjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZCc2xzaCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ1snKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFja2V0VGV4dCA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCcmFja2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICdcXCcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZCc2xzaCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnMCcgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJyMnIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID09ICcuJyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnLCcgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJyUnIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGMgPT0gJ2QnIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGMgPT0gJ3MnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0nLicpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHN0RGVjLkFkZChzYi5MZW5ndGggLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjbGMgPT0gJ2gnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNBbVBtKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgnaCcpOyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCdIJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VNaW51dGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsYyA9PSAnbScpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VNaW51dGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCdtJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCdNJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnXycpIC8vU2tpcCBuZXh0IGJ1dCB1c2UgZm9yIGFsaWdubWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2VW5kZXJTY29yZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYyA9PSAnPycpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgnICcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJy8nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRGF0YVR5cGUgPT0gZUZvcm1hdFR5cGUuTnVtYmVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uUG9zID0gc2IuTGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydFBvcyA9IHBvcyAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0YXJ0UG9zID49IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFeGNlbEZvcm1hdFtzdGFydFBvc10gPT0gJz8nIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbEZvcm1hdFtzdGFydFBvc10gPT0gJyMnIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlbEZvcm1hdFtzdGFydFBvc10gPT0gJzAnKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZm10UGF0aCA9ICJAZm9ybWF0Q29kZSI7CisgIHByaXZhdGUgc3RyaW5nIF9mb3JtYXQgPSBzdHJpbmcuRW1wdHk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnRQb3MgPiAwKSAgLy9SZW1vdmVQYXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLlJlbW92ZShzYi5MZW5ndGgtKHBvcy1zdGFydFBvcy0xKSwocG9zLXN0YXJ0UG9zLTEpKSA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kUG9zID0gcG9zICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZW5kUG9zIDwgRXhjZWxGb3JtYXQuTGVuZ3RoICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRXhjZWxGb3JtYXRbZW5kUG9zXSA9PSAnPycgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2VsRm9ybWF0W2VuZFBvc10gPT0gJyMnIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRXhjZWxGb3JtYXRbZW5kUG9zXSA+PSAnMCcgJiYgRXhjZWxGb3JtYXRbZW5kUG9zXTw9ICc5JykpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kUG9zKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGVuZFBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRnJhY3Rpb25Gb3JtYXQgIT0gIiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFjdGlvbkZvcm1hdCA9IEV4Y2VsRm9ybWF0LlN1YnN0cmluZyhzdGFydFBvcysxLCBlbmRQb3MgLSBzdGFydFBvcy0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCc/Jyk7IC8vV2lsbCBiZSByZXBsYWNlZCBsYXRlciBvbiBieSB0aGUgZnJhY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoJy8nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID09ICcqJykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXBlYXQgY2hhci0tPiBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZU5leHQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPT0gJ0AnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoInswfSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy9BZGQgcW91dGVzCi0gICAgICAgICAgICAgICAgaWYgKERhdGFUeXBlID09IGVGb3JtYXRUeXBlLkRhdGVUaW1lKSBTZXREZWNpbWFsKGxzdERlYywgc2IpOyAvL1JlbW92ZT8KLQotICAgICAgICAgICAgICAgIC8vIEFNL1BNIGZvcm1hdAotICAgICAgICAgICAgICAgIGlmIChjb250YWluc0FtUG0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgKz0gInR0IjsKLSAgICAgICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gIiIpCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IHNiLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gc2IuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3BlY2lhbERhdGVGb3JtYXQgIT0gIiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBzcGVjaWFsRGF0ZUZvcm1hdDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZm9yQ29sV2lkdGgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBOZXRGb3JtYXRGb3JXaWR0aCA9IGZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgTmV0VGV4dEZvcm1hdEZvcldpZHRoID0gdGV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTmV0Rm9ybWF0ID0gZm9ybWF0OwotICAgICAgICAgICAgICAgICAgICBOZXRUZXh0Rm9ybWF0ID0gdGV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKEN1bHR1cmUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEN1bHR1cmUgPSBDdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgU2V0RGVjaW1hbChMaXN0PGludD4gbHN0RGVjLCBTdHJpbmdCdWlsZGVyIHNiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChsc3REZWMuQ291bnQgPiAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGxzdERlYy5Db3VudCAtIDE7IGkgPj0gMDsgaS0tKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5JbnNlcnQobHN0RGVjW2ldICsgMSwgJ1wnJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYi5JbnNlcnQobHN0RGVjW2ldLCAnXCcnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEZvcm1hdEZyYWN0aW9uKGRvdWJsZSBkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBudW1lcmF0b3IsIGRlbm9tZXJhdG9yOwotCi0gICAgICAgICAgICAgICAgaW50IGludFBhcnQgPSAoaW50KWQ7Ci0KLSAgICAgICAgICAgICAgICBzdHJpbmdbXSBmbXQgPSBGcmFjdGlvbkZvcm1hdC5TcGxpdCgnLycpOwotCi0gICAgICAgICAgICAgICAgaW50IGZpeGVkRGVub21pbmF0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbnQuVHJ5UGFyc2UoZm10WzFdLCBvdXQgZml4ZWREZW5vbWluYXRvcikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaXhlZERlbm9taW5hdG9yID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGQgPT0gMCB8fCBkb3VibGUuSXNOYU4oZCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZm10WzBdLlRyaW0oKSA9PSAiIiAmJiBmbXRbMV0uVHJpbSgpID09ICIiKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IHN0cmluZygnICcsIEZyYWN0aW9uRm9ybWF0Lkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMC5Ub1N0cmluZyhmbXRbMF0pICsgIi8iICsgMS5Ub1N0cmluZyhmbXRbMF0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IG1heERpZ2l0cyA9IGZtdFsxXS5MZW5ndGg7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHNpZ24gPSBkIDwgMCA/ICItIiA6ICIiOwotICAgICAgICAgICAgICAgIGlmIChmaXhlZERlbm9taW5hdG9yID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBMaXN0PGRvdWJsZT4gbnVtZXJhdG9ycyA9IG5ldyBMaXN0PGRvdWJsZT4oKSB7IDEsIDAgfTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxkb3VibGU+IGRlbm9taW5hdG9ycyA9IG5ldyBMaXN0PGRvdWJsZT4oKSB7IDAsIDEgfTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAobWF4RGlnaXRzIDwgMSAmJiBtYXhEaWdpdHMgPiAxMikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiTnVtYmVyIG9mIGRpZ2l0cyBvdXQgb2YgcmFuZ2UgKDEtMTIpIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaW50IG1heE51bSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4RGlnaXRzOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1heE51bSArPSA5ICogKGludCkoTWF0aC5Qb3coKGRvdWJsZSkxMCwgKGRvdWJsZSlpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGl2UmVzID0gMSAvICgoZG91YmxlKU1hdGguQWJzKGQpIC0gaW50UGFydCk7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSByZXN1bHQsIHByZXZSZXN1bHQgPSBkb3VibGUuTmFOOwotICAgICAgICAgICAgICAgICAgICBpbnQgbGlzdFBvcyA9IDIsIGluZGV4ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaW50RGl2UmVzID0gTWF0aC5GbG9vcihkaXZSZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJhdG9ycy5BZGQoKGludERpdlJlcyAqIG51bWVyYXRvcnNbaW5kZXggLSAxXSArIG51bWVyYXRvcnNbaW5kZXggLSAyXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bWVyYXRvcnNbaW5kZXhdID4gbWF4TnVtKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBkZW5vbWluYXRvcnMuQWRkKChpbnREaXZSZXMgKiBkZW5vbWluYXRvcnNbaW5kZXggLSAxXSArIGRlbm9taW5hdG9yc1tpbmRleCAtIDJdKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG51bWVyYXRvcnNbaW5kZXhdIC8gZGVub21pbmF0b3JzW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZW5vbWluYXRvcnNbaW5kZXhdID4gbWF4TnVtKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbGlzdFBvcyA9IGluZGV4OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IHByZXZSZXN1bHQpIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IGQpIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2UmVzdWx0ID0gcmVzdWx0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBkaXZSZXMgPSAxIC8gKGRpdlJlcyAtIGludERpdlJlcyk7ICAvL1Jlc3QKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgbnVtZXJhdG9yID0gKGludCludW1lcmF0b3JzW2xpc3RQb3NdOwotICAgICAgICAgICAgICAgICAgICBkZW5vbWVyYXRvciA9IChpbnQpZGVub21pbmF0b3JzW2xpc3RQb3NdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBudW1lcmF0b3IgPSAoaW50KU1hdGguUm91bmQoKGQgLSBpbnRQYXJ0KSAvICgxRCAvIGZpeGVkRGVub21pbmF0b3IpLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgZGVub21lcmF0b3IgPSBmaXhlZERlbm9taW5hdG9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobnVtZXJhdG9yID09IGRlbm9tZXJhdG9yIHx8IG51bWVyYXRvcj09MCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG51bWVyYXRvciA9PSBkZW5vbWVyYXRvcikgaW50UGFydCsrOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lnbiArIGludFBhcnQuVG9TdHJpbmcoTmV0Rm9ybWF0KS5SZXBsYWNlKCI/IiwgbmV3IHN0cmluZygnICcsIEZyYWN0aW9uRm9ybWF0Lkxlbmd0aCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChpbnRQYXJ0ID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2lnbiArIEZtdEludChudW1lcmF0b3IsIGZtdFswXSkgKyAiLyIgKyBGbXRJbnQoZGVub21lcmF0b3IsIGZtdFsxXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzaWduICsgaW50UGFydC5Ub1N0cmluZyhOZXRGb3JtYXQpLlJlcGxhY2UoIj8iLCBGbXRJbnQobnVtZXJhdG9yLCBmbXRbMF0pICsgIi8iICsgRm10SW50KGRlbm9tZXJhdG9yLCBmbXRbMV0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RyaW5nIEZtdEludChkb3VibGUgdmFsdWUsIHN0cmluZyBmb3JtYXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHYgPSB2YWx1ZS5Ub1N0cmluZygiIyIpOwotICAgICAgICAgICAgICAgIHN0cmluZyBwYWQgPSAiIjsKLSAgICAgICAgICAgICAgICBpZiAodi5MZW5ndGggPCBmb3JtYXQuTGVuZ3RoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGZvcm1hdC5MZW5ndGggLSB2Lkxlbmd0aC0xOyBpID49IDA7IGktLSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdFtpXSA9PSAnPycpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkICs9ICIgIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvcm1hdFtpXSA9PSAnICcpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkICs9ICIwIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcGFkICsgdjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCisgIHB1YmxpYyBzdHJpbmcgRm9ybWF0IHsKKyAgICBnZXQgPT4gX2Zvcm1hdDsKKyAgICBzZXQgeworICAgICAgX251bUZtdElkID0gRXhjZWxOdW1iZXJGb3JtYXQuR2V0RnJvbUJ1aWxkSWRGcm9tRm9ybWF0KHZhbHVlKTsKKyAgICAgIF9mb3JtYXQgPSB2YWx1ZTsKICAgICB9CisgIH0KKworICBpbnRlcm5hbCBzdHJpbmcgR2V0TmV3SWQoaW50IG51bUZtdElkLCBzdHJpbmcgZm9ybWF0KSB7CisgICAgaWYgKG51bUZtdElkIDwgMCkgeworICAgICAgbnVtRm10SWQgPSBFeGNlbE51bWJlckZvcm1hdC5HZXRGcm9tQnVpbGRJZEZyb21Gb3JtYXQoZm9ybWF0KTsKKyAgICB9CisgICAgcmV0dXJuIG51bUZtdElkLlRvU3RyaW5nKCk7CisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBBZGRCdWlsZEluKAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLAorICAgICAgRXhjZWxTdHlsZUNvbGxlY3Rpb248RXhjZWxOdW1iZXJGb3JtYXRYbWw+IG51bWJlckZvcm1hdHMpIHsKKyAgICBudW1iZXJGb3JtYXRzLkFkZCgKKyAgICAgICAgIkdlbmVyYWwiLAorICAgICAgICBuZXcobmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeworICAgICAgICAgIE51bUZtdElkID0gMCwKKyAgICAgICAgICBGb3JtYXQgPSAiR2VuZXJhbCIsCisgICAgICAgIH0pOworICAgIG51bWJlckZvcm1hdHMuQWRkKAorICAgICAgICAiMCIsCisgICAgICAgIG5ldyhuYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7CisgICAgICAgICAgTnVtRm10SWQgPSAxLAorICAgICAgICAgIEZvcm1hdCA9ICIwIiwKKyAgICAgICAgfSk7CisgICAgbnVtYmVyRm9ybWF0cy5BZGQoCisgICAgICAgICIwLjAwIiwKKyAgICAgICAgbmV3KG5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsKKyAgICAgICAgICBOdW1GbXRJZCA9IDIsCisgICAgICAgICAgRm9ybWF0ID0gIjAuMDAiLAorICAgICAgICB9KTsKKyAgICBudW1iZXJGb3JtYXRzLkFkZCgKKyAgICAgICAgIiMsIyMwIiwKKyAgICAgICAgbmV3KG5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsKKyAgICAgICAgICBOdW1GbXRJZCA9IDMsCisgICAgICAgICAgRm9ybWF0ID0gIiMsIyMwIiwKKyAgICAgICAgfSk7CisgICAgbnVtYmVyRm9ybWF0cy5BZGQoCisgICAgICAgICIjLCMjMC4wMCIsCisgICAgICAgIG5ldyhuYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7CisgICAgICAgICAgTnVtRm10SWQgPSA0LAorICAgICAgICAgIEZvcm1hdCA9ICIjLCMjMC4wMCIsCisgICAgICAgIH0pOworICAgIG51bWJlckZvcm1hdHMuQWRkKAorICAgICAgICAiMCUiLAorICAgICAgICBuZXcobmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeworICAgICAgICAgIE51bUZtdElkID0gOSwKKyAgICAgICAgICBGb3JtYXQgPSAiMCUiLAorICAgICAgICB9KTsKKyAgICBudW1iZXJGb3JtYXRzLkFkZCgKKyAgICAgICAgIjAuMDAlIiwKKyAgICAgICAgbmV3KG5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsKKyAgICAgICAgICBOdW1GbXRJZCA9IDEwLAorICAgICAgICAgIEZvcm1hdCA9ICIwLjAwJSIsCisgICAgICAgIH0pOworICAgIG51bWJlckZvcm1hdHMuQWRkKAorICAgICAgICAiMC4wMEUrMDAiLAorICAgICAgICBuZXcobmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeworICAgICAgICAgIE51bUZtdElkID0gMTEsCisgICAgICAgICAgRm9ybWF0ID0gIjAuMDBFKzAwIiwKKyAgICAgICAgfSk7CisgICAgbnVtYmVyRm9ybWF0cy5BZGQoCisgICAgICAgICIjID8vPyIsCisgICAgICAgIG5ldyhuYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7CisgICAgICAgICAgTnVtRm10SWQgPSAxMiwKKyAgICAgICAgICBGb3JtYXQgPSAiIyA/Lz8iLAorICAgICAgICB9KTsKKyAgICBudW1iZXJGb3JtYXRzLkFkZCgKKyAgICAgICAgIiMgPz8vPz8iLAorICAgICAgICBuZXcobmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeworICAgICAgICAgIE51bUZtdElkID0gMTMsCisgICAgICAgICAgRm9ybWF0ID0gIiMgPz8vPz8iLAorICAgICAgICB9KTsKKyAgICBudW1iZXJGb3JtYXRzLkFkZCgKKyAgICAgICAgIm1tLWRkLXl5IiwKKyAgICAgICAgbmV3KG5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsKKyAgICAgICAgICBOdW1GbXRJZCA9IDE0LAorICAgICAgICAgIEZvcm1hdCA9ICJtbS1kZC15eSIsCisgICAgICAgIH0pOworICAgIG51bWJlckZvcm1hdHMuQWRkKAorICAgICAgICAiZC1tbW0teXkiLAorICAgICAgICBuZXcobmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeworICAgICAgICAgIE51bUZtdElkID0gMTUsCisgICAgICAgICAgRm9ybWF0ID0gImQtbW1tLXl5IiwKKyAgICAgICAgfSk7CisgICAgbnVtYmVyRm9ybWF0cy5BZGQoCisgICAgICAgICJkLW1tbSIsCisgICAgICAgIG5ldyhuYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7CisgICAgICAgICAgTnVtRm10SWQgPSAxNiwKKyAgICAgICAgICBGb3JtYXQgPSAiZC1tbW0iLAorICAgICAgICB9KTsKKyAgICBudW1iZXJGb3JtYXRzLkFkZCgKKyAgICAgICAgIm1tbS15eSIsCisgICAgICAgIG5ldyhuYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7CisgICAgICAgICAgTnVtRm10SWQgPSAxNywKKyAgICAgICAgICBGb3JtYXQgPSAibW1tLXl5IiwKKyAgICAgICAgfSk7CisgICAgbnVtYmVyRm9ybWF0cy5BZGQoCisgICAgICAgICJoOm1tIEFNL1BNIiwKKyAgICAgICAgbmV3KG5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsKKyAgICAgICAgICBOdW1GbXRJZCA9IDE4LAorICAgICAgICAgIEZvcm1hdCA9ICJoOm1tIEFNL1BNIiwKKyAgICAgICAgfSk7CisgICAgbnVtYmVyRm9ybWF0cy5BZGQoCisgICAgICAgICJoOm1tOnNzIEFNL1BNIiwKKyAgICAgICAgbmV3KG5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsKKyAgICAgICAgICBOdW1GbXRJZCA9IDE5LAorICAgICAgICAgIEZvcm1hdCA9ICJoOm1tOnNzIEFNL1BNIiwKKyAgICAgICAgfSk7CisgICAgbnVtYmVyRm9ybWF0cy5BZGQoCisgICAgICAgICJoOm1tIiwKKyAgICAgICAgbmV3KG5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsKKyAgICAgICAgICBOdW1GbXRJZCA9IDIwLAorICAgICAgICAgIEZvcm1hdCA9ICJoOm1tIiwKKyAgICAgICAgfSk7CisgICAgbnVtYmVyRm9ybWF0cy5BZGQoCisgICAgICAgICJoOm1tOnNzIiwKKyAgICAgICAgbmV3KG5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsKKyAgICAgICAgICBOdW1GbXRJZCA9IDIxLAorICAgICAgICAgIEZvcm1hdCA9ICJoOm1tOnNzIiwKKyAgICAgICAgfSk7CisgICAgbnVtYmVyRm9ybWF0cy5BZGQoCisgICAgICAgICJtL2QveXkgaDptbSIsCisgICAgICAgIG5ldyhuYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7CisgICAgICAgICAgTnVtRm10SWQgPSAyMiwKKyAgICAgICAgICBGb3JtYXQgPSAibS9kL3l5IGg6bW0iLAorICAgICAgICB9KTsKKyAgICBudW1iZXJGb3JtYXRzLkFkZCgKKyAgICAgICAgIiMsIyMwIDsoIywjIzApIiwKKyAgICAgICAgbmV3KG5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsKKyAgICAgICAgICBOdW1GbXRJZCA9IDM3LAorICAgICAgICAgIEZvcm1hdCA9ICIjLCMjMCA7KCMsIyMwKSIsCisgICAgICAgIH0pOworICAgIG51bWJlckZvcm1hdHMuQWRkKAorICAgICAgICAiIywjIzAgO1tSZWRdKCMsIyMwKSIsCisgICAgICAgIG5ldyhuYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7CisgICAgICAgICAgTnVtRm10SWQgPSAzOCwKKyAgICAgICAgICBGb3JtYXQgPSAiIywjIzAgO1tSZWRdKCMsIyMwKSIsCisgICAgICAgIH0pOworICAgIG51bWJlckZvcm1hdHMuQWRkKAorICAgICAgICAiIywjIzAuMDA7KCMsIyMwLjAwKSIsCisgICAgICAgIG5ldyhuYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7CisgICAgICAgICAgTnVtRm10SWQgPSAzOSwKKyAgICAgICAgICBGb3JtYXQgPSAiIywjIzAuMDA7KCMsIyMwLjAwKSIsCisgICAgICAgIH0pOworICAgIG51bWJlckZvcm1hdHMuQWRkKAorICAgICAgICAiIywjIzAuMDA7W1JlZF0oIywjIzAuMDApIiwKKyAgICAgICAgbmV3KG5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsKKyAgICAgICAgICBOdW1GbXRJZCA9IDQwLAorICAgICAgICAgIEZvcm1hdCA9ICIjLCMjMC4wMDtbUmVkXSgjLCMpIiwKKyAgICAgICAgfSk7CisgICAgbnVtYmVyRm9ybWF0cy5BZGQoCisgICAgICAgICJtbTpzcyIsCisgICAgICAgIG5ldyhuYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7CisgICAgICAgICAgTnVtRm10SWQgPSA0NSwKKyAgICAgICAgICBGb3JtYXQgPSAibW06c3MiLAorICAgICAgICB9KTsKKyAgICBudW1iZXJGb3JtYXRzLkFkZCgKKyAgICAgICAgIltoXTptbTpzcyIsCisgICAgICAgIG5ldyhuYW1lU3BhY2VNYW5hZ2VyLCB0cnVlKSB7CisgICAgICAgICAgTnVtRm10SWQgPSA0NiwKKyAgICAgICAgICBGb3JtYXQgPSAiW2hdOm1tOnNzIiwKKyAgICAgICAgfSk7CisgICAgbnVtYmVyRm9ybWF0cy5BZGQoCisgICAgICAgICJtbXNzLjAiLAorICAgICAgICBuZXcobmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeworICAgICAgICAgIE51bUZtdElkID0gNDcsCisgICAgICAgICAgRm9ybWF0ID0gIm1tc3MuMCIsCisgICAgICAgIH0pOworICAgIG51bWJlckZvcm1hdHMuQWRkKAorICAgICAgICAiIyMwLjAiLAorICAgICAgICBuZXcobmFtZVNwYWNlTWFuYWdlciwgdHJ1ZSkgeworICAgICAgICAgIE51bUZtdElkID0gNDgsCisgICAgICAgICAgRm9ybWF0ID0gIiMjMC4wIiwKKyAgICAgICAgfSk7CisgICAgbnVtYmVyRm9ybWF0cy5BZGQoCisgICAgICAgICJAIiwKKyAgICAgICAgbmV3KG5hbWVTcGFjZU1hbmFnZXIsIHRydWUpIHsKKyAgICAgICAgICBOdW1GbXRJZCA9IDQ5LAorICAgICAgICAgIEZvcm1hdCA9ICJAIiwKKyAgICAgICAgfSk7CisKKyAgICBudW1iZXJGb3JtYXRzLk5leHRJZCA9IDE2NDsgLy9TdGFydCBmb3IgY3VzdG9tIGZvcm1hdHMuCisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBYbWxOb2RlIENyZWF0ZVhtbE5vZGUoWG1sTm9kZSB0b3BOb2RlKSB7CisgICAgVG9wTm9kZSA9IHRvcE5vZGU7CisgICAgU2V0WG1sTm9kZVN0cmluZygiQG51bUZtdElkIiwgTnVtRm10SWQuVG9TdHJpbmcoKSk7CisgICAgU2V0WG1sTm9kZVN0cmluZygiQGZvcm1hdENvZGUiLCBGb3JtYXQpOworICAgIHJldHVybiBUb3BOb2RlOworICB9CisKKyAgaW50ZXJuYWwgZW51bSBlRm9ybWF0VHlwZSB7CisgICAgVW5rbm93biA9IDAsCisgICAgTnVtYmVyID0gMSwKKyAgICBEYXRlVGltZSA9IDIsCisgIH0KKworICBwcml2YXRlIEV4Y2VsRm9ybWF0VHJhbnNsYXRvciBfdHJhbnNsYXRvcjsKKworICBpbnRlcm5hbCBFeGNlbEZvcm1hdFRyYW5zbGF0b3IgRm9ybWF0VHJhbnNsYXRvciB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfdHJhbnNsYXRvciA9PSBudWxsKSB7CisgICAgICAgIF90cmFuc2xhdG9yID0gbmV3KEZvcm1hdCwgTnVtRm10SWQpOworICAgICAgfQorICAgICAgcmV0dXJuIF90cmFuc2xhdG9yOworICAgIH0KKyAgfQorCisgIGludGVybmFsIGNsYXNzIEV4Y2VsRm9ybWF0VHJhbnNsYXRvciB7CisgICAgaW50ZXJuYWwgRXhjZWxGb3JtYXRUcmFuc2xhdG9yKHN0cmluZyBmb3JtYXQsIGludCBudW1GbXRJZCkgeworICAgICAgaWYgKG51bUZtdElkID09IDE0KSB7CisgICAgICAgIE5ldEZvcm1hdCA9IE5ldEZvcm1hdEZvcldpZHRoID0gImQiOworICAgICAgICBOZXRUZXh0Rm9ybWF0ID0gTmV0VGV4dEZvcm1hdEZvcldpZHRoID0gIiI7CisgICAgICAgIERhdGFUeXBlID0gZUZvcm1hdFR5cGUuRGF0ZVRpbWU7CisgICAgICB9IGVsc2UgaWYgKGZvcm1hdC5FcXVhbHMoImdlbmVyYWwiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkgeworICAgICAgICBOZXRGb3JtYXQgPSBOZXRGb3JtYXRGb3JXaWR0aCA9ICIwLiMjIyMjIjsKKyAgICAgICAgTmV0VGV4dEZvcm1hdCA9IE5ldFRleHRGb3JtYXRGb3JXaWR0aCA9ICIiOworICAgICAgICBEYXRhVHlwZSA9IGVGb3JtYXRUeXBlLk51bWJlcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFRvTmV0Rm9ybWF0KGZvcm1hdCwgZmFsc2UpOworICAgICAgICBUb05ldEZvcm1hdChmb3JtYXQsIHRydWUpOworICAgICAgfQorICAgIH0KKworICAgIGludGVybmFsIHN0cmluZyBOZXRUZXh0Rm9ybWF0IHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgaW50ZXJuYWwgc3RyaW5nIE5ldEZvcm1hdCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgIHByaXZhdGUgQ3VsdHVyZUluZm8gX2NpOworCisgICAgaW50ZXJuYWwgQ3VsdHVyZUluZm8gQ3VsdHVyZSB7CisgICAgICBnZXQgeworICAgICAgICBpZiAoX2NpID09IG51bGwpIHsKKyAgICAgICAgICByZXR1cm4gQ3VsdHVyZUluZm8uQ3VycmVudEN1bHR1cmU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9jaTsKKyAgICAgIH0KKyAgICAgIHByaXZhdGUgc2V0ID0+IF9jaSA9IHZhbHVlOworICAgIH0KKworICAgIGludGVybmFsIGVGb3JtYXRUeXBlIERhdGFUeXBlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgICAgaW50ZXJuYWwgc3RyaW5nIE5ldFRleHRGb3JtYXRGb3JXaWR0aCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgIGludGVybmFsIHN0cmluZyBOZXRGb3JtYXRGb3JXaWR0aCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAgIC8vaW50ZXJuYWwgc3RyaW5nIEZyYWN0aW9uRm9ybWF0SW50ZWdlciB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKyAgICBpbnRlcm5hbCBzdHJpbmcgRnJhY3Rpb25Gb3JtYXQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgICAvL2ludGVybmFsIHN0cmluZyBGcmFjdGlvbkZvcm1hdDIgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgICBwcml2YXRlIHZvaWQgVG9OZXRGb3JtYXQoc3RyaW5nIGV4Y2VsRm9ybWF0LCBib29sIGZvckNvbFdpZHRoKSB7CisgICAgICBEYXRhVHlwZSA9IGVGb3JtYXRUeXBlLlVua25vd247CisgICAgICBpbnQgc2VjQ291bnQgPSAwOworICAgICAgYm9vbCBpc1RleHQgPSBmYWxzZTsKKyAgICAgIGJvb2wgaXNCcmFja2V0ID0gZmFsc2U7CisgICAgICBzdHJpbmcgYnJhY2tldFRleHQgPSAiIjsKKyAgICAgIGJvb2wgcHJldkJzbHNoID0gZmFsc2U7CisgICAgICBib29sIHVzZU1pbnV0ZSA9IGZhbHNlOworICAgICAgYm9vbCBwcmV2VW5kZXJTY29yZSA9IGZhbHNlOworICAgICAgYm9vbCBpZ25vcmVOZXh0ID0gZmFsc2U7CisgICAgICBpbnQgZnJhY3Rpb25Qb3MgPSAtMTsKKyAgICAgIHN0cmluZyBzcGVjaWFsRGF0ZUZvcm1hdCA9ICIiOworICAgICAgYm9vbCBjb250YWluc0FtUG0gPSBleGNlbEZvcm1hdC5Db250YWlucygiQU0vUE0iKTsKKyAgICAgIExpc3Q8aW50PiBsc3REZWMgPSBuZXcgTGlzdDxpbnQ+KCk7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgIEN1bHR1cmUgPSBudWxsOworICAgICAgdmFyIGZvcm1hdCA9ICIiOworICAgICAgdmFyIHRleHQgPSAiIjsKKyAgICAgIGNoYXIgY2xjOworCisgICAgICBpZiAoY29udGFpbnNBbVBtKSB7CisgICAgICAgIGV4Y2VsRm9ybWF0ID0gUmVnZXguUmVwbGFjZShleGNlbEZvcm1hdCwgIkFNL1BNIiwgIiIpOworICAgICAgICBEYXRhVHlwZSA9IGVGb3JtYXRUeXBlLkRhdGVUaW1lOworICAgICAgfQorCisgICAgICBmb3IgKGludCBwb3MgPSAwOyBwb3MgPCBleGNlbEZvcm1hdC5MZW5ndGg7IHBvcysrKSB7CisgICAgICAgIGNoYXIgYyA9IGV4Y2VsRm9ybWF0W3Bvc107CisgICAgICAgIGlmIChjID09ICciJykgeworICAgICAgICAgIGlzVGV4dCA9ICFpc1RleHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGlnbm9yZU5leHQpIHsKKyAgICAgICAgICAgIGlnbm9yZU5leHQgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaXNUZXh0ICYmICFpc0JyYWNrZXQpIHsKKyAgICAgICAgICAgIHNiLkFwcGVuZChjKTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGlzQnJhY2tldCkgeworICAgICAgICAgICAgaWYgKGMgPT0gJ10nKSB7CisgICAgICAgICAgICAgIGlzQnJhY2tldCA9IGZhbHNlOworICAgICAgICAgICAgICBpZiAoYnJhY2tldFRleHRbMF0KKyAgICAgICAgICAgICAgICAgID09ICckJykgLy9Mb2NhbCBJbmZvCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpbmdbXSBsaSA9IFJlZ2V4LlNwbGl0KGJyYWNrZXRUZXh0LCAiLSIpOworICAgICAgICAgICAgICAgIGlmIChsaVswXS5MZW5ndGggPiAxKSB7CisgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoIlwiIiArIGxpWzBdLlN1YnN0cmluZygxLCBsaVswXS5MZW5ndGggLSAxKSArICJcIiIpOyAvL0N1cnJlbmN5IHN5bWJvbAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobGkuTGVuZ3RoID4gMSkgeworICAgICAgICAgICAgICAgICAgaWYgKGxpWzFdLkVxdWFscygiZjgwMCIsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxEYXRlRm9ybWF0ID0gIkQiOworICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaVsxXS5FcXVhbHMoImY0MDAiLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkgeworICAgICAgICAgICAgICAgICAgICBzcGVjaWFsRGF0ZUZvcm1hdCA9ICJUIjsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBudW0gPSBpbnQuUGFyc2UobGlbMV0sIE51bWJlclN0eWxlcy5IZXhOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgIEN1bHR1cmUgPSBDdWx0dXJlSW5mby5HZXRDdWx0dXJlSW5mbyhudW0gJiAweEZGRkYpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIHsKKyAgICAgICAgICAgICAgICAgICAgICBDdWx0dXJlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChicmFja2V0VGV4dFswXSA9PSAndCcpIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoImhoIik7IC8vVE9ETzpUaGlzIHdpbGwgbm90IGJlIGNvcnJlY3QgZm9yIGRhdGVzIG92ZXIgMjRILgorICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJyYWNrZXRUZXh0WzBdID09ICdoJykgeworICAgICAgICAgICAgICAgIHNwZWNpYWxEYXRlRm9ybWF0ID0gImhoIjsgLy9UT0RPOlRoaXMgd2lsbCBub3QgYmUgY29ycmVjdCBmb3IgZGF0ZXMgb3ZlciAyNEguCisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGJyYWNrZXRUZXh0ICs9IGM7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChwcmV2VW5kZXJTY29yZSkgeworICAgICAgICAgICAgaWYgKGZvckNvbFdpZHRoKSB7CisgICAgICAgICAgICAgIHNiLkFwcGVuZEZvcm1hdCgiXCJ7MH1cIiIsIGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldlVuZGVyU2NvcmUgPSBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGMKKyAgICAgICAgICAgICAgICA9PSAnOycpIC8vV2UgdXNlIGZpcnN0IHBhcnQgKGZvciBwb3NpdGl2ZSBvbmx5IGF0IHRoaXMgc3RhZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHNlY0NvdW50Kys7CisgICAgICAgICAgICAgIGlmIChEYXRhVHlwZSA9PSBlRm9ybWF0VHlwZS5EYXRlVGltZSB8fCBzZWNDb3VudCA9PSAzKSB7CisgICAgICAgICAgICAgICAgLy9BZGQgcW91dGVzCisgICAgICAgICAgICAgICAgaWYgKERhdGFUeXBlID09IGVGb3JtYXRUeXBlLkRhdGVUaW1lKSB7CisgICAgICAgICAgICAgICAgICBTZXREZWNpbWFsKGxzdERlYywgc2IpOyAvL1JlbW92ZT8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbHN0RGVjID0gbmV3KCk7CisgICAgICAgICAgICAgICAgZm9ybWF0ID0gc2IuVG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBzYiA9IG5ldygpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNiLkFwcGVuZChjKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY2xjID0gYy5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSlbMF07IC8vTG93ZXJjYXNlIGNoYXJhY3RlcgorICAgICAgICAgICAgICAvL1NldCB0aGUgZGF0ZXR5cGUKKyAgICAgICAgICAgICAgaWYgKERhdGFUeXBlID09IGVGb3JtYXRUeXBlLlVua25vd24pIHsKKyAgICAgICAgICAgICAgICBpZiAoYyA9PSAnMCcgfHwgYyA9PSAnIycgfHwgYyA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICAgIERhdGFUeXBlID0gZUZvcm1hdFR5cGUuTnVtYmVyOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2xjID09ICd5JworICAgICAgICAgICAgICAgICAgICB8fCBjbGMgPT0gJ20nCisgICAgICAgICAgICAgICAgICAgIHx8IGNsYyA9PSAnZCcKKyAgICAgICAgICAgICAgICAgICAgfHwgY2xjID09ICdoJworICAgICAgICAgICAgICAgICAgICB8fCBjbGMgPT0gJ20nCisgICAgICAgICAgICAgICAgICAgIHx8IGNsYyA9PSAncycpIHsKKyAgICAgICAgICAgICAgICAgIERhdGFUeXBlID0gZUZvcm1hdFR5cGUuRGF0ZVRpbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKHByZXZCc2xzaCkgeworICAgICAgICAgICAgICAgIGlmIChjID09ICcuJyB8fCBjID09ICcsJykgeworICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCdcXCcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgcHJldkJzbHNoID0gZmFsc2U7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICBicmFja2V0VGV4dCA9ICIiOworICAgICAgICAgICAgICAgIGlzQnJhY2tldCA9IHRydWU7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXFwnKSB7CisgICAgICAgICAgICAgICAgcHJldkJzbHNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICcwJworICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnIycKKyAgICAgICAgICAgICAgICAgIHx8IGMgPT0gJy4nCisgICAgICAgICAgICAgICAgICB8fCBjID09ICcsJworICAgICAgICAgICAgICAgICAgfHwgYyA9PSAnJScKKyAgICAgICAgICAgICAgICAgIHx8IGNsYyA9PSAnZCcKKyAgICAgICAgICAgICAgICAgIHx8IGNsYyA9PSAncycpIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoYyk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgICBsc3REZWMuQWRkKHNiLkxlbmd0aCAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbGMgPT0gJ2gnKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5zQW1QbSkgeworICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCdoJyk7CisgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIHNiLkFwcGVuZCgnSCcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1c2VNaW51dGUgPSB0cnVlOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNsYyA9PSAnbScpIHsKKyAgICAgICAgICAgICAgICBpZiAodXNlTWludXRlKSB7CisgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoJ20nKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCdNJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMKKyAgICAgICAgICAgICAgICAgID09ICdfJykgLy9Ta2lwIG5leHQgYnV0IHVzZSBmb3IgYWxpZ25tZW50CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmV2VW5kZXJTY29yZSA9IHRydWU7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnPycpIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoJyAnKTsKKyAgICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICcvJykgeworICAgICAgICAgICAgICAgIGlmIChEYXRhVHlwZSA9PSBlRm9ybWF0VHlwZS5OdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgIGZyYWN0aW9uUG9zID0gc2IuTGVuZ3RoOworICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0UG9zID0gcG9zIC0gMTsKKyAgICAgICAgICAgICAgICAgIHdoaWxlIChzdGFydFBvcyA+PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChleGNlbEZvcm1hdFtzdGFydFBvc10gPT0gJz8nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXhjZWxGb3JtYXRbc3RhcnRQb3NdID09ICcjJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV4Y2VsRm9ybWF0W3N0YXJ0UG9zXSA9PSAnMCcpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zLS07CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIGlmIChzdGFydFBvcworICAgICAgICAgICAgICAgICAgICAgID4gMCkgLy9SZW1vdmVQYXJ0CisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNiLlJlbW92ZShzYi5MZW5ndGggLSAocG9zIC0gc3RhcnRQb3MgLSAxKSwgKHBvcyAtIHN0YXJ0UG9zIC0gMSkpOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBpbnQgZW5kUG9zID0gcG9zICsgMTsKKyAgICAgICAgICAgICAgICAgIHdoaWxlIChlbmRQb3MgPCBleGNlbEZvcm1hdC5MZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGV4Y2VsRm9ybWF0W2VuZFBvc10gPT0gJz8nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZXhjZWxGb3JtYXRbZW5kUG9zXSA9PSAnIycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoZXhjZWxGb3JtYXRbZW5kUG9zXSA+PSAnMCcgJiYgZXhjZWxGb3JtYXRbZW5kUG9zXSA8PSAnOScpKSkgeworICAgICAgICAgICAgICAgICAgICBlbmRQb3MrKzsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIHBvcyA9IGVuZFBvczsKKyAgICAgICAgICAgICAgICAgIGlmIChGcmFjdGlvbkZvcm1hdCAhPSAiIikgeworICAgICAgICAgICAgICAgICAgICBGcmFjdGlvbkZvcm1hdCA9IGV4Y2VsRm9ybWF0LlN1YnN0cmluZyhzdGFydFBvcyArIDEsIGVuZFBvcyAtIHN0YXJ0UG9zIC0gMSk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoJz8nKTsgLy9XaWxsIGJlIHJlcGxhY2VkIGxhdGVyIG9uIGJ5IHRoZSBmcmFjdGlvbgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICBzYi5BcHBlbmQoJy8nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICAvL3JlcGVhdCBjaGFyLS0+IGlnbm9yZQorICAgICAgICAgICAgICAgIGlnbm9yZU5leHQgPSB0cnVlOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ0AnKSB7CisgICAgICAgICAgICAgICAgc2IuQXBwZW5kKCJ7MH0iKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5BcHBlbmQoYyk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLy9BZGQgcW91dGVzCisgICAgICBpZiAoRGF0YVR5cGUgPT0gZUZvcm1hdFR5cGUuRGF0ZVRpbWUpIHsKKyAgICAgICAgU2V0RGVjaW1hbChsc3REZWMsIHNiKTsgLy9SZW1vdmU/CisgICAgICB9CisKKyAgICAgIC8vIEFNL1BNIGZvcm1hdAorICAgICAgaWYgKGNvbnRhaW5zQW1QbSkgeworICAgICAgICBmb3JtYXQgKz0gInR0IjsKKyAgICAgIH0KKworICAgICAgaWYgKGZvcm1hdCA9PSAiIikgeworICAgICAgICBmb3JtYXQgPSBzYi5Ub1N0cmluZygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dCA9IHNiLlRvU3RyaW5nKCk7CisgICAgICB9CisgICAgICBpZiAoc3BlY2lhbERhdGVGb3JtYXQgIT0gIiIpIHsKKyAgICAgICAgZm9ybWF0ID0gc3BlY2lhbERhdGVGb3JtYXQ7CisgICAgICB9CisKKyAgICAgIGlmIChmb3JDb2xXaWR0aCkgeworICAgICAgICBOZXRGb3JtYXRGb3JXaWR0aCA9IGZvcm1hdDsKKyAgICAgICAgTmV0VGV4dEZvcm1hdEZvcldpZHRoID0gdGV4dDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE5ldEZvcm1hdCA9IGZvcm1hdDsKKyAgICAgICAgTmV0VGV4dEZvcm1hdCA9IHRleHQ7CisgICAgICB9CisgICAgICBpZiAoQ3VsdHVyZSA9PSBudWxsKSB7CisgICAgICAgIEN1bHR1cmUgPSBDdWx0dXJlSW5mby5DdXJyZW50Q3VsdHVyZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIFNldERlY2ltYWwoTGlzdDxpbnQ+IGxzdERlYywgU3RyaW5nQnVpbGRlciBzYikgeworICAgICAgaWYgKGxzdERlYy5Db3VudCA+IDEpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IGxzdERlYy5Db3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgc2IuSW5zZXJ0KGxzdERlY1tpXSArIDEsICdcJycpOworICAgICAgICAgIHNiLkluc2VydChsc3REZWNbaV0sICdcJycpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaW50ZXJuYWwgc3RyaW5nIEZvcm1hdEZyYWN0aW9uKGRvdWJsZSBkKSB7CisgICAgICBpbnQgbnVtZXJhdG9yLAorICAgICAgICAgIGRlbm9tZXJhdG9yOworCisgICAgICBpbnQgaW50UGFydCA9IChpbnQpZDsKKworICAgICAgc3RyaW5nW10gZm10ID0gRnJhY3Rpb25Gb3JtYXQuU3BsaXQoJy8nKTsKKworICAgICAgaW50IGZpeGVkRGVub21pbmF0b3I7CisgICAgICBpZiAoIWludC5UcnlQYXJzZShmbXRbMV0sIG91dCBmaXhlZERlbm9taW5hdG9yKSkgeworICAgICAgICBmaXhlZERlbm9taW5hdG9yID0gMDsKKyAgICAgIH0KKworICAgICAgaWYgKGQgPT0gMCB8fCBkb3VibGUuSXNOYU4oZCkpIHsKKyAgICAgICAgaWYgKGZtdFswXS5UcmltKCkgPT0gIiIgJiYgZm10WzFdLlRyaW0oKSA9PSAiIikgeworICAgICAgICAgIHJldHVybiBuZXcoJyAnLCBGcmFjdGlvbkZvcm1hdC5MZW5ndGgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwLlRvU3RyaW5nKGZtdFswXSkgKyAiLyIgKyAxLlRvU3RyaW5nKGZtdFswXSk7CisgICAgICB9CisKKyAgICAgIGludCBtYXhEaWdpdHMgPSBmbXRbMV0uTGVuZ3RoOworICAgICAgc3RyaW5nIHNpZ24gPSBkIDwgMCA/ICItIiA6ICIiOworICAgICAgaWYgKGZpeGVkRGVub21pbmF0b3IgPT0gMCkgeworICAgICAgICBMaXN0PGRvdWJsZT4gbnVtZXJhdG9ycyA9IG5ldyBMaXN0PGRvdWJsZT4geyAxLCAwIH07CisgICAgICAgIExpc3Q8ZG91YmxlPiBkZW5vbWluYXRvcnMgPSBuZXcgTGlzdDxkb3VibGU+IHsgMCwgMSB9OworCisgICAgICAgIGlmIChtYXhEaWdpdHMgPCAxICYmIG1heERpZ2l0cyA+IDEyKSB7CisgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiTnVtYmVyIG9mIGRpZ2l0cyBvdXQgb2YgcmFuZ2UgKDEtMTIpIikpOworICAgICAgICB9CisKKyAgICAgICAgaW50IG1heE51bSA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4RGlnaXRzOyBpKyspIHsKKyAgICAgICAgICBtYXhOdW0gKz0gOSAqIChpbnQpKE1hdGguUG93KDEwLCBpKSk7CisgICAgICAgIH0KKworICAgICAgICBkb3VibGUgZGl2UmVzID0gMSAvIChNYXRoLkFicyhkKSAtIGludFBhcnQpOworICAgICAgICBkb3VibGUgcmVzdWx0LAorICAgICAgICAgICAgcHJldlJlc3VsdCA9IGRvdWJsZS5OYU47CisgICAgICAgIGludCBsaXN0UG9zID0gMiwKKyAgICAgICAgICAgIGluZGV4ID0gMTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICBpbmRleCsrOworICAgICAgICAgIGRvdWJsZSBpbnREaXZSZXMgPSBNYXRoLkZsb29yKGRpdlJlcyk7CisgICAgICAgICAgbnVtZXJhdG9ycy5BZGQoKGludERpdlJlcyAqIG51bWVyYXRvcnNbaW5kZXggLSAxXSArIG51bWVyYXRvcnNbaW5kZXggLSAyXSkpOworICAgICAgICAgIGlmIChudW1lcmF0b3JzW2luZGV4XSA+IG1heE51bSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorCisgICAgICAgICAgZGVub21pbmF0b3JzLkFkZCgoaW50RGl2UmVzICogZGVub21pbmF0b3JzW2luZGV4IC0gMV0gKyBkZW5vbWluYXRvcnNbaW5kZXggLSAyXSkpOworCisgICAgICAgICAgcmVzdWx0ID0gbnVtZXJhdG9yc1tpbmRleF0gLyBkZW5vbWluYXRvcnNbaW5kZXhdOworICAgICAgICAgIGlmIChkZW5vbWluYXRvcnNbaW5kZXhdID4gbWF4TnVtKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgbGlzdFBvcyA9IGluZGV4OworCisgICAgICAgICAgaWYgKHJlc3VsdCA9PSBwcmV2UmVzdWx0KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocmVzdWx0ID09IGQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIHByZXZSZXN1bHQgPSByZXN1bHQ7CisKKyAgICAgICAgICBkaXZSZXMgPSAxIC8gKGRpdlJlcyAtIGludERpdlJlcyk7IC8vUmVzdAorICAgICAgICB9CisKKyAgICAgICAgbnVtZXJhdG9yID0gKGludCludW1lcmF0b3JzW2xpc3RQb3NdOworICAgICAgICBkZW5vbWVyYXRvciA9IChpbnQpZGVub21pbmF0b3JzW2xpc3RQb3NdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtZXJhdG9yID0gKGludClNYXRoLlJvdW5kKChkIC0gaW50UGFydCkgLyAoMUQgLyBmaXhlZERlbm9taW5hdG9yKSwgMCk7CisgICAgICAgIGRlbm9tZXJhdG9yID0gZml4ZWREZW5vbWluYXRvcjsKKyAgICAgIH0KKyAgICAgIGlmIChudW1lcmF0b3IgPT0gZGVub21lcmF0b3IgfHwgbnVtZXJhdG9yID09IDApIHsKKyAgICAgICAgaWYgKG51bWVyYXRvciA9PSBkZW5vbWVyYXRvcikgeworICAgICAgICAgIGludFBhcnQrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2lnbiArIGludFBhcnQuVG9TdHJpbmcoTmV0Rm9ybWF0KS5SZXBsYWNlKCI/IiwgbmV3KCcgJywgRnJhY3Rpb25Gb3JtYXQuTGVuZ3RoKSk7CisgICAgICB9CisgICAgICBpZiAoaW50UGFydCA9PSAwKSB7CisgICAgICAgIHJldHVybiBzaWduICsgRm10SW50KG51bWVyYXRvciwgZm10WzBdKSArICIvIiArIEZtdEludChkZW5vbWVyYXRvciwgZm10WzFdKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBzaWduCisgICAgICAgICAgKyBpbnRQYXJ0CisgICAgICAgICAgICAgIC5Ub1N0cmluZyhOZXRGb3JtYXQpCisgICAgICAgICAgICAgIC5SZXBsYWNlKCI/IiwgRm10SW50KG51bWVyYXRvciwgZm10WzBdKSArICIvIiArIEZtdEludChkZW5vbWVyYXRvciwgZm10WzFdKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdHJpbmcgRm10SW50KGRvdWJsZSB2YWx1ZSwgc3RyaW5nIGZvcm1hdCkgeworICAgICAgc3RyaW5nIHYgPSB2YWx1ZS5Ub1N0cmluZygiIyIpOworICAgICAgc3RyaW5nIHBhZCA9ICIiOworICAgICAgaWYgKHYuTGVuZ3RoIDwgZm9ybWF0Lkxlbmd0aCkgeworICAgICAgICBmb3IgKGludCBpID0gZm9ybWF0Lkxlbmd0aCAtIHYuTGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICBpZiAoZm9ybWF0W2ldID09ICc/JykgeworICAgICAgICAgICAgcGFkICs9ICIgIjsKKyAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpXSA9PSAnICcpIHsKKyAgICAgICAgICAgIHBhZCArPSAiMCI7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcGFkICsgdjsKKyAgICB9CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxYZnNYbWwuY3MgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL0V4Y2VsWGZzWG1sLmNzCmluZGV4IGJlZTNlNDAuLjNiNmY4MjMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvRXhjZWxYZnNYbWwuY3MKKysrIGIvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9FeGNlbFhmc1htbC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsODQ4ICsxMyw3MzYgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBTeXN0ZW0uRHJhd2luZzsKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzcwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gWG1sIGFjY2VzcyBjbGFzcyB4ZnMgcmVjb3Jkcy4gVGhpcyBpcyB0aGUgdG9wIGxldmVsIHN0eWxlIG9iamVjdC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxYZnMgOiBTdHlsZVhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgRXhjZWxTdHlsZXMgX3N0eWxlczsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxYZnMoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLCBFeGNlbFN0eWxlcyBzdHlsZXMpIDogYmFzZShuYW1lU3BhY2VNYW5hZ2VyKQotICAgICAgICB7Ci0gICAgICAgICAgICBfc3R5bGVzID0gc3R5bGVzOwotICAgICAgICAgICAgaXNCdWlsZEluID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxYZnMoWG1sTmFtZXNwYWNlTWFuYWdlciBuc20sIFhtbE5vZGUgdG9wTm9kZSwgRXhjZWxTdHlsZXMgc3R5bGVzKSA6Ci0gICAgICAgICAgICBiYXNlKG5zbSwgdG9wTm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgX3N0eWxlcyA9IHN0eWxlczsKLSAgICAgICAgICAgIF94ZklEID0gR2V0WG1sTm9kZUludCgiQHhmSWQiKTsKLSAgICAgICAgICAgIGlmIChfeGZJRCA9PSAwKSBpc0J1aWxkSW4gPSB0cnVlOyAvL05vcm1hbCB0YWdnZW4KLSAgICAgICAgICAgIF9udW1GbXRJZCA9IEdldFhtbE5vZGVJbnQoIkBudW1GbXRJZCIpOwotICAgICAgICAgICAgX2ZvbnRJZCA9IEdldFhtbE5vZGVJbnQoIkBmb250SWQiKTsKLSAgICAgICAgICAgIF9maWxsSWQgPSBHZXRYbWxOb2RlSW50KCJAZmlsbElkIik7Ci0gICAgICAgICAgICBfYm9yZGVySWQgPSBHZXRYbWxOb2RlSW50KCJAYm9yZGVySWQiKTsKLSAgICAgICAgICAgIF9yZWFkaW5nT3JkZXIgPSBHZXRSZWFkaW5nT3JkZXIoR2V0WG1sTm9kZVN0cmluZyhyZWFkaW5nT3JkZXJQYXRoKSk7Ci0gICAgICAgICAgICBfaW5kZW50ID0gR2V0WG1sTm9kZUludChpbmRlbnRQYXRoKTsKLSAgICAgICAgICAgIF9zaHJpbmtUb0ZpdCA9IEdldFhtbE5vZGVTdHJpbmcoc2hyaW5rVG9GaXRQYXRoKSA9PSAiMSIgPyB0cnVlIDogZmFsc2U7IAotICAgICAgICAgICAgX3ZlcnRpY2FsQWxpZ25tZW50ID0gR2V0VmVydGljYWxBbGlnbihHZXRYbWxOb2RlU3RyaW5nKHZlcnRpY2FsQWxpZ25QYXRoKSk7Ci0gICAgICAgICAgICBfaG9yaXpvbnRhbEFsaWdubWVudCA9IEdldEhvcml6b250YWxBbGlnbihHZXRYbWxOb2RlU3RyaW5nKGhvcml6b250YWxBbGlnblBhdGgpKTsKLSAgICAgICAgICAgIF93cmFwVGV4dCA9IEdldFhtbE5vZGVCb29sKHdyYXBUZXh0UGF0aCk7Ci0gICAgICAgICAgICBfdGV4dFJvdGF0aW9uID0gR2V0WG1sTm9kZUludCh0ZXh0Um90YXRpb25QYXRoKTsKLSAgICAgICAgICAgIF9oaWRkZW4gPSBHZXRYbWxOb2RlQm9vbChoaWRkZW5QYXRoKTsKLSAgICAgICAgICAgIF9sb2NrZWQgPSBHZXRYbWxOb2RlQm9vbChsb2NrZWRQYXRoLHRydWUpOwotICAgICAgICB9Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5YbWw7CiAKLSAgICAgICAgcHJpdmF0ZSBFeGNlbFJlYWRpbmdPcmRlciBHZXRSZWFkaW5nT3JkZXIoc3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2godmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAiMSI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbFJlYWRpbmdPcmRlci5MZWZ0VG9SaWdodDsKLSAgICAgICAgICAgICAgICBjYXNlICIyIjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEV4Y2VsUmVhZGluZ09yZGVyLlJpZ2h0VG9MZWZ0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFeGNlbFJlYWRpbmdPcmRlci5Db250ZXh0RGVwZW5kZW50OwotICAgICAgICAgICAgfQotICAgICAgICB9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZS5YbWxBY2Nlc3M7CiAKLSAgICAgICAgcHJpdmF0ZSBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQgR2V0SG9yaXpvbnRhbEFsaWduKHN0cmluZyBhbGlnbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFsaWduID09ICIiKSByZXR1cm4gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkdlbmVyYWw7Ci0gICAgICAgICAgICBhbGlnbiA9IGFsaWduLlN1YnN0cmluZygwLCAxKS5Ub1VwcGVyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgYWxpZ24uU3Vic3RyaW5nKDEsIGFsaWduLkxlbmd0aCAtIDEpOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChFeGNlbEhvcml6b250YWxBbGlnbm1lbnQpRW51bS5QYXJzZSh0eXBlb2YoRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50KSwgYWxpZ24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2gKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkdlbmVyYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBYbWwgYWNjZXNzIGNsYXNzIHhmcyByZWNvcmRzLiBUaGlzIGlzIHRoZSB0b3AgbGV2ZWwgc3R5bGUgb2JqZWN0LgorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBzZWFsZWQgY2xhc3MgRXhjZWxYZnMgOiBTdHlsZVhtbEhlbHBlciB7CisgIHByaXZhdGUgRXhjZWxTdHlsZXMgX3N0eWxlczsKIAotICAgICAgICBwcml2YXRlIEV4Y2VsVmVydGljYWxBbGlnbm1lbnQgR2V0VmVydGljYWxBbGlnbihzdHJpbmcgYWxpZ24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhbGlnbiA9PSAiIikgcmV0dXJuIEV4Y2VsVmVydGljYWxBbGlnbm1lbnQuQm90dG9tOwotICAgICAgICAgICAgYWxpZ24gPSBhbGlnbi5TdWJzdHJpbmcoMCwgMSkuVG9VcHBlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArIGFsaWduLlN1YnN0cmluZygxLCBhbGlnbi5MZW5ndGggLSAxKTsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoRXhjZWxWZXJ0aWNhbEFsaWdubWVudClFbnVtLlBhcnNlKHR5cGVvZihFeGNlbFZlcnRpY2FsQWxpZ25tZW50KSwgYWxpZ24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2gKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRXhjZWxWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b207Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBYZl9DaGFuZ2VkRXZlbnQob2JqZWN0IHNlbmRlciwgRXZlbnRBcmdzIGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vaWYgKF9jZWxsICE9IG51bGwpCi0gICAgICAgICAgICAvL3sKLSAgICAgICAgICAgIC8vICAgIGlmICghU3R5bGVzLkNoYW5nZWRDZWxscy5Db250YWluc0tleShfY2VsbC5JZCkpCi0gICAgICAgICAgICAvLyAgICB7Ci0gICAgICAgICAgICAvLyAgICAgICAgLy9fY2VsbC5TdHlsZSA9ICIiOwotICAgICAgICAgICAgLy8gICAgICAgIF9jZWxsLlNldE5ld1N0eWxlSUQoaW50Lk1pblZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgLy8gICAgICAgIFN0eWxlcy5DaGFuZ2VkQ2VsbHMuQWRkKF9jZWxsLklkLCBfY2VsbCk7Ci0gICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAvL30KLSAgICAgICAgfQotICAgICAgICBpbnQgX3hmSUQ7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFN0eWxlIGluZGV4Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgWGZJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3hmSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfeGZJRCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNyZWdpb24gSW50ZXJuYWwgUHJvcGVydGllcwotICAgICAgICBpbnQgX251bUZtdElkOwotICAgICAgICBpbnRlcm5hbCBpbnQgTnVtYmVyRm9ybWF0SWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9udW1GbXRJZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9udW1GbXRJZCA9IHZhbHVlOwotICAgICAgICAgICAgICAgIEFwcGx5TnVtYmVyRm9ybWF0ID0gKHZhbHVlPjApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBfZm9udElkOwotICAgICAgICBpbnRlcm5hbCBpbnQgRm9udElkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfZm9udElkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2ZvbnRJZCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBfZmlsbElkOwotICAgICAgICBpbnRlcm5hbCBpbnQgRmlsbElkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfZmlsbElkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2ZpbGxJZCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBfYm9yZGVySWQ7Ci0gICAgICAgIGludGVybmFsIGludCBCb3JkZXJJZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2JvcmRlcklkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2JvcmRlcklkID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBib29sIGlzQnVpbGRJbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgYm9vbCBBcHBseU51bWJlckZvcm1hdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgYm9vbCBBcHBseUZvbnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgc2V0OwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGJvb2wgQXBwbHlGaWxsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBib29sIEFwcGx5Qm9yZGVyCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBib29sIEFwcGx5QWxpZ25tZW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBib29sIEFwcGx5UHJvdGVjdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAjcmVnaW9uIFB1YmxpYyBQcm9wZXJ0aWVzCi0gICAgICAgIHB1YmxpYyBFeGNlbFN0eWxlcyBTdHlsZXMgeyBnZXQ7IHByaXZhdGUgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE51bWJlcmZvcm1hdCBwcm9wZXJ0aWVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbE51bWJlckZvcm1hdFhtbCBOdW1iZXJmb3JtYXQgCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLk51bWJlckZvcm1hdHNbX251bUZtdElkIDwgMCA/IDAgOiBfbnVtRm10SWRdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvbnQgcHJvcGVydGllcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxGb250WG1sIEZvbnQgCi0gICAgICAgIHsgCi0gICAgICAgICAgIGdldAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICByZXR1cm4gX3N0eWxlcy5Gb250c1tfZm9udElkIDwgMCA/IDAgOiBfZm9udElkXTsKLSAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZpbGwgcHJvcGVydGllcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxGaWxsWG1sIEZpbGwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuRmlsbHNbX2ZpbGxJZCA8IDAgPyAwIDogX2ZpbGxJZF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBCb3JkZXIgc3R5bGUgcHJvcGVydGllcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxCb3JkZXJYbWwgQm9yZGVyCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnNbX2JvcmRlcklkIDwgMCA/IDAgOiBfYm9yZGVySWRdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBob3Jpem9udGFsQWxpZ25QYXRoID0gImQ6YWxpZ25tZW50L0Bob3Jpem9udGFsIjsKLSAgICAgICAgRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50IF9ob3Jpem9udGFsQWxpZ25tZW50ID0gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkdlbmVyYWw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEhvcml6b250YWwgYWxpZ25tZW50Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEhvcml6b250YWxBbGlnbm1lbnQgSG9yaXpvbnRhbEFsaWdubWVudAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2hvcml6b250YWxBbGlnbm1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfaG9yaXpvbnRhbEFsaWdubWVudCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyB2ZXJ0aWNhbEFsaWduUGF0aCA9ICJkOmFsaWdubWVudC9AdmVydGljYWwiOwotICAgICAgICBFeGNlbFZlcnRpY2FsQWxpZ25tZW50IF92ZXJ0aWNhbEFsaWdubWVudD1FeGNlbFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVmVydGljYWwgYWxpZ25tZW50Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFZlcnRpY2FsQWxpZ25tZW50IFZlcnRpY2FsQWxpZ25tZW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfdmVydGljYWxBbGlnbm1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfdmVydGljYWxBbGlnbm1lbnQgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgd3JhcFRleHRQYXRoID0gImQ6YWxpZ25tZW50L0B3cmFwVGV4dCI7Ci0gICAgICAgIGJvb2wgX3dyYXBUZXh0PWZhbHNlOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXcmFwZWQgdGV4dAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBXcmFwVGV4dAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3dyYXBUZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3dyYXBUZXh0ID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3RyaW5nIHRleHRSb3RhdGlvblBhdGggPSAiZDphbGlnbm1lbnQvQHRleHRSb3RhdGlvbiI7Ci0gICAgICAgIGludCBfdGV4dFJvdGF0aW9uID0gMDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGV4dCByb3RhdGlvbiBhbmdsZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IFRleHRSb3RhdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKF90ZXh0Um90YXRpb24gPT0gaW50Lk1pblZhbHVlID8gMCA6IF90ZXh0Um90YXRpb24pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3RleHRSb3RhdGlvbiA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBsb2NrZWRQYXRoID0gImQ6cHJvdGVjdGlvbi9AbG9ja2VkIjsKLSAgICAgICAgYm9vbCBfbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTG9ja2VkIHdoZW4gc2hlZXQgaXMgcHJvdGVjdGVkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIExvY2tlZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2xvY2tlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9sb2NrZWQgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgaGlkZGVuUGF0aCA9ICJkOnByb3RlY3Rpb24vQGhpZGRlbiI7Ci0gICAgICAgIGJvb2wgX2hpZGRlbiA9IGZhbHNlOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBIaWRlIGZvcm11bGFzIHdoZW4gc2hlZXQgaXMgcHJvdGVjdGVkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEhpZGRlbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2hpZGRlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9oaWRkZW4gPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgcmVhZGluZ09yZGVyUGF0aCA9ICJkOmFsaWdubWVudC9AcmVhZGluZ09yZGVyIjsKLSAgICAgICAgRXhjZWxSZWFkaW5nT3JkZXIgX3JlYWRpbmdPcmRlciA9IEV4Y2VsUmVhZGluZ09yZGVyLkNvbnRleHREZXBlbmRlbnQ7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWRpbmdvcmRlcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxSZWFkaW5nT3JkZXIgUmVhZGluZ09yZGVyCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfcmVhZGluZ09yZGVyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3JlYWRpbmdPcmRlciA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBzaHJpbmtUb0ZpdFBhdGggPSAiZDphbGlnbm1lbnQvQHNocmlua1RvRml0IjsKLSAgICAgICAgYm9vbCBfc2hyaW5rVG9GaXQgPSBmYWxzZTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2hyaW5rIHRvIGZpdAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaHJpbmtUb0ZpdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3Nocmlua1RvRml0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3Nocmlua1RvRml0ID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIGluZGVudFBhdGggPSAiZDphbGlnbm1lbnQvQGluZGVudCI7Ci0gICAgICAgIGludCBfaW5kZW50ID0gMDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5kZW50YXRpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBJbmRlbnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChfaW5kZW50ID09IGludC5NaW5WYWx1ZSA/IDAgOiBfaW5kZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9pbmRlbnQ9dmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICBpbnRlcm5hbCB2b2lkIFJlZ2lzdGVyRXZlbnQoRXhjZWxYZnMgeGYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIFJlZ2lzdGVyRXZlbnQoeGYsIHhmLlhmX0NoYW5nZWRFdmVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgc3RyaW5nIElkCi0gICAgICAgIHsKKyAgaW50ZXJuYWwgRXhjZWxYZnMoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLCBFeGNlbFN0eWxlcyBzdHlsZXMpCisgICAgICA6IGJhc2UobmFtZVNwYWNlTWFuYWdlcikgeworICAgIF9zdHlsZXMgPSBzdHlsZXM7CisgICAgaXNCdWlsZEluID0gZmFsc2U7CisgIH0KIAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFhmSWQgKyAifCIgKyBOdW1iZXJGb3JtYXRJZC5Ub1N0cmluZygpICsgInwiICsgRm9udElkLlRvU3RyaW5nKCkgKyAifCIgKyBGaWxsSWQuVG9TdHJpbmcoKSArICJ8IiArIEJvcmRlcklkLlRvU3RyaW5nKCkgKyBWZXJ0aWNhbEFsaWdubWVudC5Ub1N0cmluZygpICsgInwiICsgSG9yaXpvbnRhbEFsaWdubWVudC5Ub1N0cmluZygpICsgInwiICsgV3JhcFRleHQuVG9TdHJpbmcoKSArICJ8IiArIFJlYWRpbmdPcmRlci5Ub1N0cmluZygpICsgInwiICsgaXNCdWlsZEluLlRvU3RyaW5nKCkgKyBUZXh0Um90YXRpb24uVG9TdHJpbmcoKSArIExvY2tlZC5Ub1N0cmluZygpICsgSGlkZGVuLlRvU3RyaW5nKCkgKyBTaHJpbmtUb0ZpdC5Ub1N0cmluZygpICsgSW5kZW50LlRvU3RyaW5nKCk7IAotICAgICAgICAgICAgICAgIC8vcmV0dXJuIE51bWJlcmZvcm1hdC5JZCArICJ8IiArIEZvbnQuSWQgKyAifCIgKyBGaWxsLklkICsgInwiICsgQm9yZGVyLklkICsgVmVydGljYWxBbGlnbm1lbnQuVG9TdHJpbmcoKSArICJ8IiArIEhvcml6b250YWxBbGlnbm1lbnQuVG9TdHJpbmcoKSArICJ8IiArIFdyYXBUZXh0LlRvU3RyaW5nKCkgKyAifCIgKyBSZWFkaW5nT3JkZXIuVG9TdHJpbmcoKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxYZnMgQ29weSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb3B5KF9zdHlsZXMpOwotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxYZnMgQ29weShFeGNlbFN0eWxlcyBzdHlsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsWGZzIG5ld1hGID0gbmV3IEV4Y2VsWGZzKE5hbWVTcGFjZU1hbmFnZXIsIHN0eWxlcyk7Ci0gICAgICAgICAgICBuZXdYRi5OdW1iZXJGb3JtYXRJZCA9IF9udW1GbXRJZDsKLSAgICAgICAgICAgIG5ld1hGLkZvbnRJZCA9IF9mb250SWQ7Ci0gICAgICAgICAgICBuZXdYRi5GaWxsSWQgPSBfZmlsbElkOwotICAgICAgICAgICAgbmV3WEYuQm9yZGVySWQgPSBfYm9yZGVySWQ7Ci0gICAgICAgICAgICBuZXdYRi5YZklkID0gX3hmSUQ7Ci0gICAgICAgICAgICBuZXdYRi5SZWFkaW5nT3JkZXIgPSBfcmVhZGluZ09yZGVyOwotICAgICAgICAgICAgbmV3WEYuSG9yaXpvbnRhbEFsaWdubWVudCA9IF9ob3Jpem9udGFsQWxpZ25tZW50OwotICAgICAgICAgICAgbmV3WEYuVmVydGljYWxBbGlnbm1lbnQgPSBfdmVydGljYWxBbGlnbm1lbnQ7Ci0gICAgICAgICAgICBuZXdYRi5XcmFwVGV4dCA9IF93cmFwVGV4dDsKLSAgICAgICAgICAgIG5ld1hGLlNocmlua1RvRml0ID0gX3Nocmlua1RvRml0OwotICAgICAgICAgICAgbmV3WEYuSW5kZW50ID0gX2luZGVudDsKLSAgICAgICAgICAgIG5ld1hGLlRleHRSb3RhdGlvbiA9IF90ZXh0Um90YXRpb247Ci0gICAgICAgICAgICBuZXdYRi5Mb2NrZWQgPSBfbG9ja2VkOwotICAgICAgICAgICAgbmV3WEYuSGlkZGVuID0gX2hpZGRlbjsKLSAgICAgICAgICAgIHJldHVybiBuZXdYRjsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIGludCBHZXROZXdJRChFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbFhmcz4geGZzQ29sLCBTdHlsZUJhc2Ugc3R5bGVPYmplY3QsIGVTdHlsZUNsYXNzIHN0eWxlQ2xhc3MsIGVTdHlsZVByb3BlcnR5IHN0eWxlUHJvcGVydHksIG9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxYZnMgbmV3WGZzID0gdGhpcy5Db3B5KCk7Ci0gICAgICAgICAgICBzd2l0Y2goc3R5bGVDbGFzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLk51bWJlcmZvcm1hdDoKLSAgICAgICAgICAgICAgICAgICAgbmV3WGZzLk51bWJlckZvcm1hdElkID0gR2V0SWROdW1iZXJGb3JtYXQoc3R5bGVQcm9wZXJ0eSwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBzdHlsZU9iamVjdC5TZXRJbmRleChuZXdYZnMuTnVtYmVyRm9ybWF0SWQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkZvbnQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuZXdYZnMuRm9udElkID0gR2V0SWRGb250KHN0eWxlUHJvcGVydHksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgc3R5bGVPYmplY3QuU2V0SW5kZXgobmV3WGZzLkZvbnRJZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkZpbGw6Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5GaWxsQmFja2dyb3VuZENvbG9yOgotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuRmlsbFBhdHRlcm5Db2xvcjoKLSAgICAgICAgICAgICAgICAgICAgbmV3WGZzLkZpbGxJZCA9IEdldElkRmlsbChzdHlsZUNsYXNzLCBzdHlsZVByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlT2JqZWN0LlNldEluZGV4KG5ld1hmcy5GaWxsSWQpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkdyYWRpZW50RmlsbDoKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkZpbGxHcmFkaWVudENvbG9yMToKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZUNsYXNzLkZpbGxHcmFkaWVudENvbG9yMjoKLSAgICAgICAgICAgICAgICAgICAgbmV3WGZzLkZpbGxJZCA9IEdldElkR3JhZGllbnRGaWxsKHN0eWxlQ2xhc3MsIHN0eWxlUHJvcGVydHksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgc3R5bGVPYmplY3QuU2V0SW5kZXgobmV3WGZzLkZpbGxJZCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyOgotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyQm90dG9tOgotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyRGlhZ29uYWw6Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJMZWZ0OgotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyUmlnaHQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJUb3A6Ci0gICAgICAgICAgICAgICAgICAgIG5ld1hmcy5Cb3JkZXJJZCA9IEdldElkQm9yZGVyKHN0eWxlQ2xhc3MsIHN0eWxlUHJvcGVydHksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgc3R5bGVPYmplY3QuU2V0SW5kZXgobmV3WGZzLkJvcmRlcklkKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5TdHlsZToKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHN0eWxlUHJvcGVydHkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuWGZJZDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdYZnMuWGZJZCA9IChpbnQpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5Lkhvcml6b250YWxBbGlnbjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdYZnMuSG9yaXpvbnRhbEFsaWdubWVudD0oRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50KXZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5WZXJ0aWNhbEFsaWduOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1hmcy5WZXJ0aWNhbEFsaWdubWVudCA9IChFeGNlbFZlcnRpY2FsQWxpZ25tZW50KXZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5XcmFwVGV4dDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdYZnMuV3JhcFRleHQgPSAoYm9vbCl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuUmVhZGluZ09yZGVyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1hmcy5SZWFkaW5nT3JkZXIgPSAoRXhjZWxSZWFkaW5nT3JkZXIpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LlNocmlua1RvRml0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1hmcy5TaHJpbmtUb0ZpdD0oYm9vbCl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuSW5kZW50OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1hmcy5JbmRlbnQgPSAoaW50KXZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5UZXh0Um90YXRpb246Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3WGZzLlRleHRSb3RhdGlvbiA9IChpbnQpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkxvY2tlZDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdYZnMuTG9ja2VkID0gKGJvb2wpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkhpZGRlbjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdYZnMuSGlkZGVuID0gKGJvb2wpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHByb3BlcnR5IGZvciBjbGFzcyBzdHlsZS4iKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBpZCA9IHhmc0NvbC5GaW5kSW5kZXhCeUlEKG5ld1hmcy5JZCk7Ci0gICAgICAgICAgICBpZiAoaWQgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB4ZnNDb2wuQWRkKG5ld1hmcy5JZCwgbmV3WGZzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpZDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IEdldElkQm9yZGVyKGVTdHlsZUNsYXNzIHN0eWxlQ2xhc3MsIGVTdHlsZVByb3BlcnR5IHN0eWxlUHJvcGVydHksIG9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxCb3JkZXJYbWwgYm9yZGVyID0gQm9yZGVyLkNvcHkoKTsKLQotICAgICAgICAgICAgc3dpdGNoIChzdHlsZUNsYXNzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyQm90dG9tOgotICAgICAgICAgICAgICAgICAgICBTZXRCb3JkZXJJdGVtKGJvcmRlci5Cb3R0b20sIHN0eWxlUHJvcGVydHksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJEaWFnb25hbDoKLSAgICAgICAgICAgICAgICAgICAgU2V0Qm9yZGVySXRlbShib3JkZXIuRGlhZ29uYWwsIHN0eWxlUHJvcGVydHksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJMZWZ0OgotICAgICAgICAgICAgICAgICAgICBTZXRCb3JkZXJJdGVtKGJvcmRlci5MZWZ0LCBzdHlsZVByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyUmlnaHQ6Ci0gICAgICAgICAgICAgICAgICAgIFNldEJvcmRlckl0ZW0oYm9yZGVyLlJpZ2h0LCBzdHlsZVByb3BlcnR5LCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyVG9wOgotICAgICAgICAgICAgICAgICAgICBTZXRCb3JkZXJJdGVtKGJvcmRlci5Ub3AsIHN0eWxlUHJvcGVydHksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXI6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVByb3BlcnR5ID09IGVTdHlsZVByb3BlcnR5LkJvcmRlckRpYWdvbmFsVXApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci5EaWFnb25hbFVwID0gKGJvb2wpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVQcm9wZXJ0eSA9PSBlU3R5bGVQcm9wZXJ0eS5Cb3JkZXJEaWFnb25hbERvd24pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlci5EaWFnb25hbERvd24gPSAoYm9vbCl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHByb3BlcnR5IGZvciBjbGFzcyBCb3JkZXIuIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIGNsYXNzL3Byb3BlcnR5IGZvciBjbGFzcyBCb3JkZXIuIikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHN1YklkOwotICAgICAgICAgICAgc3RyaW5nIGlkID0gYm9yZGVyLklkOwotICAgICAgICAgICAgc3ViSWQgPSBfc3R5bGVzLkJvcmRlcnMuRmluZEluZGV4QnlJRChpZCk7Ci0gICAgICAgICAgICBpZiAoc3ViSWQgPT0gaW50Lk1pblZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnMuQWRkKGlkLCBib3JkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN1YklkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEJvcmRlckl0ZW0oRXhjZWxCb3JkZXJJdGVtWG1sIGV4Y2VsQm9yZGVySXRlbSwgZVN0eWxlUHJvcGVydHkgc3R5bGVQcm9wZXJ0eSwgb2JqZWN0IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihzdHlsZVByb3BlcnR5PT1lU3R5bGVQcm9wZXJ0eS5TdHlsZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleGNlbEJvcmRlckl0ZW0uU3R5bGUgPSAoRXhjZWxCb3JkZXJTdHlsZSl2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHN0eWxlUHJvcGVydHkgPT0gZVN0eWxlUHJvcGVydHkuQ29sb3IgfHwgc3R5bGVQcm9wZXJ0eT09IGVTdHlsZVByb3BlcnR5LlRpbnQgfHwgc3R5bGVQcm9wZXJ0eT09ZVN0eWxlUHJvcGVydHkuSW5kZXhlZENvbG9yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChleGNlbEJvcmRlckl0ZW0uU3R5bGUgPT0gRXhjZWxCb3JkZXJTdHlsZS5Ob25lKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEV4Y2VwdGlvbigiQ2FuJ3Qgc2V0IGJvcmRlcmNvbG9yIHdoZW4gc3R5bGUgaXMgbm90IHNldC4iKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGV4Y2VsQm9yZGVySXRlbS5Db2xvci5SZ2IgPSB2YWx1ZS5Ub1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgR2V0SWRGaWxsKGVTdHlsZUNsYXNzIHN0eWxlQ2xhc3MsIGVTdHlsZVByb3BlcnR5IHN0eWxlUHJvcGVydHksIG9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxGaWxsWG1sIGZpbGwgPSBGaWxsLkNvcHkoKTsKLQotICAgICAgICAgICAgc3dpdGNoIChzdHlsZVByb3BlcnR5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuUGF0dGVyblR5cGU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxsIGlzIEV4Y2VsR3JhZGllbnRGaWxsWG1sKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxsID0gbmV3IEV4Y2VsRmlsbFhtbChOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaWxsLlBhdHRlcm5UeXBlID0gKEV4Y2VsRmlsbFN0eWxlKXZhbHVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkNvbG9yOgotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuVGludDoKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkluZGV4ZWRDb2xvcjoKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkF1dG9Db2xvcjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGwgaXMgRXhjZWxHcmFkaWVudEZpbGxYbWwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBuZXcgRXhjZWxGaWxsWG1sKE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWxsLlBhdHRlcm5UeXBlID09IEV4Y2VsRmlsbFN0eWxlLk5vbmUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IHNldCBjb2xvciB3aGVuIHBhdHRlcm50eXBlIGlzIG5vdCBzZXQuIikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEV4Y2VsQ29sb3JYbWwgZGVzdENvbG9yOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVDbGFzcz09ZVN0eWxlQ2xhc3MuRmlsbFBhdHRlcm5Db2xvcikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENvbG9yID0gZmlsbC5QYXR0ZXJuQ29sb3I7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0Q29sb3IgPSBmaWxsLkJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVByb3BlcnR5ID09IGVTdHlsZVByb3BlcnR5LkNvbG9yKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0Q29sb3IuUmdiID0gdmFsdWUuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHlsZVByb3BlcnR5ID09IGVTdHlsZVByb3BlcnR5LlRpbnQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RDb2xvci5UaW50ID0gKGRlY2ltYWwpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVQcm9wZXJ0eSA9PSBlU3R5bGVQcm9wZXJ0eS5JbmRleGVkQ29sb3IpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RDb2xvci5JbmRleGVkID0gKGludCl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RDb2xvci5BdXRvID0gKGJvb2wpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGNsYXNzL3Byb3BlcnR5IGZvciBjbGFzcyBGaWxsLiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzdWJJZDsKLSAgICAgICAgICAgIHN0cmluZyBpZCA9IGZpbGwuSWQ7Ci0gICAgICAgICAgICBzdWJJZCA9IF9zdHlsZXMuRmlsbHMuRmluZEluZGV4QnlJRChpZCk7Ci0gICAgICAgICAgICBpZiAoc3ViSWQgPT0gaW50Lk1pblZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkZpbGxzLkFkZChpZCwgZmlsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3ViSWQ7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBpbnQgR2V0SWRHcmFkaWVudEZpbGwoZVN0eWxlQ2xhc3Mgc3R5bGVDbGFzcywgZVN0eWxlUHJvcGVydHkgc3R5bGVQcm9wZXJ0eSwgb2JqZWN0IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBFeGNlbEdyYWRpZW50RmlsbFhtbCBmaWxsOwotICAgICAgICAgICAgaWYoRmlsbCBpcyBFeGNlbEdyYWRpZW50RmlsbFhtbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxsID0gKEV4Y2VsR3JhZGllbnRGaWxsWG1sKUZpbGwuQ29weSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbGwgPSBuZXcgRXhjZWxHcmFkaWVudEZpbGxYbWwoRmlsbC5OYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICBmaWxsLkdyYWRpZW50Q29sb3IxLlNldENvbG9yKENvbG9yLldoaXRlKTsKLSAgICAgICAgICAgICAgICBmaWxsLkdyYWRpZW50Q29sb3IyLlNldENvbG9yKENvbG9yLkZyb21BcmdiKDc5LDEyOSwxODkpKTsKLSAgICAgICAgICAgICAgICBmaWxsLlR5cGU9RXhjZWxGaWxsR3JhZGllbnRUeXBlLkxpbmVhcjsKLSAgICAgICAgICAgICAgICBmaWxsLkRlZ3JlZT05MDsKLSAgICAgICAgICAgICAgICBmaWxsLlRvcCA9IGRvdWJsZS5OYU47Ci0gICAgICAgICAgICAgICAgZmlsbC5Cb3R0b20gPSBkb3VibGUuTmFOOwotICAgICAgICAgICAgICAgIGZpbGwuTGVmdCA9IGRvdWJsZS5OYU47Ci0gICAgICAgICAgICAgICAgZmlsbC5SaWdodCA9IGRvdWJsZS5OYU47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoc3R5bGVQcm9wZXJ0eSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50VHlwZToKLSAgICAgICAgICAgICAgICAgICAgZmlsbC5UeXBlID0gKEV4Y2VsRmlsbEdyYWRpZW50VHlwZSl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5HcmFkaWVudERlZ3JlZToKLSAgICAgICAgICAgICAgICAgICAgZmlsbC5EZWdyZWUgPSAoZG91YmxlKXZhbHVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50VG9wOgotICAgICAgICAgICAgICAgICAgICBmaWxsLlRvcCA9IChkb3VibGUpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuR3JhZGllbnRCb3R0b206IAotICAgICAgICAgICAgICAgICAgICBmaWxsLkJvdHRvbSA9IChkb3VibGUpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuR3JhZGllbnRMZWZ0OgotICAgICAgICAgICAgICAgICAgICBmaWxsLkxlZnQgPSAoZG91YmxlKXZhbHVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50UmlnaHQ6Ci0gICAgICAgICAgICAgICAgICAgIGZpbGwuUmlnaHQgPSAoZG91YmxlKXZhbHVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkNvbG9yOgotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuVGludDoKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkluZGV4ZWRDb2xvcjoKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkF1dG9Db2xvcjoKLSAgICAgICAgICAgICAgICAgICAgRXhjZWxDb2xvclhtbCBkZXN0Q29sb3I7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlQ2xhc3MgPT0gZVN0eWxlQ2xhc3MuRmlsbEdyYWRpZW50Q29sb3IxKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXN0Q29sb3IgPSBmaWxsLkdyYWRpZW50Q29sb3IxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENvbG9yID0gZmlsbC5HcmFkaWVudENvbG9yMjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUHJvcGVydHkgPT0gZVN0eWxlUHJvcGVydHkuQ29sb3IpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RDb2xvci5SZ2IgPSB2YWx1ZS5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0eWxlUHJvcGVydHkgPT0gZVN0eWxlUHJvcGVydHkuVGludCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENvbG9yLlRpbnQgPSAoZGVjaW1hbCl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdHlsZVByb3BlcnR5ID09IGVTdHlsZVByb3BlcnR5LkluZGV4ZWRDb2xvcikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENvbG9yLkluZGV4ZWQgPSAoaW50KXZhbHVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVzdENvbG9yLkF1dG8gPSAoYm9vbCl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGNsYXNzL3Byb3BlcnR5IGZvciBjbGFzcyBGaWxsLiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzdWJJZDsKLSAgICAgICAgICAgIHN0cmluZyBpZCA9IGZpbGwuSWQ7Ci0gICAgICAgICAgICBzdWJJZCA9IF9zdHlsZXMuRmlsbHMuRmluZEluZGV4QnlJRChpZCk7Ci0gICAgICAgICAgICBpZiAoc3ViSWQgPT0gaW50Lk1pblZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfc3R5bGVzLkZpbGxzLkFkZChpZCwgZmlsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3ViSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBHZXRJZE51bWJlckZvcm1hdChlU3R5bGVQcm9wZXJ0eSBzdHlsZVByb3BlcnR5LCBvYmplY3QgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHlsZVByb3BlcnR5ID09IGVTdHlsZVByb3BlcnR5LkZvcm1hdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFeGNlbE51bWJlckZvcm1hdFhtbCBpdGVtPW51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKCFfc3R5bGVzLk51bWJlckZvcm1hdHMuRmluZEJ5SUQodmFsdWUuVG9TdHJpbmcoKSwgcmVmIGl0ZW0pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaXRlbSA9IG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyKSB7IEZvcm1hdCA9IHZhbHVlLlRvU3RyaW5nKCksIE51bUZtdElkID0gX3N0eWxlcy5OdW1iZXJGb3JtYXRzLk5leHRJZCsrIH07Ci0gICAgICAgICAgICAgICAgICAgIF9zdHlsZXMuTnVtYmVyRm9ybWF0cy5BZGQodmFsdWUuVG9TdHJpbmcoKSwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLk51bUZtdElkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIHByb3BlcnR5IGZvciBjbGFzcyBOdW1iZXJmb3JtYXQiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBpbnQgR2V0SWRGb250KGVTdHlsZVByb3BlcnR5IHN0eWxlUHJvcGVydHksIG9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxGb250WG1sIGZudCA9IEZvbnQuQ29weSgpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKHN0eWxlUHJvcGVydHkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5OYW1lOgotICAgICAgICAgICAgICAgICAgICBmbnQuTmFtZSA9IHZhbHVlLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuU2l6ZToKLSAgICAgICAgICAgICAgICAgICAgZm50LlNpemUgPSAoZmxvYXQpdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuRmFtaWx5OgotICAgICAgICAgICAgICAgICAgICBmbnQuRmFtaWx5ID0gKGludCl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5Cb2xkOgotICAgICAgICAgICAgICAgICAgICBmbnQuQm9sZCA9IChib29sKXZhbHVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5Lkl0YWxpYzoKLSAgICAgICAgICAgICAgICAgICAgZm50Lkl0YWxpYyA9IChib29sKXZhbHVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LlN0cmlrZToKLSAgICAgICAgICAgICAgICAgICAgZm50LlN0cmlrZSA9IChib29sKXZhbHVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LlVuZGVybGluZVR5cGU6Ci0gICAgICAgICAgICAgICAgICAgIGZudC5VbmRlckxpbmVUeXBlID0gKEV4Y2VsVW5kZXJMaW5lVHlwZSl2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5Db2xvcjoKLSAgICAgICAgICAgICAgICAgICAgZm50LkNvbG9yLlJnYj12YWx1ZS5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LlZlcnRpY2FsQWxpZ246Ci0gICAgICAgICAgICAgICAgICAgIGZudC5WZXJ0aWNhbEFsaWduID0gKChFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udCl2YWx1ZSkgPT0gRXhjZWxWZXJ0aWNhbEFsaWdubWVudEZvbnQuTm9uZSA/ICIiIDogdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiSW52YWxpZCBwcm9wZXJ0eSBmb3IgY2xhc3MgRm9udCIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzdWJJZDsKLSAgICAgICAgICAgIHN0cmluZyBpZCA9IGZudC5JZDsKLSAgICAgICAgICAgIHN1YklkID0gX3N0eWxlcy5Gb250cy5GaW5kSW5kZXhCeUlEKGlkKTsKLSAgICAgICAgICAgIGlmIChzdWJJZCA9PSBpbnQuTWluVmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9zdHlsZXMuRm9udHMuQWRkKGlkLGZudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3ViSWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgb3ZlcnJpZGUgWG1sTm9kZSBDcmVhdGVYbWxOb2RlKFhtbE5vZGUgdG9wTm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENyZWF0ZVhtbE5vZGUodG9wTm9kZSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIFhtbE5vZGUgQ3JlYXRlWG1sTm9kZShYbWxOb2RlIHRvcE5vZGUsIGJvb2wgaXNDZWxsU3R5bGVYc2YpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRvcE5vZGUgPSB0b3BOb2RlOwotICAgICAgICAgICAgdmFyIGRvU2V0WGZJZCA9ICghaXNDZWxsU3R5bGVYc2YgJiYgX3hmSUQgPiBpbnQuTWluVmFsdWUgJiYgX3N0eWxlcy5DZWxsU3R5bGVYZnMuQ291bnQgPiAwICYmIF9zdHlsZXMuQ2VsbFN0eWxlWGZzW194ZklEXS5uZXdJRCA+IGludC5NaW5WYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoX251bUZtdElkID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAbnVtRm10SWQiLCBfbnVtRm10SWQuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYoZG9TZXRYZklkKSBTZXRYbWxOb2RlU3RyaW5nKCJAYXBwbHlOdW1iZXJGb3JtYXQiLCAiMSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKF9mb250SWQgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAZm9udElkIiwgX3N0eWxlcy5Gb250c1tfZm9udElkXS5uZXdJRC5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAoZG9TZXRYZklkKSBTZXRYbWxOb2RlU3RyaW5nKCJAYXBwbHlGb250IiwgIjEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChfZmlsbElkID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGZpbGxJZCIsIF9zdHlsZXMuRmlsbHNbX2ZpbGxJZF0ubmV3SUQuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRvU2V0WGZJZCkgU2V0WG1sTm9kZVN0cmluZygiQGFwcGx5RmlsbCIsICIxIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoX2JvcmRlcklkID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGJvcmRlcklkIiwgX3N0eWxlcy5Cb3JkZXJzW19ib3JkZXJJZF0ubmV3SUQuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRvU2V0WGZJZCkgU2V0WG1sTm9kZVN0cmluZygiQGFwcGx5Qm9yZGVyIiwgIjEiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKF9ob3Jpem9udGFsQWxpZ25tZW50ICE9IEV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudC5HZW5lcmFsKSB0aGlzLlNldFhtbE5vZGVTdHJpbmcoaG9yaXpvbnRhbEFsaWduUGF0aCwgU2V0QWxpZ25TdHJpbmcoX2hvcml6b250YWxBbGlnbm1lbnQpKTsKLSAgICAgICAgICAgIGlmIChkb1NldFhmSWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHhmSWQiLCBfc3R5bGVzLkNlbGxTdHlsZVhmc1tfeGZJRF0ubmV3SUQuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoX3ZlcnRpY2FsQWxpZ25tZW50ICE9IEV4Y2VsVmVydGljYWxBbGlnbm1lbnQuQm90dG9tKSB0aGlzLlNldFhtbE5vZGVTdHJpbmcodmVydGljYWxBbGlnblBhdGgsIFNldEFsaWduU3RyaW5nKF92ZXJ0aWNhbEFsaWdubWVudCkpOwotICAgICAgICAgICAgaWYoX3dyYXBUZXh0KSB0aGlzLlNldFhtbE5vZGVTdHJpbmcod3JhcFRleHRQYXRoLCAiMSIpOwotICAgICAgICAgICAgaWYoX3JlYWRpbmdPcmRlciE9RXhjZWxSZWFkaW5nT3JkZXIuQ29udGV4dERlcGVuZGVudCkgdGhpcy5TZXRYbWxOb2RlU3RyaW5nKHJlYWRpbmdPcmRlclBhdGgsICgoaW50KV9yZWFkaW5nT3JkZXIpLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgaWYgKF9zaHJpbmtUb0ZpdCkgdGhpcy5TZXRYbWxOb2RlU3RyaW5nKHNocmlua1RvRml0UGF0aCwgIjEiKTsKLSAgICAgICAgICAgIGlmIChfaW5kZW50ID4gMCkgU2V0WG1sTm9kZVN0cmluZyhpbmRlbnRQYXRoLCBfaW5kZW50LlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgaWYgKF90ZXh0Um90YXRpb24gPiAwKSB0aGlzLlNldFhtbE5vZGVTdHJpbmcodGV4dFJvdGF0aW9uUGF0aCwgX3RleHRSb3RhdGlvbi5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIGlmICghX2xvY2tlZCkgdGhpcy5TZXRYbWxOb2RlU3RyaW5nKGxvY2tlZFBhdGgsICIwIik7Ci0gICAgICAgICAgICBpZiAoX2hpZGRlbikgdGhpcy5TZXRYbWxOb2RlU3RyaW5nKGhpZGRlblBhdGgsICIxIik7Ci0gICAgICAgICAgICByZXR1cm4gVG9wTm9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RyaW5nIFNldEFsaWduU3RyaW5nKEVudW0gYWxpZ24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBuZXdOYW1lID0gRW51bS5HZXROYW1lKGFsaWduLkdldFR5cGUoKSwgYWxpZ24pOwotICAgICAgICAgICAgcmV0dXJuIG5ld05hbWUuU3Vic3RyaW5nKDAsIDEpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyBuZXdOYW1lLlN1YnN0cmluZygxLCBuZXdOYW1lLkxlbmd0aCAtIDEpOwotICAgICAgICB9CisgIGludGVybmFsIEV4Y2VsWGZzKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnNtLCBYbWxOb2RlIHRvcE5vZGUsIEV4Y2VsU3R5bGVzIHN0eWxlcykKKyAgICAgIDogYmFzZShuc20sIHRvcE5vZGUpIHsKKyAgICBfc3R5bGVzID0gc3R5bGVzOworICAgIF94ZklEID0gR2V0WG1sTm9kZUludCgiQHhmSWQiKTsKKyAgICBpZiAoX3hmSUQgPT0gMCkgeworICAgICAgaXNCdWlsZEluID0gdHJ1ZTsgLy9Ob3JtYWwgdGFnZ2VuCiAgICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICBfbnVtRm10SWQgPSBHZXRYbWxOb2RlSW50KCJAbnVtRm10SWQiKTsKKyAgICBfZm9udElkID0gR2V0WG1sTm9kZUludCgiQGZvbnRJZCIpOworICAgIF9maWxsSWQgPSBHZXRYbWxOb2RlSW50KCJAZmlsbElkIik7CisgICAgX2JvcmRlcklkID0gR2V0WG1sTm9kZUludCgiQGJvcmRlcklkIik7CisgICAgX3JlYWRpbmdPcmRlciA9IEdldFJlYWRpbmdPcmRlcihHZXRYbWxOb2RlU3RyaW5nKF9yZWFkaW5nT3JkZXJQYXRoKSk7CisgICAgX2luZGVudCA9IEdldFhtbE5vZGVJbnQoX2luZGVudFBhdGgpOworICAgIF9zaHJpbmtUb0ZpdCA9IEdldFhtbE5vZGVTdHJpbmcoX3Nocmlua1RvRml0UGF0aCkgPT0gIjEiID8gdHJ1ZSA6IGZhbHNlOworICAgIF92ZXJ0aWNhbEFsaWdubWVudCA9IEdldFZlcnRpY2FsQWxpZ24oR2V0WG1sTm9kZVN0cmluZyhfdmVydGljYWxBbGlnblBhdGgpKTsKKyAgICBfaG9yaXpvbnRhbEFsaWdubWVudCA9IEdldEhvcml6b250YWxBbGlnbihHZXRYbWxOb2RlU3RyaW5nKF9ob3Jpem9udGFsQWxpZ25QYXRoKSk7CisgICAgX3dyYXBUZXh0ID0gR2V0WG1sTm9kZUJvb2woX3dyYXBUZXh0UGF0aCk7CisgICAgX3RleHRSb3RhdGlvbiA9IEdldFhtbE5vZGVJbnQodGV4dFJvdGF0aW9uUGF0aCk7CisgICAgX2hpZGRlbiA9IEdldFhtbE5vZGVCb29sKF9oaWRkZW5QYXRoKTsKKyAgICBfbG9ja2VkID0gR2V0WG1sTm9kZUJvb2woX2xvY2tlZFBhdGgsIHRydWUpOworICB9CisKKyAgcHJpdmF0ZSBFeGNlbFJlYWRpbmdPcmRlciBHZXRSZWFkaW5nT3JkZXIoc3RyaW5nIHZhbHVlKSB7CisgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgY2FzZSAiMSI6CisgICAgICAgIHJldHVybiBFeGNlbFJlYWRpbmdPcmRlci5MZWZ0VG9SaWdodDsKKyAgICAgIGNhc2UgIjIiOgorICAgICAgICByZXR1cm4gRXhjZWxSZWFkaW5nT3JkZXIuUmlnaHRUb0xlZnQ7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gRXhjZWxSZWFkaW5nT3JkZXIuQ29udGV4dERlcGVuZGVudDsKKyAgICB9CisgIH0KKworICBwcml2YXRlIEV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudCBHZXRIb3Jpem9udGFsQWxpZ24oc3RyaW5nIGFsaWduKSB7CisgICAgaWYgKGFsaWduID09ICIiKSB7CisgICAgICByZXR1cm4gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkdlbmVyYWw7CisgICAgfQorICAgIGFsaWduID0KKyAgICAgICAgYWxpZ24uU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkKKyAgICAgICAgICAgICsgYWxpZ24uU3Vic3RyaW5nKDEsIGFsaWduLkxlbmd0aCAtIDEpOworICAgIHRyeSB7CisgICAgICByZXR1cm4gKEV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudClFbnVtLlBhcnNlKHR5cGVvZihFeGNlbEhvcml6b250YWxBbGlnbm1lbnQpLCBhbGlnbik7CisgICAgfSBjYXRjaCB7CisgICAgICByZXR1cm4gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkdlbmVyYWw7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBFeGNlbFZlcnRpY2FsQWxpZ25tZW50IEdldFZlcnRpY2FsQWxpZ24oc3RyaW5nIGFsaWduKSB7CisgICAgaWYgKGFsaWduID09ICIiKSB7CisgICAgICByZXR1cm4gRXhjZWxWZXJ0aWNhbEFsaWdubWVudC5Cb3R0b207CisgICAgfQorICAgIGFsaWduID0KKyAgICAgICAgYWxpZ24uU3Vic3RyaW5nKDAsIDEpLlRvVXBwZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkKKyAgICAgICAgICAgICsgYWxpZ24uU3Vic3RyaW5nKDEsIGFsaWduLkxlbmd0aCAtIDEpOworICAgIHRyeSB7CisgICAgICByZXR1cm4gKEV4Y2VsVmVydGljYWxBbGlnbm1lbnQpRW51bS5QYXJzZSh0eXBlb2YoRXhjZWxWZXJ0aWNhbEFsaWdubWVudCksIGFsaWduKTsKKyAgICB9IGNhdGNoIHsKKyAgICAgIHJldHVybiBFeGNlbFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbTsKKyAgICB9CisgIH0KKworICBpbnRlcm5hbCB2b2lkIFhmX0NoYW5nZWRFdmVudChvYmplY3Qgc2VuZGVyLCBFdmVudEFyZ3MgZSkgeworICAgIC8vaWYgKF9jZWxsICE9IG51bGwpCisgICAgLy97CisgICAgLy8gICAgaWYgKCFTdHlsZXMuQ2hhbmdlZENlbGxzLkNvbnRhaW5zS2V5KF9jZWxsLklkKSkKKyAgICAvLyAgICB7CisgICAgLy8gICAgICAgIC8vX2NlbGwuU3R5bGUgPSAiIjsKKyAgICAvLyAgICAgICAgX2NlbGwuU2V0TmV3U3R5bGVJRChpbnQuTWluVmFsdWUuVG9TdHJpbmcoKSk7CisgICAgLy8gICAgICAgIFN0eWxlcy5DaGFuZ2VkQ2VsbHMuQWRkKF9jZWxsLklkLCBfY2VsbCk7CisgICAgLy8gICAgfQorICAgIC8vfQorICB9CisKKyAgcHJpdmF0ZSBpbnQgX3hmSUQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU3R5bGUgaW5kZXgKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBYZklkIHsKKyAgICBnZXQgPT4gX3hmSUQ7CisgICAgc2V0ID0+IF94ZklEID0gdmFsdWU7CisgIH0KKworICBwcml2YXRlIGludCBfbnVtRm10SWQ7CisKKyAgaW50ZXJuYWwgaW50IE51bWJlckZvcm1hdElkIHsKKyAgICBnZXQgPT4gX251bUZtdElkOworICAgIHNldCB7CisgICAgICBfbnVtRm10SWQgPSB2YWx1ZTsKKyAgICAgIEFwcGx5TnVtYmVyRm9ybWF0ID0gKHZhbHVlID4gMCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBpbnQgX2ZvbnRJZDsKKworICBpbnRlcm5hbCBpbnQgRm9udElkIHsKKyAgICBnZXQgPT4gX2ZvbnRJZDsKKyAgICBzZXQgPT4gX2ZvbnRJZCA9IHZhbHVlOworICB9CisKKyAgcHJpdmF0ZSBpbnQgX2ZpbGxJZDsKKworICBpbnRlcm5hbCBpbnQgRmlsbElkIHsKKyAgICBnZXQgPT4gX2ZpbGxJZDsKKyAgICBzZXQgPT4gX2ZpbGxJZCA9IHZhbHVlOworICB9CisKKyAgcHJpdmF0ZSBpbnQgX2JvcmRlcklkOworCisgIGludGVybmFsIGludCBCb3JkZXJJZCB7CisgICAgZ2V0ID0+IF9ib3JkZXJJZDsKKyAgICBzZXQgPT4gX2JvcmRlcklkID0gdmFsdWU7CisgIH0KKworICBwcml2YXRlIGJvb2wgaXNCdWlsZEluIHsgZ2V0OyBzZXQ7IH0KKworICBpbnRlcm5hbCBib29sIEFwcGx5TnVtYmVyRm9ybWF0IHsgZ2V0OyBzZXQ7IH0KKworICBpbnRlcm5hbCBib29sIEFwcGx5Rm9udCB7IGdldDsgc2V0OyB9CisKKyAgaW50ZXJuYWwgYm9vbCBBcHBseUZpbGwgeyBnZXQ7IHNldDsgfQorCisgIGludGVybmFsIGJvb2wgQXBwbHlCb3JkZXIgeyBnZXQ7IHNldDsgfQorCisgIGludGVybmFsIGJvb2wgQXBwbHlBbGlnbm1lbnQgeyBnZXQ7IHNldDsgfQorCisgIGludGVybmFsIGJvb2wgQXBwbHlQcm90ZWN0aW9uIHsgZ2V0OyBzZXQ7IH0KKworICBwdWJsaWMgRXhjZWxTdHlsZXMgU3R5bGVzIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE51bWJlcmZvcm1hdCBwcm9wZXJ0aWVzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbE51bWJlckZvcm1hdFhtbCBOdW1iZXJmb3JtYXQgPT4gX3N0eWxlcy5OdW1iZXJGb3JtYXRzW19udW1GbXRJZCA8IDAgPyAwIDogX251bUZtdElkXTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBGb250IHByb3BlcnRpZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsRm9udFhtbCBGb250ID0+IF9zdHlsZXMuRm9udHNbX2ZvbnRJZCA8IDAgPyAwIDogX2ZvbnRJZF07CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRmlsbCBwcm9wZXJ0aWVzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEZpbGxYbWwgRmlsbCA9PiBfc3R5bGVzLkZpbGxzW19maWxsSWQgPCAwID8gMCA6IF9maWxsSWRdOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEJvcmRlciBzdHlsZSBwcm9wZXJ0aWVzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEJvcmRlclhtbCBCb3JkZXIgPT4gX3N0eWxlcy5Cb3JkZXJzW19ib3JkZXJJZCA8IDAgPyAwIDogX2JvcmRlcklkXTsKKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfaG9yaXpvbnRhbEFsaWduUGF0aCA9ICJkOmFsaWdubWVudC9AaG9yaXpvbnRhbCI7CisgIHByaXZhdGUgRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50IF9ob3Jpem9udGFsQWxpZ25tZW50ID0gRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50LkdlbmVyYWw7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSG9yaXpvbnRhbCBhbGlnbm1lbnQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudCBIb3Jpem9udGFsQWxpZ25tZW50IHsKKyAgICBnZXQgPT4gX2hvcml6b250YWxBbGlnbm1lbnQ7CisgICAgc2V0ID0+IF9ob3Jpem9udGFsQWxpZ25tZW50ID0gdmFsdWU7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfdmVydGljYWxBbGlnblBhdGggPSAiZDphbGlnbm1lbnQvQHZlcnRpY2FsIjsKKyAgcHJpdmF0ZSBFeGNlbFZlcnRpY2FsQWxpZ25tZW50IF92ZXJ0aWNhbEFsaWdubWVudCA9IEV4Y2VsVmVydGljYWxBbGlnbm1lbnQuQm90dG9tOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFZlcnRpY2FsIGFsaWdubWVudAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxWZXJ0aWNhbEFsaWdubWVudCBWZXJ0aWNhbEFsaWdubWVudCB7CisgICAgZ2V0ID0+IF92ZXJ0aWNhbEFsaWdubWVudDsKKyAgICBzZXQgPT4gX3ZlcnRpY2FsQWxpZ25tZW50ID0gdmFsdWU7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfd3JhcFRleHRQYXRoID0gImQ6YWxpZ25tZW50L0B3cmFwVGV4dCI7CisgIHByaXZhdGUgYm9vbCBfd3JhcFRleHQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gV3JhcGVkIHRleHQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgV3JhcFRleHQgeworICAgIGdldCA9PiBfd3JhcFRleHQ7CisgICAgc2V0ID0+IF93cmFwVGV4dCA9IHZhbHVlOworICB9CisKKyAgcHJpdmF0ZSBzdHJpbmcgdGV4dFJvdGF0aW9uUGF0aCA9ICJkOmFsaWdubWVudC9AdGV4dFJvdGF0aW9uIjsKKyAgcHJpdmF0ZSBpbnQgX3RleHRSb3RhdGlvbjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUZXh0IHJvdGF0aW9uIGFuZ2xlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgVGV4dFJvdGF0aW9uIHsKKyAgICBnZXQgPT4gKF90ZXh0Um90YXRpb24gPT0gaW50Lk1pblZhbHVlID8gMCA6IF90ZXh0Um90YXRpb24pOworICAgIHNldCA9PiBfdGV4dFJvdGF0aW9uID0gdmFsdWU7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfbG9ja2VkUGF0aCA9ICJkOnByb3RlY3Rpb24vQGxvY2tlZCI7CisgIHByaXZhdGUgYm9vbCBfbG9ja2VkID0gdHJ1ZTsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBMb2NrZWQgd2hlbiBzaGVldCBpcyBwcm90ZWN0ZWQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgTG9ja2VkIHsKKyAgICBnZXQgPT4gX2xvY2tlZDsKKyAgICBzZXQgPT4gX2xvY2tlZCA9IHZhbHVlOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2hpZGRlblBhdGggPSAiZDpwcm90ZWN0aW9uL0BoaWRkZW4iOworICBwcml2YXRlIGJvb2wgX2hpZGRlbjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBIaWRlIGZvcm11bGFzIHdoZW4gc2hlZXQgaXMgcHJvdGVjdGVkCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIEhpZGRlbiB7CisgICAgZ2V0ID0+IF9oaWRkZW47CisgICAgc2V0ID0+IF9oaWRkZW4gPSB2YWx1ZTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9yZWFkaW5nT3JkZXJQYXRoID0gImQ6YWxpZ25tZW50L0ByZWFkaW5nT3JkZXIiOworICBwcml2YXRlIEV4Y2VsUmVhZGluZ09yZGVyIF9yZWFkaW5nT3JkZXIgPSBFeGNlbFJlYWRpbmdPcmRlci5Db250ZXh0RGVwZW5kZW50OworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJlYWRpbmdvcmRlcgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxSZWFkaW5nT3JkZXIgUmVhZGluZ09yZGVyIHsKKyAgICBnZXQgPT4gX3JlYWRpbmdPcmRlcjsKKyAgICBzZXQgPT4gX3JlYWRpbmdPcmRlciA9IHZhbHVlOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3Nocmlua1RvRml0UGF0aCA9ICJkOmFsaWdubWVudC9Ac2hyaW5rVG9GaXQiOworICBwcml2YXRlIGJvb2wgX3Nocmlua1RvRml0OworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNocmluayB0byBmaXQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgU2hyaW5rVG9GaXQgeworICAgIGdldCA9PiBfc2hyaW5rVG9GaXQ7CisgICAgc2V0ID0+IF9zaHJpbmtUb0ZpdCA9IHZhbHVlOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2luZGVudFBhdGggPSAiZDphbGlnbm1lbnQvQGluZGVudCI7CisgIHByaXZhdGUgaW50IF9pbmRlbnQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW5kZW50YXRpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBJbmRlbnQgeworICAgIGdldCA9PiAoX2luZGVudCA9PSBpbnQuTWluVmFsdWUgPyAwIDogX2luZGVudCk7CisgICAgc2V0ID0+IF9pbmRlbnQgPSB2YWx1ZTsKKyAgfQorCisgIGludGVybmFsIHZvaWQgUmVnaXN0ZXJFdmVudChFeGNlbFhmcyB4ZikgeworICAgIC8vICAgICAgICAgICAgICAgIFJlZ2lzdGVyRXZlbnQoeGYsIHhmLlhmX0NoYW5nZWRFdmVudCk7CisgIH0KKworICBpbnRlcm5hbCBvdmVycmlkZSBzdHJpbmcgSWQgPT4KKyAgICBYZklkCisgICAgICAgICsgInwiCisgICAgICAgICsgTnVtYmVyRm9ybWF0SWQKKyAgICAgICAgKyAifCIKKyAgICAgICAgKyBGb250SWQKKyAgICAgICAgKyAifCIKKyAgICAgICAgKyBGaWxsSWQKKyAgICAgICAgKyAifCIKKyAgICAgICAgKyBCb3JkZXJJZAorICAgICAgICArIFZlcnRpY2FsQWxpZ25tZW50CisgICAgICAgICsgInwiCisgICAgICAgICsgSG9yaXpvbnRhbEFsaWdubWVudAorICAgICAgICArICJ8IgorICAgICAgICArIFdyYXBUZXh0CisgICAgICAgICsgInwiCisgICAgICAgICsgUmVhZGluZ09yZGVyCisgICAgICAgICsgInwiCisgICAgICAgICsgaXNCdWlsZEluCisgICAgICAgICsgVGV4dFJvdGF0aW9uCisgICAgICAgICsgTG9ja2VkCisgICAgICAgICsgSGlkZGVuCisgICAgICAgICsgU2hyaW5rVG9GaXQKKyAgICAgICAgKyBJbmRlbnQ7CisKKyAgLy9yZXR1cm4gTnVtYmVyZm9ybWF0LklkICsgInwiICsgRm9udC5JZCArICJ8IiArIEZpbGwuSWQgKyAifCIgKyBCb3JkZXIuSWQgKyBWZXJ0aWNhbEFsaWdubWVudC5Ub1N0cmluZygpICsgInwiICsgSG9yaXpvbnRhbEFsaWdubWVudC5Ub1N0cmluZygpICsgInwiICsgV3JhcFRleHQuVG9TdHJpbmcoKSArICJ8IiArIFJlYWRpbmdPcmRlci5Ub1N0cmluZygpOworICBpbnRlcm5hbCBFeGNlbFhmcyBDb3B5KCkgeworICAgIHJldHVybiBDb3B5KF9zdHlsZXMpOworICB9CisKKyAgaW50ZXJuYWwgRXhjZWxYZnMgQ29weShFeGNlbFN0eWxlcyBzdHlsZXMpIHsKKyAgICBFeGNlbFhmcyBuZXdYZiA9IG5ldyBFeGNlbFhmcyhOYW1lU3BhY2VNYW5hZ2VyLCBzdHlsZXMpOworICAgIG5ld1hmLk51bWJlckZvcm1hdElkID0gX251bUZtdElkOworICAgIG5ld1hmLkZvbnRJZCA9IF9mb250SWQ7CisgICAgbmV3WGYuRmlsbElkID0gX2ZpbGxJZDsKKyAgICBuZXdYZi5Cb3JkZXJJZCA9IF9ib3JkZXJJZDsKKyAgICBuZXdYZi5YZklkID0gX3hmSUQ7CisgICAgbmV3WGYuUmVhZGluZ09yZGVyID0gX3JlYWRpbmdPcmRlcjsKKyAgICBuZXdYZi5Ib3Jpem9udGFsQWxpZ25tZW50ID0gX2hvcml6b250YWxBbGlnbm1lbnQ7CisgICAgbmV3WGYuVmVydGljYWxBbGlnbm1lbnQgPSBfdmVydGljYWxBbGlnbm1lbnQ7CisgICAgbmV3WGYuV3JhcFRleHQgPSBfd3JhcFRleHQ7CisgICAgbmV3WGYuU2hyaW5rVG9GaXQgPSBfc2hyaW5rVG9GaXQ7CisgICAgbmV3WGYuSW5kZW50ID0gX2luZGVudDsKKyAgICBuZXdYZi5UZXh0Um90YXRpb24gPSBfdGV4dFJvdGF0aW9uOworICAgIG5ld1hmLkxvY2tlZCA9IF9sb2NrZWQ7CisgICAgbmV3WGYuSGlkZGVuID0gX2hpZGRlbjsKKyAgICByZXR1cm4gbmV3WGY7CisgIH0KKworICBpbnRlcm5hbCBpbnQgR2V0TmV3SWQoCisgICAgICBFeGNlbFN0eWxlQ29sbGVjdGlvbjxFeGNlbFhmcz4geGZzQ29sLAorICAgICAgU3R5bGVCYXNlIHN0eWxlT2JqZWN0LAorICAgICAgZVN0eWxlQ2xhc3Mgc3R5bGVDbGFzcywKKyAgICAgIGVTdHlsZVByb3BlcnR5IHN0eWxlUHJvcGVydHksCisgICAgICBvYmplY3QgdmFsdWUpIHsKKyAgICBFeGNlbFhmcyBuZXdYZnMgPSBDb3B5KCk7CisgICAgc3dpdGNoIChzdHlsZUNsYXNzKSB7CisgICAgICBjYXNlIGVTdHlsZUNsYXNzLk51bWJlcmZvcm1hdDoKKyAgICAgICAgbmV3WGZzLk51bWJlckZvcm1hdElkID0gR2V0SWROdW1iZXJGb3JtYXQoc3R5bGVQcm9wZXJ0eSwgdmFsdWUpOworICAgICAgICBzdHlsZU9iamVjdC5TZXRJbmRleChuZXdYZnMuTnVtYmVyRm9ybWF0SWQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuRm9udDogeworICAgICAgICBuZXdYZnMuRm9udElkID0gR2V0SWRGb250KHN0eWxlUHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgc3R5bGVPYmplY3QuU2V0SW5kZXgobmV3WGZzLkZvbnRJZCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBlU3R5bGVDbGFzcy5GaWxsOgorICAgICAgY2FzZSBlU3R5bGVDbGFzcy5GaWxsQmFja2dyb3VuZENvbG9yOgorICAgICAgY2FzZSBlU3R5bGVDbGFzcy5GaWxsUGF0dGVybkNvbG9yOgorICAgICAgICBuZXdYZnMuRmlsbElkID0gR2V0SWRGaWxsKHN0eWxlQ2xhc3MsIHN0eWxlUHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgc3R5bGVPYmplY3QuU2V0SW5kZXgobmV3WGZzLkZpbGxJZCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBlU3R5bGVDbGFzcy5HcmFkaWVudEZpbGw6CisgICAgICBjYXNlIGVTdHlsZUNsYXNzLkZpbGxHcmFkaWVudENvbG9yMToKKyAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuRmlsbEdyYWRpZW50Q29sb3IyOgorICAgICAgICBuZXdYZnMuRmlsbElkID0gR2V0SWRHcmFkaWVudEZpbGwoc3R5bGVDbGFzcywgc3R5bGVQcm9wZXJ0eSwgdmFsdWUpOworICAgICAgICBzdHlsZU9iamVjdC5TZXRJbmRleChuZXdYZnMuRmlsbElkKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlcjoKKyAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyQm90dG9tOgorICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJEaWFnb25hbDoKKyAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyTGVmdDoKKyAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyUmlnaHQ6CisgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlclRvcDoKKyAgICAgICAgbmV3WGZzLkJvcmRlcklkID0gR2V0SWRCb3JkZXIoc3R5bGVDbGFzcywgc3R5bGVQcm9wZXJ0eSwgdmFsdWUpOworICAgICAgICBzdHlsZU9iamVjdC5TZXRJbmRleChuZXdYZnMuQm9yZGVySWQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuU3R5bGU6CisgICAgICAgIHN3aXRjaCAoc3R5bGVQcm9wZXJ0eSkgeworICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuWGZJZDoKKyAgICAgICAgICAgIG5ld1hmcy5YZklkID0gKGludCl2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuSG9yaXpvbnRhbEFsaWduOgorICAgICAgICAgICAgbmV3WGZzLkhvcml6b250YWxBbGlnbm1lbnQgPSAoRXhjZWxIb3Jpem9udGFsQWxpZ25tZW50KXZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5WZXJ0aWNhbEFsaWduOgorICAgICAgICAgICAgbmV3WGZzLlZlcnRpY2FsQWxpZ25tZW50ID0gKEV4Y2VsVmVydGljYWxBbGlnbm1lbnQpdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LldyYXBUZXh0OgorICAgICAgICAgICAgbmV3WGZzLldyYXBUZXh0ID0gKGJvb2wpdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LlJlYWRpbmdPcmRlcjoKKyAgICAgICAgICAgIG5ld1hmcy5SZWFkaW5nT3JkZXIgPSAoRXhjZWxSZWFkaW5nT3JkZXIpdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LlNocmlua1RvRml0OgorICAgICAgICAgICAgbmV3WGZzLlNocmlua1RvRml0ID0gKGJvb2wpdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkluZGVudDoKKyAgICAgICAgICAgIG5ld1hmcy5JbmRlbnQgPSAoaW50KXZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5UZXh0Um90YXRpb246CisgICAgICAgICAgICBuZXdYZnMuVGV4dFJvdGF0aW9uID0gKGludCl2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuTG9ja2VkOgorICAgICAgICAgICAgbmV3WGZzLkxvY2tlZCA9IChib29sKXZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5IaWRkZW46CisgICAgICAgICAgICBuZXdYZnMuSGlkZGVuID0gKGJvb2wpdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgKG5ldygiSW52YWxpZCBwcm9wZXJ0eSBmb3IgY2xhc3Mgc3R5bGUuIikpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpbnQgaWQgPSB4ZnNDb2wuRmluZEluZGV4QnlJZChuZXdYZnMuSWQpOworICAgIGlmIChpZCA8IDApIHsKKyAgICAgIHJldHVybiB4ZnNDb2wuQWRkKG5ld1hmcy5JZCwgbmV3WGZzKTsKKyAgICB9CisgICAgcmV0dXJuIGlkOworICB9CisKKyAgcHJpdmF0ZSBpbnQgR2V0SWRCb3JkZXIoZVN0eWxlQ2xhc3Mgc3R5bGVDbGFzcywgZVN0eWxlUHJvcGVydHkgc3R5bGVQcm9wZXJ0eSwgb2JqZWN0IHZhbHVlKSB7CisgICAgRXhjZWxCb3JkZXJYbWwgYm9yZGVyID0gQm9yZGVyLkNvcHkoKTsKKworICAgIHN3aXRjaCAoc3R5bGVDbGFzcykgeworICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJCb3R0b206CisgICAgICAgIFNldEJvcmRlckl0ZW0oYm9yZGVyLkJvdHRvbSwgc3R5bGVQcm9wZXJ0eSwgdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZVN0eWxlQ2xhc3MuQm9yZGVyRGlhZ29uYWw6CisgICAgICAgIFNldEJvcmRlckl0ZW0oYm9yZGVyLkRpYWdvbmFsLCBzdHlsZVByb3BlcnR5LCB2YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJMZWZ0OgorICAgICAgICBTZXRCb3JkZXJJdGVtKGJvcmRlci5MZWZ0LCBzdHlsZVByb3BlcnR5LCB2YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXJSaWdodDoKKyAgICAgICAgU2V0Qm9yZGVySXRlbShib3JkZXIuUmlnaHQsIHN0eWxlUHJvcGVydHksIHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGVTdHlsZUNsYXNzLkJvcmRlclRvcDoKKyAgICAgICAgU2V0Qm9yZGVySXRlbShib3JkZXIuVG9wLCBzdHlsZVByb3BlcnR5LCB2YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBlU3R5bGVDbGFzcy5Cb3JkZXI6CisgICAgICAgIGlmIChzdHlsZVByb3BlcnR5ID09IGVTdHlsZVByb3BlcnR5LkJvcmRlckRpYWdvbmFsVXApIHsKKyAgICAgICAgICBib3JkZXIuRGlhZ29uYWxVcCA9IChib29sKXZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKHN0eWxlUHJvcGVydHkgPT0gZVN0eWxlUHJvcGVydHkuQm9yZGVyRGlhZ29uYWxEb3duKSB7CisgICAgICAgICAgYm9yZGVyLkRpYWdvbmFsRG93biA9IChib29sKXZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHRocm93IChuZXcoIkludmFsaWQgcHJvcGVydHkgZm9yIGNsYXNzIEJvcmRlci4iKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAobmV3KCJJbnZhbGlkIGNsYXNzL3Byb3BlcnR5IGZvciBjbGFzcyBCb3JkZXIuIikpOworICAgIH0KKyAgICBpbnQgc3ViSWQ7CisgICAgc3RyaW5nIGlkID0gYm9yZGVyLklkOworICAgIHN1YklkID0gX3N0eWxlcy5Cb3JkZXJzLkZpbmRJbmRleEJ5SWQoaWQpOworICAgIGlmIChzdWJJZCA9PSBpbnQuTWluVmFsdWUpIHsKKyAgICAgIHJldHVybiBfc3R5bGVzLkJvcmRlcnMuQWRkKGlkLCBib3JkZXIpOworICAgIH0KKyAgICByZXR1cm4gc3ViSWQ7CisgIH0KKworICBwcml2YXRlIHZvaWQgU2V0Qm9yZGVySXRlbSgKKyAgICAgIEV4Y2VsQm9yZGVySXRlbVhtbCBleGNlbEJvcmRlckl0ZW0sCisgICAgICBlU3R5bGVQcm9wZXJ0eSBzdHlsZVByb3BlcnR5LAorICAgICAgb2JqZWN0IHZhbHVlKSB7CisgICAgaWYgKHN0eWxlUHJvcGVydHkgPT0gZVN0eWxlUHJvcGVydHkuU3R5bGUpIHsKKyAgICAgIGV4Y2VsQm9yZGVySXRlbS5TdHlsZSA9IChFeGNlbEJvcmRlclN0eWxlKXZhbHVlOworICAgIH0gZWxzZSBpZiAoc3R5bGVQcm9wZXJ0eSA9PSBlU3R5bGVQcm9wZXJ0eS5Db2xvcgorICAgICAgICB8fCBzdHlsZVByb3BlcnR5ID09IGVTdHlsZVByb3BlcnR5LlRpbnQKKyAgICAgICAgfHwgc3R5bGVQcm9wZXJ0eSA9PSBlU3R5bGVQcm9wZXJ0eS5JbmRleGVkQ29sb3IpIHsKKyAgICAgIGlmIChleGNlbEJvcmRlckl0ZW0uU3R5bGUgPT0gRXhjZWxCb3JkZXJTdHlsZS5Ob25lKSB7CisgICAgICAgIHRocm93IChuZXcoIkNhbid0IHNldCBib3JkZXJjb2xvciB3aGVuIHN0eWxlIGlzIG5vdCBzZXQuIikpOworICAgICAgfQorICAgICAgZXhjZWxCb3JkZXJJdGVtLkNvbG9yLlJnYiA9IHZhbHVlLlRvU3RyaW5nKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBpbnQgR2V0SWRGaWxsKGVTdHlsZUNsYXNzIHN0eWxlQ2xhc3MsIGVTdHlsZVByb3BlcnR5IHN0eWxlUHJvcGVydHksIG9iamVjdCB2YWx1ZSkgeworICAgIEV4Y2VsRmlsbFhtbCBmaWxsID0gRmlsbC5Db3B5KCk7CisKKyAgICBzd2l0Y2ggKHN0eWxlUHJvcGVydHkpIHsKKyAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuUGF0dGVyblR5cGU6CisgICAgICAgIGlmIChmaWxsIGlzIEV4Y2VsR3JhZGllbnRGaWxsWG1sKSB7CisgICAgICAgICAgZmlsbCA9IG5ldyhOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgfQorICAgICAgICBmaWxsLlBhdHRlcm5UeXBlID0gKEV4Y2VsRmlsbFN0eWxlKXZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuQ29sb3I6CisgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LlRpbnQ6CisgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkluZGV4ZWRDb2xvcjoKKyAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuQXV0b0NvbG9yOgorICAgICAgICBpZiAoZmlsbCBpcyBFeGNlbEdyYWRpZW50RmlsbFhtbCkgeworICAgICAgICAgIGZpbGwgPSBuZXcoTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGwuUGF0dGVyblR5cGUgPT0gRXhjZWxGaWxsU3R5bGUuTm9uZSkgeworICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkNhbid0IHNldCBjb2xvciB3aGVuIHBhdHRlcm50eXBlIGlzIG5vdCBzZXQuIikpOworICAgICAgICB9CisgICAgICAgIEV4Y2VsQ29sb3JYbWwgZGVzdENvbG9yOworICAgICAgICBpZiAoc3R5bGVDbGFzcyA9PSBlU3R5bGVDbGFzcy5GaWxsUGF0dGVybkNvbG9yKSB7CisgICAgICAgICAgZGVzdENvbG9yID0gZmlsbC5QYXR0ZXJuQ29sb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGVzdENvbG9yID0gZmlsbC5CYWNrZ3JvdW5kQ29sb3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3R5bGVQcm9wZXJ0eSA9PSBlU3R5bGVQcm9wZXJ0eS5Db2xvcikgeworICAgICAgICAgIGRlc3RDb2xvci5SZ2IgPSB2YWx1ZS5Ub1N0cmluZygpOworICAgICAgICB9IGVsc2UgaWYgKHN0eWxlUHJvcGVydHkgPT0gZVN0eWxlUHJvcGVydHkuVGludCkgeworICAgICAgICAgIGRlc3RDb2xvci5UaW50ID0gKGRlY2ltYWwpdmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVQcm9wZXJ0eSA9PSBlU3R5bGVQcm9wZXJ0eS5JbmRleGVkQ29sb3IpIHsKKyAgICAgICAgICBkZXN0Q29sb3IuSW5kZXhlZCA9IChpbnQpdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGVzdENvbG9yLkF1dG8gPSAoYm9vbCl2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBjbGFzcy9wcm9wZXJ0eSBmb3IgY2xhc3MgRmlsbC4iKSk7CisgICAgfQorICAgIGludCBzdWJJZDsKKyAgICBzdHJpbmcgaWQgPSBmaWxsLklkOworICAgIHN1YklkID0gX3N0eWxlcy5GaWxscy5GaW5kSW5kZXhCeUlkKGlkKTsKKyAgICBpZiAoc3ViSWQgPT0gaW50Lk1pblZhbHVlKSB7CisgICAgICByZXR1cm4gX3N0eWxlcy5GaWxscy5BZGQoaWQsIGZpbGwpOworICAgIH0KKyAgICByZXR1cm4gc3ViSWQ7CisgIH0KKworICBwcml2YXRlIGludCBHZXRJZEdyYWRpZW50RmlsbCgKKyAgICAgIGVTdHlsZUNsYXNzIHN0eWxlQ2xhc3MsCisgICAgICBlU3R5bGVQcm9wZXJ0eSBzdHlsZVByb3BlcnR5LAorICAgICAgb2JqZWN0IHZhbHVlKSB7CisgICAgRXhjZWxHcmFkaWVudEZpbGxYbWwgZmlsbDsKKyAgICBpZiAoRmlsbCBpcyBFeGNlbEdyYWRpZW50RmlsbFhtbCkgeworICAgICAgZmlsbCA9IChFeGNlbEdyYWRpZW50RmlsbFhtbClGaWxsLkNvcHkoKTsKKyAgICB9IGVsc2UgeworICAgICAgZmlsbCA9IG5ldyhGaWxsLk5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgZmlsbC5HcmFkaWVudENvbG9yMS5TZXRDb2xvcihDb2xvci5XaGl0ZSk7CisgICAgICBmaWxsLkdyYWRpZW50Q29sb3IyLlNldENvbG9yKENvbG9yLkZyb21BcmdiKDc5LCAxMjksIDE4OSkpOworICAgICAgZmlsbC5UeXBlID0gRXhjZWxGaWxsR3JhZGllbnRUeXBlLkxpbmVhcjsKKyAgICAgIGZpbGwuRGVncmVlID0gOTA7CisgICAgICBmaWxsLlRvcCA9IGRvdWJsZS5OYU47CisgICAgICBmaWxsLkJvdHRvbSA9IGRvdWJsZS5OYU47CisgICAgICBmaWxsLkxlZnQgPSBkb3VibGUuTmFOOworICAgICAgZmlsbC5SaWdodCA9IGRvdWJsZS5OYU47CisgICAgfQorCisgICAgc3dpdGNoIChzdHlsZVByb3BlcnR5KSB7CisgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50VHlwZToKKyAgICAgICAgZmlsbC5UeXBlID0gKEV4Y2VsRmlsbEdyYWRpZW50VHlwZSl2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50RGVncmVlOgorICAgICAgICBmaWxsLkRlZ3JlZSA9IChkb3VibGUpdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5HcmFkaWVudFRvcDoKKyAgICAgICAgZmlsbC5Ub3AgPSAoZG91YmxlKXZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuR3JhZGllbnRCb3R0b206CisgICAgICAgIGZpbGwuQm90dG9tID0gKGRvdWJsZSl2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50TGVmdDoKKyAgICAgICAgZmlsbC5MZWZ0ID0gKGRvdWJsZSl2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkdyYWRpZW50UmlnaHQ6CisgICAgICAgIGZpbGwuUmlnaHQgPSAoZG91YmxlKXZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuQ29sb3I6CisgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LlRpbnQ6CisgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5LkluZGV4ZWRDb2xvcjoKKyAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuQXV0b0NvbG9yOgorICAgICAgICBFeGNlbENvbG9yWG1sIGRlc3RDb2xvcjsKKworICAgICAgICBpZiAoc3R5bGVDbGFzcyA9PSBlU3R5bGVDbGFzcy5GaWxsR3JhZGllbnRDb2xvcjEpIHsKKyAgICAgICAgICBkZXN0Q29sb3IgPSBmaWxsLkdyYWRpZW50Q29sb3IxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlc3RDb2xvciA9IGZpbGwuR3JhZGllbnRDb2xvcjI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3R5bGVQcm9wZXJ0eSA9PSBlU3R5bGVQcm9wZXJ0eS5Db2xvcikgeworICAgICAgICAgIGRlc3RDb2xvci5SZ2IgPSB2YWx1ZS5Ub1N0cmluZygpOworICAgICAgICB9IGVsc2UgaWYgKHN0eWxlUHJvcGVydHkgPT0gZVN0eWxlUHJvcGVydHkuVGludCkgeworICAgICAgICAgIGRlc3RDb2xvci5UaW50ID0gKGRlY2ltYWwpdmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoc3R5bGVQcm9wZXJ0eSA9PSBlU3R5bGVQcm9wZXJ0eS5JbmRleGVkQ29sb3IpIHsKKyAgICAgICAgICBkZXN0Q29sb3IuSW5kZXhlZCA9IChpbnQpdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGVzdENvbG9yLkF1dG8gPSAoYm9vbCl2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgY2xhc3MvcHJvcGVydHkgZm9yIGNsYXNzIEZpbGwuIikpOworICAgIH0KKyAgICBpbnQgc3ViSWQ7CisgICAgc3RyaW5nIGlkID0gZmlsbC5JZDsKKyAgICBzdWJJZCA9IF9zdHlsZXMuRmlsbHMuRmluZEluZGV4QnlJZChpZCk7CisgICAgaWYgKHN1YklkID09IGludC5NaW5WYWx1ZSkgeworICAgICAgcmV0dXJuIF9zdHlsZXMuRmlsbHMuQWRkKGlkLCBmaWxsKTsKKyAgICB9CisgICAgcmV0dXJuIHN1YklkOworICB9CisKKyAgcHJpdmF0ZSBpbnQgR2V0SWROdW1iZXJGb3JtYXQoZVN0eWxlUHJvcGVydHkgc3R5bGVQcm9wZXJ0eSwgb2JqZWN0IHZhbHVlKSB7CisgICAgaWYgKHN0eWxlUHJvcGVydHkgPT0gZVN0eWxlUHJvcGVydHkuRm9ybWF0KSB7CisgICAgICBFeGNlbE51bWJlckZvcm1hdFhtbCBpdGVtID0gbnVsbDsKKyAgICAgIGlmICghX3N0eWxlcy5OdW1iZXJGb3JtYXRzLkZpbmRCeUlkKHZhbHVlLlRvU3RyaW5nKCksIHJlZiBpdGVtKSkgeworICAgICAgICBpdGVtID0gbmV3KE5hbWVTcGFjZU1hbmFnZXIpIHsKKyAgICAgICAgICBGb3JtYXQgPSB2YWx1ZS5Ub1N0cmluZygpLAorICAgICAgICAgIE51bUZtdElkID0gX3N0eWxlcy5OdW1iZXJGb3JtYXRzLk5leHRJZCsrLAorICAgICAgICB9OworICAgICAgICBfc3R5bGVzLk51bWJlckZvcm1hdHMuQWRkKHZhbHVlLlRvU3RyaW5nKCksIGl0ZW0pOworICAgICAgfQorICAgICAgcmV0dXJuIGl0ZW0uTnVtRm10SWQ7CisgICAgfQorICAgIHRocm93IChuZXcoIkludmFsaWQgcHJvcGVydHkgZm9yIGNsYXNzIE51bWJlcmZvcm1hdCIpKTsKKyAgfQorCisgIHByaXZhdGUgaW50IEdldElkRm9udChlU3R5bGVQcm9wZXJ0eSBzdHlsZVByb3BlcnR5LCBvYmplY3QgdmFsdWUpIHsKKyAgICBFeGNlbEZvbnRYbWwgZm50ID0gRm9udC5Db3B5KCk7CisKKyAgICBzd2l0Y2ggKHN0eWxlUHJvcGVydHkpIHsKKyAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuTmFtZToKKyAgICAgICAgZm50Lk5hbWUgPSB2YWx1ZS5Ub1N0cmluZygpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuU2l6ZToKKyAgICAgICAgZm50LlNpemUgPSAoZmxvYXQpdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5GYW1pbHk6CisgICAgICAgIGZudC5GYW1pbHkgPSAoaW50KXZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuQm9sZDoKKyAgICAgICAgZm50LkJvbGQgPSAoYm9vbCl2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGVTdHlsZVByb3BlcnR5Lkl0YWxpYzoKKyAgICAgICAgZm50Lkl0YWxpYyA9IChib29sKXZhbHVlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZVN0eWxlUHJvcGVydHkuU3RyaWtlOgorICAgICAgICBmbnQuU3RyaWtlID0gKGJvb2wpdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5VbmRlcmxpbmVUeXBlOgorICAgICAgICBmbnQuVW5kZXJMaW5lVHlwZSA9IChFeGNlbFVuZGVyTGluZVR5cGUpdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5Db2xvcjoKKyAgICAgICAgZm50LkNvbG9yLlJnYiA9IHZhbHVlLlRvU3RyaW5nKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBlU3R5bGVQcm9wZXJ0eS5WZXJ0aWNhbEFsaWduOgorICAgICAgICBmbnQuVmVydGljYWxBbGlnbiA9CisgICAgICAgICAgICAoKEV4Y2VsVmVydGljYWxBbGlnbm1lbnRGb250KXZhbHVlKSA9PSBFeGNlbFZlcnRpY2FsQWxpZ25tZW50Rm9udC5Ob25lCisgICAgICAgICAgICAgICAgPyAiIgorICAgICAgICAgICAgICAgIDogdmFsdWUuVG9TdHJpbmcoKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IChuZXcoIkludmFsaWQgcHJvcGVydHkgZm9yIGNsYXNzIEZvbnQiKSk7CisgICAgfQorICAgIGludCBzdWJJZDsKKyAgICBzdHJpbmcgaWQgPSBmbnQuSWQ7CisgICAgc3ViSWQgPSBfc3R5bGVzLkZvbnRzLkZpbmRJbmRleEJ5SWQoaWQpOworICAgIGlmIChzdWJJZCA9PSBpbnQuTWluVmFsdWUpIHsKKyAgICAgIHJldHVybiBfc3R5bGVzLkZvbnRzLkFkZChpZCwgZm50KTsKKyAgICB9CisgICAgcmV0dXJuIHN1YklkOworICB9CisKKyAgaW50ZXJuYWwgb3ZlcnJpZGUgWG1sTm9kZSBDcmVhdGVYbWxOb2RlKFhtbE5vZGUgdG9wTm9kZSkgeworICAgIHJldHVybiBDcmVhdGVYbWxOb2RlKHRvcE5vZGUsIGZhbHNlKTsKKyAgfQorCisgIGludGVybmFsIFhtbE5vZGUgQ3JlYXRlWG1sTm9kZShYbWxOb2RlIHRvcE5vZGUsIGJvb2wgaXNDZWxsU3R5bGVYc2YpIHsKKyAgICBUb3BOb2RlID0gdG9wTm9kZTsKKyAgICB2YXIgZG9TZXRYZklkID0KKyAgICAgICAgKCFpc0NlbGxTdHlsZVhzZgorICAgICAgICAgICAgJiYgX3hmSUQgPiBpbnQuTWluVmFsdWUKKyAgICAgICAgICAgICYmIF9zdHlsZXMuQ2VsbFN0eWxlWGZzLkNvdW50ID4gMAorICAgICAgICAgICAgJiYgX3N0eWxlcy5DZWxsU3R5bGVYZnNbX3hmSURdLm5ld0lEID4gaW50Lk1pblZhbHVlKTsKKyAgICBpZiAoX251bUZtdElkID4gMCkgeworICAgICAgU2V0WG1sTm9kZVN0cmluZygiQG51bUZtdElkIiwgX251bUZtdElkLlRvU3RyaW5nKCkpOworICAgICAgaWYgKGRvU2V0WGZJZCkgeworICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAYXBwbHlOdW1iZXJGb3JtYXQiLCAiMSIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoX2ZvbnRJZCA+PSAwKSB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAZm9udElkIiwgX3N0eWxlcy5Gb250c1tfZm9udElkXS5uZXdJRC5Ub1N0cmluZygpKTsKKyAgICAgIGlmIChkb1NldFhmSWQpIHsKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGFwcGx5Rm9udCIsICIxIik7CisgICAgICB9CisgICAgfQorICAgIGlmIChfZmlsbElkID49IDApIHsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBmaWxsSWQiLCBfc3R5bGVzLkZpbGxzW19maWxsSWRdLm5ld0lELlRvU3RyaW5nKCkpOworICAgICAgaWYgKGRvU2V0WGZJZCkgeworICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAYXBwbHlGaWxsIiwgIjEiKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKF9ib3JkZXJJZCA+PSAwKSB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAYm9yZGVySWQiLCBfc3R5bGVzLkJvcmRlcnNbX2JvcmRlcklkXS5uZXdJRC5Ub1N0cmluZygpKTsKKyAgICAgIGlmIChkb1NldFhmSWQpIHsKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGFwcGx5Qm9yZGVyIiwgIjEiKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKF9ob3Jpem9udGFsQWxpZ25tZW50ICE9IEV4Y2VsSG9yaXpvbnRhbEFsaWdubWVudC5HZW5lcmFsKSB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9ob3Jpem9udGFsQWxpZ25QYXRoLCBTZXRBbGlnblN0cmluZyhfaG9yaXpvbnRhbEFsaWdubWVudCkpOworICAgIH0KKyAgICBpZiAoZG9TZXRYZklkKSB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAeGZJZCIsIF9zdHlsZXMuQ2VsbFN0eWxlWGZzW194ZklEXS5uZXdJRC5Ub1N0cmluZygpKTsKKyAgICB9CisgICAgaWYgKF92ZXJ0aWNhbEFsaWdubWVudCAhPSBFeGNlbFZlcnRpY2FsQWxpZ25tZW50LkJvdHRvbSkgeworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfdmVydGljYWxBbGlnblBhdGgsIFNldEFsaWduU3RyaW5nKF92ZXJ0aWNhbEFsaWdubWVudCkpOworICAgIH0KKyAgICBpZiAoX3dyYXBUZXh0KSB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF93cmFwVGV4dFBhdGgsICIxIik7CisgICAgfQorICAgIGlmIChfcmVhZGluZ09yZGVyICE9IEV4Y2VsUmVhZGluZ09yZGVyLkNvbnRleHREZXBlbmRlbnQpIHsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3JlYWRpbmdPcmRlclBhdGgsICgoaW50KV9yZWFkaW5nT3JkZXIpLlRvU3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoX3Nocmlua1RvRml0KSB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9zaHJpbmtUb0ZpdFBhdGgsICIxIik7CisgICAgfQorICAgIGlmIChfaW5kZW50ID4gMCkgeworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfaW5kZW50UGF0aCwgX2luZGVudC5Ub1N0cmluZygpKTsKKyAgICB9CisgICAgaWYgKF90ZXh0Um90YXRpb24gPiAwKSB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKHRleHRSb3RhdGlvblBhdGgsIF90ZXh0Um90YXRpb24uVG9TdHJpbmcoKSk7CisgICAgfQorICAgIGlmICghX2xvY2tlZCkgeworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbG9ja2VkUGF0aCwgIjAiKTsKKyAgICB9CisgICAgaWYgKF9oaWRkZW4pIHsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2hpZGRlblBhdGgsICIxIik7CisgICAgfQorICAgIHJldHVybiBUb3BOb2RlOworICB9CisKKyAgcHJpdmF0ZSBzdHJpbmcgU2V0QWxpZ25TdHJpbmcoRW51bSBhbGlnbikgeworICAgIHN0cmluZyBuZXdOYW1lID0gRW51bS5HZXROYW1lKGFsaWduLkdldFR5cGUoKSwgYWxpZ24pOworICAgIHJldHVybiBuZXdOYW1lLlN1YnN0cmluZygwLCAxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpCisgICAgICAgICsgbmV3TmFtZS5TdWJzdHJpbmcoMSwgbmV3TmFtZS5MZW5ndGggLSAxKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9TdHlsZVhtbEhlbHBlci5jcyBiL0VQUGx1cy9TdHlsZS9YbWxBY2Nlc3MvU3R5bGVYbWxIZWxwZXIuY3MKaW5kZXggOTdlYWVmYy4uZjczNWVmMyAxMDA2NDQKLS0tIGEvRVBQbHVzL1N0eWxlL1htbEFjY2Vzcy9TdHlsZVhtbEhlbHBlci5jcworKysgYi9FUFBsdXMvU3R5bGUvWG1sQWNjZXNzL1N0eWxlWG1sSGVscGVyLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw2NiArMTMsNTQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OworCiB1c2luZyBTeXN0ZW0uWG1sOwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBYbWwgaGVscGVyIGNsYXNzIGZvciBjZWxsIHN0eWxlIGNsYXNzZXMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyAgU3R5bGVYbWxIZWxwZXIgOiBYbWxIZWxwZXIKLSAgICB7Ci0gICAgICAgIGludGVybmFsIFN0eWxlWG1sSGVscGVyKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlcikgOiBiYXNlKG5hbWVTcGFjZU1hbmFnZXIpCi0gICAgICAgIHsgCiAKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBTdHlsZVhtbEhlbHBlcihYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVTcGFjZU1hbmFnZXIsIFhtbE5vZGUgdG9wTm9kZSkgOiBiYXNlKG5hbWVTcGFjZU1hbmFnZXIsIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBhYnN0cmFjdCBYbWxOb2RlIENyZWF0ZVhtbE5vZGUoWG1sTm9kZSB0b3ApOwotICAgICAgICBpbnRlcm5hbCBhYnN0cmFjdCBzdHJpbmcgSWQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGxvbmcgdXNlQ250PTA7Ci0gICAgICAgIGludGVybmFsIGludCBuZXdJRD1pbnQuTWluVmFsdWU7Ci0gICAgICAgIHByb3RlY3RlZCBib29sIEdldEJvb2xWYWx1ZShYbWxOb2RlIHRvcE5vZGUsIHN0cmluZyBwYXRoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbm9kZSA9IHRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShwYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGlmIChub2RlIGlzIFhtbEF0dHJpYnV0ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5WYWx1ZSAhPSAiMCI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCAmJiAoKG5vZGUuQXR0cmlidXRlc1sidmFsIl0gIT0gbnVsbCAmJiBub2RlLkF0dHJpYnV0ZXNbInZhbCJdLlZhbHVlICE9ICIwIikgfHwgbm9kZS5BdHRyaWJ1dGVzWyJ2YWwiXSA9PSBudWxsKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGUuWG1sQWNjZXNzOwogCisvLy8gPHN1bW1hcnk+CisvLy8gWG1sIGhlbHBlciBjbGFzcyBmb3IgY2VsbCBzdHlsZSBjbGFzc2VzCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGFic3RyYWN0IGNsYXNzIFN0eWxlWG1sSGVscGVyIDogWG1sSGVscGVyIHsKKyAgaW50ZXJuYWwgU3R5bGVYbWxIZWxwZXIoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyKQorICAgICAgOiBiYXNlKG5hbWVTcGFjZU1hbmFnZXIpIHt9CisKKyAgaW50ZXJuYWwgU3R5bGVYbWxIZWxwZXIoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLCBYbWxOb2RlIHRvcE5vZGUpCisgICAgICA6IGJhc2UobmFtZVNwYWNlTWFuYWdlciwgdG9wTm9kZSkge30KKworICBpbnRlcm5hbCBhYnN0cmFjdCBYbWxOb2RlIENyZWF0ZVhtbE5vZGUoWG1sTm9kZSB0b3ApOworCisgIGludGVybmFsIGFic3RyYWN0IHN0cmluZyBJZCB7IGdldDsgfQorCisgIGludGVybmFsIGxvbmcgdXNlQ250ID0gMDsKKyAgaW50ZXJuYWwgaW50IG5ld0lEID0gaW50Lk1pblZhbHVlOworCisgIHByb3RlY3RlZCBib29sIEdldEJvb2xWYWx1ZShYbWxOb2RlIHRvcE5vZGUsIHN0cmluZyBwYXRoKSB7CisgICAgdmFyIG5vZGUgPSB0b3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUocGF0aCwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgaWYgKG5vZGUgaXMgWG1sQXR0cmlidXRlKSB7CisgICAgICByZXR1cm4gbm9kZS5WYWx1ZSAhPSAiMCI7CiAgICAgfQorICAgIGlmIChub2RlICE9IG51bGwKKyAgICAgICAgJiYgKChub2RlLkF0dHJpYnV0ZXNbInZhbCJdICE9IG51bGwgJiYgbm9kZS5BdHRyaWJ1dGVzWyJ2YWwiXS5WYWx1ZSAhPSAiMCIpCisgICAgICAgICAgICAgICAgfHwgbm9kZS5BdHRyaWJ1dGVzWyJ2YWwiXSA9PSBudWxsKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1RhYmxlL0V4Y2VsVGFibGUuY3MgYi9FUFBsdXMvVGFibGUvRXhjZWxUYWJsZS5jcwppbmRleCAxZDU4YTAxLi4wYjkxNDRhIDEwMDY0NAotLS0gYS9FUFBsdXMvVGFibGUvRXhjZWxUYWJsZS5jcworKysgYi9FUFBsdXMvVGFibGUvRXhjZWxUYWJsZS5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsNjI3ICsxMyw1MjQgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMzAtQVVHLTIwMTAKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwordXNpbmcgU3lzdGVtLlNlY3VyaXR5OwogdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uWG1sOwogdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwotdXNpbmcgT2ZmaWNlT3BlblhtbC5Gb3JtdWxhUGFyc2luZy5FeGNlbC5GdW5jdGlvbnMuTWF0aDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZzsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlRhYmxlCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUYWJsZSBzdHlsZSBFbnVtCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBUYWJsZVN0eWxlcwotICAgIHsKLSAgICAgICAgTm9uZSwKLSAgICAgICAgQ3VzdG9tLAotICAgICAgICBMaWdodDEsCi0gICAgICAgIExpZ2h0MiwKLSAgICAgICAgTGlnaHQzLAotICAgICAgICBMaWdodDQsCi0gICAgICAgIExpZ2h0NSwKLSAgICAgICAgTGlnaHQ2LAotICAgICAgICBMaWdodDcsCi0gICAgICAgIExpZ2h0OCwKLSAgICAgICAgTGlnaHQ5LAotICAgICAgICBMaWdodDEwLAotICAgICAgICBMaWdodDExLAotICAgICAgICBMaWdodDEyLAotICAgICAgICBMaWdodDEzLAotICAgICAgICBMaWdodDE0LAotICAgICAgICBMaWdodDE1LAotICAgICAgICBMaWdodDE2LAotICAgICAgICBMaWdodDE3LAotICAgICAgICBMaWdodDE4LAotICAgICAgICBMaWdodDE5LAotICAgICAgICBMaWdodDIwLAotICAgICAgICBMaWdodDIxLAotICAgICAgICBNZWRpdW0xLAotICAgICAgICBNZWRpdW0yLAotICAgICAgICBNZWRpdW0zLAotICAgICAgICBNZWRpdW00LAotICAgICAgICBNZWRpdW01LAotICAgICAgICBNZWRpdW02LAotICAgICAgICBNZWRpdW03LAotICAgICAgICBNZWRpdW04LAotICAgICAgICBNZWRpdW05LAotICAgICAgICBNZWRpdW0xMCwKLSAgICAgICAgTWVkaXVtMTEsCi0gICAgICAgIE1lZGl1bTEyLAotICAgICAgICBNZWRpdW0xMywKLSAgICAgICAgTWVkaXVtMTQsCi0gICAgICAgIE1lZGl1bTE1LAotICAgICAgICBNZWRpdW0xNiwKLSAgICAgICAgTWVkaXVtMTcsCi0gICAgICAgIE1lZGl1bTE4LAotICAgICAgICBNZWRpdW0xOSwKLSAgICAgICAgTWVkaXVtMjAsCi0gICAgICAgIE1lZGl1bTIxLAotICAgICAgICBNZWRpdW0yMiwKLSAgICAgICAgTWVkaXVtMjMsCi0gICAgICAgIE1lZGl1bTI0LAotICAgICAgICBNZWRpdW0yNSwKLSAgICAgICAgTWVkaXVtMjYsCi0gICAgICAgIE1lZGl1bTI3LAotICAgICAgICBNZWRpdW0yOCwKLSAgICAgICAgRGFyazEsCi0gICAgICAgIERhcmsyLAotICAgICAgICBEYXJrMywKLSAgICAgICAgRGFyazQsCi0gICAgICAgIERhcms1LAotICAgICAgICBEYXJrNiwKLSAgICAgICAgRGFyazcsCi0gICAgICAgIERhcms4LAotICAgICAgICBEYXJrOSwKLSAgICAgICAgRGFyazEwLAotICAgICAgICBEYXJrMTEsCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5UYWJsZTsKKworLy8vIDxzdW1tYXJ5PgorLy8vIFRhYmxlIHN0eWxlIEVudW0KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgZW51bSBUYWJsZVN0eWxlcyB7CisgIE5vbmUsCisgIEN1c3RvbSwKKyAgTGlnaHQxLAorICBMaWdodDIsCisgIExpZ2h0MywKKyAgTGlnaHQ0LAorICBMaWdodDUsCisgIExpZ2h0NiwKKyAgTGlnaHQ3LAorICBMaWdodDgsCisgIExpZ2h0OSwKKyAgTGlnaHQxMCwKKyAgTGlnaHQxMSwKKyAgTGlnaHQxMiwKKyAgTGlnaHQxMywKKyAgTGlnaHQxNCwKKyAgTGlnaHQxNSwKKyAgTGlnaHQxNiwKKyAgTGlnaHQxNywKKyAgTGlnaHQxOCwKKyAgTGlnaHQxOSwKKyAgTGlnaHQyMCwKKyAgTGlnaHQyMSwKKyAgTWVkaXVtMSwKKyAgTWVkaXVtMiwKKyAgTWVkaXVtMywKKyAgTWVkaXVtNCwKKyAgTWVkaXVtNSwKKyAgTWVkaXVtNiwKKyAgTWVkaXVtNywKKyAgTWVkaXVtOCwKKyAgTWVkaXVtOSwKKyAgTWVkaXVtMTAsCisgIE1lZGl1bTExLAorICBNZWRpdW0xMiwKKyAgTWVkaXVtMTMsCisgIE1lZGl1bTE0LAorICBNZWRpdW0xNSwKKyAgTWVkaXVtMTYsCisgIE1lZGl1bTE3LAorICBNZWRpdW0xOCwKKyAgTWVkaXVtMTksCisgIE1lZGl1bTIwLAorICBNZWRpdW0yMSwKKyAgTWVkaXVtMjIsCisgIE1lZGl1bTIzLAorICBNZWRpdW0yNCwKKyAgTWVkaXVtMjUsCisgIE1lZGl1bTI2LAorICBNZWRpdW0yNywKKyAgTWVkaXVtMjgsCisgIERhcmsxLAorICBEYXJrMiwKKyAgRGFyazMsCisgIERhcms0LAorICBEYXJrNSwKKyAgRGFyazYsCisgIERhcms3LAorICBEYXJrOCwKKyAgRGFyazksCisgIERhcmsxMCwKKyAgRGFyazExLAorfQorCisvLy8gPHN1bW1hcnk+CisvLy8gQW4gRXhjZWwgVGFibGUKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxUYWJsZSA6IFhtbEhlbHBlciwgSUVxdWFsaXR5Q29tcGFyZXI8RXhjZWxUYWJsZT4geworICBpbnRlcm5hbCBFeGNlbFRhYmxlKFppcFBhY2thZ2VSZWxhdGlvbnNoaXAgcmVsLCBFeGNlbFdvcmtzaGVldCBzaGVldCkKKyAgICAgIDogYmFzZShzaGVldC5OYW1lU3BhY2VNYW5hZ2VyKSB7CisgICAgV29ya1NoZWV0ID0gc2hlZXQ7CisgICAgVGFibGVVcmkgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSk7CisgICAgUmVsYXRpb25zaGlwSUQgPSByZWwuSWQ7CisgICAgdmFyIHBjayA9IHNoZWV0Ll9wYWNrYWdlLlBhY2thZ2U7CisgICAgUGFydCA9IHBjay5HZXRQYXJ0KFRhYmxlVXJpKTsKKworICAgIFRhYmxlWG1sID0gbmV3KCk7CisgICAgTG9hZFhtbFNhZmUoVGFibGVYbWwsIFBhcnQuR2V0U3RyZWFtKCkpOworICAgIEluaXQoKTsKKyAgICBBZGRyZXNzID0gbmV3KEdldFhtbE5vZGVTdHJpbmcoIkByZWYiKSk7CisgIH0KKworICBpbnRlcm5hbCBFeGNlbFRhYmxlKEV4Y2VsV29ya3NoZWV0IHNoZWV0LCBFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MsIHN0cmluZyBuYW1lLCBpbnQgdGJsSWQpCisgICAgICA6IGJhc2Uoc2hlZXQuTmFtZVNwYWNlTWFuYWdlcikgeworICAgIFdvcmtTaGVldCA9IHNoZWV0OworICAgIEFkZHJlc3MgPSBhZGRyZXNzOworICAgIFRhYmxlWG1sID0gbmV3KCk7CisgICAgTG9hZFhtbFNhZmUoVGFibGVYbWwsIEdldFN0YXJ0WG1sKG5hbWUsIHRibElkKSwgRW5jb2RpbmcuVVRGOCk7CisgICAgVG9wTm9kZSA9IFRhYmxlWG1sLkRvY3VtZW50RWxlbWVudDsKKworICAgIEluaXQoKTsKKworICAgIC8vSWYgdGhlIHRhYmxlIGlzIGp1c3Qgb25lIHJvdyB3ZSBjYW4gbm90IGhhdmUgYSBoZWFkZXIuCisgICAgaWYgKGFkZHJlc3MuX2Zyb21Sb3cgPT0gYWRkcmVzcy5fdG9Sb3cpIHsKKyAgICAgIFNob3dIZWFkZXIgPSBmYWxzZTsKICAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBbiBFeGNlbCBUYWJsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsVGFibGUgOiBYbWxIZWxwZXIsIElFcXVhbGl0eUNvbXBhcmVyPEV4Y2VsVGFibGU+Ci0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbFRhYmxlKFBhY2thZ2luZy5aaXBQYWNrYWdlUmVsYXRpb25zaGlwIHJlbCwgRXhjZWxXb3Jrc2hlZXQgc2hlZXQpIDogCi0gICAgICAgICAgICBiYXNlKHNoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdvcmtTaGVldCA9IHNoZWV0OwotICAgICAgICAgICAgVGFibGVVcmkgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSk7Ci0gICAgICAgICAgICBSZWxhdGlvbnNoaXBJRCA9IHJlbC5JZDsKLSAgICAgICAgICAgIHZhciBwY2sgPSBzaGVldC5fcGFja2FnZS5QYWNrYWdlOwotICAgICAgICAgICAgUGFydD1wY2suR2V0UGFydChUYWJsZVVyaSk7CisgIH0KIAotICAgICAgICAgICAgVGFibGVYbWwgPSBuZXcgWG1sRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIExvYWRYbWxTYWZlKFRhYmxlWG1sLCBQYXJ0LkdldFN0cmVhbSgpKTsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgICAgIEFkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzQmFzZShHZXRYbWxOb2RlU3RyaW5nKCJAcmVmIikpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsVGFibGUoRXhjZWxXb3Jrc2hlZXQgc2hlZXQsIEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcywgc3RyaW5nIG5hbWUsIGludCB0YmxJZCkgOiAKLSAgICAgICAgICAgIGJhc2Uoc2hlZXQuTmFtZVNwYWNlTWFuYWdlcikKLQkgICAgewotICAgICAgICAgICAgV29ya1NoZWV0ID0gc2hlZXQ7Ci0gICAgICAgICAgICBBZGRyZXNzID0gYWRkcmVzczsKLSAgICAgICAgICAgIFRhYmxlWG1sID0gbmV3IFhtbERvY3VtZW50KCk7Ci0gICAgICAgICAgICBMb2FkWG1sU2FmZShUYWJsZVhtbCwgR2V0U3RhcnRYbWwobmFtZSwgdGJsSWQpLCBFbmNvZGluZy5VVEY4KTsgCi0gICAgICAgICAgICBUb3BOb2RlID0gVGFibGVYbWwuRG9jdW1lbnRFbGVtZW50OworICBwcml2YXRlIHZvaWQgSW5pdCgpIHsKKyAgICBUb3BOb2RlID0gVGFibGVYbWwuRG9jdW1lbnRFbGVtZW50OworICAgIFNjaGVtYU5vZGVPcmRlciA9IG5ld1tdIHsgImF1dG9GaWx0ZXIiLCAidGFibGVDb2x1bW5zIiwgInRhYmxlU3R5bGVJbmZvIiB9OworICB9CiAKLSAgICAgICAgICAgIGluaXQoKTsKKyAgcHJpdmF0ZSBzdHJpbmcgR2V0U3RhcnRYbWwoc3RyaW5nIG5hbWUsIGludCB0YmxJZCkgeworICAgIHN0cmluZyB4bWwgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCIgPz4iOworICAgIHhtbCArPSBzdHJpbmcuRm9ybWF0KAorICAgICAgICAiPHRhYmxlIHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCIgaWQ9XCJ7MH1cIiBuYW1lPVwiezF9XCIgZGlzcGxheU5hbWU9XCJ7Mn1cIiByZWY9XCJ7M31cIiBoZWFkZXJSb3dDb3VudD1cIjFcIj4iLAorICAgICAgICB0YmxJZCwKKyAgICAgICAgbmFtZSwKKyAgICAgICAgQ2xlYW5EaXNwbGF5TmFtZShuYW1lKSwKKyAgICAgICAgQWRkcmVzcy5BZGRyZXNzKTsKKyAgICB4bWwgKz0gc3RyaW5nLkZvcm1hdCgiPGF1dG9GaWx0ZXIgcmVmPVwiezB9XCIgLz4iLCBBZGRyZXNzLkFkZHJlc3MpOwogCi0gICAgICAgICAgICAvL0lmIHRoZSB0YWJsZSBpcyBqdXN0IG9uZSByb3cgd2UgY2FuIG5vdCBoYXZlIGEgaGVhZGVyLgotICAgICAgICAgICAgaWYgKGFkZHJlc3MuX2Zyb21Sb3cgPT0gYWRkcmVzcy5fdG9Sb3cpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2hvd0hlYWRlciA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBUb3BOb2RlID0gVGFibGVYbWwuRG9jdW1lbnRFbGVtZW50OwotICAgICAgICAgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3IHN0cmluZ1tdIHsgImF1dG9GaWx0ZXIiLCAidGFibGVDb2x1bW5zIiwgInRhYmxlU3R5bGVJbmZvIiB9OwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIEdldFN0YXJ0WG1sKHN0cmluZyBuYW1lLCBpbnQgdGJsSWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyB4bWwgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiBzdGFuZGFsb25lPVwieWVzXCIgPz4iOwotICAgICAgICAgICAgeG1sICs9IHN0cmluZy5Gb3JtYXQoIjx0YWJsZSB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiIGlkPVwiezB9XCIgbmFtZT1cInsxfVwiIGRpc3BsYXlOYW1lPVwiezJ9XCIgcmVmPVwiezN9XCIgaGVhZGVyUm93Q291bnQ9XCIxXCI+IiwKLSAgICAgICAgICAgIHRibElkLAotICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgIGNsZWFuRGlzcGxheU5hbWUobmFtZSksCi0gICAgICAgICAgICBBZGRyZXNzLkFkZHJlc3MpOwotICAgICAgICAgICAgeG1sICs9IHN0cmluZy5Gb3JtYXQoIjxhdXRvRmlsdGVyIHJlZj1cInswfVwiIC8+IiwgQWRkcmVzcy5BZGRyZXNzKTsKLQotICAgICAgICAgICAgaW50IGNvbHM9QWRkcmVzcy5fdG9Db2wtQWRkcmVzcy5fZnJvbUNvbCsxOwotICAgICAgICAgICAgeG1sICs9IHN0cmluZy5Gb3JtYXQoIjx0YWJsZUNvbHVtbnMgY291bnQ9XCJ7MH1cIj4iLGNvbHMpOwotICAgICAgICAgICAgdmFyIG5hbWVzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBzdHJpbmc+KCk7ICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IoaW50IGk9MTtpPD1jb2xzO2krKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgY2VsbCA9IFdvcmtTaGVldC5DZWxsc1tBZGRyZXNzLl9mcm9tUm93LCBBZGRyZXNzLl9mcm9tQ29sK2ktMV07Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGNvbE5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKGNlbGwuVmFsdWUgPT0gbnVsbCB8fCBuYW1lcy5Db250YWluc0tleShjZWxsLlZhbHVlLlRvU3RyaW5nKCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy9HZXQgYW4gdW5pcXVlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgaW50IGE9aTsKLSAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY29sTmFtZSA9IHN0cmluZy5Gb3JtYXQoIkNvbHVtbnswfSIsIGErKyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5hbWVzLkNvbnRhaW5zS2V5KGNvbE5hbWUpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29sTmFtZSA9IFN5c3RlbS5TZWN1cml0eS5TZWN1cml0eUVsZW1lbnQuRXNjYXBlKGNlbGwuVmFsdWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5hbWVzLkFkZChjb2xOYW1lLCBjb2xOYW1lKTsKLSAgICAgICAgICAgICAgICB4bWwgKz0gc3RyaW5nLkZvcm1hdCgiPHRhYmxlQ29sdW1uIGlkPVwiezB9XCIgbmFtZT1cInsxfVwiIC8+IiwgaSxjb2xOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHhtbCArPSAiPC90YWJsZUNvbHVtbnM+IjsKLSAgICAgICAgICAgIHhtbCArPSAiPHRhYmxlU3R5bGVJbmZvIG5hbWU9XCJUYWJsZVN0eWxlTWVkaXVtOVwiIHNob3dGaXJzdENvbHVtbj1cIjBcIiBzaG93TGFzdENvbHVtbj1cIjBcIiBzaG93Um93U3RyaXBlcz1cIjFcIiBzaG93Q29sdW1uU3RyaXBlcz1cIjBcIiAvPiAiOwotICAgICAgICAgICAgeG1sICs9ICI8L3RhYmxlPiI7Ci0KLSAgICAgICAgICAgIHJldHVybiB4bWw7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgY2xlYW5EaXNwbGF5TmFtZShzdHJpbmcgbmFtZSkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBSZWdleC5SZXBsYWNlKG5hbWUsIEAiW15cd1wuLV9dIiwgIl8iKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBQYWNrYWdpbmcuWmlwUGFja2FnZVBhcnQgUGFydAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBYTUwgZGF0YSByZXByZXNlbnRpbmcgdGhlIHRhYmxlIGluIHRoZSBwYWNrYWdlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgWG1sRG9jdW1lbnQgVGFibGVYbWwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgc2V0OwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBwYWNrYWdlIGludGVybmFsIFVSSSB0byB0aGUgVGFibGUgWG1sIERvY3VtZW50LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgVXJpIFRhYmxlVXJpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIGludGVybmFsIHNldDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgUmVsYXRpb25zaGlwSUQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgc2V0OwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBJRF9QQVRIID0gIkBpZCI7Ci0gICAgICAgIGludGVybmFsIGludCBJZCAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoSURfUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKElEX1BBVEgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBOQU1FX1BBVEggPSAiQG5hbWUiOwotICAgICAgICBjb25zdCBzdHJpbmcgRElTUExBWV9OQU1FX1BBVEggPSAiQGRpc3BsYXlOYW1lIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIG9iamVjdCBpbiBFeGNlbAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoTkFNRV9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldCAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZihXb3JrU2hlZXQuV29ya2Jvb2suRXhpc3RzVGFibGVOYW1lKHZhbHVlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRhYmxlbmFtZSBpcyBub3QgdW5pcXVlIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdHJpbmcgcHJldk5hbWUgPSBOYW1lOwotICAgICAgICAgICAgICAgIGlmIChXb3JrU2hlZXQuVGFibGVzLl90YWJsZU5hbWVzLkNvbnRhaW5zS2V5KHByZXZOYW1lKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpeD1Xb3JrU2hlZXQuVGFibGVzLl90YWJsZU5hbWVzW3ByZXZOYW1lXTsKLSAgICAgICAgICAgICAgICAgICAgV29ya1NoZWV0LlRhYmxlcy5fdGFibGVOYW1lcy5SZW1vdmUocHJldk5hbWUpOwotICAgICAgICAgICAgICAgICAgICBXb3JrU2hlZXQuVGFibGVzLl90YWJsZU5hbWVzLkFkZCh2YWx1ZSxpeCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoTkFNRV9QQVRILCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhESVNQTEFZX05BTUVfUEFUSCwgY2xlYW5EaXNwbGF5TmFtZSh2YWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB3b3Jrc2hlZXQgb2YgdGhlIHRhYmxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFdvcmtzaGVldCBXb3JrU2hlZXQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgc2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBFeGNlbEFkZHJlc3NCYXNlIF9hZGRyZXNzID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGFkZHJlc3Mgb2YgdGhlIHRhYmxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbEFkZHJlc3NCYXNlIEFkZHJlc3MKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9hZGRyZXNzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2FkZHJlc3MgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAcmVmIix2YWx1ZS5BZGRyZXNzKTsKLSAgICAgICAgICAgICAgICBXcml0ZUF1dG9GaWx0ZXIoU2hvd1RvdGFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBFeGNlbFRhYmxlQ29sdW1uQ29sbGVjdGlvbiBfY29scyA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbGxlY3Rpb24gb2YgdGhlIGNvbHVtbnMgaW4gdGhlIHRhYmxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFRhYmxlQ29sdW1uQ29sbGVjdGlvbiBDb2x1bW5zCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKF9jb2xzPT1udWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2NvbHMgPSBuZXcgRXhjZWxUYWJsZUNvbHVtbkNvbGxlY3Rpb24odGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfY29sczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBUYWJsZVN0eWxlcyBfdGFibGVTdHlsZSA9IFRhYmxlU3R5bGVzLk1lZGl1bTY7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB0YWJsZSBzdHlsZS4gSWYgdGhpcyBwcm9wZXJ0eSBpcyBjdXNvbSwgdGhlIHN0eWxlIGZyb20gdGhlIFN0eWxlTmFtZSBwcm9wZXJ5IGlzIHVzZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBUYWJsZVN0eWxlcyBUYWJsZVN0eWxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfdGFibGVTdHlsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF90YWJsZVN0eWxlPXZhbHVlOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBUYWJsZVN0eWxlcy5DdXN0b20pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFNUWUxFTkFNRV9QQVRILCAiVGFibGVTdHlsZSIgKyB2YWx1ZS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIEhFQURFUlJPV0NPVU5UX1BBVEggPSAiQGhlYWRlclJvd0NvdW50IjsKLSAgICAgICAgY29uc3Qgc3RyaW5nIEFVVE9GSUxURVJfUEFUSCA9ICJkOmF1dG9GaWx0ZXIvQHJlZiI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBoZWFkZXIgcm93IGlzIHZpc2libGUgb3Igbm90Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFNob3dIZWFkZXIKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoSEVBREVSUk9XQ09VTlRfUEFUSCkhPTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQWRkcmVzcy5fdG9Sb3cgLSBBZGRyZXNzLl9mcm9tUm93IDwgMCAmJiB2YWx1ZSB8fAotICAgICAgICAgICAgICAgICAgICBBZGRyZXNzLl90b1JvdyAtIEFkZHJlc3MuX2Zyb21Sb3cgPT0gMSAmJiB2YWx1ZSAmJiBTaG93VG90YWwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbigiQ2FudCBzZXQgU2hvd0hlYWRlci1wcm9wZXJ0eS4gVGFibGUgaGFzIHRvbyBmZXcgcm93cyIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZih2YWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoSEVBREVSUk9XQ09VTlRfUEFUSCk7Ci0gICAgICAgICAgICAgICAgICAgIFdyaXRlQXV0b0ZpbHRlcihTaG93VG90YWwpOwotICAgICAgICAgICAgICAgICAgICAvL2ZvciAoaW50IGkgPSAwOyBpIDwgQ29sdW1ucy5Db3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAvL3sKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgdmFyIHYgPSBXb3JrU2hlZXQuR2V0VmFsdWU8c3RyaW5nPihBZGRyZXNzLl9mcm9tUm93LCBBZGRyZXNzLl9mcm9tQ29sICsgaSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIGlmICghc3RyaW5nLklzTnVsbE9yRW1wdHkodikgfHwgdiAhPSBfY29sc1tpXS5OYW1lKQotICAgICAgICAgICAgICAgICAgICAvLyAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBfY29sc1tpXS5OYW1lID0gdjsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgfQotICAgICAgICAgICAgICAgICAgICAvL30KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhIRUFERVJST1dDT1VOVF9QQVRILCAiMCIpOwotICAgICAgICAgICAgICAgICAgICBEZWxldGVBbGxOb2RlKEFVVE9GSUxURVJfUEFUSCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsQWRkcmVzc0Jhc2UgQXV0b0ZpbHRlckFkZHJlc3MKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIGE9R2V0WG1sTm9kZVN0cmluZyhBVVRPRklMVEVSX1BBVEgpOwotICAgICAgICAgICAgICAgIGlmIChhID09ICIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRXhjZWxBZGRyZXNzQmFzZShhKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlQXV0b0ZpbHRlcihib29sIHNob3dUb3RhbCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGF1dG9maWx0ZXJBZGRyZXNzOwotICAgICAgICAgICAgaWYgKFNob3dIZWFkZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3dUb3RhbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG9maWx0ZXJBZGRyZXNzID0gRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKEFkZHJlc3MuX2Zyb21Sb3csIEFkZHJlc3MuX2Zyb21Db2wsIEFkZHJlc3MuX3RvUm93IC0gMSwgQWRkcmVzcy5fdG9Db2wpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhdXRvZmlsdGVyQWRkcmVzcyA9IEFkZHJlc3MuQWRkcmVzczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhBVVRPRklMVEVSX1BBVEgsIGF1dG9maWx0ZXJBZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgaGVhZGVyIHJvdyBoYXMgYW4gYXV0b2ZpbHRlcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93RmlsdGVyIAotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNob3dIZWFkZXIgJiYgQXV0b0ZpbHRlckFkZHJlc3MgIT0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChTaG93SGVhZGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBXcml0ZUF1dG9GaWx0ZXIoU2hvd1RvdGFsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVBbGxOb2RlKEFVVE9GSUxURVJfUEFUSCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZih2YWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93KG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJGaWx0ZXIgY2FuIG9ubHkgYmUgYXBwbGllZCB3aGVuIFNob3dIZWFkZXIgaXMgc2V0IHRvIHRydWUiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBUT1RBTFNST1dDT1VOVF9QQVRIID0gIkB0b3RhbHNSb3dDb3VudCI7Ci0gICAgICAgIGNvbnN0IHN0cmluZyBUT1RBTFNST1dTSE9XTl9QQVRIID0gIkB0b3RhbHNSb3dTaG93biI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSB0b3RhbCByb3cgaXMgdmlzaWJsZSBvciBub3QKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgU2hvd1RvdGFsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KFRPVEFMU1JPV0NPVU5UX1BBVEgpID09IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gU2hvd1RvdGFsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzPW5ldyBFeGNlbEFkZHJlc3MoV29ya1NoZWV0Lk5hbWUsIEV4Y2VsQWRkcmVzc0Jhc2UuR2V0QWRkcmVzcyhBZGRyZXNzLlN0YXJ0LlJvdywgQWRkcmVzcy5TdGFydC5Db2x1bW4sIEFkZHJlc3MuRW5kLlJvdysxLCBBZGRyZXNzLkVuZC5Db2x1bW4pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzKFdvcmtTaGVldC5OYW1lLCBFeGNlbEFkZHJlc3NCYXNlLkdldEFkZHJlc3MoQWRkcmVzcy5TdGFydC5Sb3csIEFkZHJlc3MuU3RhcnQuQ29sdW1uLCBBZGRyZXNzLkVuZC5Sb3cgLSAxLCBBZGRyZXNzLkVuZC5Db2x1bW4pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAcmVmIiwgQWRkcmVzcy5BZGRyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRPVEFMU1JPV0NPVU5UX1BBVEgsICIxIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKFRPVEFMU1JPV0NPVU5UX1BBVEgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFdyaXRlQXV0b0ZpbHRlcih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBTVFlMRU5BTUVfUEFUSCA9ICJkOnRhYmxlU3R5bGVJbmZvL0BuYW1lIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHN0eWxlIG5hbWUgZm9yIGN1c3R1bSBzdHlsZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBTdHlsZU5hbWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoU1RZTEVOQU1FX1BBVEgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlLlN0YXJ0c1dpdGgoIlRhYmxlU3R5bGUiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdGFibGVTdHlsZSA9IChUYWJsZVN0eWxlcylFbnVtLlBhcnNlKHR5cGVvZihUYWJsZVN0eWxlcyksIHZhbHVlLlN1YnN0cmluZygxMCx2YWx1ZS5MZW5ndGgtMTApLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdGFibGVTdHlsZSA9IFRhYmxlU3R5bGVzLkN1c3RvbTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PSAiTm9uZSIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfdGFibGVTdHlsZSA9IFRhYmxlU3R5bGVzLk5vbmU7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF90YWJsZVN0eWxlID0gVGFibGVTdHlsZXMuQ3VzdG9tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFNUWUxFTkFNRV9QQVRILHZhbHVlLHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBTSE9XRklSU1RDT0xVTU5fUEFUSCA9ICJkOnRhYmxlU3R5bGVJbmZvL0BzaG93Rmlyc3RDb2x1bW4iOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEaXNwbGF5IHNwZWNpYWwgZm9ybWF0dGluZyBmb3IgdGhlIGZpcnN0IHJvdwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93Rmlyc3RDb2x1bW4KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKFNIT1dGSVJTVENPTFVNTl9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKFNIT1dGSVJTVENPTFVNTl9QQVRILCB2YWx1ZSwgZmFsc2UpOwotICAgICAgICAgICAgfSAgIAotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBTSE9XTEFTVENPTFVNTl9QQVRIID0gImQ6dGFibGVTdHlsZUluZm8vQHNob3dMYXN0Q29sdW1uIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGlzcGxheSBzcGVjaWFsIGZvcm1hdHRpbmcgZm9yIHRoZSBsYXN0IHJvdwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93TGFzdENvbHVtbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woU0hPV0xBU1RDT0xVTU5fUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChTSE9XTEFTVENPTFVNTl9QQVRILCB2YWx1ZSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBTSE9XUk9XU1RSSVBFU19QQVRIID0gImQ6dGFibGVTdHlsZUluZm8vQHNob3dSb3dTdHJpcGVzIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGlzcGxheSBiYW5kZWQgcm93cwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93Um93U3RyaXBlcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woU0hPV1JPV1NUUklQRVNfUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChTSE9XUk9XU1RSSVBFU19QQVRILCB2YWx1ZSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBTSE9XQ09MVU1OU1RSSVBFU19QQVRIID0gImQ6dGFibGVTdHlsZUluZm8vQHNob3dDb2x1bW5TdHJpcGVzIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGlzcGxheSBiYW5kZWQgY29sdW1ucwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93Q29sdW1uU3RyaXBlcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woU0hPV0NPTFVNTlNUUklQRVNfUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbChTSE9XQ09MVU1OU1RSSVBFU19QQVRILCB2YWx1ZSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3Qgc3RyaW5nIFRPVEFMU1JPV0NFTExTVFlMRV9QQVRIID0gIkB0b3RhbHNSb3dDZWxsU3R5bGUiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBOYW1lZCBzdHlsZSB1c2VkIGZvciB0aGUgdG90YWwgcm93Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVG90YWxzUm93Q2VsbFN0eWxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKFRPVEFMU1JPV0NFTExTVFlMRV9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChXb3JrU2hlZXQuV29ya2Jvb2suU3R5bGVzLk5hbWVkU3R5bGVzLkZpbmRJbmRleEJ5SUQodmFsdWUpIDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIk5hbWVkIHN0eWxlIHswfSBkb2VzIG5vdCBleGlzdC4iLCB2YWx1ZSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhUb3BOb2RlLCBUT1RBTFNST1dDRUxMU1RZTEVfUEFUSCwgdmFsdWUsIHRydWUpOwotCi0gICAgICAgICAgICAgICAgaWYgKFNob3dUb3RhbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFdvcmtTaGVldC5DZWxsc1tBZGRyZXNzLl90b1JvdywgQWRkcmVzcy5fZnJvbUNvbCwgQWRkcmVzcy5fdG9Sb3csIEFkZHJlc3MuX3RvQ29sXS5TdHlsZU5hbWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIERBVEFDRUxMU1RZTEVfUEFUSCA9ICJAZGF0YUNlbGxTdHlsZSI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE5hbWVkIHN0eWxlIHVzZWQgZm9yIHRoZSBkYXRhIGNlbGxzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgRGF0YUNlbGxTdHlsZU5hbWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoREFUQUNFTExTVFlMRV9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChXb3JrU2hlZXQuV29ya2Jvb2suU3R5bGVzLk5hbWVkU3R5bGVzLkZpbmRJbmRleEJ5SUQodmFsdWUpIDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIk5hbWVkIHN0eWxlIHswfSBkb2VzIG5vdCBleGlzdC4iLCB2YWx1ZSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhUb3BOb2RlLCBEQVRBQ0VMTFNUWUxFX1BBVEgsIHZhbHVlLCB0cnVlKTsKLQotICAgICAgICAgICAgICAgIGludCBmcm9tUm93ID0gQWRkcmVzcy5fZnJvbVJvdyArIChTaG93SGVhZGVyID8gMSA6IDApLAotICAgICAgICAgICAgICAgICAgICB0b1JvdyA9IEFkZHJlc3MuX3RvUm93IC0gKFNob3dUb3RhbCA/IDEgOiAwKTsKLQotICAgICAgICAgICAgICAgIGlmIChmcm9tUm93IDwgdG9Sb3cpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBXb3JrU2hlZXQuQ2VsbHNbZnJvbVJvdywgQWRkcmVzcy5fZnJvbUNvbCwgdG9Sb3csIEFkZHJlc3MuX3RvQ29sXS5TdHlsZU5hbWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIEhFQURFUlJPV0NFTExTVFlMRV9QQVRIID0gIkBoZWFkZXJSb3dDZWxsU3R5bGUiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBOYW1lZCBzdHlsZSB1c2VkIGZvciB0aGUgaGVhZGVyIHJvdwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIEhlYWRlclJvd0NlbGxTdHlsZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhIRUFERVJST1dDRUxMU1RZTEVfUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoV29ya1NoZWV0Lldvcmtib29rLlN0eWxlcy5OYW1lZFN0eWxlcy5GaW5kSW5kZXhCeUlEKHZhbHVlKSA8IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJOYW1lZCBzdHlsZSB7MH0gZG9lcyBub3QgZXhpc3QuIiwgdmFsdWUpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVG9wTm9kZSwgSEVBREVSUk9XQ0VMTFNUWUxFX1BBVEgsIHZhbHVlLCB0cnVlKTsKLQotICAgICAgICAgICAgICAgIGlmIChTaG93SGVhZGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgV29ya1NoZWV0LkNlbGxzW0FkZHJlc3MuX2Zyb21Sb3csIEFkZHJlc3MuX2Zyb21Db2wsIEFkZHJlc3MuX2Zyb21Sb3csIEFkZHJlc3MuX3RvQ29sXS5TdHlsZU5hbWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIEVxdWFscyhFeGNlbFRhYmxlIHgsIEV4Y2VsVGFibGUgeSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHguV29ya1NoZWV0ID09IHkuV29ya1NoZWV0ICYmIHguSWQgPT0geS5JZCAmJiB4LlRhYmxlWG1sLk91dGVyWG1sID09IHkuVGFibGVYbWwuT3V0ZXJYbWw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IEdldEhhc2hDb2RlKEV4Y2VsVGFibGUgb2JqKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gb2JqLlRhYmxlWG1sLk91dGVyWG1sLkdldEhhc2hDb2RlKCk7Ci0gICAgICAgIH0KKyAgICBpbnQgY29scyA9IEFkZHJlc3MuX3RvQ29sIC0gQWRkcmVzcy5fZnJvbUNvbCArIDE7CisgICAgeG1sICs9IHN0cmluZy5Gb3JtYXQoIjx0YWJsZUNvbHVtbnMgY291bnQ9XCJ7MH1cIj4iLCBjb2xzKTsKKyAgICB2YXIgbmFtZXMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIHN0cmluZz4oKTsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8PSBjb2xzOyBpKyspIHsKKyAgICAgIHZhciBjZWxsID0gV29ya1NoZWV0LkNlbGxzW0FkZHJlc3MuX2Zyb21Sb3csIEFkZHJlc3MuX2Zyb21Db2wgKyBpIC0gMV07CisgICAgICBzdHJpbmcgY29sTmFtZTsKKyAgICAgIGlmIChjZWxsLlZhbHVlID09IG51bGwgfHwgbmFtZXMuQ29udGFpbnNLZXkoY2VsbC5WYWx1ZS5Ub1N0cmluZygpKSkgeworICAgICAgICAvL0dldCBhbiB1bmlxdWUgbmFtZQorICAgICAgICBpbnQgYSA9IGk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBjb2xOYW1lID0gc3RyaW5nLkZvcm1hdCgiQ29sdW1uezB9IiwgYSsrKTsKKyAgICAgICAgfSB3aGlsZSAobmFtZXMuQ29udGFpbnNLZXkoY29sTmFtZSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29sTmFtZSA9IFNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoY2VsbC5WYWx1ZS5Ub1N0cmluZygpKTsKKyAgICAgIH0KKyAgICAgIG5hbWVzLkFkZChjb2xOYW1lLCBjb2xOYW1lKTsKKyAgICAgIHhtbCArPSBzdHJpbmcuRm9ybWF0KCI8dGFibGVDb2x1bW4gaWQ9XCJ7MH1cIiBuYW1lPVwiezF9XCIgLz4iLCBpLCBjb2xOYW1lKTsKICAgICB9CisgICAgeG1sICs9ICI8L3RhYmxlQ29sdW1ucz4iOworICAgIHhtbCArPQorICAgICAgICAiPHRhYmxlU3R5bGVJbmZvIG5hbWU9XCJUYWJsZVN0eWxlTWVkaXVtOVwiIHNob3dGaXJzdENvbHVtbj1cIjBcIiBzaG93TGFzdENvbHVtbj1cIjBcIiBzaG93Um93U3RyaXBlcz1cIjFcIiBzaG93Q29sdW1uU3RyaXBlcz1cIjBcIiAvPiAiOworICAgIHhtbCArPSAiPC90YWJsZT4iOworCisgICAgcmV0dXJuIHhtbDsKKyAgfQorCisgIHByaXZhdGUgc3RyaW5nIENsZWFuRGlzcGxheU5hbWUoc3RyaW5nIG5hbWUpIHsKKyAgICByZXR1cm4gUmVnZXguUmVwbGFjZShuYW1lLCBAIlteXHdcLi1fXSIsICJfIik7CisgIH0KKworICBpbnRlcm5hbCBaaXBQYWNrYWdlUGFydCBQYXJ0IHsgZ2V0OyBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFhNTCBkYXRhIHJlcHJlc2VudGluZyB0aGUgdGFibGUgaW4gdGhlIHBhY2thZ2UuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBYbWxEb2N1bWVudCBUYWJsZVhtbCB7IGdldDsgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIHBhY2thZ2UgaW50ZXJuYWwgVVJJIHRvIHRoZSBUYWJsZSBYbWwgRG9jdW1lbnQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBVcmkgVGFibGVVcmkgeyBnZXQ7IGludGVybmFsIHNldDsgfQorCisgIGludGVybmFsIHN0cmluZyBSZWxhdGlvbnNoaXBJRCB7IGdldDsgc2V0OyB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2lkUGF0aCA9ICJAaWQiOworCisgIGludGVybmFsIGludCBJZCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVJbnQoX2lkUGF0aCk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoX2lkUGF0aCwgdmFsdWUuVG9TdHJpbmcoKSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfbmFtZVBhdGggPSAiQG5hbWUiOworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZGlzcGxheU5hbWVQYXRoID0gIkBkaXNwbGF5TmFtZSI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIG5hbWUgb2YgdGhlIHRhYmxlIG9iamVjdCBpbiBFeGNlbAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIE5hbWUgeworICAgIGdldCA9PiBHZXRYbWxOb2RlU3RyaW5nKF9uYW1lUGF0aCk7CisgICAgc2V0IHsKKyAgICAgIGlmIChXb3JrU2hlZXQuV29ya2Jvb2suRXhpc3RzVGFibGVOYW1lKHZhbHVlKSkgeworICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUYWJsZW5hbWUgaXMgbm90IHVuaXF1ZSIpKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyBwcmV2TmFtZSA9IE5hbWU7CisgICAgICBpZiAoV29ya1NoZWV0LlRhYmxlcy5fdGFibGVOYW1lcy5Db250YWluc0tleShwcmV2TmFtZSkpIHsKKyAgICAgICAgaW50IGl4ID0gV29ya1NoZWV0LlRhYmxlcy5fdGFibGVOYW1lc1twcmV2TmFtZV07CisgICAgICAgIFdvcmtTaGVldC5UYWJsZXMuX3RhYmxlTmFtZXMuUmVtb3ZlKHByZXZOYW1lKTsKKyAgICAgICAgV29ya1NoZWV0LlRhYmxlcy5fdGFibGVOYW1lcy5BZGQodmFsdWUsIGl4KTsKKyAgICAgIH0KKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX25hbWVQYXRoLCB2YWx1ZSk7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9kaXNwbGF5TmFtZVBhdGgsIENsZWFuRGlzcGxheU5hbWUodmFsdWUpKTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgd29ya3NoZWV0IG9mIHRoZSB0YWJsZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxXb3Jrc2hlZXQgV29ya1NoZWV0IHsgZ2V0OyBzZXQ7IH0KKworICBwcml2YXRlIEV4Y2VsQWRkcmVzc0Jhc2UgX2FkZHJlc3M7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIGFkZHJlc3Mgb2YgdGhlIHRhYmxlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEFkZHJlc3NCYXNlIEFkZHJlc3MgeworICAgIGdldCA9PiBfYWRkcmVzczsKKyAgICBzZXQgeworICAgICAgX2FkZHJlc3MgPSB2YWx1ZTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkByZWYiLCB2YWx1ZS5BZGRyZXNzKTsKKyAgICAgIFdyaXRlQXV0b0ZpbHRlcihTaG93VG90YWwpOworICAgIH0KKyAgfQorCisgIGludGVybmFsIEV4Y2VsVGFibGVDb2x1bW5Db2xsZWN0aW9uIF9jb2xzOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIENvbGxlY3Rpb24gb2YgdGhlIGNvbHVtbnMgaW4gdGhlIHRhYmxlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFRhYmxlQ29sdW1uQ29sbGVjdGlvbiBDb2x1bW5zIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9jb2xzID09IG51bGwpIHsKKyAgICAgICAgX2NvbHMgPSBuZXcodGhpcyk7CisgICAgICB9CisgICAgICByZXR1cm4gX2NvbHM7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBUYWJsZVN0eWxlcyBfdGFibGVTdHlsZSA9IFRhYmxlU3R5bGVzLk1lZGl1bTY7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIHRhYmxlIHN0eWxlLiBJZiB0aGlzIHByb3BlcnR5IGlzIGN1c29tLCB0aGUgc3R5bGUgZnJvbSB0aGUgU3R5bGVOYW1lIHByb3BlcnkgaXMgdXNlZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIFRhYmxlU3R5bGVzIFRhYmxlU3R5bGUgeworICAgIGdldCA9PiBfdGFibGVTdHlsZTsKKyAgICBzZXQgeworICAgICAgX3RhYmxlU3R5bGUgPSB2YWx1ZTsKKyAgICAgIGlmICh2YWx1ZSAhPSBUYWJsZVN0eWxlcy5DdXN0b20pIHsKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc3R5bGVuYW1lUGF0aCwgIlRhYmxlU3R5bGUiICsgdmFsdWUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9oZWFkZXJyb3djb3VudFBhdGggPSAiQGhlYWRlclJvd0NvdW50IjsKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2F1dG9maWx0ZXJQYXRoID0gImQ6YXV0b0ZpbHRlci9AcmVmIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgaGVhZGVyIHJvdyBpcyB2aXNpYmxlIG9yIG5vdAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBTaG93SGVhZGVyIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUludChfaGVhZGVycm93Y291bnRQYXRoKSAhPSAwOworICAgIHNldCB7CisgICAgICBpZiAoQWRkcmVzcy5fdG9Sb3cgLSBBZGRyZXNzLl9mcm9tUm93IDwgMCAmJiB2YWx1ZQorICAgICAgICAgIHx8IEFkZHJlc3MuX3RvUm93IC0gQWRkcmVzcy5fZnJvbVJvdyA9PSAxICYmIHZhbHVlICYmIFNob3dUb3RhbCkgeworICAgICAgICB0aHJvdyAobmV3KCJDYW50IHNldCBTaG93SGVhZGVyLXByb3BlcnR5LiBUYWJsZSBoYXMgdG9vIGZldyByb3dzIikpOworICAgICAgfQorCisgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgRGVsZXRlTm9kZShfaGVhZGVycm93Y291bnRQYXRoKTsKKyAgICAgICAgV3JpdGVBdXRvRmlsdGVyKFNob3dUb3RhbCk7CisgICAgICAgIC8vZm9yIChpbnQgaSA9IDA7IGkgPCBDb2x1bW5zLkNvdW50OyBpKyspCisgICAgICAgIC8veworICAgICAgICAvLyAgICB2YXIgdiA9IFdvcmtTaGVldC5HZXRWYWx1ZTxzdHJpbmc+KEFkZHJlc3MuX2Zyb21Sb3csIEFkZHJlc3MuX2Zyb21Db2wgKyBpKTsKKyAgICAgICAgLy8gICAgaWYgKCFzdHJpbmcuSXNOdWxsT3JFbXB0eSh2KSB8fCB2ICE9IF9jb2xzW2ldLk5hbWUpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIF9jb2xzW2ldLk5hbWUgPSB2OworICAgICAgICAvLyAgICB9CisgICAgICAgIC8vfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfaGVhZGVycm93Y291bnRQYXRoLCAiMCIpOworICAgICAgICBEZWxldGVBbGxOb2RlKF9hdXRvZmlsdGVyUGF0aCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgRXhjZWxBZGRyZXNzQmFzZSBBdXRvRmlsdGVyQWRkcmVzcyB7CisgICAgZ2V0IHsKKyAgICAgIHN0cmluZyBhID0gR2V0WG1sTm9kZVN0cmluZyhfYXV0b2ZpbHRlclBhdGgpOworICAgICAgaWYgKGEgPT0gIiIpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgICByZXR1cm4gbmV3KGEpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCBXcml0ZUF1dG9GaWx0ZXIoYm9vbCBzaG93VG90YWwpIHsKKyAgICBzdHJpbmcgYXV0b2ZpbHRlckFkZHJlc3M7CisgICAgaWYgKFNob3dIZWFkZXIpIHsKKyAgICAgIGlmIChzaG93VG90YWwpIHsKKyAgICAgICAgYXV0b2ZpbHRlckFkZHJlc3MgPSBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoCisgICAgICAgICAgICBBZGRyZXNzLl9mcm9tUm93LAorICAgICAgICAgICAgQWRkcmVzcy5fZnJvbUNvbCwKKyAgICAgICAgICAgIEFkZHJlc3MuX3RvUm93IC0gMSwKKyAgICAgICAgICAgIEFkZHJlc3MuX3RvQ29sKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGF1dG9maWx0ZXJBZGRyZXNzID0gQWRkcmVzcy5BZGRyZXNzOworICAgICAgfQorICAgICAgU2V0WG1sTm9kZVN0cmluZyhfYXV0b2ZpbHRlclBhdGgsIGF1dG9maWx0ZXJBZGRyZXNzKTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgaGVhZGVyIHJvdyBoYXMgYW4gYXV0b2ZpbHRlcgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBTaG93RmlsdGVyIHsKKyAgICBnZXQgPT4gU2hvd0hlYWRlciAmJiBBdXRvRmlsdGVyQWRkcmVzcyAhPSBudWxsOworICAgIHNldCB7CisgICAgICBpZiAoU2hvd0hlYWRlcikgeworICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICBXcml0ZUF1dG9GaWx0ZXIoU2hvd1RvdGFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBEZWxldGVBbGxOb2RlKF9hdXRvZmlsdGVyUGF0aCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodmFsdWUpIHsKKyAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJGaWx0ZXIgY2FuIG9ubHkgYmUgYXBwbGllZCB3aGVuIFNob3dIZWFkZXIgaXMgc2V0IHRvIHRydWUiKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3RvdGFsc3Jvd2NvdW50UGF0aCA9ICJAdG90YWxzUm93Q291bnQiOworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfdG90YWxzcm93c2hvd25QYXRoID0gIkB0b3RhbHNSb3dTaG93biI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhlIHRvdGFsIHJvdyBpcyB2aXNpYmxlIG9yIG5vdAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBTaG93VG90YWwgeworICAgIGdldCA9PiBHZXRYbWxOb2RlSW50KF90b3RhbHNyb3djb3VudFBhdGgpID09IDE7CisgICAgc2V0IHsKKyAgICAgIGlmICh2YWx1ZSAhPSBTaG93VG90YWwpIHsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgQWRkcmVzcyA9IG5ldyBFeGNlbEFkZHJlc3MoCisgICAgICAgICAgICAgIFdvcmtTaGVldC5OYW1lLAorICAgICAgICAgICAgICBFeGNlbENlbGxCYXNlLkdldEFkZHJlc3MoCisgICAgICAgICAgICAgICAgICBBZGRyZXNzLlN0YXJ0LlJvdywKKyAgICAgICAgICAgICAgICAgIEFkZHJlc3MuU3RhcnQuQ29sdW1uLAorICAgICAgICAgICAgICAgICAgQWRkcmVzcy5FbmQuUm93ICsgMSwKKyAgICAgICAgICAgICAgICAgIEFkZHJlc3MuRW5kLkNvbHVtbikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEFkZHJlc3MgPSBuZXcgRXhjZWxBZGRyZXNzKAorICAgICAgICAgICAgICBXb3JrU2hlZXQuTmFtZSwKKyAgICAgICAgICAgICAgRXhjZWxDZWxsQmFzZS5HZXRBZGRyZXNzKAorICAgICAgICAgICAgICAgICAgQWRkcmVzcy5TdGFydC5Sb3csCisgICAgICAgICAgICAgICAgICBBZGRyZXNzLlN0YXJ0LkNvbHVtbiwKKyAgICAgICAgICAgICAgICAgIEFkZHJlc3MuRW5kLlJvdyAtIDEsCisgICAgICAgICAgICAgICAgICBBZGRyZXNzLkVuZC5Db2x1bW4pKTsKKyAgICAgICAgfQorICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAcmVmIiwgQWRkcmVzcy5BZGRyZXNzKTsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfdG90YWxzcm93Y291bnRQYXRoLCAiMSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIERlbGV0ZU5vZGUoX3RvdGFsc3Jvd2NvdW50UGF0aCk7CisgICAgICAgIH0KKyAgICAgICAgV3JpdGVBdXRvRmlsdGVyKHZhbHVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfc3R5bGVuYW1lUGF0aCA9ICJkOnRhYmxlU3R5bGVJbmZvL0BuYW1lIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgc3R5bGUgbmFtZSBmb3IgY3VzdHVtIHN0eWxlcworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIFN0eWxlTmFtZSB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVTdHJpbmcoX3N0eWxlbmFtZVBhdGgpOworICAgIHNldCB7CisgICAgICBpZiAodmFsdWUuU3RhcnRzV2l0aCgiVGFibGVTdHlsZSIpKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgX3RhYmxlU3R5bGUgPSAoVGFibGVTdHlsZXMpCisgICAgICAgICAgICBFbnVtLlBhcnNlKHR5cGVvZihUYWJsZVN0eWxlcyksIHZhbHVlLlN1YnN0cmluZygxMCwgdmFsdWUuTGVuZ3RoIC0gMTApLCB0cnVlKTsKKyAgICAgICAgfSBjYXRjaCB7CisgICAgICAgICAgX3RhYmxlU3R5bGUgPSBUYWJsZVN0eWxlcy5DdXN0b207CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIk5vbmUiKSB7CisgICAgICAgIF90YWJsZVN0eWxlID0gVGFibGVTdHlsZXMuTm9uZTsKKyAgICAgICAgdmFsdWUgPSAiIjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF90YWJsZVN0eWxlID0gVGFibGVTdHlsZXMuQ3VzdG9tOworICAgICAgfQorICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc3R5bGVuYW1lUGF0aCwgdmFsdWUsIHRydWUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9zaG93Zmlyc3Rjb2x1bW5QYXRoID0gImQ6dGFibGVTdHlsZUluZm8vQHNob3dGaXJzdENvbHVtbiI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gRGlzcGxheSBzcGVjaWFsIGZvcm1hdHRpbmcgZm9yIHRoZSBmaXJzdCByb3cKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgU2hvd0ZpcnN0Q29sdW1uIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2woX3Nob3dmaXJzdGNvbHVtblBhdGgpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbChfc2hvd2ZpcnN0Y29sdW1uUGF0aCwgdmFsdWUsIGZhbHNlKTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9zaG93bGFzdGNvbHVtblBhdGggPSAiZDp0YWJsZVN0eWxlSW5mby9Ac2hvd0xhc3RDb2x1bW4iOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIERpc3BsYXkgc3BlY2lhbCBmb3JtYXR0aW5nIGZvciB0aGUgbGFzdCByb3cKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgU2hvd0xhc3RDb2x1bW4geworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbChfc2hvd2xhc3Rjb2x1bW5QYXRoKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX3Nob3dsYXN0Y29sdW1uUGF0aCwgdmFsdWUsIGZhbHNlKTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9zaG93cm93c3RyaXBlc1BhdGggPSAiZDp0YWJsZVN0eWxlSW5mby9Ac2hvd1Jvd1N0cmlwZXMiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIERpc3BsYXkgYmFuZGVkIHJvd3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgU2hvd1Jvd1N0cmlwZXMgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbChfc2hvd3Jvd3N0cmlwZXNQYXRoKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX3Nob3dyb3dzdHJpcGVzUGF0aCwgdmFsdWUsIGZhbHNlKTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9zaG93Y29sdW1uc3RyaXBlc1BhdGggPSAiZDp0YWJsZVN0eWxlSW5mby9Ac2hvd0NvbHVtblN0cmlwZXMiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIERpc3BsYXkgYmFuZGVkIGNvbHVtbnMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgU2hvd0NvbHVtblN0cmlwZXMgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbChfc2hvd2NvbHVtbnN0cmlwZXNQYXRoKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woX3Nob3djb2x1bW5zdHJpcGVzUGF0aCwgdmFsdWUsIGZhbHNlKTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF90b3RhbHNyb3djZWxsc3R5bGVQYXRoID0gIkB0b3RhbHNSb3dDZWxsU3R5bGUiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE5hbWVkIHN0eWxlIHVzZWQgZm9yIHRoZSB0b3RhbCByb3cKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBUb3RhbHNSb3dDZWxsU3R5bGUgeworICAgIGdldCA9PiBHZXRYbWxOb2RlU3RyaW5nKF90b3RhbHNyb3djZWxsc3R5bGVQYXRoKTsKKyAgICBzZXQgeworICAgICAgaWYgKFdvcmtTaGVldC5Xb3JrYm9vay5TdHlsZXMuTmFtZWRTdHlsZXMuRmluZEluZGV4QnlJZCh2YWx1ZSkgPCAwKSB7CisgICAgICAgIHRocm93IChuZXcoc3RyaW5nLkZvcm1hdCgiTmFtZWQgc3R5bGUgezB9IGRvZXMgbm90IGV4aXN0LiIsIHZhbHVlKSkpOworICAgICAgfQorICAgICAgU2V0WG1sTm9kZVN0cmluZyhUb3BOb2RlLCBfdG90YWxzcm93Y2VsbHN0eWxlUGF0aCwgdmFsdWUsIHRydWUpOworCisgICAgICBpZiAoU2hvd1RvdGFsKSB7CisgICAgICAgIFdvcmtTaGVldC5DZWxsc1tBZGRyZXNzLl90b1JvdywKKyAgICAgICAgICBBZGRyZXNzLl9mcm9tQ29sLAorICAgICAgICAgIEFkZHJlc3MuX3RvUm93LAorICAgICAgICAgIEFkZHJlc3MuX3RvQ29sXS5TdHlsZU5hbWUgPSB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZGF0YWNlbGxzdHlsZVBhdGggPSAiQGRhdGFDZWxsU3R5bGUiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE5hbWVkIHN0eWxlIHVzZWQgZm9yIHRoZSBkYXRhIGNlbGxzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgRGF0YUNlbGxTdHlsZU5hbWUgeworICAgIGdldCA9PiBHZXRYbWxOb2RlU3RyaW5nKF9kYXRhY2VsbHN0eWxlUGF0aCk7CisgICAgc2V0IHsKKyAgICAgIGlmIChXb3JrU2hlZXQuV29ya2Jvb2suU3R5bGVzLk5hbWVkU3R5bGVzLkZpbmRJbmRleEJ5SWQodmFsdWUpIDwgMCkgeworICAgICAgICB0aHJvdyAobmV3KHN0cmluZy5Gb3JtYXQoIk5hbWVkIHN0eWxlIHswfSBkb2VzIG5vdCBleGlzdC4iLCB2YWx1ZSkpKTsKKyAgICAgIH0KKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoVG9wTm9kZSwgX2RhdGFjZWxsc3R5bGVQYXRoLCB2YWx1ZSwgdHJ1ZSk7CisKKyAgICAgIGludCBmcm9tUm93ID0gQWRkcmVzcy5fZnJvbVJvdyArIChTaG93SGVhZGVyID8gMSA6IDApLAorICAgICAgICAgIHRvUm93ID0gQWRkcmVzcy5fdG9Sb3cgLSAoU2hvd1RvdGFsID8gMSA6IDApOworCisgICAgICBpZiAoZnJvbVJvdyA8IHRvUm93KSB7CisgICAgICAgIFdvcmtTaGVldC5DZWxsc1tmcm9tUm93LCBBZGRyZXNzLl9mcm9tQ29sLCB0b1JvdywgQWRkcmVzcy5fdG9Db2xdLlN0eWxlTmFtZSA9IHZhbHVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9oZWFkZXJyb3djZWxsc3R5bGVQYXRoID0gIkBoZWFkZXJSb3dDZWxsU3R5bGUiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE5hbWVkIHN0eWxlIHVzZWQgZm9yIHRoZSBoZWFkZXIgcm93CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgSGVhZGVyUm93Q2VsbFN0eWxlIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZyhfaGVhZGVycm93Y2VsbHN0eWxlUGF0aCk7CisgICAgc2V0IHsKKyAgICAgIGlmIChXb3JrU2hlZXQuV29ya2Jvb2suU3R5bGVzLk5hbWVkU3R5bGVzLkZpbmRJbmRleEJ5SWQodmFsdWUpIDwgMCkgeworICAgICAgICB0aHJvdyAobmV3KHN0cmluZy5Gb3JtYXQoIk5hbWVkIHN0eWxlIHswfSBkb2VzIG5vdCBleGlzdC4iLCB2YWx1ZSkpKTsKKyAgICAgIH0KKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoVG9wTm9kZSwgX2hlYWRlcnJvd2NlbGxzdHlsZVBhdGgsIHZhbHVlLCB0cnVlKTsKKworICAgICAgaWYgKFNob3dIZWFkZXIpIHsKKyAgICAgICAgV29ya1NoZWV0LkNlbGxzW0FkZHJlc3MuX2Zyb21Sb3csCisgICAgICAgICAgQWRkcmVzcy5fZnJvbUNvbCwKKyAgICAgICAgICBBZGRyZXNzLl9mcm9tUm93LAorICAgICAgICAgIEFkZHJlc3MuX3RvQ29sXS5TdHlsZU5hbWUgPSB2YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbCBFcXVhbHMoRXhjZWxUYWJsZSB4LCBFeGNlbFRhYmxlIHkpIHsKKyAgICByZXR1cm4geC5Xb3JrU2hlZXQgPT0geS5Xb3JrU2hlZXQgJiYgeC5JZCA9PSB5LklkICYmIHguVGFibGVYbWwuT3V0ZXJYbWwgPT0geS5UYWJsZVhtbC5PdXRlclhtbDsKKyAgfQorCisgIHB1YmxpYyBpbnQgR2V0SGFzaENvZGUoRXhjZWxUYWJsZSBvYmopIHsKKyAgICByZXR1cm4gb2JqLlRhYmxlWG1sLk91dGVyWG1sLkdldEhhc2hDb2RlKCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9UYWJsZS9FeGNlbFRhYmxlQ29sbGVjdGlvbi5jcyBiL0VQUGx1cy9UYWJsZS9FeGNlbFRhYmxlQ29sbGVjdGlvbi5jcwppbmRleCBiMGRmMDg2Li4wODU3NmU0IDEwMDY0NAotLS0gYS9FUFBsdXMvVGFibGUvRXhjZWxUYWJsZUNvbGxlY3Rpb24uY3MKKysrIGIvRVBQbHVzL1RhYmxlL0V4Y2VsVGFibGVDb2xsZWN0aW9uLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywyMzYgKzEzLDIwMSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkzMC1BVUctMjAxMAogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLlhtbDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEEgY29sbGVjdGlvbiBvZiB0YWJsZSBvYmplY3RzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxUYWJsZUNvbGxlY3Rpb24gOiBJRW51bWVyYWJsZTxFeGNlbFRhYmxlPgotICAgIHsKLSAgICAgICAgTGlzdDxFeGNlbFRhYmxlPiBfdGFibGVzID0gbmV3IExpc3Q8RXhjZWxUYWJsZT4oKTsKLSAgICAgICAgaW50ZXJuYWwgRGljdGlvbmFyeTxzdHJpbmcsIGludD4gX3RhYmxlTmFtZXMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIGludD4oU3RyaW5nQ29tcGFyZXIuSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpOwotICAgICAgICBFeGNlbFdvcmtzaGVldCBfd3M7ICAgICAgICAKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxUYWJsZUNvbGxlY3Rpb24oRXhjZWxXb3Jrc2hlZXQgd3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwY2sgPSB3cy5fcGFja2FnZS5QYWNrYWdlOwotICAgICAgICAgICAgX3dzID0gd3M7Ci0gICAgICAgICAgICBmb3JlYWNoKFhtbEVsZW1lbnQgbm9kZSBpbiB3cy5Xb3Jrc2hlZXRYbWwuU2VsZWN0Tm9kZXMoIi8vZDp0YWJsZVBhcnRzL2Q6dGFibGVQYXJ0Iiwgd3MuTmFtZVNwYWNlTWFuYWdlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHJlbCA9IHdzLlBhcnQuR2V0UmVsYXRpb25zaGlwKG5vZGUuR2V0QXR0cmlidXRlKCJpZCIsRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMpKTsKLSAgICAgICAgICAgICAgICB2YXIgdGJsID0gbmV3IEV4Y2VsVGFibGUocmVsLCB3cyk7Ci0gICAgICAgICAgICAgICAgX3RhYmxlTmFtZXMuQWRkKHRibC5OYW1lLCBfdGFibGVzLkNvdW50KTsKLSAgICAgICAgICAgICAgICBfdGFibGVzLkFkZCh0YmwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgRXhjZWxUYWJsZSBBZGQoRXhjZWxUYWJsZSB0YmwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF90YWJsZXMuQWRkKHRibCk7Ci0gICAgICAgICAgICBfdGFibGVOYW1lcy5BZGQodGJsLk5hbWUsIF90YWJsZXMuQ291bnQgLSAxKTsKLSAgICAgICAgICAgIGlmICh0YmwuSWQgPj0gX3dzLldvcmtib29rLl9uZXh0VGFibGVJRCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfd3MuV29ya2Jvb2suX25leHRUYWJsZUlEID0gdGJsLklkICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0Ymw7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlRhYmxlOwogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZSBhIHRhYmxlIG9uIHRoZSBzdXBwbGllZCByYW5nZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJhbmdlIj5UaGUgcmFuZ2UgYWRkcmVzcyBpbmNsdWRpbmcgaGVhZGVyIGFuZCB0b3RhbCByb3c8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPlRoZSBuYW1lIG9mIHRoZSB0YWJsZS4gTXVzdCBiZSB1bmlxdWUgPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSB0YWJsZSBvYmplY3Q8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFRhYmxlIEFkZChFeGNlbEFkZHJlc3NCYXNlIFJhbmdlLCBzdHJpbmcgTmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFJhbmdlLldvcmtTaGVldCAhPSBudWxsICYmIFJhbmdlLldvcmtTaGVldCAhPSBfd3MuTmFtZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlJhbmdlIGRvZXMgbm90IGJlbG9uZyB0byB3b3Jrc2hlZXQiLCAiUmFuZ2UiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KE5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5hbWUgPSBHZXROZXdUYWJsZU5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKF93cy5Xb3JrYm9vay5FeGlzdHNUYWJsZU5hbWUoTmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVGFibGVuYW1lIGlzIG5vdCB1bmlxdWUiKSk7Ci0gICAgICAgICAgICB9CisvLy8gPHN1bW1hcnk+CisvLy8gQSBjb2xsZWN0aW9uIG9mIHRhYmxlIG9iamVjdHMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxUYWJsZUNvbGxlY3Rpb24gOiBJRW51bWVyYWJsZTxFeGNlbFRhYmxlPiB7CisgIHByaXZhdGUgTGlzdDxFeGNlbFRhYmxlPiBfdGFibGVzID0gbmV3KCk7CisgIGludGVybmFsIERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+IF90YWJsZU5hbWVzID0gbmV3KFN0cmluZ0NvbXBhcmVyLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKTsKKyAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd3M7CiAKLSAgICAgICAgICAgIFZhbGlkYXRlVGFibGVOYW1lKE5hbWUpOwotCi0gICAgICAgICAgICBmb3JlYWNoICh2YXIgdCBpbiBfdGFibGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0LkFkZHJlc3MuQ29sbGlkZShSYW5nZSkgIT0gRXhjZWxBZGRyZXNzQmFzZS5lQWRkcmVzc0NvbGxpdGlvbi5ObykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiVGFibGUgcmFuZ2UgY29sbGlkZXMgd2l0aCB0YWJsZSB7MH0iLCB0Lk5hbWUpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEFkZChuZXcgRXhjZWxUYWJsZShfd3MsIFJhbmdlLCBOYW1lLCBfd3MuV29ya2Jvb2suX25leHRUYWJsZUlEKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgVmFsaWRhdGVUYWJsZU5hbWUoc3RyaW5nIE5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShOYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRhYmxlbmFtZSBpcyBudWxsIG9yIGVtcHR5Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNoYXIgZmlyc3RMZXR0ZXJPZk5hbWUgPSBOYW1lWzBdOwotICAgICAgICAgICAgaWYgKENoYXIuSXNMZXR0ZXIoZmlyc3RMZXR0ZXJPZk5hbWUpID09IGZhbHNlICYmIGZpcnN0TGV0dGVyT2ZOYW1lICE9ICdfJyAmJiBmaXJzdExldHRlck9mTmFtZSAhPSAnXFwnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVGFibGVuYW1lIHN0YXJ0IHdpdGggaW52YWxpZCBjaGFyYWN0ZXIiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKE5hbWUuQ29udGFpbnMoIiAiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRhYmxlbmFtZSBoYXMgc3BhY2VzIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIERlbGV0ZShpbnQgSW5kZXgsIGJvb2wgQ2xlYXJSYW5nZSA9IGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZWxldGUodGhpc1tJbmRleF0sIENsZWFyUmFuZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlKHN0cmluZyBOYW1lLCBib29sIENsZWFyUmFuZ2UgPSBmYWxzZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRoaXNbTmFtZV0gPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIkNhbm5vdCBkZWxldGUgbm9uLWV4aXN0YW50IHRhYmxlIHswfSBpbiBzaGVldCB7MX0uIiwgTmFtZSwgX3dzLk5hbWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERlbGV0ZSh0aGlzW05hbWVdLCBDbGVhclJhbmdlKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIHZvaWQgRGVsZXRlKEV4Y2VsVGFibGUgVGFibGUsIGJvb2wgQ2xlYXJSYW5nZSA9IGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXRoaXMuX3RhYmxlcy5Db250YWlucyhUYWJsZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiVGFibGUiLCBTdHJpbmcuRm9ybWF0KCJUYWJsZSB7MH0gZG9lcyBub3QgZXhpc3QgaW4gdGhpcyBjb2xsZWN0aW9uIiwgVGFibGUuTmFtZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbG9jayAodGhpcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBfd3MuQ2VsbHNbVGFibGUuQWRkcmVzcy5BZGRyZXNzXTsKLSAgICAgICAgICAgICAgICBfdGFibGVOYW1lcy5SZW1vdmUoVGFibGUuTmFtZSk7Ci0gICAgICAgICAgICAgICAgX3RhYmxlcy5SZW1vdmUoVGFibGUpOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBzaGVldCBpbiBUYWJsZS5Xb3JrU2hlZXQuV29ya2Jvb2suV29ya3NoZWV0cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0YWJsZSBpbiBzaGVldC5UYWJsZXMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZS5JZCA+IFRhYmxlLklkKSB0YWJsZS5JZC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFRhYmxlLldvcmtTaGVldC5Xb3JrYm9vay5fbmV4dFRhYmxlSUQtLTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKENsZWFyUmFuZ2UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByYW5nZS5DbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEdldE5ld1RhYmxlTmFtZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBuYW1lID0gIlRhYmxlMSI7Ci0gICAgICAgICAgICBpbnQgaSA9IDI7Ci0gICAgICAgICAgICB3aGlsZSAoX3dzLldvcmtib29rLkV4aXN0c1RhYmxlTmFtZShuYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBuYW1lID0gc3RyaW5nLkZvcm1hdCgiVGFibGV7MH0iLCBpKyspOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgQ291bnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF90YWJsZXMuQ291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0IHRoZSB0YWJsZSBvYmplY3QgZnJvbSBhIHJhbmdlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJhbmdlIj5UaGUgcmFuZ2U8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIHRhYmxlLiBOdWxsIGlmIG5vIHJhbmdlIG1hdGNoZXM8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFRhYmxlIEdldEZyb21SYW5nZShFeGNlbFJhbmdlQmFzZSBSYW5nZSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yZWFjaCAodmFyIHRibCBpbiBSYW5nZS5Xb3Jrc2hlZXQuVGFibGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0YmwuQWRkcmVzcy5fYWRkcmVzcyA9PSBSYW5nZS5fYWRkcmVzcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0Ymw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHRhYmxlIEluZGV4LiBCYXNlIDAuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iSW5kZXgiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFRhYmxlIHRoaXNbaW50IEluZGV4XQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoSW5kZXggPCAwIHx8IEluZGV4ID49IF90YWJsZXMuQ291bnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiVGFibGUgaW5kZXggb3V0IG9mIHJhbmdlIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX3RhYmxlc1tJbmRleF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5kZXhlcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPlRoZSBuYW1lIG9mIHRoZSB0YWJsZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgdGFibGUuIE51bGwgaWYgdGhlIHRhYmxlIG5hbWUgaXMgbm90IGZvdW5kIGluIHRoZSBjb2xsZWN0aW9uPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgRXhjZWxUYWJsZSB0aGlzW3N0cmluZyBOYW1lXQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3RhYmxlTmFtZXMuQ29udGFpbnNLZXkoTmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RhYmxlc1tfdGFibGVOYW1lc1tOYW1lXV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3I8RXhjZWxUYWJsZT4gR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfdGFibGVzLkdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYXRvciBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfdGFibGVzLkdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgfQorICBpbnRlcm5hbCBFeGNlbFRhYmxlQ29sbGVjdGlvbihFeGNlbFdvcmtzaGVldCB3cykgeworICAgIHZhciBwY2sgPSB3cy5fcGFja2FnZS5QYWNrYWdlOworICAgIF93cyA9IHdzOworICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgbm9kZSBpbiB3cy5Xb3Jrc2hlZXRYbWwuU2VsZWN0Tm9kZXMoCisgICAgICAgICIvL2Q6dGFibGVQYXJ0cy9kOnRhYmxlUGFydCIsCisgICAgICAgIHdzLk5hbWVTcGFjZU1hbmFnZXIpKSB7CisgICAgICB2YXIgcmVsID0gd3MuUGFydC5HZXRSZWxhdGlvbnNoaXAobm9kZS5HZXRBdHRyaWJ1dGUoImlkIiwgRXhjZWxQYWNrYWdlLl9zY2hlbWFSZWxhdGlvbnNoaXBzKSk7CisgICAgICB2YXIgdGJsID0gbmV3IEV4Y2VsVGFibGUocmVsLCB3cyk7CisgICAgICBfdGFibGVOYW1lcy5BZGQodGJsLk5hbWUsIF90YWJsZXMuQ291bnQpOworICAgICAgX3RhYmxlcy5BZGQodGJsKTsKICAgICB9CisgIH0KKworICBwcml2YXRlIEV4Y2VsVGFibGUgQWRkKEV4Y2VsVGFibGUgdGJsKSB7CisgICAgX3RhYmxlcy5BZGQodGJsKTsKKyAgICBfdGFibGVOYW1lcy5BZGQodGJsLk5hbWUsIF90YWJsZXMuQ291bnQgLSAxKTsKKyAgICBpZiAodGJsLklkID49IF93cy5Xb3JrYm9vay5fbmV4dFRhYmxlSUQpIHsKKyAgICAgIF93cy5Xb3JrYm9vay5fbmV4dFRhYmxlSUQgPSB0YmwuSWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gdGJsOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ3JlYXRlIGEgdGFibGUgb24gdGhlIHN1cHBsaWVkIHJhbmdlCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icmFuZ2UiPlRoZSByYW5nZSBhZGRyZXNzIGluY2x1ZGluZyBoZWFkZXIgYW5kIHRvdGFsIHJvdzwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIG5hbWUgb2YgdGhlIHRhYmxlLiBNdXN0IGJlIHVuaXF1ZSA8L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIHRhYmxlIG9iamVjdDwvcmV0dXJucz4KKyAgcHVibGljIEV4Y2VsVGFibGUgQWRkKEV4Y2VsQWRkcmVzc0Jhc2UgcmFuZ2UsIHN0cmluZyBuYW1lKSB7CisgICAgaWYgKHJhbmdlLldvcmtTaGVldCAhPSBudWxsICYmIHJhbmdlLldvcmtTaGVldCAhPSBfd3MuTmFtZSkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJSYW5nZSBkb2VzIG5vdCBiZWxvbmcgdG8gd29ya3NoZWV0IiwgInJhbmdlIik7CisgICAgfQorCisgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KG5hbWUpKSB7CisgICAgICBuYW1lID0gR2V0TmV3VGFibGVOYW1lKCk7CisgICAgfSBlbHNlIGlmIChfd3MuV29ya2Jvb2suRXhpc3RzVGFibGVOYW1lKG5hbWUpKSB7CisgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUYWJsZW5hbWUgaXMgbm90IHVuaXF1ZSIpKTsKKyAgICB9CisKKyAgICBWYWxpZGF0ZVRhYmxlTmFtZShuYW1lKTsKKworICAgIGZvcmVhY2ggKHZhciB0IGluIF90YWJsZXMpIHsKKyAgICAgIGlmICh0LkFkZHJlc3MuQ29sbGlkZShyYW5nZSkgIT0gRXhjZWxBZGRyZXNzQmFzZS5lQWRkcmVzc0NvbGxpdGlvbi5ObykgeworICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIlRhYmxlIHJhbmdlIGNvbGxpZGVzIHdpdGggdGFibGUgezB9IiwgdC5OYW1lKSkpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQWRkKG5ldyhfd3MsIHJhbmdlLCBuYW1lLCBfd3MuV29ya2Jvb2suX25leHRUYWJsZUlEKSk7CisgIH0KKworICBwcml2YXRlIHZvaWQgVmFsaWRhdGVUYWJsZU5hbWUoc3RyaW5nIG5hbWUpIHsKKyAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkobmFtZSkpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVGFibGVuYW1lIGlzIG51bGwgb3IgZW1wdHkiKTsKKyAgICB9CisKKyAgICBjaGFyIGZpcnN0TGV0dGVyT2ZOYW1lID0gbmFtZVswXTsKKyAgICBpZiAoQ2hhci5Jc0xldHRlcihmaXJzdExldHRlck9mTmFtZSkgPT0gZmFsc2UKKyAgICAgICAgJiYgZmlyc3RMZXR0ZXJPZk5hbWUgIT0gJ18nCisgICAgICAgICYmIGZpcnN0TGV0dGVyT2ZOYW1lICE9ICdcXCcpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVGFibGVuYW1lIHN0YXJ0IHdpdGggaW52YWxpZCBjaGFyYWN0ZXIiKTsKKyAgICB9CisKKyAgICBpZiAobmFtZS5Db250YWlucygiICIpKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRhYmxlbmFtZSBoYXMgc3BhY2VzIik7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgRGVsZXRlKGludCBpbmRleCwgYm9vbCBjbGVhclJhbmdlID0gZmFsc2UpIHsKKyAgICBEZWxldGUodGhpc1tpbmRleF0sIGNsZWFyUmFuZ2UpOworICB9CisKKyAgcHVibGljIHZvaWQgRGVsZXRlKHN0cmluZyBuYW1lLCBib29sIGNsZWFyUmFuZ2UgPSBmYWxzZSkgeworICAgIGlmICh0aGlzW25hbWVdID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oCisgICAgICAgICAgc3RyaW5nLkZvcm1hdCgiQ2Fubm90IGRlbGV0ZSBub24tZXhpc3RhbnQgdGFibGUgezB9IGluIHNoZWV0IHsxfS4iLCBuYW1lLCBfd3MuTmFtZSkpOworICAgIH0KKyAgICBEZWxldGUodGhpc1tuYW1lXSwgY2xlYXJSYW5nZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBEZWxldGUoRXhjZWxUYWJsZSBleGNlbFRhYmxlLCBib29sIGNsZWFyUmFuZ2UgPSBmYWxzZSkgeworICAgIGlmICghX3RhYmxlcy5Db250YWlucyhleGNlbFRhYmxlKSkgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigKKyAgICAgICAgICAiZXhjZWxUYWJsZSIsCisgICAgICAgICAgU3RyaW5nLkZvcm1hdCgiVGFibGUgezB9IGRvZXMgbm90IGV4aXN0IGluIHRoaXMgY29sbGVjdGlvbiIsIGV4Y2VsVGFibGUuTmFtZSkpOworICAgIH0KKyAgICBsb2NrICh0aGlzKSB7CisgICAgICB2YXIgcmFuZ2UgPSBfd3MuQ2VsbHNbZXhjZWxUYWJsZS5BZGRyZXNzLkFkZHJlc3NdOworICAgICAgX3RhYmxlTmFtZXMuUmVtb3ZlKGV4Y2VsVGFibGUuTmFtZSk7CisgICAgICBfdGFibGVzLlJlbW92ZShleGNlbFRhYmxlKTsKKyAgICAgIGZvcmVhY2ggKHZhciBzaGVldCBpbiBleGNlbFRhYmxlLldvcmtTaGVldC5Xb3JrYm9vay5Xb3Jrc2hlZXRzKSB7CisgICAgICAgIGZvcmVhY2ggKHZhciB0YWJsZSBpbiBzaGVldC5UYWJsZXMpIHsKKyAgICAgICAgICBpZiAodGFibGUuSWQgPiBleGNlbFRhYmxlLklkKSB7CisgICAgICAgICAgICB0YWJsZS5JZC0tOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBleGNlbFRhYmxlLldvcmtTaGVldC5Xb3JrYm9vay5fbmV4dFRhYmxlSUQtLTsKKyAgICAgIH0KKyAgICAgIGlmIChjbGVhclJhbmdlKSB7CisgICAgICAgIHJhbmdlLkNsZWFyKCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgc3RyaW5nIEdldE5ld1RhYmxlTmFtZSgpIHsKKyAgICBzdHJpbmcgbmFtZSA9ICJUYWJsZTEiOworICAgIGludCBpID0gMjsKKyAgICB3aGlsZSAoX3dzLldvcmtib29rLkV4aXN0c1RhYmxlTmFtZShuYW1lKSkgeworICAgICAgbmFtZSA9IHN0cmluZy5Gb3JtYXQoIlRhYmxlezB9IiwgaSsrKTsKKyAgICB9CisgICAgcmV0dXJuIG5hbWU7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOdW1iZXIgb2YgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBDb3VudCA9PiBfdGFibGVzLkNvdW50OworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEdldCB0aGUgdGFibGUgb2JqZWN0IGZyb20gYSByYW5nZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyYW5nZSI+VGhlIHJhbmdlPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPlRoZSB0YWJsZS4gTnVsbCBpZiBubyByYW5nZSBtYXRjaGVzPC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxUYWJsZSBHZXRGcm9tUmFuZ2UoRXhjZWxSYW5nZUJhc2UgcmFuZ2UpIHsKKyAgICBmb3JlYWNoICh2YXIgdGJsIGluIHJhbmdlLldvcmtzaGVldC5UYWJsZXMpIHsKKyAgICAgIGlmICh0YmwuQWRkcmVzcy5fYWRkcmVzcyA9PSByYW5nZS5fYWRkcmVzcykgeworICAgICAgICByZXR1cm4gdGJsOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSB0YWJsZSBJbmRleC4gQmFzZSAwLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxUYWJsZSB0aGlzW2ludCBpbmRleF0geworICAgIGdldCB7CisgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IF90YWJsZXMuQ291bnQpIHsKKyAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlRhYmxlIGluZGV4IG91dCBvZiByYW5nZSIpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfdGFibGVzW2luZGV4XTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbmRleGVyCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIG5hbWUgb2YgdGhlIHRhYmxlPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPlRoZSB0YWJsZS4gTnVsbCBpZiB0aGUgdGFibGUgbmFtZSBpcyBub3QgZm91bmQgaW4gdGhlIGNvbGxlY3Rpb248L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFRhYmxlIHRoaXNbc3RyaW5nIG5hbWVdIHsKKyAgICBnZXQgeworICAgICAgaWYgKF90YWJsZU5hbWVzLkNvbnRhaW5zS2V5KG5hbWUpKSB7CisgICAgICAgIHJldHVybiBfdGFibGVzW190YWJsZU5hbWVzW25hbWVdXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBJRW51bWVyYXRvcjxFeGNlbFRhYmxlPiBHZXRFbnVtZXJhdG9yKCkgeworICAgIHJldHVybiBfdGFibGVzLkdldEVudW1lcmF0b3IoKTsKKyAgfQorCisgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKSB7CisgICAgcmV0dXJuIF90YWJsZXMuR2V0RW51bWVyYXRvcigpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvVGFibGUvRXhjZWxUYWJsZUNvbHVtbi5jcyBiL0VQUGx1cy9UYWJsZS9FeGNlbFRhYmxlQ29sdW1uLmNzCmluZGV4IDBjNDU1MjkuLjY2ODA0MjQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9UYWJsZS9FeGNlbFRhYmxlQ29sdW1uLmNzCisrKyBiL0VQUGx1cy9UYWJsZS9FeGNlbFRhYmxlQ29sdW1uLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywyMjggKzEzLDE5MSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkzMC1BVUctMjAxMAogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKLXVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlRhYmxlCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBCdWlsZC1pbiB0YWJsZSByb3cgZnVuY3Rpb25zCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBSb3dGdW5jdGlvbnMKLSAgICB7Ci0gICAgICAgIEF2ZXJhZ2UsICAgICAgICAKLSAgICAgICAgQ291bnQsCi0gICAgICAgIENvdW50TnVtcywKLSAgICAgICAgQ3VzdG9tLAotICAgICAgICBNYXgsCi0gICAgICAgIE1pbiwKLSAgICAgICAgTm9uZSwKLSAgICAgICAgU3RkRGV2LAotICAgICAgICBTdW0sCi0gICAgICAgIFZhcgorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGU7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBCdWlsZC1pbiB0YWJsZSByb3cgZnVuY3Rpb25zCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGVudW0gUm93RnVuY3Rpb25zIHsKKyAgQXZlcmFnZSwKKyAgQ291bnQsCisgIENvdW50TnVtcywKKyAgQ3VzdG9tLAorICBNYXgsCisgIE1pbiwKKyAgTm9uZSwKKyAgU3RkRGV2LAorICBTdW0sCisgIFZhciwKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIEEgdGFibGUgY29sdW1uCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsVGFibGVDb2x1bW4gOiBYbWxIZWxwZXIgeworICBpbnRlcm5hbCBFeGNlbFRhYmxlIF90Ymw7CisKKyAgaW50ZXJuYWwgRXhjZWxUYWJsZUNvbHVtbihYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIHRvcE5vZGUsIEV4Y2VsVGFibGUgdGJsLCBpbnQgcG9zKQorICAgICAgOiBiYXNlKG5zLCB0b3BOb2RlKSB7CisgICAgX3RibCA9IHRibDsKKyAgICBQb3NpdGlvbiA9IHBvczsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBjb2x1bW4gaWQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBJZCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVJbnQoIkBpZCIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKCJAaWQiLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgY29sdW1uCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgUG9zaXRpb24geyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIG5hbWUgb2YgdGhlIGNvbHVtbgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIE5hbWUgeworICAgIGdldCB7CisgICAgICB2YXIgbiA9IEdldFhtbE5vZGVTdHJpbmcoIkBuYW1lIik7CisgICAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkobikpIHsKKyAgICAgICAgaWYgKF90YmwuU2hvd0hlYWRlcikgeworICAgICAgICAgIG4gPSBDb252ZXJ0VXRpbC5FeGNlbERlY29kZVN0cmluZygKKyAgICAgICAgICAgICAgX3RibC5Xb3JrU2hlZXQuR2V0VmFsdWU8c3RyaW5nPigKKyAgICAgICAgICAgICAgICAgIF90YmwuQWRkcmVzcy5fZnJvbVJvdywKKyAgICAgICAgICAgICAgICAgIF90YmwuQWRkcmVzcy5fZnJvbUNvbCArIFBvc2l0aW9uKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbiA9ICJDb2x1bW4iICsgKFBvc2l0aW9uICsgMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBuOwogICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQSB0YWJsZSBjb2x1bW4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFRhYmxlQ29sdW1uIDogWG1sSGVscGVyCi0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbFRhYmxlIF90Ymw7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsVGFibGVDb2x1bW4oWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLCBFeGNlbFRhYmxlIHRibCwgaW50IHBvcykgOgotICAgICAgICAgICAgYmFzZShucywgdG9wTm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgX3RibCA9IHRibDsKLSAgICAgICAgICAgIFBvc2l0aW9uID0gcG9zOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBjb2x1bW4gaWQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBJZCAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoIkBpZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGlkIiwgdmFsdWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHBvc2l0aW9uIG9mIHRoZSBjb2x1bW4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBQb3NpdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBwcml2YXRlIHNldDsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgbmFtZSBvZiB0aGUgY29sdW1uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgbj1HZXRYbWxOb2RlU3RyaW5nKCJAbmFtZSIpOwotICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShuKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfdGJsLlNob3dIZWFkZXIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBDb252ZXJ0VXRpbC5FeGNlbERlY29kZVN0cmluZyhfdGJsLldvcmtTaGVldC5HZXRWYWx1ZTxzdHJpbmc+KF90YmwuQWRkcmVzcy5fZnJvbVJvdywgX3RibC5BZGRyZXNzLl9mcm9tQ29sICsgdGhpcy5Qb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbiA9ICJDb2x1bW4iICsgKHRoaXMuUG9zaXRpb24rMSkuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB2ID0gQ29udmVydFV0aWwuRXhjZWxFbmNvZGVTdHJpbmcodmFsdWUpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBuYW1lIiwgdik7Ci0gICAgICAgICAgICAgICAgaWYgKF90YmwuU2hvd0hlYWRlcikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF90YmwuV29ya1NoZWV0LlNldFZhbHVlKF90YmwuQWRkcmVzcy5fZnJvbVJvdywgX3RibC5BZGRyZXNzLl9mcm9tQ29sICsgdGhpcy5Qb3NpdGlvbiwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBfdGJsLldvcmtTaGVldC5TZXRUYWJsZVRvdGFsRnVuY3Rpb24oX3RibCwgdGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQSBzdHJpbmcgdGV4dCBpbiB0aGUgdG90YWwgcm93Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVG90YWxzUm93TGFiZWwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkB0b3RhbHNSb3dMYWJlbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHRvdGFsc1Jvd0xhYmVsIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEJ1aWxkLWluIHRvdGFsIHJvdyBmdW5jdGlvbnMuCi0gICAgICAgIC8vLyBUbyBzZXQgYSBjdXN0b20gVG90YWwgcm93IGZvcm11bGEgdXNlIHRoZSBUb3RhbHNSb3dGb3JtdWxhIHByb3BlcnR5Ci0gICAgICAgIC8vLyA8c2VlYWxzbyBjcmVmPSJUb3RhbHNSb3dGb3JtdWxhIi8+Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBSb3dGdW5jdGlvbnMgVG90YWxzUm93RnVuY3Rpb24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEdldFhtbE5vZGVTdHJpbmcoIkB0b3RhbHNSb3dGdW5jdGlvbiIpID09ICIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJvd0Z1bmN0aW9ucy5Ob25lOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFJvd0Z1bmN0aW9ucylFbnVtLlBhcnNlKHR5cGVvZihSb3dGdW5jdGlvbnMpLCBHZXRYbWxOb2RlU3RyaW5nKCJAdG90YWxzUm93RnVuY3Rpb24iKSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IFJvd0Z1bmN0aW9ucy5DdXN0b20pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyhuZXcgRXhjZXB0aW9uKCJVc2UgdGhlIFRvdGFsc1Jvd0Zvcm11bGEtcHJvcGVydHkgdG8gc2V0IGEgY3VzdG9tIHRhYmxlIGZvcm11bGEiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0cmluZyBzID0gdmFsdWUuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBzID0gcy5TdWJzdHJpbmcoMCwgMSkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSArIHMuU3Vic3RyaW5nKDEsIHMuTGVuZ3RoIC0gMSk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHRvdGFsc1Jvd0Z1bmN0aW9uIiwgcyk7Ci0gICAgICAgICAgICAgICAgX3RibC5Xb3JrU2hlZXQuU2V0VGFibGVUb3RhbEZ1bmN0aW9uKF90YmwsIHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBUT1RBTFNST1dGT1JNVUxBX1BBVEggPSAiZDp0b3RhbHNSb3dGb3JtdWxhIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2V0cyBhIGN1c3RvbSBUb3RhbHMgcm93IEZvcm11bGEuCi0gICAgICAgIC8vLyBCZSBjYXJlZnVsbCB3aXRoIHRoaXMgcHJvcGVydHkgc2luY2UgaXQgaXMgbm90IHZhbGlkYXRlZC4gCi0gICAgICAgIC8vLyA8ZXhhbXBsZT4KLSAgICAgICAgLy8vIHRibC5Db2x1bW5zWzldLlRvdGFsc1Jvd0Zvcm11bGEgPSBzdHJpbmcuRm9ybWF0KCJTVU0oW3swfV0pIix0YmwuQ29sdW1uc1s5XS5OYW1lKTsKLSAgICAgICAgLy8vIDwvZXhhbXBsZT4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBUb3RhbHNSb3dGb3JtdWxhCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKFRPVEFMU1JPV0ZPUk1VTEFfUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUuU3RhcnRzV2l0aCgiPSIpKSB2YWx1ZSA9IHZhbHVlLlN1YnN0cmluZygxLCB2YWx1ZS5MZW5ndGggLSAxKTsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAdG90YWxzUm93RnVuY3Rpb24iLCAiY3VzdG9tIik7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoVE9UQUxTUk9XRk9STVVMQV9QQVRILCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgX3RibC5Xb3JrU2hlZXQuU2V0VGFibGVUb3RhbEZ1bmN0aW9uKF90YmwsIHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBEQVRBQ0VMTFNUWUxFX1BBVEggPSAiQGRhdGFDZWxsU3R5bGUiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgbmFtZWQgc3R5bGUgZm9yIGRhdGFjZWxscyBpbiB0aGUgY29sdW1uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgRGF0YUNlbGxTdHlsZU5hbWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoREFUQUNFTExTVFlMRV9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKF90YmwuV29ya1NoZWV0Lldvcmtib29rLlN0eWxlcy5OYW1lZFN0eWxlcy5GaW5kSW5kZXhCeUlEKHZhbHVlKTwwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJOYW1lZCBzdHlsZSB7MH0gZG9lcyBub3QgZXhpc3QuIix2YWx1ZSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhUb3BOb2RlLCBEQVRBQ0VMTFNUWUxFX1BBVEgsIHZhbHVlLHRydWUpOwotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaW50IGZyb21Sb3c9X3RibC5BZGRyZXNzLl9mcm9tUm93ICsgKF90YmwuU2hvd0hlYWRlcj8xOjApLAotICAgICAgICAgICAgICAgICAgICB0b1Jvdz1fdGJsLkFkZHJlc3MuX3RvUm93IC0gKF90YmwuU2hvd1RvdGFsPzE6MCksCi0gICAgICAgICAgICAgICAgICAgIGNvbD1fdGJsLkFkZHJlc3MuX2Zyb21Db2wrUG9zaXRpb247Ci0KLSAgICAgICAgICAgICAgICBpZiAoZnJvbVJvdyA8PSB0b1JvdykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF90YmwuV29ya1NoZWV0LkNlbGxzW2Zyb21Sb3csIGNvbCwgdG9Sb3csIGNvbF0uU3R5bGVOYW1lID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gIAkJY29uc3Qgc3RyaW5nIENBTENVTEFURURDT0xVTU5GT1JNVUxBX1BBVEggPSAiZDpjYWxjdWxhdGVkQ29sdW1uRm9ybXVsYSI7Ci0gCQkvLy8gPHN1bW1hcnk+Ci0gCQkvLy8gU2V0cyBhIGNhbGN1bGF0ZWQgY29sdW1uIEZvcm11bGEuCi0gCQkvLy8gQmUgY2FyZWZ1bGwgd2l0aCB0aGlzIHByb3BlcnR5IHNpbmNlIGl0IGlzIG5vdCB2YWxpZGF0ZWQuIAotIAkJLy8vIDxleGFtcGxlPgotIAkJLy8vIHRibC5Db2x1bW5zWzldLkNhbGN1bGF0ZWRDb2x1bW5Gb3JtdWxhID0gc3RyaW5nLkZvcm1hdCgiU1VNKE15RGF0YVRhYmxlW1sjVGhpcyBSb3ddLFt7MH1dXSkiLHRibC5Db2x1bW5zWzldLk5hbWUpOwotIAkJLy8vIDwvZXhhbXBsZT4KLSAJCS8vLyA8L3N1bW1hcnk+Ci0gCQlwdWJsaWMgc3RyaW5nIENhbGN1bGF0ZWRDb2x1bW5Gb3JtdWxhCi0gCQl7Ci0gCQkJZ2V0Ci0gCQkJewotIAkJCQlyZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhDQUxDVUxBVEVEQ09MVU1ORk9STVVMQV9QQVRIKTsKLSAJCQl9Ci0gCQkJc2V0Ci0gCQkJewotIAkJCQlpZiAodmFsdWUuU3RhcnRzV2l0aCgiPSIpKSB2YWx1ZSA9IHZhbHVlLlN1YnN0cmluZygxLCB2YWx1ZS5MZW5ndGggLSAxKTsKLSAJCQkJU2V0WG1sTm9kZVN0cmluZyhDQUxDVUxBVEVEQ09MVU1ORk9STVVMQV9QQVRILCB2YWx1ZSk7Ci0gCQkJfQotIAkJfQotCisgICAgc2V0IHsKKyAgICAgIHZhciB2ID0gQ29udmVydFV0aWwuRXhjZWxFbmNvZGVTdHJpbmcodmFsdWUpOworICAgICAgU2V0WG1sTm9kZVN0cmluZygiQG5hbWUiLCB2KTsKKyAgICAgIGlmIChfdGJsLlNob3dIZWFkZXIpIHsKKyAgICAgICAgX3RibC5Xb3JrU2hlZXQuU2V0VmFsdWUoX3RibC5BZGRyZXNzLl9mcm9tUm93LCBfdGJsLkFkZHJlc3MuX2Zyb21Db2wgKyBQb3NpdGlvbiwgdmFsdWUpOworICAgICAgfQorICAgICAgX3RibC5Xb3JrU2hlZXQuU2V0VGFibGVUb3RhbEZ1bmN0aW9uKF90YmwsIHRoaXMpOwogICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgc3RyaW5nIHRleHQgaW4gdGhlIHRvdGFsIHJvdworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIFRvdGFsc1Jvd0xhYmVsIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZygiQHRvdGFsc1Jvd0xhYmVsIik7CisgICAgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoIkB0b3RhbHNSb3dMYWJlbCIsIHZhbHVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEJ1aWxkLWluIHRvdGFsIHJvdyBmdW5jdGlvbnMuCisgIC8vLyBUbyBzZXQgYSBjdXN0b20gVG90YWwgcm93IGZvcm11bGEgdXNlIHRoZSBUb3RhbHNSb3dGb3JtdWxhIHByb3BlcnR5CisgIC8vLyA8c2VlYWxzbyBjcmVmPSJUb3RhbHNSb3dGb3JtdWxhIi8+CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBSb3dGdW5jdGlvbnMgVG90YWxzUm93RnVuY3Rpb24geworICAgIGdldCB7CisgICAgICBpZiAoR2V0WG1sTm9kZVN0cmluZygiQHRvdGFsc1Jvd0Z1bmN0aW9uIikgPT0gIiIpIHsKKyAgICAgICAgcmV0dXJuIFJvd0Z1bmN0aW9ucy5Ob25lOworICAgICAgfQorICAgICAgcmV0dXJuIChSb3dGdW5jdGlvbnMpCisgICAgICAgIEVudW0uUGFyc2UodHlwZW9mKFJvd0Z1bmN0aW9ucyksIEdldFhtbE5vZGVTdHJpbmcoIkB0b3RhbHNSb3dGdW5jdGlvbiIpLCB0cnVlKTsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIGlmICh2YWx1ZSA9PSBSb3dGdW5jdGlvbnMuQ3VzdG9tKSB7CisgICAgICAgIHRocm93IChuZXcoIlVzZSB0aGUgVG90YWxzUm93Rm9ybXVsYS1wcm9wZXJ0eSB0byBzZXQgYSBjdXN0b20gdGFibGUgZm9ybXVsYSIpKTsKKyAgICAgIH0KKyAgICAgIHN0cmluZyBzID0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgICAgIHMgPSBzLlN1YnN0cmluZygwLCAxKS5Ub0xvd2VyKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICsgcy5TdWJzdHJpbmcoMSwgcy5MZW5ndGggLSAxKTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkB0b3RhbHNSb3dGdW5jdGlvbiIsIHMpOworICAgICAgX3RibC5Xb3JrU2hlZXQuU2V0VGFibGVUb3RhbEZ1bmN0aW9uKF90YmwsIHRoaXMpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF90b3RhbHNyb3dmb3JtdWxhUGF0aCA9ICJkOnRvdGFsc1Jvd0Zvcm11bGEiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNldHMgYSBjdXN0b20gVG90YWxzIHJvdyBGb3JtdWxhLgorICAvLy8gQmUgY2FyZWZ1bGwgd2l0aCB0aGlzIHByb3BlcnR5IHNpbmNlIGl0IGlzIG5vdCB2YWxpZGF0ZWQuCisgIC8vLyA8ZXhhbXBsZT4KKyAgLy8vIHRibC5Db2x1bW5zWzldLlRvdGFsc1Jvd0Zvcm11bGEgPSBzdHJpbmcuRm9ybWF0KCJTVU0oW3swfV0pIix0YmwuQ29sdW1uc1s5XS5OYW1lKTsKKyAgLy8vIDwvZXhhbXBsZT4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBUb3RhbHNSb3dGb3JtdWxhIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZyhfdG90YWxzcm93Zm9ybXVsYVBhdGgpOworICAgIHNldCB7CisgICAgICBpZiAodmFsdWUuU3RhcnRzV2l0aCgiPSIpKSB7CisgICAgICAgIHZhbHVlID0gdmFsdWUuU3Vic3RyaW5nKDEsIHZhbHVlLkxlbmd0aCAtIDEpOworICAgICAgfQorICAgICAgU2V0WG1sTm9kZVN0cmluZygiQHRvdGFsc1Jvd0Z1bmN0aW9uIiwgImN1c3RvbSIpOworICAgICAgU2V0WG1sTm9kZVN0cmluZyhfdG90YWxzcm93Zm9ybXVsYVBhdGgsIHZhbHVlKTsKKyAgICAgIF90YmwuV29ya1NoZWV0LlNldFRhYmxlVG90YWxGdW5jdGlvbihfdGJsLCB0aGlzKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZGF0YWNlbGxzdHlsZVBhdGggPSAiQGRhdGFDZWxsU3R5bGUiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBuYW1lZCBzdHlsZSBmb3IgZGF0YWNlbGxzIGluIHRoZSBjb2x1bW4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBEYXRhQ2VsbFN0eWxlTmFtZSB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVTdHJpbmcoX2RhdGFjZWxsc3R5bGVQYXRoKTsKKyAgICBzZXQgeworICAgICAgaWYgKF90YmwuV29ya1NoZWV0Lldvcmtib29rLlN0eWxlcy5OYW1lZFN0eWxlcy5GaW5kSW5kZXhCeUlkKHZhbHVlKSA8IDApIHsKKyAgICAgICAgdGhyb3cgKG5ldyhzdHJpbmcuRm9ybWF0KCJOYW1lZCBzdHlsZSB7MH0gZG9lcyBub3QgZXhpc3QuIiwgdmFsdWUpKSk7CisgICAgICB9CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRvcE5vZGUsIF9kYXRhY2VsbHN0eWxlUGF0aCwgdmFsdWUsIHRydWUpOworCisgICAgICBpbnQgZnJvbVJvdyA9IF90YmwuQWRkcmVzcy5fZnJvbVJvdyArIChfdGJsLlNob3dIZWFkZXIgPyAxIDogMCksCisgICAgICAgICAgdG9Sb3cgPSBfdGJsLkFkZHJlc3MuX3RvUm93IC0gKF90YmwuU2hvd1RvdGFsID8gMSA6IDApLAorICAgICAgICAgIGNvbCA9IF90YmwuQWRkcmVzcy5fZnJvbUNvbCArIFBvc2l0aW9uOworCisgICAgICBpZiAoZnJvbVJvdyA8PSB0b1JvdykgeworICAgICAgICBfdGJsLldvcmtTaGVldC5DZWxsc1tmcm9tUm93LCBjb2wsIHRvUm93LCBjb2xdLlN0eWxlTmFtZSA9IHZhbHVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9jYWxjdWxhdGVkY29sdW1uZm9ybXVsYVBhdGggPSAiZDpjYWxjdWxhdGVkQ29sdW1uRm9ybXVsYSI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2V0cyBhIGNhbGN1bGF0ZWQgY29sdW1uIEZvcm11bGEuCisgIC8vLyBCZSBjYXJlZnVsbCB3aXRoIHRoaXMgcHJvcGVydHkgc2luY2UgaXQgaXMgbm90IHZhbGlkYXRlZC4KKyAgLy8vIDxleGFtcGxlPgorICAvLy8gdGJsLkNvbHVtbnNbOV0uQ2FsY3VsYXRlZENvbHVtbkZvcm11bGEgPSBzdHJpbmcuRm9ybWF0KCJTVU0oTXlEYXRhVGFibGVbWyNUaGlzIFJvd10sW3swfV1dKSIsdGJsLkNvbHVtbnNbOV0uTmFtZSk7CisgIC8vLyA8L2V4YW1wbGU+CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgQ2FsY3VsYXRlZENvbHVtbkZvcm11bGEgeworICAgIGdldCA9PiBHZXRYbWxOb2RlU3RyaW5nKF9jYWxjdWxhdGVkY29sdW1uZm9ybXVsYVBhdGgpOworICAgIHNldCB7CisgICAgICBpZiAodmFsdWUuU3RhcnRzV2l0aCgiPSIpKSB7CisgICAgICAgIHZhbHVlID0gdmFsdWUuU3Vic3RyaW5nKDEsIHZhbHVlLkxlbmd0aCAtIDEpOworICAgICAgfQorICAgICAgU2V0WG1sTm9kZVN0cmluZyhfY2FsY3VsYXRlZGNvbHVtbmZvcm11bGFQYXRoLCB2YWx1ZSk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvVGFibGUvRXhjZWxUYWJsZUNvbHVtbkNvbGxlY3Rpb24uY3MgYi9FUFBsdXMvVGFibGUvRXhjZWxUYWJsZUNvbHVtbkNvbGxlY3Rpb24uY3MKaW5kZXggM2E0ZDIzZi4uODY0ZTAyNiAxMDA2NDQKLS0tIGEvRVBQbHVzL1RhYmxlL0V4Y2VsVGFibGVDb2x1bW5Db2xsZWN0aW9uLmNzCisrKyBiL0VQUGx1cy9UYWJsZS9FeGNlbFRhYmxlQ29sdW1uQ29sbGVjdGlvbi5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMTIzICsxMywxMDMgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMzAtQVVHLTIwMTAKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKK3VzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKIHVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIFN5c3RlbS5YbWw7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlRhYmxlCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIGNvbGxlY3Rpb24gb2YgdGFibGUgY29sdW1ucwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsVGFibGVDb2x1bW5Db2xsZWN0aW9uIDogSUVudW1lcmFibGU8RXhjZWxUYWJsZUNvbHVtbj4KLSAgICB7Ci0gICAgICAgIExpc3Q8RXhjZWxUYWJsZUNvbHVtbj4gX2NvbHMgPSBuZXcgTGlzdDxFeGNlbFRhYmxlQ29sdW1uPigpOwotICAgICAgICBEaWN0aW9uYXJ5PHN0cmluZywgaW50PiBfY29sTmFtZXMgPSBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIGludD4oU3RyaW5nQ29tcGFyZXIuSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpOwotICAgICAgICBwdWJsaWMgRXhjZWxUYWJsZUNvbHVtbkNvbGxlY3Rpb24oRXhjZWxUYWJsZSB0YWJsZSkKLSAgICAgICAgewotICAgICAgICAgICAgVGFibGUgPSB0YWJsZTsKLSAgICAgICAgICAgIGZvcmVhY2goWG1sTm9kZSBub2RlIGluIHRhYmxlLlRhYmxlWG1sLlNlbGVjdE5vZGVzKCIvL2Q6dGFibGUvZDp0YWJsZUNvbHVtbnMvZDp0YWJsZUNvbHVtbiIsdGFibGUuTmFtZVNwYWNlTWFuYWdlcikpCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIF9jb2xzLkFkZChuZXcgRXhjZWxUYWJsZUNvbHVtbih0YWJsZS5OYW1lU3BhY2VNYW5hZ2VyLCBub2RlLCB0YWJsZSwgX2NvbHMuQ291bnQpKTsKLSAgICAgICAgICAgICAgICBfY29sTmFtZXMuQWRkKF9jb2xzW19jb2xzLkNvdW50IC0gMV0uTmFtZSwgX2NvbHMuQ291bnQgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgdGFibGUgb2JqZWN0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFRhYmxlIFRhYmxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHByaXZhdGUgc2V0OwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IENvdW50Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfY29scy5Db3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgY29sdW1uIEluZGV4LiBCYXNlIDAuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iSW5kZXgiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFRhYmxlQ29sdW1uIHRoaXNbaW50IEluZGV4XQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoSW5kZXggPCAwIHx8IEluZGV4ID49IF9jb2xzLkNvdW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkNvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2UiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfY29sc1tJbmRleF0gYXMgRXhjZWxUYWJsZUNvbHVtbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbmRleGVyCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iTmFtZSI+VGhlIG5hbWUgb2YgdGhlIHRhYmxlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSB0YWJsZSBjb2x1bW4uIE51bGwgaWYgdGhlIHRhYmxlIG5hbWUgaXMgbm90IGZvdW5kIGluIHRoZSBjb2xsZWN0aW9uPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgRXhjZWxUYWJsZUNvbHVtbiB0aGlzW3N0cmluZyBOYW1lXQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2NvbE5hbWVzLkNvbnRhaW5zS2V5KE5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb2xzW19jb2xOYW1lc1tOYW1lXV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGU7CiAKLSAgICAgICAgSUVudW1lcmF0b3I8RXhjZWxUYWJsZUNvbHVtbj4gSUVudW1lcmFibGU8RXhjZWxUYWJsZUNvbHVtbj4uR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfY29scy5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBBIGNvbGxlY3Rpb24gb2YgdGFibGUgY29sdW1ucworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbFRhYmxlQ29sdW1uQ29sbGVjdGlvbiA6IElFbnVtZXJhYmxlPEV4Y2VsVGFibGVDb2x1bW4+IHsKKyAgcHJpdmF0ZSBMaXN0PEV4Y2VsVGFibGVDb2x1bW4+IF9jb2xzID0gbmV3KCk7CisgIHByaXZhdGUgRGljdGlvbmFyeTxzdHJpbmcsIGludD4gX2NvbE5hbWVzID0gbmV3KFN0cmluZ0NvbXBhcmVyLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKTsKIAotICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2NvbHMuR2V0RW51bWVyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHN0cmluZyBHZXRVbmlxdWVOYW1lKHN0cmluZyBuYW1lKQotICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoX2NvbE5hbWVzLkNvbnRhaW5zS2V5KG5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBuZXdOYW1lID0gbmFtZTsKLSAgICAgICAgICAgICAgICB2YXIgaSA9IDI7Ci0gICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBuYW1lKyhpKyspLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB3aGlsZSAoX2NvbE5hbWVzLkNvbnRhaW5zS2V5KG5ld05hbWUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3TmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuYW1lOwotICAgICAgICB9CisgIHB1YmxpYyBFeGNlbFRhYmxlQ29sdW1uQ29sbGVjdGlvbihFeGNlbFRhYmxlIHRhYmxlKSB7CisgICAgVGFibGUgPSB0YWJsZTsKKyAgICBmb3JlYWNoIChYbWxOb2RlIG5vZGUgaW4gdGFibGUuVGFibGVYbWwuU2VsZWN0Tm9kZXMoCisgICAgICAgICIvL2Q6dGFibGUvZDp0YWJsZUNvbHVtbnMvZDp0YWJsZUNvbHVtbiIsCisgICAgICAgIHRhYmxlLk5hbWVTcGFjZU1hbmFnZXIpKSB7CisgICAgICBfY29scy5BZGQobmV3KHRhYmxlLk5hbWVTcGFjZU1hbmFnZXIsIG5vZGUsIHRhYmxlLCBfY29scy5Db3VudCkpOworICAgICAgX2NvbE5hbWVzLkFkZChfY29sc1tfY29scy5Db3VudCAtIDFdLk5hbWUsIF9jb2xzLkNvdW50IC0gMSk7CiAgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSByZWZlcmVuY2UgdG8gdGhlIHRhYmxlIG9iamVjdAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxUYWJsZSBUYWJsZSB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOdW1iZXIgb2YgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBDb3VudCA9PiBfY29scy5Db3VudDsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgY29sdW1uIEluZGV4LiBCYXNlIDAuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iaW5kZXgiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFRhYmxlQ29sdW1uIHRoaXNbaW50IGluZGV4XSB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gX2NvbHMuQ291bnQpIHsKKyAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkNvbHVtbiBpbmRleCBvdXQgb2YgcmFuZ2UiKSk7CisgICAgICB9CisgICAgICByZXR1cm4gX2NvbHNbaW5kZXhdOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluZGV4ZXIKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj5UaGUgbmFtZSBvZiB0aGUgdGFibGU8L3BhcmFtPgorICAvLy8gPHJldHVybnM+VGhlIHRhYmxlIGNvbHVtbi4gTnVsbCBpZiB0aGUgdGFibGUgbmFtZSBpcyBub3QgZm91bmQgaW4gdGhlIGNvbGxlY3Rpb248L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFRhYmxlQ29sdW1uIHRoaXNbc3RyaW5nIG5hbWVdIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9jb2xOYW1lcy5Db250YWluc0tleShuYW1lKSkgeworICAgICAgICByZXR1cm4gX2NvbHNbX2NvbE5hbWVzW25hbWVdXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIElFbnVtZXJhdG9yPEV4Y2VsVGFibGVDb2x1bW4+IElFbnVtZXJhYmxlPEV4Y2VsVGFibGVDb2x1bW4+LkdldEVudW1lcmF0b3IoKSB7CisgICAgcmV0dXJuIF9jb2xzLkdldEVudW1lcmF0b3IoKTsKKyAgfQorCisgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKSB7CisgICAgcmV0dXJuIF9jb2xzLkdldEVudW1lcmF0b3IoKTsKKyAgfQorCisgIGludGVybmFsIHN0cmluZyBHZXRVbmlxdWVOYW1lKHN0cmluZyBuYW1lKSB7CisgICAgaWYgKF9jb2xOYW1lcy5Db250YWluc0tleShuYW1lKSkgeworICAgICAgdmFyIG5ld05hbWUgPSBuYW1lOworICAgICAgdmFyIGkgPSAyOworICAgICAgZG8geworICAgICAgICBuZXdOYW1lID0gbmFtZSArIChpKyspLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOworICAgICAgfSB3aGlsZSAoX2NvbE5hbWVzLkNvbnRhaW5zS2V5KG5ld05hbWUpKTsKKyAgICAgIHJldHVybiBuZXdOYW1lOworICAgIH0KKyAgICByZXR1cm4gbmFtZTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdENhY2hlRGVmaW5pdGlvbi5jcyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RDYWNoZURlZmluaXRpb24uY3MKaW5kZXggZWI4MTJlYS4uZDI1MDAxZiAxMDA2NDQKLS0tIGEvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdENhY2hlRGVmaW5pdGlvbi5jcworKysgYi9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90Q2FjaGVEZWZpbml0aW9uLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywyODIgKzEzLDI1OSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyMS1NQVItMjAxMQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uRGF0YS5TcWxDbGllbnQ7Cit1c2luZyBTeXN0ZW0uTGlucTsKIHVzaW5nIFN5c3RlbS5UZXh0OwogdXNpbmcgU3lzdGVtLlhtbDsKLXVzaW5nIFN5c3RlbS5MaW5xOwordXNpbmcgT2ZmaWNlT3BlblhtbC5QYWNrYWdpbmc7CiB1c2luZyBPZmZpY2VPcGVuWG1sLlV0aWxzOwotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZQotewotICAgIHB1YmxpYyBlbnVtIGVTb3VyY2VUeXBlCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgY2FjaGUgY29udGFpbnMgZGF0YSB0aGF0IGNvbnNvbGlkYXRlcyByYW5nZXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIENvbnNvbGlkYXRpb24sCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBjYWNoZSBjb250YWlucyBkYXRhIGZyb20gYW4gZXh0ZXJuYWwgZGF0YSBzb3VyY2UuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEV4dGVybmFsLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgY2FjaGUgY29udGFpbnMgYSBzY2VuYXJpbyBzdW1tYXJ5IHJlcG9ydAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBTY2VuYXJpbywKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlIGNhY2hlIGNvbnRhaW5zIHdvcmtzaGVldCBkYXRhCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFdvcmtzaGVldAorCituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlOworCitwdWJsaWMgZW51bSBlU291cmNlVHlwZSB7CisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBjYWNoZSBjb250YWlucyBkYXRhIHRoYXQgY29uc29saWRhdGVzIHJhbmdlcy4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgQ29uc29saWRhdGlvbiwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgY2FjaGUgY29udGFpbnMgZGF0YSBmcm9tIGFuIGV4dGVybmFsIGRhdGEgc291cmNlLgorICAvLy8gPC9zdW1tYXJ5PgorICBFeHRlcm5hbCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgY2FjaGUgY29udGFpbnMgYSBzY2VuYXJpbyBzdW1tYXJ5IHJlcG9ydAorICAvLy8gPC9zdW1tYXJ5PgorICBTY2VuYXJpbywKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbmRpY2F0ZXMgdGhhdCB0aGUgY2FjaGUgY29udGFpbnMgd29ya3NoZWV0IGRhdGEKKyAgLy8vIDwvc3VtbWFyeT4KKyAgV29ya3NoZWV0LAorfQorCisvLy8gPHN1bW1hcnk+CisvLy8gQ2FjaGUgZGVmaW5pdGlvbi4gVGhpcyBjbGFzcyBkZWZpbmVzIHRoZSBzb3VyY2UgZGF0YS4gTm90ZSB0aGF0IG9uZSBjYWNoZSBkZWZpbml0aW9uIGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBtYW55IHBpdm90IHRhYmxlcy4KKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdENhY2hlRGVmaW5pdGlvbiA6IFhtbEhlbHBlciB7CisgIGludGVybmFsIEV4Y2VsUGl2b3RDYWNoZURlZmluaXRpb24oWG1sTmFtZXNwYWNlTWFuYWdlciBucywgRXhjZWxQaXZvdFRhYmxlIHBpdm90VGFibGUpCisgICAgICA6IGJhc2UobnMsIG51bGwpIHsKKyAgICBmb3JlYWNoICh2YXIgciBpbiBwaXZvdFRhYmxlLlBhcnQuR2V0UmVsYXRpb25zaGlwc0J5VHlwZSgKKyAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9waXZvdENhY2hlRGVmaW5pdGlvbiIpKSB7CisgICAgICBSZWxhdGlvbnNoaXAgPSByOwogICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENhY2hlIGRlZmluaXRpb24uIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgc291cmNlIGRhdGEuIE5vdGUgdGhhdCBvbmUgY2FjaGUgZGVmaW5pdGlvbiBjYW4gYmUgc2hhcmVkIGJldHdlZW4gbWFueSBwaXZvdCB0YWJsZXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdENhY2hlRGVmaW5pdGlvbiA6IFhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdENhY2hlRGVmaW5pdGlvbihYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBFeGNlbFBpdm90VGFibGUgcGl2b3RUYWJsZSkgOgotICAgICAgICAgICAgYmFzZShucywgbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yZWFjaCAodmFyIHIgaW4gcGl2b3RUYWJsZS5QYXJ0LkdldFJlbGF0aW9uc2hpcHNCeVR5cGUoRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3Bpdm90Q2FjaGVEZWZpbml0aW9uIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUmVsYXRpb25zaGlwID0gcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENhY2hlRGVmaW5pdGlvblVyaSA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShSZWxhdGlvbnNoaXAuU291cmNlVXJpLCBSZWxhdGlvbnNoaXAuVGFyZ2V0VXJpKTsKKyAgICBDYWNoZURlZmluaXRpb25VcmkgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkoUmVsYXRpb25zaGlwLlNvdXJjZVVyaSwgUmVsYXRpb25zaGlwLlRhcmdldFVyaSk7CiAKLSAgICAgICAgICAgIHZhciBwY2sgPSBwaXZvdFRhYmxlLldvcmtTaGVldC5fcGFja2FnZS5QYWNrYWdlOwotICAgICAgICAgICAgUGFydCA9IHBjay5HZXRQYXJ0KENhY2hlRGVmaW5pdGlvblVyaSk7Ci0gICAgICAgICAgICBDYWNoZURlZmluaXRpb25YbWwgPSBuZXcgWG1sRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIExvYWRYbWxTYWZlKENhY2hlRGVmaW5pdGlvblhtbCwgUGFydC5HZXRTdHJlYW0oKSk7CisgICAgdmFyIHBjayA9IHBpdm90VGFibGUuV29ya1NoZWV0Ll9wYWNrYWdlLlBhY2thZ2U7CisgICAgUGFydCA9IHBjay5HZXRQYXJ0KENhY2hlRGVmaW5pdGlvblVyaSk7CisgICAgQ2FjaGVEZWZpbml0aW9uWG1sID0gbmV3KCk7CisgICAgTG9hZFhtbFNhZmUoQ2FjaGVEZWZpbml0aW9uWG1sLCBQYXJ0LkdldFN0cmVhbSgpKTsKIAotICAgICAgICAgICAgVG9wTm9kZSA9IENhY2hlRGVmaW5pdGlvblhtbC5Eb2N1bWVudEVsZW1lbnQ7Ci0gICAgICAgICAgICBQaXZvdFRhYmxlID0gcGl2b3RUYWJsZTsKLSAgICAgICAgICAgIGlmIChDYWNoZVNvdXJjZSA9PSBlU291cmNlVHlwZS5Xb3Jrc2hlZXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHdvcmtzaGVldE5hbWUgPSBHZXRYbWxOb2RlU3RyaW5nKF9zb3VyY2VXb3Jrc2hlZXRQYXRoKTsKLSAgICAgICAgICAgICAgICBpZiAocGl2b3RUYWJsZS5Xb3JrU2hlZXQuV29ya2Jvb2suV29ya3NoZWV0cy5BbnkodCA9PiB0Lk5hbWUgPT0gd29ya3NoZWV0TmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfc291cmNlUmFuZ2UgPSBwaXZvdFRhYmxlLldvcmtTaGVldC5Xb3JrYm9vay5Xb3Jrc2hlZXRzW3dvcmtzaGVldE5hbWVdLkNlbGxzW0dldFhtbE5vZGVTdHJpbmcoX3NvdXJjZUFkZHJlc3NQYXRoKV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsUGl2b3RDYWNoZURlZmluaXRpb24oWG1sTmFtZXNwYWNlTWFuYWdlciBucywgRXhjZWxQaXZvdFRhYmxlIHBpdm90VGFibGUsIEV4Y2VsUmFuZ2VCYXNlIHNvdXJjZUFkZHJlc3MsIGludCB0YmxJZCkgOgotICAgICAgICAgICAgYmFzZShucywgbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgUGl2b3RUYWJsZSA9IHBpdm90VGFibGU7CisgICAgVG9wTm9kZSA9IENhY2hlRGVmaW5pdGlvblhtbC5Eb2N1bWVudEVsZW1lbnQ7CisgICAgUGl2b3RUYWJsZSA9IHBpdm90VGFibGU7CisgICAgaWYgKENhY2hlU291cmNlID09IGVTb3VyY2VUeXBlLldvcmtzaGVldCkgeworICAgICAgdmFyIHdvcmtzaGVldE5hbWUgPSBHZXRYbWxOb2RlU3RyaW5nKF9zb3VyY2VXb3Jrc2hlZXRQYXRoKTsKKyAgICAgIGlmIChwaXZvdFRhYmxlLldvcmtTaGVldC5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkFueSh0ID0+IHQuTmFtZSA9PSB3b3Jrc2hlZXROYW1lKSkgeworICAgICAgICBfc291cmNlUmFuZ2UgPSBwaXZvdFRhYmxlCisgICAgICAgICAgICAuV29ya1NoZWV0CisgICAgICAgICAgICAuV29ya2Jvb2sKKyAgICAgICAgICAgIC5Xb3Jrc2hlZXRzW3dvcmtzaGVldE5hbWVdLkNlbGxzW0dldFhtbE5vZGVTdHJpbmcoX3NvdXJjZUFkZHJlc3NQYXRoKV07CisgICAgICB9CisgICAgfQorICB9CiAKLSAgICAgICAgICAgIHZhciBwY2sgPSBwaXZvdFRhYmxlLldvcmtTaGVldC5fcGFja2FnZS5QYWNrYWdlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvL0NhY2hlRGVmaW5pdGlvbgotICAgICAgICAgICAgQ2FjaGVEZWZpbml0aW9uWG1sID0gbmV3IFhtbERvY3VtZW50KCk7Ci0gICAgICAgICAgICBMb2FkWG1sU2FmZShDYWNoZURlZmluaXRpb25YbWwsIEdldFN0YXJ0WG1sKHNvdXJjZUFkZHJlc3MpLCBFbmNvZGluZy5VVEY4KTsKLSAgICAgICAgICAgIENhY2hlRGVmaW5pdGlvblVyaSA9IEdldE5ld1VyaShwY2ssICIveGwvcGl2b3RDYWNoZS9waXZvdENhY2hlRGVmaW5pdGlvbnswfS54bWwiLCB0YmxJZCk7IAotICAgICAgICAgICAgUGFydCA9IHBjay5DcmVhdGVQYXJ0KENhY2hlRGVmaW5pdGlvblVyaSwgRXhjZWxQYWNrYWdlLnNjaGVtYVBpdm90Q2FjaGVEZWZpbml0aW9uKTsKLSAgICAgICAgICAgIFRvcE5vZGUgPSBDYWNoZURlZmluaXRpb25YbWwuRG9jdW1lbnRFbGVtZW50OworICBpbnRlcm5hbCBFeGNlbFBpdm90Q2FjaGVEZWZpbml0aW9uKAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBucywKKyAgICAgIEV4Y2VsUGl2b3RUYWJsZSBwaXZvdFRhYmxlLAorICAgICAgRXhjZWxSYW5nZUJhc2Ugc291cmNlQWRkcmVzcywKKyAgICAgIGludCB0YmxJZCkKKyAgICAgIDogYmFzZShucywgbnVsbCkgeworICAgIFBpdm90VGFibGUgPSBwaXZvdFRhYmxlOwogCi0gICAgICAgICAgICAvL0NhY2hlUmVjb3JkLiBDcmVhdGUgYW4gZW1wdHkgb25lLgotICAgICAgICAgICAgQ2FjaGVSZWNvcmRVcmkgPSBHZXROZXdVcmkocGNrLCAiL3hsL3Bpdm90Q2FjaGUvcGl2b3RDYWNoZVJlY29yZHN7MH0ueG1sIiwgdGJsSWQpOyAKLSAgICAgICAgICAgIHZhciBjYWNoZVJlY29yZCA9IG5ldyBYbWxEb2N1bWVudCgpOwotICAgICAgICAgICAgY2FjaGVSZWNvcmQuTG9hZFhtbCgiPHBpdm90Q2FjaGVSZWNvcmRzIHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCIgeG1sbnM6cj1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHNcIiBjb3VudD1cIjBcIiAvPiIpOwotICAgICAgICAgICAgdmFyIHJlY1BhcnQgPSBwY2suQ3JlYXRlUGFydChDYWNoZVJlY29yZFVyaSwgRXhjZWxQYWNrYWdlLnNjaGVtYVBpdm90Q2FjaGVSZWNvcmRzKTsKLSAgICAgICAgICAgIGNhY2hlUmVjb3JkLlNhdmUocmVjUGFydC5HZXRTdHJlYW0oKSk7CisgICAgdmFyIHBjayA9IHBpdm90VGFibGUuV29ya1NoZWV0Ll9wYWNrYWdlLlBhY2thZ2U7CiAKLSAgICAgICAgICAgIFJlY29yZFJlbGF0aW9uc2hpcCA9IFBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShDYWNoZURlZmluaXRpb25VcmksIENhY2hlUmVjb3JkVXJpKSwgUGFja2FnaW5nLlRhcmdldE1vZGUuSW50ZXJuYWwsIEV4Y2VsUGFja2FnZS5zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9waXZvdENhY2hlUmVjb3JkcyIpOwotICAgICAgICAgICAgUmVjb3JkUmVsYXRpb25zaGlwSUQgPSBSZWNvcmRSZWxhdGlvbnNoaXAuSWQ7CisgICAgLy9DYWNoZURlZmluaXRpb24KKyAgICBDYWNoZURlZmluaXRpb25YbWwgPSBuZXcoKTsKKyAgICBMb2FkWG1sU2FmZShDYWNoZURlZmluaXRpb25YbWwsIEdldFN0YXJ0WG1sKHNvdXJjZUFkZHJlc3MpLCBFbmNvZGluZy5VVEY4KTsKKyAgICBDYWNoZURlZmluaXRpb25VcmkgPSBHZXROZXdVcmkocGNrLCAiL3hsL3Bpdm90Q2FjaGUvcGl2b3RDYWNoZURlZmluaXRpb257MH0ueG1sIiwgdGJsSWQpOworICAgIFBhcnQgPSBwY2suQ3JlYXRlUGFydChDYWNoZURlZmluaXRpb25VcmksIEV4Y2VsUGFja2FnZS5fc2NoZW1hUGl2b3RDYWNoZURlZmluaXRpb24pOworICAgIFRvcE5vZGUgPSBDYWNoZURlZmluaXRpb25YbWwuRG9jdW1lbnRFbGVtZW50OwogCi0gICAgICAgICAgICBDYWNoZURlZmluaXRpb25YbWwuU2F2ZShQYXJ0LkdldFN0cmVhbSgpKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlZmVyZW5jZSB0byB0aGUgaW50ZXJuYWwgcGFja2FnZSBwYXJ0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBQYXJ0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFhNTCBkYXRhIHJlcHJlc2VudGluZyB0aGUgY2FjaGUgZGVmaW5pdGlvbiBpbiB0aGUgcGFja2FnZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIFhtbERvY3VtZW50IENhY2hlRGVmaW5pdGlvblhtbCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHBhY2thZ2UgaW50ZXJuYWwgVVJJIHRvIHRoZSBwaXZvdHRhYmxlIGNhY2hlIGRlZmluaXRpb24gWG1sIERvY3VtZW50LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgVXJpIENhY2hlRGVmaW5pdGlvblVyaQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgVXJpIENhY2hlUmVjb3JkVXJpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBQYWNrYWdpbmcuWmlwUGFja2FnZVJlbGF0aW9uc2hpcCBSZWxhdGlvbnNoaXAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgc2V0OwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUmVsYXRpb25zaGlwIFJlY29yZFJlbGF0aW9uc2hpcAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFJlY29yZFJlbGF0aW9uc2hpcElEIAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygiQHI6aWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkByOmlkIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlZmVyZWNlIHRvIHRoZSBQaXZvVGFibGUgb2JqZWN0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFBpdm90VGFibGUgUGl2b3RUYWJsZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBwcml2YXRlIHNldDsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgY29uc3Qgc3RyaW5nIF9zb3VyY2VXb3Jrc2hlZXRQYXRoPSJkOmNhY2hlU291cmNlL2Q6d29ya3NoZWV0U291cmNlL0BzaGVldCI7Ci0gICAgICAgIGNvbnN0IHN0cmluZyBfc291cmNlTmFtZVBhdGggPSAiZDpjYWNoZVNvdXJjZS9kOndvcmtzaGVldFNvdXJjZS9AbmFtZSI7Ci0gICAgICAgIGNvbnN0IHN0cmluZyBfc291cmNlQWRkcmVzc1BhdGggPSAiZDpjYWNoZVNvdXJjZS9kOndvcmtzaGVldFNvdXJjZS9AcmVmIjsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxSYW5nZUJhc2UgX3NvdXJjZVJhbmdlID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHNvdXJjZSBkYXRhIHJhbmdlIHdoZW4gdGhlIHBpdm90dGFibGUgaGFzIGEgd29ya3NoZWV0IGRhdGFzb3VyY2UuIAotICAgICAgICAvLy8gVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSByYW5nZSBtdXN0IGJlIGludGFjdCBpZiB0aGlzIHByb3BlcnR5IGlzIGNoYW5nZWQuCi0gICAgICAgIC8vLyBUaGUgcmFuZ2UgbXVzdCBiZSBpbiB0aGUgc2FtZSB3b3JrYm9vayBhcyB0aGUgcGl2b3R0YWJsZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsUmFuZ2VCYXNlIFNvdXJjZVJhbmdlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfc291cmNlUmFuZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChDYWNoZVNvdXJjZSA9PSBlU291cmNlVHlwZS5Xb3Jrc2hlZXQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciB3cyA9IFBpdm90VGFibGUuV29ya1NoZWV0Lldvcmtib29rLldvcmtzaGVldHNbR2V0WG1sTm9kZVN0cmluZyhfc291cmNlV29ya3NoZWV0UGF0aCldOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdzID09IG51bGwpIC8vTm90IHdvcmtzaGVldCwgY2hlY2sgbmFtZSBvciB0YWJsZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBHZXRYbWxOb2RlU3RyaW5nKF9zb3VyY2VOYW1lUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIG4gaW4gUGl2b3RUYWJsZS5Xb3JrU2hlZXQuV29ya2Jvb2suTmFtZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuYW1lLkVxdWFscyhuLk5hbWUsU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zb3VyY2VSYW5nZSA9IG47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3NvdXJjZVJhbmdlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciB3IGluIFBpdm90VGFibGUuV29ya1NoZWV0Lldvcmtib29rLldvcmtzaGVldHMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAody5UYWJsZXMuX3RhYmxlTmFtZXMuQ29udGFpbnNLZXkobmFtZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zb3VyY2VSYW5nZSA9IHcuQ2VsbHNbdy5UYWJsZXNbbmFtZV0uQWRkcmVzcy5BZGRyZXNzXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBuIGluIHcuTmFtZXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLkVxdWFscyhuLk5hbWUsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zb3VyY2VSYW5nZSA9IG47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NvdXJjZVJhbmdlID0gd3MuQ2VsbHNbR2V0WG1sTm9kZVN0cmluZyhfc291cmNlQWRkcmVzc1BhdGgpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjYWNoZXNvdXJjZSBpcyBub3QgYSB3b3Jrc2hlZXQiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgLy9DYWNoZVJlY29yZC4gQ3JlYXRlIGFuIGVtcHR5IG9uZS4KKyAgICBDYWNoZVJlY29yZFVyaSA9IEdldE5ld1VyaShwY2ssICIveGwvcGl2b3RDYWNoZS9waXZvdENhY2hlUmVjb3Jkc3swfS54bWwiLCB0YmxJZCk7CisgICAgdmFyIGNhY2hlUmVjb3JkID0gbmV3IFhtbERvY3VtZW50KCk7CisgICAgY2FjaGVSZWNvcmQuTG9hZFhtbCgKKyAgICAgICAgIjxwaXZvdENhY2hlUmVjb3JkcyB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiIHhtbG5zOnI9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzXCIgY291bnQ9XCIwXCIgLz4iKTsKKyAgICB2YXIgcmVjUGFydCA9IHBjay5DcmVhdGVQYXJ0KENhY2hlUmVjb3JkVXJpLCBFeGNlbFBhY2thZ2UuX3NjaGVtYVBpdm90Q2FjaGVSZWNvcmRzKTsKKyAgICBjYWNoZVJlY29yZC5TYXZlKHJlY1BhcnQuR2V0U3RyZWFtKCkpOworCisgICAgUmVjb3JkUmVsYXRpb25zaGlwID0gUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoCisgICAgICAgIFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShDYWNoZURlZmluaXRpb25VcmksIENhY2hlUmVjb3JkVXJpKSwKKyAgICAgICAgVGFyZ2V0TW9kZS5JbnRlcm5hbCwKKyAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9waXZvdENhY2hlUmVjb3JkcyIpOworICAgIFJlY29yZFJlbGF0aW9uc2hpcElEID0gUmVjb3JkUmVsYXRpb25zaGlwLklkOworCisgICAgQ2FjaGVEZWZpbml0aW9uWG1sLlNhdmUoUGFydC5HZXRTdHJlYW0oKSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIHBhY2thZ2UgcGFydAorICAvLy8gPC9zdW1tYXJ5PgorICBpbnRlcm5hbCBaaXBQYWNrYWdlUGFydCBQYXJ0IHsgZ2V0OyBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFhNTCBkYXRhIHJlcHJlc2VudGluZyB0aGUgY2FjaGUgZGVmaW5pdGlvbiBpbiB0aGUgcGFja2FnZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIFhtbERvY3VtZW50IENhY2hlRGVmaW5pdGlvblhtbCB7IGdldDsgcHJpdmF0ZSBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgcGFja2FnZSBpbnRlcm5hbCBVUkkgdG8gdGhlIHBpdm90dGFibGUgY2FjaGUgZGVmaW5pdGlvbiBYbWwgRG9jdW1lbnQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBVcmkgQ2FjaGVEZWZpbml0aW9uVXJpIHsgZ2V0OyBpbnRlcm5hbCBzZXQ7IH0KKworICBpbnRlcm5hbCBVcmkgQ2FjaGVSZWNvcmRVcmkgeyBnZXQ7IHNldDsgfQorCisgIGludGVybmFsIFppcFBhY2thZ2VSZWxhdGlvbnNoaXAgUmVsYXRpb25zaGlwIHsgZ2V0OyBzZXQ7IH0KKworICBpbnRlcm5hbCBaaXBQYWNrYWdlUmVsYXRpb25zaGlwIFJlY29yZFJlbGF0aW9uc2hpcCB7IGdldDsgc2V0OyB9CisKKyAgaW50ZXJuYWwgc3RyaW5nIFJlY29yZFJlbGF0aW9uc2hpcElEIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZygiQHI6aWQiKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZygiQHI6aWQiLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZWZlcmVjZSB0byB0aGUgUGl2b1RhYmxlIG9iamVjdAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlIFBpdm90VGFibGUgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3NvdXJjZVdvcmtzaGVldFBhdGggPSAiZDpjYWNoZVNvdXJjZS9kOndvcmtzaGVldFNvdXJjZS9Ac2hlZXQiOworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfc291cmNlTmFtZVBhdGggPSAiZDpjYWNoZVNvdXJjZS9kOndvcmtzaGVldFNvdXJjZS9AbmFtZSI7CisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9zb3VyY2VBZGRyZXNzUGF0aCA9ICJkOmNhY2hlU291cmNlL2Q6d29ya3NoZWV0U291cmNlL0ByZWYiOworICBpbnRlcm5hbCBFeGNlbFJhbmdlQmFzZSBfc291cmNlUmFuZ2U7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIHNvdXJjZSBkYXRhIHJhbmdlIHdoZW4gdGhlIHBpdm90dGFibGUgaGFzIGEgd29ya3NoZWV0IGRhdGFzb3VyY2UuCisgIC8vLyBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHJhbmdlIG11c3QgYmUgaW50YWN0IGlmIHRoaXMgcHJvcGVydHkgaXMgY2hhbmdlZC4KKyAgLy8vIFRoZSByYW5nZSBtdXN0IGJlIGluIHRoZSBzYW1lIHdvcmtib29rIGFzIHRoZSBwaXZvdHRhYmxlLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxSYW5nZUJhc2UgU291cmNlUmFuZ2UgeworICAgIGdldCB7CisgICAgICBpZiAoX3NvdXJjZVJhbmdlID09IG51bGwpIHsKKyAgICAgICAgaWYgKENhY2hlU291cmNlID09IGVTb3VyY2VUeXBlLldvcmtzaGVldCkgeworICAgICAgICAgIHZhciB3cyA9IFBpdm90VGFibGUuV29ya1NoZWV0Lldvcmtib29rLldvcmtzaGVldHNbR2V0WG1sTm9kZVN0cmluZyhfc291cmNlV29ya3NoZWV0UGF0aCldOworICAgICAgICAgIGlmICh3cworICAgICAgICAgICAgICA9PSBudWxsKSAvL05vdCB3b3Jrc2hlZXQsIGNoZWNrIG5hbWUgb3IgdGFibGUgbmFtZQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHZhciBuYW1lID0gR2V0WG1sTm9kZVN0cmluZyhfc291cmNlTmFtZVBhdGgpOworICAgICAgICAgICAgZm9yZWFjaCAodmFyIG4gaW4gUGl2b3RUYWJsZS5Xb3JrU2hlZXQuV29ya2Jvb2suTmFtZXMpIHsKKyAgICAgICAgICAgICAgaWYgKG5hbWUuRXF1YWxzKG4uTmFtZSwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpIHsKKyAgICAgICAgICAgICAgICBfc291cmNlUmFuZ2UgPSBuOwogICAgICAgICAgICAgICAgIHJldHVybiBfc291cmNlUmFuZ2U7CisgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChQaXZvdFRhYmxlLldvcmtTaGVldC5Xb3JrYm9vayAhPSB2YWx1ZS5Xb3Jrc2hlZXQuV29ya2Jvb2spCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJSYW5nZSBtdXN0IGJlIGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIHBpdm90dGFibGUiKSk7CisgICAgICAgICAgICBmb3JlYWNoICh2YXIgdyBpbiBQaXZvdFRhYmxlLldvcmtTaGVldC5Xb3JrYm9vay5Xb3Jrc2hlZXRzKSB7CisgICAgICAgICAgICAgIGlmICh3LlRhYmxlcy5fdGFibGVOYW1lcy5Db250YWluc0tleShuYW1lKSkgeworICAgICAgICAgICAgICAgIF9zb3VyY2VSYW5nZSA9IHcuQ2VsbHNbdy5UYWJsZXNbbmFtZV0uQWRkcmVzcy5BZGRyZXNzXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgbiBpbiB3Lk5hbWVzKSB7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUuRXF1YWxzKG4uTmFtZSwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpIHsKKyAgICAgICAgICAgICAgICAgIF9zb3VyY2VSYW5nZSA9IG47CisgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB2YXIgc3I9U291cmNlUmFuZ2U7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlLkVuZC5Db2x1bW4gLSB2YWx1ZS5TdGFydC5Db2x1bW4gIT0gc3IuRW5kLkNvbHVtbiAtIHNyLlN0YXJ0LkNvbHVtbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkNhbiBub3QgY2hhbmdlIHRoZSBudW1iZXIgb2YgY29sdW1ucyhmaWVsZHMpIGluIHRoZSBTb3VyY2VSYW5nZSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9zb3VyY2VXb3Jrc2hlZXRQYXRoLCB2YWx1ZS5Xb3Jrc2hlZXQuTmFtZSk7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhfc291cmNlQWRkcmVzc1BhdGgsIHZhbHVlLkZpcnN0QWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgX3NvdXJjZVJhbmdlID0gdmFsdWU7CisgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX3NvdXJjZVJhbmdlID0gd3MuQ2VsbHNbR2V0WG1sTm9kZVN0cmluZyhfc291cmNlQWRkcmVzc1BhdGgpXTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNhY2hlc291cmNlIGlzIG5vdCBhIHdvcmtzaGVldCIpKTsKICAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUeXBlIG9mIHNvdXJjZSBkYXRhCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlU291cmNlVHlwZSBDYWNoZVNvdXJjZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgcz1HZXRYbWxOb2RlU3RyaW5nKCJkOmNhY2hlU291cmNlL0B0eXBlIik7Ci0gICAgICAgICAgICAgICAgaWYgKHMgPT0gIiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVNvdXJjZVR5cGUuV29ya3NoZWV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVTb3VyY2VUeXBlKUVudW0uUGFyc2UodHlwZW9mKGVTb3VyY2VUeXBlKSwgcywgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIEdldFN0YXJ0WG1sKEV4Y2VsUmFuZ2VCYXNlIHNvdXJjZUFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyB4bWw9IjxwaXZvdENhY2hlRGVmaW5pdGlvbiB4bWxucz1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpblwiIHhtbG5zOnI9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzXCIgcjppZD1cIlwiIHJlZnJlc2hPbkxvYWQ9XCIxXCIgcmVmcmVzaGVkQnk9XCJTb21lVXNlclwiIHJlZnJlc2hlZERhdGU9XCI0MDUwNC41ODI0MDMxMjUwMDFcIiBjcmVhdGVkVmVyc2lvbj1cIjFcIiByZWZyZXNoZWRWZXJzaW9uPVwiM1wiIHJlY29yZENvdW50PVwiNVwiIHVwZ3JhZGVPblJlZnJlc2g9XCIxXCI+IjsKLQotICAgICAgICAgICAgeG1sICs9ICI8Y2FjaGVTb3VyY2UgdHlwZT1cIndvcmtzaGVldFwiPiI7Ci0gICAgICAgICAgICB4bWwgKz0gc3RyaW5nLkZvcm1hdCgiPHdvcmtzaGVldFNvdXJjZSByZWY9XCJ7MH1cIiBzaGVldD1cInsxfVwiIC8+ICIsIHNvdXJjZUFkZHJlc3MuQWRkcmVzcywgc291cmNlQWRkcmVzcy5Xb3JrU2hlZXQpOwotICAgICAgICAgICAgeG1sICs9ICI8L2NhY2hlU291cmNlPiI7Ci0gICAgICAgICAgICB4bWwgKz0gc3RyaW5nLkZvcm1hdCgiPGNhY2hlRmllbGRzIGNvdW50PVwiezB9XCI+Iiwgc291cmNlQWRkcmVzcy5fdG9Db2wgLSBzb3VyY2VBZGRyZXNzLl9mcm9tQ29sICsgMSk7Ci0gICAgICAgICAgICB2YXIgc291cmNlV29ya3NoZWV0ID0gUGl2b3RUYWJsZS5Xb3JrU2hlZXQuV29ya2Jvb2suV29ya3NoZWV0c1tzb3VyY2VBZGRyZXNzLldvcmtTaGVldF07Ci0gICAgICAgICAgICBmb3IgKGludCBjb2wgPSBzb3VyY2VBZGRyZXNzLl9mcm9tQ29sOyBjb2wgPD0gc291cmNlQWRkcmVzcy5fdG9Db2w7IGNvbCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChzb3VyY2VXb3Jrc2hlZXQgPT0gbnVsbCB8fCBzb3VyY2VXb3Jrc2hlZXQuX3ZhbHVlcy5HZXRWYWx1ZShzb3VyY2VBZGRyZXNzLl9mcm9tUm93LCBjb2wpID09IG51bGwgfHwgc291cmNlV29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoc291cmNlQWRkcmVzcy5fZnJvbVJvdywgY29sKS5Ub1N0cmluZygpLlRyaW0oKSA9PSAiIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbCArPSBzdHJpbmcuRm9ybWF0KCI8Y2FjaGVGaWVsZCBuYW1lPVwiQ29sdW1uezB9XCIgbnVtRm10SWQ9XCIwXCI+IiwgY29sIC0gc291cmNlQWRkcmVzcy5fZnJvbUNvbCArIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB4bWwgKz0gc3RyaW5nLkZvcm1hdCgiPGNhY2hlRmllbGQgbmFtZT1cInswfVwiIG51bUZtdElkPVwiMFwiPiIsIHNvdXJjZVdvcmtzaGVldC5fdmFsdWVzLkdldFZhbHVlKHNvdXJjZUFkZHJlc3MuX2Zyb21Sb3csIGNvbCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvL3htbCArPSAiPHNoYXJlZEl0ZW1zIGNvbnRhaW5zTm9uRGF0ZT1cIjBcIiBjb250YWluc1N0cmluZz1cIjBcIiBjb250YWluc0JsYW5rPVwiMVwiIC8+ICI7Ci0gICAgICAgICAgICAgICAgeG1sICs9ICI8c2hhcmVkSXRlbXMgY29udGFpbnNCbGFuaz1cIjFcIiAvPiAiOwotICAgICAgICAgICAgICAgIHhtbCArPSAiPC9jYWNoZUZpZWxkPiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4bWwgKz0gIjwvY2FjaGVGaWVsZHM+IjsKLSAgICAgICAgICAgIHhtbCArPSAiPC9waXZvdENhY2hlRGVmaW5pdGlvbj4iOwotCi0gICAgICAgICAgICByZXR1cm4geG1sOwotICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gX3NvdXJjZVJhbmdlOwogICAgIH0KKyAgICBzZXQgeworICAgICAgaWYgKFBpdm90VGFibGUuV29ya1NoZWV0Lldvcmtib29rICE9IHZhbHVlLldvcmtzaGVldC5Xb3JrYm9vaykgeworICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJSYW5nZSBtdXN0IGJlIGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIHBpdm90dGFibGUiKSk7CisgICAgICB9CisKKyAgICAgIHZhciBzciA9IFNvdXJjZVJhbmdlOworICAgICAgaWYgKHZhbHVlLkVuZC5Db2x1bW4gLSB2YWx1ZS5TdGFydC5Db2x1bW4gIT0gc3IuRW5kLkNvbHVtbiAtIHNyLlN0YXJ0LkNvbHVtbikgeworICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICJDYW4gbm90IGNoYW5nZSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMoZmllbGRzKSBpbiB0aGUgU291cmNlUmFuZ2UiKSk7CisgICAgICB9CisKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3NvdXJjZVdvcmtzaGVldFBhdGgsIHZhbHVlLldvcmtzaGVldC5OYW1lKTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX3NvdXJjZUFkZHJlc3NQYXRoLCB2YWx1ZS5GaXJzdEFkZHJlc3MpOworICAgICAgX3NvdXJjZVJhbmdlID0gdmFsdWU7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHlwZSBvZiBzb3VyY2UgZGF0YQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZVNvdXJjZVR5cGUgQ2FjaGVTb3VyY2UgeworICAgIGdldCB7CisgICAgICB2YXIgcyA9IEdldFhtbE5vZGVTdHJpbmcoImQ6Y2FjaGVTb3VyY2UvQHR5cGUiKTsKKyAgICAgIGlmIChzID09ICIiKSB7CisgICAgICAgIHJldHVybiBlU291cmNlVHlwZS5Xb3Jrc2hlZXQ7CisgICAgICB9CisgICAgICByZXR1cm4gKGVTb3VyY2VUeXBlKUVudW0uUGFyc2UodHlwZW9mKGVTb3VyY2VUeXBlKSwgcywgdHJ1ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdHJpbmcgR2V0U3RhcnRYbWwoRXhjZWxSYW5nZUJhc2Ugc291cmNlQWRkcmVzcykgeworICAgIHN0cmluZyB4bWwgPQorICAgICAgICAiPHBpdm90Q2FjaGVEZWZpbml0aW9uIHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCIgeG1sbnM6cj1cImh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHNcIiByOmlkPVwiXCIgcmVmcmVzaE9uTG9hZD1cIjFcIiByZWZyZXNoZWRCeT1cIlNvbWVVc2VyXCIgcmVmcmVzaGVkRGF0ZT1cIjQwNTA0LjU4MjQwMzEyNTAwMVwiIGNyZWF0ZWRWZXJzaW9uPVwiMVwiIHJlZnJlc2hlZFZlcnNpb249XCIzXCIgcmVjb3JkQ291bnQ9XCI1XCIgdXBncmFkZU9uUmVmcmVzaD1cIjFcIj4iOworCisgICAgeG1sICs9ICI8Y2FjaGVTb3VyY2UgdHlwZT1cIndvcmtzaGVldFwiPiI7CisgICAgeG1sICs9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICI8d29ya3NoZWV0U291cmNlIHJlZj1cInswfVwiIHNoZWV0PVwiezF9XCIgLz4gIiwKKyAgICAgICAgc291cmNlQWRkcmVzcy5BZGRyZXNzLAorICAgICAgICBzb3VyY2VBZGRyZXNzLldvcmtTaGVldCk7CisgICAgeG1sICs9ICI8L2NhY2hlU291cmNlPiI7CisgICAgeG1sICs9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICI8Y2FjaGVGaWVsZHMgY291bnQ9XCJ7MH1cIj4iLAorICAgICAgICBzb3VyY2VBZGRyZXNzLl90b0NvbCAtIHNvdXJjZUFkZHJlc3MuX2Zyb21Db2wgKyAxKTsKKyAgICB2YXIgc291cmNlV29ya3NoZWV0ID0gUGl2b3RUYWJsZS5Xb3JrU2hlZXQuV29ya2Jvb2suV29ya3NoZWV0c1tzb3VyY2VBZGRyZXNzLldvcmtTaGVldF07CisgICAgZm9yIChpbnQgY29sID0gc291cmNlQWRkcmVzcy5fZnJvbUNvbDsgY29sIDw9IHNvdXJjZUFkZHJlc3MuX3RvQ29sOyBjb2wrKykgeworICAgICAgaWYgKHNvdXJjZVdvcmtzaGVldCA9PSBudWxsCisgICAgICAgICAgfHwgc291cmNlV29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoc291cmNlQWRkcmVzcy5fZnJvbVJvdywgY29sKSA9PSBudWxsCisgICAgICAgICAgfHwgc291cmNlV29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoc291cmNlQWRkcmVzcy5fZnJvbVJvdywgY29sKS5Ub1N0cmluZygpLlRyaW0oKQorICAgICAgICAgICAgICA9PSAiIikgeworICAgICAgICB4bWwgKz0gc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICI8Y2FjaGVGaWVsZCBuYW1lPVwiQ29sdW1uezB9XCIgbnVtRm10SWQ9XCIwXCI+IiwKKyAgICAgICAgICAgIGNvbCAtIHNvdXJjZUFkZHJlc3MuX2Zyb21Db2wgKyAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHhtbCArPSBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgIjxjYWNoZUZpZWxkIG5hbWU9XCJ7MH1cIiBudW1GbXRJZD1cIjBcIj4iLAorICAgICAgICAgICAgc291cmNlV29ya3NoZWV0Ll92YWx1ZXMuR2V0VmFsdWUoc291cmNlQWRkcmVzcy5fZnJvbVJvdywgY29sKSk7CisgICAgICB9CisgICAgICAvL3htbCArPSAiPHNoYXJlZEl0ZW1zIGNvbnRhaW5zTm9uRGF0ZT1cIjBcIiBjb250YWluc1N0cmluZz1cIjBcIiBjb250YWluc0JsYW5rPVwiMVwiIC8+ICI7CisgICAgICB4bWwgKz0gIjxzaGFyZWRJdGVtcyBjb250YWluc0JsYW5rPVwiMVwiIC8+ICI7CisgICAgICB4bWwgKz0gIjwvY2FjaGVGaWVsZD4iOworICAgIH0KKyAgICB4bWwgKz0gIjwvY2FjaGVGaWVsZHM+IjsKKyAgICB4bWwgKz0gIjwvcGl2b3RDYWNoZURlZmluaXRpb24+IjsKKworICAgIHJldHVybiB4bWw7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZS5jcyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZS5jcwppbmRleCBlYzA5OTBkLi43NWM2MzYwIDEwMDY0NAotLS0gYS9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGUuY3MKKysrIGIvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw5MzcgKzEzLDcwMSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyMS1NQVItMjAxMQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7CiB1c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlRhYmxlOwordXNpbmcgU3lzdGVtLlhtbDsKK3VzaW5nIE9mZmljZU9wZW5YbWwuUGFja2FnaW5nOwogdXNpbmcgT2ZmaWNlT3BlblhtbC5VdGlsczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQW4gRXhjZWwgUGl2b3R0YWJsZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsUGl2b3RUYWJsZSA6IFhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlKFBhY2thZ2luZy5aaXBQYWNrYWdlUmVsYXRpb25zaGlwIHJlbCwgRXhjZWxXb3Jrc2hlZXQgc2hlZXQpIDogCi0gICAgICAgICAgICBiYXNlKHNoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdvcmtTaGVldCA9IHNoZWV0OwotICAgICAgICAgICAgUGl2b3RUYWJsZVVyaSA9IFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShyZWwuU291cmNlVXJpLCByZWwuVGFyZ2V0VXJpKTsKLSAgICAgICAgICAgIFJlbGF0aW9uc2hpcCA9IHJlbDsKLSAgICAgICAgICAgIHZhciBwY2sgPSBzaGVldC5fcGFja2FnZS5QYWNrYWdlOwotICAgICAgICAgICAgUGFydD1wY2suR2V0UGFydChQaXZvdFRhYmxlVXJpKTsKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7CiAKLSAgICAgICAgICAgIFBpdm90VGFibGVYbWwgPSBuZXcgWG1sRG9jdW1lbnQoKTsKLSAgICAgICAgICAgIExvYWRYbWxTYWZlKFBpdm90VGFibGVYbWwsIFBhcnQuR2V0U3RyZWFtKCkpOwotICAgICAgICAgICAgaW5pdCgpOwotICAgICAgICAgICAgVG9wTm9kZSA9IFBpdm90VGFibGVYbWwuRG9jdW1lbnRFbGVtZW50OwotICAgICAgICAgICAgQWRkcmVzcyA9IG5ldyBFeGNlbEFkZHJlc3NCYXNlKEdldFhtbE5vZGVTdHJpbmcoImQ6bG9jYXRpb24vQHJlZiIpKTsKKy8vLyA8c3VtbWFyeT4KKy8vLyBBbiBFeGNlbCBQaXZvdHRhYmxlCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsUGl2b3RUYWJsZSA6IFhtbEhlbHBlciB7CisgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZShaaXBQYWNrYWdlUmVsYXRpb25zaGlwIHJlbCwgRXhjZWxXb3Jrc2hlZXQgc2hlZXQpCisgICAgICA6IGJhc2Uoc2hlZXQuTmFtZVNwYWNlTWFuYWdlcikgeworICAgIFdvcmtTaGVldCA9IHNoZWV0OworICAgIFBpdm90VGFibGVVcmkgPSBVcmlIZWxwZXIuUmVzb2x2ZVBhcnRVcmkocmVsLlNvdXJjZVVyaSwgcmVsLlRhcmdldFVyaSk7CisgICAgUmVsYXRpb25zaGlwID0gcmVsOworICAgIHZhciBwY2sgPSBzaGVldC5fcGFja2FnZS5QYWNrYWdlOworICAgIFBhcnQgPSBwY2suR2V0UGFydChQaXZvdFRhYmxlVXJpKTsKIAotICAgICAgICAgICAgX2NhY2hlRGVmaW5pdGlvbiA9IG5ldyBFeGNlbFBpdm90Q2FjaGVEZWZpbml0aW9uKHNoZWV0Lk5hbWVTcGFjZU1hbmFnZXIsIHRoaXMpOwotICAgICAgICAgICAgTG9hZEZpZWxkcygpOworICAgIFBpdm90VGFibGVYbWwgPSBuZXcoKTsKKyAgICBMb2FkWG1sU2FmZShQaXZvdFRhYmxlWG1sLCBQYXJ0LkdldFN0cmVhbSgpKTsKKyAgICBJbml0KCk7CisgICAgVG9wTm9kZSA9IFBpdm90VGFibGVYbWwuRG9jdW1lbnRFbGVtZW50OworICAgIEFkZHJlc3MgPSBuZXcoR2V0WG1sTm9kZVN0cmluZygiZDpsb2NhdGlvbi9AcmVmIikpOwogCi0gICAgICAgICAgICAvL0FkZCByb3cgZmllbGRzLgotICAgICAgICAgICAgZm9yZWFjaCAoWG1sRWxlbWVudCByb3dFbGVtIGluIFRvcE5vZGUuU2VsZWN0Tm9kZXMoImQ6cm93RmllbGRzL2Q6ZmllbGQiLCBOYW1lU3BhY2VNYW5hZ2VyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgeDsKLSAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKHJvd0VsZW0uR2V0QXR0cmlidXRlKCJ4IiksIG91dCB4KSAmJiB4ID49IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBSb3dGaWVsZHMuQWRkSW50ZXJuYWwoRmllbGRzW3hdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcm93RWxlbS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKHJvd0VsZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICBfY2FjaGVEZWZpbml0aW9uID0gbmV3KHNoZWV0Lk5hbWVTcGFjZU1hbmFnZXIsIHRoaXMpOworICAgIExvYWRGaWVsZHMoKTsKIAotICAgICAgICAgICAgLy8vL0FkZCBjb2x1bW4gZmllbGRzLgotICAgICAgICAgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBjb2xFbGVtIGluIFRvcE5vZGUuU2VsZWN0Tm9kZXMoImQ6Y29sRmllbGRzL2Q6ZmllbGQiLCBOYW1lU3BhY2VNYW5hZ2VyKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgeDsKLSAgICAgICAgICAgICAgICBpZihpbnQuVHJ5UGFyc2UoY29sRWxlbS5HZXRBdHRyaWJ1dGUoIngiKSxvdXQgeCkgJiYgeCA+PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29sdW1uRmllbGRzLkFkZEludGVybmFsKEZpZWxkc1t4XSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbEVsZW0uUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChjb2xFbGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vQWRkIFBhZ2UgZWxlbWVudHMKLSAgICAgICAgICAgIC8vaW50IGluZGV4ID0gMDsKLSAgICAgICAgICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgcGFnZUVsZW0gaW4gVG9wTm9kZS5TZWxlY3ROb2RlcygiZDpwYWdlRmllbGRzL2Q6cGFnZUZpZWxkIiwgTmFtZVNwYWNlTWFuYWdlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGZsZDsKLSAgICAgICAgICAgICAgICBpZiAoaW50LlRyeVBhcnNlKHBhZ2VFbGVtLkdldEF0dHJpYnV0ZSgiZmxkIiksIG91dCBmbGQpICYmIGZsZCA+PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gRmllbGRzW2ZsZF07Ci0gICAgICAgICAgICAgICAgICAgIGZpZWxkLl9wYWdlRmllbGRTZXR0aW5ncyA9IG5ldyBFeGNlbFBpdm90VGFibGVQYWdlRmllbGRTZXR0aW5ncyhOYW1lU3BhY2VNYW5hZ2VyLCBwYWdlRWxlbSwgZmllbGQsIGZsZCk7Ci0gICAgICAgICAgICAgICAgICAgIFBhZ2VGaWVsZHMuQWRkSW50ZXJuYWwoZmllbGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9BZGQgZGF0YSBlbGVtZW50cwotICAgICAgICAgICAgLy9pbmRleCA9IDA7Ci0gICAgICAgICAgICBmb3JlYWNoIChYbWxFbGVtZW50IGRhdGFFbGVtIGluIFRvcE5vZGUuU2VsZWN0Tm9kZXMoImQ6ZGF0YUZpZWxkcy9kOmRhdGFGaWVsZCIsIE5hbWVTcGFjZU1hbmFnZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBmbGQ7Ci0gICAgICAgICAgICAgICAgaWYgKGludC5UcnlQYXJzZShkYXRhRWxlbS5HZXRBdHRyaWJ1dGUoImZsZCIpLCBvdXQgZmxkKSAmJiBmbGQgPj0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IEZpZWxkc1tmbGRdOwotICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YUZpZWxkID0gbmV3IEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZChOYW1lU3BhY2VNYW5hZ2VyLCBkYXRhRWxlbSwgZmllbGQpOwotICAgICAgICAgICAgICAgICAgICBEYXRhRmllbGRzLkFkZEludGVybmFsKGRhdGFGaWVsZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZCBhIG5ldyBwaXZvdHRhYmxlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2hlZXQiPlRoZSB3b3Jrc2hlZXQ8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPnRoZSBhZGRyZXNzIG9mIHRoZSBwaXZvdHRhYmxlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzb3VyY2VBZGRyZXNzIj5UaGUgYWRkcmVzcyBvZiB0aGUgU291cmNlIGRhdGE8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGJsSWQiPjwvcGFyYW0+Ci0gICAgICAgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZShFeGNlbFdvcmtzaGVldCBzaGVldCwgRXhjZWxBZGRyZXNzQmFzZSBhZGRyZXNzLEV4Y2VsUmFuZ2VCYXNlIHNvdXJjZUFkZHJlc3MsIHN0cmluZyBuYW1lLCBpbnQgdGJsSWQpIDogCi0gICAgICAgICAgICBiYXNlKHNoZWV0Lk5hbWVTcGFjZU1hbmFnZXIpCi0JICAgIHsKLSAgICAgICAgICAgIFdvcmtTaGVldCA9IHNoZWV0OwotICAgICAgICAgICAgQWRkcmVzcyA9IGFkZHJlc3M7Ci0gICAgICAgICAgICB2YXIgcGNrID0gc2hlZXQuX3BhY2thZ2UuUGFja2FnZTsKLQotICAgICAgICAgICAgUGl2b3RUYWJsZVhtbCA9IG5ldyBYbWxEb2N1bWVudCgpOwotICAgICAgICAgICAgTG9hZFhtbFNhZmUoUGl2b3RUYWJsZVhtbCwgR2V0U3RhcnRYbWwobmFtZSwgdGJsSWQsIGFkZHJlc3MsIHNvdXJjZUFkZHJlc3MpLCBFbmNvZGluZy5VVEY4KTsKLSAgICAgICAgICAgIFRvcE5vZGUgPSBQaXZvdFRhYmxlWG1sLkRvY3VtZW50RWxlbWVudDsKLSAgICAgICAgICAgIFBpdm90VGFibGVVcmkgPSAgR2V0TmV3VXJpKHBjaywgIi94bC9waXZvdFRhYmxlcy9waXZvdFRhYmxlezB9LnhtbCIsIHRibElkKTsKLSAgICAgICAgICAgIGluaXQoKTsKLQotICAgICAgICAgICAgUGFydCA9IHBjay5DcmVhdGVQYXJ0KFBpdm90VGFibGVVcmksIEV4Y2VsUGFja2FnZS5zY2hlbWFQaXZvdFRhYmxlKTsKLSAgICAgICAgICAgIFBpdm90VGFibGVYbWwuU2F2ZShQYXJ0LkdldFN0cmVhbSgpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy9Xb3Jrc2hlZXQtUGl2b3R0YWJsZSByZWxhdGlvbnNoaXAKLSAgICAgICAgICAgIFJlbGF0aW9uc2hpcCA9IHNoZWV0LlBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShzaGVldC5Xb3Jrc2hlZXRVcmksIFBpdm90VGFibGVVcmkpLCBQYWNrYWdpbmcuVGFyZ2V0TW9kZS5JbnRlcm5hbCwgRXhjZWxQYWNrYWdlLnNjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3Bpdm90VGFibGUiKTsKLQotICAgICAgICAgICAgX2NhY2hlRGVmaW5pdGlvbiA9IG5ldyBFeGNlbFBpdm90Q2FjaGVEZWZpbml0aW9uKHNoZWV0Lk5hbWVTcGFjZU1hbmFnZXIsIHRoaXMsIHNvdXJjZUFkZHJlc3MsIHRibElkKTsKLSAgICAgICAgICAgIF9jYWNoZURlZmluaXRpb24uUmVsYXRpb25zaGlwPVBhcnQuQ3JlYXRlUmVsYXRpb25zaGlwKFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShQaXZvdFRhYmxlVXJpLCBfY2FjaGVEZWZpbml0aW9uLkNhY2hlRGVmaW5pdGlvblVyaSksIFBhY2thZ2luZy5UYXJnZXRNb2RlLkludGVybmFsLCBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvcGl2b3RDYWNoZURlZmluaXRpb24iKTsKLQotICAgICAgICAgICAgc2hlZXQuV29ya2Jvb2suQWRkUGl2b3RUYWJsZShDYWNoZUlELlRvU3RyaW5nKCksIF9jYWNoZURlZmluaXRpb24uQ2FjaGVEZWZpbml0aW9uVXJpKTsKLQotICAgICAgICAgICAgTG9hZEZpZWxkcygpOwotCi0gICAgICAgICAgICB1c2luZyAodmFyIHI9c2hlZXQuQ2VsbHNbYWRkcmVzcy5BZGRyZXNzXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByLkNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBTY2hlbWFOb2RlT3JkZXIgPSBuZXcgc3RyaW5nW10geyAibG9jYXRpb24iLCAicGl2b3RGaWVsZHMiLCAicm93RmllbGRzIiwgInJvd0l0ZW1zIiwgImNvbEZpZWxkcyIsICJjb2xJdGVtcyIsICJwYWdlRmllbGRzIiwgInBhZ2VJdGVtcyIsICJkYXRhRmllbGRzIiwgImRhdGFJdGVtcyIsICJmb3JtYXRzIiwgInBpdm90VGFibGVTdHlsZUluZm8iIH07Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIExvYWRGaWVsZHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL0ZpZWxkcy5DbGVhcigpOwotICAgICAgICAgICAgLy9pbnQgaXg9MDsKLSAgICAgICAgICAgIC8vZm9yZWFjaChYbWxFbGVtZW50IGZpZWxkTm9kZSBpbiBQaXZvdFhtbC5TZWxlY3ROb2RlcygiLy9kOnBpdm90RmllbGRzL2Q6cGl2b3RGaWVsZCIsTmFtZVNwYWNlTWFuYWdlcikpCi0gICAgICAgICAgICAvL3sKLSAgICAgICAgICAgIC8vICAgIEZpZWxkcy5BZGRJbnRlcm5hbChuZXcgRXhjZWxQaXZvdFRhYmxlRmllbGQoTmFtZVNwYWNlTWFuYWdlciwgZmllbGROb2RlLCB0aGlzLCBpeCsrKSk7Ci0gICAgICAgICAgICAvL30KLQotICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgICAgICAgIC8vQWRkIGZpZWxkcy4KLSAgICAgICAgICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgZmllbGRFbGVtIGluIFRvcE5vZGUuU2VsZWN0Tm9kZXMoImQ6cGl2b3RGaWVsZHMvZDpwaXZvdEZpZWxkIiwgTmFtZVNwYWNlTWFuYWdlcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGZsZCA9IG5ldyBFeGNlbFBpdm90VGFibGVGaWVsZChOYW1lU3BhY2VNYW5hZ2VyLCBmaWVsZEVsZW0sIHRoaXMsIGluZGV4LCBpbmRleCsrKTsKLSAgICAgICAgICAgICAgICBGaWVsZHMuQWRkSW50ZXJuYWwoZmxkKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy9BZGQgZmllbGRzLgotICAgICAgICAgICAgaW5kZXggPSAwOwotICAgICAgICAgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBmaWVsZEVsZW0gaW4gX2NhY2hlRGVmaW5pdGlvbi5Ub3BOb2RlLlNlbGVjdE5vZGVzKCJkOmNhY2hlRmllbGRzL2Q6Y2FjaGVGaWVsZCIsIE5hbWVTcGFjZU1hbmFnZXIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBmbGQgPSBGaWVsZHNbaW5kZXgrK107Ci0gICAgICAgICAgICAgICAgZmxkLlNldENhY2hlRmllbGROb2RlKGZpZWxkRWxlbSk7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIEdldFN0YXJ0WG1sKHN0cmluZyBuYW1lLCBpbnQgaWQsIEV4Y2VsQWRkcmVzc0Jhc2UgYWRkcmVzcywgRXhjZWxBZGRyZXNzQmFzZSBzb3VyY2VBZGRyZXNzKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcgeG1sID0gc3RyaW5nLkZvcm1hdCgiPHBpdm90VGFibGVEZWZpbml0aW9uIHhtbG5zPVwiaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluXCIgbmFtZT1cInswfVwiIGNhY2hlSWQ9XCJ7MX1cIiBkYXRhT25Sb3dzPVwiMVwiIGFwcGx5TnVtYmVyRm9ybWF0cz1cIjBcIiBhcHBseUJvcmRlckZvcm1hdHM9XCIwXCIgYXBwbHlGb250Rm9ybWF0cz1cIjBcIiBhcHBseVBhdHRlcm5Gb3JtYXRzPVwiMFwiIGFwcGx5QWxpZ25tZW50Rm9ybWF0cz1cIjBcIiBhcHBseVdpZHRoSGVpZ2h0Rm9ybWF0cz1cIjFcIiBkYXRhQ2FwdGlvbj1cIkRhdGFcIiAgY3JlYXRlZFZlcnNpb249XCI0XCIgc2hvd01lbWJlclByb3BlcnR5VGlwcz1cIjBcIiB1c2VBdXRvRm9ybWF0dGluZz1cIjFcIiBpdGVtUHJpbnRUaXRsZXM9XCIxXCIgaW5kZW50PVwiMFwiIGNvbXBhY3Q9XCIwXCIgY29tcGFjdERhdGE9XCIwXCIgZ3JpZERyb3Bab25lcz1cIjFcIj4iLCBuYW1lLCBpZCk7Ci0KLSAgICAgICAgICAgIHhtbCArPSBzdHJpbmcuRm9ybWF0KCI8bG9jYXRpb24gcmVmPVwiezB9XCIgZmlyc3RIZWFkZXJSb3c9XCIxXCIgZmlyc3REYXRhUm93PVwiMVwiIGZpcnN0RGF0YUNvbD1cIjFcIiAvPiAiLCBhZGRyZXNzLkZpcnN0QWRkcmVzcyk7Ci0gICAgICAgICAgICB4bWwgKz0gc3RyaW5nLkZvcm1hdCgiPHBpdm90RmllbGRzIGNvdW50PVwiezB9XCI+Iiwgc291cmNlQWRkcmVzcy5fdG9Db2wtc291cmNlQWRkcmVzcy5fZnJvbUNvbCsxKTsKLSAgICAgICAgICAgIGZvciAoaW50IGNvbCA9IHNvdXJjZUFkZHJlc3MuX2Zyb21Db2w7IGNvbCA8PSBzb3VyY2VBZGRyZXNzLl90b0NvbDsgY29sKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeG1sICs9ICI8cGl2b3RGaWVsZCBzaG93QWxsPVwiMFwiIC8+IjsgLy9jb21wYWN0PVwiMFwiIG91dGxpbmU9XCIwXCIgc3VidG90YWxUb3A9XCIwXCIgaW5jbHVkZU5ld0l0ZW1zSW5GaWx0ZXI9XCIxXCIgICAgIAotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB4bWwgKz0gIjwvcGl2b3RGaWVsZHM+IjsKLSAgICAgICAgICAgIHhtbCArPSAiPHBpdm90VGFibGVTdHlsZUluZm8gbmFtZT1cIlBpdm90U3R5bGVNZWRpdW05XCIgc2hvd1Jvd0hlYWRlcnM9XCIxXCIgc2hvd0NvbEhlYWRlcnM9XCIxXCIgc2hvd1Jvd1N0cmlwZXM9XCIwXCIgc2hvd0NvbFN0cmlwZXM9XCIwXCIgc2hvd0xhc3RDb2x1bW49XCIxXCIgLz4iOwotICAgICAgICAgICAgeG1sICs9ICI8L3Bpdm90VGFibGVEZWZpbml0aW9uPiI7Ci0gICAgICAgICAgICByZXR1cm4geG1sOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIFBhY2thZ2luZy5aaXBQYWNrYWdlUGFydCBQYXJ0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIFhNTCBkYXRhIHJlcHJlc2VudGluZyB0aGUgcGl2b3R0YWJsZSBpbiB0aGUgcGFja2FnZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIFhtbERvY3VtZW50IFBpdm90VGFibGVYbWwgeyBnZXQ7IHByaXZhdGUgc2V0OyB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBwYWNrYWdlIGludGVybmFsIFVSSSB0byB0aGUgcGl2b3R0YWJsZSBYbWwgRG9jdW1lbnQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBVcmkgUGl2b3RUYWJsZVVyaQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgUGFja2FnaW5nLlppcFBhY2thZ2VSZWxhdGlvbnNoaXAgUmVsYXRpb25zaGlwCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIHNldDsKLSAgICAgICAgfQotICAgICAgICAvL2NvbnN0IHN0cmluZyBJRF9QQVRIID0gIkBpZCI7Ci0gICAgICAgIC8vaW50ZXJuYWwgaW50IElkCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBnZXQKLSAgICAgICAgLy8gICAgewotICAgICAgICAvLyAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoSURfUEFUSCk7Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy8gICAgc2V0Ci0gICAgICAgIC8vICAgIHsKLSAgICAgICAgLy8gICAgICAgIFNldFhtbE5vZGVTdHJpbmcoSURfUEFUSCwgdmFsdWUuVG9TdHJpbmcoKSk7Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy99Ci0gICAgICAgIGNvbnN0IHN0cmluZyBOQU1FX1BBVEggPSAiQG5hbWUiOwotICAgICAgICBjb25zdCBzdHJpbmcgRElTUExBWV9OQU1FX1BBVEggPSAiQGRpc3BsYXlOYW1lIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTmFtZSBvZiB0aGUgcGl2b3R0YWJsZSBvYmplY3QgaW4gRXhjZWwKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKE5BTUVfUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoV29ya1NoZWV0Lldvcmtib29rLkV4aXN0c1RhYmxlTmFtZSh2YWx1ZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJQaXZvdFRhYmxlIG5hbWUgaXMgbm90IHVuaXF1ZSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHByZXZOYW1lID0gTmFtZTsKLSAgICAgICAgICAgICAgICBpZiAoV29ya1NoZWV0LlRhYmxlcy5fdGFibGVOYW1lcy5Db250YWluc0tleShwcmV2TmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpbnQgaXggPSBXb3JrU2hlZXQuVGFibGVzLl90YWJsZU5hbWVzW3ByZXZOYW1lXTsKLSAgICAgICAgICAgICAgICAgICAgV29ya1NoZWV0LlRhYmxlcy5fdGFibGVOYW1lcy5SZW1vdmUocHJldk5hbWUpOwotICAgICAgICAgICAgICAgICAgICBXb3JrU2hlZXQuVGFibGVzLl90YWJsZU5hbWVzLkFkZCh2YWx1ZSwgaXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKE5BTUVfUEFUSCwgdmFsdWUpOwotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoRElTUExBWV9OQU1FX1BBVEgsIGNsZWFuRGlzcGxheU5hbWUodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIEV4Y2VsUGl2b3RDYWNoZURlZmluaXRpb24gX2NhY2hlRGVmaW5pdGlvbiA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlZmVyZW5jZSB0byB0aGUgcGl2b3QgdGFibGUgY2FjaGUgZGVmaW5pdGlvbiBvYmplY3QKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsUGl2b3RDYWNoZURlZmluaXRpb24gQ2FjaGVEZWZpbml0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfY2FjaGVEZWZpbml0aW9uID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfY2FjaGVEZWZpbml0aW9uID0gbmV3IEV4Y2VsUGl2b3RDYWNoZURlZmluaXRpb24oTmFtZVNwYWNlTWFuYWdlciwgdGhpcywgbnVsbCwgMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfY2FjaGVEZWZpbml0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIGNsZWFuRGlzcGxheU5hbWUoc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBSZWdleC5SZXBsYWNlKG5hbWUsIEAiW15cd1wuLV9dIiwgIl8iKTsKLSAgICAgICAgfQotICAgICAgICAjcmVnaW9uICJQdWJsaWMgUHJvcGVydGllcyIKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgd29ya3NoZWV0IHdoZXJlIHRoZSBwaXZvdHRhYmxlIGlzIGxvY2F0ZWQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsV29ya3NoZWV0IFdvcmtTaGVldAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSBwaXZvdCB0YWJsZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxBZGRyZXNzQmFzZSBBZGRyZXNzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldDsKLSAgICAgICAgICAgIGludGVybmFsIHNldDsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiBtdWx0aXBsZSBkYXRhZmllbGRzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIHJvdyBhcmVhIG9yIHRoZSBjb2x1bW4gYXJlYQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBEYXRhT25Sb3dzIAotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAZGF0YU9uUm93cyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBkYXRhT25Sb3dzIix2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gaWYgdHJ1ZSBhcHBseSBsZWdhY3kgdGFibGUgYXV0b2Zvcm1hdCBudW1iZXIgZm9ybWF0IHByb3BlcnRpZXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEFwcGx5TnVtYmVyRm9ybWF0cyAKLSAgICAgICAgeyAKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQGFwcGx5TnVtYmVyRm9ybWF0cyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBhcHBseU51bWJlckZvcm1hdHMiLHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0cnVlIGFwcGx5IGxlZ2FjeSB0YWJsZSBhdXRvZm9ybWF0IGJvcmRlciBwcm9wZXJ0aWVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEFwcGx5Qm9yZGVyRm9ybWF0cyAKLSAgICAgICAgeyAKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQGFwcGx5Qm9yZGVyRm9ybWF0cyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBhcHBseUJvcmRlckZvcm1hdHMiLHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0cnVlIGFwcGx5IGxlZ2FjeSB0YWJsZSBhdXRvZm9ybWF0IGZvbnQgcHJvcGVydGllcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBBcHBseUZvbnRGb3JtYXRzCi0gICAgICAgIHsgCi0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBhcHBseUZvbnRGb3JtYXRzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGFwcGx5Rm9udEZvcm1hdHMiLHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0cnVlIGFwcGx5IGxlZ2FjeSB0YWJsZSBhdXRvZm9ybWF0IHBhdHRlcm4gcHJvcGVydGllcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBBcHBseVBhdHRlcm5Gb3JtYXRzCi0gICAgICAgIHsgCi0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBhcHBseVBhdHRlcm5Gb3JtYXRzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGFwcGx5UGF0dGVybkZvcm1hdHMiLHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0cnVlIGFwcGx5IGxlZ2FjeSB0YWJsZSBhdXRvZm9ybWF0IHdpZHRoL2hlaWdodCBwcm9wZXJ0aWVzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBBcHBseVdpZHRoSGVpZ2h0Rm9ybWF0cwotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAYXBwbHlXaWR0aEhlaWdodEZvcm1hdHMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAYXBwbHlXaWR0aEhlaWdodEZvcm1hdHMiLHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTaG93IG1lbWJlciBwcm9wZXJ0eSBpbmZvcm1hdGlvbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93TWVtYmVyUHJvcGVydHlUaXBzCi0gICAgICAgIHsgCi0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBzaG93TWVtYmVyUHJvcGVydHlUaXBzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQHNob3dNZW1iZXJQcm9wZXJ0eVRpcHMiLHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTaG93IHRoZSBkcmlsbCBpbmRpY2F0b3JzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFNob3dDYWxjTWVtYmVyCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQHNob3dDYWxjTWJycyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBzaG93Q2FsY01icnMiLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSB1c2VyIGlzIHByZXZlbnRlZCBmcm9tIGRyaWxsaW5nIGRvd24gb24gYSBQaXZvdEl0ZW0gb3IgYWdncmVnYXRlIHZhbHVlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEVuYWJsZURyaWxsCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQGVuYWJsZURyaWxsIiwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGVuYWJsZURyaWxsIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNob3cgdGhlIGRyaWxsIGRvd24gYnV0dG9ucwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93RHJpbGwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAc2hvd0RyaWxsIiwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQHNob3dEcmlsbCIsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgdG9vbHRpcHMgc2hvdWxkIGJlIGRpc3BsYXllZCBmb3IgUGl2b3RUYWJsZSBkYXRhIGNlbGxzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93RGF0YVRpcHMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAc2hvd0RhdGFUaXBzIiwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQHNob3dEYXRhVGlwcyIsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgcm93IGFuZCBjb2x1bW4gdGl0bGVzIGZyb20gdGhlIFBpdm90VGFibGUgc2hvdWxkIGJlIHByaW50ZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEZpZWxkUHJpbnRUaXRsZXMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAZmllbGRQcmludFRpdGxlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBmaWVsZFByaW50VGl0bGVzIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSByb3cgYW5kIGNvbHVtbiB0aXRsZXMgZnJvbSB0aGUgUGl2b3RUYWJsZSBzaG91bGQgYmUgcHJpbnRlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgSXRlbVByaW50VGl0bGVzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQGl0ZW1QcmludFRpdGxlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBpdGVtUHJpbnRUaXRsZXMiLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSWYgdGhlIGdyYW5kIHRvdGFscyBzaG91bGQgYmUgZGlzcGxheWVkIGZvciB0aGUgUGl2b3RUYWJsZSBjb2x1bW5zCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIENvbHVtR3JhbmRUb3RhbHMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAY29sR3JhbmRUb3RhbHMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAY29sR3JhbmRUb3RhbHMiLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgZ3JhbmQgdG90YWxzIHNob3VsZCBiZSBkaXNwbGF5ZWQgZm9yIHRoZSBQaXZvdFRhYmxlIHJvd3MKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgUm93R3JhbmRUb3RhbHMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAcm93R3JhbmRUb3RhbHMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAcm93R3JhbmRUb3RhbHMiLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgZHJpbGwgaW5kaWNhdG9ycyBleHBhbmQgY29sbGFwc2UgYnV0dG9ucyBzaG91bGQgYmUgcHJpbnRlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgUHJpbnREcmlsbAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBwcmludERyaWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQHByaW50RHJpbGwiLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0byBzaG93IGVycm9yIG1lc3NhZ2VzIGluIGNlbGxzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93RXJyb3IKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAc2hvd0Vycm9yIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQHNob3dFcnJvciIsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkIGluIGNlbGxzIHRoYXQgY29udGFpbiBlcnJvcnMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgRXJyb3JDYXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJAZXJyb3JDYXB0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAZXJyb3JDYXB0aW9uIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSB2YWx1ZSBhcmVhIGZpZWxkIGhlYWRlciBpbiB0aGUgUGl2b3RUYWJsZS4gCi0gICAgICAgIC8vLyBUaGlzIGNhcHRpb24gaXMgc2hvd24gd2hlbiB0aGUgUGl2b3RUYWJsZSB3aGVuIHR3byBvciBtb3JlIGZpZWxkcyBhcmUgaW4gdGhlIHZhbHVlcyBhcmVhLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIERhdGFDYXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJAZGF0YUNhcHRpb24iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBkYXRhQ2FwdGlvbiIsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNob3cgZmllbGQgaGVhZGVycwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBTaG93SGVhZGVycwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBzaG93SGVhZGVycyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBzaG93SGVhZGVycyIsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgbnVtYmVyIG9mIHBhZ2UgZmllbGRzIHRvIGRpc3BsYXkgYmVmb3JlIHN0YXJ0aW5nIGFub3RoZXIgcm93IG9yIGNvbHVtbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IFBhZ2VXcmFwCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KCJAcGFnZVdyYXAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHZhbHVlPDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJWYWx1ZSBjYW4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAcGFnZVdyYXAiLCB2YWx1ZS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBsZWdhY3kgYXV0byBmb3JtYXR0aW5nIGhhcyBiZWVuIGFwcGxpZWQgdG8gdGhlIFBpdm90VGFibGUgdmlldwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBVc2VBdXRvRm9ybWF0dGluZwotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAdXNlQXV0b0Zvcm1hdHRpbmciKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAdXNlQXV0b0Zvcm1hdHRpbmciLHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluLWdyaWQgZHJvcCB6b25lcyBzaG91bGQgYmUgZGlzcGxheWVkIGF0IHJ1bnRpbWUsIGFuZCB3aGV0aGVyIGNsYXNzaWMgbGF5b3V0IGlzIGFwcGxpZWQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgR3JpZERyb3Bab25lcwotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAZ3JpZERyb3Bab25lcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBncmlkRHJvcFpvbmVzIix2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSBpbmRlbnRhdGlvbiBpbmNyZW1lbnQgZm9yIGNvbXBhY3QgYXhpcyBhbmQgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBSZXBvcnQgTGF5b3V0IHRvIENvbXBhY3QgRm9ybQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IEluZGVudAotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoIkBpbmRlbnQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBpbmRlbnQiLHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGRhdGEgZmllbGRzIGluIHRoZSBQaXZvdFRhYmxlIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gb3V0bGluZSBmb3JtCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIE91dGxpbmVEYXRhCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQG91dGxpbmVEYXRhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQG91dGxpbmVEYXRhIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIGEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIG5ldyBmaWVsZHMgc2hvdWxkIGhhdmUgdGhlaXIgb3V0bGluZSBmbGFnIHNldCB0byB0cnVlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIE91dGxpbmUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAb3V0bGluZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBvdXRsaW5lIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZHMgb2YgYSBQaXZvdFRhYmxlIGNhbiBoYXZlIG11bHRpcGxlIGZpbHRlcnMgc2V0IG9uIHRoZW0KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgTXVsdGlwbGVGaWVsZEZpbHRlcnMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAbXVsdGlwbGVGaWVsZEZpbHRlcnMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAbXVsdGlwbGVGaWVsZEZpbHRlcnMiLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgbmV3IGZpZWxkcyBzaG91bGQgaGF2ZSB0aGVpciBjb21wYWN0IGZsYWcgc2V0IHRvIHRydWUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgQ29tcGFjdAotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAY29tcGFjdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBjb21wYWN0Iix2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgbmV4dCB0byB0aGUgZGF0YSBmaWVsZCBpbiB0aGUgUGl2b3RUYWJsZSBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBzYW1lIGNvbHVtbiBvZiB0aGUgc3ByZWFkc2hlZXQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgQ29tcGFjdERhdGEKLSAgICAgICAgeyAKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQGNvbXBhY3REYXRhIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGNvbXBhY3REYXRhIix2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkIGZvciBncmFuZCB0b3RhbHMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgR3JhbmRUb3RhbENhcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkBncmFuZFRvdGFsQ2FwdGlvbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGdyYW5kVG90YWxDYXB0aW9uIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNwZWNpZmllcyB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZCBpbiByb3cgaGVhZGVyIGluIGNvbXBhY3QgbW9kZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBSb3dIZWFkZXJDYXB0aW9uIAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygiQHJvd0hlYWRlckNhcHRpb24iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkByb3dIZWFkZXJDYXB0aW9uIiwgdmFsdWUpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQgaW4gY2VsbHMgd2l0aCBubyB2YWx1ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIE1pc3NpbmdDYXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJAbWlzc2luZ0NhcHRpb24iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBtaXNzaW5nQ2FwdGlvbiIsIHZhbHVlKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIEZJUlNUSEVBREVSUk9XX1BBVEg9ImQ6bG9jYXRpb24vQGZpcnN0SGVhZGVyUm93IjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3BlY2lmaWVzIHRoZSBmaXJzdCByb3cgb2YgdGhlIFBpdm90VGFibGUgaGVhZGVyLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxlZnQgY2VsbCBpbiB0aGUgcmVmIHZhbHVlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgRmlyc3RIZWFkZXJSb3cKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoRklSU1RIRUFERVJST1dfUEFUSCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKEZJUlNUSEVBREVSUk9XX1BBVEgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBGSVJTVERBVEFST1dfUEFUSCA9ICJkOmxvY2F0aW9uL0BmaXJzdERhdGFSb3ciOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgUGl2b3RUYWJsZSBkYXRhLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxlZnQgY2VsbCBpbiB0aGUgcmVmIHZhbHVlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgRmlyc3REYXRhUm93Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KEZJUlNUREFUQVJPV19QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoRklSU1REQVRBUk9XX1BBVEgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBGSVJTVERBVEFDT0xfUEFUSCA9ICJkOmxvY2F0aW9uL0BmaXJzdERhdGFDb2wiOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgUGl2b3RUYWJsZSBkYXRhLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxlZnQgY2VsbCBpbiB0aGUgcmVmIHZhbHVlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgRmlyc3REYXRhQ29sCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KEZJUlNUREFUQUNPTF9QQVRIKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoRklSU1REQVRBQ09MX1BBVEgsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsUGl2b3RUYWJsZUZpZWxkQ29sbGVjdGlvbiBfZmllbGRzID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGZpZWxkcyBpbiB0aGUgdGFibGUgCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb24gRmllbGRzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZmllbGRzID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZmllbGRzID0gbmV3IEV4Y2VsUGl2b3RUYWJsZUZpZWxkQ29sbGVjdGlvbih0aGlzLCAiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfZmllbGRzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsUGl2b3RUYWJsZVJvd0NvbHVtbkZpZWxkQ29sbGVjdGlvbiBfcm93RmllbGRzID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUm93IGxhYmVsIGZpZWxkcyAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZVJvd0NvbHVtbkZpZWxkQ29sbGVjdGlvbiBSb3dGaWVsZHMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKF9yb3dGaWVsZHMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9yb3dGaWVsZHMgPSBuZXcgRXhjZWxQaXZvdFRhYmxlUm93Q29sdW1uRmllbGRDb2xsZWN0aW9uKHRoaXMsICJyb3dGaWVsZHMiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9yb3dGaWVsZHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxQaXZvdFRhYmxlUm93Q29sdW1uRmllbGRDb2xsZWN0aW9uIF9jb2x1bW5GaWVsZHMgPSBudWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb2x1bW4gbGFiZWwgZmllbGRzIAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlUm93Q29sdW1uRmllbGRDb2xsZWN0aW9uIENvbHVtbkZpZWxkcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2NvbHVtbkZpZWxkcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2NvbHVtbkZpZWxkcyA9IG5ldyBFeGNlbFBpdm90VGFibGVSb3dDb2x1bW5GaWVsZENvbGxlY3Rpb24odGhpcywgImNvbEZpZWxkcyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX2NvbHVtbkZpZWxkczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBFeGNlbFBpdm90VGFibGVEYXRhRmllbGRDb2xsZWN0aW9uIF9kYXRhRmllbGRzID0gbnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVmFsdWUgZmllbGRzIAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlRGF0YUZpZWxkQ29sbGVjdGlvbiBEYXRhRmllbGRzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfZGF0YUZpZWxkcyA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX2RhdGFGaWVsZHMgPSBuZXcgRXhjZWxQaXZvdFRhYmxlRGF0YUZpZWxkQ29sbGVjdGlvbih0aGlzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9kYXRhRmllbGRzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEV4Y2VsUGl2b3RUYWJsZVJvd0NvbHVtbkZpZWxkQ29sbGVjdGlvbiBfcGFnZUZpZWxkcyA9IG51bGw7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlcG9ydCBmaWx0ZXIgZmllbGRzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVSb3dDb2x1bW5GaWVsZENvbGxlY3Rpb24gUGFnZUZpZWxkcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX3BhZ2VGaWVsZHMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF9wYWdlRmllbGRzID0gbmV3IEV4Y2VsUGl2b3RUYWJsZVJvd0NvbHVtbkZpZWxkQ29sbGVjdGlvbih0aGlzLCAicGFnZUZpZWxkcyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX3BhZ2VGaWVsZHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIFNUWUxFTkFNRV9QQVRIID0gImQ6cGl2b3RUYWJsZVN0eWxlSW5mby9AbmFtZSI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBpdm90IHN0eWxlIG5hbWUuIFVzZWQgZm9yIGN1c3RvbSBzdHlsZXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBTdHlsZU5hbWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoU1RZTEVOQU1FX1BBVEgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlLlN0YXJ0c1dpdGgoIlBpdm90U3R5bGUiKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdGFibGVTdHlsZSA9IChUYWJsZVN0eWxlcylFbnVtLlBhcnNlKHR5cGVvZihUYWJsZVN0eWxlcyksIHZhbHVlLlN1YnN0cmluZygxMCwgdmFsdWUuTGVuZ3RoIC0gMTApLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaAotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdGFibGVTdHlsZSA9IFRhYmxlU3R5bGVzLkN1c3RvbTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PSAiTm9uZSIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfdGFibGVTdHlsZSA9IFRhYmxlU3R5bGVzLk5vbmU7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF90YWJsZVN0eWxlID0gVGFibGVTdHlsZXMuQ3VzdG9tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFNUWUxFTkFNRV9QQVRILCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgVGFibGVTdHlsZXMgX3RhYmxlU3R5bGUgPSBUYWJsZS5UYWJsZVN0eWxlcy5NZWRpdW02OwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgdGFibGUgc3R5bGUuIElmIHRoaXMgcHJvcGVydHkgaXMgY3Vzb20gdGhlIHN0eWxlIGZyb20gdGhlIFN0eWxlTmFtZSBwcm9wZXJ5IGlzIHVzZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBUYWJsZVN0eWxlcyBUYWJsZVN0eWxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfdGFibGVTdHlsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF90YWJsZVN0eWxlPXZhbHVlOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBUYWJsZVN0eWxlcy5DdXN0b20pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKFNUWUxFTkFNRV9QQVRILCAiUGl2b3RTdHlsZSIgKyB2YWx1ZS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAjZW5kcmVnaW9uCi0gICAgICAgICNyZWdpb24gIkludGVybmFsIFByb3BlcnRpZXMiCi0gICAgICAgIGludGVybmFsIGludCBDYWNoZUlEIAotICAgICAgICB7IAotICAgICAgICAgICAgICAgIGdldAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoIkBjYWNoZUlkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNldAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGNhY2hlSWQiLHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICNlbmRyZWdpb24KLQorICAgIC8vQWRkIHJvdyBmaWVsZHMuCisgICAgZm9yZWFjaCAoWG1sRWxlbWVudCByb3dFbGVtIGluIFRvcE5vZGUuU2VsZWN0Tm9kZXMoImQ6cm93RmllbGRzL2Q6ZmllbGQiLCBOYW1lU3BhY2VNYW5hZ2VyKSkgeworICAgICAgaW50IHg7CisgICAgICBpZiAoaW50LlRyeVBhcnNlKHJvd0VsZW0uR2V0QXR0cmlidXRlKCJ4IiksIG91dCB4KSAmJiB4ID49IDApIHsKKyAgICAgICAgUm93RmllbGRzLkFkZEludGVybmFsKEZpZWxkc1t4XSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByb3dFbGVtLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQocm93RWxlbSk7CisgICAgICB9CiAgICAgfQorCisgICAgLy8vL0FkZCBjb2x1bW4gZmllbGRzLgorICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgY29sRWxlbSBpbiBUb3BOb2RlLlNlbGVjdE5vZGVzKCJkOmNvbEZpZWxkcy9kOmZpZWxkIiwgTmFtZVNwYWNlTWFuYWdlcikpIHsKKyAgICAgIGludCB4OworICAgICAgaWYgKGludC5UcnlQYXJzZShjb2xFbGVtLkdldEF0dHJpYnV0ZSgieCIpLCBvdXQgeCkgJiYgeCA+PSAwKSB7CisgICAgICAgIENvbHVtbkZpZWxkcy5BZGRJbnRlcm5hbChGaWVsZHNbeF0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29sRWxlbS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKGNvbEVsZW0pOworICAgICAgfQorICAgIH0KKworICAgIC8vQWRkIFBhZ2UgZWxlbWVudHMKKyAgICAvL2ludCBpbmRleCA9IDA7CisgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBwYWdlRWxlbSBpbiBUb3BOb2RlLlNlbGVjdE5vZGVzKAorICAgICAgICAiZDpwYWdlRmllbGRzL2Q6cGFnZUZpZWxkIiwKKyAgICAgICAgTmFtZVNwYWNlTWFuYWdlcikpIHsKKyAgICAgIGludCBmbGQ7CisgICAgICBpZiAoaW50LlRyeVBhcnNlKHBhZ2VFbGVtLkdldEF0dHJpYnV0ZSgiZmxkIiksIG91dCBmbGQpICYmIGZsZCA+PSAwKSB7CisgICAgICAgIHZhciBmaWVsZCA9IEZpZWxkc1tmbGRdOworICAgICAgICBmaWVsZC5fcGFnZUZpZWxkU2V0dGluZ3MgPSBuZXcoTmFtZVNwYWNlTWFuYWdlciwgcGFnZUVsZW0sIGZpZWxkLCBmbGQpOworICAgICAgICBQYWdlRmllbGRzLkFkZEludGVybmFsKGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvL0FkZCBkYXRhIGVsZW1lbnRzCisgICAgLy9pbmRleCA9IDA7CisgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBkYXRhRWxlbSBpbiBUb3BOb2RlLlNlbGVjdE5vZGVzKAorICAgICAgICAiZDpkYXRhRmllbGRzL2Q6ZGF0YUZpZWxkIiwKKyAgICAgICAgTmFtZVNwYWNlTWFuYWdlcikpIHsKKyAgICAgIGludCBmbGQ7CisgICAgICBpZiAoaW50LlRyeVBhcnNlKGRhdGFFbGVtLkdldEF0dHJpYnV0ZSgiZmxkIiksIG91dCBmbGQpICYmIGZsZCA+PSAwKSB7CisgICAgICAgIHZhciBmaWVsZCA9IEZpZWxkc1tmbGRdOworICAgICAgICB2YXIgZGF0YUZpZWxkID0gbmV3IEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZChOYW1lU3BhY2VNYW5hZ2VyLCBkYXRhRWxlbSwgZmllbGQpOworICAgICAgICBEYXRhRmllbGRzLkFkZEludGVybmFsKGRhdGFGaWVsZCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIGEgbmV3IHBpdm90dGFibGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJzaGVldCI+VGhlIHdvcmtzaGVldDwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+dGhlIGFkZHJlc3Mgb2YgdGhlIHBpdm90dGFibGU8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InNvdXJjZUFkZHJlc3MiPlRoZSBhZGRyZXNzIG9mIHRoZSBTb3VyY2UgZGF0YTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0YmxJZCI+PC9wYXJhbT4KKyAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlKAorICAgICAgRXhjZWxXb3Jrc2hlZXQgc2hlZXQsCisgICAgICBFeGNlbEFkZHJlc3NCYXNlIGFkZHJlc3MsCisgICAgICBFeGNlbFJhbmdlQmFzZSBzb3VyY2VBZGRyZXNzLAorICAgICAgc3RyaW5nIG5hbWUsCisgICAgICBpbnQgdGJsSWQpCisgICAgICA6IGJhc2Uoc2hlZXQuTmFtZVNwYWNlTWFuYWdlcikgeworICAgIFdvcmtTaGVldCA9IHNoZWV0OworICAgIEFkZHJlc3MgPSBhZGRyZXNzOworICAgIHZhciBwY2sgPSBzaGVldC5fcGFja2FnZS5QYWNrYWdlOworCisgICAgUGl2b3RUYWJsZVhtbCA9IG5ldygpOworICAgIExvYWRYbWxTYWZlKFBpdm90VGFibGVYbWwsIEdldFN0YXJ0WG1sKG5hbWUsIHRibElkLCBhZGRyZXNzLCBzb3VyY2VBZGRyZXNzKSwgRW5jb2RpbmcuVVRGOCk7CisgICAgVG9wTm9kZSA9IFBpdm90VGFibGVYbWwuRG9jdW1lbnRFbGVtZW50OworICAgIFBpdm90VGFibGVVcmkgPSBHZXROZXdVcmkocGNrLCAiL3hsL3Bpdm90VGFibGVzL3Bpdm90VGFibGV7MH0ueG1sIiwgdGJsSWQpOworICAgIEluaXQoKTsKKworICAgIFBhcnQgPSBwY2suQ3JlYXRlUGFydChQaXZvdFRhYmxlVXJpLCBFeGNlbFBhY2thZ2UuX3NjaGVtYVBpdm90VGFibGUpOworICAgIFBpdm90VGFibGVYbWwuU2F2ZShQYXJ0LkdldFN0cmVhbSgpKTsKKworICAgIC8vV29ya3NoZWV0LVBpdm90dGFibGUgcmVsYXRpb25zaGlwCisgICAgUmVsYXRpb25zaGlwID0gc2hlZXQuUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoCisgICAgICAgIFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShzaGVldC5Xb3Jrc2hlZXRVcmksIFBpdm90VGFibGVVcmkpLAorICAgICAgICBUYXJnZXRNb2RlLkludGVybmFsLAorICAgICAgICBFeGNlbFBhY2thZ2UuX3NjaGVtYVJlbGF0aW9uc2hpcHMgKyAiL3Bpdm90VGFibGUiKTsKKworICAgIF9jYWNoZURlZmluaXRpb24gPSBuZXcoc2hlZXQuTmFtZVNwYWNlTWFuYWdlciwgdGhpcywgc291cmNlQWRkcmVzcywgdGJsSWQpOworICAgIF9jYWNoZURlZmluaXRpb24uUmVsYXRpb25zaGlwID0gUGFydC5DcmVhdGVSZWxhdGlvbnNoaXAoCisgICAgICAgIFVyaUhlbHBlci5SZXNvbHZlUGFydFVyaShQaXZvdFRhYmxlVXJpLCBfY2FjaGVEZWZpbml0aW9uLkNhY2hlRGVmaW5pdGlvblVyaSksCisgICAgICAgIFRhcmdldE1vZGUuSW50ZXJuYWwsCisgICAgICAgIEV4Y2VsUGFja2FnZS5fc2NoZW1hUmVsYXRpb25zaGlwcyArICIvcGl2b3RDYWNoZURlZmluaXRpb24iKTsKKworICAgIHNoZWV0Lldvcmtib29rLkFkZFBpdm90VGFibGUoQ2FjaGVJRC5Ub1N0cmluZygpLCBfY2FjaGVEZWZpbml0aW9uLkNhY2hlRGVmaW5pdGlvblVyaSk7CisKKyAgICBMb2FkRmllbGRzKCk7CisKKyAgICB1c2luZyAodmFyIHIgPSBzaGVldC5DZWxsc1thZGRyZXNzLkFkZHJlc3NdKSB7CisgICAgICByLkNsZWFyKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIEluaXQoKSB7CisgICAgU2NoZW1hTm9kZU9yZGVyID0gbmV3W10geworICAgICAgImxvY2F0aW9uIiwKKyAgICAgICJwaXZvdEZpZWxkcyIsCisgICAgICAicm93RmllbGRzIiwKKyAgICAgICJyb3dJdGVtcyIsCisgICAgICAiY29sRmllbGRzIiwKKyAgICAgICJjb2xJdGVtcyIsCisgICAgICAicGFnZUZpZWxkcyIsCisgICAgICAicGFnZUl0ZW1zIiwKKyAgICAgICJkYXRhRmllbGRzIiwKKyAgICAgICJkYXRhSXRlbXMiLAorICAgICAgImZvcm1hdHMiLAorICAgICAgInBpdm90VGFibGVTdHlsZUluZm8iLAorICAgIH07CisgIH0KKworICBwcml2YXRlIHZvaWQgTG9hZEZpZWxkcygpIHsKKyAgICAvL0ZpZWxkcy5DbGVhcigpOworICAgIC8vaW50IGl4PTA7CisgICAgLy9mb3JlYWNoKFhtbEVsZW1lbnQgZmllbGROb2RlIGluIFBpdm90WG1sLlNlbGVjdE5vZGVzKCIvL2Q6cGl2b3RGaWVsZHMvZDpwaXZvdEZpZWxkIixOYW1lU3BhY2VNYW5hZ2VyKSkKKyAgICAvL3sKKyAgICAvLyAgICBGaWVsZHMuQWRkSW50ZXJuYWwobmV3IEV4Y2VsUGl2b3RUYWJsZUZpZWxkKE5hbWVTcGFjZU1hbmFnZXIsIGZpZWxkTm9kZSwgdGhpcywgaXgrKykpOworICAgIC8vfQorCisgICAgaW50IGluZGV4ID0gMDsKKyAgICAvL0FkZCBmaWVsZHMuCisgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBmaWVsZEVsZW0gaW4gVG9wTm9kZS5TZWxlY3ROb2RlcygKKyAgICAgICAgImQ6cGl2b3RGaWVsZHMvZDpwaXZvdEZpZWxkIiwKKyAgICAgICAgTmFtZVNwYWNlTWFuYWdlcikpIHsKKyAgICAgIHZhciBmbGQgPSBuZXcgRXhjZWxQaXZvdFRhYmxlRmllbGQoTmFtZVNwYWNlTWFuYWdlciwgZmllbGRFbGVtLCB0aGlzLCBpbmRleCwgaW5kZXgrKyk7CisgICAgICBGaWVsZHMuQWRkSW50ZXJuYWwoZmxkKTsKKyAgICB9CisKKyAgICAvL0FkZCBmaWVsZHMuCisgICAgaW5kZXggPSAwOworICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgZmllbGRFbGVtIGluIF9jYWNoZURlZmluaXRpb24uVG9wTm9kZS5TZWxlY3ROb2RlcygKKyAgICAgICAgImQ6Y2FjaGVGaWVsZHMvZDpjYWNoZUZpZWxkIiwKKyAgICAgICAgTmFtZVNwYWNlTWFuYWdlcikpIHsKKyAgICAgIHZhciBmbGQgPSBGaWVsZHNbaW5kZXgrK107CisgICAgICBmbGQuU2V0Q2FjaGVGaWVsZE5vZGUoZmllbGRFbGVtKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0cmluZyBHZXRTdGFydFhtbCgKKyAgICAgIHN0cmluZyBuYW1lLAorICAgICAgaW50IGlkLAorICAgICAgRXhjZWxBZGRyZXNzQmFzZSBhZGRyZXNzLAorICAgICAgRXhjZWxBZGRyZXNzQmFzZSBzb3VyY2VBZGRyZXNzKSB7CisgICAgc3RyaW5nIHhtbCA9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICI8cGl2b3RUYWJsZURlZmluaXRpb24geG1sbnM9XCJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvc3ByZWFkc2hlZXRtbC8yMDA2L21haW5cIiBuYW1lPVwiezB9XCIgY2FjaGVJZD1cInsxfVwiIGRhdGFPblJvd3M9XCIxXCIgYXBwbHlOdW1iZXJGb3JtYXRzPVwiMFwiIGFwcGx5Qm9yZGVyRm9ybWF0cz1cIjBcIiBhcHBseUZvbnRGb3JtYXRzPVwiMFwiIGFwcGx5UGF0dGVybkZvcm1hdHM9XCIwXCIgYXBwbHlBbGlnbm1lbnRGb3JtYXRzPVwiMFwiIGFwcGx5V2lkdGhIZWlnaHRGb3JtYXRzPVwiMVwiIGRhdGFDYXB0aW9uPVwiRGF0YVwiICBjcmVhdGVkVmVyc2lvbj1cIjRcIiBzaG93TWVtYmVyUHJvcGVydHlUaXBzPVwiMFwiIHVzZUF1dG9Gb3JtYXR0aW5nPVwiMVwiIGl0ZW1QcmludFRpdGxlcz1cIjFcIiBpbmRlbnQ9XCIwXCIgY29tcGFjdD1cIjBcIiBjb21wYWN0RGF0YT1cIjBcIiBncmlkRHJvcFpvbmVzPVwiMVwiPiIsCisgICAgICAgIG5hbWUsCisgICAgICAgIGlkKTsKKworICAgIHhtbCArPSBzdHJpbmcuRm9ybWF0KAorICAgICAgICAiPGxvY2F0aW9uIHJlZj1cInswfVwiIGZpcnN0SGVhZGVyUm93PVwiMVwiIGZpcnN0RGF0YVJvdz1cIjFcIiBmaXJzdERhdGFDb2w9XCIxXCIgLz4gIiwKKyAgICAgICAgYWRkcmVzcy5GaXJzdEFkZHJlc3MpOworICAgIHhtbCArPSBzdHJpbmcuRm9ybWF0KAorICAgICAgICAiPHBpdm90RmllbGRzIGNvdW50PVwiezB9XCI+IiwKKyAgICAgICAgc291cmNlQWRkcmVzcy5fdG9Db2wgLSBzb3VyY2VBZGRyZXNzLl9mcm9tQ29sICsgMSk7CisgICAgZm9yIChpbnQgY29sID0gc291cmNlQWRkcmVzcy5fZnJvbUNvbDsgY29sIDw9IHNvdXJjZUFkZHJlc3MuX3RvQ29sOyBjb2wrKykgeworICAgICAgeG1sICs9ICI8cGl2b3RGaWVsZCBzaG93QWxsPVwiMFwiIC8+IjsgLy9jb21wYWN0PVwiMFwiIG91dGxpbmU9XCIwXCIgc3VidG90YWxUb3A9XCIwXCIgaW5jbHVkZU5ld0l0ZW1zSW5GaWx0ZXI9XCIxXCIKKyAgICB9CisKKyAgICB4bWwgKz0gIjwvcGl2b3RGaWVsZHM+IjsKKyAgICB4bWwgKz0KKyAgICAgICAgIjxwaXZvdFRhYmxlU3R5bGVJbmZvIG5hbWU9XCJQaXZvdFN0eWxlTWVkaXVtOVwiIHNob3dSb3dIZWFkZXJzPVwiMVwiIHNob3dDb2xIZWFkZXJzPVwiMVwiIHNob3dSb3dTdHJpcGVzPVwiMFwiIHNob3dDb2xTdHJpcGVzPVwiMFwiIHNob3dMYXN0Q29sdW1uPVwiMVwiIC8+IjsKKyAgICB4bWwgKz0gIjwvcGl2b3RUYWJsZURlZmluaXRpb24+IjsKKyAgICByZXR1cm4geG1sOworICB9CisKKyAgaW50ZXJuYWwgWmlwUGFja2FnZVBhcnQgUGFydCB7IGdldDsgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBYTUwgZGF0YSByZXByZXNlbnRpbmcgdGhlIHBpdm90dGFibGUgaW4gdGhlIHBhY2thZ2UuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBYbWxEb2N1bWVudCBQaXZvdFRhYmxlWG1sIHsgZ2V0OyBwcml2YXRlIHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBwYWNrYWdlIGludGVybmFsIFVSSSB0byB0aGUgcGl2b3R0YWJsZSBYbWwgRG9jdW1lbnQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBVcmkgUGl2b3RUYWJsZVVyaSB7IGdldDsgaW50ZXJuYWwgc2V0OyB9CisKKyAgaW50ZXJuYWwgWmlwUGFja2FnZVJlbGF0aW9uc2hpcCBSZWxhdGlvbnNoaXAgeyBnZXQ7IHNldDsgfQorCisgIC8vY29uc3Qgc3RyaW5nIElEX1BBVEggPSAiQGlkIjsKKyAgLy9pbnRlcm5hbCBpbnQgSWQKKyAgLy97CisgIC8vICAgIGdldAorICAvLyAgICB7CisgIC8vICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludChJRF9QQVRIKTsKKyAgLy8gICAgfQorICAvLyAgICBzZXQKKyAgLy8gICAgeworICAvLyAgICAgICAgU2V0WG1sTm9kZVN0cmluZyhJRF9QQVRILCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgLy8gICAgfQorICAvL30KKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX25hbWVQYXRoID0gIkBuYW1lIjsKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2Rpc3BsYXlOYW1lUGF0aCA9ICJAZGlzcGxheU5hbWUiOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE5hbWUgb2YgdGhlIHBpdm90dGFibGUgb2JqZWN0IGluIEV4Y2VsCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgTmFtZSB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVTdHJpbmcoX25hbWVQYXRoKTsKKyAgICBzZXQgeworICAgICAgaWYgKFdvcmtTaGVldC5Xb3JrYm9vay5FeGlzdHNUYWJsZU5hbWUodmFsdWUpKSB7CisgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIlBpdm90VGFibGUgbmFtZSBpcyBub3QgdW5pcXVlIikpOworICAgICAgfQorICAgICAgc3RyaW5nIHByZXZOYW1lID0gTmFtZTsKKyAgICAgIGlmIChXb3JrU2hlZXQuVGFibGVzLl90YWJsZU5hbWVzLkNvbnRhaW5zS2V5KHByZXZOYW1lKSkgeworICAgICAgICBpbnQgaXggPSBXb3JrU2hlZXQuVGFibGVzLl90YWJsZU5hbWVzW3ByZXZOYW1lXTsKKyAgICAgICAgV29ya1NoZWV0LlRhYmxlcy5fdGFibGVOYW1lcy5SZW1vdmUocHJldk5hbWUpOworICAgICAgICBXb3JrU2hlZXQuVGFibGVzLl90YWJsZU5hbWVzLkFkZCh2YWx1ZSwgaXgpOworICAgICAgfQorICAgICAgU2V0WG1sTm9kZVN0cmluZyhfbmFtZVBhdGgsIHZhbHVlKTsKKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2Rpc3BsYXlOYW1lUGF0aCwgQ2xlYW5EaXNwbGF5TmFtZSh2YWx1ZSkpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgRXhjZWxQaXZvdENhY2hlRGVmaW5pdGlvbiBfY2FjaGVEZWZpbml0aW9uOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJlZmVyZW5jZSB0byB0aGUgcGl2b3QgdGFibGUgY2FjaGUgZGVmaW5pdGlvbiBvYmplY3QKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsUGl2b3RDYWNoZURlZmluaXRpb24gQ2FjaGVEZWZpbml0aW9uIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9jYWNoZURlZmluaXRpb24gPT0gbnVsbCkgeworICAgICAgICBfY2FjaGVEZWZpbml0aW9uID0gbmV3KE5hbWVTcGFjZU1hbmFnZXIsIHRoaXMsIG51bGwsIDEpOworICAgICAgfQorICAgICAgcmV0dXJuIF9jYWNoZURlZmluaXRpb247CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdHJpbmcgQ2xlYW5EaXNwbGF5TmFtZShzdHJpbmcgbmFtZSkgeworICAgIHJldHVybiBSZWdleC5SZXBsYWNlKG5hbWUsIEAiW15cd1wuLV9dIiwgIl8iKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSB3b3Jrc2hlZXQgd2hlcmUgdGhlIHBpdm90dGFibGUgaXMgbG9jYXRlZAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxXb3Jrc2hlZXQgV29ya1NoZWV0IHsgZ2V0OyBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgbG9jYXRpb24gb2YgdGhlIHBpdm90IHRhYmxlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbEFkZHJlc3NCYXNlIEFkZHJlc3MgeyBnZXQ7IGludGVybmFsIHNldDsgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElmIG11bHRpcGxlIGRhdGFmaWVsZHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgcm93IGFyZWEgb3IgdGhlIGNvbHVtbiBhcmVhCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIERhdGFPblJvd3MgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbCgiQGRhdGFPblJvd3MiKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woIkBkYXRhT25Sb3dzIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gaWYgdHJ1ZSBhcHBseSBsZWdhY3kgdGFibGUgYXV0b2Zvcm1hdCBudW1iZXIgZm9ybWF0IHByb3BlcnRpZXMuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIEFwcGx5TnVtYmVyRm9ybWF0cyB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKCJAYXBwbHlOdW1iZXJGb3JtYXRzIik7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKCJAYXBwbHlOdW1iZXJGb3JtYXRzIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdHJ1ZSBhcHBseSBsZWdhY3kgdGFibGUgYXV0b2Zvcm1hdCBib3JkZXIgcHJvcGVydGllcworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBBcHBseUJvcmRlckZvcm1hdHMgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbCgiQGFwcGx5Qm9yZGVyRm9ybWF0cyIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbCgiQGFwcGx5Qm9yZGVyRm9ybWF0cyIsIHZhbHVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElmIHRydWUgYXBwbHkgbGVnYWN5IHRhYmxlIGF1dG9mb3JtYXQgZm9udCBwcm9wZXJ0aWVzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIEFwcGx5Rm9udEZvcm1hdHMgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbCgiQGFwcGx5Rm9udEZvcm1hdHMiKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woIkBhcHBseUZvbnRGb3JtYXRzIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdHJ1ZSBhcHBseSBsZWdhY3kgdGFibGUgYXV0b2Zvcm1hdCBwYXR0ZXJuIHByb3BlcnRpZXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQXBwbHlQYXR0ZXJuRm9ybWF0cyB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKCJAYXBwbHlQYXR0ZXJuRm9ybWF0cyIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbCgiQGFwcGx5UGF0dGVybkZvcm1hdHMiLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0cnVlIGFwcGx5IGxlZ2FjeSB0YWJsZSBhdXRvZm9ybWF0IHdpZHRoL2hlaWdodCBwcm9wZXJ0aWVzLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBBcHBseVdpZHRoSGVpZ2h0Rm9ybWF0cyB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKCJAYXBwbHlXaWR0aEhlaWdodEZvcm1hdHMiKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woIkBhcHBseVdpZHRoSGVpZ2h0Rm9ybWF0cyIsIHZhbHVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNob3cgbWVtYmVyIHByb3BlcnR5IGluZm9ybWF0aW9uCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIFNob3dNZW1iZXJQcm9wZXJ0eVRpcHMgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbCgiQHNob3dNZW1iZXJQcm9wZXJ0eVRpcHMiKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woIkBzaG93TWVtYmVyUHJvcGVydHlUaXBzIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2hvdyB0aGUgZHJpbGwgaW5kaWNhdG9ycworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBTaG93Q2FsY01lbWJlciB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKCJAc2hvd0NhbGNNYnJzIik7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKCJAc2hvd0NhbGNNYnJzIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhlIHVzZXIgaXMgcHJldmVudGVkIGZyb20gZHJpbGxpbmcgZG93biBvbiBhIFBpdm90SXRlbSBvciBhZ2dyZWdhdGUgdmFsdWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgRW5hYmxlRHJpbGwgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbCgiQGVuYWJsZURyaWxsIiwgdHJ1ZSk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKCJAZW5hYmxlRHJpbGwiLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTaG93IHRoZSBkcmlsbCBkb3duIGJ1dHRvbnMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgU2hvd0RyaWxsIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2woIkBzaG93RHJpbGwiLCB0cnVlKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woIkBzaG93RHJpbGwiLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgdG9vbHRpcHMgc2hvdWxkIGJlIGRpc3BsYXllZCBmb3IgUGl2b3RUYWJsZSBkYXRhIGNlbGxzLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBTaG93RGF0YVRpcHMgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbCgiQHNob3dEYXRhVGlwcyIsIHRydWUpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbCgiQHNob3dEYXRhVGlwcyIsIHZhbHVlLCB0cnVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIElmIHRoZSByb3cgYW5kIGNvbHVtbiB0aXRsZXMgZnJvbSB0aGUgUGl2b3RUYWJsZSBzaG91bGQgYmUgcHJpbnRlZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgRmllbGRQcmludFRpdGxlcyB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKCJAZmllbGRQcmludFRpdGxlcyIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbCgiQGZpZWxkUHJpbnRUaXRsZXMiLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgcm93IGFuZCBjb2x1bW4gdGl0bGVzIGZyb20gdGhlIFBpdm90VGFibGUgc2hvdWxkIGJlIHByaW50ZWQuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIEl0ZW1QcmludFRpdGxlcyB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKCJAaXRlbVByaW50VGl0bGVzIik7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKCJAaXRlbVByaW50VGl0bGVzIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhlIGdyYW5kIHRvdGFscyBzaG91bGQgYmUgZGlzcGxheWVkIGZvciB0aGUgUGl2b3RUYWJsZSBjb2x1bW5zCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIENvbHVtR3JhbmRUb3RhbHMgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbCgiQGNvbEdyYW5kVG90YWxzIik7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKCJAY29sR3JhbmRUb3RhbHMiLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgZ3JhbmQgdG90YWxzIHNob3VsZCBiZSBkaXNwbGF5ZWQgZm9yIHRoZSBQaXZvdFRhYmxlIHJvd3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgUm93R3JhbmRUb3RhbHMgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbCgiQHJvd0dyYW5kVG90YWxzIik7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKCJAcm93R3JhbmRUb3RhbHMiLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgZHJpbGwgaW5kaWNhdG9ycyBleHBhbmQgY29sbGFwc2UgYnV0dG9ucyBzaG91bGQgYmUgcHJpbnRlZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgUHJpbnREcmlsbCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKCJAcHJpbnREcmlsbCIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbCgiQHByaW50RHJpbGwiLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbmRpY2F0ZXMgd2hldGhlciB0byBzaG93IGVycm9yIG1lc3NhZ2VzIGluIGNlbGxzLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBTaG93RXJyb3IgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbCgiQHNob3dFcnJvciIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbCgiQHNob3dFcnJvciIsIHZhbHVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkIGluIGNlbGxzIHRoYXQgY29udGFpbiBlcnJvcnMuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgRXJyb3JDYXB0aW9uIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZygiQGVycm9yQ2FwdGlvbiIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKCJAZXJyb3JDYXB0aW9uIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSB2YWx1ZSBhcmVhIGZpZWxkIGhlYWRlciBpbiB0aGUgUGl2b3RUYWJsZS4KKyAgLy8vIFRoaXMgY2FwdGlvbiBpcyBzaG93biB3aGVuIHRoZSBQaXZvdFRhYmxlIHdoZW4gdHdvIG9yIG1vcmUgZmllbGRzIGFyZSBpbiB0aGUgdmFsdWVzIGFyZWEuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgRGF0YUNhcHRpb24geworICAgIGdldCA9PiBHZXRYbWxOb2RlU3RyaW5nKCJAZGF0YUNhcHRpb24iKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZygiQGRhdGFDYXB0aW9uIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU2hvdyBmaWVsZCBoZWFkZXJzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIFNob3dIZWFkZXJzIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2woIkBzaG93SGVhZGVycyIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbCgiQHNob3dIZWFkZXJzIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIG51bWJlciBvZiBwYWdlIGZpZWxkcyB0byBkaXNwbGF5IGJlZm9yZSBzdGFydGluZyBhbm90aGVyIHJvdyBvciBjb2x1bW4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBQYWdlV3JhcCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVJbnQoIkBwYWdlV3JhcCIpOworICAgIHNldCB7CisgICAgICBpZiAodmFsdWUgPCAwKSB7CisgICAgICAgIHRocm93IG5ldygiVmFsdWUgY2FuJ3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgIH0KKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBwYWdlV3JhcCIsIHZhbHVlLlRvU3RyaW5nKCkpOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGxlZ2FjeSBhdXRvIGZvcm1hdHRpbmcgaGFzIGJlZW4gYXBwbGllZCB0byB0aGUgUGl2b3RUYWJsZSB2aWV3CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIFVzZUF1dG9Gb3JtYXR0aW5nIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2woIkB1c2VBdXRvRm9ybWF0dGluZyIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbCgiQHVzZUF1dG9Gb3JtYXR0aW5nIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluLWdyaWQgZHJvcCB6b25lcyBzaG91bGQgYmUgZGlzcGxheWVkIGF0IHJ1bnRpbWUsIGFuZCB3aGV0aGVyIGNsYXNzaWMgbGF5b3V0IGlzIGFwcGxpZWQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgR3JpZERyb3Bab25lcyB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKCJAZ3JpZERyb3Bab25lcyIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbCgiQGdyaWREcm9wWm9uZXMiLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTcGVjaWZpZXMgdGhlIGluZGVudGF0aW9uIGluY3JlbWVudCBmb3IgY29tcGFjdCBheGlzIGFuZCBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIFJlcG9ydCBMYXlvdXQgdG8gQ29tcGFjdCBGb3JtCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgSW5kZW50IHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUludCgiQGluZGVudCIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKCJAaW5kZW50IiwgdmFsdWUuVG9TdHJpbmcoKSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBkYXRhIGZpZWxkcyBpbiB0aGUgUGl2b3RUYWJsZSBzaG91bGQgYmUgZGlzcGxheWVkIGluIG91dGxpbmUgZm9ybQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBPdXRsaW5lRGF0YSB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKCJAb3V0bGluZURhdGEiKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woIkBvdXRsaW5lRGF0YSIsIHZhbHVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIGEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIG5ldyBmaWVsZHMgc2hvdWxkIGhhdmUgdGhlaXIgb3V0bGluZSBmbGFnIHNldCB0byB0cnVlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIE91dGxpbmUgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbCgiQG91dGxpbmUiKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woIkBvdXRsaW5lIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkcyBvZiBhIFBpdm90VGFibGUgY2FuIGhhdmUgbXVsdGlwbGUgZmlsdGVycyBzZXQgb24gdGhlbQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBNdWx0aXBsZUZpZWxkRmlsdGVycyB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKCJAbXVsdGlwbGVGaWVsZEZpbHRlcnMiKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woIkBtdWx0aXBsZUZpZWxkRmlsdGVycyIsIHZhbHVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIG5ldyBmaWVsZHMgc2hvdWxkIGhhdmUgdGhlaXIgY29tcGFjdCBmbGFnIHNldCB0byB0cnVlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIENvbXBhY3QgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbCgiQGNvbXBhY3QiKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woIkBjb21wYWN0IiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIG5leHQgdG8gdGhlIGRhdGEgZmllbGQgaW4gdGhlIFBpdm90VGFibGUgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgc2FtZSBjb2x1bW4gb2YgdGhlIHNwcmVhZHNoZWV0CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIENvbXBhY3REYXRhIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2woIkBjb21wYWN0RGF0YSIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbCgiQGNvbXBhY3REYXRhIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU3BlY2lmaWVzIHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkIGZvciBncmFuZCB0b3RhbHMuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgR3JhbmRUb3RhbENhcHRpb24geworICAgIGdldCA9PiBHZXRYbWxOb2RlU3RyaW5nKCJAZ3JhbmRUb3RhbENhcHRpb24iKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZygiQGdyYW5kVG90YWxDYXB0aW9uIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU3BlY2lmaWVzIHRoZSBzdHJpbmcgdG8gYmUgZGlzcGxheWVkIGluIHJvdyBoZWFkZXIgaW4gY29tcGFjdCBtb2RlLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIFJvd0hlYWRlckNhcHRpb24geworICAgIGdldCA9PiBHZXRYbWxOb2RlU3RyaW5nKCJAcm93SGVhZGVyQ2FwdGlvbiIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKCJAcm93SGVhZGVyQ2FwdGlvbiIsIHZhbHVlKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNwZWNpZmllcyB0aGUgc3RyaW5nIHRvIGJlIGRpc3BsYXllZCBpbiBjZWxscyB3aXRoIG5vIHZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgTWlzc2luZ0NhcHRpb24geworICAgIGdldCA9PiBHZXRYbWxOb2RlU3RyaW5nKCJAbWlzc2luZ0NhcHRpb24iKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZygiQG1pc3NpbmdDYXB0aW9uIiwgdmFsdWUpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2ZpcnN0aGVhZGVycm93UGF0aCA9ICJkOmxvY2F0aW9uL0BmaXJzdEhlYWRlclJvdyI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU3BlY2lmaWVzIHRoZSBmaXJzdCByb3cgb2YgdGhlIFBpdm90VGFibGUgaGVhZGVyLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxlZnQgY2VsbCBpbiB0aGUgcmVmIHZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgRmlyc3RIZWFkZXJSb3cgeworICAgIGdldCA9PiBHZXRYbWxOb2RlSW50KF9maXJzdGhlYWRlcnJvd1BhdGgpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKF9maXJzdGhlYWRlcnJvd1BhdGgsIHZhbHVlLlRvU3RyaW5nKCkpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2ZpcnN0ZGF0YXJvd1BhdGggPSAiZDpsb2NhdGlvbi9AZmlyc3REYXRhUm93IjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTcGVjaWZpZXMgdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgUGl2b3RUYWJsZSBkYXRhLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxlZnQgY2VsbCBpbiB0aGUgcmVmIHZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgRmlyc3REYXRhUm93IHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUludChfZmlyc3RkYXRhcm93UGF0aCk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoX2ZpcnN0ZGF0YXJvd1BhdGgsIHZhbHVlLlRvU3RyaW5nKCkpOworICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX2ZpcnN0ZGF0YWNvbFBhdGggPSAiZDpsb2NhdGlvbi9AZmlyc3REYXRhQ29sIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBTcGVjaWZpZXMgdGhlIGZpcnN0IGNvbHVtbiBvZiB0aGUgUGl2b3RUYWJsZSBkYXRhLCByZWxhdGl2ZSB0byB0aGUgdG9wIGxlZnQgY2VsbCBpbiB0aGUgcmVmIHZhbHVlCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBpbnQgRmlyc3REYXRhQ29sIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUludChfZmlyc3RkYXRhY29sUGF0aCk7CisgICAgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoX2ZpcnN0ZGF0YWNvbFBhdGgsIHZhbHVlLlRvU3RyaW5nKCkpOworICB9CisKKyAgcHJpdmF0ZSBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb24gX2ZpZWxkczsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgZmllbGRzIGluIHRoZSB0YWJsZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uIEZpZWxkcyB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfZmllbGRzID09IG51bGwpIHsKKyAgICAgICAgX2ZpZWxkcyA9IG5ldyh0aGlzLCAiIik7CisgICAgICB9CisgICAgICByZXR1cm4gX2ZpZWxkczsKKyAgICB9CisgIH0KKworICBwcml2YXRlIEV4Y2VsUGl2b3RUYWJsZVJvd0NvbHVtbkZpZWxkQ29sbGVjdGlvbiBfcm93RmllbGRzOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJvdyBsYWJlbCBmaWVsZHMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZVJvd0NvbHVtbkZpZWxkQ29sbGVjdGlvbiBSb3dGaWVsZHMgeworICAgIGdldCB7CisgICAgICBpZiAoX3Jvd0ZpZWxkcyA9PSBudWxsKSB7CisgICAgICAgIF9yb3dGaWVsZHMgPSBuZXcodGhpcywgInJvd0ZpZWxkcyIpOworICAgICAgfQorICAgICAgcmV0dXJuIF9yb3dGaWVsZHM7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBFeGNlbFBpdm90VGFibGVSb3dDb2x1bW5GaWVsZENvbGxlY3Rpb24gX2NvbHVtbkZpZWxkczsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb2x1bW4gbGFiZWwgZmllbGRzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVSb3dDb2x1bW5GaWVsZENvbGxlY3Rpb24gQ29sdW1uRmllbGRzIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9jb2x1bW5GaWVsZHMgPT0gbnVsbCkgeworICAgICAgICBfY29sdW1uRmllbGRzID0gbmV3KHRoaXMsICJjb2xGaWVsZHMiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfY29sdW1uRmllbGRzOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgRXhjZWxQaXZvdFRhYmxlRGF0YUZpZWxkQ29sbGVjdGlvbiBfZGF0YUZpZWxkczsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBWYWx1ZSBmaWVsZHMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZENvbGxlY3Rpb24gRGF0YUZpZWxkcyB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfZGF0YUZpZWxkcyA9PSBudWxsKSB7CisgICAgICAgIF9kYXRhRmllbGRzID0gbmV3KHRoaXMpOworICAgICAgfQorICAgICAgcmV0dXJuIF9kYXRhRmllbGRzOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgRXhjZWxQaXZvdFRhYmxlUm93Q29sdW1uRmllbGRDb2xsZWN0aW9uIF9wYWdlRmllbGRzOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJlcG9ydCBmaWx0ZXIgZmllbGRzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVSb3dDb2x1bW5GaWVsZENvbGxlY3Rpb24gUGFnZUZpZWxkcyB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChfcGFnZUZpZWxkcyA9PSBudWxsKSB7CisgICAgICAgIF9wYWdlRmllbGRzID0gbmV3KHRoaXMsICJwYWdlRmllbGRzIik7CisgICAgICB9CisgICAgICByZXR1cm4gX3BhZ2VGaWVsZHM7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3N0eWxlbmFtZVBhdGggPSAiZDpwaXZvdFRhYmxlU3R5bGVJbmZvL0BuYW1lIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQaXZvdCBzdHlsZSBuYW1lLiBVc2VkIGZvciBjdXN0b20gc3R5bGVzCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgU3R5bGVOYW1lIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZyhfc3R5bGVuYW1lUGF0aCk7CisgICAgc2V0IHsKKyAgICAgIGlmICh2YWx1ZS5TdGFydHNXaXRoKCJQaXZvdFN0eWxlIikpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICBfdGFibGVTdHlsZSA9IChUYWJsZVN0eWxlcykKKyAgICAgICAgICAgIEVudW0uUGFyc2UodHlwZW9mKFRhYmxlU3R5bGVzKSwgdmFsdWUuU3Vic3RyaW5nKDEwLCB2YWx1ZS5MZW5ndGggLSAxMCksIHRydWUpOworICAgICAgICB9IGNhdGNoIHsKKyAgICAgICAgICBfdGFibGVTdHlsZSA9IFRhYmxlU3R5bGVzLkN1c3RvbTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiTm9uZSIpIHsKKyAgICAgICAgX3RhYmxlU3R5bGUgPSBUYWJsZVN0eWxlcy5Ob25lOworICAgICAgICB2YWx1ZSA9ICIiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3RhYmxlU3R5bGUgPSBUYWJsZVN0eWxlcy5DdXN0b207CisgICAgICB9CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9zdHlsZW5hbWVQYXRoLCB2YWx1ZSwgdHJ1ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBUYWJsZVN0eWxlcyBfdGFibGVTdHlsZSA9IFRhYmxlU3R5bGVzLk1lZGl1bTY7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIHRhYmxlIHN0eWxlLiBJZiB0aGlzIHByb3BlcnR5IGlzIGN1c29tIHRoZSBzdHlsZSBmcm9tIHRoZSBTdHlsZU5hbWUgcHJvcGVyeSBpcyB1c2VkLgorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgVGFibGVTdHlsZXMgVGFibGVTdHlsZSB7CisgICAgZ2V0ID0+IF90YWJsZVN0eWxlOworICAgIHNldCB7CisgICAgICBfdGFibGVTdHlsZSA9IHZhbHVlOworICAgICAgaWYgKHZhbHVlICE9IFRhYmxlU3R5bGVzLkN1c3RvbSkgeworICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9zdHlsZW5hbWVQYXRoLCAiUGl2b3RTdHlsZSIgKyB2YWx1ZSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgaW50IENhY2hlSUQgeworICAgIGdldCA9PiBHZXRYbWxOb2RlSW50KCJAY2FjaGVJZCIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKCJAY2FjaGVJZCIsIHZhbHVlLlRvU3RyaW5nKCkpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVDb2xsZWN0aW9uLmNzIGIvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlQ29sbGVjdGlvbi5jcwppbmRleCA3YmY0NzUwLi5iZGU4YzM2IDEwMDY0NAotLS0gYS9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVDb2xsZWN0aW9uLmNzCisrKyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUNvbGxlY3Rpb24uY3MKQEAgLTEzLDE1MyArMTMsMTI3IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIxLU1BUi0yMDExCiAgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQSBjb2xsZWN0aW9uIG9mIHBpdm90dGFibGUgb2JqZWN0cwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsUGl2b3RUYWJsZUNvbGxlY3Rpb24gOiBJRW51bWVyYWJsZTxFeGNlbFBpdm90VGFibGU+Ci0gICAgewotICAgICAgICBMaXN0PEV4Y2VsUGl2b3RUYWJsZT4gX3Bpdm90VGFibGVzID0gbmV3IExpc3Q8RXhjZWxQaXZvdFRhYmxlPigpOwotICAgICAgICBpbnRlcm5hbCBEaWN0aW9uYXJ5PHN0cmluZywgaW50PiBfcGl2b3RUYWJsZU5hbWVzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+KCk7Ci0gICAgICAgIEV4Y2VsV29ya3NoZWV0IF93czsgICAgICAgIAotICAgICAgICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVDb2xsZWN0aW9uKEV4Y2VsV29ya3NoZWV0IHdzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcGNrID0gd3MuX3BhY2thZ2UuUGFja2FnZTsKLSAgICAgICAgICAgIF93cyA9IHdzOyAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yZWFjaCh2YXIgcmVsIGluIHdzLlBhcnQuR2V0UmVsYXRpb25zaGlwcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChyZWwuUmVsYXRpb25zaGlwVHlwZSA9PSBFeGNlbFBhY2thZ2Uuc2NoZW1hUmVsYXRpb25zaGlwcyArICIvcGl2b3RUYWJsZSIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgdGJsID0gbmV3IEV4Y2VsUGl2b3RUYWJsZShyZWwsIHdzKTsKLSAgICAgICAgICAgICAgICAgICAgX3Bpdm90VGFibGVOYW1lcy5BZGQodGJsLk5hbWUsIF9waXZvdFRhYmxlcy5Db3VudCk7Ci0gICAgICAgICAgICAgICAgICAgIF9waXZvdFRhYmxlcy5BZGQodGJsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBFeGNlbFBpdm90VGFibGUgQWRkKEV4Y2VsUGl2b3RUYWJsZSB0YmwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9waXZvdFRhYmxlcy5BZGQodGJsKTsKLSAgICAgICAgICAgIF9waXZvdFRhYmxlTmFtZXMuQWRkKHRibC5OYW1lLCBfcGl2b3RUYWJsZXMuQ291bnQgLSAxKTsKLSAgICAgICAgICAgIGlmICh0YmwuQ2FjaGVJRCA+PSBfd3MuV29ya2Jvb2suX25leHRQaXZvdFRhYmxlSUQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX3dzLldvcmtib29rLl9uZXh0UGl2b3RUYWJsZUlEID0gdGJsLkNhY2hlSUQgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRibDsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZTsKIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGUgYSBwaXZvdHRhYmxlIG9uIHRoZSBzdXBwbGllZCByYW5nZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlJhbmdlIj5UaGUgcmFuZ2UgYWRkcmVzcyBpbmNsdWRpbmcgaGVhZGVyIGFuZCB0b3RhbCByb3c8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlNvdXJjZSI+VGhlIFNvdXJjZSBkYXRhIHJhbmdlIGFkZHJlc3M8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPlRoZSBuYW1lIG9mIHRoZSB0YWJsZS4gTXVzdCBiZSB1bmlxdWUgPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBwaXZvdHRhYmxlIG9iamVjdDwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZSBBZGQoRXhjZWxBZGRyZXNzQmFzZSBSYW5nZSwgRXhjZWxSYW5nZUJhc2UgU291cmNlLCBzdHJpbmcgTmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KE5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE5hbWUgPSBHZXROZXdUYWJsZU5hbWUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChSYW5nZS5Xb3JrU2hlZXQgIT0gX3dzLk5hbWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cobmV3IEV4Y2VwdGlvbigiVGhlIFJhbmdlIG11c3QgYmUgaW4gdGhlIGN1cnJlbnQgd29ya3NoZWV0IikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoX3dzLldvcmtib29rLkV4aXN0c1RhYmxlTmFtZShOYW1lKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJUYWJsZW5hbWUgaXMgbm90IHVuaXF1ZSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciB0IGluIF9waXZvdFRhYmxlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodC5BZGRyZXNzLkNvbGxpZGUoUmFuZ2UpICE9IEV4Y2VsQWRkcmVzc0Jhc2UuZUFkZHJlc3NDb2xsaXRpb24uTm8pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoIlRhYmxlIHJhbmdlIGNvbGxpZGVzIHdpdGggdGFibGUgezB9IiwgdC5OYW1lKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBBZGQobmV3IEV4Y2VsUGl2b3RUYWJsZShfd3MsIFJhbmdlLCBTb3VyY2UsIE5hbWUsIF93cy5Xb3JrYm9vay5fbmV4dFBpdm90VGFibGVJRCsrKSk7Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBBIGNvbGxlY3Rpb24gb2YgcGl2b3R0YWJsZSBvYmplY3RzCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsUGl2b3RUYWJsZUNvbGxlY3Rpb24gOiBJRW51bWVyYWJsZTxFeGNlbFBpdm90VGFibGU+IHsKKyAgcHJpdmF0ZSBMaXN0PEV4Y2VsUGl2b3RUYWJsZT4gX3Bpdm90VGFibGVzID0gbmV3KCk7CisgIGludGVybmFsIERpY3Rpb25hcnk8c3RyaW5nLCBpbnQ+IF9waXZvdFRhYmxlTmFtZXMgPSBuZXcoKTsKKyAgcHJpdmF0ZSBFeGNlbFdvcmtzaGVldCBfd3M7CiAKLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIEdldE5ld1RhYmxlTmFtZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBuYW1lID0gIlBpdm90dGFibGUxIjsKLSAgICAgICAgICAgIGludCBpID0gMjsKLSAgICAgICAgICAgIHdoaWxlIChfd3MuV29ya2Jvb2suRXhpc3RzUGl2b3RUYWJsZU5hbWUobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IHN0cmluZy5Gb3JtYXQoIlBpdm90dGFibGV7MH0iLCBpKyspOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGludCBDb3VudAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX3Bpdm90VGFibGVzLkNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBwaXZvdHRhYmxlIEluZGV4LiBCYXNlIDAuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iSW5kZXgiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFBpdm90VGFibGUgdGhpc1tpbnQgSW5kZXhdCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChJbmRleCA8IDAgfHwgSW5kZXggPj0gX3Bpdm90VGFibGVzLkNvdW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIlBpdm90VGFibGUgaW5kZXggb3V0IG9mIHJhbmdlIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gX3Bpdm90VGFibGVzW0luZGV4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQaXZvdHRhYmVzIGFjY2VzZWQgYnkgbmFtZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Ik5hbWUiPlRoZSBuYW1lIG9mIHRoZSBwaXZvdHRhYmxlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBQaXZvdGFibGUuIE51bGwgaWYgdGhlIG5vIG1hdGNoIGlzIGZvdW5kPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlIHRoaXNbc3RyaW5nIE5hbWVdCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChfcGl2b3RUYWJsZU5hbWVzLkNvbnRhaW5zS2V5KE5hbWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9waXZvdFRhYmxlc1tfcGl2b3RUYWJsZU5hbWVzW05hbWVdXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBJRW51bWVyYXRvcjxFeGNlbFBpdm90VGFibGU+IEdldEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX3Bpdm90VGFibGVzLkdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYXRvciBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBfcGl2b3RUYWJsZXMuR2V0RW51bWVyYXRvcigpOwotICAgICAgICB9CisgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZUNvbGxlY3Rpb24oRXhjZWxXb3Jrc2hlZXQgd3MpIHsKKyAgICB2YXIgcGNrID0gd3MuX3BhY2thZ2UuUGFja2FnZTsKKyAgICBfd3MgPSB3czsKKyAgICBmb3JlYWNoICh2YXIgcmVsIGluIHdzLlBhcnQuR2V0UmVsYXRpb25zaGlwcygpKSB7CisgICAgICBpZiAocmVsLlJlbGF0aW9uc2hpcFR5cGUgPT0gRXhjZWxQYWNrYWdlLl9zY2hlbWFSZWxhdGlvbnNoaXBzICsgIi9waXZvdFRhYmxlIikgeworICAgICAgICB2YXIgdGJsID0gbmV3IEV4Y2VsUGl2b3RUYWJsZShyZWwsIHdzKTsKKyAgICAgICAgX3Bpdm90VGFibGVOYW1lcy5BZGQodGJsLk5hbWUsIF9waXZvdFRhYmxlcy5Db3VudCk7CisgICAgICAgIF9waXZvdFRhYmxlcy5BZGQodGJsKTsKKyAgICAgIH0KICAgICB9CisgIH0KKworICBwcml2YXRlIEV4Y2VsUGl2b3RUYWJsZSBBZGQoRXhjZWxQaXZvdFRhYmxlIHRibCkgeworICAgIF9waXZvdFRhYmxlcy5BZGQodGJsKTsKKyAgICBfcGl2b3RUYWJsZU5hbWVzLkFkZCh0YmwuTmFtZSwgX3Bpdm90VGFibGVzLkNvdW50IC0gMSk7CisgICAgaWYgKHRibC5DYWNoZUlEID49IF93cy5Xb3JrYm9vay5fbmV4dFBpdm90VGFibGVJRCkgeworICAgICAgX3dzLldvcmtib29rLl9uZXh0UGl2b3RUYWJsZUlEID0gdGJsLkNhY2hlSUQgKyAxOworICAgIH0KKyAgICByZXR1cm4gdGJsOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ3JlYXRlIGEgcGl2b3R0YWJsZSBvbiB0aGUgc3VwcGxpZWQgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJyYW5nZSI+VGhlIHJhbmdlIGFkZHJlc3MgaW5jbHVkaW5nIGhlYWRlciBhbmQgdG90YWwgcm93PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJzb3VyY2UiPlRoZSBTb3VyY2UgZGF0YSByYW5nZSBhZGRyZXNzPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj5UaGUgbmFtZSBvZiB0aGUgdGFibGUuIE11c3QgYmUgdW5pcXVlIDwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UaGUgcGl2b3R0YWJsZSBvYmplY3Q8L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFBpdm90VGFibGUgQWRkKEV4Y2VsQWRkcmVzc0Jhc2UgcmFuZ2UsIEV4Y2VsUmFuZ2VCYXNlIHNvdXJjZSwgc3RyaW5nIG5hbWUpIHsKKyAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkobmFtZSkpIHsKKyAgICAgIG5hbWUgPSBHZXROZXdUYWJsZU5hbWUoKTsKKyAgICB9CisgICAgaWYgKHJhbmdlLldvcmtTaGVldCAhPSBfd3MuTmFtZSkgeworICAgICAgdGhyb3cgKG5ldygiVGhlIFJhbmdlIG11c3QgYmUgaW4gdGhlIGN1cnJlbnQgd29ya3NoZWV0IikpOworICAgIH0KKyAgICBpZiAoX3dzLldvcmtib29rLkV4aXN0c1RhYmxlTmFtZShuYW1lKSkgeworICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVGFibGVuYW1lIGlzIG5vdCB1bmlxdWUiKSk7CisgICAgfQorICAgIGZvcmVhY2ggKHZhciB0IGluIF9waXZvdFRhYmxlcykgeworICAgICAgaWYgKHQuQWRkcmVzcy5Db2xsaWRlKHJhbmdlKSAhPSBFeGNlbEFkZHJlc3NCYXNlLmVBZGRyZXNzQ29sbGl0aW9uLk5vKSB7CisgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiVGFibGUgcmFuZ2UgY29sbGlkZXMgd2l0aCB0YWJsZSB7MH0iLCB0Lk5hbWUpKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBBZGQobmV3KF93cywgcmFuZ2UsIHNvdXJjZSwgbmFtZSwgX3dzLldvcmtib29rLl9uZXh0UGl2b3RUYWJsZUlEKyspKTsKKyAgfQorCisgIGludGVybmFsIHN0cmluZyBHZXROZXdUYWJsZU5hbWUoKSB7CisgICAgc3RyaW5nIG5hbWUgPSAiUGl2b3R0YWJsZTEiOworICAgIGludCBpID0gMjsKKyAgICB3aGlsZSAoX3dzLldvcmtib29rLkV4aXN0c1Bpdm90VGFibGVOYW1lKG5hbWUpKSB7CisgICAgICBuYW1lID0gc3RyaW5nLkZvcm1hdCgiUGl2b3R0YWJsZXswfSIsIGkrKyk7CisgICAgfQorICAgIHJldHVybiBuYW1lOworICB9CisKKyAgcHVibGljIGludCBDb3VudCA9PiBfcGl2b3RUYWJsZXMuQ291bnQ7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIHBpdm90dGFibGUgSW5kZXguIEJhc2UgMC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpbmRleCI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZSB0aGlzW2ludCBpbmRleF0geworICAgIGdldCB7CisgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IF9waXZvdFRhYmxlcy5Db3VudCkgeworICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiUGl2b3RUYWJsZSBpbmRleCBvdXQgb2YgcmFuZ2UiKSk7CisgICAgICB9CisgICAgICByZXR1cm4gX3Bpdm90VGFibGVzW2luZGV4XTsKKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBQaXZvdHRhYmVzIGFjY2VzZWQgYnkgbmFtZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPlRoZSBuYW1lIG9mIHRoZSBwaXZvdHRhYmxlPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPlRoZSBQaXZvdGFibGUuIE51bGwgaWYgdGhlIG5vIG1hdGNoIGlzIGZvdW5kPC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlIHRoaXNbc3RyaW5nIG5hbWVdIHsKKyAgICBnZXQgeworICAgICAgaWYgKF9waXZvdFRhYmxlTmFtZXMuQ29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIF9waXZvdFRhYmxlc1tfcGl2b3RUYWJsZU5hbWVzW25hbWVdXTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBJRW51bWVyYXRvcjxFeGNlbFBpdm90VGFibGU+IEdldEVudW1lcmF0b3IoKSB7CisgICAgcmV0dXJuIF9waXZvdFRhYmxlcy5HZXRFbnVtZXJhdG9yKCk7CisgIH0KKworICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkgeworICAgIHJldHVybiBfcGl2b3RUYWJsZXMuR2V0RW51bWVyYXRvcigpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVEYXRhRmllbGQuY3MgYi9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVEYXRhRmllbGQuY3MKaW5kZXggOTdhN2RjNC4uYmZlOGM1MiAxMDA2NDQKLS0tIGEvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlRGF0YUZpZWxkLmNzCisrKyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZC5jcwpAQCAtMSw0ICsxLDQgQEAKLe+7vy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogWW91IG1heSBhbWVuZCBhbmQgZGlzdHJpYnV0ZSBhcyB5b3UgbGlrZSwgYnV0IGRvbid0IHJlbW92ZSB0aGlzIGhlYWRlciEKICAqCiAgKiBFUFBsdXMgcHJvdmlkZXMgc2VydmVyLXNpZGUgZ2VuZXJhdGlvbiBvZiBFeGNlbCAyMDA3LzIwMTAgc3ByZWFkc2hlZXRzLgpAQCAtMTMsMjIxICsxMywxNzggQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjEtTUFSLTIwMTEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIFN5c3RlbS5YbWw7CiB1c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlLlhtbEFjY2VzczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQSBwaXZvIHRhYmxlIGRhdGEgZmllbGQKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFBpdm90VGFibGVEYXRhRmllbGQgOiBYbWxIZWxwZXIKLSAgICB7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIHRvcE5vZGUsRXhjZWxQaXZvdFRhYmxlRmllbGQgZmllbGQpIDoKLSAgICAgICAgICAgIGJhc2UobnMsIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0b3BOb2RlLkF0dHJpYnV0ZXMuQ291bnQgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJbmRleCA9IGZpZWxkLkluZGV4OwotICAgICAgICAgICAgICAgIEJhc2VGaWVsZCA9IDA7Ci0gICAgICAgICAgICAgICAgQmFzZUl0ZW0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBGaWVsZCA9IGZpZWxkOwotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBmaWVsZAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlRmllbGQgRmllbGQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0OwotICAgICAgICAgICAgcHJpdmF0ZSBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGluZGV4IG9mIHRoZSBkYXRhZmllbGQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBJbmRleCAKLSAgICAgICAgeyAKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KCJAZmxkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAZmxkIix2YWx1ZS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgbmFtZSBvZiB0aGUgZGF0YWZpZWxkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgTmFtZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygiQG5hbWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChGaWVsZC5fdGFibGUuRGF0YUZpZWxkcy5FeGlzdHNEZk5hbWUodmFsdWUsIHRoaXMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJEdXBsaWNhdGUgZGF0YWZpZWxkIG5hbWUiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBuYW1lIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZpZWxkIGluZGV4LiBSZWZlcmVuY2UgdG8gdGhlIGZpZWxkIGNvbGxlY3Rpb24KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBCYXNlRmllbGQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoIkBiYXNlRmllbGQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBiYXNlRmllbGQiLCB2YWx1ZS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTcGVjaWZpZXMgdGhlIGluZGV4IHRvIHRoZSBiYXNlIGl0ZW0gd2hlbiB0aGUgU2hvd0RhdGFBcyBjYWxjdWxhdGlvbiBpcyBpbiB1c2UKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBCYXNlSXRlbQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludCgiQGJhc2VJdGVtIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAYmFzZUl0ZW0iLCB2YWx1ZS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBOdW1iZXIgZm9ybWF0IGlkLiAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgaW50IE51bUZtdElkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KCJAbnVtRm10SWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBudW1GbXRJZCIsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE51bWJlciBmb3JtYXQgZm9yIHRoZSBkYXRhIGNvbHVtbgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIEZvcm1hdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgbmYgaW4gRmllbGQuX3RhYmxlLldvcmtTaGVldC5Xb3JrYm9vay5TdHlsZXMuTnVtYmVyRm9ybWF0cykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZi5OdW1GbXRJZCA9PSBOdW1GbXRJZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5mLkZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gRmllbGQuX3RhYmxlLldvcmtTaGVldC5Xb3JrYm9vay5TdHlsZXMuTnVtYmVyRm9ybWF0c1swXS5Gb3JtYXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc3R5bGVzID0gRmllbGQuX3RhYmxlLldvcmtTaGVldC5Xb3JrYm9vay5TdHlsZXM7CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlOwogCi0gICAgICAgICAgICAgICAgRXhjZWxOdW1iZXJGb3JtYXRYbWwgbmYgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmICghc3R5bGVzLk51bWJlckZvcm1hdHMuRmluZEJ5SUQodmFsdWUsIHJlZiBuZikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBuZiA9IG5ldyBFeGNlbE51bWJlckZvcm1hdFhtbChOYW1lU3BhY2VNYW5hZ2VyKSB7IEZvcm1hdCA9IHZhbHVlLCBOdW1GbXRJZCA9IHN0eWxlcy5OdW1iZXJGb3JtYXRzLk5leHRJZCsrIH07Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlcy5OdW1iZXJGb3JtYXRzLkFkZCh2YWx1ZSwgbmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBOdW1GbXRJZCA9IG5mLk51bUZtdElkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFR5cGUgb2YgYWdncmVnYXRlIGZ1bmN0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBEYXRhRmllbGRGdW5jdGlvbnMgRnVuY3Rpb24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHM9R2V0WG1sTm9kZVN0cmluZygiQHN1YnRvdGFsIik7Ci0gICAgICAgICAgICAgICAgaWYocz09IiIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGF0YUZpZWxkRnVuY3Rpb25zLk5vbmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAoRGF0YUZpZWxkRnVuY3Rpb25zKUVudW0uUGFyc2UodHlwZW9mKERhdGFGaWVsZEZ1bmN0aW9ucyksIHMsIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyB2OwotICAgICAgICAgICAgICAgIHN3aXRjaCh2YWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRGF0YUZpZWxkRnVuY3Rpb25zLk5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBEZWxldGVOb2RlKCJAc3VidG90YWwiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBEYXRhRmllbGRGdW5jdGlvbnMuQ291bnROdW1zOgotICAgICAgICAgICAgICAgICAgICAgICAgdj0iQ291bnROdW1zIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIERhdGFGaWVsZEZ1bmN0aW9ucy5TdGREZXY6Ci0gICAgICAgICAgICAgICAgICAgICAgICB2PSJzdGREZXYiOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgRGF0YUZpZWxkRnVuY3Rpb25zLlN0ZERldlA6Ci0gICAgICAgICAgICAgICAgICAgICAgICB2PSJzdGREZXZQIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgdj12YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBzdWJ0b3RhbCIsIHYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLy8vU2luY2Ugd2UgaGF2ZSBubyBpdGVtcywgRXhjZWwgd2lsbCBjcmFzaCB3aGVuIHdlIHVzZSBzaG93RGF0YUFzIG9wdGlvbnMgdGhhdCByZXF1aXJlIGJhc2VJdGVtJ3MKLSAgICAgICAgLy9wdWJsaWMgZVNob3dEYXRhQXMgU2hvd0RhdGFBcwotICAgICAgICAvL3sKLSAgICAgICAgLy8gICAgZ2V0Ci0gICAgICAgIC8vICAgIHsKLSAgICAgICAgLy8gICAgICAgIHN0cmluZyBzID0gR2V0WG1sTm9kZVN0cmluZygiQHNob3dEYXRhQXMiKTsKLSAgICAgICAgLy8gICAgICAgIGlmIChzID09ICIiKQotICAgICAgICAvLyAgICAgICAgewotICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBlU2hvd0RhdGFBcy5Ob3JtYWw7Ci0gICAgICAgIC8vICAgICAgICB9Ci0gICAgICAgIC8vICAgICAgICBlbHNlCi0gICAgICAgIC8vICAgICAgICB7Ci0gICAgICAgIC8vICAgICAgICAgICAgcmV0dXJuIChlU2hvd0RhdGFBcylFbnVtLlBhcnNlKHR5cGVvZihlU2hvd0RhdGFBcyksIHMsIHRydWUpOwotICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAvLyAgICB9Ci0gICAgICAgIC8vICAgIHNldAotICAgICAgICAvLyAgICB7Ci0gICAgICAgIC8vICAgICAgICBzdHJpbmcgdiA9IHZhbHVlLlRvU3RyaW5nKCk7Ci0gICAgICAgIC8vICAgICAgICB2ID0gdi5TdWJzdHJpbmcoMCwgMSkuVG9Mb3dlcigpICsgdi5TdWJzdHJpbmcoMSk7Ci0gICAgICAgIC8vICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAc2hvd0RhdGFBcyIsIHYpOwotICAgICAgICAvLyAgICB9Ci0gICAgICAgIC8vfQorLy8vIDxzdW1tYXJ5PgorLy8vIEEgcGl2byB0YWJsZSBkYXRhIGZpZWxkCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZCA6IFhtbEhlbHBlciB7CisgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZCgKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsCisgICAgICBYbWxOb2RlIHRvcE5vZGUsCisgICAgICBFeGNlbFBpdm90VGFibGVGaWVsZCBmaWVsZCkKKyAgICAgIDogYmFzZShucywgdG9wTm9kZSkgeworICAgIGlmICh0b3BOb2RlLkF0dHJpYnV0ZXMuQ291bnQgPT0gMCkgeworICAgICAgSW5kZXggPSBmaWVsZC5JbmRleDsKKyAgICAgIEJhc2VGaWVsZCA9IDA7CisgICAgICBCYXNlSXRlbSA9IDA7CiAgICAgfQorCisgICAgRmllbGQgPSBmaWVsZDsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFRoZSBmaWVsZAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlRmllbGQgRmllbGQgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIGluZGV4IG9mIHRoZSBkYXRhZmllbGQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBJbmRleCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVJbnQoIkBmbGQiKTsKKyAgICBpbnRlcm5hbCBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZygiQGZsZCIsIHZhbHVlLlRvU3RyaW5nKCkpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIG5hbWUgb2YgdGhlIGRhdGFmaWVsZAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIE5hbWUgeworICAgIGdldCA9PiBHZXRYbWxOb2RlU3RyaW5nKCJAbmFtZSIpOworICAgIHNldCB7CisgICAgICBpZiAoRmllbGQuX3RhYmxlLkRhdGFGaWVsZHMuRXhpc3RzRGZOYW1lKHZhbHVlLCB0aGlzKSkgeworICAgICAgICB0aHJvdyAobmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkR1cGxpY2F0ZSBkYXRhZmllbGQgbmFtZSIpKTsKKyAgICAgIH0KKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBuYW1lIiwgdmFsdWUpOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEZpZWxkIGluZGV4LiBSZWZlcmVuY2UgdG8gdGhlIGZpZWxkIGNvbGxlY3Rpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGludCBCYXNlRmllbGQgeworICAgIGdldCA9PiBHZXRYbWxOb2RlSW50KCJAYmFzZUZpZWxkIik7CisgICAgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoIkBiYXNlRmllbGQiLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNwZWNpZmllcyB0aGUgaW5kZXggdG8gdGhlIGJhc2UgaXRlbSB3aGVuIHRoZSBTaG93RGF0YUFzIGNhbGN1bGF0aW9uIGlzIGluIHVzZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgaW50IEJhc2VJdGVtIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUludCgiQGJhc2VJdGVtIik7CisgICAgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoIkBiYXNlSXRlbSIsIHZhbHVlLlRvU3RyaW5nKCkpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTnVtYmVyIGZvcm1hdCBpZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgaW50IE51bUZtdElkIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUludCgiQG51bUZtdElkIik7CisgICAgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoIkBudW1GbXRJZCIsIHZhbHVlLlRvU3RyaW5nKCkpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gTnVtYmVyIGZvcm1hdCBmb3IgdGhlIGRhdGEgY29sdW1uCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgRm9ybWF0IHsKKyAgICBnZXQgeworICAgICAgZm9yZWFjaCAodmFyIG5mIGluIEZpZWxkLl90YWJsZS5Xb3JrU2hlZXQuV29ya2Jvb2suU3R5bGVzLk51bWJlckZvcm1hdHMpIHsKKyAgICAgICAgaWYgKG5mLk51bUZtdElkID09IE51bUZtdElkKSB7CisgICAgICAgICAgcmV0dXJuIG5mLkZvcm1hdDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIEZpZWxkLl90YWJsZS5Xb3JrU2hlZXQuV29ya2Jvb2suU3R5bGVzLk51bWJlckZvcm1hdHNbMF0uRm9ybWF0OworICAgIH0KKyAgICBzZXQgeworICAgICAgdmFyIHN0eWxlcyA9IEZpZWxkLl90YWJsZS5Xb3JrU2hlZXQuV29ya2Jvb2suU3R5bGVzOworCisgICAgICBFeGNlbE51bWJlckZvcm1hdFhtbCBuZiA9IG51bGw7CisgICAgICBpZiAoIXN0eWxlcy5OdW1iZXJGb3JtYXRzLkZpbmRCeUlkKHZhbHVlLCByZWYgbmYpKSB7CisgICAgICAgIG5mID0gbmV3KE5hbWVTcGFjZU1hbmFnZXIpIHsKKyAgICAgICAgICBGb3JtYXQgPSB2YWx1ZSwKKyAgICAgICAgICBOdW1GbXRJZCA9IHN0eWxlcy5OdW1iZXJGb3JtYXRzLk5leHRJZCsrLAorICAgICAgICB9OworICAgICAgICBzdHlsZXMuTnVtYmVyRm9ybWF0cy5BZGQodmFsdWUsIG5mKTsKKyAgICAgIH0KKyAgICAgIE51bUZtdElkID0gbmYuTnVtRm10SWQ7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVHlwZSBvZiBhZ2dyZWdhdGUgZnVuY3Rpb24KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIERhdGFGaWVsZEZ1bmN0aW9ucyBGdW5jdGlvbiB7CisgICAgZ2V0IHsKKyAgICAgIHN0cmluZyBzID0gR2V0WG1sTm9kZVN0cmluZygiQHN1YnRvdGFsIik7CisgICAgICBpZiAocyA9PSAiIikgeworICAgICAgICByZXR1cm4gRGF0YUZpZWxkRnVuY3Rpb25zLk5vbmU7CisgICAgICB9CisgICAgICByZXR1cm4gKERhdGFGaWVsZEZ1bmN0aW9ucylFbnVtLlBhcnNlKHR5cGVvZihEYXRhRmllbGRGdW5jdGlvbnMpLCBzLCB0cnVlKTsKKyAgICB9CisgICAgc2V0IHsKKyAgICAgIHN0cmluZyB2OworICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICBjYXNlIERhdGFGaWVsZEZ1bmN0aW9ucy5Ob25lOgorICAgICAgICAgIERlbGV0ZU5vZGUoIkBzdWJ0b3RhbCIpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBEYXRhRmllbGRGdW5jdGlvbnMuQ291bnROdW1zOgorICAgICAgICAgIHYgPSAiQ291bnROdW1zIjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEYXRhRmllbGRGdW5jdGlvbnMuU3RkRGV2OgorICAgICAgICAgIHYgPSAic3RkRGV2IjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEYXRhRmllbGRGdW5jdGlvbnMuU3RkRGV2UDoKKyAgICAgICAgICB2ID0gInN0ZERldlAiOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHYgPSB2YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAc3VidG90YWwiLCB2KTsKKyAgICB9CisgIH0KKyAgLy8vLy9TaW5jZSB3ZSBoYXZlIG5vIGl0ZW1zLCBFeGNlbCB3aWxsIGNyYXNoIHdoZW4gd2UgdXNlIHNob3dEYXRhQXMgb3B0aW9ucyB0aGF0IHJlcXVpcmUgYmFzZUl0ZW0ncworICAvL3B1YmxpYyBlU2hvd0RhdGFBcyBTaG93RGF0YUFzCisgIC8veworICAvLyAgICBnZXQKKyAgLy8gICAgeworICAvLyAgICAgICAgc3RyaW5nIHMgPSBHZXRYbWxOb2RlU3RyaW5nKCJAc2hvd0RhdGFBcyIpOworICAvLyAgICAgICAgaWYgKHMgPT0gIiIpCisgIC8vICAgICAgICB7CisgIC8vICAgICAgICAgICAgcmV0dXJuIGVTaG93RGF0YUFzLk5vcm1hbDsKKyAgLy8gICAgICAgIH0KKyAgLy8gICAgICAgIGVsc2UKKyAgLy8gICAgICAgIHsKKyAgLy8gICAgICAgICAgICByZXR1cm4gKGVTaG93RGF0YUFzKUVudW0uUGFyc2UodHlwZW9mKGVTaG93RGF0YUFzKSwgcywgdHJ1ZSk7CisgIC8vICAgICAgICB9CisgIC8vICAgIH0KKyAgLy8gICAgc2V0CisgIC8vICAgIHsKKyAgLy8gICAgICAgIHN0cmluZyB2ID0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgLy8gICAgICAgIHYgPSB2LlN1YnN0cmluZygwLCAxKS5Ub0xvd2VyKCkgKyB2LlN1YnN0cmluZygxKTsKKyAgLy8gICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBzaG93RGF0YUFzIiwgdik7CisgIC8vICAgIH0KKyAgLy99CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVGaWVsZC5jcyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUZpZWxkLmNzCmluZGV4IDJlODk3YWIuLjY1NGFiNzEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUZpZWxkLmNzCisrKyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUZpZWxkLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxMDY0ICsxMywxMDAwIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIxLU1BUi0yMDExCiAgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwotdXNpbmcgU3lzdGVtLlhtbDsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwordXNpbmcgU3lzdGVtLlhtbDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZQotewotICAgIAotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRGVmaW5lcyB0aGUgYXhpcyBmb3IgYSBQaXZvdFRhYmxlCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBlUGl2b3RGaWVsZEF4aXMKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE5vbmUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgTm9uZT0tMSwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29sdW1uIGF4aXMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQ29sdW1uLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQYWdlIGF4aXMgKEluY2x1ZGUgQ291bnQgRmlsdGVyKSAKLSAgICAgICAgLy8vIAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBQYWdlLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSb3cgYXhpcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBSb3csCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFZhbHVlcyBheGlzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFZhbHVlcyAKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBEZWZpbmVzIHRoZSBheGlzIGZvciBhIFBpdm90VGFibGUKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgZW51bSBlUGl2b3RGaWVsZEF4aXMgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOb25lCisgIC8vLyA8L3N1bW1hcnk+CisgIE5vbmUgPSAtMSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb2x1bW4gYXhpcworICAvLy8gPC9zdW1tYXJ5PgorICBDb2x1bW4sCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUGFnZSBheGlzIChJbmNsdWRlIENvdW50IEZpbHRlcikKKyAgLy8vCisgIC8vLyA8L3N1bW1hcnk+CisgIFBhZ2UsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUm93IGF4aXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgUm93LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFZhbHVlcyBheGlzCisgIC8vLyA8L3N1bW1hcnk+CisgIFZhbHVlcywKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIEJ1aWxkLWluIHRhYmxlIHJvdyBmdW5jdGlvbnMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgZW51bSBEYXRhRmllbGRGdW5jdGlvbnMgeworICBBdmVyYWdlLAorICBDb3VudCwKKyAgQ291bnROdW1zLAorICBNYXgsCisgIE1pbiwKKyAgUHJvZHVjdCwKKyAgTm9uZSwKKyAgU3RkRGV2LAorICBTdGREZXZQLAorICBTdW0sCisgIFZhciwKKyAgVmFyUCwKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIERlZmluZXMgdGhlIGRhdGEgZm9ybWF0cyBmb3IgYSBmaWVsZCBpbiB0aGUgUGl2b3RUYWJsZQorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVTaG93RGF0YUFzIHsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW5kaWNhdGVzIHRoZSBmaWVsZCBpcyBzaG93biBhcyB0aGUgImRpZmZlcmVuY2UgZnJvbSIgYSB2YWx1ZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgRGlmZmVyZW5jZSwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbmRpY2F0ZXMgdGhlIGZpZWxkIGlzIHNob3duIGFzIHRoZSAiaW5kZXguCisgIC8vLyA8L3N1bW1hcnk+CisgIEluZGV4LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBpcyBzaG93biBhcyBpdHMgbm9ybWFsIGRhdGF0eXBlLgorICAvLy8gPC9zdW1tYXJ5PgorICBOb3JtYWwsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gL0luZGljYXRlcyB0aGUgZmllbGQgaXMgc2hvdyBhcyB0aGUgInBlcmNlbnRhZ2Ugb2YiIGEgdmFsdWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgUGVyY2VudCwKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbmRpY2F0ZXMgdGhlIGZpZWxkIGlzIHNob3duIGFzIHRoZSAicGVyY2VudGFnZSBkaWZmZXJlbmNlIGZyb20iIGEgdmFsdWUuCisgIC8vLyA8L3N1bW1hcnk+CisgIFBlcmNlbnREaWZmLAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluZGljYXRlcyB0aGUgZmllbGQgaXMgc2hvd24gYXMgdGhlIHBlcmNlbnRhZ2Ugb2YgY29sdW1uLgorICAvLy8gPC9zdW1tYXJ5PgorICBQZXJjZW50T2ZDb2wsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW5kaWNhdGVzIHRoZSBmaWVsZCBpcyBzaG93biBhcyB0aGUgcGVyY2VudGFnZSBvZiByb3cKKyAgLy8vIDwvc3VtbWFyeT4KKyAgUGVyY2VudE9mUm93LAorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluZGljYXRlcyB0aGUgZmllbGQgaXMgc2hvd24gYXMgcGVyY2VudGFnZSBvZiB0b3RhbC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgUGVyY2VudE9mVG90YWwsCisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSW5kaWNhdGVzIHRoZSBmaWVsZCBpcyBzaG93biBhcyBydW5uaW5nIHRvdGFsIGluIHRoZSB0YWJsZS4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgUnVuVG90YWwsCit9CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBCdWlsdC1pbiBzdWJ0b3RhbCBmdW5jdGlvbnMKKy8vLyA8L3N1bW1hcnk+CitbRmxhZ3NdCitwdWJsaWMgZW51bSBlU3ViVG90YWxGdW5jdGlvbnMgeworICBOb25lID0gMSwKKyAgQ291bnQgPSAyLAorICBDb3VudEEgPSA0LAorICBBdmcgPSA4LAorICBEZWZhdWx0ID0gMTYsCisgIE1pbiA9IDMyLAorICBNYXggPSA2NCwKKyAgUHJvZHVjdCA9IDEyOCwKKyAgU3RkRGV2ID0gMjU2LAorICBTdGREZXZQID0gNTEyLAorICBTdW0gPSAxMDI0LAorICBWYXIgPSAyMDQ4LAorICBWYXJQID0gNDA5NiwKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIERhdGEgZ3JvdXBpbmcKKy8vLyA8L3N1bW1hcnk+CitbRmxhZ3NdCitwdWJsaWMgZW51bSBlRGF0ZUdyb3VwQnkgeworICBZZWFycyA9IDEsCisgIFF1YXJ0ZXJzID0gMiwKKyAgTW9udGhzID0gNCwKKyAgRGF5cyA9IDgsCisgIEhvdXJzID0gMTYsCisgIE1pbnV0ZXMgPSAzMiwKKyAgU2Vjb25kcyA9IDY0LAorfQorCisvLy8gPHN1bW1hcnk+CisvLy8gU29ydGluZworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBlbnVtIGVTb3J0VHlwZSB7CisgIE5vbmUsCisgIEFzY2VuZGluZywKKyAgRGVzY2VuZGluZywKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIEEgcGl2b3QgdGFibGUgZmllbGQuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsUGl2b3RUYWJsZUZpZWxkIDogWG1sSGVscGVyIHsKKyAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlIF90YWJsZTsKKworICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVGaWVsZCgKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsCisgICAgICBYbWxOb2RlIHRvcE5vZGUsCisgICAgICBFeGNlbFBpdm90VGFibGUgdGFibGUsCisgICAgICBpbnQgaW5kZXgsCisgICAgICBpbnQgYmFzZUluZGV4KQorICAgICAgOiBiYXNlKG5zLCB0b3BOb2RlKSB7CisgICAgSW5kZXggPSBpbmRleDsKKyAgICBCYXNlSW5kZXggPSBiYXNlSW5kZXg7CisgICAgX3RhYmxlID0gdGFibGU7CisgIH0KKworICBwdWJsaWMgaW50IEluZGV4IHsgZ2V0OyBzZXQ7IH0KKworICBpbnRlcm5hbCBpbnQgQmFzZUluZGV4IHsgZ2V0OyBzZXQ7IH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBOYW1lIG9mIHRoZSBmaWVsZAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgc3RyaW5nIE5hbWUgeworICAgIGdldCB7CisgICAgICBzdHJpbmcgdiA9IEdldFhtbE5vZGVTdHJpbmcoIkBuYW1lIik7CisgICAgICBpZiAodiA9PSAiIikgeworICAgICAgICByZXR1cm4gX2NhY2hlRmllbGRIZWxwZXIuR2V0WG1sTm9kZVN0cmluZygiQG5hbWUiKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiB2OwogICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEJ1aWxkLWluIHRhYmxlIHJvdyBmdW5jdGlvbnMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIERhdGFGaWVsZEZ1bmN0aW9ucwotICAgIHsKLSAgICAgICAgQXZlcmFnZSwKLSAgICAgICAgQ291bnQsCi0gICAgICAgIENvdW50TnVtcywKLSAgICAgICAgTWF4LAotICAgICAgICBNaW4sCi0gICAgICAgIFByb2R1Y3QsCi0gICAgICAgIE5vbmUsCi0gICAgICAgIFN0ZERldiwKLSAgICAgICAgU3RkRGV2UCwKLSAgICAgICAgU3VtLAotICAgICAgICBWYXIsCi0gICAgICAgIFZhclAKKyAgICBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZygiQG5hbWUiLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb21wYWN0IG1vZGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQ29tcGFjdCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKCJAY29tcGFjdCIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbCgiQGNvbXBhY3QiLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgaXRlbXMgaW4gdGhpcyBmaWVsZCBzaG91bGQgYmUgc2hvd24gaW4gT3V0bGluZSBmb3JtCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIE91dGxpbmUgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbCgiQG91dGxpbmUiKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZUJvb2woIkBvdXRsaW5lIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhlIGN1c3RvbSB0ZXh0IHRoYXQgaXMgZGlzcGxheWVkIGZvciB0aGUgc3VidG90YWxzIGxhYmVsCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIFN1YnRvdGFsVG9wIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUJvb2woIkBzdWJ0b3RhbFRvcCIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbCgiQHN1YnRvdGFsVG9wIiwgdmFsdWUpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQSBib29sZWFuIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdG8gc2hvdyBhbGwgaXRlbXMgZm9yIHRoaXMgZmllbGQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgU2hvd0FsbCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVCb29sKCJAc2hvd0FsbCIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlQm9vbCgiQHNob3dBbGwiLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgdHlwZSBvZiBzb3J0IHRoYXQgaXMgYXBwbGllZCB0byB0aGlzIGZpZWxkCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBlU29ydFR5cGUgU29ydCB7CisgICAgZ2V0IHsKKyAgICAgIHN0cmluZyB2ID0gR2V0WG1sTm9kZVN0cmluZygiQHNvcnRUeXBlIik7CisgICAgICByZXR1cm4gdiA9PSAiIiA/IGVTb3J0VHlwZS5Ob25lIDogKGVTb3J0VHlwZSlFbnVtLlBhcnNlKHR5cGVvZihlU29ydFR5cGUpLCB2LCB0cnVlKTsKICAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBEZWZpbmVzIHRoZSBkYXRhIGZvcm1hdHMgZm9yIGEgZmllbGQgaW4gdGhlIFBpdm90VGFibGUKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIGVTaG93RGF0YUFzCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhlIGZpZWxkIGlzIHNob3duIGFzIHRoZSAiZGlmZmVyZW5jZSBmcm9tIiBhIHZhbHVlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBEaWZmZXJlbmNlLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhlIGZpZWxkIGlzIHNob3duIGFzIHRoZSAiaW5kZXguCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEluZGV4LCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlIGZpZWxkIGlzIHNob3duIGFzIGl0cyBub3JtYWwgZGF0YXR5cGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIE5vcm1hbCwgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIC9JbmRpY2F0ZXMgdGhlIGZpZWxkIGlzIHNob3cgYXMgdGhlICJwZXJjZW50YWdlIG9mIiBhIHZhbHVlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFBlcmNlbnQsIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJbmRpY2F0ZXMgdGhlIGZpZWxkIGlzIHNob3duIGFzIHRoZSAicGVyY2VudGFnZSBkaWZmZXJlbmNlIGZyb20iIGEgdmFsdWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFBlcmNlbnREaWZmLCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5kaWNhdGVzIHRoZSBmaWVsZCBpcyBzaG93biBhcyB0aGUgcGVyY2VudGFnZSBvZiBjb2x1bW4uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFBlcmNlbnRPZkNvbCwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5kaWNhdGVzIHRoZSBmaWVsZCBpcyBzaG93biBhcyB0aGUgcGVyY2VudGFnZSBvZiByb3cKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgUGVyY2VudE9mUm93LCAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5kaWNhdGVzIHRoZSBmaWVsZCBpcyBzaG93biBhcyBwZXJjZW50YWdlIG9mIHRvdGFsLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBQZXJjZW50T2ZUb3RhbCwgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluZGljYXRlcyB0aGUgZmllbGQgaXMgc2hvd24gYXMgcnVubmluZyB0b3RhbCBpbiB0aGUgdGFibGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFJ1blRvdGFsLCAgICAgICAgCisgICAgc2V0IHsKKyAgICAgIGlmICh2YWx1ZSA9PSBlU29ydFR5cGUuTm9uZSkgeworICAgICAgICBEZWxldGVOb2RlKCJAc29ydFR5cGUiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBzb3J0VHlwZSIsIHZhbHVlLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgICAgICB9CiAgICAgfQotICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAvLy8gQnVpbHQtaW4gc3VidG90YWwgZnVuY3Rpb25zCi0gICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgW0ZsYWdzXSAKLSAgICBwdWJsaWMgZW51bSBlU3ViVG90YWxGdW5jdGlvbnMgCi0gICAgIHsKLSAgICAgICAgIE5vbmU9MSwKLSAgICAgICAgIENvdW50PTIsIAotICAgICAgICAgQ291bnRBPTQsIAotICAgICAgICAgQXZnPTgsIAotICAgICAgICAgRGVmYXVsdD0xNiwgCi0gICAgICAgICBNaW49MzIsIAotICAgICAgICAgTWF4PTY0LCAKLSAgICAgICAgIFByb2R1Y3Q9MTI4LCAKLSAgICAgICAgIFN0ZERldj0yNTYsIAotICAgICAgICAgU3RkRGV2UD01MTIsIAotICAgICAgICAgU3VtPTEwMjQsIAotICAgICAgICAgVmFyPTIwNDgsIAotICAgICAgICAgVmFyUD00MDk2Ci0gICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIERhdGEgZ3JvdXBpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIFtGbGFnc10KLSAgICBwdWJsaWMgZW51bSBlRGF0ZUdyb3VwQnkKLSAgICB7Ci0gICAgICAgIFllYXJzID0gMSwKLSAgICAgICAgUXVhcnRlcnMgPSAyLAotICAgICAgICBNb250aHMgPSA0LAotICAgICAgICBEYXlzID0gOCwKLSAgICAgICAgSG91cnMgPSAxNiwKLSAgICAgICAgTWludXRlcyA9IDMyLAotICAgICAgICBTZWNvbmRzID0gNjQKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIG1hbnVhbCBmaWx0ZXIgaXMgaW4gaW5jbHVzaXZlIG1vZGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgSW5jbHVkZU5ld0l0ZW1zSW5GaWx0ZXIgeworICAgIGdldCA9PiBHZXRYbWxOb2RlQm9vbCgiQGluY2x1ZGVOZXdJdGVtc0luRmlsdGVyIik7CisgICAgc2V0ID0+IFNldFhtbE5vZGVCb29sKCJAaW5jbHVkZU5ld0l0ZW1zSW5GaWx0ZXIiLCB2YWx1ZSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBFbnVtZXJhdGlvbiBvZiB0aGUgZGlmZmVyZW50IHN1YnRvdGFsIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBwYWdlLCByb3cgb3IgY29sdW1uIGZpZWxkcworICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZVN1YlRvdGFsRnVuY3Rpb25zIFN1YlRvdGFsRnVuY3Rpb25zIHsKKyAgICBnZXQgeworICAgICAgZVN1YlRvdGFsRnVuY3Rpb25zIHJldCA9IDA7CisgICAgICBYbWxOb2RlTGlzdCBubCA9IFRvcE5vZGUuU2VsZWN0Tm9kZXMoImQ6aXRlbXMvZDppdGVtL0B0IiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICBpZiAobmwuQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm4gZVN1YlRvdGFsRnVuY3Rpb25zLk5vbmU7CisgICAgICB9CisgICAgICBmb3JlYWNoIChYbWxBdHRyaWJ1dGUgaXRlbSBpbiBubCkgeworICAgICAgICB0cnkgeworICAgICAgICAgIHJldCB8PSAoZVN1YlRvdGFsRnVuY3Rpb25zKUVudW0uUGFyc2UodHlwZW9mKGVTdWJUb3RhbEZ1bmN0aW9ucyksIGl0ZW0uVmFsdWUsIHRydWUpOworICAgICAgICB9IGNhdGNoIChBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgIlVuYWJsZSB0byBwYXJzZSB2YWx1ZSBvZiAiCisgICAgICAgICAgICAgICAgICArIGl0ZW0uVmFsdWUKKyAgICAgICAgICAgICAgICAgICsgIiB0byBhIHZhbGlkIHBpdm90IHRhYmxlIHN1YnRvdGFsIGZ1bmN0aW9uIiwKKyAgICAgICAgICAgICAgZXgpOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gcmV0OwogICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFNvcnRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIGVTb3J0VHlwZQotICAgIHsKLSAgICAgICAgTm9uZSwKLSAgICAgICAgQXNjZW5kaW5nLAotICAgICAgICBEZXNjZW5kaW5nCisgICAgc2V0IHsKKyAgICAgIGlmICgodmFsdWUgJiBlU3ViVG90YWxGdW5jdGlvbnMuTm9uZSkgPT0gZVN1YlRvdGFsRnVuY3Rpb25zLk5vbmUKKyAgICAgICAgICAmJiAodmFsdWUgIT0gZVN1YlRvdGFsRnVuY3Rpb25zLk5vbmUpKSB7CisgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIlZhbHVlIE5vbmUgY2FuIG5vdCBiZSBjb21iaW5lZCB3aXRoIG90aGVyIHZhbHVlcy4iKSk7CisgICAgICB9CisgICAgICBpZiAoKHZhbHVlICYgZVN1YlRvdGFsRnVuY3Rpb25zLkRlZmF1bHQpID09IGVTdWJUb3RhbEZ1bmN0aW9ucy5EZWZhdWx0CisgICAgICAgICAgJiYgKHZhbHVlICE9IGVTdWJUb3RhbEZ1bmN0aW9ucy5EZWZhdWx0KSkgeworICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSBEZWZhdWx0IGNhbiBub3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciB2YWx1ZXMuIikpOworICAgICAgfQorCisgICAgICAvLyByZW1vdmUgb2xkIGF0dHJpYnV0ZQorICAgICAgWG1sTm9kZUxpc3QgbmwgPSBUb3BOb2RlLlNlbGVjdE5vZGVzKCJkOml0ZW1zL2Q6aXRlbS9AdCIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgaWYgKG5sLkNvdW50ID4gMCkgeworICAgICAgICBmb3JlYWNoIChYbWxBdHRyaWJ1dGUgaXRlbSBpbiBubCkgeworICAgICAgICAgIERlbGV0ZU5vZGUoIkAiICsgaXRlbS5WYWx1ZSArICJTdWJ0b3RhbCIpOworICAgICAgICAgIGl0ZW0uT3duZXJFbGVtZW50LlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQoaXRlbS5Pd25lckVsZW1lbnQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICh2YWx1ZSA9PSBlU3ViVG90YWxGdW5jdGlvbnMuTm9uZSkgeworICAgICAgICAvLyBmb3Igbm8gc3VidG90YWxzLCBzZXQgZGVmYXVsdFN1YnRvdGFsIHRvIG9mZgorICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGRlZmF1bHRTdWJ0b3RhbCIsIGZhbHNlKTsKKyAgICAgICAgVG9wTm9kZS5Jbm5lclhtbCA9ICIiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyaW5nIGlubmVyWG1sID0gIiI7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGZvcmVhY2ggKGVTdWJUb3RhbEZ1bmN0aW9ucyBlIGluIEVudW0uR2V0VmFsdWVzKHR5cGVvZihlU3ViVG90YWxGdW5jdGlvbnMpKSkgeworICAgICAgICAgIGlmICgodmFsdWUgJiBlKSA9PSBlKSB7CisgICAgICAgICAgICB2YXIgbmV3VG90YWxUeXBlID0gZS5Ub1N0cmluZygpOworICAgICAgICAgICAgdmFyIHRvdGFsVHlwZSA9CisgICAgICAgICAgICAgICAgY2hhci5Ub0xvd2VyKG5ld1RvdGFsVHlwZVswXSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkKKyAgICAgICAgICAgICAgICAgICAgKyBuZXdUb3RhbFR5cGUuU3Vic3RyaW5nKDEpOworICAgICAgICAgICAgLy8gYWRkIG5ldyBhdHRyaWJ1dGUKKyAgICAgICAgICAgIFNldFhtbE5vZGVCb29sKCJAIiArIHRvdGFsVHlwZSArICJTdWJ0b3RhbCIsIHRydWUpOworICAgICAgICAgICAgaW5uZXJYbWwgKz0gIjxpdGVtIHQ9XCIiICsgdG90YWxUeXBlICsgIlwiIC8+IjsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIFRvcE5vZGUuSW5uZXJYbWwgPSBzdHJpbmcuRm9ybWF0KCI8aXRlbXMgY291bnQ9XCJ7MH1cIj57MX08L2l0ZW1zPiIsIGNvdW50LCBpbm5lclhtbCk7CisgICAgICB9CiAgICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQSBwaXZvdCB0YWJsZSBmaWVsZC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFBpdm90VGFibGVGaWVsZCA6IFhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlIF90YWJsZTsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlRmllbGQoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlLEV4Y2VsUGl2b3RUYWJsZSB0YWJsZSwgaW50IGluZGV4LCBpbnQgYmFzZUluZGV4KSA6Ci0gICAgICAgICAgICBiYXNlKG5zLCB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICBJbmRleCA9IGluZGV4OwotICAgICAgICAgICAgQmFzZUluZGV4ID0gYmFzZUluZGV4OwotICAgICAgICAgICAgX3RhYmxlID0gdGFibGU7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGludCBJbmRleAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgaW50IEJhc2VJbmRleAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTmFtZSBvZiB0aGUgZmllbGQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIAotICAgICAgICB7IAotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIHYgPSBHZXRYbWxOb2RlU3RyaW5nKCJAbmFtZSIpOwotICAgICAgICAgICAgICAgIGlmICh2ID09ICIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jYWNoZUZpZWxkSGVscGVyLkdldFhtbE5vZGVTdHJpbmcoIkBuYW1lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBuYW1lIiwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbXBhY3QgbW9kZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBDb21wYWN0Ci0gICAgICAgIHsgCi0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBjb21wYWN0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGNvbXBhY3QiLHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgaXRlbXMgaW4gdGhpcyBmaWVsZCBzaG91bGQgYmUgc2hvd24gaW4gT3V0bGluZSBmb3JtCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIE91dGxpbmUgCi0gICAgICAgIHsgCi0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBvdXRsaW5lIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQG91dGxpbmUiLHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgY3VzdG9tIHRleHQgdGhhdCBpcyBkaXNwbGF5ZWQgZm9yIHRoZSBzdWJ0b3RhbHMgbGFiZWwKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgU3VidG90YWxUb3AgCi0gICAgICAgIHsgCi0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBzdWJ0b3RhbFRvcCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkBzdWJ0b3RhbFRvcCIsdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRvIHNob3cgYWxsIGl0ZW1zIGZvciB0aGlzIGZpZWxkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIFNob3dBbGwgCi0gICAgICAgIHsgCi0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBzaG93QWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQHNob3dBbGwiLHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgdHlwZSBvZiBzb3J0IHRoYXQgaXMgYXBwbGllZCB0byB0aGlzIGZpZWxkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlU29ydFR5cGUgU29ydAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgdiA9IEdldFhtbE5vZGVTdHJpbmcoIkBzb3J0VHlwZSIpOwotICAgICAgICAgICAgICAgIHJldHVybiB2ID09ICIiID8gZVNvcnRUeXBlLk5vbmUgOiAoZVNvcnRUeXBlKUVudW0uUGFyc2UodHlwZW9mKGVTb3J0VHlwZSksIHYsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IGVTb3J0VHlwZS5Ob25lKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZSgiQHNvcnRUeXBlIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBzb3J0VHlwZSIsIHZhbHVlLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgYm9vbGVhbiB0aGF0IGluZGljYXRlcyB3aGV0aGVyIG1hbnVhbCBmaWx0ZXIgaXMgaW4gaW5jbHVzaXZlIG1vZGUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgSW5jbHVkZU5ld0l0ZW1zSW5GaWx0ZXIKLSAgICAgICAgeyAKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlQm9vbCgiQGluY2x1ZGVOZXdJdGVtc0luRmlsdGVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGluY2x1ZGVOZXdJdGVtc0luRmlsdGVyIix2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgIC8vLyBFbnVtZXJhdGlvbiBvZiB0aGUgZGlmZmVyZW50IHN1YnRvdGFsIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBwYWdlLCByb3cgb3IgY29sdW1uIGZpZWxkcwotICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgIHB1YmxpYyBlU3ViVG90YWxGdW5jdGlvbnMgU3ViVG90YWxGdW5jdGlvbnMKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVTdWJUb3RhbEZ1bmN0aW9ucyByZXQgPSAwOwotICAgICAgICAgICAgICAgIFhtbE5vZGVMaXN0IG5sID0gVG9wTm9kZS5TZWxlY3ROb2RlcygiZDppdGVtcy9kOml0ZW0vQHQiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICBpZiAobmwuQ291bnQgPT0gMCkgcmV0dXJuIGVTdWJUb3RhbEZ1bmN0aW9ucy5Ob25lOwotICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhtbEF0dHJpYnV0ZSBpdGVtIGluIG5sKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCB8PSAoZVN1YlRvdGFsRnVuY3Rpb25zKUVudW0uUGFyc2UodHlwZW9mKGVTdWJUb3RhbEZ1bmN0aW9ucyksIGl0ZW0uVmFsdWUsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhdGNoIChBcmd1bWVudEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJVbmFibGUgdG8gcGFyc2UgdmFsdWUgb2YgIiArIGl0ZW0uVmFsdWUgKyAiIHRvIGEgdmFsaWQgcGl2b3QgdGFibGUgc3VidG90YWwgZnVuY3Rpb24iLCBleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBpZiAoKHZhbHVlICYgZVN1YlRvdGFsRnVuY3Rpb25zLk5vbmUpID09IGVTdWJUb3RhbEZ1bmN0aW9ucy5Ob25lICYmICh2YWx1ZSAhPSBlU3ViVG90YWxGdW5jdGlvbnMuTm9uZSkpCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIlZhbHVlIE5vbmUgY2FuIG5vdCBiZSBjb21iaW5lZCB3aXRoIG90aGVyIHZhbHVlcy4iKSk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSAmIGVTdWJUb3RhbEZ1bmN0aW9ucy5EZWZhdWx0KSA9PSBlU3ViVG90YWxGdW5jdGlvbnMuRGVmYXVsdCAmJiAodmFsdWUgIT0gZVN1YlRvdGFsRnVuY3Rpb25zLkRlZmF1bHQpKQotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJWYWx1ZSBEZWZhdWx0IGNhbiBub3QgYmUgY29tYmluZWQgd2l0aCBvdGhlciB2YWx1ZXMuIikpOwotICAgICAgICAgICAgICAgICB9CisgIH0KIAorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUeXBlIG9mIGF4aXMKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGVQaXZvdEZpZWxkQXhpcyBBeGlzIHsKKyAgICBnZXQgeworICAgICAgc3dpdGNoIChHZXRYbWxOb2RlU3RyaW5nKCJAYXhpcyIpKSB7CisgICAgICAgIGNhc2UgImF4aXNSb3ciOgorICAgICAgICAgIHJldHVybiBlUGl2b3RGaWVsZEF4aXMuUm93OworICAgICAgICBjYXNlICJheGlzQ29sIjoKKyAgICAgICAgICByZXR1cm4gZVBpdm90RmllbGRBeGlzLkNvbHVtbjsKKyAgICAgICAgY2FzZSAiYXhpc1BhZ2UiOgorICAgICAgICAgIHJldHVybiBlUGl2b3RGaWVsZEF4aXMuUGFnZTsKKyAgICAgICAgY2FzZSAiYXhpc1ZhbHVlcyI6CisgICAgICAgICAgcmV0dXJuIGVQaXZvdEZpZWxkQXhpcy5WYWx1ZXM7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIGVQaXZvdEZpZWxkQXhpcy5Ob25lOworICAgICAgfQorICAgIH0KKyAgICBpbnRlcm5hbCBzZXQgeworICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICBjYXNlIGVQaXZvdEZpZWxkQXhpcy5Sb3c6CisgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGF4aXMiLCAiYXhpc1JvdyIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVQaXZvdEZpZWxkQXhpcy5Db2x1bW46CisgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGF4aXMiLCAiYXhpc0NvbCIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVQaXZvdEZpZWxkQXhpcy5WYWx1ZXM6CisgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGF4aXMiLCAiYXhpc1ZhbHVlcyIpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGVQaXZvdEZpZWxkQXhpcy5QYWdlOgorICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBheGlzIiwgImF4aXNQYWdlIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgRGVsZXRlTm9kZSgiQGF4aXMiKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KIAotICAgICAgICAgICAgICAgICAvLyByZW1vdmUgb2xkIGF0dHJpYnV0ZSAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIFhtbE5vZGVMaXN0IG5sID0gVG9wTm9kZS5TZWxlY3ROb2RlcygiZDppdGVtcy9kOml0ZW0vQHQiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgaWYgKG5sLkNvdW50ID4gMCkKLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoWG1sQXR0cmlidXRlIGl0ZW0gaW4gbmwpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZSgiQCIgKyBpdGVtLlZhbHVlICsgIlN1YnRvdGFsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5Pd25lckVsZW1lbnQuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChpdGVtLk93bmVyRWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgCi0gCi0gICAgICAgICAgICAgICAgIGlmICh2YWx1ZT09ZVN1YlRvdGFsRnVuY3Rpb25zLk5vbmUpCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBubyBzdWJ0b3RhbHMsIHNldCBkZWZhdWx0U3VidG90YWwgdG8gb2ZmCi0gICAgICAgICAgICAgICAgICAgICBTZXRYbWxOb2RlQm9vbCgiQGRlZmF1bHRTdWJ0b3RhbCIsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgIFRvcE5vZGUuSW5uZXJYbWwgPSAiIjsKLSAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBpbm5lclhtbCA9ICIiOwotICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKGVTdWJUb3RhbEZ1bmN0aW9ucyBlIGluIEVudW0uR2V0VmFsdWVzKHR5cGVvZihlU3ViVG90YWxGdW5jdGlvbnMpKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZSAmIGUpID09IGUpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5ld1RvdGFsVHlwZSA9IGUuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG90YWxUeXBlID0gY2hhci5Ub0xvd2VyKG5ld1RvdGFsVHlwZVswXSwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkgKyBuZXdUb3RhbFR5cGUuU3Vic3RyaW5nKDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBuZXcgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZUJvb2woIkAiICsgdG90YWxUeXBlICsgIlN1YnRvdGFsIiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJYbWwgKz0gIjxpdGVtIHQ9XCIiICsgdG90YWxUeXBlICsgIlwiIC8+IjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFRvcE5vZGUuSW5uZXJYbWwgPSBzdHJpbmcuRm9ybWF0KCI8aXRlbXMgY291bnQ9XCJ7MH1cIj57MX08L2l0ZW1zPiIsIGNvdW50LCBpbm5lclhtbCk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFR5cGUgb2YgYXhpcwotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZVBpdm90RmllbGRBeGlzIEF4aXMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKEdldFhtbE5vZGVTdHJpbmcoIkBheGlzIikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlICJheGlzUm93IjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlUGl2b3RGaWVsZEF4aXMuUm93OwotICAgICAgICAgICAgICAgICAgICBjYXNlICJheGlzQ29sIjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlUGl2b3RGaWVsZEF4aXMuQ29sdW1uOwotICAgICAgICAgICAgICAgICAgICBjYXNlICJheGlzUGFnZSI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVBpdm90RmllbGRBeGlzLlBhZ2U7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgImF4aXNWYWx1ZXMiOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVQaXZvdEZpZWxkQXhpcy5WYWx1ZXM7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZVBpdm90RmllbGRBeGlzLk5vbmU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWwgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZVBpdm90RmllbGRBeGlzLlJvdzoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBheGlzIiwiYXhpc1JvdyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZVBpdm90RmllbGRBeGlzLkNvbHVtbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBheGlzIiwiYXhpc0NvbCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZVBpdm90RmllbGRBeGlzLlZhbHVlczoKLSAgICAgICAgICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBheGlzIiwgImF4aXNWYWx1ZXMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGVQaXZvdEZpZWxkQXhpcy5QYWdlOgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGF4aXMiLCAiYXhpc1BhZ2UiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgRGVsZXRlTm9kZSgiQGF4aXMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBmaWVsZCBpcyBhIHJvdyBmaWVsZAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBJc1Jvd0ZpZWxkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKHN0cmluZy5Gb3JtYXQoIi4uLy4uL2Q6cm93RmllbGRzL2Q6ZmllbGRbQHg9ezB9XSIsIEluZGV4KSwgTmFtZVNwYWNlTWFuYWdlcikgIT0gbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnRlcm5hbCBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB2YXIgcm93c05vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoIi4uLy4uL2Q6cm93RmllbGRzIiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyb3dzTm9kZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfdGFibGUuQ3JlYXRlTm9kZSgiZDpyb3dGaWVsZHMiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByb3dzTm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi4vLi4vZDpyb3dGaWVsZHMiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLQotICAgICAgICAgICAgICAgICAgICBBcHBlbmRGaWVsZChyb3dzTm9kZSwgSW5kZXgsICJmaWVsZCIsICJ4Iik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChCYXNlSW5kZXggPT0gSW5kZXgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvcE5vZGUuSW5uZXJYbWwgPSAiPGl0ZW1zIGNvdW50PVwiMVwiPjxpdGVtIHQ9XCJkZWZhdWx0XCIgLz48L2l0ZW1zPiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBUb3BOb2RlLklubmVyWG1sID0gIjxpdGVtcyBjb3VudD1cIjBcIj48L2l0ZW1zPiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBub2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKHN0cmluZy5Gb3JtYXQoIi4uLy4uL2Q6cm93RmllbGRzL2Q6ZmllbGRbQHg9ezB9XSIsIEluZGV4KSwgTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKG5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhlIGZpZWxkIGlzIGEgcm93IGZpZWxkCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBib29sIElzUm93RmllbGQgeworICAgIGdldCA9PgorICAgICAgKFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgKKyAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgiLi4vLi4vZDpyb3dGaWVsZHMvZDpmaWVsZFtAeD17MH1dIiwgSW5kZXgpLAorICAgICAgICAgICAgICBOYW1lU3BhY2VNYW5hZ2VyKSAhPSBudWxsKTsKKyAgICBpbnRlcm5hbCBzZXQgeworICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgIHZhciByb3dzTm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi4vLi4vZDpyb3dGaWVsZHMiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgICAgaWYgKHJvd3NOb2RlID09IG51bGwpIHsKKyAgICAgICAgICBfdGFibGUuQ3JlYXRlTm9kZSgiZDpyb3dGaWVsZHMiKTsKICAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB0aGUgZmllbGQgaXMgYSBjb2x1bW4gZmllbGQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgSXNDb2x1bW5GaWVsZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZShzdHJpbmcuRm9ybWF0KCIuLi8uLi9kOmNvbEZpZWxkcy9kOmZpZWxkW0B4PXswfV0iLCBJbmRleCksIE5hbWVTcGFjZU1hbmFnZXIpICE9IG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWwgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGNvbHVtbnNOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCIuLi8uLi9kOmNvbEZpZWxkcyIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY29sdW1uc05vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgX3RhYmxlLkNyZWF0ZU5vZGUoImQ6Y29sRmllbGRzIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY29sdW1uc05vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoIi4uLy4uL2Q6Y29sRmllbGRzIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgIHJvd3NOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCIuLi8uLi9kOnJvd0ZpZWxkcyIsIE5hbWVTcGFjZU1hbmFnZXIpOwogCi0gICAgICAgICAgICAgICAgICAgIEFwcGVuZEZpZWxkKGNvbHVtbnNOb2RlLCBJbmRleCwgImZpZWxkIiwgIngiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKEJhc2VJbmRleCA9PSBJbmRleCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgVG9wTm9kZS5Jbm5lclhtbCA9ICI8aXRlbXMgY291bnQ9XCIxXCI+PGl0ZW0gdD1cImRlZmF1bHRcIiAvPjwvaXRlbXM+IjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRvcE5vZGUuSW5uZXJYbWwgPSAiPGl0ZW1zIGNvdW50PVwiMFwiPjwvaXRlbXM+IjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBYbWxFbGVtZW50IG5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiLi4vLi4vZDpjb2xGaWVsZHMvZDpmaWVsZFtAeD17MH1dIiwgSW5kZXgpLCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2RlLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQobm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CisgICAgICAgIEFwcGVuZEZpZWxkKHJvd3NOb2RlLCBJbmRleCwgImZpZWxkIiwgIngiKTsKKyAgICAgICAgaWYgKEJhc2VJbmRleCA9PSBJbmRleCkgeworICAgICAgICAgIFRvcE5vZGUuSW5uZXJYbWwgPSAiPGl0ZW1zIGNvdW50PVwiMVwiPjxpdGVtIHQ9XCJkZWZhdWx0XCIgLz48L2l0ZW1zPiI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgVG9wTm9kZS5Jbm5lclhtbCA9ICI8aXRlbXMgY291bnQ9XCIwXCI+PC9pdGVtcz4iOwogICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBmaWVsZCBpcyBhIGRhdGFmaWVsZAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBJc0RhdGFGaWVsZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2woIkBkYXRhRmllbGQiLCBmYWxzZSk7Ci0gICAgICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBYbWxFbGVtZW50IG5vZGUgPQorICAgICAgICAgICAgVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKAorICAgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoIi4uLy4uL2Q6cm93RmllbGRzL2Q6ZmllbGRbQHg9ezB9XSIsIEluZGV4KSwKKyAgICAgICAgICAgICAgICBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgbm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKG5vZGUpOwogICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElmIHRoZSBmaWVsZCBpcyBhIHBhZ2UgZmllbGQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIElzUGFnZUZpZWxkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoQXhpcz09ZVBpdm90RmllbGRBeGlzLlBhZ2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJuYWwgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGFGaWVsZHNOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCIuLi8uLi9kOnBhZ2VGaWVsZHMiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFGaWVsZHNOb2RlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF90YWJsZS5DcmVhdGVOb2RlKCJkOnBhZ2VGaWVsZHMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFGaWVsZHNOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCIuLi8uLi9kOnBhZ2VGaWVsZHMiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQogCi0gICAgICAgICAgICAgICAgICAgIFRvcE5vZGUuSW5uZXJYbWwgPSAiPGl0ZW1zIGNvdW50PVwiMVwiPjxpdGVtIHQ9XCJkZWZhdWx0XCIgLz48L2l0ZW1zPiI7Ci0KLSAgICAgICAgICAgICAgICAgICAgWG1sRWxlbWVudCBub2RlID0gQXBwZW5kRmllbGQoZGF0YUZpZWxkc05vZGUsIEluZGV4LCAicGFnZUZpZWxkIiwgImZsZCIpOwotICAgICAgICAgICAgICAgICAgICBfcGFnZUZpZWxkU2V0dGluZ3MgPSBuZXcgRXhjZWxQaXZvdFRhYmxlUGFnZUZpZWxkU2V0dGluZ3MoTmFtZVNwYWNlTWFuYWdlciwgbm9kZSwgdGhpcywgSW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfcGFnZUZpZWxkU2V0dGluZ3MgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBYbWxFbGVtZW50IG5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoc3RyaW5nLkZvcm1hdCgiLi4vLi4vZDpwYWdlRmllbGRzL2Q6cGFnZUZpZWxkW0BmbGQ9ezB9XSIsIEluZGV4KSwgTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKG5vZGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgZmllbGQgaXMgYSBjb2x1bW4gZmllbGQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgSXNDb2x1bW5GaWVsZCB7CisgICAgZ2V0ID0+CisgICAgICAoVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKAorICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KCIuLi8uLi9kOmNvbEZpZWxkcy9kOmZpZWxkW0B4PXswfV0iLCBJbmRleCksCisgICAgICAgICAgICAgIE5hbWVTcGFjZU1hbmFnZXIpICE9IG51bGwpOworICAgIGludGVybmFsIHNldCB7CisgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgdmFyIGNvbHVtbnNOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCIuLi8uLi9kOmNvbEZpZWxkcyIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICBpZiAoY29sdW1uc05vZGUgPT0gbnVsbCkgeworICAgICAgICAgIF90YWJsZS5DcmVhdGVOb2RlKCJkOmNvbEZpZWxkcyIpOwogICAgICAgICB9Ci0gICAgICAgIC8vcHVibGljIEV4Y2VsUGl2b3RHcm91cGluZyBEYXRlR3JvdXBpbmcKKyAgICAgICAgY29sdW1uc05vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoIi4uLy4uL2Q6Y29sRmllbGRzIiwgTmFtZVNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgQXBwZW5kRmllbGQoY29sdW1uc05vZGUsIEluZGV4LCAiZmllbGQiLCAieCIpOworICAgICAgICBpZiAoQmFzZUluZGV4ID09IEluZGV4KSB7CisgICAgICAgICAgVG9wTm9kZS5Jbm5lclhtbCA9ICI8aXRlbXMgY291bnQ9XCIxXCI+PGl0ZW0gdD1cImRlZmF1bHRcIiAvPjwvaXRlbXM+IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBUb3BOb2RlLklubmVyWG1sID0gIjxpdGVtcyBjb3VudD1cIjBcIj48L2l0ZW1zPiI7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFhtbEVsZW1lbnQgbm9kZSA9CisgICAgICAgICAgICBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoCisgICAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgiLi4vLi4vZDpjb2xGaWVsZHMvZDpmaWVsZFtAeD17MH1dIiwgSW5kZXgpLAorICAgICAgICAgICAgICAgIE5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7CisgICAgICAgIGlmIChub2RlICE9IG51bGwpIHsKKyAgICAgICAgICBub2RlLlBhcmVudE5vZGUuUmVtb3ZlQ2hpbGQobm9kZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJZiB0aGUgZmllbGQgaXMgYSBkYXRhZmllbGQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgSXNEYXRhRmllbGQgPT4gR2V0WG1sTm9kZUJvb2woIkBkYXRhRmllbGQiLCBmYWxzZSk7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSWYgdGhlIGZpZWxkIGlzIGEgcGFnZSBmaWVsZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgSXNQYWdlRmllbGQgeworICAgIGdldCA9PiAoQXhpcyA9PSBlUGl2b3RGaWVsZEF4aXMuUGFnZSk7CisgICAgaW50ZXJuYWwgc2V0IHsKKyAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICB2YXIgZGF0YUZpZWxkc05vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoIi4uLy4uL2Q6cGFnZUZpZWxkcyIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgICBpZiAoZGF0YUZpZWxkc05vZGUgPT0gbnVsbCkgeworICAgICAgICAgIF90YWJsZS5DcmVhdGVOb2RlKCJkOnBhZ2VGaWVsZHMiKTsKKyAgICAgICAgICBkYXRhRmllbGRzTm9kZSA9IFRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi4vLi4vZDpwYWdlRmllbGRzIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICAgIH0KKworICAgICAgICBUb3BOb2RlLklubmVyWG1sID0gIjxpdGVtcyBjb3VudD1cIjFcIj48aXRlbSB0PVwiZGVmYXVsdFwiIC8+PC9pdGVtcz4iOworCisgICAgICAgIFhtbEVsZW1lbnQgbm9kZSA9IEFwcGVuZEZpZWxkKGRhdGFGaWVsZHNOb2RlLCBJbmRleCwgInBhZ2VGaWVsZCIsICJmbGQiKTsKKyAgICAgICAgX3BhZ2VGaWVsZFNldHRpbmdzID0gbmV3KE5hbWVTcGFjZU1hbmFnZXIsIG5vZGUsIHRoaXMsIEluZGV4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIF9wYWdlRmllbGRTZXR0aW5ncyA9IG51bGw7CisgICAgICAgIFhtbEVsZW1lbnQgbm9kZSA9CisgICAgICAgICAgICBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoCisgICAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdCgiLi4vLi4vZDpwYWdlRmllbGRzL2Q6cGFnZUZpZWxkW0BmbGQ9ezB9XSIsIEluZGV4KSwKKyAgICAgICAgICAgICAgICBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OworICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgbm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKG5vZGUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy9wdWJsaWMgRXhjZWxQaXZvdEdyb3VwaW5nIERhdGVHcm91cGluZworICAvL3sKKworICAvL30KKyAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlUGFnZUZpZWxkU2V0dGluZ3MgX3BhZ2VGaWVsZFNldHRpbmdzOworCisgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVQYWdlRmllbGRTZXR0aW5ncyBQYWdlRmllbGRTZXR0aW5ncyA9PiBfcGFnZUZpZWxkU2V0dGluZ3M7CisKKyAgaW50ZXJuYWwgZURhdGVHcm91cEJ5IERhdGVHcm91cGluZyB7IGdldDsgc2V0OyB9CisKKyAgcHJpdmF0ZSBFeGNlbFBpdm90VGFibGVGaWVsZEdyb3VwIF9ncm91cGluZzsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBHcm91cGluZyBzZXR0aW5ncy4KKyAgLy8vIE51bGwgaWYgdGhlIGZpZWxkIGhhcyBubyBncm91cGluZyBvdGhlcndpc2UgRXhjZWxQaXZvdFRhYmxlRmllbGROdW1lcmljR3JvdXAgb3IgRXhjZWxQaXZvdFRhYmxlRmllbGROdW1lcmljR3JvdXAuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVGaWVsZEdyb3VwIEdyb3VwaW5nID0+IF9ncm91cGluZzsKKworICBpbnRlcm5hbCBYbWxFbGVtZW50IEFwcGVuZEZpZWxkKAorICAgICAgWG1sTm9kZSByb3dzTm9kZSwKKyAgICAgIGludCBpbmRleCwKKyAgICAgIHN0cmluZyBmaWVsZE5vZGVUZXh0LAorICAgICAgc3RyaW5nIGluZGV4QXR0clRleHQpIHsKKyAgICBYbWxFbGVtZW50IHByZXZGaWVsZCA9IG51bGwsCisgICAgICAgIG5ld0VsZW1lbnQ7CisgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBmaWVsZCBpbiByb3dzTm9kZS5DaGlsZE5vZGVzKSB7CisgICAgICBzdHJpbmcgeCA9IGZpZWxkLkdldEF0dHJpYnV0ZShpbmRleEF0dHJUZXh0KTsKKyAgICAgIGludCBmaWVsZEluZGV4OworICAgICAgaWYgKGludC5UcnlQYXJzZSh4LCBvdXQgZmllbGRJbmRleCkpIHsKKyAgICAgICAgaWYgKGZpZWxkSW5kZXgKKyAgICAgICAgICAgID09IGluZGV4KSAvL1JvdyBhbHJlYWR5IGV4aXN0cworICAgICAgICB7CisgICAgICAgICAgcmV0dXJuIGZpZWxkOworICAgICAgICB9CisgICAgICAgIC8vZWxzZSBpZiAoZmllbGRJbmRleCA+IGluZGV4KQogICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgbmV3RWxlbWVudCA9IHJvd3NOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChmaWVsZE5vZGVUZXh0LCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7CisgICAgICAgIC8vICAgIG5ld0VsZW1lbnQuU2V0QXR0cmlidXRlKGluZGV4QXR0clRleHQsIGluZGV4LlRvU3RyaW5nKCkpOworICAgICAgICAvLyAgICByb3dzTm9kZS5JbnNlcnRBZnRlcihuZXdFbGVtZW50LCBmaWVsZCk7CisgICAgICAgIC8vfQorICAgICAgfQorICAgICAgcHJldkZpZWxkID0gZmllbGQ7CisgICAgfQorICAgIG5ld0VsZW1lbnQgPSByb3dzTm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoZmllbGROb2RlVGV4dCwgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKTsKKyAgICBuZXdFbGVtZW50LlNldEF0dHJpYnV0ZShpbmRleEF0dHJUZXh0LCBpbmRleC5Ub1N0cmluZygpKTsKKyAgICByb3dzTm9kZS5JbnNlcnRBZnRlcihuZXdFbGVtZW50LCBwcmV2RmllbGQpOworCisgICAgcmV0dXJuIG5ld0VsZW1lbnQ7CisgIH0KKworICBpbnRlcm5hbCBYbWxIZWxwZXJJbnN0YW5jZSBfY2FjaGVGaWVsZEhlbHBlcjsKKworICBpbnRlcm5hbCB2b2lkIFNldENhY2hlRmllbGROb2RlKFhtbE5vZGUgY2FjaGVGaWVsZCkgeworICAgIF9jYWNoZUZpZWxkSGVscGVyID0gbmV3KE5hbWVTcGFjZU1hbmFnZXIsIGNhY2hlRmllbGQpOworICAgIHZhciBncm91cE5vZGUgPSBjYWNoZUZpZWxkLlNlbGVjdFNpbmdsZU5vZGUoImQ6ZmllbGRHcm91cCIsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgIGlmIChncm91cE5vZGUgIT0gbnVsbCkgeworICAgICAgdmFyIGdyb3VwQnkgPSBncm91cE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpyYW5nZVByL0Bncm91cEJ5IiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICBpZiAoZ3JvdXBCeSA9PSBudWxsKSB7CisgICAgICAgIF9ncm91cGluZyA9IG5ldyBFeGNlbFBpdm90VGFibGVGaWVsZE51bWVyaWNHcm91cChOYW1lU3BhY2VNYW5hZ2VyLCBjYWNoZUZpZWxkKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERhdGVHcm91cGluZyA9IChlRGF0ZUdyb3VwQnkpRW51bS5QYXJzZSh0eXBlb2YoZURhdGVHcm91cEJ5KSwgZ3JvdXBCeS5WYWx1ZSwgdHJ1ZSk7CisgICAgICAgIF9ncm91cGluZyA9IG5ldyBFeGNlbFBpdm90VGFibGVGaWVsZERhdGVHcm91cChOYW1lU3BhY2VNYW5hZ2VyLCBncm91cE5vZGUpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZUZpZWxkRGF0ZUdyb3VwIFNldERhdGVHcm91cCgKKyAgICAgIGVEYXRlR3JvdXBCeSBncm91cEJ5LAorICAgICAgRGF0ZVRpbWUgc3RhcnREYXRlLAorICAgICAgRGF0ZVRpbWUgZW5kRGF0ZSwKKyAgICAgIGludCBpbnRlcnZhbCkgeworICAgIEV4Y2VsUGl2b3RUYWJsZUZpZWxkRGF0ZUdyb3VwIGdyb3VwOworICAgIGdyb3VwID0gbmV3KE5hbWVTcGFjZU1hbmFnZXIsIF9jYWNoZUZpZWxkSGVscGVyLlRvcE5vZGUpOworICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVCb29sKCJkOnNoYXJlZEl0ZW1zL0Bjb250YWluc0RhdGUiLCB0cnVlKTsKKyAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlQm9vbCgiZDpzaGFyZWRJdGVtcy9AY29udGFpbnNOb25EYXRlIiwgZmFsc2UpOworICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVCb29sKCJkOnNoYXJlZEl0ZW1zL0Bjb250YWluc1NlbWlNaXhlZFR5cGVzIiwgZmFsc2UpOworCisgICAgZ3JvdXAuVG9wTm9kZS5Jbm5lclhtbCArPSBzdHJpbmcuRm9ybWF0KAorICAgICAgICAiPGZpZWxkR3JvdXAgYmFzZT1cInswfVwiPjxyYW5nZVByIGdyb3VwQnk9XCJ7MX1cIiAvPjxncm91cEl0ZW1zIC8+PC9maWVsZEdyb3VwPiIsCisgICAgICAgIEJhc2VJbmRleCwKKyAgICAgICAgZ3JvdXBCeS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworCisgICAgaWYgKHN0YXJ0RGF0ZS5ZZWFyIDwgMTkwMCkgeworICAgICAgX2NhY2hlRmllbGRIZWxwZXIuU2V0WG1sTm9kZVN0cmluZygKKyAgICAgICAgICAiZDpmaWVsZEdyb3VwL2Q6cmFuZ2VQci9Ac3RhcnREYXRlIiwKKyAgICAgICAgICAiMTkwMC0wMS0wMVQwMDowMDowMCIpOworICAgIH0gZWxzZSB7CisgICAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgICJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0BzdGFydERhdGUiLAorICAgICAgICAgIHN0YXJ0RGF0ZS5Ub1N0cmluZygicyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoImQ6ZmllbGRHcm91cC9kOnJhbmdlUHIvQGF1dG9TdGFydCIsICIwIik7CisgICAgfQorCisgICAgaWYgKGVuZERhdGUgPT0gRGF0ZVRpbWUuTWF4VmFsdWUpIHsKKyAgICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoImQ6ZmllbGRHcm91cC9kOnJhbmdlUHIvQGVuZERhdGUiLCAiOTk5OS0xMi0zMVQwMDowMDowMCIpOworICAgIH0gZWxzZSB7CisgICAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgICJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0BlbmREYXRlIiwKKyAgICAgICAgICBlbmREYXRlLlRvU3RyaW5nKCJzIiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgICAgX2NhY2hlRmllbGRIZWxwZXIuU2V0WG1sTm9kZVN0cmluZygiZDpmaWVsZEdyb3VwL2Q6cmFuZ2VQci9AYXV0b0VuZCIsICIwIik7CisgICAgfQorCisgICAgaW50IGl0ZW1zID0gQWRkRGF0ZUdyb3VwSXRlbXMoZ3JvdXAsIGdyb3VwQnksIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgaW50ZXJ2YWwpOworICAgIEFkZEZpZWxkSXRlbXMoaXRlbXMpOworCisgICAgX2dyb3VwaW5nID0gZ3JvdXA7CisgICAgcmV0dXJuIGdyb3VwOworICB9CisKKyAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlRmllbGROdW1lcmljR3JvdXAgU2V0TnVtZXJpY0dyb3VwKAorICAgICAgZG91YmxlIHN0YXJ0LAorICAgICAgZG91YmxlIGVuZCwKKyAgICAgIGRvdWJsZSBpbnRlcnZhbCkgeworICAgIEV4Y2VsUGl2b3RUYWJsZUZpZWxkTnVtZXJpY0dyb3VwIGdyb3VwOworICAgIGdyb3VwID0gbmV3KE5hbWVTcGFjZU1hbmFnZXIsIF9jYWNoZUZpZWxkSGVscGVyLlRvcE5vZGUpOworICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVCb29sKCJkOnNoYXJlZEl0ZW1zL0Bjb250YWluc051bWJlciIsIHRydWUpOworICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVCb29sKCJkOnNoYXJlZEl0ZW1zL0Bjb250YWluc0ludGVnZXIiLCB0cnVlKTsKKyAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlQm9vbCgiZDpzaGFyZWRJdGVtcy9AY29udGFpbnNTZW1pTWl4ZWRUeXBlcyIsIGZhbHNlKTsKKyAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlQm9vbCgiZDpzaGFyZWRJdGVtcy9AY29udGFpbnNTdHJpbmciLCBmYWxzZSk7CisKKyAgICBncm91cC5Ub3BOb2RlLklubmVyWG1sICs9IHN0cmluZy5Gb3JtYXQoCisgICAgICAgICI8ZmllbGRHcm91cCBiYXNlPVwiezB9XCI+PHJhbmdlUHIgYXV0b1N0YXJ0PVwiMFwiIGF1dG9FbmQ9XCIwXCIgc3RhcnROdW09XCJ7MX1cIiBlbmROdW09XCJ7Mn1cIiBncm91cEludGVydmFsPVwiezN9XCIvPjxncm91cEl0ZW1zIC8+PC9maWVsZEdyb3VwPiIsCisgICAgICAgIEJhc2VJbmRleCwKKyAgICAgICAgc3RhcnQuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSksCisgICAgICAgIGVuZC5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSwKKyAgICAgICAgaW50ZXJ2YWwuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgIGludCBpdGVtcyA9IEFkZE51bWVyaWNHcm91cEl0ZW1zKGdyb3VwLCBzdGFydCwgZW5kLCBpbnRlcnZhbCk7CisgICAgQWRkRmllbGRJdGVtcyhpdGVtcyk7CisKKyAgICBfZ3JvdXBpbmcgPSBncm91cDsKKyAgICByZXR1cm4gZ3JvdXA7CisgIH0KKworICBwcml2YXRlIGludCBBZGROdW1lcmljR3JvdXBJdGVtcygKKyAgICAgIEV4Y2VsUGl2b3RUYWJsZUZpZWxkTnVtZXJpY0dyb3VwIGdyb3VwLAorICAgICAgZG91YmxlIHN0YXJ0LAorICAgICAgZG91YmxlIGVuZCwKKyAgICAgIGRvdWJsZSBpbnRlcnZhbCkgeworICAgIGlmIChpbnRlcnZhbCA8IDApIHsKKyAgICAgIHRocm93IChuZXcoIlRoZSBpbnRlcnZhbCBtdXN0IGJlIGEgcG9zaXRpdiIpKTsKKyAgICB9CisgICAgaWYgKHN0YXJ0ID4gZW5kKSB7CisgICAgICB0aHJvdyAobmV3KCJUaGVuIEVuZCBudW1iZXIgbXVzdCBiZSBsYXJnZXIgdGhhbiB0aGUgU3RhcnQgbnVtYmVyIikpOworICAgIH0KKworICAgIFhtbEVsZW1lbnQgZ3JvdXBJdGVtcyA9CisgICAgICAgIGdyb3VwLlRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpmaWVsZEdyb3VwL2Q6Z3JvdXBJdGVtcyIsIGdyb3VwLk5hbWVTcGFjZU1hbmFnZXIpCisgICAgICAgICAgICBhcyBYbWxFbGVtZW50OworICAgIGludCBpdGVtcyA9IDI7CisgICAgLy9GaXJzdCBkYXRlCisgICAgZG91YmxlIGluZGV4ID0gc3RhcnQ7CisgICAgZG91YmxlIG5leHRJbmRleCA9IHN0YXJ0ICsgaW50ZXJ2YWw7CisgICAgQWRkR3JvdXBJdGVtKGdyb3VwSXRlbXMsICI8IiArIHN0YXJ0LlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKworICAgIHdoaWxlIChpbmRleCA8IGVuZCkgeworICAgICAgQWRkR3JvdXBJdGVtKAorICAgICAgICAgIGdyb3VwSXRlbXMsCisgICAgICAgICAgc3RyaW5nLkZvcm1hdCgKKyAgICAgICAgICAgICAgInswfS17MX0iLAorICAgICAgICAgICAgICBpbmRleC5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSwKKyAgICAgICAgICAgICAgbmV4dEluZGV4LlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKSk7CisgICAgICBpbmRleCA9IG5leHRJbmRleDsKKyAgICAgIG5leHRJbmRleCArPSBpbnRlcnZhbDsKKyAgICAgIGl0ZW1zKys7CisgICAgfQorICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAiPiIgKyBuZXh0SW5kZXguVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICAgIHJldHVybiBpdGVtczsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBBZGRGaWVsZEl0ZW1zKGludCBpdGVtcykgeworICAgIFhtbEVsZW1lbnQgcHJldk5vZGUgPSBudWxsOworICAgIFhtbEVsZW1lbnQgaXRlbXNOb2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOml0ZW1zIiwgTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IGl0ZW1zOyB4KyspIHsKKyAgICAgIHZhciBpdGVtTm9kZSA9IGl0ZW1zTm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoIml0ZW0iLCBFeGNlbFBhY2thZ2UuX3NjaGVtYU1haW4pOworICAgICAgaXRlbU5vZGUuU2V0QXR0cmlidXRlKCJ4IiwgeC5Ub1N0cmluZygpKTsKKyAgICAgIGlmIChwcmV2Tm9kZSA9PSBudWxsKSB7CisgICAgICAgIGl0ZW1zTm9kZS5QcmVwZW5kQ2hpbGQoaXRlbU5vZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaXRlbXNOb2RlLkluc2VydEFmdGVyKGl0ZW1Ob2RlLCBwcmV2Tm9kZSk7CisgICAgICB9CisgICAgICBwcmV2Tm9kZSA9IGl0ZW1Ob2RlOworICAgIH0KKyAgICBpdGVtc05vZGUuU2V0QXR0cmlidXRlKCJjb3VudCIsIChpdGVtcyArIDEpLlRvU3RyaW5nKCkpOworICB9CisKKyAgcHJpdmF0ZSBpbnQgQWRkRGF0ZUdyb3VwSXRlbXMoCisgICAgICBFeGNlbFBpdm90VGFibGVGaWVsZEdyb3VwIGdyb3VwLAorICAgICAgZURhdGVHcm91cEJ5IGdyb3VwQnksCisgICAgICBEYXRlVGltZSBzdGFydERhdGUsCisgICAgICBEYXRlVGltZSBlbmREYXRlLAorICAgICAgaW50IGludGVydmFsKSB7CisgICAgWG1sRWxlbWVudCBncm91cEl0ZW1zID0KKyAgICAgICAgZ3JvdXAuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCJkOmZpZWxkR3JvdXAvZDpncm91cEl0ZW1zIiwgZ3JvdXAuTmFtZVNwYWNlTWFuYWdlcikKKyAgICAgICAgICAgIGFzIFhtbEVsZW1lbnQ7CisgICAgaW50IGl0ZW1zID0gMjsKKyAgICAvL0ZpcnN0IGRhdGUKKyAgICBBZGRHcm91cEl0ZW0oCisgICAgICAgIGdyb3VwSXRlbXMsCisgICAgICAgICI8IiArIHN0YXJ0RGF0ZS5Ub1N0cmluZygicyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLlN1YnN0cmluZygwLCAxMCkpOworCisgICAgc3dpdGNoIChncm91cEJ5KSB7CisgICAgICBjYXNlIGVEYXRlR3JvdXBCeS5TZWNvbmRzOgorICAgICAgY2FzZSBlRGF0ZUdyb3VwQnkuTWludXRlczoKKyAgICAgICAgQWRkVGltZVNlcmllKDYwLCBncm91cEl0ZW1zKTsKKyAgICAgICAgaXRlbXMgKz0gNjA7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBlRGF0ZUdyb3VwQnkuSG91cnM6CisgICAgICAgIEFkZFRpbWVTZXJpZSgyNCwgZ3JvdXBJdGVtcyk7CisgICAgICAgIGl0ZW1zICs9IDI0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgZURhdGVHcm91cEJ5LkRheXM6CisgICAgICAgIGlmIChpbnRlcnZhbCA9PSAxKSB7CisgICAgICAgICAgRGF0ZVRpbWUgZHQgPSBuZXcgRGF0ZVRpbWUoMjAwOCwgMSwgMSk7IC8vcGljayBhIHllYXIgd2l0aCAzNjYgZGF5cworICAgICAgICAgIHdoaWxlIChkdC5ZZWFyID09IDIwMDgpIHsKKyAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCBkdC5Ub1N0cmluZygiZGQtTU1NIikpOworICAgICAgICAgICAgZHQgPSBkdC5BZGREYXlzKDEpOworICAgICAgICAgIH0KKyAgICAgICAgICBpdGVtcyArPSAzNjY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRGF0ZVRpbWUgZHQgPSBzdGFydERhdGU7CisgICAgICAgICAgaXRlbXMgPSAwOworICAgICAgICAgIHdoaWxlIChkdCA8IGVuZERhdGUpIHsKKyAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCBkdC5Ub1N0cmluZygiZGQtTU1NIikpOworICAgICAgICAgICAgZHQgPSBkdC5BZGREYXlzKGludGVydmFsKTsKKyAgICAgICAgICAgIGl0ZW1zKys7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBlRGF0ZUdyb3VwQnkuTW9udGhzOgorICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgImphbiIpOworICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgImZlYiIpOworICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgIm1hciIpOworICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgImFwciIpOworICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgIm1heSIpOworICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgImp1biIpOworICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgImp1bCIpOworICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgImF1ZyIpOworICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgInNlcCIpOworICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgIm9jdCIpOworICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgIm5vdiIpOworICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgImRlYyIpOworICAgICAgICBpdGVtcyArPSAxMjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIGVEYXRlR3JvdXBCeS5RdWFydGVyczoKKyAgICAgICAgQWRkR3JvdXBJdGVtKGdyb3VwSXRlbXMsICJRdHIxIik7CisgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAiUXRyMiIpOworICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgIlF0cjMiKTsKKyAgICAgICAgQWRkR3JvdXBJdGVtKGdyb3VwSXRlbXMsICJRdHI0Iik7CisgICAgICAgIGl0ZW1zICs9IDQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBlRGF0ZUdyb3VwQnkuWWVhcnM6CisgICAgICAgIGlmIChzdGFydERhdGUuWWVhciA+PSAxOTAwICYmIGVuZERhdGUgIT0gRGF0ZVRpbWUuTWF4VmFsdWUpIHsKKyAgICAgICAgICBmb3IgKGludCB5ZWFyID0gc3RhcnREYXRlLlllYXI7IHllYXIgPD0gZW5kRGF0ZS5ZZWFyOyB5ZWFyKyspIHsKKyAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCB5ZWFyLlRvU3RyaW5nKCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBpdGVtcyArPSBlbmREYXRlLlllYXIgLSBzdGFydERhdGUuWWVhciArIDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyAobmV3KCJ1bnN1cHBvcnRlZCBncm91cGluZyIpKTsKKyAgICB9CisKKyAgICAvL0xhc3RkYXRlCisgICAgQWRkR3JvdXBJdGVtKAorICAgICAgICBncm91cEl0ZW1zLAorICAgICAgICAiPiIgKyBlbmREYXRlLlRvU3RyaW5nKCJzIiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkuU3Vic3RyaW5nKDAsIDEwKSk7CisgICAgcmV0dXJuIGl0ZW1zOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIEFkZFRpbWVTZXJpZShpbnQgY291bnQsIFhtbEVsZW1lbnQgZ3JvdXBJdGVtcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgQWRkR3JvdXBJdGVtKGdyb3VwSXRlbXMsIHN0cmluZy5Gb3JtYXQoInswOjAwfSIsIGkpKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgQWRkR3JvdXBJdGVtKFhtbEVsZW1lbnQgZ3JvdXBJdGVtcywgc3RyaW5nIHZhbHVlKSB7CisgICAgdmFyIHMgPSBncm91cEl0ZW1zLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgicyIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgcy5TZXRBdHRyaWJ1dGUoInYiLCB2YWx1ZSk7CisgICAgZ3JvdXBJdGVtcy5BcHBlbmRDaGlsZChzKTsKKyAgfQorCisgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZUZpZWxkQ29sbGVjdGlvbkJhc2U8RXhjZWxQaXZvdFRhYmxlRmllbGRJdGVtPiBfaXRlbXM7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUGl2b3R0YWJsZSBmaWVsZCBJdGVtcy4gVXNlZCBmb3IgZ3JvdXBpbmcuCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb25CYXNlPEV4Y2VsUGl2b3RUYWJsZUZpZWxkSXRlbT4gSXRlbXMgeworICAgIGdldCB7CisgICAgICBpZiAoX2l0ZW1zID09IG51bGwpIHsKKyAgICAgICAgX2l0ZW1zID0gbmV3KF90YWJsZSk7CisgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbm9kZSBpbiBUb3BOb2RlLlNlbGVjdE5vZGVzKCJkOml0ZW1zLy9kOml0ZW0iLCBOYW1lU3BhY2VNYW5hZ2VyKSkgeworICAgICAgICAgIHZhciBpdGVtID0gbmV3IEV4Y2VsUGl2b3RUYWJsZUZpZWxkSXRlbShOYW1lU3BhY2VNYW5hZ2VyLCBub2RlLCB0aGlzKTsKKyAgICAgICAgICBpZiAoaXRlbS5UID09ICIiKSB7CisgICAgICAgICAgICBfaXRlbXMuQWRkSW50ZXJuYWwoaXRlbSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vaWYgKF9ncm91cGluZyBpcyBFeGNlbFBpdm90VGFibGVGaWVsZERhdGVHcm91cCkKKyAgICAgICAgLy97CisgICAgICAgIC8vICAgIEV4Y2VsUGl2b3RUYWJsZUZpZWxkRGF0ZUdyb3VwIGR0Z3JwID0gKChFeGNlbFBpdm90VGFibGVGaWVsZERhdGVHcm91cClfZ3JvdXBpbmcpOworCisgICAgICAgIC8vICAgIEV4Y2VsUGl2b3RUYWJsZUZpZWxkSXRlbSBtaW5JdGVtPW51bGwsIG1heEl0ZW09bnVsbDsKKyAgICAgICAgLy8gICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gX2l0ZW1zKQorICAgICAgICAvLyAgICB7CisgICAgICAgIC8vICAgICAgICBpZiAoaXRlbS5YID09IDApCisgICAgICAgIC8vICAgICAgICB7CisgICAgICAgIC8vICAgICAgICAgICAgbWluSXRlbSA9IGl0ZW07CisgICAgICAgIC8vICAgICAgICB9CisgICAgICAgIC8vICAgICAgICBlbHNlIGlmIChtYXhJdGVtID09IG51bGwgfHwgbWF4SXRlbS5YIDwgaXRlbS5YKQorICAgICAgICAvLyAgICAgICAgeworICAgICAgICAvLyAgICAgICAgICAgIG1heEl0ZW0gPSBpdGVtOworICAgICAgICAvLyAgICAgICAgfQorICAgICAgICAvLyAgICB9CisgICAgICAgIC8vICAgIGlmIChkdGdycC5BdXRvU3RhcnQpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIF9pdGVtcy5fbGlzdC5SZW1vdmUobWluSXRlbSk7CisgICAgICAgIC8vICAgIH0KKyAgICAgICAgLy8gICAgaWYgKGR0Z3JwLkF1dG9FbmQpCisgICAgICAgIC8vICAgIHsKKyAgICAgICAgLy8gICAgICAgIF9pdGVtcy5fbGlzdC5SZW1vdmUobWF4SXRlbSk7CisgICAgICAgIC8vICAgIH0KIAogICAgICAgICAvL30KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlUGFnZUZpZWxkU2V0dGluZ3MgX3BhZ2VGaWVsZFNldHRpbmdzID0gbnVsbDsKLSAgICAgICAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZVBhZ2VGaWVsZFNldHRpbmdzIFBhZ2VGaWVsZFNldHRpbmdzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBfcGFnZUZpZWxkU2V0dGluZ3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgZURhdGVHcm91cEJ5IERhdGVHcm91cGluZwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQ7Ci0gICAgICAgICAgICBzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgRXhjZWxQaXZvdFRhYmxlRmllbGRHcm91cCBfZ3JvdXBpbmc9bnVsbDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR3JvdXBpbmcgc2V0dGluZ3MuIAotICAgICAgICAvLy8gTnVsbCBpZiB0aGUgZmllbGQgaGFzIG5vIGdyb3VwaW5nIG90aGVyd2lzZSBFeGNlbFBpdm90VGFibGVGaWVsZE51bWVyaWNHcm91cCBvciBFeGNlbFBpdm90VGFibGVGaWVsZE51bWVyaWNHcm91cC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4gICAgICAgIAotICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlRmllbGRHcm91cCBHcm91cGluZwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gX2dyb3VwaW5nOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNyZWdpb24gUHJpdmF0ZSAmIGludGVybmFsIE1ldGhvZHMKLSAgICAgICAgaW50ZXJuYWwgWG1sRWxlbWVudCBBcHBlbmRGaWVsZChYbWxOb2RlIHJvd3NOb2RlLCBpbnQgaW5kZXgsIHN0cmluZyBmaWVsZE5vZGVUZXh0LCBzdHJpbmcgaW5kZXhBdHRyVGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgWG1sRWxlbWVudCBwcmV2RmllbGQgPSBudWxsLCBuZXdFbGVtZW50OwotICAgICAgICAgICAgZm9yZWFjaCAoWG1sRWxlbWVudCBmaWVsZCBpbiByb3dzTm9kZS5DaGlsZE5vZGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyB4ID0gZmllbGQuR2V0QXR0cmlidXRlKGluZGV4QXR0clRleHQpOwotICAgICAgICAgICAgICAgIGludCBmaWVsZEluZGV4OwotICAgICAgICAgICAgICAgIGlmKGludC5UcnlQYXJzZSh4LCBvdXQgZmllbGRJbmRleCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRJbmRleCA9PSBpbmRleCkgICAgLy9Sb3cgYWxyZWFkeSBleGlzdHMKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vZWxzZSBpZiAoZmllbGRJbmRleCA+IGluZGV4KQotICAgICAgICAgICAgICAgICAgICAvL3sKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgbmV3RWxlbWVudCA9IHJvd3NOb2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChmaWVsZE5vZGVUZXh0LCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIG5ld0VsZW1lbnQuU2V0QXR0cmlidXRlKGluZGV4QXR0clRleHQsIGluZGV4LlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICAvLyAgICByb3dzTm9kZS5JbnNlcnRBZnRlcihuZXdFbGVtZW50LCBmaWVsZCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcmV2RmllbGQ9ZmllbGQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuZXdFbGVtZW50ID0gcm93c05vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KGZpZWxkTm9kZVRleHQsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgIG5ld0VsZW1lbnQuU2V0QXR0cmlidXRlKGluZGV4QXR0clRleHQsIGluZGV4LlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcm93c05vZGUuSW5zZXJ0QWZ0ZXIobmV3RWxlbWVudCwgcHJldkZpZWxkKTsKLQotICAgICAgICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgWG1sSGVscGVySW5zdGFuY2UgX2NhY2hlRmllbGRIZWxwZXIgPSBudWxsOwotICAgICAgICBpbnRlcm5hbCB2b2lkIFNldENhY2hlRmllbGROb2RlKFhtbE5vZGUgY2FjaGVGaWVsZCkKLSAgICAgICAgewotICAgICAgICAgICAgX2NhY2hlRmllbGRIZWxwZXIgPSBuZXcgWG1sSGVscGVySW5zdGFuY2UoTmFtZVNwYWNlTWFuYWdlciwgY2FjaGVGaWVsZCk7Ci0gICAgICAgICAgICB2YXIgZ3JvdXBOb2RlID0gY2FjaGVGaWVsZC5TZWxlY3RTaW5nbGVOb2RlKCJkOmZpZWxkR3JvdXAiLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGlmIChncm91cE5vZGUhPW51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGdyb3VwQnkgPSBncm91cE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpyYW5nZVByL0Bncm91cEJ5IiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgaWYgKGdyb3VwQnk9PW51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfZ3JvdXBpbmcgPSBuZXcgRXhjZWxQaXZvdFRhYmxlRmllbGROdW1lcmljR3JvdXAoTmFtZVNwYWNlTWFuYWdlciwgY2FjaGVGaWVsZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERhdGVHcm91cGluZz0oZURhdGVHcm91cEJ5KUVudW0uUGFyc2UodHlwZW9mKGVEYXRlR3JvdXBCeSksIGdyb3VwQnkuVmFsdWUsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICBfZ3JvdXBpbmcgPSBuZXcgRXhjZWxQaXZvdFRhYmxlRmllbGREYXRlR3JvdXAoTmFtZVNwYWNlTWFuYWdlciwgZ3JvdXBOb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgICAgICAjcmVnaW9uIEdyb3VwaW5nCi0gICAgICAgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZUZpZWxkRGF0ZUdyb3VwIFNldERhdGVHcm91cChlRGF0ZUdyb3VwQnkgR3JvdXBCeSwgRGF0ZVRpbWUgU3RhcnREYXRlLCBEYXRlVGltZSBFbmREYXRlLCBpbnQgaW50ZXJ2YWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEV4Y2VsUGl2b3RUYWJsZUZpZWxkRGF0ZUdyb3VwIGdyb3VwOwotICAgICAgICAgICAgZ3JvdXAgPSBuZXcgRXhjZWxQaXZvdFRhYmxlRmllbGREYXRlR3JvdXAoTmFtZVNwYWNlTWFuYWdlciwgX2NhY2hlRmllbGRIZWxwZXIuVG9wTm9kZSk7Ci0gICAgICAgICAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlQm9vbCgiZDpzaGFyZWRJdGVtcy9AY29udGFpbnNEYXRlIiwgdHJ1ZSk7Ci0gICAgICAgICAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlQm9vbCgiZDpzaGFyZWRJdGVtcy9AY29udGFpbnNOb25EYXRlIiwgZmFsc2UpOwotICAgICAgICAgICAgX2NhY2hlRmllbGRIZWxwZXIuU2V0WG1sTm9kZUJvb2woImQ6c2hhcmVkSXRlbXMvQGNvbnRhaW5zU2VtaU1peGVkVHlwZXMiLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIGdyb3VwLlRvcE5vZGUuSW5uZXJYbWwgKz0gc3RyaW5nLkZvcm1hdCgiPGZpZWxkR3JvdXAgYmFzZT1cInswfVwiPjxyYW5nZVByIGdyb3VwQnk9XCJ7MX1cIiAvPjxncm91cEl0ZW1zIC8+PC9maWVsZEdyb3VwPiIsIEJhc2VJbmRleCwgR3JvdXBCeS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotCi0gICAgICAgICAgICBpZiAoU3RhcnREYXRlLlllYXIgPCAxOTAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoImQ6ZmllbGRHcm91cC9kOnJhbmdlUHIvQHN0YXJ0RGF0ZSIsICIxOTAwLTAxLTAxVDAwOjAwOjAwIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2NhY2hlRmllbGRIZWxwZXIuU2V0WG1sTm9kZVN0cmluZygiZDpmaWVsZEdyb3VwL2Q6cmFuZ2VQci9Ac3RhcnREYXRlIiwgU3RhcnREYXRlLlRvU3RyaW5nKCJzIiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVTdHJpbmcoImQ6ZmllbGRHcm91cC9kOnJhbmdlUHIvQGF1dG9TdGFydCIsICIwIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChFbmREYXRlPT1EYXRlVGltZS5NYXhWYWx1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKCJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0BlbmREYXRlIiwgIjk5OTktMTItMzFUMDA6MDA6MDAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKCJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0BlbmREYXRlIiwgRW5kRGF0ZS5Ub1N0cmluZygicyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgICAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKCJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0BhdXRvRW5kIiwgIjAiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGl0ZW1zID0gQWRkRGF0ZUdyb3VwSXRlbXMoZ3JvdXAsIEdyb3VwQnksIFN0YXJ0RGF0ZSwgRW5kRGF0ZSwgaW50ZXJ2YWwpOwotICAgICAgICAgICAgQWRkRmllbGRJdGVtcyhpdGVtcyk7Ci0KLSAgICAgICAgICAgIF9ncm91cGluZyA9IGdyb3VwOwotICAgICAgICAgICAgcmV0dXJuIGdyb3VwOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZUZpZWxkTnVtZXJpY0dyb3VwIFNldE51bWVyaWNHcm91cChkb3VibGUgc3RhcnQsIGRvdWJsZSBlbmQsIGRvdWJsZSBpbnRlcnZhbCkKLSAgICAgICAgewotICAgICAgICAgICAgRXhjZWxQaXZvdFRhYmxlRmllbGROdW1lcmljR3JvdXAgZ3JvdXA7Ci0gICAgICAgICAgICBncm91cCA9IG5ldyBFeGNlbFBpdm90VGFibGVGaWVsZE51bWVyaWNHcm91cChOYW1lU3BhY2VNYW5hZ2VyLCBfY2FjaGVGaWVsZEhlbHBlci5Ub3BOb2RlKTsKLSAgICAgICAgICAgIF9jYWNoZUZpZWxkSGVscGVyLlNldFhtbE5vZGVCb29sKCJkOnNoYXJlZEl0ZW1zL0Bjb250YWluc051bWJlciIsIHRydWUpOwotICAgICAgICAgICAgX2NhY2hlRmllbGRIZWxwZXIuU2V0WG1sTm9kZUJvb2woImQ6c2hhcmVkSXRlbXMvQGNvbnRhaW5zSW50ZWdlciIsIHRydWUpOwotICAgICAgICAgICAgX2NhY2hlRmllbGRIZWxwZXIuU2V0WG1sTm9kZUJvb2woImQ6c2hhcmVkSXRlbXMvQGNvbnRhaW5zU2VtaU1peGVkVHlwZXMiLCBmYWxzZSk7Ci0gICAgICAgICAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlQm9vbCgiZDpzaGFyZWRJdGVtcy9AY29udGFpbnNTdHJpbmciLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIGdyb3VwLlRvcE5vZGUuSW5uZXJYbWwgKz0gc3RyaW5nLkZvcm1hdCgiPGZpZWxkR3JvdXAgYmFzZT1cInswfVwiPjxyYW5nZVByIGF1dG9TdGFydD1cIjBcIiBhdXRvRW5kPVwiMFwiIHN0YXJ0TnVtPVwiezF9XCIgZW5kTnVtPVwiezJ9XCIgZ3JvdXBJbnRlcnZhbD1cInszfVwiLz48Z3JvdXBJdGVtcyAvPjwvZmllbGRHcm91cD4iLCBCYXNlSW5kZXgsIHN0YXJ0LlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLCBlbmQuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSksIGludGVydmFsLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgIGludCBpdGVtcyA9IEFkZE51bWVyaWNHcm91cEl0ZW1zKGdyb3VwLCBzdGFydCwgZW5kLCBpbnRlcnZhbCk7Ci0gICAgICAgICAgICBBZGRGaWVsZEl0ZW1zKGl0ZW1zKTsKLQotICAgICAgICAgICAgX2dyb3VwaW5nID0gZ3JvdXA7Ci0gICAgICAgICAgICByZXR1cm4gZ3JvdXA7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBBZGROdW1lcmljR3JvdXBJdGVtcyhFeGNlbFBpdm90VGFibGVGaWVsZE51bWVyaWNHcm91cCBncm91cCwgZG91YmxlIHN0YXJ0LCBkb3VibGUgZW5kLCBkb3VibGUgaW50ZXJ2YWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbnRlcnZhbCA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIlRoZSBpbnRlcnZhbCBtdXN0IGJlIGEgcG9zaXRpdiIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGFydCA+IGVuZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyhuZXcgRXhjZXB0aW9uKCJUaGVuIEVuZCBudW1iZXIgbXVzdCBiZSBsYXJnZXIgdGhhbiB0aGUgU3RhcnQgbnVtYmVyIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBYbWxFbGVtZW50IGdyb3VwSXRlbXMgPSBncm91cC5Ub3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6ZmllbGRHcm91cC9kOmdyb3VwSXRlbXMiLCBncm91cC5OYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgaW50IGl0ZW1zID0gMjsKLSAgICAgICAgICAgIC8vRmlyc3QgZGF0ZQotICAgICAgICAgICAgZG91YmxlIGluZGV4PXN0YXJ0OwotICAgICAgICAgICAgZG91YmxlIG5leHRJbmRleD1zdGFydCtpbnRlcnZhbDsKLSAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAiPCIgKyBzdGFydC5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChpbmRleCA8IGVuZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgc3RyaW5nLkZvcm1hdCgiezB9LXsxfSIsIGluZGV4LlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLCBuZXh0SW5kZXguVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpKTsKLSAgICAgICAgICAgICAgICBpbmRleD1uZXh0SW5kZXg7Ci0gICAgICAgICAgICAgICAgbmV4dEluZGV4Kz1pbnRlcnZhbDsKLSAgICAgICAgICAgICAgICBpdGVtcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQWRkR3JvdXBJdGVtKGdyb3VwSXRlbXMsICI+IiArIG5leHRJbmRleC5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICByZXR1cm4gaXRlbXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgQWRkRmllbGRJdGVtcyhpbnQgaXRlbXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEVsZW1lbnQgcHJldk5vZGUgPSBudWxsOwotICAgICAgICAgICAgWG1sRWxlbWVudCBpdGVtc05vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoImQ6aXRlbXMiLCBOYW1lU3BhY2VNYW5hZ2VyKSBhcyBYbWxFbGVtZW50OwotICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBpdGVtczsgeCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBpdGVtTm9kZSA9IGl0ZW1zTm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoIml0ZW0iLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICAgICAgaXRlbU5vZGUuU2V0QXR0cmlidXRlKCJ4IiwgeC5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBpZiAocHJldk5vZGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1zTm9kZS5QcmVwZW5kQ2hpbGQoaXRlbU5vZGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpdGVtc05vZGUuSW5zZXJ0QWZ0ZXIoaXRlbU5vZGUsIHByZXZOb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJldk5vZGUgPSBpdGVtTm9kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGl0ZW1zTm9kZS5TZXRBdHRyaWJ1dGUoImNvdW50IiwgKGl0ZW1zICsgMSkuVG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBBZGREYXRlR3JvdXBJdGVtcyhFeGNlbFBpdm90VGFibGVGaWVsZEdyb3VwIGdyb3VwLCBlRGF0ZUdyb3VwQnkgR3JvdXBCeSwgRGF0ZVRpbWUgU3RhcnREYXRlLCBEYXRlVGltZSBFbmREYXRlLCBpbnQgaW50ZXJ2YWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbEVsZW1lbnQgZ3JvdXBJdGVtcyA9IGdyb3VwLlRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiZDpmaWVsZEdyb3VwL2Q6Z3JvdXBJdGVtcyIsIGdyb3VwLk5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7Ci0gICAgICAgICAgICBpbnQgaXRlbXMgPSAyOwotICAgICAgICAgICAgLy9GaXJzdCBkYXRlCi0gICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgIjwiICsgU3RhcnREYXRlLlRvU3RyaW5nKCJzIiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkuU3Vic3RyaW5nKDAsIDEwKSk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoR3JvdXBCeSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIGVEYXRlR3JvdXBCeS5TZWNvbmRzOgotICAgICAgICAgICAgICAgIGNhc2UgZURhdGVHcm91cEJ5Lk1pbnV0ZXM6Ci0gICAgICAgICAgICAgICAgICAgIEFkZFRpbWVTZXJpZSg2MCwgZ3JvdXBJdGVtcyk7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1zICs9IDYwOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGVEYXRlR3JvdXBCeS5Ib3VyczoKLSAgICAgICAgICAgICAgICAgICAgQWRkVGltZVNlcmllKDI0LCBncm91cEl0ZW1zKTsKLSAgICAgICAgICAgICAgICAgICAgaXRlbXMgKz0gMjQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgZURhdGVHcm91cEJ5LkRheXM6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcnZhbCA9PSAxKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGltZSBkdCA9IG5ldyBEYXRlVGltZSgyMDA4LCAxLCAxKTsgLy9waWNrIGEgeWVhciB3aXRoIDM2NiBkYXlzCi0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZHQuWWVhciA9PSAyMDA4KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCBkdC5Ub1N0cmluZygiZGQtTU1NIikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0ID0gZHQuQWRkRGF5cygxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zICs9IDM2NjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lIGR0ID0gU3RhcnREYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGR0IDwgRW5kRGF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgZHQuVG9TdHJpbmcoImRkLU1NTSIpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdCA9IGR0LkFkZERheXMoaW50ZXJ2YWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRGF0ZUdyb3VwQnkuTW9udGhzOgotICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgImphbiIpOwotICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgImZlYiIpOwotICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgIm1hciIpOwotICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgImFwciIpOwotICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgIm1heSIpOwotICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgImp1biIpOwotICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgImp1bCIpOwotICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgImF1ZyIpOwotICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgInNlcCIpOwotICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgIm9jdCIpOwotICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgIm5vdiIpOwotICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgImRlYyIpOwotICAgICAgICAgICAgICAgICAgICBpdGVtcyArPSAxMjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBlRGF0ZUdyb3VwQnkuUXVhcnRlcnM6Ci0gICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAiUXRyMSIpOwotICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgIlF0cjIiKTsKLSAgICAgICAgICAgICAgICAgICAgQWRkR3JvdXBJdGVtKGdyb3VwSXRlbXMsICJRdHIzIik7Ci0gICAgICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCAiUXRyNCIpOwotICAgICAgICAgICAgICAgICAgICBpdGVtcyArPSA0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIGVEYXRlR3JvdXBCeS5ZZWFyczoKLSAgICAgICAgICAgICAgICAgICAgaWYoU3RhcnREYXRlLlllYXI+PTE5MDAgJiYgRW5kRGF0ZSE9RGF0ZVRpbWUuTWF4VmFsdWUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHllYXIgPSBTdGFydERhdGUuWWVhcjsgeWVhciA8PSBFbmREYXRlLlllYXI7IHllYXIrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgeWVhci5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zICs9IEVuZERhdGUuWWVhciAtIFN0YXJ0RGF0ZS5ZZWFyKzE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oInVuc3VwcG9ydGVkIGdyb3VwaW5nIikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvL0xhc3RkYXRlCi0gICAgICAgICAgICBBZGRHcm91cEl0ZW0oZ3JvdXBJdGVtcywgIj4iICsgRW5kRGF0ZS5Ub1N0cmluZygicyIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpLlN1YnN0cmluZygwLCAxMCkpOwotICAgICAgICAgICAgcmV0dXJuIGl0ZW1zOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZFRpbWVTZXJpZShpbnQgY291bnQsIFhtbEVsZW1lbnQgZ3JvdXBJdGVtcykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFkZEdyb3VwSXRlbShncm91cEl0ZW1zLCBzdHJpbmcuRm9ybWF0KCJ7MDowMH0iLCBpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgQWRkR3JvdXBJdGVtKFhtbEVsZW1lbnQgZ3JvdXBJdGVtcywgc3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcyA9IGdyb3VwSXRlbXMuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KCJzIiwgRXhjZWxQYWNrYWdlLnNjaGVtYU1haW4pOwotICAgICAgICAgICAgcy5TZXRBdHRyaWJ1dGUoInYiLCB2YWx1ZSk7Ci0gICAgICAgICAgICBncm91cEl0ZW1zLkFwcGVuZENoaWxkKHMpOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uQmFzZTxFeGNlbFBpdm90VGFibGVGaWVsZEl0ZW0+IF9pdGVtcz1udWxsOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQaXZvdHRhYmxlIGZpZWxkIEl0ZW1zLiBVc2VkIGZvciBncm91cGluZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZUZpZWxkQ29sbGVjdGlvbkJhc2U8RXhjZWxQaXZvdFRhYmxlRmllbGRJdGVtPiBJdGVtcwotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoX2l0ZW1zID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfaXRlbXMgPSBuZXcgRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uQmFzZTxFeGNlbFBpdm90VGFibGVGaWVsZEl0ZW0+KF90YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKFhtbE5vZGUgbm9kZSBpbiBUb3BOb2RlLlNlbGVjdE5vZGVzKCJkOml0ZW1zLy9kOml0ZW0iLCBOYW1lU3BhY2VNYW5hZ2VyKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBuZXcgRXhjZWxQaXZvdFRhYmxlRmllbGRJdGVtKE5hbWVTcGFjZU1hbmFnZXIsIG5vZGUsdGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5UID09ICIiKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9pdGVtcy5BZGRJbnRlcm5hbChpdGVtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvL2lmIChfZ3JvdXBpbmcgaXMgRXhjZWxQaXZvdFRhYmxlRmllbGREYXRlR3JvdXApCi0gICAgICAgICAgICAgICAgICAgIC8vewotICAgICAgICAgICAgICAgICAgICAvLyAgICBFeGNlbFBpdm90VGFibGVGaWVsZERhdGVHcm91cCBkdGdycCA9ICgoRXhjZWxQaXZvdFRhYmxlRmllbGREYXRlR3JvdXApX2dyb3VwaW5nKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyAgICBFeGNlbFBpdm90VGFibGVGaWVsZEl0ZW0gbWluSXRlbT1udWxsLCBtYXhJdGVtPW51bGw7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIGZvcmVhY2ggKHZhciBpdGVtIGluIF9pdGVtcykKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgewotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgaWYgKGl0ZW0uWCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgIG1pbkl0ZW0gPSBpdGVtOwotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgZWxzZSBpZiAobWF4SXRlbSA9PSBudWxsIHx8IG1heEl0ZW0uWCA8IGl0ZW0uWCkKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBtYXhJdGVtID0gaXRlbTsKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gICAgfQotICAgICAgICAgICAgICAgICAgICAvLyAgICBpZiAoZHRncnAuQXV0b1N0YXJ0KQotICAgICAgICAgICAgICAgICAgICAvLyAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBfaXRlbXMuX2xpc3QuUmVtb3ZlKG1pbkl0ZW0pOwotICAgICAgICAgICAgICAgICAgICAvLyAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgIGlmIChkdGdycC5BdXRvRW5kKQotICAgICAgICAgICAgICAgICAgICAvLyAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBfaXRlbXMuX2xpc3QuUmVtb3ZlKG1heEl0ZW0pOwotICAgICAgICAgICAgICAgICAgICAvLyAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy99Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfaXRlbXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkIG51bWJlcmljIGdyb3VwaW5nIHRvIHRoZSBmaWVsZAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IlN0YXJ0Ij5TdGFydCB2YWx1ZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRW5kIj5FbmQgdmFsdWU8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkludGVydmFsIj5JbnRlcnZhbDwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIEFkZE51bWVyaWNHcm91cGluZyhkb3VibGUgU3RhcnQsIGRvdWJsZSBFbmQsIGRvdWJsZSBJbnRlcnZhbCkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVHcm91cGluZygpOwotICAgICAgICAgICAgU2V0TnVtZXJpY0dyb3VwKFN0YXJ0LCBFbmQsIEludGVydmFsKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGQgYSBkYXRlIGdyb3VwaW5nIG9uIHRoaXMgZmllbGQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZ3JvdXBCeSI+R3JvdXAgYnk8L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBBZGREYXRlR3JvdXBpbmcoZURhdGVHcm91cEJ5IGdyb3VwQnkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZERhdGVHcm91cGluZyhncm91cEJ5LCBEYXRlVGltZS5NaW5WYWx1ZSwgRGF0ZVRpbWUuTWF4VmFsdWUsMSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkIGEgZGF0ZSBncm91cGluZyBvbiB0aGlzIGZpZWxkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imdyb3VwQnkiPkdyb3VwIGJ5PC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdGFydERhdGUiPkZpeGVkIHN0YXJ0IGRhdGUuIFVzZSBEYXRlVGltZS5NaW5WYWx1ZSBmb3IgYXV0bzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW5kRGF0ZSI+Rml4ZWQgZW5kIGRhdGUuIFVzZSBEYXRlVGltZS5NYXhWYWx1ZSBmb3IgYXV0bzwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIEFkZERhdGVHcm91cGluZyhlRGF0ZUdyb3VwQnkgZ3JvdXBCeSwgRGF0ZVRpbWUgc3RhcnREYXRlLCBEYXRlVGltZSBlbmREYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGREYXRlR3JvdXBpbmcoZ3JvdXBCeSwgc3RhcnREYXRlLCBlbmREYXRlLCAxKTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGQgYSBkYXRlIGdyb3VwaW5nIG9uIHRoaXMgZmllbGQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF5cyI+TnVtYmVyIG9mIGRheXMgd2hlbiBncm91cGluZyBvbiBkYXlzPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzdGFydERhdGUiPkZpeGVkIHN0YXJ0IGRhdGUuIFVzZSBEYXRlVGltZS5NaW5WYWx1ZSBmb3IgYXV0bzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZW5kRGF0ZSI+Rml4ZWQgZW5kIGRhdGUuIFVzZSBEYXRlVGltZS5NYXhWYWx1ZSBmb3IgYXV0bzwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIEFkZERhdGVHcm91cGluZyhpbnQgZGF5cywgRGF0ZVRpbWUgc3RhcnREYXRlLCBEYXRlVGltZSBlbmREYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBBZGREYXRlR3JvdXBpbmcoZURhdGVHcm91cEJ5LkRheXMsIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgZGF5cyk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEFkZERhdGVHcm91cGluZyhlRGF0ZUdyb3VwQnkgZ3JvdXBCeSwgRGF0ZVRpbWUgc3RhcnREYXRlLCBEYXRlVGltZSBlbmREYXRlLCBpbnQgZ3JvdXBJbnRlcnZhbCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGdyb3VwSW50ZXJ2YWwgPCAxIHx8IGdyb3VwSW50ZXJ2YWwgPj0gSW50MTYuTWF4VmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkdyb3VwIGludGVydmFsIGlzIG91dCBvZiByYW5nZSIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChncm91cEludGVydmFsID4gMSAmJiBncm91cEJ5ICE9IGVEYXRlR3JvdXBCeS5EYXlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRFeGNlcHRpb24oIkdyb3VwIGludGVydmFsIGlzIGNhbiBvbmx5IGJlIHVzZWQgd2hlbiBncm91cEJ5IGlzIERheXMiKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBWYWxpZGF0ZUdyb3VwaW5nKCk7Ci0KLSAgICAgICAgICAgIGJvb2wgZmlyc3RGaWVsZCA9IHRydWU7ICAgICAgICAgICAgCi0gICAgICAgICAgICBMaXN0PEV4Y2VsUGl2b3RUYWJsZUZpZWxkPiBmaWVsZHM9bmV3IExpc3Q8RXhjZWxQaXZvdFRhYmxlRmllbGQ+KCk7Ci0gICAgICAgICAgICAvL1NlY29uZHMKLSAgICAgICAgICAgIGlmICgoZ3JvdXBCeSAmIGVEYXRlR3JvdXBCeS5TZWNvbmRzKSA9PSBlRGF0ZUdyb3VwQnkuU2Vjb25kcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWVsZHMuQWRkKEFkZEZpZWxkKGVEYXRlR3JvdXBCeS5TZWNvbmRzLCBzdGFydERhdGUsIGVuZERhdGUsIHJlZiBmaXJzdEZpZWxkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL01pbnV0ZXMKLSAgICAgICAgICAgIGlmICgoZ3JvdXBCeSAmIGVEYXRlR3JvdXBCeS5NaW51dGVzKSA9PSBlRGF0ZUdyb3VwQnkuTWludXRlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWVsZHMuQWRkKEFkZEZpZWxkKGVEYXRlR3JvdXBCeS5NaW51dGVzLCBzdGFydERhdGUsIGVuZERhdGUsIHJlZiBmaXJzdEZpZWxkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0hvdXJzCi0gICAgICAgICAgICBpZiAoKGdyb3VwQnkgJiBlRGF0ZUdyb3VwQnkuSG91cnMpID09IGVEYXRlR3JvdXBCeS5Ib3VycykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWVsZHMuQWRkKEFkZEZpZWxkKGVEYXRlR3JvdXBCeS5Ib3Vycywgc3RhcnREYXRlLCBlbmREYXRlLCByZWYgZmlyc3RGaWVsZCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9EYXlzCi0gICAgICAgICAgICBpZiAoKGdyb3VwQnkgJiBlRGF0ZUdyb3VwQnkuRGF5cykgPT0gZURhdGVHcm91cEJ5LkRheXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmllbGRzLkFkZChBZGRGaWVsZChlRGF0ZUdyb3VwQnkuRGF5cywgc3RhcnREYXRlLCBlbmREYXRlLCByZWYgZmlyc3RGaWVsZCwgZ3JvdXBJbnRlcnZhbCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy9Nb250aAotICAgICAgICAgICAgaWYgKChncm91cEJ5ICYgZURhdGVHcm91cEJ5Lk1vbnRocykgPT0gZURhdGVHcm91cEJ5Lk1vbnRocykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWVsZHMuQWRkKEFkZEZpZWxkKGVEYXRlR3JvdXBCeS5Nb250aHMsIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgcmVmIGZpcnN0RmllbGQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vUXVhcnRlcnMKLSAgICAgICAgICAgIGlmICgoZ3JvdXBCeSAmIGVEYXRlR3JvdXBCeS5RdWFydGVycykgPT0gZURhdGVHcm91cEJ5LlF1YXJ0ZXJzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpZWxkcy5BZGQoQWRkRmllbGQoZURhdGVHcm91cEJ5LlF1YXJ0ZXJzLCBzdGFydERhdGUsIGVuZERhdGUsIHJlZiBmaXJzdEZpZWxkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL1llYXJzCi0gICAgICAgICAgICBpZiAoKGdyb3VwQnkgJiBlRGF0ZUdyb3VwQnkuWWVhcnMpID09IGVEYXRlR3JvdXBCeS5ZZWFycykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWVsZHMuQWRkKEFkZEZpZWxkKGVEYXRlR3JvdXBCeS5ZZWFycywgc3RhcnREYXRlLCBlbmREYXRlLCByZWYgZmlyc3RGaWVsZCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZmllbGRzLkNvdW50ID4gMSkgX2NhY2hlRmllbGRIZWxwZXIuU2V0WG1sTm9kZVN0cmluZygiZDpmaWVsZEdyb3VwL0BwYXIiLCAoX3RhYmxlLkZpZWxkcy5Db3VudCAtIDEpLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgaWYgKGdyb3VwSW50ZXJ2YWwgIT0gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKCJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0Bncm91cEludGVydmFsIiwgZ3JvdXBJbnRlcnZhbC5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfY2FjaGVGaWVsZEhlbHBlci5EZWxldGVOb2RlKCJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0Bncm91cEludGVydmFsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBfaXRlbXMgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFZhbGlkYXRlR3JvdXBpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIShJc0NvbHVtbkZpZWxkIHx8IElzUm93RmllbGQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJGaWVsZCBtdXN0IGJlIGEgcm93IG9yIGNvbHVtbiBmaWVsZCIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmaWVsZCBpbiBfdGFibGUuRmllbGRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Hcm91cGluZyAhPSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIkdyb3VwaW5nIGFscmVhZHkgZXhpc3RzIikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIEV4Y2VsUGl2b3RUYWJsZUZpZWxkIEFkZEZpZWxkKGVEYXRlR3JvdXBCeSBncm91cEJ5LCBEYXRlVGltZSBzdGFydERhdGUsIERhdGVUaW1lIGVuZERhdGUsIHJlZiAgYm9vbCBmaXJzdEZpZWxkKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQWRkRmllbGQoZ3JvdXBCeSwgc3RhcnREYXRlLCBlbmREYXRlLCByZWYgZmlyc3RGaWVsZCwxKTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIEV4Y2VsUGl2b3RUYWJsZUZpZWxkIEFkZEZpZWxkKGVEYXRlR3JvdXBCeSBncm91cEJ5LCBEYXRlVGltZSBzdGFydERhdGUsIERhdGVUaW1lIGVuZERhdGUsIHJlZiAgYm9vbCBmaXJzdEZpZWxkLCBpbnQgaW50ZXJ2YWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChmaXJzdEZpZWxkID09IGZhbHNlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vUGl2b3QgZmllbGQKLSAgICAgICAgICAgICAgICB2YXIgdG9wTm9kZSA9IF90YWJsZS5QaXZvdFRhYmxlWG1sLlNlbGVjdFNpbmdsZU5vZGUoIi8vZDpwaXZvdEZpZWxkcyIsIF90YWJsZS5OYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB2YXIgZmllbGROb2RlID0gX3RhYmxlLlBpdm90VGFibGVYbWwuQ3JlYXRlRWxlbWVudCgicGl2b3RGaWVsZCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgICAgICBmaWVsZE5vZGUuU2V0QXR0cmlidXRlKCJjb21wYWN0IiwgIjAiKTsKLSAgICAgICAgICAgICAgICBmaWVsZE5vZGUuU2V0QXR0cmlidXRlKCJvdXRsaW5lIiwgIjAiKTsKLSAgICAgICAgICAgICAgICBmaWVsZE5vZGUuU2V0QXR0cmlidXRlKCJzaG93QWxsIiwgIjAiKTsKLSAgICAgICAgICAgICAgICBmaWVsZE5vZGUuU2V0QXR0cmlidXRlKCJkZWZhdWx0U3VidG90YWwiLCAiMCIpOwotICAgICAgICAgICAgICAgIHRvcE5vZGUuQXBwZW5kQ2hpbGQoZmllbGROb2RlKTsKLQotICAgICAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBFeGNlbFBpdm90VGFibGVGaWVsZChfdGFibGUuTmFtZVNwYWNlTWFuYWdlciwgZmllbGROb2RlLCBfdGFibGUsIF90YWJsZS5GaWVsZHMuQ291bnQsIEluZGV4KTsKLSAgICAgICAgICAgICAgICBmaWVsZC5EYXRlR3JvdXBpbmcgPSBncm91cEJ5OwotCi0gICAgICAgICAgICAgICAgWG1sTm9kZSByb3dDb2xGaWVsZHM7Ci0gICAgICAgICAgICAgICAgaWYgKElzUm93RmllbGQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByb3dDb2xGaWVsZHM9VG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCIuLi8uLi9kOnJvd0ZpZWxkcyIsIE5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByb3dDb2xGaWVsZHMgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoIi4uLy4uL2Q6Y29sRmllbGRzIiwgTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50IGZpZWxkSW5kZXgsIGluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBmb3JlYWNoIChYbWxFbGVtZW50IHJvd2ZpZWxkIGluIHJvd0NvbEZpZWxkcy5DaGlsZE5vZGVzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGludC5UcnlQYXJzZShyb3dmaWVsZC5HZXRBdHRyaWJ1dGUoIngiKSwgb3V0IGZpZWxkSW5kZXgpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RhYmxlLkZpZWxkc1tmaWVsZEluZGV4XS5CYXNlSW5kZXggPT0gQmFzZUluZGV4KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdFbGVtZW50ID0gcm93Q29sRmllbGRzLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgiZmllbGQiLCBFeGNlbFBhY2thZ2Uuc2NoZW1hTWFpbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC5TZXRBdHRyaWJ1dGUoIngiLCBmaWVsZC5JbmRleC5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dDb2xGaWVsZHMuSW5zZXJ0QmVmb3JlKG5ld0VsZW1lbnQsIHJvd2ZpZWxkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbmRleCsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChJc1Jvd0ZpZWxkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3RhYmxlLlJvd0ZpZWxkcy5JbnNlcnQoZmllbGQsIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgX3RhYmxlLkNvbHVtbkZpZWxkcy5JbnNlcnQoZmllbGQsIGluZGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgX3RhYmxlLkZpZWxkcy5BZGRJbnRlcm5hbChmaWVsZCk7Ci0KLSAgICAgICAgICAgICAgICBBZGRDYWNoZUZpZWxkKGZpZWxkLCBzdGFydERhdGUsIGVuZERhdGUsIGludGVydmFsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmlyc3RGaWVsZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIERhdGVHcm91cGluZyA9IGdyb3VwQnk7Ci0gICAgICAgICAgICAgICAgQ29tcGFjdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIFNldERhdGVHcm91cChncm91cEJ5LCBzdGFydERhdGUsIGVuZERhdGUsIGludGVydmFsKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgQWRkQ2FjaGVGaWVsZChFeGNlbFBpdm90VGFibGVGaWVsZCBmaWVsZCwgRGF0ZVRpbWUgc3RhcnREYXRlLCBEYXRlVGltZSBlbmREYXRlLCBpbnQgaW50ZXJ2YWwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vQWRkIENhY2hlIGRlZmluaXRpb24gZmllbGQuCi0gICAgICAgICAgICB2YXIgY2FjaGVUb3BOb2RlID0gX3RhYmxlLkNhY2hlRGVmaW5pdGlvbi5DYWNoZURlZmluaXRpb25YbWwuU2VsZWN0U2luZ2xlTm9kZSgiLy9kOmNhY2hlRmllbGRzIiwgX3RhYmxlLk5hbWVTcGFjZU1hbmFnZXIpOwotICAgICAgICAgICAgdmFyIGNhY2hlRmllbGROb2RlID0gX3RhYmxlLkNhY2hlRGVmaW5pdGlvbi5DYWNoZURlZmluaXRpb25YbWwuQ3JlYXRlRWxlbWVudCgiY2FjaGVGaWVsZCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLQotICAgICAgICAgICAgY2FjaGVGaWVsZE5vZGUuU2V0QXR0cmlidXRlKCJuYW1lIiwgZmllbGQuRGF0ZUdyb3VwaW5nLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgY2FjaGVGaWVsZE5vZGUuU2V0QXR0cmlidXRlKCJkYXRhYmFzZUZpZWxkIiwgIjAiKTsKLSAgICAgICAgICAgIGNhY2hlVG9wTm9kZS5BcHBlbmRDaGlsZChjYWNoZUZpZWxkTm9kZSk7Ci0gICAgICAgICAgICBmaWVsZC5TZXRDYWNoZUZpZWxkTm9kZShjYWNoZUZpZWxkTm9kZSk7Ci0KLSAgICAgICAgICAgIGZpZWxkLlNldERhdGVHcm91cChmaWVsZC5EYXRlR3JvdXBpbmcsIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgaW50ZXJ2YWwpOwotICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gX2l0ZW1zOwogICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBudW1iZXJpYyBncm91cGluZyB0byB0aGUgZmllbGQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJzdGFydCI+U3RhcnQgdmFsdWU8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImVuZCI+RW5kIHZhbHVlPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJpbnRlcnZhbCI+SW50ZXJ2YWw8L3BhcmFtPgorICBwdWJsaWMgdm9pZCBBZGROdW1lcmljR3JvdXBpbmcoZG91YmxlIHN0YXJ0LCBkb3VibGUgZW5kLCBkb3VibGUgaW50ZXJ2YWwpIHsKKyAgICBWYWxpZGF0ZUdyb3VwaW5nKCk7CisgICAgU2V0TnVtZXJpY0dyb3VwKHN0YXJ0LCBlbmQsIGludGVydmFsKTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBhIGRhdGUgZ3JvdXBpbmcgb24gdGhpcyBmaWVsZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJncm91cEJ5Ij5Hcm91cCBieTwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIEFkZERhdGVHcm91cGluZyhlRGF0ZUdyb3VwQnkgZ3JvdXBCeSkgeworICAgIEFkZERhdGVHcm91cGluZyhncm91cEJ5LCBEYXRlVGltZS5NaW5WYWx1ZSwgRGF0ZVRpbWUuTWF4VmFsdWUsIDEpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQWRkIGEgZGF0ZSBncm91cGluZyBvbiB0aGlzIGZpZWxkLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Imdyb3VwQnkiPkdyb3VwIGJ5PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJzdGFydERhdGUiPkZpeGVkIHN0YXJ0IGRhdGUuIFVzZSBEYXRlVGltZS5NaW5WYWx1ZSBmb3IgYXV0bzwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZW5kRGF0ZSI+Rml4ZWQgZW5kIGRhdGUuIFVzZSBEYXRlVGltZS5NYXhWYWx1ZSBmb3IgYXV0bzwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIEFkZERhdGVHcm91cGluZyhlRGF0ZUdyb3VwQnkgZ3JvdXBCeSwgRGF0ZVRpbWUgc3RhcnREYXRlLCBEYXRlVGltZSBlbmREYXRlKSB7CisgICAgQWRkRGF0ZUdyb3VwaW5nKGdyb3VwQnksIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgMSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgYSBkYXRlIGdyb3VwaW5nIG9uIHRoaXMgZmllbGQuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iZGF5cyI+TnVtYmVyIG9mIGRheXMgd2hlbiBncm91cGluZyBvbiBkYXlzPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJzdGFydERhdGUiPkZpeGVkIHN0YXJ0IGRhdGUuIFVzZSBEYXRlVGltZS5NaW5WYWx1ZSBmb3IgYXV0bzwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iZW5kRGF0ZSI+Rml4ZWQgZW5kIGRhdGUuIFVzZSBEYXRlVGltZS5NYXhWYWx1ZSBmb3IgYXV0bzwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIEFkZERhdGVHcm91cGluZyhpbnQgZGF5cywgRGF0ZVRpbWUgc3RhcnREYXRlLCBEYXRlVGltZSBlbmREYXRlKSB7CisgICAgQWRkRGF0ZUdyb3VwaW5nKGVEYXRlR3JvdXBCeS5EYXlzLCBzdGFydERhdGUsIGVuZERhdGUsIGRheXMpOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIEFkZERhdGVHcm91cGluZygKKyAgICAgIGVEYXRlR3JvdXBCeSBncm91cEJ5LAorICAgICAgRGF0ZVRpbWUgc3RhcnREYXRlLAorICAgICAgRGF0ZVRpbWUgZW5kRGF0ZSwKKyAgICAgIGludCBncm91cEludGVydmFsKSB7CisgICAgaWYgKGdyb3VwSW50ZXJ2YWwgPCAxIHx8IGdyb3VwSW50ZXJ2YWwgPj0gSW50MTYuTWF4VmFsdWUpIHsKKyAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJHcm91cCBpbnRlcnZhbCBpcyBvdXQgb2YgcmFuZ2UiKSk7CisgICAgfQorICAgIGlmIChncm91cEludGVydmFsID4gMSAmJiBncm91cEJ5ICE9IGVEYXRlR3JvdXBCeS5EYXlzKSB7CisgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJHcm91cCBpbnRlcnZhbCBpcyBjYW4gb25seSBiZSB1c2VkIHdoZW4gZ3JvdXBCeSBpcyBEYXlzIikpOworICAgIH0KKyAgICBWYWxpZGF0ZUdyb3VwaW5nKCk7CisKKyAgICBib29sIGZpcnN0RmllbGQgPSB0cnVlOworICAgIExpc3Q8RXhjZWxQaXZvdFRhYmxlRmllbGQ+IGZpZWxkcyA9IG5ldyBMaXN0PEV4Y2VsUGl2b3RUYWJsZUZpZWxkPigpOworICAgIC8vU2Vjb25kcworICAgIGlmICgoZ3JvdXBCeSAmIGVEYXRlR3JvdXBCeS5TZWNvbmRzKSA9PSBlRGF0ZUdyb3VwQnkuU2Vjb25kcykgeworICAgICAgZmllbGRzLkFkZChBZGRGaWVsZChlRGF0ZUdyb3VwQnkuU2Vjb25kcywgc3RhcnREYXRlLCBlbmREYXRlLCByZWYgZmlyc3RGaWVsZCkpOworICAgIH0KKyAgICAvL01pbnV0ZXMKKyAgICBpZiAoKGdyb3VwQnkgJiBlRGF0ZUdyb3VwQnkuTWludXRlcykgPT0gZURhdGVHcm91cEJ5Lk1pbnV0ZXMpIHsKKyAgICAgIGZpZWxkcy5BZGQoQWRkRmllbGQoZURhdGVHcm91cEJ5Lk1pbnV0ZXMsIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgcmVmIGZpcnN0RmllbGQpKTsKKyAgICB9CisgICAgLy9Ib3VycworICAgIGlmICgoZ3JvdXBCeSAmIGVEYXRlR3JvdXBCeS5Ib3VycykgPT0gZURhdGVHcm91cEJ5LkhvdXJzKSB7CisgICAgICBmaWVsZHMuQWRkKEFkZEZpZWxkKGVEYXRlR3JvdXBCeS5Ib3Vycywgc3RhcnREYXRlLCBlbmREYXRlLCByZWYgZmlyc3RGaWVsZCkpOworICAgIH0KKyAgICAvL0RheXMKKyAgICBpZiAoKGdyb3VwQnkgJiBlRGF0ZUdyb3VwQnkuRGF5cykgPT0gZURhdGVHcm91cEJ5LkRheXMpIHsKKyAgICAgIGZpZWxkcy5BZGQoQWRkRmllbGQoZURhdGVHcm91cEJ5LkRheXMsIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgcmVmIGZpcnN0RmllbGQsIGdyb3VwSW50ZXJ2YWwpKTsKKyAgICB9CisgICAgLy9Nb250aAorICAgIGlmICgoZ3JvdXBCeSAmIGVEYXRlR3JvdXBCeS5Nb250aHMpID09IGVEYXRlR3JvdXBCeS5Nb250aHMpIHsKKyAgICAgIGZpZWxkcy5BZGQoQWRkRmllbGQoZURhdGVHcm91cEJ5Lk1vbnRocywgc3RhcnREYXRlLCBlbmREYXRlLCByZWYgZmlyc3RGaWVsZCkpOworICAgIH0KKyAgICAvL1F1YXJ0ZXJzCisgICAgaWYgKChncm91cEJ5ICYgZURhdGVHcm91cEJ5LlF1YXJ0ZXJzKSA9PSBlRGF0ZUdyb3VwQnkuUXVhcnRlcnMpIHsKKyAgICAgIGZpZWxkcy5BZGQoQWRkRmllbGQoZURhdGVHcm91cEJ5LlF1YXJ0ZXJzLCBzdGFydERhdGUsIGVuZERhdGUsIHJlZiBmaXJzdEZpZWxkKSk7CisgICAgfQorICAgIC8vWWVhcnMKKyAgICBpZiAoKGdyb3VwQnkgJiBlRGF0ZUdyb3VwQnkuWWVhcnMpID09IGVEYXRlR3JvdXBCeS5ZZWFycykgeworICAgICAgZmllbGRzLkFkZChBZGRGaWVsZChlRGF0ZUdyb3VwQnkuWWVhcnMsIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgcmVmIGZpcnN0RmllbGQpKTsKKyAgICB9CisKKyAgICBpZiAoZmllbGRzLkNvdW50ID4gMSkgeworICAgICAgX2NhY2hlRmllbGRIZWxwZXIuU2V0WG1sTm9kZVN0cmluZygiZDpmaWVsZEdyb3VwL0BwYXIiLCAoX3RhYmxlLkZpZWxkcy5Db3VudCAtIDEpLlRvU3RyaW5nKCkpOworICAgIH0KKyAgICBpZiAoZ3JvdXBJbnRlcnZhbCAhPSAxKSB7CisgICAgICBfY2FjaGVGaWVsZEhlbHBlci5TZXRYbWxOb2RlU3RyaW5nKAorICAgICAgICAgICJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0Bncm91cEludGVydmFsIiwKKyAgICAgICAgICBncm91cEludGVydmFsLlRvU3RyaW5nKCkpOworICAgIH0gZWxzZSB7CisgICAgICBfY2FjaGVGaWVsZEhlbHBlci5EZWxldGVOb2RlKCJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0Bncm91cEludGVydmFsIik7CisgICAgfQorICAgIF9pdGVtcyA9IG51bGw7CisgIH0KKworICBwcml2YXRlIHZvaWQgVmFsaWRhdGVHcm91cGluZygpIHsKKyAgICBpZiAoIShJc0NvbHVtbkZpZWxkIHx8IElzUm93RmllbGQpKSB7CisgICAgICB0aHJvdyAobmV3KCJGaWVsZCBtdXN0IGJlIGEgcm93IG9yIGNvbHVtbiBmaWVsZCIpKTsKKyAgICB9CisgICAgZm9yZWFjaCAodmFyIGZpZWxkIGluIF90YWJsZS5GaWVsZHMpIHsKKyAgICAgIGlmIChmaWVsZC5Hcm91cGluZyAhPSBudWxsKSB7CisgICAgICAgIHRocm93IChuZXcoIkdyb3VwaW5nIGFscmVhZHkgZXhpc3RzIikpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaXZhdGUgRXhjZWxQaXZvdFRhYmxlRmllbGQgQWRkRmllbGQoCisgICAgICBlRGF0ZUdyb3VwQnkgZ3JvdXBCeSwKKyAgICAgIERhdGVUaW1lIHN0YXJ0RGF0ZSwKKyAgICAgIERhdGVUaW1lIGVuZERhdGUsCisgICAgICByZWYgYm9vbCBmaXJzdEZpZWxkKSB7CisgICAgcmV0dXJuIEFkZEZpZWxkKGdyb3VwQnksIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgcmVmIGZpcnN0RmllbGQsIDEpOworICB9CisKKyAgcHJpdmF0ZSBFeGNlbFBpdm90VGFibGVGaWVsZCBBZGRGaWVsZCgKKyAgICAgIGVEYXRlR3JvdXBCeSBncm91cEJ5LAorICAgICAgRGF0ZVRpbWUgc3RhcnREYXRlLAorICAgICAgRGF0ZVRpbWUgZW5kRGF0ZSwKKyAgICAgIHJlZiBib29sIGZpcnN0RmllbGQsCisgICAgICBpbnQgaW50ZXJ2YWwpIHsKKyAgICBpZiAoZmlyc3RGaWVsZCA9PSBmYWxzZSkgeworICAgICAgLy9QaXZvdCBmaWVsZAorICAgICAgdmFyIHRvcE5vZGUgPSBfdGFibGUuUGl2b3RUYWJsZVhtbC5TZWxlY3RTaW5nbGVOb2RlKAorICAgICAgICAgICIvL2Q6cGl2b3RGaWVsZHMiLAorICAgICAgICAgIF90YWJsZS5OYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgIHZhciBmaWVsZE5vZGUgPSBfdGFibGUuUGl2b3RUYWJsZVhtbC5DcmVhdGVFbGVtZW50KCJwaXZvdEZpZWxkIiwgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKTsKKyAgICAgIGZpZWxkTm9kZS5TZXRBdHRyaWJ1dGUoImNvbXBhY3QiLCAiMCIpOworICAgICAgZmllbGROb2RlLlNldEF0dHJpYnV0ZSgib3V0bGluZSIsICIwIik7CisgICAgICBmaWVsZE5vZGUuU2V0QXR0cmlidXRlKCJzaG93QWxsIiwgIjAiKTsKKyAgICAgIGZpZWxkTm9kZS5TZXRBdHRyaWJ1dGUoImRlZmF1bHRTdWJ0b3RhbCIsICIwIik7CisgICAgICB0b3BOb2RlLkFwcGVuZENoaWxkKGZpZWxkTm9kZSk7CisKKyAgICAgIHZhciBmaWVsZCA9IG5ldyBFeGNlbFBpdm90VGFibGVGaWVsZCgKKyAgICAgICAgICBfdGFibGUuTmFtZVNwYWNlTWFuYWdlciwKKyAgICAgICAgICBmaWVsZE5vZGUsCisgICAgICAgICAgX3RhYmxlLAorICAgICAgICAgIF90YWJsZS5GaWVsZHMuQ291bnQsCisgICAgICAgICAgSW5kZXgpOworICAgICAgZmllbGQuRGF0ZUdyb3VwaW5nID0gZ3JvdXBCeTsKKworICAgICAgWG1sTm9kZSByb3dDb2xGaWVsZHM7CisgICAgICBpZiAoSXNSb3dGaWVsZCkgeworICAgICAgICByb3dDb2xGaWVsZHMgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoIi4uLy4uL2Q6cm93RmllbGRzIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICB9IGVsc2UgeworICAgICAgICByb3dDb2xGaWVsZHMgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoIi4uLy4uL2Q6Y29sRmllbGRzIiwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICB9CisKKyAgICAgIGludCBmaWVsZEluZGV4LAorICAgICAgICAgIGluZGV4ID0gMDsKKyAgICAgIGZvcmVhY2ggKFhtbEVsZW1lbnQgcm93ZmllbGQgaW4gcm93Q29sRmllbGRzLkNoaWxkTm9kZXMpIHsKKyAgICAgICAgaWYgKGludC5UcnlQYXJzZShyb3dmaWVsZC5HZXRBdHRyaWJ1dGUoIngiKSwgb3V0IGZpZWxkSW5kZXgpKSB7CisgICAgICAgICAgaWYgKF90YWJsZS5GaWVsZHNbZmllbGRJbmRleF0uQmFzZUluZGV4ID09IEJhc2VJbmRleCkgeworICAgICAgICAgICAgdmFyIG5ld0VsZW1lbnQgPSByb3dDb2xGaWVsZHMuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KAorICAgICAgICAgICAgICAgICJmaWVsZCIsCisgICAgICAgICAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKTsKKyAgICAgICAgICAgIG5ld0VsZW1lbnQuU2V0QXR0cmlidXRlKCJ4IiwgZmllbGQuSW5kZXguVG9TdHJpbmcoKSk7CisgICAgICAgICAgICByb3dDb2xGaWVsZHMuSW5zZXJ0QmVmb3JlKG5ld0VsZW1lbnQsIHJvd2ZpZWxkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbmRleCsrOworICAgICAgfQorCisgICAgICBpZiAoSXNSb3dGaWVsZCkgeworICAgICAgICBfdGFibGUuUm93RmllbGRzLkluc2VydChmaWVsZCwgaW5kZXgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgX3RhYmxlLkNvbHVtbkZpZWxkcy5JbnNlcnQoZmllbGQsIGluZGV4KTsKKyAgICAgIH0KKworICAgICAgX3RhYmxlLkZpZWxkcy5BZGRJbnRlcm5hbChmaWVsZCk7CisKKyAgICAgIEFkZENhY2hlRmllbGQoZmllbGQsIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgaW50ZXJ2YWwpOworICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKyAgICBmaXJzdEZpZWxkID0gZmFsc2U7CisgICAgRGF0ZUdyb3VwaW5nID0gZ3JvdXBCeTsKKyAgICBDb21wYWN0ID0gZmFsc2U7CisgICAgU2V0RGF0ZUdyb3VwKGdyb3VwQnksIHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgaW50ZXJ2YWwpOworICAgIHJldHVybiB0aGlzOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIEFkZENhY2hlRmllbGQoCisgICAgICBFeGNlbFBpdm90VGFibGVGaWVsZCBmaWVsZCwKKyAgICAgIERhdGVUaW1lIHN0YXJ0RGF0ZSwKKyAgICAgIERhdGVUaW1lIGVuZERhdGUsCisgICAgICBpbnQgaW50ZXJ2YWwpIHsKKyAgICAvL0FkZCBDYWNoZSBkZWZpbml0aW9uIGZpZWxkLgorICAgIHZhciBjYWNoZVRvcE5vZGUgPSBfdGFibGUuQ2FjaGVEZWZpbml0aW9uLkNhY2hlRGVmaW5pdGlvblhtbC5TZWxlY3RTaW5nbGVOb2RlKAorICAgICAgICAiLy9kOmNhY2hlRmllbGRzIiwKKyAgICAgICAgX3RhYmxlLk5hbWVTcGFjZU1hbmFnZXIpOworICAgIHZhciBjYWNoZUZpZWxkTm9kZSA9IF90YWJsZS5DYWNoZURlZmluaXRpb24uQ2FjaGVEZWZpbml0aW9uWG1sLkNyZWF0ZUVsZW1lbnQoCisgICAgICAgICJjYWNoZUZpZWxkIiwKKyAgICAgICAgRXhjZWxQYWNrYWdlLl9zY2hlbWFNYWluKTsKKworICAgIGNhY2hlRmllbGROb2RlLlNldEF0dHJpYnV0ZSgibmFtZSIsIGZpZWxkLkRhdGVHcm91cGluZy5Ub1N0cmluZygpKTsKKyAgICBjYWNoZUZpZWxkTm9kZS5TZXRBdHRyaWJ1dGUoImRhdGFiYXNlRmllbGQiLCAiMCIpOworICAgIGNhY2hlVG9wTm9kZS5BcHBlbmRDaGlsZChjYWNoZUZpZWxkTm9kZSk7CisgICAgZmllbGQuU2V0Q2FjaGVGaWVsZE5vZGUoY2FjaGVGaWVsZE5vZGUpOworCisgICAgZmllbGQuU2V0RGF0ZUdyb3VwKGZpZWxkLkRhdGVHcm91cGluZywgc3RhcnREYXRlLCBlbmREYXRlLCBpbnRlcnZhbCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUZpZWxkQ29sbGVjdGlvbi5jcyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUZpZWxkQ29sbGVjdGlvbi5jcwppbmRleCA5YjczNmNlLi5lNjBlNzM1IDEwMDY0NAotLS0gYS9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb24uY3MKKysrIGIvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywzMTAgKzEzLDI5MSBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyMS1NQVItMjAxMQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogdXNpbmcgU3lzdGVtOwordXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwogdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIFN5c3RlbS5YbWw7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGUKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEJhc2UgY29sbGVjdGlvbiBjbGFzcyBmb3IgcGl2b3R0YWJsZSBmaWVsZHMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPjwvdHlwZXBhcmFtPgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb25CYXNlPFQ+IDogSUVudW1lcmFibGU8VD4KLSAgICB7Ci0gICAgICAgIHByb3RlY3RlZCBFeGNlbFBpdm90VGFibGUgX3RhYmxlOwotICAgICAgICBpbnRlcm5hbCBMaXN0PFQ+IF9saXN0ID0gbmV3IExpc3Q8VD4oKTsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uQmFzZShFeGNlbFBpdm90VGFibGUgdGFibGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF90YWJsZSA9IHRhYmxlOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBJRW51bWVyYXRvcjxUPiBHZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIF9saXN0LkdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZTsKIAotICAgICAgICBTeXN0ZW0uQ29sbGVjdGlvbnMuSUVudW1lcmF0b3IgU3lzdGVtLkNvbGxlY3Rpb25zLklFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gX2xpc3QuR2V0RW51bWVyYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBpbnQgQ291bnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIF9saXN0LkNvdW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHZvaWQgQWRkSW50ZXJuYWwoVCBmaWVsZCkKLSAgICAgICAgewotICAgICAgICAgICAgX2xpc3QuQWRkKGZpZWxkKTsKLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCB2b2lkIENsZWFyKCkKLSAgICAgICAgewotICAgICAgICAgICAgX2xpc3QuQ2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgVCB0aGlzW2ludCBJbmRleF0KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKEluZGV4IDwgMCB8fCBJbmRleCA+PSBfbGlzdC5Db3VudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJJbmRleCBvdXQgb2YgcmFuZ2UiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBfbGlzdFtJbmRleF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBCYXNlIGNvbGxlY3Rpb24gY2xhc3MgZm9yIHBpdm90dGFibGUgZmllbGRzCisvLy8gPC9zdW1tYXJ5PgorLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+PC90eXBlcGFyYW0+CitwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uQmFzZTxUPiA6IElFbnVtZXJhYmxlPFQ+IHsKKyAgcHJvdGVjdGVkIEV4Y2VsUGl2b3RUYWJsZSBfdGFibGU7CisgIGludGVybmFsIExpc3Q8VD4gX2xpc3QgPSBuZXcoKTsKKworICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb25CYXNlKEV4Y2VsUGl2b3RUYWJsZSB0YWJsZSkgeworICAgIF90YWJsZSA9IHRhYmxlOworICB9CisKKyAgcHVibGljIElFbnVtZXJhdG9yPFQ+IEdldEVudW1lcmF0b3IoKSB7CisgICAgcmV0dXJuIF9saXN0LkdldEVudW1lcmF0b3IoKTsKKyAgfQorCisgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKSB7CisgICAgcmV0dXJuIF9saXN0LkdldEVudW1lcmF0b3IoKTsKKyAgfQorCisgIHB1YmxpYyBpbnQgQ291bnQgPT4gX2xpc3QuQ291bnQ7CisKKyAgaW50ZXJuYWwgdm9pZCBBZGRJbnRlcm5hbChUIGZpZWxkKSB7CisgICAgX2xpc3QuQWRkKGZpZWxkKTsKKyAgfQorCisgIGludGVybmFsIHZvaWQgQ2xlYXIoKSB7CisgICAgX2xpc3QuQ2xlYXIoKTsKKyAgfQorCisgIHB1YmxpYyBUIHRoaXNbaW50IGluZGV4XSB7CisgICAgZ2V0IHsKKyAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gX2xpc3QuQ291bnQpIHsKKyAgICAgICAgdGhyb3cgKG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oIkluZGV4IG91dCBvZiByYW5nZSIpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBfbGlzdFtpbmRleF07CiAgICAgfQotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb24gOiBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb25CYXNlPEV4Y2VsUGl2b3RUYWJsZUZpZWxkPgotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uKEV4Y2VsUGl2b3RUYWJsZSB0YWJsZSwgc3RyaW5nIHRvcE5vZGUpIDoKLSAgICAgICAgICAgIGJhc2UodGFibGUpCi0gICAgICAgIHsKKyAgfQorfQogCitwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uCisgICAgOiBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb25CYXNlPEV4Y2VsUGl2b3RUYWJsZUZpZWxkPiB7CisgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZUZpZWxkQ29sbGVjdGlvbihFeGNlbFBpdm90VGFibGUgdGFibGUsIHN0cmluZyB0b3BOb2RlKQorICAgICAgOiBiYXNlKHRhYmxlKSB7fQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEluZGV4ZXIgYnkgbmFtZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVGaWVsZCB0aGlzW3N0cmluZyBuYW1lXSB7CisgICAgZ2V0IHsKKyAgICAgIGZvcmVhY2ggKHZhciBmaWVsZCBpbiBfbGlzdCkgeworICAgICAgICBpZiAoZmllbGQuTmFtZS5FcXVhbHMobmFtZSwgU3RyaW5nQ29tcGFyaXNvbi5JbnZhcmlhbnRDdWx0dXJlSWdub3JlQ2FzZSkpIHsKKyAgICAgICAgICByZXR1cm4gZmllbGQ7CiAgICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5kZXhlciBieSBuYW1lCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZUZpZWxkIHRoaXNbc3RyaW5nIG5hbWVdCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmaWVsZCBpbiBfbGlzdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5OYW1lLkVxdWFscyhuYW1lLFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmllbGQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgZGF0ZSBncm91cCBmaWVsZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJHcm91cEJ5Ij5UaGUgdHlwZSBvZiBncm91cGluZzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgbWF0Y2hpbmcgZmllbGQuIElmIG5vbmUgaXMgZm91bmQgbnVsbCBpcyByZXR1cm5lZDwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZUZpZWxkIEdldERhdGVHcm91cEZpZWxkKGVEYXRlR3JvdXBCeSBHcm91cEJ5KQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgZmxkIGluIF9saXN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmbGQuR3JvdXBpbmcgaXMgRXhjZWxQaXZvdFRhYmxlRmllbGREYXRlR3JvdXAgJiYgKCgoRXhjZWxQaXZvdFRhYmxlRmllbGREYXRlR3JvdXApZmxkLkdyb3VwaW5nKS5Hcm91cEJ5KSA9PSBHcm91cEJ5KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRoZSBudW1lcmljIGdyb3VwIGZpZWxkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIG1hdGNoaW5nIGZpZWxkLiBJZiBub25lIGlzIGZvdW5kIG51bGwgaXMgcmV0dXJuZWQ8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBFeGNlbFBpdm90VGFibGVGaWVsZCBHZXROdW1lcmljR3JvdXBGaWVsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmbGQgaW4gX2xpc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZsZC5Hcm91cGluZyBpcyBFeGNlbFBpdm90VGFibGVGaWVsZE51bWVyaWNHcm91cCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmbGQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiBudWxsOwogICAgIH0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENvbGxlY3Rpb24gY2xhc3MgZm9yIFJvdyBhbmQgY29sdW1uIGZpZWxkcyBpbiBhIFBpdm90dGFibGUgCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdFRhYmxlUm93Q29sdW1uRmllbGRDb2xsZWN0aW9uIDogRXhjZWxQaXZvdFRhYmxlRmllbGRDb2xsZWN0aW9uQmFzZTxFeGNlbFBpdm90VGFibGVGaWVsZD4KLSAgICB7Ci0gICAgICAgIGludGVybmFsIHN0cmluZyBfdG9wTm9kZTsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlUm93Q29sdW1uRmllbGRDb2xsZWN0aW9uKEV4Y2VsUGl2b3RUYWJsZSB0YWJsZSwgc3RyaW5nIHRvcE5vZGUpIDoKLSAgICAgICAgICAgIGJhc2UodGFibGUpCi0JICAgIHsKLSAgICAgICAgICAgIF90b3BOb2RlPXRvcE5vZGU7Ci0JICAgIH0KKyAgfQogCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZCBhIG5ldyByb3cvY29sdW1uIGZpZWxkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iRmllbGQiPlRoZSBmaWVsZDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgbmV3IGZpZWxkPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlRmllbGQgQWRkKEV4Y2VsUGl2b3RUYWJsZUZpZWxkIEZpZWxkKQotICAgICAgICB7Ci0gICAgICAgICAgICBTZXRGbGFnKEZpZWxkLCB0cnVlKTsKLSAgICAgICAgICAgIF9saXN0LkFkZChGaWVsZCk7Ci0gICAgICAgICAgICByZXR1cm4gRmllbGQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5zZXJ0IGEgbmV3IHJvdy9jb2x1bW4gZmllbGQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJGaWVsZCI+VGhlIGZpZWxkPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJJbmRleCI+VGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgZmllbGQ8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIG5ldyBmaWVsZDwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlRmllbGQgSW5zZXJ0KEV4Y2VsUGl2b3RUYWJsZUZpZWxkIEZpZWxkLCBpbnQgSW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldEZsYWcoRmllbGQsIHRydWUpOwotICAgICAgICAgICAgX2xpc3QuSW5zZXJ0KEluZGV4LCBGaWVsZCk7Ci0gICAgICAgICAgICByZXR1cm4gRmllbGQ7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFNldEZsYWcoRXhjZWxQaXZvdFRhYmxlRmllbGQgZmllbGQsIGJvb2wgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaCAoX3RvcE5vZGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSAicm93RmllbGRzIjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzQ29sdW1uRmllbGQgfHwgZmllbGQuSXNQYWdlRmllbGQpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93KG5ldyBFeGNlcHRpb24oIlRoaXMgZmllbGQgaXMgYSBjb2x1bW4gb3IgcGFnZSBmaWVsZC4gQ2FuJ3QgYWRkIGl0IHRvIHRoZSBSb3dGaWVsZHMgY29sbGVjdGlvbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaWVsZC5Jc1Jvd0ZpZWxkID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGZpZWxkLkF4aXMgPSBlUGl2b3RGaWVsZEF4aXMuUm93OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICJjb2xGaWVsZHMiOgotICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNSb3dGaWVsZCB8fCBmaWVsZC5Jc1BhZ2VGaWVsZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIlRoaXMgZmllbGQgaXMgYSByb3cgb3IgcGFnZSBmaWVsZC4gQ2FuJ3QgYWRkIGl0IHRvIHRoZSBDb2x1bW5GaWVsZHMgY29sbGVjdGlvbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmaWVsZC5Jc0NvbHVtbkZpZWxkID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGZpZWxkLkF4aXMgPSBlUGl2b3RGaWVsZEF4aXMuQ29sdW1uOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlICJwYWdlRmllbGRzIjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLklzQ29sdW1uRmllbGQgfHwgZmllbGQuSXNSb3dGaWVsZCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKG5ldyBFeGNlcHRpb24oIkZpZWxkIGlzIGEgY29sdW1uIG9yIHJvdyBmaWVsZC4gQ2FuJ3QgYWRkIGl0IHRvIHRoZSBQYWdlRmllbGRzIGNvbGxlY3Rpb24iKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKF90YWJsZS5BZGRyZXNzLl9mcm9tUm93IDwgMykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KCJBIHBpdm90IHRhYmxlIHdpdGggcGFnZSBmaWVsZHMgbXVzdCBiZSBsb2NhdGVkIGFib3ZlIHJvdyAzLiBDdXJyZW5jdCBsb2NhdGlvbiBpcyB7MH0iLCBfdGFibGUuQWRkcmVzcy5BZGRyZXNzKSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpZWxkLklzUGFnZUZpZWxkID0gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGZpZWxkLkF4aXMgPSBlUGl2b3RGaWVsZEF4aXMuUGFnZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAiZGF0YUZpZWxkcyI6Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZW1vdmUgYSBmaWVsZAotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9IkZpZWxkIj48L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmUoRXhjZWxQaXZvdFRhYmxlRmllbGQgRmllbGQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCFfbGlzdC5Db250YWlucyhGaWVsZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCBub3QgaW4gY29sbGVjdGlvbiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2V0RmxhZyhGaWVsZCwgZmFsc2UpOyAgICAgICAgICAgIAotICAgICAgICAgICAgX2xpc3QuUmVtb3ZlKEZpZWxkKTsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZW1vdmUgYSBmaWVsZCBhdCBhIHNwZWNpZmljIHBvc2l0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iSW5kZXgiPjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZUF0KGludCBJbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEluZGV4ID4gLTEgJiYgSW5kZXggPCBfbGlzdC5Db3VudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyhuZXcgSW5kZXhPdXRPZlJhbmdlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2V0RmxhZyhfbGlzdFtJbmRleF0sIGZhbHNlKTsKLSAgICAgICAgICAgIF9saXN0LlJlbW92ZUF0KEluZGV4KTsgICAgICAKLSAgICAgICAgfQorICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZXR1cm5zIHRoZSBkYXRlIGdyb3VwIGZpZWxkLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Imdyb3VwQnkiPlRoZSB0eXBlIG9mIGdyb3VwaW5nPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPlRoZSBtYXRjaGluZyBmaWVsZC4gSWYgbm9uZSBpcyBmb3VuZCBudWxsIGlzIHJldHVybmVkPC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlRmllbGQgR2V0RGF0ZUdyb3VwRmllbGQoZURhdGVHcm91cEJ5IGdyb3VwQnkpIHsKKyAgICBmb3JlYWNoICh2YXIgZmxkIGluIF9saXN0KSB7CisgICAgICBpZiAoZmxkLkdyb3VwaW5nIGlzIEV4Y2VsUGl2b3RUYWJsZUZpZWxkRGF0ZUdyb3VwCisgICAgICAgICAgJiYgKCgoRXhjZWxQaXZvdFRhYmxlRmllbGREYXRlR3JvdXApZmxkLkdyb3VwaW5nKS5Hcm91cEJ5KSA9PSBncm91cEJ5KSB7CisgICAgICAgIHJldHVybiBmbGQ7CisgICAgICB9CiAgICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQ29sbGVjdGlvbiBjbGFzcyBmb3IgZGF0YSBmaWVsZHMgaW4gYSBQaXZvdHRhYmxlIAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZENvbGxlY3Rpb24gOiBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb25CYXNlPEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZD4KLSAgICB7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZENvbGxlY3Rpb24oRXhjZWxQaXZvdFRhYmxlIHRhYmxlKSA6Ci0gICAgICAgICAgICBiYXNlKHRhYmxlKQotICAgICAgICB7CisgICAgcmV0dXJuIG51bGw7CisgIH0KIAotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZCBhIG5ldyBkYXRhZmllbGQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWVsZCI+VGhlIGZpZWxkPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBuZXcgZGF0YWZpZWxkPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlRGF0YUZpZWxkIEFkZChFeGNlbFBpdm90VGFibGVGaWVsZCBmaWVsZCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGRhdGFGaWVsZHNOb2RlID0gZmllbGQuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKCIuLi8uLi9kOmRhdGFGaWVsZHMiLCBmaWVsZC5OYW1lU3BhY2VNYW5hZ2VyKTsKLSAgICAgICAgICAgIGlmIChkYXRhRmllbGRzTm9kZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF90YWJsZS5DcmVhdGVOb2RlKCJkOmRhdGFGaWVsZHMiKTsKLSAgICAgICAgICAgICAgICBkYXRhRmllbGRzTm9kZSA9IGZpZWxkLlRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgiLi4vLi4vZDpkYXRhRmllbGRzIiwgZmllbGQuTmFtZVNwYWNlTWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFhtbEVsZW1lbnQgbm9kZSA9IF90YWJsZS5QaXZvdFRhYmxlWG1sLkNyZWF0ZUVsZW1lbnQoImRhdGFGaWVsZCIsIEV4Y2VsUGFja2FnZS5zY2hlbWFNYWluKTsKLSAgICAgICAgICAgIG5vZGUuU2V0QXR0cmlidXRlKCJmbGQiLCBmaWVsZC5JbmRleC5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIGRhdGFGaWVsZHNOb2RlLkFwcGVuZENoaWxkKG5vZGUpOwotCi0gICAgICAgICAgICAvL1htbEVsZW1lbnQgbm9kZSA9IGZpZWxkLkFwcGVuZEZpZWxkKGRhdGFGaWVsZHNOb2RlLCBmaWVsZC5JbmRleCwgImRhdGFGaWVsZCIsICJmbGQiKTsKLSAgICAgICAgICAgIGZpZWxkLlNldFhtbE5vZGVCb29sKCJAZGF0YUZpZWxkIiwgdHJ1ZSxmYWxzZSk7Ci0KLSAgICAgICAgICAgIHZhciBkYXRhRmllbGQgPSBuZXcgRXhjZWxQaXZvdFRhYmxlRGF0YUZpZWxkKGZpZWxkLk5hbWVTcGFjZU1hbmFnZXIsIG5vZGUsIGZpZWxkKTsKLSAgICAgICAgICAgIFZhbGlkYXRlRHVwTmFtZShkYXRhRmllbGQpOwotCi0gICAgICAgICAgICBfbGlzdC5BZGQoZGF0YUZpZWxkKTsKLSAgICAgICAgICAgIHJldHVybiBkYXRhRmllbGQ7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFZhbGlkYXRlRHVwTmFtZShFeGNlbFBpdm90VGFibGVEYXRhRmllbGQgZGF0YUZpZWxkKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihFeGlzdHNEZk5hbWUoZGF0YUZpZWxkLkZpZWxkLk5hbWUsIG51bGwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IDI7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5hbWUgPSBkYXRhRmllbGQuRmllbGQuTmFtZSArICJfIiArIGluZGV4KysuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKEV4aXN0c0RmTmFtZShuYW1lLG51bGwpKTsKLSAgICAgICAgICAgICAgICBkYXRhRmllbGQuTmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBib29sIEV4aXN0c0RmTmFtZShzdHJpbmcgbmFtZSwgRXhjZWxQaXZvdFRhYmxlRGF0YUZpZWxkIGRhdGFmaWVsZCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGRmIGluIF9saXN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICgoKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShkZi5OYW1lKSAmJiBkZi5OYW1lLkVxdWFscyhuYW1lLCBTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSB8fAotICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy5Jc051bGxPckVtcHR5KGRmLk5hbWUpICYmIGRmLkZpZWxkLk5hbWUuRXF1YWxzKG5hbWUsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKSkpICYmIGRhdGFmaWVsZCAhPSBkZikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZW1vdmUgYSBkYXRhZmllbGQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhRmllbGQiPjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZShFeGNlbFBpdm90VGFibGVEYXRhRmllbGQgZGF0YUZpZWxkKQotICAgICAgICB7Ci0gICAgICAgICAgICBYbWxFbGVtZW50IG5vZGUgPSBkYXRhRmllbGQuRmllbGQuVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKHN0cmluZy5Gb3JtYXQoIi4uLy4uL2Q6ZGF0YUZpZWxkcy9kOmRhdGFGaWVsZFtAZmxkPXswfV0iLCBkYXRhRmllbGQuSW5kZXgpLCBkYXRhRmllbGQuTmFtZVNwYWNlTWFuYWdlcikgYXMgWG1sRWxlbWVudDsKLSAgICAgICAgICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKG5vZGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2xpc3QuUmVtb3ZlKGRhdGFGaWVsZCk7Ci0gICAgICAgIH0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJucyB0aGUgbnVtZXJpYyBncm91cCBmaWVsZC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxyZXR1cm5zPlRoZSBtYXRjaGluZyBmaWVsZC4gSWYgbm9uZSBpcyBmb3VuZCBudWxsIGlzIHJldHVybmVkPC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlRmllbGQgR2V0TnVtZXJpY0dyb3VwRmllbGQoKSB7CisgICAgZm9yZWFjaCAodmFyIGZsZCBpbiBfbGlzdCkgeworICAgICAgaWYgKGZsZC5Hcm91cGluZyBpcyBFeGNlbFBpdm90VGFibGVGaWVsZE51bWVyaWNHcm91cCkgeworICAgICAgICByZXR1cm4gZmxkOworICAgICAgfQogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgcmV0dXJuIG51bGw7CisgIH0KK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIENvbGxlY3Rpb24gY2xhc3MgZm9yIFJvdyBhbmQgY29sdW1uIGZpZWxkcyBpbiBhIFBpdm90dGFibGUKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdFRhYmxlUm93Q29sdW1uRmllbGRDb2xsZWN0aW9uCisgICAgOiBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb25CYXNlPEV4Y2VsUGl2b3RUYWJsZUZpZWxkPiB7CisgIGludGVybmFsIHN0cmluZyBfdG9wTm9kZTsKKworICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVSb3dDb2x1bW5GaWVsZENvbGxlY3Rpb24oRXhjZWxQaXZvdFRhYmxlIHRhYmxlLCBzdHJpbmcgdG9wTm9kZSkKKyAgICAgIDogYmFzZSh0YWJsZSkgeworICAgIF90b3BOb2RlID0gdG9wTm9kZTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEFkZCBhIG5ldyByb3cvY29sdW1uIGZpZWxkCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iZmllbGQiPlRoZSBmaWVsZDwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UaGUgbmV3IGZpZWxkPC9yZXR1cm5zPgorICBwdWJsaWMgRXhjZWxQaXZvdFRhYmxlRmllbGQgQWRkKEV4Y2VsUGl2b3RUYWJsZUZpZWxkIGZpZWxkKSB7CisgICAgU2V0RmxhZyhmaWVsZCwgdHJ1ZSk7CisgICAgX2xpc3QuQWRkKGZpZWxkKTsKKyAgICByZXR1cm4gZmllbGQ7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbnNlcnQgYSBuZXcgcm93L2NvbHVtbiBmaWVsZAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImZpZWxkIj5UaGUgZmllbGQ8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij5UaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSBmaWVsZDwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UaGUgbmV3IGZpZWxkPC9yZXR1cm5zPgorICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVGaWVsZCBJbnNlcnQoRXhjZWxQaXZvdFRhYmxlRmllbGQgZmllbGQsIGludCBpbmRleCkgeworICAgIFNldEZsYWcoZmllbGQsIHRydWUpOworICAgIF9saXN0Lkluc2VydChpbmRleCwgZmllbGQpOworICAgIHJldHVybiBmaWVsZDsKKyAgfQorCisgIHByaXZhdGUgdm9pZCBTZXRGbGFnKEV4Y2VsUGl2b3RUYWJsZUZpZWxkIGZpZWxkLCBib29sIHZhbHVlKSB7CisgICAgc3dpdGNoIChfdG9wTm9kZSkgeworICAgICAgY2FzZSAicm93RmllbGRzIjoKKyAgICAgICAgaWYgKGZpZWxkLklzQ29sdW1uRmllbGQgfHwgZmllbGQuSXNQYWdlRmllbGQpIHsKKyAgICAgICAgICB0aHJvdyAobmV3KAorICAgICAgICAgICAgICAgICAgIlRoaXMgZmllbGQgaXMgYSBjb2x1bW4gb3IgcGFnZSBmaWVsZC4gQ2FuJ3QgYWRkIGl0IHRvIHRoZSBSb3dGaWVsZHMgY29sbGVjdGlvbiIpKTsKKyAgICAgICAgfQorICAgICAgICBmaWVsZC5Jc1Jvd0ZpZWxkID0gdmFsdWU7CisgICAgICAgIGZpZWxkLkF4aXMgPSBlUGl2b3RGaWVsZEF4aXMuUm93OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgImNvbEZpZWxkcyI6CisgICAgICAgIGlmIChmaWVsZC5Jc1Jvd0ZpZWxkIHx8IGZpZWxkLklzUGFnZUZpZWxkKSB7CisgICAgICAgICAgdGhyb3cgKG5ldygKKyAgICAgICAgICAgICAgICAgICJUaGlzIGZpZWxkIGlzIGEgcm93IG9yIHBhZ2UgZmllbGQuIENhbid0IGFkZCBpdCB0byB0aGUgQ29sdW1uRmllbGRzIGNvbGxlY3Rpb24iKSk7CisgICAgICAgIH0KKyAgICAgICAgZmllbGQuSXNDb2x1bW5GaWVsZCA9IHZhbHVlOworICAgICAgICBmaWVsZC5BeGlzID0gZVBpdm90RmllbGRBeGlzLkNvbHVtbjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICJwYWdlRmllbGRzIjoKKyAgICAgICAgaWYgKGZpZWxkLklzQ29sdW1uRmllbGQgfHwgZmllbGQuSXNSb3dGaWVsZCkgeworICAgICAgICAgIHRocm93IChuZXcoIkZpZWxkIGlzIGEgY29sdW1uIG9yIHJvdyBmaWVsZC4gQ2FuJ3QgYWRkIGl0IHRvIHRoZSBQYWdlRmllbGRzIGNvbGxlY3Rpb24iKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF90YWJsZS5BZGRyZXNzLl9mcm9tUm93IDwgMykgeworICAgICAgICAgIHRocm93IChuZXcoCisgICAgICAgICAgICAgICAgICBzdHJpbmcuRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICJBIHBpdm90IHRhYmxlIHdpdGggcGFnZSBmaWVsZHMgbXVzdCBiZSBsb2NhdGVkIGFib3ZlIHJvdyAzLiBDdXJyZW5jdCBsb2NhdGlvbiBpcyB7MH0iLAorICAgICAgICAgICAgICAgICAgICAgIF90YWJsZS5BZGRyZXNzLkFkZHJlc3MpKSk7CisgICAgICAgIH0KKyAgICAgICAgZmllbGQuSXNQYWdlRmllbGQgPSB2YWx1ZTsKKyAgICAgICAgZmllbGQuQXhpcyA9IGVQaXZvdEZpZWxkQXhpcy5QYWdlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgImRhdGFGaWVsZHMiOgorCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJlbW92ZSBhIGZpZWxkCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iZmllbGQiPjwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIFJlbW92ZShFeGNlbFBpdm90VGFibGVGaWVsZCBmaWVsZCkgeworICAgIGlmICghX2xpc3QuQ29udGFpbnMoZmllbGQpKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkIG5vdCBpbiBjb2xsZWN0aW9uIik7CisgICAgfQorICAgIFNldEZsYWcoZmllbGQsIGZhbHNlKTsKKyAgICBfbGlzdC5SZW1vdmUoZmllbGQpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmVtb3ZlIGEgZmllbGQgYXQgYSBzcGVjaWZpYyBwb3NpdGlvbgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij48L3BhcmFtPgorICBwdWJsaWMgdm9pZCBSZW1vdmVBdChpbnQgaW5kZXgpIHsKKyAgICBpZiAoaW5kZXggPiAtMSAmJiBpbmRleCA8IF9saXN0LkNvdW50KSB7CisgICAgICB0aHJvdyAobmV3IEluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbigpKTsKKyAgICB9CisgICAgU2V0RmxhZyhfbGlzdFtpbmRleF0sIGZhbHNlKTsKKyAgICBfbGlzdC5SZW1vdmVBdChpbmRleCk7CisgIH0KK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIENvbGxlY3Rpb24gY2xhc3MgZm9yIGRhdGEgZmllbGRzIGluIGEgUGl2b3R0YWJsZQorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbFBpdm90VGFibGVEYXRhRmllbGRDb2xsZWN0aW9uCisgICAgOiBFeGNlbFBpdm90VGFibGVGaWVsZENvbGxlY3Rpb25CYXNlPEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZD4geworICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVEYXRhRmllbGRDb2xsZWN0aW9uKEV4Y2VsUGl2b3RUYWJsZSB0YWJsZSkKKyAgICAgIDogYmFzZSh0YWJsZSkge30KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBBZGQgYSBuZXcgZGF0YWZpZWxkCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0iZmllbGQiPlRoZSBmaWVsZDwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UaGUgbmV3IGRhdGFmaWVsZDwvcmV0dXJucz4KKyAgcHVibGljIEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZCBBZGQoRXhjZWxQaXZvdFRhYmxlRmllbGQgZmllbGQpIHsKKyAgICB2YXIgZGF0YUZpZWxkc05vZGUgPSBmaWVsZC5Ub3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoCisgICAgICAgICIuLi8uLi9kOmRhdGFGaWVsZHMiLAorICAgICAgICBmaWVsZC5OYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICBpZiAoZGF0YUZpZWxkc05vZGUgPT0gbnVsbCkgeworICAgICAgX3RhYmxlLkNyZWF0ZU5vZGUoImQ6ZGF0YUZpZWxkcyIpOworICAgICAgZGF0YUZpZWxkc05vZGUgPSBmaWVsZC5Ub3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUoIi4uLy4uL2Q6ZGF0YUZpZWxkcyIsIGZpZWxkLk5hbWVTcGFjZU1hbmFnZXIpOworICAgIH0KKworICAgIFhtbEVsZW1lbnQgbm9kZSA9IF90YWJsZS5QaXZvdFRhYmxlWG1sLkNyZWF0ZUVsZW1lbnQoImRhdGFGaWVsZCIsIEV4Y2VsUGFja2FnZS5fc2NoZW1hTWFpbik7CisgICAgbm9kZS5TZXRBdHRyaWJ1dGUoImZsZCIsIGZpZWxkLkluZGV4LlRvU3RyaW5nKCkpOworICAgIGRhdGFGaWVsZHNOb2RlLkFwcGVuZENoaWxkKG5vZGUpOworCisgICAgLy9YbWxFbGVtZW50IG5vZGUgPSBmaWVsZC5BcHBlbmRGaWVsZChkYXRhRmllbGRzTm9kZSwgZmllbGQuSW5kZXgsICJkYXRhRmllbGQiLCAiZmxkIik7CisgICAgZmllbGQuU2V0WG1sTm9kZUJvb2woIkBkYXRhRmllbGQiLCB0cnVlLCBmYWxzZSk7CisKKyAgICB2YXIgZGF0YUZpZWxkID0gbmV3IEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZChmaWVsZC5OYW1lU3BhY2VNYW5hZ2VyLCBub2RlLCBmaWVsZCk7CisgICAgVmFsaWRhdGVEdXBOYW1lKGRhdGFGaWVsZCk7CisKKyAgICBfbGlzdC5BZGQoZGF0YUZpZWxkKTsKKyAgICByZXR1cm4gZGF0YUZpZWxkOworICB9CisKKyAgcHJpdmF0ZSB2b2lkIFZhbGlkYXRlRHVwTmFtZShFeGNlbFBpdm90VGFibGVEYXRhRmllbGQgZGF0YUZpZWxkKSB7CisgICAgaWYgKEV4aXN0c0RmTmFtZShkYXRhRmllbGQuRmllbGQuTmFtZSwgbnVsbCkpIHsKKyAgICAgIHZhciBpbmRleCA9IDI7CisgICAgICBzdHJpbmcgbmFtZTsKKyAgICAgIGRvIHsKKyAgICAgICAgbmFtZSA9IGRhdGFGaWVsZC5GaWVsZC5OYW1lICsgIl8iICsgaW5kZXgrKzsKKyAgICAgIH0gd2hpbGUgKEV4aXN0c0RmTmFtZShuYW1lLCBudWxsKSk7CisgICAgICBkYXRhRmllbGQuTmFtZSA9IG5hbWU7CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgYm9vbCBFeGlzdHNEZk5hbWUoc3RyaW5nIG5hbWUsIEV4Y2VsUGl2b3RUYWJsZURhdGFGaWVsZCBkYXRhZmllbGQpIHsKKyAgICBmb3JlYWNoICh2YXIgZGYgaW4gX2xpc3QpIHsKKyAgICAgIGlmICgoKCFzdHJpbmcuSXNOdWxsT3JFbXB0eShkZi5OYW1lKQorICAgICAgICAgICAgICAgICAgICAgICYmIGRmLk5hbWUuRXF1YWxzKG5hbWUsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpCisgICAgICAgICAgICAgICAgICAgICAgfHwgKHN0cmluZy5Jc051bGxPckVtcHR5KGRmLk5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZi5GaWVsZC5OYW1lLkVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKSkpCisgICAgICAgICAgJiYgZGF0YWZpZWxkICE9IGRmKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZW1vdmUgYSBkYXRhZmllbGQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhRmllbGQiPjwvcGFyYW0+CisgIHB1YmxpYyB2b2lkIFJlbW92ZShFeGNlbFBpdm90VGFibGVEYXRhRmllbGQgZGF0YUZpZWxkKSB7CisgICAgWG1sRWxlbWVudCBub2RlID0KKyAgICAgICAgZGF0YUZpZWxkLkZpZWxkLlRvcE5vZGUuU2VsZWN0U2luZ2xlTm9kZSgKKyAgICAgICAgICAgIHN0cmluZy5Gb3JtYXQoIi4uLy4uL2Q6ZGF0YUZpZWxkcy9kOmRhdGFGaWVsZFtAZmxkPXswfV0iLCBkYXRhRmllbGQuSW5kZXgpLAorICAgICAgICAgICAgZGF0YUZpZWxkLk5hbWVTcGFjZU1hbmFnZXIpIGFzIFhtbEVsZW1lbnQ7CisgICAgaWYgKG5vZGUgIT0gbnVsbCkgeworICAgICAgbm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKG5vZGUpOworICAgIH0KKyAgICBfbGlzdC5SZW1vdmUoZGF0YUZpZWxkKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlRmllbGRHcm91cC5jcyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUZpZWxkR3JvdXAuY3MKaW5kZXggY2FjMDkxOC4uZWExZjlkNCAxMDA2NDQKLS0tIGEvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlRmllbGRHcm91cC5jcworKysgYi9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVGaWVsZEdyb3VwLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywxNDggKzEzLDEwNyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCUFkZGVkCQkyMS1NQVItMjAxMQogICogSmFuIEvDpGxsbWFuCQlMaWNlbnNlIGNoYW5nZWQgR1BMLS0+TEdQTCAyMDExLTEyLTE2CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZQotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQmFzZSBjbGFzcyBmb3IgcGl2b3QgdGFibGUgZmllbGQgZ3JvdXBzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdFRhYmxlRmllbGRHcm91cCA6IFhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlRmllbGRHcm91cChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIHRvcE5vZGUpIDoKLSAgICAgICAgICAgIGJhc2UobnMsIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIAotICAgICAgICB9Cit1c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW0uR2xvYmFsaXphdGlvbjsKK3VzaW5nIFN5c3RlbS5YbWw7CisKK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlRhYmxlLlBpdm90VGFibGU7CisKKy8vLyA8c3VtbWFyeT4KKy8vLyBCYXNlIGNsYXNzIGZvciBwaXZvdCB0YWJsZSBmaWVsZCBncm91cHMKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdFRhYmxlRmllbGRHcm91cCA6IFhtbEhlbHBlciB7CisgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZUZpZWxkR3JvdXAoWG1sTmFtZXNwYWNlTWFuYWdlciBucywgWG1sTm9kZSB0b3BOb2RlKQorICAgICAgOiBiYXNlKG5zLCB0b3BOb2RlKSB7fQorfQorCisvLy8gPHN1bW1hcnk+CisvLy8gQSBkYXRlIGdyb3VwCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIGNsYXNzIEV4Y2VsUGl2b3RUYWJsZUZpZWxkRGF0ZUdyb3VwIDogRXhjZWxQaXZvdFRhYmxlRmllbGRHcm91cCB7CisgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZUZpZWxkRGF0ZUdyb3VwKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgdG9wTm9kZSkKKyAgICAgIDogYmFzZShucywgdG9wTm9kZSkge30KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZ3JvdXBCeVBhdGggPSAiZDpmaWVsZEdyb3VwL2Q6cmFuZ2VQci9AZ3JvdXBCeSI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gSG93IHRvIGdyb3VwIHRoZSBkYXRlIGZpZWxkCisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBlRGF0ZUdyb3VwQnkgR3JvdXBCeSB7CisgICAgZ2V0IHsKKyAgICAgIHN0cmluZyB2ID0gR2V0WG1sTm9kZVN0cmluZyhfZ3JvdXBCeVBhdGgpOworICAgICAgaWYgKHYgIT0gIiIpIHsKKyAgICAgICAgcmV0dXJuIChlRGF0ZUdyb3VwQnkpRW51bS5QYXJzZSh0eXBlb2YoZURhdGVHcm91cEJ5KSwgdiwgdHJ1ZSk7CisgICAgICB9CisgICAgICB0aHJvdyAobmV3KCJJbnZhbGlkIGRhdGUgR3JvdXBieSIpKTsKICAgICB9Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIGRhdGUgZ3JvdXAKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBFeGNlbFBpdm90VGFibGVGaWVsZERhdGVHcm91cCA6IEV4Y2VsUGl2b3RUYWJsZUZpZWxkR3JvdXAKLSAgICB7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZUZpZWxkRGF0ZUdyb3VwKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgdG9wTm9kZSkgOgotICAgICAgICAgICAgYmFzZShucywgdG9wTm9kZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHN0cmluZyBncm91cEJ5UGF0aCA9ICJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0Bncm91cEJ5IjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSG93IHRvIGdyb3VwIHRoZSBkYXRlIGZpZWxkCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBlRGF0ZUdyb3VwQnkgR3JvdXBCeQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJpbmcgdiA9IEdldFhtbE5vZGVTdHJpbmcoZ3JvdXBCeVBhdGgpOwotICAgICAgICAgICAgICAgIGlmICh2ICE9ICIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChlRGF0ZUdyb3VwQnkpRW51bS5QYXJzZSh0eXBlb2YoZURhdGVHcm91cEJ5KSwgdiwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IChuZXcgRXhjZXB0aW9uKCJJbnZhbGlkIGRhdGUgR3JvdXBieSIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcml2YXRlIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoZ3JvdXBCeVBhdGgsIHZhbHVlLlRvU3RyaW5nKCkuVG9Mb3dlcihDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQXV0byBkZXRlY3Qgc3RhcnQgZGF0ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBBdXRvU3RhcnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAYXV0b1N0YXJ0IiwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEF1dG8gZGV0ZWN0IGVuZCBkYXRlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIEF1dG9FbmQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKCJAYXV0b1N0YXJ0IiwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQSBwaXZvdCB0YWJsZSBmaWVsZCBudW1lcmljIGdyb3VwaW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdFRhYmxlRmllbGROdW1lcmljR3JvdXAgOiBFeGNlbFBpdm90VGFibGVGaWVsZEdyb3VwCi0gICAgewotICAgICAgICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVGaWVsZE51bWVyaWNHcm91cChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIHRvcE5vZGUpIDoKLSAgICAgICAgICAgIGJhc2UobnMsIHRvcE5vZGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgc3RhcnRQYXRoID0gImQ6ZmllbGRHcm91cC9kOnJhbmdlUHIvQHN0YXJ0TnVtIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3RhcnQgdmFsdWUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGRvdWJsZSBTdGFydAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKGRvdWJsZSlHZXRYbWxOb2RlRG91YmxlTnVsbChzdGFydFBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpdmF0ZSBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKHN0YXJ0UGF0aCx2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc3RyaW5nIGVuZFBhdGggPSAiZDpmaWVsZEdyb3VwL2Q6cmFuZ2VQci9AZW5kTnVtIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRW5kIHZhbHVlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgRW5kCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAoZG91YmxlKUdldFhtbE5vZGVEb3VibGVOdWxsKGVuZFBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpdmF0ZSBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKGVuZFBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb25zdCBzdHJpbmcgZ3JvdXBJbnRlcnZhbFBhdGggPSAiZDpmaWVsZEdyb3VwL2Q6cmFuZ2VQci9AZ3JvdXBJbnRlcnZhbCI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEludGVydmFsCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgSW50ZXJ2YWwKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUpR2V0WG1sTm9kZURvdWJsZU51bGwoZ3JvdXBJbnRlcnZhbFBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpdmF0ZSBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKGdyb3VwSW50ZXJ2YWxQYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgICAgcHJpdmF0ZSBzZXQgPT4KKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoX2dyb3VwQnlQYXRoLCB2YWx1ZS5Ub1N0cmluZygpLlRvTG93ZXIoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQXV0byBkZXRlY3Qgc3RhcnQgZGF0ZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgYm9vbCBBdXRvU3RhcnQgPT4gR2V0WG1sTm9kZUJvb2woIkBhdXRvU3RhcnQiLCBmYWxzZSk7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQXV0byBkZXRlY3QgZW5kIGRhdGUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGJvb2wgQXV0b0VuZCA9PiBHZXRYbWxOb2RlQm9vbCgiQGF1dG9TdGFydCIsIGZhbHNlKTsKK30KKworLy8vIDxzdW1tYXJ5PgorLy8vIEEgcGl2b3QgdGFibGUgZmllbGQgbnVtZXJpYyBncm91cGluZworLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBjbGFzcyBFeGNlbFBpdm90VGFibGVGaWVsZE51bWVyaWNHcm91cCA6IEV4Y2VsUGl2b3RUYWJsZUZpZWxkR3JvdXAgeworICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVGaWVsZE51bWVyaWNHcm91cChYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIHRvcE5vZGUpCisgICAgICA6IGJhc2UobnMsIHRvcE5vZGUpIHt9CisKKyAgcHJpdmF0ZSBjb25zdCBzdHJpbmcgX3N0YXJ0UGF0aCA9ICJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0BzdGFydE51bSI7CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gU3RhcnQgdmFsdWUKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIGRvdWJsZSBTdGFydCB7CisgICAgZ2V0ID0+IChkb3VibGUpR2V0WG1sTm9kZURvdWJsZU51bGwoX3N0YXJ0UGF0aCk7CisgICAgcHJpdmF0ZSBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZyhfc3RhcnRQYXRoLCB2YWx1ZS5Ub1N0cmluZyhDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7CisgIH0KKworICBwcml2YXRlIGNvbnN0IHN0cmluZyBfZW5kUGF0aCA9ICJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0BlbmROdW0iOworCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIEVuZCB2YWx1ZQorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZG91YmxlIEVuZCB7CisgICAgZ2V0ID0+IChkb3VibGUpR2V0WG1sTm9kZURvdWJsZU51bGwoX2VuZFBhdGgpOworICAgIHByaXZhdGUgc2V0ID0+IFNldFhtbE5vZGVTdHJpbmcoX2VuZFBhdGgsIHZhbHVlLlRvU3RyaW5nKEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKKyAgfQorCisgIHByaXZhdGUgY29uc3Qgc3RyaW5nIF9ncm91cEludGVydmFsUGF0aCA9ICJkOmZpZWxkR3JvdXAvZDpyYW5nZVByL0Bncm91cEludGVydmFsIjsKKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbnRlcnZhbAorICAvLy8gPC9zdW1tYXJ5PgorICBwdWJsaWMgZG91YmxlIEludGVydmFsIHsKKyAgICBnZXQgPT4gKGRvdWJsZSlHZXRYbWxOb2RlRG91YmxlTnVsbChfZ3JvdXBJbnRlcnZhbFBhdGgpOworICAgIHByaXZhdGUgc2V0ID0+CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKF9ncm91cEludGVydmFsUGF0aCwgdmFsdWUuVG9TdHJpbmcoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVGaWVsZEl0ZW0uY3MgYi9FUFBsdXMvVGFibGUvUGl2b3RUYWJsZS9FeGNlbFBpdm90VGFibGVGaWVsZEl0ZW0uY3MKaW5kZXggNzExNTA3ZS4uZDRkY2UyZCAxMDA2NDQKLS0tIGEvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlRmllbGRJdGVtLmNzCisrKyBiL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZUZpZWxkSXRlbS5jcwpAQCAtMTMsODAgKzEzLDYyIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEphbiBLw6RsbG1hbgkJQWRkZWQJCTIxLU1BUi0yMDExCiAgKiBKYW4gS8OkbGxtYW4JCUxpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMIDIwMTEtMTItMTYKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiB1c2luZyBTeXN0ZW0uWG1sOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIGZpZWxkIEl0ZW0uIFVzZWQgZm9yIGdyb3VwaW5nCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdFRhYmxlRmllbGRJdGVtIDogWG1sSGVscGVyCi0gICAgewotICAgICAgICBFeGNlbFBpdm90VGFibGVGaWVsZCBfZmllbGQ7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZUZpZWxkSXRlbShYbWxOYW1lc3BhY2VNYW5hZ2VyIG5zLCBYbWxOb2RlIHRvcE5vZGUsIEV4Y2VsUGl2b3RUYWJsZUZpZWxkIGZpZWxkKSA6Ci0gICAgICAgICAgICBiYXNlKG5zLCB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgIF9maWVsZCA9IGZpZWxkOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZTsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEEgZmllbGQgSXRlbS4gVXNlZCBmb3IgZ3JvdXBpbmcKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdFRhYmxlRmllbGRJdGVtIDogWG1sSGVscGVyIHsKKyAgcHJpdmF0ZSBFeGNlbFBpdm90VGFibGVGaWVsZCBfZmllbGQ7CisKKyAgaW50ZXJuYWwgRXhjZWxQaXZvdFRhYmxlRmllbGRJdGVtKAorICAgICAgWG1sTmFtZXNwYWNlTWFuYWdlciBucywKKyAgICAgIFhtbE5vZGUgdG9wTm9kZSwKKyAgICAgIEV4Y2VsUGl2b3RUYWJsZUZpZWxkIGZpZWxkKQorICAgICAgOiBiYXNlKG5zLCB0b3BOb2RlKSB7CisgICAgX2ZpZWxkID0gZmllbGQ7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgdGV4dC4gVW5pcXVlIHZhbHVlcyBvbmx5CisgIC8vLyA8L3N1bW1hcnk+CisgIHB1YmxpYyBzdHJpbmcgVGV4dCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVTdHJpbmcoIkBuIik7CisgICAgc2V0IHsKKyAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpIHsKKyAgICAgICAgRGVsZXRlTm9kZSgiQG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gX2ZpZWxkLkl0ZW1zKSB7CisgICAgICAgIGlmIChpdGVtLlRleHQgPT0gdmFsdWUpIHsKKyAgICAgICAgICB0aHJvdyAobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJEdXBsaWNhdGUgVGV4dCIpKTsKICAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgdGV4dC4gVW5pcXVlIHZhbHVlcyBvbmx5Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVGV4dAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZygiQG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KHZhbHVlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIERlbGV0ZU5vZGUoIkBuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIGl0ZW0gaW4gX2ZpZWxkLkl0ZW1zKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uVGV4dCA9PSB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cobmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJEdXBsaWNhdGUgVGV4dCIpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAbiIsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnRlcm5hbCBpbnQgWAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0WG1sTm9kZUludCgiQHgiKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoIkB0Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBuIiwgdmFsdWUpOwogICAgIH0KKyAgfQorCisgIGludGVybmFsIGludCBYID0+IEdldFhtbE5vZGVJbnQoIkB4Iik7CisKKyAgaW50ZXJuYWwgc3RyaW5nIFQgPT4gR2V0WG1sTm9kZVN0cmluZygiQHQiKTsKIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9UYWJsZS9QaXZvdFRhYmxlL0V4Y2VsUGl2b3RUYWJsZVBhZ2VGaWVsZFNldHRpbmdzLmNzIGIvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlUGFnZUZpZWxkU2V0dGluZ3MuY3MKaW5kZXggN2U1YmE4NS4uZmU2Zjc2MiAxMDA2NDQKLS0tIGEvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlUGFnZUZpZWxkU2V0dGluZ3MuY3MKKysrIGIvRVBQbHVzL1RhYmxlL1Bpdm90VGFibGUvRXhjZWxQaXZvdFRhYmxlUGFnZUZpZWxkU2V0dGluZ3MuY3MKQEAgLTEzLDEwNiArMTMsODEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQlBZGRlZAkJMjEtTUFSLTIwMTEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OworCiB1c2luZyBTeXN0ZW0uWG1sOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5UYWJsZS5QaXZvdFRhYmxlCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIHBhZ2UgLyByZXBvcnQgZmlsdGVyIGZpZWxkCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdFRhYmxlUGFnZUZpZWxkU2V0dGluZ3MgIDogWG1sSGVscGVyCi0gICAgewotICAgICAgICBFeGNlbFBpdm90VGFibGVGaWVsZCBfZmllbGQ7Ci0gICAgICAgIGludGVybmFsIEV4Y2VsUGl2b3RUYWJsZVBhZ2VGaWVsZFNldHRpbmdzKFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsIFhtbE5vZGUgdG9wTm9kZSwgRXhjZWxQaXZvdFRhYmxlRmllbGQgZmllbGQsIGludCBpbmRleCkgOgotICAgICAgICAgICAgYmFzZShucywgdG9wTm9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEdldFhtbE5vZGVTdHJpbmcoIkBoaWVyIik9PSIiKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEhpZXIgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9maWVsZCA9IGZpZWxkOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGludCBJbmRleCAKLSAgICAgICAgeyAKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KCJAZmxkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTZXRYbWxOb2RlU3RyaW5nKCJAZmxkIix2YWx1ZS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgTmFtZSBvZiB0aGUgZmllbGQKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBOYW1lCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlU3RyaW5nKCJAbmFtZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQG5hbWUiLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyoqKioqIERvbnQgd29yay4gTmVlZCBpdGVtcyB0byBiZSBwb3B1bGF0ZWQuICoqKiovCi0gICAgICAgIC8vLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8vLyBUaGUgc2VsZWN0ZWQgaXRlbSAKLSAgICAgICAgLy8vLy8gPC9zdW1tYXJ5PgotICAgICAgICAvL3B1YmxpYyBpbnQgU2VsZWN0ZWRJdGVtCi0gICAgICAgIC8vewotICAgICAgICAvLyAgICBnZXQKLSAgICAgICAgLy8gICAgewotICAgICAgICAvLyAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVJbnQoIkBpdGVtIik7Ci0gICAgICAgIC8vICAgIH0KLSAgICAgICAgLy8gICAgc2V0Ci0gICAgICAgIC8vICAgIHsKLSAgICAgICAgLy8gICAgICAgIGlmICh2YWx1ZSA8IDApIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJDYW4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICAvLyAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGl0ZW0iLCB2YWx1ZS5Ub1N0cmluZygpKTsKLSAgICAgICAgLy8gICAgfQotICAgICAgICAvL30KLSAgICAgICAgaW50ZXJuYWwgaW50IE51bUZtdElkCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KCJAbnVtRm10SWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBudW1GbXRJZCIsIHZhbHVlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGludCBIaWVyCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KCJAaGllciIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2V0WG1sTm9kZVN0cmluZygiQGhpZXIiLCB2YWx1ZS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVGFibGUuUGl2b3RUYWJsZTsKKworLy8vIDxzdW1tYXJ5PgorLy8vIEEgcGFnZSAvIHJlcG9ydCBmaWx0ZXIgZmllbGQKKy8vLyA8L3N1bW1hcnk+CitwdWJsaWMgY2xhc3MgRXhjZWxQaXZvdFRhYmxlUGFnZUZpZWxkU2V0dGluZ3MgOiBYbWxIZWxwZXIgeworICBwcml2YXRlIEV4Y2VsUGl2b3RUYWJsZUZpZWxkIF9maWVsZDsKKworICBpbnRlcm5hbCBFeGNlbFBpdm90VGFibGVQYWdlRmllbGRTZXR0aW5ncygKKyAgICAgIFhtbE5hbWVzcGFjZU1hbmFnZXIgbnMsCisgICAgICBYbWxOb2RlIHRvcE5vZGUsCisgICAgICBFeGNlbFBpdm90VGFibGVGaWVsZCBmaWVsZCwKKyAgICAgIGludCBpbmRleCkKKyAgICAgIDogYmFzZShucywgdG9wTm9kZSkgeworICAgIGlmIChHZXRYbWxOb2RlU3RyaW5nKCJAaGllciIpID09ICIiKSB7CisgICAgICBIaWVyID0gLTE7CiAgICAgfQorICAgIF9maWVsZCA9IGZpZWxkOworICB9CisKKyAgaW50ZXJuYWwgaW50IEluZGV4IHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUludCgiQGZsZCIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKCJAZmxkIiwgdmFsdWUuVG9TdHJpbmcoKSk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaGUgTmFtZSBvZiB0aGUgZmllbGQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgcHVibGljIHN0cmluZyBOYW1lIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZVN0cmluZygiQG5hbWUiKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZygiQG5hbWUiLCB2YWx1ZSk7CisgIH0KKworICAvKioqKiogRG9udCB3b3JrLiBOZWVkIGl0ZW1zIHRvIGJlIHBvcHVsYXRlZC4gKioqKi8KKyAgLy8vLy8gPHN1bW1hcnk+CisgIC8vLy8vIFRoZSBzZWxlY3RlZCBpdGVtCisgIC8vLy8vIDwvc3VtbWFyeT4KKyAgLy9wdWJsaWMgaW50IFNlbGVjdGVkSXRlbQorICAvL3sKKyAgLy8gICAgZ2V0CisgIC8vICAgIHsKKyAgLy8gICAgICAgIHJldHVybiBHZXRYbWxOb2RlSW50KCJAaXRlbSIpOworICAvLyAgICB9CisgIC8vICAgIHNldAorICAvLyAgICB7CisgIC8vICAgICAgICBpZiAodmFsdWUgPCAwKSB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgYmUgbmVnYXRpdmUiKTsKKyAgLy8gICAgICAgIFNldFhtbE5vZGVTdHJpbmcoIkBpdGVtIiwgdmFsdWUuVG9TdHJpbmcoKSk7CisgIC8vICAgIH0KKyAgLy99CisgIGludGVybmFsIGludCBOdW1GbXRJZCB7CisgICAgZ2V0ID0+IEdldFhtbE5vZGVJbnQoIkBudW1GbXRJZCIpOworICAgIHNldCA9PiBTZXRYbWxOb2RlU3RyaW5nKCJAbnVtRm10SWQiLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgfQorCisgIGludGVybmFsIGludCBIaWVyIHsKKyAgICBnZXQgPT4gR2V0WG1sTm9kZUludCgiQGhpZXIiKTsKKyAgICBzZXQgPT4gU2V0WG1sTm9kZVN0cmluZygiQGhpZXIiLCB2YWx1ZS5Ub1N0cmluZygpKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1V0aWxzL0FkZHJlc3NVdGlsaXR5LmNzIGIvRVBQbHVzL1V0aWxzL0FkZHJlc3NVdGlsaXR5LmNzCmluZGV4IGJjMWM4ZmMuLjA1ZmFkZDEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9VdGlscy9BZGRyZXNzVXRpbGl0eS5jcworKysgYi9FUFBsdXMvVXRpbHMvQWRkcmVzc1V0aWxpdHkuY3MKQEAgLTEsMjkgKzEsMjAgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK++7v3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVXRpbHMKLXsKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFkZHJlc3NVdGlsaXR5Ci0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBQYXJzZUVudGlyZUNvbHVtblNlbGVjdGlvbnMoc3RyaW5nIGFkZHJlc3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBwYXJzZWRBZGRyZXNzID0gYWRkcmVzczsKLSAgICAgICAgICAgIHZhciBtYXRjaGVzID0gUmVnZXguTWF0Y2hlcyhhZGRyZXNzLCAiW0EtWl0rOltBLVpdKyIpOwotICAgICAgICAgICAgZm9yZWFjaCAoTWF0Y2ggbWF0Y2ggaW4gbWF0Y2hlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBZGRSb3dOdW1iZXJzVG9FbnRpcmVDb2x1bW5SYW5nZShyZWYgcGFyc2VkQWRkcmVzcywgbWF0Y2guVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHBhcnNlZEFkZHJlc3M7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkUm93TnVtYmVyc1RvRW50aXJlQ29sdW1uUmFuZ2UocmVmIHN0cmluZyBhZGRyZXNzLCBzdHJpbmcgcmFuZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwYXJzZWRSYW5nZSA9IHN0cmluZy5Gb3JtYXQoInswfXsxfSIsIHJhbmdlLCBFeGNlbFBhY2thZ2UuTWF4Um93cyk7Ci0gICAgICAgICAgICB2YXIgc3BsaXRBcnIgPSBwYXJzZWRSYW5nZS5TcGxpdChuZXcgY2hhcltdIHsgJzonIH0pOwotICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MuUmVwbGFjZShyYW5nZSwgc3RyaW5nLkZvcm1hdCgiezB9MTp7MX0iLCBzcGxpdEFyclswXSwgc3BsaXRBcnJbMV0pKTsKLSAgICAgICAgfQorcHVibGljIHN0YXRpYyBjbGFzcyBBZGRyZXNzVXRpbGl0eSB7CisgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFBhcnNlRW50aXJlQ29sdW1uU2VsZWN0aW9ucyhzdHJpbmcgYWRkcmVzcykgeworICAgIHN0cmluZyBwYXJzZWRBZGRyZXNzID0gYWRkcmVzczsKKyAgICB2YXIgbWF0Y2hlcyA9IFJlZ2V4Lk1hdGNoZXMoYWRkcmVzcywgIltBLVpdKzpbQS1aXSsiKTsKKyAgICBmb3JlYWNoIChNYXRjaCBtYXRjaCBpbiBtYXRjaGVzKSB7CisgICAgICBBZGRSb3dOdW1iZXJzVG9FbnRpcmVDb2x1bW5SYW5nZShyZWYgcGFyc2VkQWRkcmVzcywgbWF0Y2guVmFsdWUpOwogICAgIH0KKyAgICByZXR1cm4gcGFyc2VkQWRkcmVzczsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHZvaWQgQWRkUm93TnVtYmVyc1RvRW50aXJlQ29sdW1uUmFuZ2UocmVmIHN0cmluZyBhZGRyZXNzLCBzdHJpbmcgcmFuZ2UpIHsKKyAgICB2YXIgcGFyc2VkUmFuZ2UgPSBzdHJpbmcuRm9ybWF0KCJ7MH17MX0iLCByYW5nZSwgRXhjZWxQYWNrYWdlLk1heFJvd3MpOworICAgIHZhciBzcGxpdEFyciA9IHBhcnNlZFJhbmdlLlNwbGl0KG5ld1tdIHsgJzonIH0pOworICAgIGFkZHJlc3MgPSBhZGRyZXNzLlJlcGxhY2UocmFuZ2UsIHN0cmluZy5Gb3JtYXQoInswfTE6ezF9Iiwgc3BsaXRBcnJbMF0sIHNwbGl0QXJyWzFdKSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9VdGlscy9Bcmd1bWVudC5jcyBiL0VQUGx1cy9VdGlscy9Bcmd1bWVudC5jcwppbmRleCA5MGIwYWJlLi5lOTVjOTJiIDEwMDY0NAotLS0gYS9FUFBsdXMvVXRpbHMvQXJndW1lbnQuY3MKKysrIGIvRVBQbHVzL1V0aWxzL0FyZ3VtZW50LmNzCkBAIC0xMyw0MSArMTMsMzEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gICAJCSAgICAgICAgICAgICAgICBBZGRlZCAgICAgICAJCSAgICAgICAgMjAxMS0wMS0wMQogICogSmFuIEvDpGxsbWFuCQkgICAgTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgIDIwMTEtMTItMjcKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5VdGlscwotewotICAgIGludGVybmFsIGNsYXNzIEFyZ3VtZW50PFQ+IDogSUFyZ3VtZW50PFQ+Ci0gICAgewotICAgICAgICBwdWJsaWMgQXJndW1lbnQoVCBAdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF92YWx1ZSA9IEB2YWx1ZTsKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLSAgICAgICAgcHJpdmF0ZSBUIF92YWx1ZTsKK2ludGVybmFsIGNsYXNzIEFyZ3VtZW50PFQ+IDogSUFyZ3VtZW50PFQ+IHsKKyAgcHVibGljIEFyZ3VtZW50KFQgdmFsdWUpIHsKKyAgICBfdmFsdWUgPSB2YWx1ZTsKKyAgfQogCi0gICAgICAgIFQgSUFyZ3VtZW50PFQ+LlZhbHVlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBfdmFsdWU7IH0KLSAgICAgICAgfQotICAgIH0KKyAgcHJpdmF0ZSBUIF92YWx1ZTsKKworICBUIElBcmd1bWVudDxUPi5WYWx1ZSA9PiBfdmFsdWU7CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvVXRpbHMvQXJndW1lbnRFeHRlbnNpb25zLmNzIGIvRVBQbHVzL1V0aWxzL0FyZ3VtZW50RXh0ZW5zaW9ucy5jcwppbmRleCA5ZmRkNmM0Li42YmJhODU0IDEwMDY0NAotLS0gYS9FUFBsdXMvVXRpbHMvQXJndW1lbnRFeHRlbnNpb25zLmNzCisrKyBiL0VQUGx1cy9VdGlscy9Bcmd1bWVudEV4dGVuc2lvbnMuY3MKQEAgLTEzLDE3ICsxMywxNyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBNYXRzIEFsbSAgIAkJICAgICAgICAgICAgICAgIEFkZGVkICAgICAgIAkJICAgICAgICAyMDExLTAxLTAxCkBAIC0zMSw2NSArMzEsNTMgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiB1c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlV0aWxzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBFeHRlbnNpb24gbWV0aG9kcyBmb3IgZ3VhcmRpbmcKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXJndW1lbnRFeHRlbnNpb25zCi0gICAgeworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhyb3dzIGFuIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBpZiBhcmd1bWVudCBpcyBudWxsCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPkFyZ3VtZW50IHR5cGU8L3R5cGVwYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudCI+QXJndW1lbnQgdG8gY2hlY2s8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFyZ3VtZW50TmFtZSI+cGFyYW1ldGVyL2FyZ3VtZW50IG5hbWU8L3BhcmFtPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudE51bGxFeGNlcHRpb24iPjwvZXhjZXB0aW9uPgotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgSXNOb3ROdWxsPFQ+KHRoaXMgSUFyZ3VtZW50PFQ+IGFyZ3VtZW50LCBzdHJpbmcgYXJndW1lbnROYW1lKQotICAgICAgICAgICAgd2hlcmUgVCA6IGNsYXNzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFyZ3VtZW50TmFtZSA9IHN0cmluZy5Jc051bGxPckVtcHR5KGFyZ3VtZW50TmFtZSkgPyAidmFsdWUiIDogYXJndW1lbnROYW1lOwotICAgICAgICAgICAgaWYgKGFyZ3VtZW50LlZhbHVlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihhcmd1bWVudE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhyb3dzIGFuIDxzZWUgY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIi8+IGlmIHRoZSBzdHJpbmcgYXJndW1lbnQgaXMgbnVsbCBvciBlbXB0eQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFyZ3VtZW50Ij5Bcmd1bWVudCB0byBjaGVjazwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnROYW1lIj5wYXJhbWV0ZXIvYXJndW1lbnQgbmFtZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+PC9leGNlcHRpb24+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBJc05vdE51bGxPckVtcHR5KHRoaXMgSUFyZ3VtZW50PHN0cmluZz4gYXJndW1lbnQsIHN0cmluZyBhcmd1bWVudE5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShhcmd1bWVudC5WYWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihhcmd1bWVudE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhyb3dzIGFuIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50IGlzIG91dCBvZiB0aGUgc3VwcGxpZWQgcmFuZ2UKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VHlwZSBpbXBsZW1lbnRpbmcgPHNlZSBjcmVmPSJJQ29tcGFyYWJsZSIvPjwvdHlwZXBhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFyZ3VtZW50Ij5UaGUgYXJndW1lbnQgdG8gY2hlY2s8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1pbiI+TWluIHZhbHVlIG9mIHRoZSBzdXBwbGllZCByYW5nZTwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWF4Ij5NYXggdmFsdWUgb2YgdGhlIHN1cHBsaWVkIHJhbmdlPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudE5hbWUiPnBhcmFtZXRlci9hcmd1bWVudCBuYW1lPC9wYXJhbT4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj48L2V4Y2VwdGlvbj4KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIElzSW5SYW5nZTxUPih0aGlzIElBcmd1bWVudDxUPiBhcmd1bWVudCwgVCBtaW4sIFQgbWF4LCBzdHJpbmcgYXJndW1lbnROYW1lKQotICAgICAgICAgICAgd2hlcmUgVCA6IElDb21wYXJhYmxlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghKGFyZ3VtZW50LlZhbHVlLkNvbXBhcmVUbyhtaW4pID49IDAgJiYgYXJndW1lbnQuVmFsdWUuQ29tcGFyZVRvKG1heCkgPD0gMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbihhcmd1bWVudE5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisvLy8gPHN1bW1hcnk+CisvLy8gRXh0ZW5zaW9uIG1ldGhvZHMgZm9yIGd1YXJkaW5nCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIHN0YXRpYyBjbGFzcyBBcmd1bWVudEV4dGVuc2lvbnMgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUaHJvd3MgYW4gQXJndW1lbnROdWxsRXhjZXB0aW9uIGlmIGFyZ3VtZW50IGlzIG51bGwKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+QXJndW1lbnQgdHlwZTwvdHlwZXBhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFyZ3VtZW50Ij5Bcmd1bWVudCB0byBjaGVjazwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnROYW1lIj5wYXJhbWV0ZXIvYXJndW1lbnQgbmFtZTwvcGFyYW0+CisgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+PC9leGNlcHRpb24+CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBJc05vdE51bGw8VD4odGhpcyBJQXJndW1lbnQ8VD4gYXJndW1lbnQsIHN0cmluZyBhcmd1bWVudE5hbWUpCisgICAgICB3aGVyZSBUIDogY2xhc3MgeworICAgIGFyZ3VtZW50TmFtZSA9IHN0cmluZy5Jc051bGxPckVtcHR5KGFyZ3VtZW50TmFtZSkgPyAidmFsdWUiIDogYXJndW1lbnROYW1lOworICAgIGlmIChhcmd1bWVudC5WYWx1ZSA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKGFyZ3VtZW50TmFtZSk7CiAgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhyb3dzIGFuIDxzZWUgY3JlZj0iQXJndW1lbnROdWxsRXhjZXB0aW9uIi8+IGlmIHRoZSBzdHJpbmcgYXJndW1lbnQgaXMgbnVsbCBvciBlbXB0eQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFyZ3VtZW50Ij5Bcmd1bWVudCB0byBjaGVjazwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iYXJndW1lbnROYW1lIj5wYXJhbWV0ZXIvYXJndW1lbnQgbmFtZTwvcGFyYW0+CisgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFyZ3VtZW50TnVsbEV4Y2VwdGlvbiI+PC9leGNlcHRpb24+CisgIHB1YmxpYyBzdGF0aWMgdm9pZCBJc05vdE51bGxPckVtcHR5KHRoaXMgSUFyZ3VtZW50PHN0cmluZz4gYXJndW1lbnQsIHN0cmluZyBhcmd1bWVudE5hbWUpIHsKKyAgICBpZiAoc3RyaW5nLklzTnVsbE9yRW1wdHkoYXJndW1lbnQuVmFsdWUpKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKGFyZ3VtZW50TmFtZSk7CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gVGhyb3dzIGFuIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50IGlzIG91dCBvZiB0aGUgc3VwcGxpZWQgcmFuZ2UKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VHlwZSBpbXBsZW1lbnRpbmcgPHNlZSBjcmVmPSJJQ29tcGFyYWJsZSIvPjwvdHlwZXBhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9ImFyZ3VtZW50Ij5UaGUgYXJndW1lbnQgdG8gY2hlY2s8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im1pbiI+TWluIHZhbHVlIG9mIHRoZSBzdXBwbGllZCByYW5nZTwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibWF4Ij5NYXggdmFsdWUgb2YgdGhlIHN1cHBsaWVkIHJhbmdlPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhcmd1bWVudE5hbWUiPnBhcmFtZXRlci9hcmd1bWVudCBuYW1lPC9wYXJhbT4KKyAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uIj48L2V4Y2VwdGlvbj4KKyAgcHVibGljIHN0YXRpYyB2b2lkIElzSW5SYW5nZTxUPih0aGlzIElBcmd1bWVudDxUPiBhcmd1bWVudCwgVCBtaW4sIFQgbWF4LCBzdHJpbmcgYXJndW1lbnROYW1lKQorICAgICAgd2hlcmUgVCA6IElDb21wYXJhYmxlIHsKKyAgICBpZiAoIShhcmd1bWVudC5WYWx1ZS5Db21wYXJlVG8obWluKSA+PSAwICYmIGFyZ3VtZW50LlZhbHVlLkNvbXBhcmVUbyhtYXgpIDw9IDApKSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKGFyZ3VtZW50TmFtZSk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvVXRpbHMvQ29udmVydFV0aWwuY3MgYi9FUFBsdXMvVXRpbHMvQ29udmVydFV0aWwuY3MKaW5kZXggZDUyODQyNi4uZmRkZjc4NSAxMDA2NDQKLS0tIGEvRVBQbHVzL1V0aWxzL0NvbnZlcnRVdGlsLmNzCisrKyBiL0VQUGx1cy9VdGlscy9Db252ZXJ0VXRpbC5jcwpAQCAtMSwxOTYgKzEsMTcxIEBACi3vu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKK3VzaW5nIFN5c3RlbTsKIHVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLkxpbnE7Cit1c2luZyBTeXN0ZW0uSU87CiB1c2luZyBTeXN0ZW0uVGV4dDsKIHVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKLXVzaW5nIE9mZmljZU9wZW5YbWwuRm9ybXVsYVBhcnNpbmcuRXhwcmVzc2lvbkdyYXBoOwotdXNpbmcgU3lzdGVtLklPOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5VdGlscwotewotICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBDb252ZXJ0VXRpbAotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIGJvb2wgSXNOdW1lcmljKG9iamVjdCBjYW5kaWRhdGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIChjYW5kaWRhdGUuR2V0VHlwZSgpLklzUHJpbWl0aXZlIHx8IGNhbmRpZGF0ZSBpcyBkb3VibGUgfHwgY2FuZGlkYXRlIGlzIGRlY2ltYWwgfHwgY2FuZGlkYXRlIGlzIERhdGVUaW1lIHx8IGNhbmRpZGF0ZSBpcyBUaW1lU3BhbiB8fCBjYW5kaWRhdGUgaXMgbG9uZyk7Ci0gICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBib29sIElzTnVtZXJpY1N0cmluZyhvYmplY3QgY2FuZGlkYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY2FuZGlkYXRlICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFJlZ2V4LklzTWF0Y2goY2FuZGlkYXRlLlRvU3RyaW5nKCksIEAiXltcZF0rKFwsW1xkXSk/Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb252ZXJ0IGFuIG9iamVjdCB2YWx1ZSB0byBhIGRvdWJsZSAKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Imlnbm9yZUJvb2wiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBkb3VibGUgR2V0VmFsdWVEb3VibGUob2JqZWN0IHYsIGJvb2wgaWdub3JlQm9vbCA9IGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGUgZDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpZ25vcmVCb29sICYmIHYgaXMgYm9vbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoSXNOdW1lcmljKHYpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHYgaXMgRGF0ZVRpbWUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGQgPSAoKERhdGVUaW1lKXYpLlRvT0FEYXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodiBpcyBUaW1lU3BhbikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZCA9IERhdGVUaW1lLkZyb21PQURhdGUoMCkuQWRkKChUaW1lU3Bhbil2KS5Ub09BRGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZCA9IENvbnZlcnQuVG9Eb3VibGUodiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXRjaAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gT09YTUwgcmVxdWlyZXMgdGhhdCAiLCIgLCBhbmQgJmFtcDsgYmUgZXNjYXBlZCwgYnV0ICcgYW5kICIgc2hvdWxkICpub3QqIGJlIGVzY2FwZWQsIG5vciBzaG91bGQKLSAgICAgICAgLy8vIGFueSBleHRlbmRlZCBVbmljb2RlIGNoYXJhY3RlcnMuIFRoaXMgZnVuY3Rpb24gb25seSBlbmNvZGVzIHRoZSByZXF1aXJlZCBjaGFyYWN0ZXJzLgotICAgICAgICAvLy8gU3lzdGVtLlNlY3VyaXR5LlNlY3VyaXR5RWxlbWVudC5Fc2NhcGUoKSBlc2NhcGVzICcgYW5kICIgYXMgICZhcG9zOyBhbmQgJnF1b3Q7LCBzbyBpdCBjYW5ub3QKLSAgICAgICAgLy8vIGJlIHVzZWQgcmVsaWFibHkuIFN5c3RlbS5XZWIuSHR0cFV0aWxpdHkuSHRtbEVuY29kZSBvdmVycmVhY2hlcyBhcyB3ZWxsIGFuZCB1c2VzIHRoZSBudW1lcmljCi0gICAgICAgIC8vLyBlc2NhcGUgZXF1aXZhbGVudC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzIj48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEV4Y2VsRXNjYXBlU3RyaW5nKHN0cmluZyBzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcy5SZXBsYWNlKCImIiwgIiZhbXA7IikuUmVwbGFjZSgiPCIsICImbHQ7IikuUmVwbGFjZSgiPiIsICImZ3Q7Iik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBwcmVzZXJ2ZSBzcGFjZSBhdHRyaWJ1dGUgaXMgc2V0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InN3Ij48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIEV4Y2VsRW5jb2RlU3RyaW5nKFN0cmVhbVdyaXRlciBzdywgc3RyaW5nIHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChSZWdleC5Jc01hdGNoKHQsICIoX3hbMC05QS1GXXs0LDR9XykiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBSZWdleC5NYXRjaCh0LCAiKF94WzAtOUEtRl17NCw0fV8pIik7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4QWRkID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAobWF0Y2guU3VjY2VzcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSB0Lkluc2VydChtYXRjaC5JbmRleCArIGluZGV4QWRkLCAiX3gwMDVGIik7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4QWRkICs9IDY7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gbWF0Y2guTmV4dE1hdGNoKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0Lkxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICh0W2ldIDw9IDB4MWYgJiYgdFtpXSAhPSAnXHQnICYmIHRbaV0gIT0gJ1xuJyAmJiB0W2ldICE9ICdccicpIC8vTm90IFRhYiwgQ1Igb3IgTEYKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKCJfeDAwezB9XyIsICh0W2ldIDwgMHhmID8gIjAiIDogIiIpICsgKChpbnQpdFtpXSkuVG9TdHJpbmcoIlgiKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN3LldyaXRlKHRbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybiB0cnVlIGlmIHByZXNlcnZlIHNwYWNlIGF0dHJpYnV0ZSBpcyBzZXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2IiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgRXhjZWxFbmNvZGVTdHJpbmcoU3RyaW5nQnVpbGRlciBzYiwgc3RyaW5nIHQsIGJvb2wgZW5jb2RlVGFiQ1JMRj1mYWxzZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFJlZ2V4LklzTWF0Y2godCwgIihfeFswLTlBLUZdezQsNH1fKSIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IFJlZ2V4Lk1hdGNoKHQsICIoX3hbMC05QS1GXXs0LDR9XykiKTsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXhBZGQgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlIChtYXRjaC5TdWNjZXNzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdCA9IHQuSW5zZXJ0KG1hdGNoLkluZGV4ICsgaW5kZXhBZGQsICJfeDAwNUYiKTsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXhBZGQgKz0gNjsKLSAgICAgICAgICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaC5OZXh0TWF0Y2goKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHQuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHRbaV0gPD0gMHgxZiAmJiAoKHRbaV0gIT0gJ1x0JyAmJiB0W2ldICE9ICdcbicgJiYgdFtpXSAhPSAnXHInICYmIGVuY29kZVRhYkNSTEYgPT0gZmFsc2UpIHx8IGVuY29kZVRhYkNSTEYpKSAvL05vdCBUYWIsIENSIG9yIExGCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzYi5BcHBlbmRGb3JtYXQoIl94MDB7MH1fIiwgKHRbaV0gPCAweGYgPyAiMCIgOiAiIikgKyAoKGludCl0W2ldKS5Ub1N0cmluZygiWCIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc2IuQXBwZW5kKHRbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybiB0cnVlIGlmIHByZXNlcnZlIHNwYWNlIGF0dHJpYnV0ZSBpcyBzZXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ic2IiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idCI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBFeGNlbEVuY29kZVN0cmluZyhzdHJpbmcgdCkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYj1uZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgdD10LlJlcGxhY2UoIlxyXG4iLCAiXG4iKTsgLy9Gb3Igc29tZSByZWFzb24gY2FuJ3QgdGFibGUgbmFtZSBoYXZlIGNyIGluIHRoZW0uIFJlcGxhY2Ugd2l0aCBubAotICAgICAgICAgICAgRXhjZWxFbmNvZGVTdHJpbmcoc2IsIHQsIHRydWUpOwotICAgICAgICAgICAgcmV0dXJuIHNiLlRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBFeGNlbERlY29kZVN0cmluZyhzdHJpbmcgdCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hdGNoID0gUmVnZXguTWF0Y2godCwgIihfeDAwNUZ8X3hbMC05QS1GXXs0LDR9XykiKTsKLSAgICAgICAgICAgIGlmICghbWF0Y2guU3VjY2VzcykgcmV0dXJuIHQ7Ci0KLSAgICAgICAgICAgIHZhciB1c2VOZXh0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgICAgIHZhciByZXQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgdmFyIHByZXZJbmRleCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAobWF0Y2guU3VjY2VzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldkluZGV4IDwgbWF0Y2guSW5kZXgpIHJldC5BcHBlbmQodC5TdWJzdHJpbmcocHJldkluZGV4LCBtYXRjaC5JbmRleCAtIHByZXZJbmRleCkpOwotICAgICAgICAgICAgICAgIGlmICghdXNlTmV4dFZhbHVlICYmIG1hdGNoLlZhbHVlID09ICJfeDAwNUYiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdXNlTmV4dFZhbHVlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZU5leHRWYWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0LkFwcGVuZChtYXRjaC5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1c2VOZXh0VmFsdWUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldC5BcHBlbmQoKGNoYXIpaW50LlBhcnNlKG1hdGNoLlZhbHVlLlN1YnN0cmluZygyLCA0KSwgTnVtYmVyU3R5bGVzLkFsbG93SGV4U3BlY2lmaWVyKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJldkluZGV4ID0gbWF0Y2guSW5kZXggKyBtYXRjaC5MZW5ndGg7Ci0gICAgICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaC5OZXh0TWF0Y2goKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldC5BcHBlbmQodC5TdWJzdHJpbmcocHJldkluZGV4LCB0Lkxlbmd0aCAtIHByZXZJbmRleCkpOwotICAgICAgICAgICAgcmV0dXJuIHJldC5Ub1N0cmluZygpOwotICAgICAgICB9CitpbnRlcm5hbCBzdGF0aWMgY2xhc3MgQ29udmVydFV0aWwgeworICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBJc051bWVyaWMob2JqZWN0IGNhbmRpZGF0ZSkgeworICAgIGlmIChjYW5kaWRhdGUgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KKyAgICByZXR1cm4gKGNhbmRpZGF0ZS5HZXRUeXBlKCkuSXNQcmltaXRpdmUKKyAgICAgICAgICAgIHx8IGNhbmRpZGF0ZSBpcyBkb3VibGUKKyAgICAgICAgICAgIHx8IGNhbmRpZGF0ZSBpcyBkZWNpbWFsCisgICAgICAgICAgICB8fCBjYW5kaWRhdGUgaXMgRGF0ZVRpbWUKKyAgICAgICAgICAgIHx8IGNhbmRpZGF0ZSBpcyBUaW1lU3BhbgorICAgICAgICAgICAgfHwgY2FuZGlkYXRlIGlzIGxvbmcpOworICB9CisKKyAgaW50ZXJuYWwgc3RhdGljIGJvb2wgSXNOdW1lcmljU3RyaW5nKG9iamVjdCBjYW5kaWRhdGUpIHsKKyAgICBpZiAoY2FuZGlkYXRlICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBSZWdleC5Jc01hdGNoKGNhbmRpZGF0ZS5Ub1N0cmluZygpLCBAIl5bXGRdKyhcLFtcZF0pPyIpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDb252ZXJ0IGFuIG9iamVjdCB2YWx1ZSB0byBhIGRvdWJsZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InYiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0iaWdub3JlQm9vbCI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgaW50ZXJuYWwgc3RhdGljIGRvdWJsZSBHZXRWYWx1ZURvdWJsZShvYmplY3QgdiwgYm9vbCBpZ25vcmVCb29sID0gZmFsc2UpIHsKKyAgICBkb3VibGUgZDsKKyAgICB0cnkgeworICAgICAgaWYgKGlnbm9yZUJvb2wgJiYgdiBpcyBib29sKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgaWYgKElzTnVtZXJpYyh2KSkgeworICAgICAgICBpZiAodiBpcyBEYXRlVGltZSkgeworICAgICAgICAgIGQgPSAoKERhdGVUaW1lKXYpLlRvT0FEYXRlKCk7CisgICAgICAgIH0gZWxzZSBpZiAodiBpcyBUaW1lU3BhbikgeworICAgICAgICAgIGQgPSBEYXRlVGltZS5Gcm9tT0FEYXRlKDApLkFkZCgoVGltZVNwYW4pdikuVG9PQURhdGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkID0gQ29udmVydC5Ub0RvdWJsZSh2LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZCA9IDA7CisgICAgICB9CisgICAgfSBjYXRjaCB7CisgICAgICBkID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGQ7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBPT1hNTCByZXF1aXJlcyB0aGF0ICIsIiAsIGFuZCAmYW1wOyBiZSBlc2NhcGVkLCBidXQgJyBhbmQgIiBzaG91bGQgKm5vdCogYmUgZXNjYXBlZCwgbm9yIHNob3VsZAorICAvLy8gYW55IGV4dGVuZGVkIFVuaWNvZGUgY2hhcmFjdGVycy4gVGhpcyBmdW5jdGlvbiBvbmx5IGVuY29kZXMgdGhlIHJlcXVpcmVkIGNoYXJhY3RlcnMuCisgIC8vLyBTeXN0ZW0uU2VjdXJpdHkuU2VjdXJpdHlFbGVtZW50LkVzY2FwZSgpIGVzY2FwZXMgJyBhbmQgIiBhcyAgJmFwb3M7IGFuZCAmcXVvdDssIHNvIGl0IGNhbm5vdAorICAvLy8gYmUgdXNlZCByZWxpYWJseS4gU3lzdGVtLldlYi5IdHRwVXRpbGl0eS5IdG1sRW5jb2RlIG92ZXJyZWFjaGVzIGFzIHdlbGwgYW5kIHVzZXMgdGhlIG51bWVyaWMKKyAgLy8vIGVzY2FwZSBlcXVpdmFsZW50LgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InMiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgRXhjZWxFc2NhcGVTdHJpbmcoc3RyaW5nIHMpIHsKKyAgICByZXR1cm4gcy5SZXBsYWNlKCImIiwgIiZhbXA7IikuUmVwbGFjZSgiPCIsICImbHQ7IikuUmVwbGFjZSgiPiIsICImZ3Q7Iik7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBwcmVzZXJ2ZSBzcGFjZSBhdHRyaWJ1dGUgaXMgc2V0LgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InN3Ij48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InQiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz48L3JldHVybnM+CisgIGludGVybmFsIHN0YXRpYyB2b2lkIEV4Y2VsRW5jb2RlU3RyaW5nKFN0cmVhbVdyaXRlciBzdywgc3RyaW5nIHQpIHsKKyAgICBpZiAoUmVnZXguSXNNYXRjaCh0LCAiKF94WzAtOUEtRl17NCw0fV8pIikpIHsKKyAgICAgIHZhciBtYXRjaCA9IFJlZ2V4Lk1hdGNoKHQsICIoX3hbMC05QS1GXXs0LDR9XykiKTsKKyAgICAgIGludCBpbmRleEFkZCA9IDA7CisgICAgICB3aGlsZSAobWF0Y2guU3VjY2VzcykgeworICAgICAgICB0ID0gdC5JbnNlcnQobWF0Y2guSW5kZXggKyBpbmRleEFkZCwgIl94MDA1RiIpOworICAgICAgICBpbmRleEFkZCArPSA2OworICAgICAgICBtYXRjaCA9IG1hdGNoLk5leHRNYXRjaCgpOworICAgICAgfQorICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHQuTGVuZ3RoOyBpKyspIHsKKyAgICAgIGlmICh0W2ldIDw9IDB4MWYKKyAgICAgICAgICAmJiB0W2ldICE9ICdcdCcKKyAgICAgICAgICAmJiB0W2ldICE9ICdcbicKKyAgICAgICAgICAmJiB0W2ldCisgICAgICAgICAgICAgICE9ICdccicpIC8vTm90IFRhYiwgQ1Igb3IgTEYKKyAgICAgIHsKKyAgICAgICAgc3cuV3JpdGUoIl94MDB7MH1fIiwgKHRbaV0gPCAweGYgPyAiMCIgOiAiIikgKyAoKGludCl0W2ldKS5Ub1N0cmluZygiWCIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN3LldyaXRlKHRbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFJldHVybiB0cnVlIGlmIHByZXNlcnZlIHNwYWNlIGF0dHJpYnV0ZSBpcyBzZXQuCisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0ic2IiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0idCI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgaW50ZXJuYWwgc3RhdGljIHZvaWQgRXhjZWxFbmNvZGVTdHJpbmcoU3RyaW5nQnVpbGRlciBzYiwgc3RyaW5nIHQsIGJvb2wgZW5jb2RlVGFiQ3JsZiA9IGZhbHNlKSB7CisgICAgaWYgKFJlZ2V4LklzTWF0Y2godCwgIihfeFswLTlBLUZdezQsNH1fKSIpKSB7CisgICAgICB2YXIgbWF0Y2ggPSBSZWdleC5NYXRjaCh0LCAiKF94WzAtOUEtRl17NCw0fV8pIik7CisgICAgICBpbnQgaW5kZXhBZGQgPSAwOworICAgICAgd2hpbGUgKG1hdGNoLlN1Y2Nlc3MpIHsKKyAgICAgICAgdCA9IHQuSW5zZXJ0KG1hdGNoLkluZGV4ICsgaW5kZXhBZGQsICJfeDAwNUYiKTsKKyAgICAgICAgaW5kZXhBZGQgKz0gNjsKKyAgICAgICAgbWF0Y2ggPSBtYXRjaC5OZXh0TWF0Y2goKTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0Lkxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAodFtpXSA8PSAweDFmCisgICAgICAgICAgJiYgKCh0W2ldICE9ICdcdCcgJiYgdFtpXSAhPSAnXG4nICYmIHRbaV0gIT0gJ1xyJyAmJiBlbmNvZGVUYWJDcmxmID09IGZhbHNlKQorICAgICAgICAgICAgICAgICAgfHwgZW5jb2RlVGFiQ3JsZikpIC8vTm90IFRhYiwgQ1Igb3IgTEYKKyAgICAgIHsKKyAgICAgICAgc2IuQXBwZW5kRm9ybWF0KCJfeDAwezB9XyIsICh0W2ldIDwgMHhmID8gIjAiIDogIiIpICsgKChpbnQpdFtpXSkuVG9TdHJpbmcoIlgiKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5BcHBlbmQodFtpXSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gUmV0dXJuIHRydWUgaWYgcHJlc2VydmUgc3BhY2UgYXR0cmlidXRlIGlzIHNldC4KKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJzYiI+PC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0Ij48L3BhcmFtPgorICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgorICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEV4Y2VsRW5jb2RlU3RyaW5nKHN0cmluZyB0KSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgdCA9IHQuUmVwbGFjZSgiXHJcbiIsICJcbiIpOyAvL0ZvciBzb21lIHJlYXNvbiBjYW4ndCB0YWJsZSBuYW1lIGhhdmUgY3IgaW4gdGhlbS4gUmVwbGFjZSB3aXRoIG5sCisgICAgRXhjZWxFbmNvZGVTdHJpbmcoc2IsIHQsIHRydWUpOworICAgIHJldHVybiBzYi5Ub1N0cmluZygpOworICB9CisKKyAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBFeGNlbERlY29kZVN0cmluZyhzdHJpbmcgdCkgeworICAgIHZhciBtYXRjaCA9IFJlZ2V4Lk1hdGNoKHQsICIoX3gwMDVGfF94WzAtOUEtRl17NCw0fV8pIik7CisgICAgaWYgKCFtYXRjaC5TdWNjZXNzKSB7CisgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICB2YXIgdXNlTmV4dFZhbHVlID0gZmFsc2U7CisgICAgdmFyIHJldCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgdmFyIHByZXZJbmRleCA9IDA7CisgICAgd2hpbGUgKG1hdGNoLlN1Y2Nlc3MpIHsKKyAgICAgIGlmIChwcmV2SW5kZXggPCBtYXRjaC5JbmRleCkgeworICAgICAgICByZXQuQXBwZW5kKHQuU3Vic3RyaW5nKHByZXZJbmRleCwgbWF0Y2guSW5kZXggLSBwcmV2SW5kZXgpKTsKKyAgICAgIH0KKyAgICAgIGlmICghdXNlTmV4dFZhbHVlICYmIG1hdGNoLlZhbHVlID09ICJfeDAwNUYiKSB7CisgICAgICAgIHVzZU5leHRWYWx1ZSA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAodXNlTmV4dFZhbHVlKSB7CisgICAgICAgICAgcmV0LkFwcGVuZChtYXRjaC5WYWx1ZSk7CisgICAgICAgICAgdXNlTmV4dFZhbHVlID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0LkFwcGVuZCgoY2hhcilpbnQuUGFyc2UobWF0Y2guVmFsdWUuU3Vic3RyaW5nKDIsIDQpLCBOdW1iZXJTdHlsZXMuQWxsb3dIZXhTcGVjaWZpZXIpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcHJldkluZGV4ID0gbWF0Y2guSW5kZXggKyBtYXRjaC5MZW5ndGg7CisgICAgICBtYXRjaCA9IG1hdGNoLk5leHRNYXRjaCgpOworICAgIH0KKyAgICByZXQuQXBwZW5kKHQuU3Vic3RyaW5nKHByZXZJbmRleCwgdC5MZW5ndGggLSBwcmV2SW5kZXgpKTsKKyAgICByZXR1cm4gcmV0LlRvU3RyaW5nKCk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9VdGlscy9JQXJndW1lbnQuY3MgYi9FUFBsdXMvVXRpbHMvSUFyZ3VtZW50LmNzCmluZGV4IGFjNGE1YWEuLjhjNGY2MTQgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9VdGlscy9JQXJndW1lbnQuY3MKKysrIGIvRVBQbHVzL1V0aWxzL0lBcmd1bWVudC5jcwpAQCAtMTMsMzYgKzEzLDI5IEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDEKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlV0aWxzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBbiBhcmd1bWVudAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+QXJndW1lbnQgVHlwZTwvdHlwZXBhcmFtPgotICAgIHB1YmxpYyBpbnRlcmZhY2UgSUFyZ3VtZW50PFQ+Ci0gICAgewotICAgICAgICBUIFZhbHVlIHsgZ2V0OyB9Ci0gICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIEFuIGFyZ3VtZW50CisvLy8gPC9zdW1tYXJ5PgorLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+QXJndW1lbnQgVHlwZTwvdHlwZXBhcmFtPgorcHVibGljIGludGVyZmFjZSBJQXJndW1lbnQ8VD4geworICBUIFZhbHVlIHsgZ2V0OyB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvVXRpbHMvSUV4Y2VsQ2VsbC5jcyBiL0VQUGx1cy9VdGlscy9JRXhjZWxDZWxsLmNzCmluZGV4IDY0NDc5NTEuLmIxMDg3YzMgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9VdGlscy9JRXhjZWxDZWxsLmNzCisrKyBiL0VQUGx1cy9VdGlscy9JRXhjZWxDZWxsLmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMywzOCArMTMsMzkgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogSmFuIEvDpGxsbWFuCQkgICAgICAgICAgICAgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMDktMTAtMDEKICAqIEphbiBLw6RsbG1hbgkJTGljZW5zZSBjaGFuZ2VkIEdQTC0tPkxHUEwgMjAxMS0xMi0xNgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5UZXh0OwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5TdHlsZQotewotICAgIGludGVybmFsIGludGVyZmFjZSBJRXhjZWxDZWxsCi0gICAgewotICAgICAgICAjcmVnaW9uICJwdWJsaWMgcHJvcGVydGllcyIKLSAgICAgICAgb2JqZWN0IFZhbHVlIHtnZXQ7c2V0O30KLSAgICAgICAgc3RyaW5nIFN0eWxlTmFtZSB7IGdldDsgfQotICAgICAgICBpbnQgU3R5bGVJRCB7IGdldDsgc2V0OyB9Ci0gICAgICAgIEV4Y2VsU3R5bGUgU3R5bGUgeyBnZXQ7IH0KLSAgICAgICAgVXJpIEh5cGVybGluayB7IGdldDsgc2V0OyB9Ci0gICAgICAgIHN0cmluZyBGb3JtdWxhIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgc3RyaW5nIEZvcm11bGFSMUMxIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgIH0KK3VzaW5nIFN5c3RlbTsKKworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuU3R5bGU7CisKK2ludGVybmFsIGludGVyZmFjZSBJRXhjZWxDZWxsIHsKKyAgb2JqZWN0IFZhbHVlIHsgZ2V0OyBzZXQ7IH0KKworICBzdHJpbmcgU3R5bGVOYW1lIHsgZ2V0OyB9CisKKyAgaW50IFN0eWxlSUQgeyBnZXQ7IHNldDsgfQorCisgIEV4Y2VsU3R5bGUgU3R5bGUgeyBnZXQ7IH0KKworICBVcmkgSHlwZXJsaW5rIHsgZ2V0OyBzZXQ7IH0KKworICBzdHJpbmcgRm9ybXVsYSB7IGdldDsgc2V0OyB9CisKKyAgc3RyaW5nIEZvcm11bGFSMUMxIHsgZ2V0OyBzZXQ7IH0KIH0KZGlmZiAtLWdpdCBhL0VQUGx1cy9VdGlscy9JVmFsaWRhdGlvblJlc3VsdC5jcyBiL0VQUGx1cy9VdGlscy9JVmFsaWRhdGlvblJlc3VsdC5jcwppbmRleCAxOWI0OTg2Li42MWVmMWMxIDEwMDY0NAotLS0gYS9FUFBsdXMvVXRpbHMvSVZhbGlkYXRpb25SZXN1bHQuY3MKKysrIGIvRVBQbHVzL1V0aWxzL0lWYWxpZGF0aW9uUmVzdWx0LmNzCkBAIC0xLDEzICsxLDcgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK++7v25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbC5VdGlscwotewotICAgIHB1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25SZXN1bHQKLSAgICB7Ci0gICAgICAgIHZvaWQgSXNUcnVlKCk7Ci0gICAgICAgIHZvaWQgSXNGYWxzZSgpOwotICAgIH0KK3B1YmxpYyBpbnRlcmZhY2UgSVZhbGlkYXRpb25SZXN1bHQgeworICB2b2lkIElzVHJ1ZSgpOworCisgIHZvaWQgSXNGYWxzZSgpOwogfQpkaWZmIC0tZ2l0IGEvRVBQbHVzL1V0aWxzL1JlcXVpcmUuY3MgYi9FUFBsdXMvVXRpbHMvUmVxdWlyZS5jcwppbmRleCA2Zjk5NDNmLi4xN2I5OGQ4IDEwMDY0NAotLS0gYS9FUFBsdXMvVXRpbHMvUmVxdWlyZS5jcworKysgYi9FUFBsdXMvVXRpbHMvUmVxdWlyZS5jcwpAQCAtMTMsNDAgKzEzLDMwIEBACiAKICAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIAorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogICogU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCiAgKiBUaGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB2aWV3ZWQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9sZ3BsLWxpY2Vuc2UucGhwCiAgKiBJZiB5b3UgdW5mYW1pbGlhciB3aXRoIHRoaXMgbGljZW5zZSBvciBoYXZlIHF1ZXN0aW9ucyBhYm91dCBpdCwgaGVyZSBpcyBhbiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLWZhcS5odG1sCiAgKgotICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gCisgKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICogVGhlIGF1dGhvciBhY2NlcHRzIG5vIGxpYWJpbGl0eSBmb3IgYW55IGRhbWFnZSBvciBsb3NzIG9mIGJ1c2luZXNzIHRoYXQgdGhpcyBwcm9kdWN0IG1heSBjYXVzZS4KICAqCiAgKiBDb2RlIGNoYW5nZSBub3RlczoKLSAqIAorICoKICAqIEF1dGhvcgkJCQkJCQlDaGFuZ2UJCQkJCQlEYXRlCiAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIE1hdHMgQWxtICAgCQkgICAgICAgICAgICAgICAgQWRkZWQgICAgICAgCQkgICAgICAgIDIwMTEtMDEtMDEKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlV0aWxzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBVdGlsaXR5IGZvciB2YWxpZGF0aW9uCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlcXVpcmUKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgSUFyZ3VtZW50PFQ+IEFyZ3VtZW50PFQ+KFQgYXJndW1lbnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXJndW1lbnQ8VD4oYXJndW1lbnQpOwotICAgICAgICB9Ci0KLQotICAgIH0KKy8vLyA8c3VtbWFyeT4KKy8vLyBVdGlsaXR5IGZvciB2YWxpZGF0aW9uCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIHN0YXRpYyBjbGFzcyBSZXF1aXJlIHsKKyAgcHVibGljIHN0YXRpYyBJQXJndW1lbnQ8VD4gQXJndW1lbnQ8VD4oVCBhcmd1bWVudCkgeworICAgIHJldHVybiBuZXcgQXJndW1lbnQ8VD4oYXJndW1lbnQpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvVXRpbHMvU3FSZWZVdGlsaXR5LmNzIGIvRVBQbHVzL1V0aWxzL1NxUmVmVXRpbGl0eS5jcwppbmRleCBhMTcwNDg2Li41MTE1YmQzIDEwMDY0NAotLS0gYS9FUFBsdXMvVXRpbHMvU3FSZWZVdGlsaXR5LmNzCisrKyBiL0VQUGx1cy9VdGlscy9TcVJlZlV0aWxpdHkuY3MKQEAgLTEsMzkgKzEsMzEgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKK++7v3VzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVXRpbHMKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIENsYXNzIGZvciBoYW5kbGluZyB0cmFuc2xhdGlvbiBiZXR3ZWVuIEV4Y2VsQWRkcmVzc2VzIGFuZCBzcXJlZiBhZGRyZXNzZXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNxUmVmVXRpbGl0eQotICAgIHsKLSAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgLy8vIFRyYW5zZm9ybXMgYW4gYWRkcmVzcyB0byBhIHZhbGlkIHNxUmVmIGFkZHJlc3MuCi0gICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBhZGRyZXNzIHRvIHRyYW5zZm9ybTwvcGFyYW0+Ci0gICAgICAgLy8vIDxyZXR1cm5zPkEgdmFsaWQgU3FSZWYgYWRkcmVzczwvcmV0dXJucz4KLSAgICAgICBwdWJsaWMgc3RhdGljIHN0cmluZyBUb1NxUmVmQWRkcmVzcyhzdHJpbmcgYWRkcmVzcykKLSAgICAgICB7Ci0gICAgICAgICAgIFJlcXVpcmUuQXJndW1lbnQoYWRkcmVzcykuSXNOb3ROdWxsT3JFbXB0eShhZGRyZXNzKTsKLSAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3MuUmVwbGFjZSgiLCIsICIgIik7Ci0gICAgICAgICAgIGFkZHJlc3MgPSBuZXcgUmVnZXgoIlsgXSsiKS5SZXBsYWNlKGFkZHJlc3MsICIgIik7Ci0gICAgICAgICAgIHJldHVybiBhZGRyZXNzOwotICAgICAgIH0KK25hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlV0aWxzOwogCi0gICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgIC8vLyBUcmFuc2Zvcm1zIGFuIHNxUmVmIGFkZHJlc3MgaW50byBhIGV4Y2VsIGFkZHJlc3MKLSAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWRkcmVzcyI+VGhlIGFkZHJlc3MgdG8gdHJhbnNmb3JtPC9wYXJhbT4KLSAgICAgICAvLy8gPHJldHVybnM+QSB2YWxpZCBleGNlbCBhZGRyZXNzPC9yZXR1cm5zPgotICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIEZyb21TcVJlZkFkZHJlc3Moc3RyaW5nIGFkZHJlc3MpCi0gICAgICAgewotICAgICAgICAgICBSZXF1aXJlLkFyZ3VtZW50KGFkZHJlc3MpLklzTm90TnVsbE9yRW1wdHkoYWRkcmVzcyk7Ci0gICAgICAgICAgIGFkZHJlc3MgPSBhZGRyZXNzLlJlcGxhY2UoIiAiLCAiLCIpOwotICAgICAgICAgICByZXR1cm4gYWRkcmVzczsKLSAgICAgICB9Ci0gICAgfQorLy8vIDxzdW1tYXJ5PgorLy8vIENsYXNzIGZvciBoYW5kbGluZyB0cmFuc2xhdGlvbiBiZXR3ZWVuIEV4Y2VsQWRkcmVzc2VzIGFuZCBzcXJlZiBhZGRyZXNzZXMuCisvLy8gPC9zdW1tYXJ5PgorcHVibGljIHN0YXRpYyBjbGFzcyBTcVJlZlV0aWxpdHkgeworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUcmFuc2Zvcm1zIGFuIGFkZHJlc3MgdG8gYSB2YWxpZCBzcVJlZiBhZGRyZXNzLgorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9ImFkZHJlc3MiPlRoZSBhZGRyZXNzIHRvIHRyYW5zZm9ybTwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5BIHZhbGlkIFNxUmVmIGFkZHJlc3M8L3JldHVybnM+CisgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFRvU3FSZWZBZGRyZXNzKHN0cmluZyBhZGRyZXNzKSB7CisgICAgUmVxdWlyZS5Bcmd1bWVudChhZGRyZXNzKS5Jc05vdE51bGxPckVtcHR5KGFkZHJlc3MpOworICAgIGFkZHJlc3MgPSBhZGRyZXNzLlJlcGxhY2UoIiwiLCAiICIpOworICAgIGFkZHJlc3MgPSBuZXcgUmVnZXgoIlsgXSsiKS5SZXBsYWNlKGFkZHJlc3MsICIgIik7CisgICAgcmV0dXJuIGFkZHJlc3M7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBUcmFuc2Zvcm1zIGFuIHNxUmVmIGFkZHJlc3MgaW50byBhIGV4Y2VsIGFkZHJlc3MKKyAgLy8vIDwvc3VtbWFyeT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJhZGRyZXNzIj5UaGUgYWRkcmVzcyB0byB0cmFuc2Zvcm08L3BhcmFtPgorICAvLy8gPHJldHVybnM+QSB2YWxpZCBleGNlbCBhZGRyZXNzPC9yZXR1cm5zPgorICBwdWJsaWMgc3RhdGljIHN0cmluZyBGcm9tU3FSZWZBZGRyZXNzKHN0cmluZyBhZGRyZXNzKSB7CisgICAgUmVxdWlyZS5Bcmd1bWVudChhZGRyZXNzKS5Jc05vdE51bGxPckVtcHR5KGFkZHJlc3MpOworICAgIGFkZHJlc3MgPSBhZGRyZXNzLlJlcGxhY2UoIiAiLCAiLCIpOworICAgIHJldHVybiBhZGRyZXNzOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvVXRpbHMvVXJpSGVscGVyLmNzIGIvRVBQbHVzL1V0aWxzL1VyaUhlbHBlci5jcwppbmRleCA4NGZmOTQzLi44ZjljMDRiIDEwMDY0NAotLS0gYS9FUFBsdXMvVXRpbHMvVXJpSGVscGVyLmNzCisrKyBiL0VQUGx1cy9VdGlscy9VcmlIZWxwZXIuY3MKQEAgLTEsOTEgKzEsNjkgQEAKLe+7v3VzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbTsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVXRpbHMKLXsKLSAgICBpbnRlcm5hbCBjbGFzcyBVcmlIZWxwZXIKLSAgICB7Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBVcmkgUmVzb2x2ZVBhcnRVcmkoVXJpIHNvdXJjZVVyaSwgVXJpIHRhcmdldFVyaSkKLSAgICAgICAgewotICAgICAgICAgICBpZih0YXJnZXRVcmkuT3JpZ2luYWxTdHJpbmcuU3RhcnRzV2l0aCgiLyIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXRVcmk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJpbmdbXSBzb3VyY2UgPSBzb3VyY2VVcmkuT3JpZ2luYWxTdHJpbmcuU3BsaXQoJy8nKTsKLSAgICAgICAgICAgIHN0cmluZ1tdIHRhcmdldCA9IHRhcmdldFVyaS5PcmlnaW5hbFN0cmluZy5TcGxpdCgnLycpOworbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLSAgICAgICAgICAgIGludCB0ID0gdGFyZ2V0Lkxlbmd0aCAtIDE7Ci0gICAgICAgICAgICBpbnQgczsKLSAgICAgICAgICAgIGlmKHNvdXJjZVVyaS5PcmlnaW5hbFN0cmluZy5FbmRzV2l0aCgiLyIpKSAvL2lzIHRoZSBzb3VyY2UgYSBkaXJlY3Rvcnk/Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcyA9IHNvdXJjZS5MZW5ndGgtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzPXNvdXJjZS5MZW5ndGgtMjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyaW5nIGZpbGUgPSB0YXJnZXRbdC0tXTsKLQotICAgICAgICAgICAgd2hpbGUgKHQgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodGFyZ2V0W3RdID09ICIuIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmICh0YXJnZXRbdF0gPT0gIi4uIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHMtLTsKLSAgICAgICAgICAgICAgICAgICAgdC0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaWxlID0gdGFyZ2V0W3QtLV0gKyAiLyIgKyBmaWxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzID49IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yKGludCBpPXM7aT49MDtpLS0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaWxlID0gc291cmNlW2ldICsgIi8iICsgZmlsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVyaShmaWxlLFVyaUtpbmQuUmVsYXRpdmVPckFic29sdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBVcmkgR2V0UmVsYXRpdmVVcmkoVXJpIFdvcmtzaGVldFVyaSwgVXJpIHVyaSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nW10gc291cmNlID0gV29ya3NoZWV0VXJpLk9yaWdpbmFsU3RyaW5nLlNwbGl0KCcvJyk7Ci0gICAgICAgICAgICBzdHJpbmdbXSB0YXJnZXQgPSB1cmkuT3JpZ2luYWxTdHJpbmcuU3BsaXQoJy8nKTsKLQotICAgICAgICAgICAgaW50IHNsZW47Ci0gICAgICAgICAgICBpZiAoV29ya3NoZWV0VXJpLk9yaWdpbmFsU3RyaW5nLkVuZHNXaXRoKCIvIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2xlbiA9IHNvdXJjZS5MZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2xlbiA9IHNvdXJjZS5MZW5ndGgtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChpIDwgc2xlbiAmJiBpIDwgdGFyZ2V0Lkxlbmd0aCAmJiBzb3VyY2VbaV0gPT0gdGFyZ2V0W2ldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyaW5nIGRpclVwPSIiOwotICAgICAgICAgICAgZm9yIChpbnQgcyA9IGk7IHMgPCBzbGVuOyBzKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGlyVXAgKz0gIi4uLyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJpbmcgZmlsZSA9ICIiOwotICAgICAgICAgICAgZm9yIChpbnQgdCA9IGk7IHQgPCB0YXJnZXQuTGVuZ3RoOyB0KyspCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZpbGUgKz0gKGZpbGU9PSIiPyIiOiIvIikgKyB0YXJnZXRbdF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFVyaShkaXJVcCtmaWxlLFVyaUtpbmQuUmVsYXRpdmUpOwotICAgICAgICB9CitpbnRlcm5hbCBjbGFzcyBVcmlIZWxwZXIgeworICBpbnRlcm5hbCBzdGF0aWMgVXJpIFJlc29sdmVQYXJ0VXJpKFVyaSBzb3VyY2VVcmksIFVyaSB0YXJnZXRVcmkpIHsKKyAgICBpZiAodGFyZ2V0VXJpLk9yaWdpbmFsU3RyaW5nLlN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgcmV0dXJuIHRhcmdldFVyaTsKICAgICB9CisgICAgc3RyaW5nW10gc291cmNlID0gc291cmNlVXJpLk9yaWdpbmFsU3RyaW5nLlNwbGl0KCcvJyk7CisgICAgc3RyaW5nW10gdGFyZ2V0ID0gdGFyZ2V0VXJpLk9yaWdpbmFsU3RyaW5nLlNwbGl0KCcvJyk7CisKKyAgICBpbnQgdCA9IHRhcmdldC5MZW5ndGggLSAxOworICAgIGludCBzOworICAgIGlmIChzb3VyY2VVcmkuT3JpZ2luYWxTdHJpbmcuRW5kc1dpdGgoCisgICAgICAgICIvIikpIC8vaXMgdGhlIHNvdXJjZSBhIGRpcmVjdG9yeT8KKyAgICB7CisgICAgICBzID0gc291cmNlLkxlbmd0aCAtIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHMgPSBzb3VyY2UuTGVuZ3RoIC0gMjsKKyAgICB9CisKKyAgICBzdHJpbmcgZmlsZSA9IHRhcmdldFt0LS1dOworCisgICAgd2hpbGUgKHQgPj0gMCkgeworICAgICAgaWYgKHRhcmdldFt0XSA9PSAiLiIpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAodGFyZ2V0W3RdID09ICIuLiIpIHsKKyAgICAgICAgcy0tOworICAgICAgICB0LS07CisgICAgICB9IGVsc2UgeworICAgICAgICBmaWxlID0gdGFyZ2V0W3QtLV0gKyAiLyIgKyBmaWxlOworICAgICAgfQorICAgIH0KKyAgICBpZiAocyA+PSAwKSB7CisgICAgICBmb3IgKGludCBpID0gczsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgZmlsZSA9IHNvdXJjZVtpXSArICIvIiArIGZpbGU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXcoZmlsZSwgVXJpS2luZC5SZWxhdGl2ZU9yQWJzb2x1dGUpOworICB9CisKKyAgaW50ZXJuYWwgc3RhdGljIFVyaSBHZXRSZWxhdGl2ZVVyaShVcmkgd29ya3NoZWV0VXJpLCBVcmkgdXJpKSB7CisgICAgc3RyaW5nW10gc291cmNlID0gd29ya3NoZWV0VXJpLk9yaWdpbmFsU3RyaW5nLlNwbGl0KCcvJyk7CisgICAgc3RyaW5nW10gdGFyZ2V0ID0gdXJpLk9yaWdpbmFsU3RyaW5nLlNwbGl0KCcvJyk7CisKKyAgICBpbnQgc2xlbjsKKyAgICBpZiAod29ya3NoZWV0VXJpLk9yaWdpbmFsU3RyaW5nLkVuZHNXaXRoKCIvIikpIHsKKyAgICAgIHNsZW4gPSBzb3VyY2UuTGVuZ3RoOworICAgIH0gZWxzZSB7CisgICAgICBzbGVuID0gc291cmNlLkxlbmd0aCAtIDE7CisgICAgfQorICAgIGludCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IHNsZW4gJiYgaSA8IHRhcmdldC5MZW5ndGggJiYgc291cmNlW2ldID09IHRhcmdldFtpXSkgeworICAgICAgaSsrOworICAgIH0KKworICAgIHN0cmluZyBkaXJVcCA9ICIiOworICAgIGZvciAoaW50IHMgPSBpOyBzIDwgc2xlbjsgcysrKSB7CisgICAgICBkaXJVcCArPSAiLi4vIjsKKyAgICB9CisgICAgc3RyaW5nIGZpbGUgPSAiIjsKKyAgICBmb3IgKGludCB0ID0gaTsgdCA8IHRhcmdldC5MZW5ndGg7IHQrKykgeworICAgICAgZmlsZSArPSAoZmlsZSA9PSAiIiA/ICIiIDogIi8iKSArIHRhcmdldFt0XTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyhkaXJVcCArIGZpbGUsIFVyaUtpbmQuUmVsYXRpdmUpOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvVXRpbHMvVmFsaWRhdGlvblJlc3VsdC5jcyBiL0VQUGx1cy9VdGlscy9WYWxpZGF0aW9uUmVzdWx0LmNzCmluZGV4IGNiMDRkYWIuLjI5ODU0OTEgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9VdGlscy9WYWxpZGF0aW9uUmVzdWx0LmNzCisrKyBiL0VQUGx1cy9VdGlscy9WYWxpZGF0aW9uUmVzdWx0LmNzCkBAIC0xLDUwICsxLDM1IEBACiDvu791c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7CiAKLW5hbWVzcGFjZSBPZmZpY2VPcGVuWG1sLlV0aWxzCi17Ci0gICAgcHVibGljIGNsYXNzIFZhbGlkYXRpb25SZXN1bHQgOiBJVmFsaWRhdGlvblJlc3VsdAotICAgIHsKLSAgICAgICAgcHVibGljIFZhbGlkYXRpb25SZXN1bHQoYm9vbCByZXN1bHQpCi0gICAgICAgICAgICA6IHRoaXMocmVzdWx0LCBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwuVXRpbHM7CiAKLSAgICAgICAgcHVibGljIFZhbGlkYXRpb25SZXN1bHQoYm9vbCByZXN1bHQsIHN0cmluZyBlcnJvck1lc3NhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIF9yZXN1bHQgPSByZXN1bHQ7Ci0gICAgICAgICAgICBfZXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotICAgICAgICB9CitwdWJsaWMgY2xhc3MgVmFsaWRhdGlvblJlc3VsdCA6IElWYWxpZGF0aW9uUmVzdWx0IHsKKyAgcHVibGljIFZhbGlkYXRpb25SZXN1bHQoYm9vbCByZXN1bHQpCisgICAgICA6IHRoaXMocmVzdWx0LCBudWxsKSB7fQogCi0gICAgICAgIHByaXZhdGUgYm9vbCBfcmVzdWx0OwotICAgICAgICBwcml2YXRlIHN0cmluZyBfZXJyb3JNZXNzYWdlOworICBwdWJsaWMgVmFsaWRhdGlvblJlc3VsdChib29sIHJlc3VsdCwgc3RyaW5nIGVycm9yTWVzc2FnZSkgeworICAgIF9yZXN1bHQgPSByZXN1bHQ7CisgICAgX2Vycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZTsKKyAgfQogCi0gICAgICAgIHByaXZhdGUgdm9pZCBUaHJvdygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHN0cmluZy5Jc051bGxPckVtcHR5KF9lcnJvck1lc3NhZ2UpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbihfZXJyb3JNZXNzYWdlKTsKLSAgICAgICAgfQorICBwcml2YXRlIGJvb2wgX3Jlc3VsdDsKKyAgcHJpdmF0ZSBzdHJpbmcgX2Vycm9yTWVzc2FnZTsKIAotICAgICAgICB2b2lkIElWYWxpZGF0aW9uUmVzdWx0LklzVHJ1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghX3Jlc3VsdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUaHJvdygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBJVmFsaWRhdGlvblJlc3VsdC5Jc0ZhbHNlKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKF9yZXN1bHQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGhyb3coKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICBwcml2YXRlIHZvaWQgVGhyb3coKSB7CisgICAgaWYgKHN0cmluZy5Jc051bGxPckVtcHR5KF9lcnJvck1lc3NhZ2UpKSB7CisgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KKyAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbihfZXJyb3JNZXNzYWdlKTsKKyAgfQorCisgIHZvaWQgSVZhbGlkYXRpb25SZXN1bHQuSXNUcnVlKCkgeworICAgIGlmICghX3Jlc3VsdCkgeworICAgICAgVGhyb3coKTsKKyAgICB9CisgIH0KKworICB2b2lkIElWYWxpZGF0aW9uUmVzdWx0LklzRmFsc2UoKSB7CisgICAgaWYgKF9yZXN1bHQpIHsKKyAgICAgIFRocm93KCk7CisgICAgfQorICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvWG1sSGVscGVyLmNzIGIvRVBQbHVzL1htbEhlbHBlci5jcwppbmRleCA2OTE1YTRhLi45NDU1MjQyIDEwMDY0NAotLS0gYS9FUFBsdXMvWG1sSGVscGVyLmNzCisrKyBiL0VQUGx1cy9YbWxIZWxwZXIuY3MKQEAgLTEsNCArMSw0IEBACi3vu78vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFlvdSBtYXkgYW1lbmQgYW5kIGRpc3RyaWJ1dGUgYXMgeW91IGxpa2UsIGJ1dCBkb24ndCByZW1vdmUgdGhpcyBoZWFkZXIhCiAgKgogICogRVBQbHVzIHByb3ZpZGVzIHNlcnZlci1zaWRlIGdlbmVyYXRpb24gb2YgRXhjZWwgMjAwNy8yMDEwIHNwcmVhZHNoZWV0cy4KQEAgLTEzLDE3ICsxMywxNyBAQAogCiAgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICAKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KICAqIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKgogICogVGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBjYW4gYmUgdmlld2VkIGF0IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbGdwbC1saWNlbnNlLnBocAogICogSWYgeW91IHVuZmFtaWxpYXIgd2l0aCB0aGlzIGxpY2Vuc2Ugb3IgaGF2ZSBxdWVzdGlvbnMgYWJvdXQgaXQsIGhlcmUgaXMgYW4gaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC1mYXEuaHRtbAogICoKLSAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIAorICogQWxsIGNvZGUgYW5kIGV4ZWN1dGFibGVzIGFyZSBwcm92aWRlZCAiYXMgaXMiIHdpdGggbm8gd2FycmFudHkgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAqIFRoZSBhdXRob3IgYWNjZXB0cyBubyBsaWFiaWxpdHkgZm9yIGFueSBkYW1hZ2Ugb3IgbG9zcyBvZiBidXNpbmVzcyB0aGF0IHRoaXMgcHJvZHVjdCBtYXkgY2F1c2UuCiAgKgogICogQ29kZSBjaGFuZ2Ugbm90ZXM6Ci0gKiAKKyAqCiAgKiBBdXRob3IJCQkJCQkJQ2hhbmdlCQkJCQkJICAgICAgICAgRGF0ZQogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBKYW4gS8OkbGxtYW4JCSAgICBJbml0aWFsIFJlbGVhc2UJCSAgICAgICAgIDIwMDktMTAtMDEKQEAgLTMzLDc5OCArMzMsNjU4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5YbWw7Ci11c2luZyBPZmZpY2VPcGVuWG1sLlN0eWxlOwogdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247CiB1c2luZyBTeXN0ZW0uSU87Ci1uYW1lc3BhY2UgT2ZmaWNlT3BlblhtbAotewotCS8vLyA8c3VtbWFyeT4KLQkvLy8gSGVscCBjbGFzcyBjb250YWluaW5nIFhNTCBmdW5jdGlvbnMuIAotCS8vLyBDYW4gYmUgSW5oZXJpdGVkIAotCS8vLyA8L3N1bW1hcnk+Ci0JcHVibGljIGFic3RyYWN0IGNsYXNzIFhtbEhlbHBlcgotCXsKLQkJaW50ZXJuYWwgZGVsZWdhdGUgaW50IENoYW5nZWRFdmVudEhhbmRsZXIoU3R5bGVCYXNlIHNlbmRlciwgU3R5bGUuU3R5bGVDaGFuZ2VFdmVudEFyZ3MgZSk7Cit1c2luZyBTeXN0ZW0uVGV4dDsKK3VzaW5nIFN5c3RlbS5YbWw7Cit1c2luZyBPZmZpY2VPcGVuWG1sLlBhY2thZ2luZzsKK3VzaW5nIE9mZmljZU9wZW5YbWwuU3R5bGU7CiAKLQkJaW50ZXJuYWwgWG1sSGVscGVyKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlcikKLQkJewotCQkJVG9wTm9kZSA9IG51bGw7Ci0JCQlOYW1lU3BhY2VNYW5hZ2VyID0gbmFtZVNwYWNlTWFuYWdlcjsKLQkJfQorbmFtZXNwYWNlIE9mZmljZU9wZW5YbWw7CiAKLQkJaW50ZXJuYWwgWG1sSGVscGVyKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlKQotCQl7Ci0JCQlUb3BOb2RlID0gdG9wTm9kZTsKLQkJCU5hbWVTcGFjZU1hbmFnZXIgPSBuYW1lU3BhY2VNYW5hZ2VyOwotCQl9Ci0JCS8vaW50ZXJuYWwgYm9vbCBDaGFuZ2VkRmxhZzsKLQkJaW50ZXJuYWwgWG1sTmFtZXNwYWNlTWFuYWdlciBOYW1lU3BhY2VNYW5hZ2VyIHsgZ2V0OyBzZXQ7IH0KLQkJaW50ZXJuYWwgWG1sTm9kZSBUb3BOb2RlIHsgZ2V0OyBzZXQ7IH0KLQkJc3RyaW5nW10gX3NjaGVtYU5vZGVPcmRlciA9IG51bGw7Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIFNjaGVtYSBvcmRlciBsaXN0Ci0JCS8vLyA8L3N1bW1hcnk+Ci0JCWludGVybmFsIHN0cmluZ1tdIFNjaGVtYU5vZGVPcmRlcgotCQl7Ci0JCQlnZXQKLQkJCXsKLQkJCQlyZXR1cm4gX3NjaGVtYU5vZGVPcmRlcjsKLQkJCX0KLQkJCXNldAotCQkJewotCQkJCV9zY2hlbWFOb2RlT3JkZXIgPSB2YWx1ZTsKLQkJCX0KLQkJfQotCQlpbnRlcm5hbCBYbWxOb2RlIENyZWF0ZU5vZGUoc3RyaW5nIHBhdGgpCi0JCXsKLQkJCWlmIChwYXRoID09ICIiKQotCQkJCXJldHVybiBUb3BOb2RlOwotCQkJZWxzZQotCQkJCXJldHVybiBDcmVhdGVOb2RlKHBhdGgsIGZhbHNlKTsKLQkJfQotCQlpbnRlcm5hbCBYbWxOb2RlIENyZWF0ZU5vZGUoc3RyaW5nIHBhdGgsIGJvb2wgaW5zZXJ0Rmlyc3QpCi0JCXsKLQkJCVhtbE5vZGUgbm9kZSA9IFRvcE5vZGU7Ci0JCQlYbWxOb2RlIHByZXBlbmROb2RlID0gbnVsbDsKLQkJCWZvcmVhY2ggKHN0cmluZyBzdWJQYXRoIGluIHBhdGguU3BsaXQoJy8nKSkKLQkJCXsKLQkJCQlYbWxOb2RlIHN1Yk5vZGUgPSBub2RlLlNlbGVjdFNpbmdsZU5vZGUoc3ViUGF0aCwgTmFtZVNwYWNlTWFuYWdlcik7Ci0JCQkJaWYgKHN1Yk5vZGUgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCXN0cmluZyBub2RlTmFtZTsKLQkJCQkJc3RyaW5nIG5vZGVQcmVmaXg7CisvLy8gPHN1bW1hcnk+CisvLy8gSGVscCBjbGFzcyBjb250YWluaW5nIFhNTCBmdW5jdGlvbnMuCisvLy8gQ2FuIGJlIEluaGVyaXRlZAorLy8vIDwvc3VtbWFyeT4KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBYbWxIZWxwZXIgeworICBpbnRlcm5hbCBkZWxlZ2F0ZSBpbnQgQ2hhbmdlZEV2ZW50SGFuZGxlcihTdHlsZUJhc2Ugc2VuZGVyLCBTdHlsZUNoYW5nZUV2ZW50QXJncyBlKTsKIAotCQkJCQlzdHJpbmcgbmFtZVNwYWNlVVJJID0gIiI7Ci0JCQkJCXN0cmluZ1tdIG5hbWVTcGxpdCA9IHN1YlBhdGguU3BsaXQoJzonKTsKKyAgaW50ZXJuYWwgWG1sSGVscGVyKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZVNwYWNlTWFuYWdlcikgeworICAgIFRvcE5vZGUgPSBudWxsOworICAgIE5hbWVTcGFjZU1hbmFnZXIgPSBuYW1lU3BhY2VNYW5hZ2VyOworICB9CiAKLQkJCQkJaWYgKFNjaGVtYU5vZGVPcmRlciAhPSBudWxsICYmIHN1YlBhdGhbMF0gIT0gJ0AnKQotCQkJCQl7Ci0JCQkJCQlpbnNlcnRGaXJzdCA9IGZhbHNlOwotCQkJCQkJcHJlcGVuZE5vZGUgPSBHZXRQcmVwZW5kTm9kZShzdWJQYXRoLCBub2RlKTsKLQkJCQkJfQorICBpbnRlcm5hbCBYbWxIZWxwZXIoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lU3BhY2VNYW5hZ2VyLCBYbWxOb2RlIHRvcE5vZGUpIHsKKyAgICBUb3BOb2RlID0gdG9wTm9kZTsKKyAgICBOYW1lU3BhY2VNYW5hZ2VyID0gbmFtZVNwYWNlTWFuYWdlcjsKKyAgfQogCi0JCQkJCWlmIChuYW1lU3BsaXQuTGVuZ3RoID4gMSkKLQkJCQkJewotCQkJCQkJbm9kZVByZWZpeCA9IG5hbWVTcGxpdFswXTsKLQkJCQkJCWlmIChub2RlUHJlZml4WzBdID09ICdAJykgbm9kZVByZWZpeCA9IG5vZGVQcmVmaXguU3Vic3RyaW5nKDEsIG5vZGVQcmVmaXguTGVuZ3RoIC0gMSk7Ci0JCQkJCQluYW1lU3BhY2VVUkkgPSBOYW1lU3BhY2VNYW5hZ2VyLkxvb2t1cE5hbWVzcGFjZShub2RlUHJlZml4KTsKLQkJCQkJCW5vZGVOYW1lID0gbmFtZVNwbGl0WzFdOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJbm9kZVByZWZpeCA9ICIiOwotCQkJCQkJbmFtZVNwYWNlVVJJID0gIiI7Ci0JCQkJCQlub2RlTmFtZSA9IG5hbWVTcGxpdFswXTsKLQkJCQkJfQotCQkJCQlpZiAoc3ViUGF0aC5TdGFydHNXaXRoKCJAIikpCi0JCQkJCXsKLQkJCQkJCVhtbEF0dHJpYnV0ZSBhZGRlZEF0dCA9IG5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVBdHRyaWJ1dGUoc3ViUGF0aC5TdWJzdHJpbmcoMSwgc3ViUGF0aC5MZW5ndGggLSAxKSwgbmFtZVNwYWNlVVJJKTsgIC8vbmFtZVNwYWNlVVJJCi0JCQkJCQlub2RlLkF0dHJpYnV0ZXMuQXBwZW5kKGFkZGVkQXR0KTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCWlmIChub2RlUHJlZml4ID09ICIiKQotCQkJCQkJewotCQkJCQkJCXN1Yk5vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChub2RlTmFtZSwgbmFtZVNwYWNlVVJJKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCXsKLQkJCQkJCQlpZiAobm9kZVByZWZpeCA9PSAiIiB8fCAobm9kZS5Pd25lckRvY3VtZW50ICE9IG51bGwgJiYgbm9kZS5Pd25lckRvY3VtZW50LkRvY3VtZW50RWxlbWVudCAhPSBudWxsICYmIG5vZGUuT3duZXJEb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQuTmFtZXNwYWNlVVJJID09IG5hbWVTcGFjZVVSSSAmJgotCQkJCQkJCQkJbm9kZS5Pd25lckRvY3VtZW50LkRvY3VtZW50RWxlbWVudC5QcmVmaXggPT0gIiIpKQotCQkJCQkJCXsKLQkJCQkJCQkJc3ViTm9kZSA9IG5vZGUuT3duZXJEb2N1bWVudC5DcmVhdGVFbGVtZW50KG5vZGVOYW1lLCBuYW1lU3BhY2VVUkkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJewotCQkJCQkJCQlzdWJOb2RlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQobm9kZVByZWZpeCwgbm9kZU5hbWUsIG5hbWVTcGFjZVVSSSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKHByZXBlbmROb2RlICE9IG51bGwpCi0JCQkJCQl7Ci0JCQkJCQkJbm9kZS5JbnNlcnRCZWZvcmUoc3ViTm9kZSwgcHJlcGVuZE5vZGUpOwotCQkJCQkJCXByZXBlbmROb2RlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGluc2VydEZpcnN0KQotCQkJCQkJewotCQkJCQkJCW5vZGUuUHJlcGVuZENoaWxkKHN1Yk5vZGUpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJewotCQkJCQkJCW5vZGUuQXBwZW5kQ2hpbGQoc3ViTm9kZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbm9kZSA9IHN1Yk5vZGU7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9kZTsKLQkJfQorICAvL2ludGVybmFsIGJvb2wgQ2hhbmdlZEZsYWc7CisgIGludGVybmFsIFhtbE5hbWVzcGFjZU1hbmFnZXIgTmFtZVNwYWNlTWFuYWdlciB7IGdldDsgc2V0OyB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gT3B0aW9ucyB0byBpbnNlcnQgYSBub2RlIGluIHRoZSBYbWxEb2N1bWVudAotCQkvLy8gPC9zdW1tYXJ5PgotCQlpbnRlcm5hbCBlbnVtIGVOb2RlSW5zZXJ0T3JkZXIKLQkJewotCQkJLy8vIDxzdW1tYXJ5PgotCQkJLy8vIEluc2VydCBhcyBmaXJzdCBub2RlIG9mICJ0b3BOb2RlIgotCQkJLy8vIDwvc3VtbWFyeT4KLQkJCUZpcnN0LAorICBpbnRlcm5hbCBYbWxOb2RlIFRvcE5vZGUgeyBnZXQ7IHNldDsgfQogCi0JCQkvLy8gPHN1bW1hcnk+Ci0JCQkvLy8gSW5zZXJ0IGFzIHRoZSBsYXN0IGNoaWxkIG9mICJ0b3BOb2RlIgotCQkJLy8vIDwvc3VtbWFyeT4KLQkJCUxhc3QsCisgIHByaXZhdGUgc3RyaW5nW10gX3NjaGVtYU5vZGVPcmRlcjsKIAotCQkJLy8vIDxzdW1tYXJ5PgotCQkJLy8vIEluc2VydCBhZnRlciB0aGUgInJlZmVyZW5jZU5vZGUiCi0JCQkvLy8gPC9zdW1tYXJ5PgotCQkJQWZ0ZXIsCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIFNjaGVtYSBvcmRlciBsaXN0CisgIC8vLyA8L3N1bW1hcnk+CisgIGludGVybmFsIHN0cmluZ1tdIFNjaGVtYU5vZGVPcmRlciB7CisgICAgZ2V0ID0+IF9zY2hlbWFOb2RlT3JkZXI7CisgICAgc2V0ID0+IF9zY2hlbWFOb2RlT3JkZXIgPSB2YWx1ZTsKKyAgfQogCi0JCQkvLy8gPHN1bW1hcnk+Ci0JCQkvLy8gSW5zZXJ0IGJlZm9yZSB0aGUgInJlZmVyZW5jZU5vZGUiCi0JCQkvLy8gPC9zdW1tYXJ5PgotCQkJQmVmb3JlLAorICBpbnRlcm5hbCBYbWxOb2RlIENyZWF0ZU5vZGUoc3RyaW5nIHBhdGgpIHsKKyAgICBpZiAocGF0aCA9PSAiIikgeworICAgICAgcmV0dXJuIFRvcE5vZGU7CisgICAgfQorICAgIHJldHVybiBDcmVhdGVOb2RlKHBhdGgsIGZhbHNlKTsKKyAgfQogCi0JCQkvLy8gPHN1bW1hcnk+Ci0JCQkvLy8gVXNlIHRoZSBTY2hlbWEgTGlzdCB0byBpbnNlcnQgaW4gdGhlIHJpZ2h0IG9yZGVyLiBJZiB0aGUgU2NoZW1hIGxpc3QKLQkJCS8vLyBpcyBudWxsIG9yIGVtcHR5LCBjb25zaWRlciAiTGFzdCIgYXMgdGhlIHNlbGVjdGVkIG9wdGlvbgotCQkJLy8vIDwvc3VtbWFyeT4KLQkJCVNjaGVtYU9yZGVyCi0JCX0KKyAgaW50ZXJuYWwgWG1sTm9kZSBDcmVhdGVOb2RlKHN0cmluZyBwYXRoLCBib29sIGluc2VydEZpcnN0KSB7CisgICAgWG1sTm9kZSBub2RlID0gVG9wTm9kZTsKKyAgICBYbWxOb2RlIHByZXBlbmROb2RlID0gbnVsbDsKKyAgICBmb3JlYWNoIChzdHJpbmcgc3ViUGF0aCBpbiBwYXRoLlNwbGl0KCcvJykpIHsKKyAgICAgIFhtbE5vZGUgc3ViTm9kZSA9IG5vZGUuU2VsZWN0U2luZ2xlTm9kZShzdWJQYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgIGlmIChzdWJOb2RlID09IG51bGwpIHsKKyAgICAgICAgc3RyaW5nIG5vZGVOYW1lOworICAgICAgICBzdHJpbmcgbm9kZVByZWZpeDsKIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBDcmVhdGUgYSBjb21wbGV4IG5vZGUuIEluc2VydCB0aGUgbm9kZSBhY2NvcmRpbmcgdG8gU2NoZW1hT3JkZXIKLQkJLy8vIHVzaW5nIHRoZSBUb3BOb2RlIGFzIHRoZSBwYXJlbnQKLQkJLy8vIDwvc3VtbWFyeT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJwYXRoIj48L3BhcmFtPgotCQkvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotCQlpbnRlcm5hbCBYbWxOb2RlIENyZWF0ZUNvbXBsZXhOb2RlKAotCQkJc3RyaW5nIHBhdGgpCi0JCXsKLQkJCXJldHVybiBDcmVhdGVDb21wbGV4Tm9kZSgKLQkJCQlUb3BOb2RlLAotCQkJCXBhdGgsCi0JCQkJZU5vZGVJbnNlcnRPcmRlci5TY2hlbWFPcmRlciwKLQkJCQludWxsKTsKLQkJfQorICAgICAgICBzdHJpbmcgbmFtZVNwYWNlVXJpID0gIiI7CisgICAgICAgIHN0cmluZ1tdIG5hbWVTcGxpdCA9IHN1YlBhdGguU3BsaXQoJzonKTsKIAotCQkvLy8gPHN1bW1hcnk+Ci0JCS8vLyBDcmVhdGUgYSBjb21wbGV4IG5vZGUuIEluc2VydCB0aGUgbm9kZSBhY2NvcmRpbmcgdG8gdGhlIDxwYXJhbXJlZiBuYW1lPSJwYXRoIi8+Ci0JCS8vLyB1c2luZyB0aGUgPHBhcmFtcmVmIG5hbWU9InRvcE5vZGUiLz4gYXMgdGhlIHBhcmVudAotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9InRvcE5vZGUiPjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0icGF0aCI+PC9wYXJhbT4KLQkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLQkJaW50ZXJuYWwgWG1sTm9kZSBDcmVhdGVDb21wbGV4Tm9kZSgKLQkJCVhtbE5vZGUgdG9wTm9kZSwKLQkJCXN0cmluZyBwYXRoKQotCQl7Ci0JCQlyZXR1cm4gQ3JlYXRlQ29tcGxleE5vZGUoCi0JCQkJdG9wTm9kZSwKLQkJCQlwYXRoLAotCQkJCWVOb2RlSW5zZXJ0T3JkZXIuU2NoZW1hT3JkZXIsCi0JCQkJbnVsbCk7Ci0JCX0KKyAgICAgICAgaWYgKFNjaGVtYU5vZGVPcmRlciAhPSBudWxsICYmIHN1YlBhdGhbMF0gIT0gJ0AnKSB7CisgICAgICAgICAgaW5zZXJ0Rmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICBwcmVwZW5kTm9kZSA9IEdldFByZXBlbmROb2RlKHN1YlBhdGgsIG5vZGUpOworICAgICAgICB9CiAKLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gQ3JlYXRlcyBjb21wbGV4IFhNTCBub2RlcworICAgICAgICBpZiAobmFtZVNwbGl0Lkxlbmd0aCA+IDEpIHsKKyAgICAgICAgICBub2RlUHJlZml4ID0gbmFtZVNwbGl0WzBdOworICAgICAgICAgIGlmIChub2RlUHJlZml4WzBdID09ICdAJykgeworICAgICAgICAgICAgbm9kZVByZWZpeCA9IG5vZGVQcmVmaXguU3Vic3RyaW5nKDEsIG5vZGVQcmVmaXguTGVuZ3RoIC0gMSk7CisgICAgICAgICAgfQorICAgICAgICAgIG5hbWVTcGFjZVVyaSA9IE5hbWVTcGFjZU1hbmFnZXIuTG9va3VwTmFtZXNwYWNlKG5vZGVQcmVmaXgpOworICAgICAgICAgIG5vZGVOYW1lID0gbmFtZVNwbGl0WzFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5vZGVQcmVmaXggPSAiIjsKKyAgICAgICAgICBuYW1lU3BhY2VVcmkgPSAiIjsKKyAgICAgICAgICBub2RlTmFtZSA9IG5hbWVTcGxpdFswXTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3ViUGF0aC5TdGFydHNXaXRoKCJAIikpIHsKKyAgICAgICAgICBYbWxBdHRyaWJ1dGUgYWRkZWRBdHQgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlQXR0cmlidXRlKAorICAgICAgICAgICAgICBzdWJQYXRoLlN1YnN0cmluZygxLCBzdWJQYXRoLkxlbmd0aCAtIDEpLAorICAgICAgICAgICAgICBuYW1lU3BhY2VVcmkpOyAvL25hbWVTcGFjZVVSSQorICAgICAgICAgIG5vZGUuQXR0cmlidXRlcy5BcHBlbmQoYWRkZWRBdHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChub2RlUHJlZml4ID09ICIiKSB7CisgICAgICAgICAgICBzdWJOb2RlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQobm9kZU5hbWUsIG5hbWVTcGFjZVVyaSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChub2RlUHJlZml4ID09ICIiCisgICAgICAgICAgICAgICAgfHwgKG5vZGUuT3duZXJEb2N1bWVudCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBub2RlLk93bmVyRG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIG5vZGUuT3duZXJEb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQuTmFtZXNwYWNlVVJJID09IG5hbWVTcGFjZVVyaQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbm9kZS5Pd25lckRvY3VtZW50LkRvY3VtZW50RWxlbWVudC5QcmVmaXggPT0gIiIpKSB7CisgICAgICAgICAgICAgIHN1Yk5vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChub2RlTmFtZSwgbmFtZVNwYWNlVXJpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHN1Yk5vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChub2RlUHJlZml4LCBub2RlTmFtZSwgbmFtZVNwYWNlVXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHByZXBlbmROb2RlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG5vZGUuSW5zZXJ0QmVmb3JlKHN1Yk5vZGUsIHByZXBlbmROb2RlKTsKKyAgICAgICAgICAgIHByZXBlbmROb2RlID0gbnVsbDsKKyAgICAgICAgICB9IGVsc2UgaWYgKGluc2VydEZpcnN0KSB7CisgICAgICAgICAgICBub2RlLlByZXBlbmRDaGlsZChzdWJOb2RlKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbm9kZS5BcHBlbmRDaGlsZChzdWJOb2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG5vZGUgPSBzdWJOb2RlOworICAgIH0KKyAgICByZXR1cm4gbm9kZTsKKyAgfQorCisgIC8vLyA8c3VtbWFyeT4KKyAgLy8vIE9wdGlvbnMgdG8gaW5zZXJ0IGEgbm9kZSBpbiB0aGUgWG1sRG9jdW1lbnQKKyAgLy8vIDwvc3VtbWFyeT4KKyAgaW50ZXJuYWwgZW51bSBlTm9kZUluc2VydE9yZGVyIHsKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEluc2VydCBhcyBmaXJzdCBub2RlIG9mICJ0b3BOb2RlIgogICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPgotCQkvLy8gMS4gImQ6Y29uZGl0aW9uYWxGb3JtYXR0aW5nIgotCQkvLy8JCTEuMS4gQ3JlYXRlcy9maW5kIHRoZSBmaXJzdCAiY29uZGl0aW9uYWxGb3JtYXR0aW5nIiBub2RlCi0JCS8vLyAKLQkJLy8vIDIuICJkOmNvbmRpdGlvbmFsRm9ybWF0dGluZy9Ac3FyZWYiCi0JCS8vLwkJMi4xLiBDcmVhdGVzL2ZpbmQgdGhlIGZpcnN0ICJjb25kaXRpb25hbEZvcm1hdHRpbmciIG5vZGUKLQkJLy8vCQkyLjIuIENyZWF0ZXMgKGlmIG5vdCBleGlzdHMpIHRoZSBAc3FyZWYgYXR0cmlidXRlCi0JCS8vLwotCQkvLy8gMy4gImQ6Y29uZGl0aW9uYWxGb3JtYXR0aW5nL0BpZD0nNycvQHNxcmVmPSdBOTpCOTknIgotCQkvLy8JCTMuMS4gQ3JlYXRlcy9maW5kIHRoZSBmaXJzdCAiY29uZGl0aW9uYWxGb3JtYXR0aW5nIiBub2RlCi0JCS8vLwkJMy4yLiBDcmVhdGVzL3VwZGF0ZSBpdHMgQGlkIGF0dHJpYnV0ZSB0byAiNyIKLQkJLy8vCQkzLjMuIENyZWF0ZXMvdXBkYXRlIGl0cyBAc3FyZWYgYXR0cmlidXRlIHRvICJBOTpCOTkiCi0JCS8vLwotCQkvLy8gNC4gImQ6Y29uZGl0aW9uYWxGb3JtYXR0aW5nW0BpZD0nNyddL0BzcXJlZj0nWDE6WDUnIgotCQkvLy8JCTQuMS4gQ3JlYXRlcy9maW5kIHRoZSBmaXJzdCAiY29uZGl0aW9uYWxGb3JtYXR0aW5nIiBub2RlIHdpdGggQGlkPTcKLQkJLy8vCQk0LjIuIENyZWF0ZXMvdXBkYXRlIGl0cyBAc3FyZWYgYXR0cmlidXRlIHRvICJYMTpYNSIKLQkJLy8vCQotCQkvLy8gNS4gImQ6Y29uZGl0aW9uYWxGb3JtYXR0aW5nW0BpZD0nNyddL0BpZD0nOCcvQHNxcmVmPSdYMTpYNScvZDpjZlJ1bGUvQGlkPSdBQiciCi0JCS8vLwkJNS4xLiBDcmVhdGVzL2ZpbmQgdGhlIGZpcnN0ICJjb25kaXRpb25hbEZvcm1hdHRpbmciIG5vZGUgd2l0aCBAaWQ9NwotCQkvLy8JCTUuMi4gU2V0IGl0cyBAaWQgYXR0cmlidXRlIHRvICI4IgotCQkvLy8JCTUuMi4gQ3JlYXRlcy91cGRhdGUgaXRzIEBzcXJlZiBhdHRyaWJ1dGUgYW5kIHNldCBpdCB0byAiWDE6WDUiCi0JCS8vLwkJNS4zLiBDcmVhdGVzL2ZpbmQgdGhlIGZpcnN0ICJjZlJ1bGUiIG5vZGUgKGluc2lkZSB0aGUgbm9kZSkKLQkJLy8vCQk1LjQuIENyZWF0ZXMvdXBkYXRlIGl0cyBAaWQgYXR0cmlidXRlIHRvICJBQiIKLQkJLy8vCQotCQkvLy8gNi4gImQ6Y2ZSdWxlL0BpZD0nJyIKLQkJLy8vCQk2LjEuIENyZWF0ZXMvZmluZCB0aGUgZmlyc3QgImNmUnVsZSIgbm9kZQotCQkvLy8JCTYuMS4gUmVtb3ZlIHRoZSBAaWQgYXR0cmlidXRlCi0gICAgLy8vCTwvcmVtYXJrcz4KLQkJLy8vIDxwYXJhbSBuYW1lPSJ0b3BOb2RlIj48L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9InBhdGgiPjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0ibm9kZUluc2VydE9yZGVyIj48L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9InJlZmVyZW5jZU5vZGUiPjwvcGFyYW0+Ci0JCS8vLyA8cmV0dXJucz5UaGUgbGFzdCBub2RlIGNyZWF0ZXMvZm91bmQ8L3JldHVybnM+Ci0JCWludGVybmFsIFhtbE5vZGUgQ3JlYXRlQ29tcGxleE5vZGUoCi0JCQlYbWxOb2RlIHRvcE5vZGUsCi0JCQlzdHJpbmcgcGF0aCwKLQkJCWVOb2RlSW5zZXJ0T3JkZXIgbm9kZUluc2VydE9yZGVyLAotCQkJWG1sTm9kZSByZWZlcmVuY2VOb2RlKQotCQl7Ci0JCQkvLyBQYXRoIGlzIG9icmlnYXRvcnkKLQkJCWlmICgocGF0aCA9PSBudWxsKSB8fCAocGF0aCA9PSBzdHJpbmcuRW1wdHkpKQotCQkJewotCQkJCXJldHVybiB0b3BOb2RlOwotCQkJfQorICAgIEZpcnN0LAogCi0JCQlYbWxOb2RlIG5vZGUgPSB0b3BOb2RlOwotCQkJc3RyaW5nIG5hbWVTcGFjZVVSSSA9IHN0cmluZy5FbXB0eTsKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIEluc2VydCBhcyB0aGUgbGFzdCBjaGlsZCBvZiAidG9wTm9kZSIKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIExhc3QsCiAKLSAgICAgIC8vVE9ETzogQlVHOiB3aGVuIHRoZSAicGF0aCIgY29udGFpbnMgIi8iIGluIGFuIGF0dHJyaWJ1ZSB2YWx1ZSwgaXQgZ2l2ZXMgYW4gZXJyb3IuCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJbnNlcnQgYWZ0ZXIgdGhlICJyZWZlcmVuY2VOb2RlIgorICAgIC8vLyA8L3N1bW1hcnk+CisgICAgQWZ0ZXIsCiAKLQkJCS8vIFNlcGFyYXRlIHRoZSBYUGF0aCB0byBOb2RlcyBhbmQgQXR0cmlidXRlcwotCQkJZm9yZWFjaCAoc3RyaW5nIHN1YlBhdGggaW4gcGF0aC5TcGxpdCgnLycpKQotCQkJewotCQkJCS8vIFRoZSBzdWJQYXRoIGNhbiBiZSBhbnkgb25lIG9mIHRob3NlOgotCQkJCS8vIG5vZGVOYW1lCi0JCQkJLy8geDpub2RlTmFtZQotCQkJCS8vIG5vZGVOYW1lW2ZpbmQgY3JpdGVyaWFdCi0JCQkJLy8geDpub2RlTmFtZVtmaW5kIGNyaXRlcmlhXQotCQkJCS8vIEBhdHRyaWJ1dGUKLQkJCQkvLyBAYXR0cmlidXRlPSdhdHRyaWJ1dGUgdmFsdWUnCisgICAgLy8vIDxzdW1tYXJ5PgorICAgIC8vLyBJbnNlcnQgYmVmb3JlIHRoZSAicmVmZXJlbmNlTm9kZSIKKyAgICAvLy8gPC9zdW1tYXJ5PgorICAgIEJlZm9yZSwKIAotCQkJCS8vIENoZWNrIGlmIHRoZSBzdWJQYXRoIGhhcyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyCi0JCQkJaWYgKHN1YlBhdGguTGVuZ3RoID4gMCkKLQkJCQl7Ci0JCQkJCS8vIENoZWNrIGlmIHRoZSBzdWJQYXRoIGlzIGFuIGF0dHJpYnV0ZSAod2l0aCBvciB3aXRob3V0IHZhbHVlKQotCQkJCQlpZiAoc3ViUGF0aC5TdGFydHNXaXRoKCJAIikpCi0JCQkJCXsKLQkJCQkJCS8vIEBhdHRyaWJ1dGUJCQkJCQkJCQkJLS0+IENyZWF0ZSBhdHRyaWJ1dGUKLQkJCQkJCS8vIEBhdHRyaWJ1dGU9JycJCQkJCQkJCS0tPiBSZW1vdmUgYXR0cmlidXRlCi0JCQkJCQkvLyBAYXR0cmlidXRlPSdhdHRyaWJ1dGUgdmFsdWUnIC0tPiBDcmVhdGUgYXR0cmlidXRlICsgdXBkYXRlIHZhbHVlCi0JCQkJCQlzdHJpbmdbXSBhdHRyaWJ1dGVTcGxpdCA9IHN1YlBhdGguU3BsaXQoJz0nKTsKLQkJCQkJCXN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlU3BsaXRbMF0uU3Vic3RyaW5nKDEsIGF0dHJpYnV0ZVNwbGl0WzBdLkxlbmd0aCAtIDEpOwotCQkJCQkJc3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gbnVsbDsJLy8gTnVsbCBtZWFucyBubyBhdHRyaWJ1dGUgdmFsdWUKKyAgICAvLy8gPHN1bW1hcnk+CisgICAgLy8vIFVzZSB0aGUgU2NoZW1hIExpc3QgdG8gaW5zZXJ0IGluIHRoZSByaWdodCBvcmRlci4gSWYgdGhlIFNjaGVtYSBsaXN0CisgICAgLy8vIGlzIG51bGwgb3IgZW1wdHksIGNvbnNpZGVyICJMYXN0IiBhcyB0aGUgc2VsZWN0ZWQgb3B0aW9uCisgICAgLy8vIDwvc3VtbWFyeT4KKyAgICBTY2hlbWFPcmRlciwKKyAgfQogCi0JCQkJCQkvLyBDaGVjayBpZiB3ZSBoYXZlIGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBzZXQKLQkJCQkJCWlmIChhdHRyaWJ1dGVTcGxpdC5MZW5ndGggPiAxKQotCQkJCQkJewotCQkJCQkJCS8vIFJlbW92ZSB0aGUgJyBvciAiIGZyb20gdGhlIGF0dHJpYnV0ZSB2YWx1ZQotCQkJCQkJCWF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlU3BsaXRbMV0uUmVwbGFjZSgiJyIsICIiKS5SZXBsYWNlKCJcIiIsICIiKTsKLQkJCQkJCX0KKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ3JlYXRlIGEgY29tcGxleCBub2RlLiBJbnNlcnQgdGhlIG5vZGUgYWNjb3JkaW5nIHRvIFNjaGVtYU9yZGVyCisgIC8vLyB1c2luZyB0aGUgVG9wTm9kZSBhcyB0aGUgcGFyZW50CisgIC8vLyA8L3N1bW1hcnk+CisgIC8vLyA8cGFyYW0gbmFtZT0icGF0aCI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgaW50ZXJuYWwgWG1sTm9kZSBDcmVhdGVDb21wbGV4Tm9kZShzdHJpbmcgcGF0aCkgeworICAgIHJldHVybiBDcmVhdGVDb21wbGV4Tm9kZShUb3BOb2RlLCBwYXRoLCBlTm9kZUluc2VydE9yZGVyLlNjaGVtYU9yZGVyLCBudWxsKTsKKyAgfQogCi0JCQkJCQkvLyBHZXQgdGhlIGF0dHJpYnV0ZSAoaWYgZXhpc3RzKQotCQkJCQkJWG1sQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChYbWxBdHRyaWJ1dGUpKG5vZGUuQXR0cmlidXRlcy5HZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSkpOworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBDcmVhdGUgYSBjb21wbGV4IG5vZGUuIEluc2VydCB0aGUgbm9kZSBhY2NvcmRpbmcgdG8gdGhlIDxwYXJhbXJlZiBuYW1lPSJwYXRoIi8+CisgIC8vLyB1c2luZyB0aGUgPHBhcmFtcmVmIG5hbWU9InRvcE5vZGUiLz4gYXMgdGhlIHBhcmVudAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InRvcE5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0icGF0aCI+PC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgaW50ZXJuYWwgWG1sTm9kZSBDcmVhdGVDb21wbGV4Tm9kZShYbWxOb2RlIHRvcE5vZGUsIHN0cmluZyBwYXRoKSB7CisgICAgcmV0dXJuIENyZWF0ZUNvbXBsZXhOb2RlKHRvcE5vZGUsIHBhdGgsIGVOb2RlSW5zZXJ0T3JkZXIuU2NoZW1hT3JkZXIsIG51bGwpOworICB9CiAKLQkJCQkJCS8vIFJlbW92ZSB0aGUgYXR0cmlidXRlIGlmIHZhbHVlIGlzIGVtcHR5IChub3QgbnVsbCkKLQkJCQkJCWlmIChhdHRyaWJ1dGVWYWx1ZSA9PSBzdHJpbmcuRW1wdHkpCi0JCQkJCQl7Ci0JCQkJCQkJLy8gT25seSBpZiB0aGUgYXR0cmlidXRlIGV4aXN0cwotCQkJCQkJCWlmIChhdHRyaWJ1dGUgIT0gbnVsbCkKLQkJCQkJCQl7Ci0JCQkJCQkJCW5vZGUuQXR0cmlidXRlcy5SZW1vdmUoYXR0cmlidXRlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQl7Ci0JCQkJCQkJLy8gQ3JlYXRlIHRoZSBhdHRyaWJ1ZSBpZiBkb2VzIG5vdCBleGlzdHMKLQkJCQkJCQlpZiAoYXR0cmlidXRlID09IG51bGwpCi0JCQkJCQkJewotCQkJCQkJCQkvLyBDcmVhdGUgdGhlIGF0dHJpYnV0ZQotCQkJCQkJCQlhdHRyaWJ1dGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlQXR0cmlidXRlKAotCQkJCQkJCQkJYXR0cmlidXRlTmFtZSk7Ci0KLQkJCQkJCQkJLy8gQWRkIGl0IHRvIHRoZSBjdXJyZW50IG5vZGUKLQkJCQkJCQkJbm9kZS5BdHRyaWJ1dGVzLkFwcGVuZChhdHRyaWJ1dGUpOwotCQkJCQkJCX0KLQotCQkJCQkJCS8vIFVwZGF0ZSB0aGUgYXR0cmlidXRlIHZhbHVlCi0JCQkJCQkJaWYgKGF0dHJpYnV0ZVZhbHVlICE9IG51bGwpCi0JCQkJCQkJewotCQkJCQkJCQlub2RlLkF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0uVmFsdWUgPSBhdHRyaWJ1dGVWYWx1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQl7Ci0JCQkJCQkvLyBub2RlTmFtZQotCQkJCQkJLy8geDpub2RlTmFtZQotCQkJCQkJLy8gbm9kZU5hbWVbZmluZCBjcml0ZXJpYV0KLQkJCQkJCS8vIHg6bm9kZU5hbWVbZmluZCBjcml0ZXJpYV0KLQotCQkJCQkJLy8gTG9vayBmb3IgdGhlIG5vZGUgKHdpdGggb3Igd2l0aG91dCBmaWx0ZXIgY3JpdGVyaWEpCi0JCQkJCQlYbWxOb2RlIHN1Yk5vZGUgPSBub2RlLlNlbGVjdFNpbmdsZU5vZGUoc3ViUGF0aCwgTmFtZVNwYWNlTWFuYWdlcik7Ci0KLQkJCQkJCS8vIENoZWNrIGlmIHRoZSBub2RlIGRvZXMgbm90IGV4aXN0cwotCQkJCQkJaWYgKHN1Yk5vZGUgPT0gbnVsbCkKLQkJCQkJCXsKLQkJCQkJCQlzdHJpbmcgbm9kZU5hbWU7Ci0JCQkJCQkJc3RyaW5nIG5vZGVQcmVmaXg7Ci0JCQkJCQkJc3RyaW5nW10gbmFtZVNwbGl0ID0gc3ViUGF0aC5TcGxpdCgnOicpOwotCQkJCQkJCW5hbWVTcGFjZVVSSSA9IHN0cmluZy5FbXB0eTsKLQotCQkJCQkJCS8vIENoZWNrIGlmIHRoZSBuYW1lIGhhcyBhIHByZWZpeCBsaWtlICJkOm5vZGVOYW1lIgotCQkJCQkJCWlmIChuYW1lU3BsaXQuTGVuZ3RoID4gMSkKLQkJCQkJCQl7Ci0JCQkJCQkJCW5vZGVQcmVmaXggPSBuYW1lU3BsaXRbMF07Ci0JCQkJCQkJCW5hbWVTcGFjZVVSSSA9IE5hbWVTcGFjZU1hbmFnZXIuTG9va3VwTmFtZXNwYWNlKG5vZGVQcmVmaXgpOwotCQkJCQkJCQlub2RlTmFtZSA9IG5hbWVTcGxpdFsxXTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJbm9kZVByZWZpeCA9IHN0cmluZy5FbXB0eTsKLQkJCQkJCQkJbmFtZVNwYWNlVVJJID0gc3RyaW5nLkVtcHR5OwotCQkJCQkJCQlub2RlTmFtZSA9IG5hbWVTcGxpdFswXTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQkvLyBDaGVjayBpZiB3ZSBoYXZlIGEgY3JpdGVyaWEgcGFydCBpbiB0aGUgbm9kZSBuYW1lCi0JCQkJCQkJaWYgKG5vZGVOYW1lLkluZGV4T2YoIlsiKSA+IDApCi0JCQkJCQkJewotCQkJCQkJCQkvLyByZW1vdmUgdGhlIGNyaXRlcmlhIGZyb20gdGhlIG5vZGUgbmFtZQotCQkJCQkJCQlub2RlTmFtZSA9IG5vZGVOYW1lLlN1YnN0cmluZygwLCBub2RlTmFtZS5JbmRleE9mKCJbIikpOwotCQkJCQkJCX0KLQotCQkJCQkJCWlmIChub2RlUHJlZml4ID09IHN0cmluZy5FbXB0eSkKLQkJCQkJCQl7Ci0JCQkJCQkJCXN1Yk5vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChub2RlTmFtZSwgbmFtZVNwYWNlVVJJKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZQotCQkJCQkJCXsKLQkJCQkJCQkJaWYgKG5vZGUuT3duZXJEb2N1bWVudCAhPSBudWxsCi0JCQkJCQkJCQkmJiBub2RlLk93bmVyRG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50ICE9IG51bGwKLQkJCQkJCQkJCSYmIG5vZGUuT3duZXJEb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQuTmFtZXNwYWNlVVJJID09IG5hbWVTcGFjZVVSSQotCQkJCQkJCQkJJiYgbm9kZS5Pd25lckRvY3VtZW50LkRvY3VtZW50RWxlbWVudC5QcmVmaXggPT0gc3RyaW5nLkVtcHR5KQotCQkJCQkJCQl7Ci0JCQkJCQkJCQlzdWJOb2RlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQoCi0JCQkJCQkJCQkJbm9kZU5hbWUsCi0JCQkJCQkJCQkJbmFtZVNwYWNlVVJJKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlCi0JCQkJCQkJCXsKLQkJCQkJCQkJCXN1Yk5vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudCgKLQkJCQkJCQkJCQlub2RlUHJlZml4LAotCQkJCQkJCQkJCW5vZGVOYW1lLAotCQkJCQkJCQkJCW5hbWVTcGFjZVVSSSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0KLQkJCQkJCQkvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHVzZSB0aGUgIlNjaGVtYU9yZGVyIgotCQkJCQkJCWlmIChub2RlSW5zZXJ0T3JkZXIgPT0gZU5vZGVJbnNlcnRPcmRlci5TY2hlbWFPcmRlcikKLQkJCQkJCQl7Ci0JCQkJCQkJCS8vIENoZWNrIGlmIHRoZSBTY2hlbWEgT3JkZXIgTGlzdCBpcyBlbXB0eQotCQkJCQkJCQlpZiAoKFNjaGVtYU5vZGVPcmRlciA9PSBudWxsKSB8fCAoU2NoZW1hTm9kZU9yZGVyLkxlbmd0aCA9PSAwKSkKLQkJCQkJCQkJewotCQkJCQkJCQkJLy8gVXNlIHRoZSAiSW5zZXJ0IExhc3QiIG9wdGlvbiB3aGVuIFNjaGVtYSBPcmRlciBMaXN0IGlzIGVtcHR5Ci0JCQkJCQkJCQlub2RlSW5zZXJ0T3JkZXIgPSBlTm9kZUluc2VydE9yZGVyLkxhc3Q7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZQotCQkJCQkJCQl7Ci0JCQkJCQkJCQkvLyBGaW5kIHRoZSBwcmVwZW5kIG5vZGUgaW4gb3JkZXIgdG8gaW5zZXJ0Ci0JCQkJCQkJCQlyZWZlcmVuY2VOb2RlID0gR2V0UHJlcGVuZE5vZGUobm9kZU5hbWUsIG5vZGUpOwotCi0JCQkJCQkJCQlpZiAocmVmZXJlbmNlTm9kZSAhPSBudWxsKQotCQkJCQkJCQkJewotCQkJCQkJCQkJCW5vZGVJbnNlcnRPcmRlciA9IGVOb2RlSW5zZXJ0T3JkZXIuQmVmb3JlOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZQotCQkJCQkJCQkJewotCQkJCQkJCQkJCW5vZGVJbnNlcnRPcmRlciA9IGVOb2RlSW5zZXJ0T3JkZXIuTGFzdDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQotCQkJCQkJCXN3aXRjaCAobm9kZUluc2VydE9yZGVyKQotCQkJCQkJCXsKLQkJCQkJCQkJY2FzZSBlTm9kZUluc2VydE9yZGVyLkFmdGVyOgotCQkJCQkJCQkJbm9kZS5JbnNlcnRBZnRlcihzdWJOb2RlLCByZWZlcmVuY2VOb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZU5vZGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQkJCQkJCQkJY2FzZSBlTm9kZUluc2VydE9yZGVyLkJlZm9yZToKLQkJCQkJCQkJCW5vZGUuSW5zZXJ0QmVmb3JlKHN1Yk5vZGUsIHJlZmVyZW5jZU5vZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlTm9kZSA9IG51bGw7Ci0JCQkJCQkJCQlicmVhazsKLQotCQkJCQkJCQljYXNlIGVOb2RlSW5zZXJ0T3JkZXIuRmlyc3Q6Ci0JCQkJCQkJCQlub2RlLlByZXBlbmRDaGlsZChzdWJOb2RlKTsKLQkJCQkJCQkJCWJyZWFrOwotCi0JCQkJCQkJCWNhc2UgZU5vZGVJbnNlcnRPcmRlci5MYXN0OgotCQkJCQkJCQkJbm9kZS5BcHBlbmRDaGlsZChzdWJOb2RlKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJLy8gTWFrZSB0aGUgbmV3bHkgY3JlYXRlZCBub2RlIHRoZSB0b3Agbm9kZSB3aGVuIHRoZSByZXN0IG9mIHRoZSBwYXRoCi0JCQkJCQkvLyBpcyBiZWluZyBldmFsdWF0ZWQuIFNvIG5ld2x5IGNyZWF0ZWQgbm9kZXMgd2lsbCBiZSB0aGUgY2hpbGRyZW4gb2YgdGhlCi0JCQkJCQkvLyBvbmUgd2UganVzdCBjcmVhdGVkLgotCQkJCQkJbm9kZSA9IHN1Yk5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFJldHVybiB0aGUgbGFzdCBjcmVhdGVkL2ZvdW5kIG5vZGUKLQkJCXJldHVybiBub2RlOwotCQl9Ci0KLQkJLy8vIDxzdW1tYXJ5PgotCQkvLy8gcmV0dXJuIFByZXBlbmQgbm9kZQotCQkvLy8gPC9zdW1tYXJ5PgotCQkvLy8gPHBhcmFtIG5hbWU9Im5vZGVOYW1lIj5uYW1lIG9mIHRoZSBub2RlIHRvIGNoZWNrPC9wYXJhbT4KLQkJLy8vIDxwYXJhbSBuYW1lPSJub2RlIj5Ub3Bub2RlIHRvIGNoZWNrIGNoaWxkcmVuPC9wYXJhbT4KLQkJLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLQkJcHJpdmF0ZSBYbWxOb2RlIEdldFByZXBlbmROb2RlKHN0cmluZyBub2RlTmFtZSwgWG1sTm9kZSBub2RlKQotCQl7Ci0JCQlpbnQgcG9zID0gR2V0Tm9kZVBvcyhub2RlTmFtZSk7Ci0JCQlpZiAocG9zIDwgMCkKLQkJCXsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCVhtbE5vZGUgcHJlcGVuZE5vZGUgPSBudWxsOwotCQkJZm9yZWFjaCAoWG1sTm9kZSBjaGlsZE5vZGUgaW4gbm9kZS5DaGlsZE5vZGVzKQotCQkJewotCQkJCWludCBjaGlsZFBvcyA9IEdldE5vZGVQb3MoY2hpbGROb2RlLk5hbWUpOwotCQkJCWlmIChjaGlsZFBvcyA+IC0xKSAgLy9Gb3VuZD8KLQkJCQl7Ci0JCQkJCWlmIChjaGlsZFBvcyA+IHBvcykgLy9Qb3NpdGlvbiBpcyBiZWZvcmUKLQkJCQkJewotCQkJCQkJcHJlcGVuZE5vZGUgPSBjaGlsZE5vZGU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBwcmVwZW5kTm9kZTsKLQkJfQotCQlwcml2YXRlIGludCBHZXROb2RlUG9zKHN0cmluZyBub2RlTmFtZSkKLQkJewotCQkJaW50IGl4ID0gbm9kZU5hbWUuSW5kZXhPZigiOiIpOwotCQkJaWYgKGl4ID4gMCkKLQkJCXsKLQkJCQlub2RlTmFtZSA9IG5vZGVOYW1lLlN1YnN0cmluZyhpeCArIDEsIG5vZGVOYW1lLkxlbmd0aCAtIChpeCArIDEpKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgX3NjaGVtYU5vZGVPcmRlci5MZW5ndGg7IGkrKykKLQkJCXsKLQkJCQlpZiAobm9kZU5hbWUgPT0gX3NjaGVtYU5vZGVPcmRlcltpXSkKLQkJCQl7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAtMTsKLQkJfQotCQlpbnRlcm5hbCB2b2lkIERlbGV0ZUFsbE5vZGUoc3RyaW5nIHBhdGgpCi0JCXsKLQkJCXN0cmluZ1tdIHNwbGl0ID0gcGF0aC5TcGxpdCgnLycpOwotCQkJWG1sTm9kZSBub2RlID0gVG9wTm9kZTsKLQkJCWZvcmVhY2ggKHN0cmluZyBzIGluIHNwbGl0KQotCQkJewotCQkJCW5vZGUgPSBub2RlLlNlbGVjdFNpbmdsZU5vZGUocywgTmFtZVNwYWNlTWFuYWdlcik7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWlmIChub2RlIGlzIFhtbEF0dHJpYnV0ZSkKLQkJCQkJewotCQkJCQkJKG5vZGUgYXMgWG1sQXR0cmlidXRlKS5Pd25lckVsZW1lbnQuQXR0cmlidXRlcy5SZW1vdmUobm9kZSBhcyBYbWxBdHRyaWJ1dGUpOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJewotCQkJCQkJbm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKG5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpbnRlcm5hbCB2b2lkIERlbGV0ZU5vZGUoc3RyaW5nIHBhdGgpCi0JCXsKLQkJCXZhciBub2RlID0gVG9wTm9kZS5TZWxlY3RTaW5nbGVOb2RlKHBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXsKLQkJCQlpZiAobm9kZSBpcyBYbWxBdHRyaWJ1dGUpCi0JCQkJewotCQkJCQl2YXIgYXR0ID0gKFhtbEF0dHJpYnV0ZSlub2RlOwotCQkJCQlhdHQuT3duZXJFbGVtZW50LkF0dHJpYnV0ZXMuUmVtb3ZlKGF0dCk7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCW5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSAgICBpbnRlcm5hbCB2b2lkIERlbGV0ZVRvcE5vZGUoKQotICAgIHsKLSAgICAgIFRvcE5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChUb3BOb2RlKTsKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gQ3JlYXRlcyBjb21wbGV4IFhNTCBub2RlcworICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHJlbWFya3M+CisgIC8vLyAxLiAiZDpjb25kaXRpb25hbEZvcm1hdHRpbmciCisgIC8vLwkJMS4xLiBDcmVhdGVzL2ZpbmQgdGhlIGZpcnN0ICJjb25kaXRpb25hbEZvcm1hdHRpbmciIG5vZGUKKyAgLy8vCisgIC8vLyAyLiAiZDpjb25kaXRpb25hbEZvcm1hdHRpbmcvQHNxcmVmIgorICAvLy8JCTIuMS4gQ3JlYXRlcy9maW5kIHRoZSBmaXJzdCAiY29uZGl0aW9uYWxGb3JtYXR0aW5nIiBub2RlCisgIC8vLwkJMi4yLiBDcmVhdGVzIChpZiBub3QgZXhpc3RzKSB0aGUgQHNxcmVmIGF0dHJpYnV0ZQorICAvLy8KKyAgLy8vIDMuICJkOmNvbmRpdGlvbmFsRm9ybWF0dGluZy9AaWQ9JzcnL0BzcXJlZj0nQTk6Qjk5JyIKKyAgLy8vCQkzLjEuIENyZWF0ZXMvZmluZCB0aGUgZmlyc3QgImNvbmRpdGlvbmFsRm9ybWF0dGluZyIgbm9kZQorICAvLy8JCTMuMi4gQ3JlYXRlcy91cGRhdGUgaXRzIEBpZCBhdHRyaWJ1dGUgdG8gIjciCisgIC8vLwkJMy4zLiBDcmVhdGVzL3VwZGF0ZSBpdHMgQHNxcmVmIGF0dHJpYnV0ZSB0byAiQTk6Qjk5IgorICAvLy8KKyAgLy8vIDQuICJkOmNvbmRpdGlvbmFsRm9ybWF0dGluZ1tAaWQ9JzcnXS9Ac3FyZWY9J1gxOlg1JyIKKyAgLy8vCQk0LjEuIENyZWF0ZXMvZmluZCB0aGUgZmlyc3QgImNvbmRpdGlvbmFsRm9ybWF0dGluZyIgbm9kZSB3aXRoIEBpZD03CisgIC8vLwkJNC4yLiBDcmVhdGVzL3VwZGF0ZSBpdHMgQHNxcmVmIGF0dHJpYnV0ZSB0byAiWDE6WDUiCisgIC8vLworICAvLy8gNS4gImQ6Y29uZGl0aW9uYWxGb3JtYXR0aW5nW0BpZD0nNyddL0BpZD0nOCcvQHNxcmVmPSdYMTpYNScvZDpjZlJ1bGUvQGlkPSdBQiciCisgIC8vLwkJNS4xLiBDcmVhdGVzL2ZpbmQgdGhlIGZpcnN0ICJjb25kaXRpb25hbEZvcm1hdHRpbmciIG5vZGUgd2l0aCBAaWQ9NworICAvLy8JCTUuMi4gU2V0IGl0cyBAaWQgYXR0cmlidXRlIHRvICI4IgorICAvLy8JCTUuMi4gQ3JlYXRlcy91cGRhdGUgaXRzIEBzcXJlZiBhdHRyaWJ1dGUgYW5kIHNldCBpdCB0byAiWDE6WDUiCisgIC8vLwkJNS4zLiBDcmVhdGVzL2ZpbmQgdGhlIGZpcnN0ICJjZlJ1bGUiIG5vZGUgKGluc2lkZSB0aGUgbm9kZSkKKyAgLy8vCQk1LjQuIENyZWF0ZXMvdXBkYXRlIGl0cyBAaWQgYXR0cmlidXRlIHRvICJBQiIKKyAgLy8vCisgIC8vLyA2LiAiZDpjZlJ1bGUvQGlkPScnIgorICAvLy8JCTYuMS4gQ3JlYXRlcy9maW5kIHRoZSBmaXJzdCAiY2ZSdWxlIiBub2RlCisgIC8vLwkJNi4xLiBSZW1vdmUgdGhlIEBpZCBhdHRyaWJ1dGUKKyAgLy8vCTwvcmVtYXJrcz4KKyAgLy8vIDxwYXJhbSBuYW1lPSJ0b3BOb2RlIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InBhdGgiPjwvcGFyYW0+CisgIC8vLyA8cGFyYW0gbmFtZT0ibm9kZUluc2VydE9yZGVyIj48L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9InJlZmVyZW5jZU5vZGUiPjwvcGFyYW0+CisgIC8vLyA8cmV0dXJucz5UaGUgbGFzdCBub2RlIGNyZWF0ZXMvZm91bmQ8L3JldHVybnM+CisgIGludGVybmFsIFhtbE5vZGUgQ3JlYXRlQ29tcGxleE5vZGUoCisgICAgICBYbWxOb2RlIHRvcE5vZGUsCisgICAgICBzdHJpbmcgcGF0aCwKKyAgICAgIGVOb2RlSW5zZXJ0T3JkZXIgbm9kZUluc2VydE9yZGVyLAorICAgICAgWG1sTm9kZSByZWZlcmVuY2VOb2RlKSB7CisgICAgLy8gUGF0aCBpcyBvYnJpZ2F0b3J5CisgICAgaWYgKChwYXRoID09IG51bGwpIHx8IChwYXRoID09IHN0cmluZy5FbXB0eSkpIHsKKyAgICAgIHJldHVybiB0b3BOb2RlOwogICAgIH0KLQkJaW50ZXJuYWwgdm9pZCBTZXRYbWxOb2RlU3RyaW5nKHN0cmluZyBwYXRoLCBzdHJpbmcgdmFsdWUpCi0JCXsKLQkJCVNldFhtbE5vZGVTdHJpbmcoVG9wTm9kZSwgcGF0aCwgdmFsdWUsIGZhbHNlLCBmYWxzZSk7Ci0JCX0KLQkJaW50ZXJuYWwgdm9pZCBTZXRYbWxOb2RlU3RyaW5nKHN0cmluZyBwYXRoLCBzdHJpbmcgdmFsdWUsIGJvb2wgcmVtb3ZlSWZCbGFuaykKLQkJewotCQkJU2V0WG1sTm9kZVN0cmluZyhUb3BOb2RlLCBwYXRoLCB2YWx1ZSwgcmVtb3ZlSWZCbGFuaywgZmFsc2UpOwotCQl9Ci0JCWludGVybmFsIHZvaWQgU2V0WG1sTm9kZVN0cmluZyhYbWxOb2RlIG5vZGUsIHN0cmluZyBwYXRoLCBzdHJpbmcgdmFsdWUpCi0JCXsKLQkJCVNldFhtbE5vZGVTdHJpbmcobm9kZSwgcGF0aCwgdmFsdWUsIGZhbHNlLCBmYWxzZSk7Ci0JCX0KLQkJaW50ZXJuYWwgdm9pZCBTZXRYbWxOb2RlU3RyaW5nKFhtbE5vZGUgbm9kZSwgc3RyaW5nIHBhdGgsIHN0cmluZyB2YWx1ZSwgYm9vbCByZW1vdmVJZkJsYW5rKQotCQl7Ci0JCQlTZXRYbWxOb2RlU3RyaW5nKG5vZGUsIHBhdGgsIHZhbHVlLCByZW1vdmVJZkJsYW5rLCBmYWxzZSk7Ci0JCX0KLQkJaW50ZXJuYWwgdm9pZCBTZXRYbWxOb2RlU3RyaW5nKFhtbE5vZGUgbm9kZSwgc3RyaW5nIHBhdGgsIHN0cmluZyB2YWx1ZSwgYm9vbCByZW1vdmVJZkJsYW5rLCBib29sIGluc2VydEZpcnN0KQotCQl7Ci0JCQlpZiAobm9kZSA9PSBudWxsKQotCQkJewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmICh2YWx1ZSA9PSAiIiAmJiByZW1vdmVJZkJsYW5rKQotCQkJewotCQkJCURlbGV0ZUFsbE5vZGUocGF0aCk7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJWG1sTm9kZSBuYW1lTm9kZSA9IG5vZGUuU2VsZWN0U2luZ2xlTm9kZShwYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLQkJCQlpZiAobmFtZU5vZGUgPT0gbnVsbCkKLQkJCQl7Ci0JCQkJCUNyZWF0ZU5vZGUocGF0aCwgaW5zZXJ0Rmlyc3QpOwotCQkJCQluYW1lTm9kZSA9IG5vZGUuU2VsZWN0U2luZ2xlTm9kZShwYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKLQkJCQl9Ci0JCQkJLy9pZiAobmFtZU5vZGUuSW5uZXJUZXh0ICE9IHZhbHVlKSBIYXNDaGFuZ2VkKCk7Ci0JCQkJbmFtZU5vZGUuSW5uZXJUZXh0ID0gdmFsdWU7Ci0JCQl9Ci0JCX0KLQkJaW50ZXJuYWwgdm9pZCBTZXRYbWxOb2RlQm9vbChzdHJpbmcgcGF0aCwgYm9vbCB2YWx1ZSkKLQkJewotCQkJU2V0WG1sTm9kZVN0cmluZyhUb3BOb2RlLCBwYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIiwgZmFsc2UsIGZhbHNlKTsKLQkJfQotCQlpbnRlcm5hbCB2b2lkIFNldFhtbE5vZGVCb29sKHN0cmluZyBwYXRoLCBib29sIHZhbHVlLCBib29sIHJlbW92ZUlmKQotCQl7Ci0JCQlpZiAodmFsdWUgPT0gcmVtb3ZlSWYpCi0JCQl7Ci0JCQkJdmFyIG5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUocGF0aCwgTmFtZVNwYWNlTWFuYWdlcik7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCQl7Ci0JCQkJCWlmIChub2RlIGlzIFhtbEF0dHJpYnV0ZSkKLQkJCQkJewotCQkJCQkJdmFyIGVsZW0gPSAobm9kZSBhcyBYbWxBdHRyaWJ1dGUpLk93bmVyRWxlbWVudDsKLQkJCQkJCWVsZW0uUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChlbGVtKTsKLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCXsKLQkJCQkJCVRvcE5vZGUuUmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJU2V0WG1sTm9kZVN0cmluZyhUb3BOb2RlLCBwYXRoLCB2YWx1ZSA/ICIxIiA6ICIwIiwgZmFsc2UsIGZhbHNlKTsKLQkJCX0KLQkJfQotCQlpbnRlcm5hbCBib29sIEV4aXN0Tm9kZShzdHJpbmcgcGF0aCkKLQkJewotCQkJaWYgKFRvcE5vZGUgPT0gbnVsbCB8fCBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUocGF0aCwgTmFtZVNwYWNlTWFuYWdlcikgPT0gbnVsbCkKLQkJCXsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJaW50ZXJuYWwgYm9vbD8gR2V0WG1sTm9kZUJvb2xOdWxsYWJsZShzdHJpbmcgcGF0aCkKLQkJewotCQkJdmFyIHZhbHVlID0gR2V0WG1sTm9kZVN0cmluZyhwYXRoKTsKLQkJCWlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gR2V0WG1sTm9kZUJvb2wocGF0aCk7Ci0JCX0KLQkJaW50ZXJuYWwgYm9vbCBHZXRYbWxOb2RlQm9vbChzdHJpbmcgcGF0aCkKLQkJewotCQkJcmV0dXJuIEdldFhtbE5vZGVCb29sKHBhdGgsIGZhbHNlKTsKLQkJfQotCQlpbnRlcm5hbCBib29sIEdldFhtbE5vZGVCb29sKHN0cmluZyBwYXRoLCBib29sIGJsYW5rVmFsdWUpCi0JCXsKLQkJCXN0cmluZyB2YWx1ZSA9IEdldFhtbE5vZGVTdHJpbmcocGF0aCk7Ci0JCQlpZiAodmFsdWUgPT0gIjEiIHx8IHZhbHVlID09ICItMSIgfHwgdmFsdWUuRXF1YWxzKCJ0cnVlIixTdHJpbmdDb21wYXJpc29uLkludmFyaWFudEN1bHR1cmVJZ25vcmVDYXNlKSkKLQkJCXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHZhbHVlID09ICIiKQotCQkJewotCQkJCXJldHVybiBibGFua1ZhbHVlOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlpbnRlcm5hbCBpbnQgR2V0WG1sTm9kZUludChzdHJpbmcgcGF0aCkKLQkJewotCQkJaW50IGk7Ci0JCQlpZiAoaW50LlRyeVBhcnNlKEdldFhtbE5vZGVTdHJpbmcocGF0aCksIG91dCBpKSkKLQkJCXsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJCWVsc2UKLQkJCXsKLQkJCQlyZXR1cm4gaW50Lk1pblZhbHVlOwotCQkJfQotCQl9Ci0gICAgICAgIGludGVybmFsIGludD8gR2V0WG1sTm9kZUludE51bGwoc3RyaW5nIHBhdGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgc3RyaW5nIHMgPSBHZXRYbWxOb2RlU3RyaW5nKHBhdGgpOwotICAgICAgICAgICAgaWYgKHMhPSIiICYmIGludC5UcnlQYXJzZShzLCBvdXQgaSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KIAotCQlpbnRlcm5hbCBkZWNpbWFsIEdldFhtbE5vZGVEZWNpbWFsKHN0cmluZyBwYXRoKQotCQl7Ci0JCQlkZWNpbWFsIGQ7Ci0JCQlpZiAoZGVjaW1hbC5UcnlQYXJzZShHZXRYbWxOb2RlU3RyaW5nKHBhdGgpLCBOdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgZCkpCi0JCQl7Ci0JCQkJcmV0dXJuIGQ7Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0KLSAgICAgICAgaW50ZXJuYWwgZGVjaW1hbD8gR2V0WG1sTm9kZURlY2ltYWxOdWxsKHN0cmluZyBwYXRoKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWNpbWFsIGQ7Ci0gICAgICAgICAgICBpZiAoZGVjaW1hbC5UcnlQYXJzZShHZXRYbWxOb2RlU3RyaW5nKHBhdGgpLCBOdW1iZXJTdHlsZXMuQW55LCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgZCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGQ7CisgICAgWG1sTm9kZSBub2RlID0gdG9wTm9kZTsKKyAgICBzdHJpbmcgbmFtZVNwYWNlVXJpID0gc3RyaW5nLkVtcHR5OworCisgICAgLy9UT0RPOiBCVUc6IHdoZW4gdGhlICJwYXRoIiBjb250YWlucyAiLyIgaW4gYW4gYXR0cnJpYnVlIHZhbHVlLCBpdCBnaXZlcyBhbiBlcnJvci4KKworICAgIC8vIFNlcGFyYXRlIHRoZSBYUGF0aCB0byBOb2RlcyBhbmQgQXR0cmlidXRlcworICAgIGZvcmVhY2ggKHN0cmluZyBzdWJQYXRoIGluIHBhdGguU3BsaXQoJy8nKSkgeworICAgICAgLy8gVGhlIHN1YlBhdGggY2FuIGJlIGFueSBvbmUgb2YgdGhvc2U6CisgICAgICAvLyBub2RlTmFtZQorICAgICAgLy8geDpub2RlTmFtZQorICAgICAgLy8gbm9kZU5hbWVbZmluZCBjcml0ZXJpYV0KKyAgICAgIC8vIHg6bm9kZU5hbWVbZmluZCBjcml0ZXJpYV0KKyAgICAgIC8vIEBhdHRyaWJ1dGUKKyAgICAgIC8vIEBhdHRyaWJ1dGU9J2F0dHJpYnV0ZSB2YWx1ZScKKworICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN1YlBhdGggaGFzIGF0IGxlYXN0IG9uZSBjaGFyYWN0ZXIKKyAgICAgIGlmIChzdWJQYXRoLkxlbmd0aCA+IDApIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHN1YlBhdGggaXMgYW4gYXR0cmlidXRlICh3aXRoIG9yIHdpdGhvdXQgdmFsdWUpCisgICAgICAgIGlmIChzdWJQYXRoLlN0YXJ0c1dpdGgoIkAiKSkgeworICAgICAgICAgIC8vIEBhdHRyaWJ1dGUJCQkJCQkJCQkJLS0+IENyZWF0ZSBhdHRyaWJ1dGUKKyAgICAgICAgICAvLyBAYXR0cmlidXRlPScnCQkJCQkJCQktLT4gUmVtb3ZlIGF0dHJpYnV0ZQorICAgICAgICAgIC8vIEBhdHRyaWJ1dGU9J2F0dHJpYnV0ZSB2YWx1ZScgLS0+IENyZWF0ZSBhdHRyaWJ1dGUgKyB1cGRhdGUgdmFsdWUKKyAgICAgICAgICBzdHJpbmdbXSBhdHRyaWJ1dGVTcGxpdCA9IHN1YlBhdGguU3BsaXQoJz0nKTsKKyAgICAgICAgICBzdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZVNwbGl0WzBdLlN1YnN0cmluZygxLCBhdHRyaWJ1dGVTcGxpdFswXS5MZW5ndGggLSAxKTsKKyAgICAgICAgICBzdHJpbmcgYXR0cmlidXRlVmFsdWUgPSBudWxsOyAvLyBOdWxsIG1lYW5zIG5vIGF0dHJpYnV0ZSB2YWx1ZQorCisgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbiBhdHRyaWJ1dGUgdmFsdWUgdG8gc2V0CisgICAgICAgICAgaWYgKGF0dHJpYnV0ZVNwbGl0Lkxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgJyBvciAiIGZyb20gdGhlIGF0dHJpYnV0ZSB2YWx1ZQorICAgICAgICAgICAgYXR0cmlidXRlVmFsdWUgPSBhdHRyaWJ1dGVTcGxpdFsxXS5SZXBsYWNlKCInIiwgIiIpLlJlcGxhY2UoIlwiIiwgIiIpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIEdldCB0aGUgYXR0cmlidXRlIChpZiBleGlzdHMpCisgICAgICAgICAgWG1sQXR0cmlidXRlIGF0dHJpYnV0ZSA9IChYbWxBdHRyaWJ1dGUpKG5vZGUuQXR0cmlidXRlcy5HZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSkpOworCisgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBhdHRyaWJ1dGUgaWYgdmFsdWUgaXMgZW1wdHkgKG5vdCBudWxsKQorICAgICAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSA9PSBzdHJpbmcuRW1wdHkpIHsKKyAgICAgICAgICAgIC8vIE9ubHkgaWYgdGhlIGF0dHJpYnV0ZSBleGlzdHMKKyAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICBub2RlLkF0dHJpYnV0ZXMuUmVtb3ZlKGF0dHJpYnV0ZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgYXR0cmlidWUgaWYgZG9lcyBub3QgZXhpc3RzCisgICAgICAgICAgICBpZiAoYXR0cmlidXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgYXR0cmlidXRlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKKworICAgICAgICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIGN1cnJlbnQgbm9kZQorICAgICAgICAgICAgICBub2RlLkF0dHJpYnV0ZXMuQXBwZW5kKGF0dHJpYnV0ZSk7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgYXR0cmlidXRlIHZhbHVlCisgICAgICAgICAgICBpZiAoYXR0cmlidXRlVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICBub2RlLkF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0uVmFsdWUgPSBhdHRyaWJ1dGVWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gbm9kZU5hbWUKKyAgICAgICAgICAvLyB4Om5vZGVOYW1lCisgICAgICAgICAgLy8gbm9kZU5hbWVbZmluZCBjcml0ZXJpYV0KKyAgICAgICAgICAvLyB4Om5vZGVOYW1lW2ZpbmQgY3JpdGVyaWFdCisKKyAgICAgICAgICAvLyBMb29rIGZvciB0aGUgbm9kZSAod2l0aCBvciB3aXRob3V0IGZpbHRlciBjcml0ZXJpYSkKKyAgICAgICAgICBYbWxOb2RlIHN1Yk5vZGUgPSBub2RlLlNlbGVjdFNpbmdsZU5vZGUoc3ViUGF0aCwgTmFtZVNwYWNlTWFuYWdlcik7CisKKyAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBkb2VzIG5vdCBleGlzdHMKKyAgICAgICAgICBpZiAoc3ViTm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgICBzdHJpbmcgbm9kZU5hbWU7CisgICAgICAgICAgICBzdHJpbmcgbm9kZVByZWZpeDsKKyAgICAgICAgICAgIHN0cmluZ1tdIG5hbWVTcGxpdCA9IHN1YlBhdGguU3BsaXQoJzonKTsKKyAgICAgICAgICAgIG5hbWVTcGFjZVVyaSA9IHN0cmluZy5FbXB0eTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIG5hbWUgaGFzIGEgcHJlZml4IGxpa2UgImQ6bm9kZU5hbWUiCisgICAgICAgICAgICBpZiAobmFtZVNwbGl0Lkxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgICAgbm9kZVByZWZpeCA9IG5hbWVTcGxpdFswXTsKKyAgICAgICAgICAgICAgbmFtZVNwYWNlVXJpID0gTmFtZVNwYWNlTWFuYWdlci5Mb29rdXBOYW1lc3BhY2Uobm9kZVByZWZpeCk7CisgICAgICAgICAgICAgIG5vZGVOYW1lID0gbmFtZVNwbGl0WzFdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgbm9kZVByZWZpeCA9IHN0cmluZy5FbXB0eTsKKyAgICAgICAgICAgICAgbmFtZVNwYWNlVXJpID0gc3RyaW5nLkVtcHR5OworICAgICAgICAgICAgICBub2RlTmFtZSA9IG5hbWVTcGxpdFswXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIGNyaXRlcmlhIHBhcnQgaW4gdGhlIG5vZGUgbmFtZQorICAgICAgICAgICAgaWYgKG5vZGVOYW1lLkluZGV4T2YoIlsiKSA+IDApIHsKKyAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBjcml0ZXJpYSBmcm9tIHRoZSBub2RlIG5hbWUKKyAgICAgICAgICAgICAgbm9kZU5hbWUgPSBub2RlTmFtZS5TdWJzdHJpbmcoMCwgbm9kZU5hbWUuSW5kZXhPZigiWyIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5vZGVQcmVmaXggPT0gc3RyaW5nLkVtcHR5KSB7CisgICAgICAgICAgICAgIHN1Yk5vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChub2RlTmFtZSwgbmFtZVNwYWNlVXJpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlmIChub2RlLk93bmVyRG9jdW1lbnQgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgJiYgbm9kZS5Pd25lckRvY3VtZW50LkRvY3VtZW50RWxlbWVudCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAmJiBub2RlLk93bmVyRG9jdW1lbnQuRG9jdW1lbnRFbGVtZW50Lk5hbWVzcGFjZVVSSSA9PSBuYW1lU3BhY2VVcmkKKyAgICAgICAgICAgICAgICAgICYmIG5vZGUuT3duZXJEb2N1bWVudC5Eb2N1bWVudEVsZW1lbnQuUHJlZml4ID09IHN0cmluZy5FbXB0eSkgeworICAgICAgICAgICAgICAgIHN1Yk5vZGUgPSBub2RlLk93bmVyRG9jdW1lbnQuQ3JlYXRlRWxlbWVudChub2RlTmFtZSwgbmFtZVNwYWNlVXJpKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdWJOb2RlID0gbm9kZS5Pd25lckRvY3VtZW50LkNyZWF0ZUVsZW1lbnQobm9kZVByZWZpeCwgbm9kZU5hbWUsIG5hbWVTcGFjZVVyaSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byB1c2UgdGhlICJTY2hlbWFPcmRlciIKKyAgICAgICAgICAgIGlmIChub2RlSW5zZXJ0T3JkZXIgPT0gZU5vZGVJbnNlcnRPcmRlci5TY2hlbWFPcmRlcikgeworICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgU2NoZW1hIE9yZGVyIExpc3QgaXMgZW1wdHkKKyAgICAgICAgICAgICAgaWYgKChTY2hlbWFOb2RlT3JkZXIgPT0gbnVsbCkgfHwgKFNjaGVtYU5vZGVPcmRlci5MZW5ndGggPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAvLyBVc2UgdGhlICJJbnNlcnQgTGFzdCIgb3B0aW9uIHdoZW4gU2NoZW1hIE9yZGVyIExpc3QgaXMgZW1wdHkKKyAgICAgICAgICAgICAgICBub2RlSW5zZXJ0T3JkZXIgPSBlTm9kZUluc2VydE9yZGVyLkxhc3Q7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgcHJlcGVuZCBub2RlIGluIG9yZGVyIHRvIGluc2VydAorICAgICAgICAgICAgICAgIHJlZmVyZW5jZU5vZGUgPSBHZXRQcmVwZW5kTm9kZShub2RlTmFtZSwgbm9kZSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVmZXJlbmNlTm9kZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICBub2RlSW5zZXJ0T3JkZXIgPSBlTm9kZUluc2VydE9yZGVyLkJlZm9yZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgbm9kZUluc2VydE9yZGVyID0gZU5vZGVJbnNlcnRPcmRlci5MYXN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKG5vZGVJbnNlcnRPcmRlcikgeworICAgICAgICAgICAgICBjYXNlIGVOb2RlSW5zZXJ0T3JkZXIuQWZ0ZXI6CisgICAgICAgICAgICAgICAgbm9kZS5JbnNlcnRBZnRlcihzdWJOb2RlLCByZWZlcmVuY2VOb2RlKTsKKyAgICAgICAgICAgICAgICByZWZlcmVuY2VOb2RlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIGVOb2RlSW5zZXJ0T3JkZXIuQmVmb3JlOgorICAgICAgICAgICAgICAgIG5vZGUuSW5zZXJ0QmVmb3JlKHN1Yk5vZGUsIHJlZmVyZW5jZU5vZGUpOworICAgICAgICAgICAgICAgIHJlZmVyZW5jZU5vZGUgPSBudWxsOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIGNhc2UgZU5vZGVJbnNlcnRPcmRlci5GaXJzdDoKKyAgICAgICAgICAgICAgICBub2RlLlByZXBlbmRDaGlsZChzdWJOb2RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBjYXNlIGVOb2RlSW5zZXJ0T3JkZXIuTGFzdDoKKyAgICAgICAgICAgICAgICBub2RlLkFwcGVuZENoaWxkKHN1Yk5vZGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKworICAgICAgICAgIC8vIE1ha2UgdGhlIG5ld2x5IGNyZWF0ZWQgbm9kZSB0aGUgdG9wIG5vZGUgd2hlbiB0aGUgcmVzdCBvZiB0aGUgcGF0aAorICAgICAgICAgIC8vIGlzIGJlaW5nIGV2YWx1YXRlZC4gU28gbmV3bHkgY3JlYXRlZCBub2RlcyB3aWxsIGJlIHRoZSBjaGlsZHJlbiBvZiB0aGUKKyAgICAgICAgICAvLyBvbmUgd2UganVzdCBjcmVhdGVkLgorICAgICAgICAgIG5vZGUgPSBzdWJOb2RlOwogICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIGRvdWJsZT8gR2V0WG1sTm9kZURvdWJsZU51bGwoc3RyaW5nIHBhdGgpCi0JCXsKLQkJCXN0cmluZyBzID0gR2V0WG1sTm9kZVN0cmluZyhwYXRoKTsKLQkJCWlmIChzID09ICIiKQotCQkJewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJZWxzZQotCQkJewotCQkJCWRvdWJsZSB2OwotCQkJCWlmIChkb3VibGUuVHJ5UGFyc2UocywgTnVtYmVyU3R5bGVzLk51bWJlciwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgb3V0IHYpKQotCQkJCXsKLQkJCQkJcmV0dXJuIHY7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQl7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpbnRlcm5hbCBkb3VibGUgR2V0WG1sTm9kZURvdWJsZShzdHJpbmcgcGF0aCkKLQkJewotCQkJc3RyaW5nIHMgPSBHZXRYbWxOb2RlU3RyaW5nKHBhdGgpOwotCQkJaWYgKHMgPT0gIiIpCi0JCQl7Ci0JCQkJcmV0dXJuIGRvdWJsZS5OYU47Ci0JCQl9Ci0JCQllbHNlCi0JCQl7Ci0JCQkJZG91YmxlIHY7Ci0JCQkJaWYgKGRvdWJsZS5UcnlQYXJzZShzLCBOdW1iZXJTdHlsZXMuTnVtYmVyLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCBvdXQgdikpCi0JCQkJewotCQkJCQlyZXR1cm4gdjsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCXsKLQkJCQkJcmV0dXJuIGRvdWJsZS5OYU47Ci0JCQkJfQotCQkJfQotCQl9Ci0gICAgaW50ZXJuYWwgc3RyaW5nIEdldFhtbE5vZGVTdHJpbmcoWG1sTm9kZSBub2RlLCBzdHJpbmcgcGF0aCkKLSAgICB7Ci0gICAgICBpZiAobm9kZSA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm4gIiI7CiAgICAgICB9CisgICAgfQogCisgICAgLy8gUmV0dXJuIHRoZSBsYXN0IGNyZWF0ZWQvZm91bmQgbm9kZQorICAgIHJldHVybiBub2RlOworICB9CisKKyAgLy8vIDxzdW1tYXJ5PgorICAvLy8gcmV0dXJuIFByZXBlbmQgbm9kZQorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9Im5vZGVOYW1lIj5uYW1lIG9mIHRoZSBub2RlIHRvIGNoZWNrPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJub2RlIj5Ub3Bub2RlIHRvIGNoZWNrIGNoaWxkcmVuPC9wYXJhbT4KKyAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KKyAgcHJpdmF0ZSBYbWxOb2RlIEdldFByZXBlbmROb2RlKHN0cmluZyBub2RlTmFtZSwgWG1sTm9kZSBub2RlKSB7CisgICAgaW50IHBvcyA9IEdldE5vZGVQb3Mobm9kZU5hbWUpOworICAgIGlmIChwb3MgPCAwKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgWG1sTm9kZSBwcmVwZW5kTm9kZSA9IG51bGw7CisgICAgZm9yZWFjaCAoWG1sTm9kZSBjaGlsZE5vZGUgaW4gbm9kZS5DaGlsZE5vZGVzKSB7CisgICAgICBpbnQgY2hpbGRQb3MgPSBHZXROb2RlUG9zKGNoaWxkTm9kZS5OYW1lKTsKKyAgICAgIGlmIChjaGlsZFBvcworICAgICAgICAgID4gLTEpIC8vRm91bmQ/CisgICAgICB7CisgICAgICAgIGlmIChjaGlsZFBvcworICAgICAgICAgICAgPiBwb3MpIC8vUG9zaXRpb24gaXMgYmVmb3JlCisgICAgICAgIHsKKyAgICAgICAgICBwcmVwZW5kTm9kZSA9IGNoaWxkTm9kZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcHJlcGVuZE5vZGU7CisgIH0KKworICBwcml2YXRlIGludCBHZXROb2RlUG9zKHN0cmluZyBub2RlTmFtZSkgeworICAgIGludCBpeCA9IG5vZGVOYW1lLkluZGV4T2YoIjoiKTsKKyAgICBpZiAoaXggPiAwKSB7CisgICAgICBub2RlTmFtZSA9IG5vZGVOYW1lLlN1YnN0cmluZyhpeCArIDEsIG5vZGVOYW1lLkxlbmd0aCAtIChpeCArIDEpKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfc2NoZW1hTm9kZU9yZGVyLkxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAobm9kZU5hbWUgPT0gX3NjaGVtYU5vZGVPcmRlcltpXSkgeworICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBEZWxldGVBbGxOb2RlKHN0cmluZyBwYXRoKSB7CisgICAgc3RyaW5nW10gc3BsaXQgPSBwYXRoLlNwbGl0KCcvJyk7CisgICAgWG1sTm9kZSBub2RlID0gVG9wTm9kZTsKKyAgICBmb3JlYWNoIChzdHJpbmcgcyBpbiBzcGxpdCkgeworICAgICAgbm9kZSA9IG5vZGUuU2VsZWN0U2luZ2xlTm9kZShzLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgIGlmIChub2RlICE9IG51bGwpIHsKKyAgICAgICAgaWYgKG5vZGUgaXMgWG1sQXR0cmlidXRlKSB7CisgICAgICAgICAgKG5vZGUgYXMgWG1sQXR0cmlidXRlKS5Pd25lckVsZW1lbnQuQXR0cmlidXRlcy5SZW1vdmUobm9kZSBhcyBYbWxBdHRyaWJ1dGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChub2RlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW50ZXJuYWwgdm9pZCBEZWxldGVOb2RlKHN0cmluZyBwYXRoKSB7CisgICAgdmFyIG5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUocGF0aCwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgaWYgKG5vZGUgIT0gbnVsbCkgeworICAgICAgaWYgKG5vZGUgaXMgWG1sQXR0cmlidXRlKSB7CisgICAgICAgIHZhciBhdHQgPSAoWG1sQXR0cmlidXRlKW5vZGU7CisgICAgICAgIGF0dC5Pd25lckVsZW1lbnQuQXR0cmlidXRlcy5SZW1vdmUoYXR0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5vZGUuUGFyZW50Tm9kZS5SZW1vdmVDaGlsZChub2RlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpbnRlcm5hbCB2b2lkIERlbGV0ZVRvcE5vZGUoKSB7CisgICAgVG9wTm9kZS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKFRvcE5vZGUpOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBTZXRYbWxOb2RlU3RyaW5nKHN0cmluZyBwYXRoLCBzdHJpbmcgdmFsdWUpIHsKKyAgICBTZXRYbWxOb2RlU3RyaW5nKFRvcE5vZGUsIHBhdGgsIHZhbHVlLCBmYWxzZSwgZmFsc2UpOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBTZXRYbWxOb2RlU3RyaW5nKHN0cmluZyBwYXRoLCBzdHJpbmcgdmFsdWUsIGJvb2wgcmVtb3ZlSWZCbGFuaykgeworICAgIFNldFhtbE5vZGVTdHJpbmcoVG9wTm9kZSwgcGF0aCwgdmFsdWUsIHJlbW92ZUlmQmxhbmssIGZhbHNlKTsKKyAgfQorCisgIGludGVybmFsIHZvaWQgU2V0WG1sTm9kZVN0cmluZyhYbWxOb2RlIG5vZGUsIHN0cmluZyBwYXRoLCBzdHJpbmcgdmFsdWUpIHsKKyAgICBTZXRYbWxOb2RlU3RyaW5nKG5vZGUsIHBhdGgsIHZhbHVlLCBmYWxzZSwgZmFsc2UpOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBTZXRYbWxOb2RlU3RyaW5nKFhtbE5vZGUgbm9kZSwgc3RyaW5nIHBhdGgsIHN0cmluZyB2YWx1ZSwgYm9vbCByZW1vdmVJZkJsYW5rKSB7CisgICAgU2V0WG1sTm9kZVN0cmluZyhub2RlLCBwYXRoLCB2YWx1ZSwgcmVtb3ZlSWZCbGFuaywgZmFsc2UpOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBTZXRYbWxOb2RlU3RyaW5nKAorICAgICAgWG1sTm9kZSBub2RlLAorICAgICAgc3RyaW5nIHBhdGgsCisgICAgICBzdHJpbmcgdmFsdWUsCisgICAgICBib29sIHJlbW92ZUlmQmxhbmssCisgICAgICBib29sIGluc2VydEZpcnN0KSB7CisgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAodmFsdWUgPT0gIiIgJiYgcmVtb3ZlSWZCbGFuaykgeworICAgICAgRGVsZXRlQWxsTm9kZShwYXRoKTsKKyAgICB9IGVsc2UgewogICAgICAgWG1sTm9kZSBuYW1lTm9kZSA9IG5vZGUuU2VsZWN0U2luZ2xlTm9kZShwYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgIGlmIChuYW1lTm9kZSA9PSBudWxsKSB7CisgICAgICAgIENyZWF0ZU5vZGUocGF0aCwgaW5zZXJ0Rmlyc3QpOworICAgICAgICBuYW1lTm9kZSA9IG5vZGUuU2VsZWN0U2luZ2xlTm9kZShwYXRoLCBOYW1lU3BhY2VNYW5hZ2VyKTsKKyAgICAgIH0KKyAgICAgIC8vaWYgKG5hbWVOb2RlLklubmVyVGV4dCAhPSB2YWx1ZSkgSGFzQ2hhbmdlZCgpOworICAgICAgbmFtZU5vZGUuSW5uZXJUZXh0ID0gdmFsdWU7CisgICAgfQorICB9CiAKLSAgICAgIGlmIChuYW1lTm9kZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAobmFtZU5vZGUuTm9kZVR5cGUgPT0gWG1sTm9kZVR5cGUuQXR0cmlidXRlKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5hbWVOb2RlLlZhbHVlICE9IG51bGwgPyBuYW1lTm9kZS5WYWx1ZSA6ICIiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuYW1lTm9kZS5Jbm5lclRleHQ7CisgIGludGVybmFsIHZvaWQgU2V0WG1sTm9kZUJvb2woc3RyaW5nIHBhdGgsIGJvb2wgdmFsdWUpIHsKKyAgICBTZXRYbWxOb2RlU3RyaW5nKFRvcE5vZGUsIHBhdGgsIHZhbHVlID8gIjEiIDogIjAiLCBmYWxzZSwgZmFsc2UpOworICB9CisKKyAgaW50ZXJuYWwgdm9pZCBTZXRYbWxOb2RlQm9vbChzdHJpbmcgcGF0aCwgYm9vbCB2YWx1ZSwgYm9vbCByZW1vdmVJZikgeworICAgIGlmICh2YWx1ZSA9PSByZW1vdmVJZikgeworICAgICAgdmFyIG5vZGUgPSBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUocGF0aCwgTmFtZVNwYWNlTWFuYWdlcik7CisgICAgICBpZiAobm9kZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChub2RlIGlzIFhtbEF0dHJpYnV0ZSkgeworICAgICAgICAgIHZhciBlbGVtID0gKG5vZGUgYXMgWG1sQXR0cmlidXRlKS5Pd25lckVsZW1lbnQ7CisgICAgICAgICAgZWxlbS5QYXJlbnROb2RlLlJlbW92ZUNoaWxkKGVsZW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFRvcE5vZGUuUmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICIiOworICAgIH0gZWxzZSB7CisgICAgICBTZXRYbWxOb2RlU3RyaW5nKFRvcE5vZGUsIHBhdGgsIHZhbHVlID8gIjEiIDogIjAiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKyAgfQorCisgIGludGVybmFsIGJvb2wgRXhpc3ROb2RlKHN0cmluZyBwYXRoKSB7CisgICAgaWYgKFRvcE5vZGUgPT0gbnVsbCB8fCBUb3BOb2RlLlNlbGVjdFNpbmdsZU5vZGUocGF0aCwgTmFtZVNwYWNlTWFuYWdlcikgPT0gbnVsbCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGludGVybmFsIGJvb2w/IEdldFhtbE5vZGVCb29sTnVsbGFibGUoc3RyaW5nIHBhdGgpIHsKKyAgICB2YXIgdmFsdWUgPSBHZXRYbWxOb2RlU3RyaW5nKHBhdGgpOworICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eSh2YWx1ZSkpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICByZXR1cm4gR2V0WG1sTm9kZUJvb2wocGF0aCk7CisgIH0KKworICBpbnRlcm5hbCBib29sIEdldFhtbE5vZGVCb29sKHN0cmluZyBwYXRoKSB7CisgICAgcmV0dXJuIEdldFhtbE5vZGVCb29sKHBhdGgsIGZhbHNlKTsKKyAgfQorCisgIGludGVybmFsIGJvb2wgR2V0WG1sTm9kZUJvb2woc3RyaW5nIHBhdGgsIGJvb2wgYmxhbmtWYWx1ZSkgeworICAgIHN0cmluZyB2YWx1ZSA9IEdldFhtbE5vZGVTdHJpbmcocGF0aCk7CisgICAgaWYgKHZhbHVlID09ICIxIgorICAgICAgICB8fCB2YWx1ZSA9PSAiLTEiCisgICAgICAgIHx8IHZhbHVlLkVxdWFscygidHJ1ZSIsIFN0cmluZ0NvbXBhcmlzb24uSW52YXJpYW50Q3VsdHVyZUlnbm9yZUNhc2UpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKHZhbHVlID09ICIiKSB7CisgICAgICByZXR1cm4gYmxhbmtWYWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW50ZXJuYWwgaW50IEdldFhtbE5vZGVJbnQoc3RyaW5nIHBhdGgpIHsKKyAgICBpbnQgaTsKKyAgICBpZiAoaW50LlRyeVBhcnNlKEdldFhtbE5vZGVTdHJpbmcocGF0aCksIG91dCBpKSkgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiBpbnQuTWluVmFsdWU7CisgIH0KKworICBpbnRlcm5hbCBpbnQ/IEdldFhtbE5vZGVJbnROdWxsKHN0cmluZyBwYXRoKSB7CisgICAgaW50IGk7CisgICAgc3RyaW5nIHMgPSBHZXRYbWxOb2RlU3RyaW5nKHBhdGgpOworICAgIGlmIChzICE9ICIiICYmIGludC5UcnlQYXJzZShzLCBvdXQgaSkpIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIGludGVybmFsIGRlY2ltYWwgR2V0WG1sTm9kZURlY2ltYWwoc3RyaW5nIHBhdGgpIHsKKyAgICBkZWNpbWFsIGQ7CisgICAgaWYgKGRlY2ltYWwuVHJ5UGFyc2UoCisgICAgICAgIEdldFhtbE5vZGVTdHJpbmcocGF0aCksCisgICAgICAgIE51bWJlclN0eWxlcy5BbnksCisgICAgICAgIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsCisgICAgICAgIG91dCBkKSkgeworICAgICAgcmV0dXJuIGQ7CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgaW50ZXJuYWwgZGVjaW1hbD8gR2V0WG1sTm9kZURlY2ltYWxOdWxsKHN0cmluZyBwYXRoKSB7CisgICAgZGVjaW1hbCBkOworICAgIGlmIChkZWNpbWFsLlRyeVBhcnNlKAorICAgICAgICBHZXRYbWxOb2RlU3RyaW5nKHBhdGgpLAorICAgICAgICBOdW1iZXJTdHlsZXMuQW55LAorICAgICAgICBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLAorICAgICAgICBvdXQgZCkpIHsKKyAgICAgIHJldHVybiBkOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorCisgIGludGVybmFsIGRvdWJsZT8gR2V0WG1sTm9kZURvdWJsZU51bGwoc3RyaW5nIHBhdGgpIHsKKyAgICBzdHJpbmcgcyA9IEdldFhtbE5vZGVTdHJpbmcocGF0aCk7CisgICAgaWYgKHMgPT0gIiIpIHsKKyAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICBkb3VibGUgdjsKKyAgICBpZiAoZG91YmxlLlRyeVBhcnNlKHMsIE51bWJlclN0eWxlcy5OdW1iZXIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCB2KSkgeworICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9CisKKyAgaW50ZXJuYWwgZG91YmxlIEdldFhtbE5vZGVEb3VibGUoc3RyaW5nIHBhdGgpIHsKKyAgICBzdHJpbmcgcyA9IEdldFhtbE5vZGVTdHJpbmcocGF0aCk7CisgICAgaWYgKHMgPT0gIiIpIHsKKyAgICAgIHJldHVybiBkb3VibGUuTmFOOworICAgIH0KKyAgICBkb3VibGUgdjsKKyAgICBpZiAoZG91YmxlLlRyeVBhcnNlKHMsIE51bWJlclN0eWxlcy5OdW1iZXIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsIG91dCB2KSkgeworICAgICAgcmV0dXJuIHY7CisgICAgfQorICAgIHJldHVybiBkb3VibGUuTmFOOworICB9CisKKyAgaW50ZXJuYWwgc3RyaW5nIEdldFhtbE5vZGVTdHJpbmcoWG1sTm9kZSBub2RlLCBzdHJpbmcgcGF0aCkgeworICAgIGlmIChub2RlID09IG51bGwpIHsKKyAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBYbWxOb2RlIG5hbWVOb2RlID0gbm9kZS5TZWxlY3RTaW5nbGVOb2RlKHBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOworCisgICAgaWYgKG5hbWVOb2RlICE9IG51bGwpIHsKKyAgICAgIGlmIChuYW1lTm9kZS5Ob2RlVHlwZSA9PSBYbWxOb2RlVHlwZS5BdHRyaWJ1dGUpIHsKKyAgICAgICAgcmV0dXJuIG5hbWVOb2RlLlZhbHVlICE9IG51bGwgPyBuYW1lTm9kZS5WYWx1ZSA6ICIiOworICAgICAgfQorICAgICAgcmV0dXJuIG5hbWVOb2RlLklubmVyVGV4dDsKKyAgICB9CisgICAgcmV0dXJuICIiOworICB9CisKKyAgaW50ZXJuYWwgc3RyaW5nIEdldFhtbE5vZGVTdHJpbmcoc3RyaW5nIHBhdGgpIHsKKyAgICByZXR1cm4gR2V0WG1sTm9kZVN0cmluZyhUb3BOb2RlLCBwYXRoKTsKKyAgfQorCisgIGludGVybmFsIHN0YXRpYyBVcmkgR2V0TmV3VXJpKFppcFBhY2thZ2UgcGFja2FnZSwgc3RyaW5nIHNVcmkpIHsKKyAgICByZXR1cm4gR2V0TmV3VXJpKHBhY2thZ2UsIHNVcmksIDEpOworICB9CisKKyAgaW50ZXJuYWwgc3RhdGljIFVyaSBHZXROZXdVcmkoWmlwUGFja2FnZSBwYWNrYWdlLCBzdHJpbmcgc1VyaSwgaW50IGlkKSB7CisgICAgVXJpIHVyaTsKKyAgICBkbyB7CisgICAgICB1cmkgPSBuZXcoc3RyaW5nLkZvcm1hdChzVXJpLCBpZCsrKSwgVXJpS2luZC5SZWxhdGl2ZSk7CisgICAgfSB3aGlsZSAocGFja2FnZS5QYXJ0RXhpc3RzKHVyaSkpOworICAgIHJldHVybiB1cmk7CisgIH0KKworICAvLy8gPHN1bW1hcnk+CisgIC8vLyBJbnNlcnQgdGhlIG5ldyBub2RlIGJlZm9yZSBhbnkgb2YgdGhlIG5vZGVzIGluIHRoZSBjb21tYSBzZXBhcmV0ZWQgbGlzdAorICAvLy8gPC9zdW1tYXJ5PgorICAvLy8gPHBhcmFtIG5hbWU9InBhcmVudE5vZGUiPlBhcmVudCBub2RlPC9wYXJhbT4KKyAgLy8vIDxwYXJhbSBuYW1lPSJiZWZvcmVOb2RlcyI+Y29tbWEgc2VwYXJhdGVkIGxpc3QgY29udGFpbmluZyBub2RlcyB0byBpbnNlcnQgYWZ0ZXIuIExlZnQgdG8gcmlnaHQgb3JkZXI8L3BhcmFtPgorICAvLy8gPHBhcmFtIG5hbWU9Im5ld05vZGUiPlRoZSBuZXcgbm9kZSB0byBiZSBpbnNlcnRlcmQ8L3BhcmFtPgorICBpbnRlcm5hbCB2b2lkIEluc2VyQWZ0ZXIoWG1sTm9kZSBwYXJlbnROb2RlLCBzdHJpbmcgYmVmb3JlTm9kZXMsIFhtbE5vZGUgbmV3Tm9kZSkgeworICAgIHN0cmluZ1tdIG5vZGVQYXRocyA9IGJlZm9yZU5vZGVzLlNwbGl0KCcsJyk7CisKKyAgICBmb3JlYWNoIChzdHJpbmcgbm9kZVBhdGggaW4gbm9kZVBhdGhzKSB7CisgICAgICBYbWxOb2RlIG5vZGUgPSBwYXJlbnROb2RlLlNlbGVjdFNpbmdsZU5vZGUobm9kZVBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOworICAgICAgaWYgKG5vZGUgIT0gbnVsbCkgeworICAgICAgICBwYXJlbnROb2RlLkluc2VydEFmdGVyKG5ld05vZGUsIG5vZGUpOworICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgfQotCQlpbnRlcm5hbCBzdHJpbmcgR2V0WG1sTm9kZVN0cmluZyhzdHJpbmcgcGF0aCkKLQkJewotICAgICAgICAgICAgcmV0dXJuIEdldFhtbE5vZGVTdHJpbmcoVG9wTm9kZSwgcGF0aCk7Ci0JCX0KLQkJaW50ZXJuYWwgc3RhdGljIFVyaSBHZXROZXdVcmkoUGFja2FnaW5nLlppcFBhY2thZ2UgcGFja2FnZSwgc3RyaW5nIHNVcmkpCi0JCXsKLQkJCXJldHVybiBHZXROZXdVcmkocGFja2FnZSwgc1VyaSwgMSk7Ci0JCX0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIFVyaSBHZXROZXdVcmkoUGFja2FnaW5nLlppcFBhY2thZ2UgcGFja2FnZSwgc3RyaW5nIHNVcmksIGludCBpZCkKLQkJewotCQkJVXJpIHVyaTsKLQkJCWRvCi0JCQl7Ci0JCQkJdXJpID0gbmV3IFVyaShzdHJpbmcuRm9ybWF0KHNVcmksIGlkKyspLCBVcmlLaW5kLlJlbGF0aXZlKTsKLQkJCX0KLQkJCXdoaWxlIChwYWNrYWdlLlBhcnRFeGlzdHModXJpKSk7Ci0JCQlyZXR1cm4gdXJpOwotCQl9Ci0JCS8vLyA8c3VtbWFyeT4KLQkJLy8vIEluc2VydCB0aGUgbmV3IG5vZGUgYmVmb3JlIGFueSBvZiB0aGUgbm9kZXMgaW4gdGhlIGNvbW1hIHNlcGFyZXRlZCBsaXN0Ci0JCS8vLyA8L3N1bW1hcnk+Ci0JCS8vLyA8cGFyYW0gbmFtZT0icGFyZW50Tm9kZSI+UGFyZW50IG5vZGU8L3BhcmFtPgotCQkvLy8gPHBhcmFtIG5hbWU9ImJlZm9yZU5vZGVzIj5jb21tYSBzZXBhcmF0ZWQgbGlzdCBjb250YWluaW5nIG5vZGVzIHRvIGluc2VydCBhZnRlci4gTGVmdCB0byByaWdodCBvcmRlcjwvcGFyYW0+Ci0JCS8vLyA8cGFyYW0gbmFtZT0ibmV3Tm9kZSI+VGhlIG5ldyBub2RlIHRvIGJlIGluc2VydGVyZDwvcGFyYW0+Ci0JCWludGVybmFsIHZvaWQgSW5zZXJBZnRlcihYbWxOb2RlIHBhcmVudE5vZGUsIHN0cmluZyBiZWZvcmVOb2RlcywgWG1sTm9kZSBuZXdOb2RlKQotCQl7Ci0JCQlzdHJpbmdbXSBub2RlUGF0aHMgPSBiZWZvcmVOb2Rlcy5TcGxpdCgnLCcpOworICAgIHBhcmVudE5vZGUuSW5zZXJ0QWZ0ZXIobmV3Tm9kZSwgbnVsbCk7CisgIH0KIAotCQkJZm9yZWFjaCAoc3RyaW5nIG5vZGVQYXRoIGluIG5vZGVQYXRocykKLQkJCXsKLQkJCQlYbWxOb2RlIG5vZGUgPSBwYXJlbnROb2RlLlNlbGVjdFNpbmdsZU5vZGUobm9kZVBhdGgsIE5hbWVTcGFjZU1hbmFnZXIpOwotCQkJCWlmIChub2RlICE9IG51bGwpCi0JCQkJewotCQkJCQlwYXJlbnROb2RlLkluc2VydEFmdGVyKG5ld05vZGUsIG5vZGUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJcGFyZW50Tm9kZS5JbnNlcnRBZnRlcihuZXdOb2RlLCBudWxsKTsKLQkJfQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBMb2FkWG1sU2FmZShYbWxEb2N1bWVudCB4bWxEb2MsIFN0cmVhbSBzdHJlYW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFhtbFJlYWRlclNldHRpbmdzIHNldHRpbmdzID0gbmV3IFhtbFJlYWRlclNldHRpbmdzKCk7Ci0gICAgICAgICAgICAvL0Rpc2FibGUgZW50aXR5IHBhcnNpbmcgKHRvIGF2aW9kIHhtbGJvbWJzLCBFeHRlcm5hbCBFbnRpdHkgQXR0YWNrcyBldGMpLgotICAgICAgICAgICAgc2V0dGluZ3MuUHJvaGliaXREdGQgPSB0cnVlOwotICAgICAgICAgICAgWG1sUmVhZGVyIHJlYWRlciA9IFhtbFJlYWRlci5DcmVhdGUoc3RyZWFtLCBzZXR0aW5ncyk7Ci0gICAgICAgICAgICB4bWxEb2MuTG9hZChyZWFkZXIpOwotICAgICAgICB9Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyB2b2lkIExvYWRYbWxTYWZlKFhtbERvY3VtZW50IHhtbERvYywgc3RyaW5nIHhtbCwgRW5jb2RpbmcgZW5jb2RpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKGVuY29kaW5nLkdldEJ5dGVzKHhtbCkpOwotICAgICAgICAgICAgTG9hZFhtbFNhZmUoeG1sRG9jLCBzdHJlYW0pOwotICAgICAgICB9Ci0JfQorICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBMb2FkWG1sU2FmZShYbWxEb2N1bWVudCB4bWxEb2MsIFN0cmVhbSBzdHJlYW0pIHsKKyAgICBYbWxSZWFkZXJTZXR0aW5ncyBzZXR0aW5ncyA9IG5ldyBYbWxSZWFkZXJTZXR0aW5ncygpOworICAgIC8vRGlzYWJsZSBlbnRpdHkgcGFyc2luZyAodG8gYXZpb2QgeG1sYm9tYnMsIEV4dGVybmFsIEVudGl0eSBBdHRhY2tzIGV0YykuCisgICAgc2V0dGluZ3MuUHJvaGliaXREdGQgPSB0cnVlOworICAgIFhtbFJlYWRlciByZWFkZXIgPSBYbWxSZWFkZXIuQ3JlYXRlKHN0cmVhbSwgc2V0dGluZ3MpOworICAgIHhtbERvYy5Mb2FkKHJlYWRlcik7CisgIH0KKworICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBMb2FkWG1sU2FmZShYbWxEb2N1bWVudCB4bWxEb2MsIHN0cmluZyB4bWwsIEVuY29kaW5nIGVuY29kaW5nKSB7CisgICAgdmFyIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oZW5jb2RpbmcuR2V0Qnl0ZXMoeG1sKSk7CisgICAgTG9hZFhtbFNhZmUoeG1sRG9jLCBzdHJlYW0pOworICB9CiB9CmRpZmYgLS1naXQgYS9FUFBsdXMvWG1sSGVscGVyRmFjdG9yeS5jcyBiL0VQUGx1cy9YbWxIZWxwZXJGYWN0b3J5LmNzCmluZGV4IGIyMTA2YTIuLjBhZjA3OGIgMTAwNjQ0Ci0tLSBhL0VQUGx1cy9YbWxIZWxwZXJGYWN0b3J5LmNzCisrKyBiL0VQUGx1cy9YbWxIZWxwZXJGYWN0b3J5LmNzCkBAIC0xLDQgKzEsNCBAQAot77u/LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBZb3UgbWF5IGFtZW5kIGFuZCBkaXN0cmlidXRlIGFzIHlvdSBsaWtlLCBidXQgZG9uJ3QgcmVtb3ZlIHRoaXMgaGVhZGVyIQogICoKICAqIEVQUGx1cyBwcm92aWRlcyBzZXJ2ZXItc2lkZSBnZW5lcmF0aW9uIG9mIEV4Y2VsIDIwMDcvMjAxMCBzcHJlYWRzaGVldHMuCkBAIC0xMyw1MiArMTMsNDEgQEAKIAogICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKiBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHZpZXdlZCBhdCBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2xncGwtbGljZW5zZS5waHAKICAqIElmIHlvdSB1bmZhbWlsaWFyIHdpdGggdGhpcyBsaWNlbnNlIG9yIGhhdmUgcXVlc3Rpb25zIGFib3V0IGl0LCBoZXJlIGlzIGFuIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtZmFxLmh0bWwKICAqCi0gKiBBbGwgY29kZSBhbmQgZXhlY3V0YWJsZXMgYXJlIHByb3ZpZGVkICJhcyBpcyIgd2l0aCBubyB3YXJyYW50eSBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAKKyAqIEFsbCBjb2RlIGFuZCBleGVjdXRhYmxlcyBhcmUgcHJvdmlkZWQgImFzIGlzIiB3aXRoIG5vIHdhcnJhbnR5IGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKiBUaGUgYXV0aG9yIGFjY2VwdHMgbm8gbGlhYmlsaXR5IGZvciBhbnkgZGFtYWdlIG9yIGxvc3Mgb2YgYnVzaW5lc3MgdGhhdCB0aGlzIHByb2R1Y3QgbWF5IGNhdXNlLgogICoKICAqIENvZGUgY2hhbmdlIG5vdGVzOgotICogCisgKgogICogQXV0aG9yCQkJCQkJCUNoYW5nZQkJCQkJCURhdGUKICAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogTWF0cyBBbG0gCQkgICAgSW5pdGlhbCBSZWxlYXNlCQkgICAgICAgIDIwMTEtMDUtMDEKICAqIEphbiBLw6RsbG1hbgkJICAgIExpY2Vuc2UgY2hhbmdlZCBHUEwtLT5MR1BMICAyMDExLTEyLTI3CiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKKwogdXNpbmcgU3lzdGVtLlhtbDsKIAotbmFtZXNwYWNlIE9mZmljZU9wZW5YbWwKLXsKLSAgICBpbnRlcm5hbCBjbGFzcyBYbWxIZWxwZXJJbnN0YW5jZSA6IFhtbEhlbHBlcgotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgWG1sSGVscGVySW5zdGFuY2UoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKQotICAgICAgICAgICAgOiBiYXNlKG5hbWVzcGFjZU1hbmFnZXIpCi0gICAgICAgIHt9CituYW1lc3BhY2UgT2ZmaWNlT3BlblhtbDsKIAotICAgICAgICBpbnRlcm5hbCBYbWxIZWxwZXJJbnN0YW5jZShYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIsIFhtbE5vZGUgdG9wTm9kZSkKLSAgICAgICAgICAgIDogYmFzZShuYW1lc3BhY2VNYW5hZ2VyLCB0b3BOb2RlKQotICAgICAgICB7fQoraW50ZXJuYWwgY2xhc3MgWG1sSGVscGVySW5zdGFuY2UgOiBYbWxIZWxwZXIgeworICBpbnRlcm5hbCBYbWxIZWxwZXJJbnN0YW5jZShYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCisgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlcikge30KIAotICAgIH0KKyAgaW50ZXJuYWwgWG1sSGVscGVySW5zdGFuY2UoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyLCBYbWxOb2RlIHRvcE5vZGUpCisgICAgICA6IGJhc2UobmFtZXNwYWNlTWFuYWdlciwgdG9wTm9kZSkge30KK30KIAotICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBYbWxIZWxwZXJGYWN0b3J5Ci0gICAgewotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgWG1sSGVscGVyIENyZWF0ZShYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgWG1sSGVscGVySW5zdGFuY2UobmFtZXNwYWNlTWFuYWdlcik7Ci0gICAgICAgIH0KK2ludGVybmFsIHN0YXRpYyBjbGFzcyBYbWxIZWxwZXJGYWN0b3J5IHsKKyAgaW50ZXJuYWwgc3RhdGljIFhtbEhlbHBlciBDcmVhdGUoWG1sTmFtZXNwYWNlTWFuYWdlciBuYW1lc3BhY2VNYW5hZ2VyKSB7CisgICAgcmV0dXJuIG5ldyBYbWxIZWxwZXJJbnN0YW5jZShuYW1lc3BhY2VNYW5hZ2VyKTsKKyAgfQogCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBYbWxIZWxwZXIgQ3JlYXRlKFhtbE5hbWVzcGFjZU1hbmFnZXIgbmFtZXNwYWNlTWFuYWdlciwgWG1sTm9kZSB0b3BOb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFhtbEhlbHBlckluc3RhbmNlKG5hbWVzcGFjZU1hbmFnZXIsIHRvcE5vZGUpOwotICAgICAgICB9Ci0gICAgfQorICBpbnRlcm5hbCBzdGF0aWMgWG1sSGVscGVyIENyZWF0ZShYbWxOYW1lc3BhY2VNYW5hZ2VyIG5hbWVzcGFjZU1hbmFnZXIsIFhtbE5vZGUgdG9wTm9kZSkgeworICAgIHJldHVybiBuZXcgWG1sSGVscGVySW5zdGFuY2UobmFtZXNwYWNlTWFuYWdlciwgdG9wTm9kZSk7CisgIH0KIH0KZGlmZiAtLWdpdCBhL05ldENvcmVUZXN0cy9FeGNlbFBhY2thZ2VUZXN0LmNzIGIvTmV0Q29yZVRlc3RzL0V4Y2VsUGFja2FnZVRlc3QuY3MKaW5kZXggZTU5Mjc4Zi4uOTc1ZmFkYyAxMDA2NDQKLS0tIGEvTmV0Q29yZVRlc3RzL0V4Y2VsUGFja2FnZVRlc3QuY3MKKysrIGIvTmV0Q29yZVRlc3RzL0V4Y2VsUGFja2FnZVRlc3QuY3MKQEAgLTcsMjQgKzcsMjEgQEAKIG5hbWVzcGFjZSBOZXRDb3JlVGVzdHM7CiAKIFtUZXN0Q2xhc3NdCi1wdWJsaWMgY2xhc3MgRXhjZWxQYWNrYWdlVGVzdAotewotICAgIFtUZXN0TWV0aG9kXQotICAgIHB1YmxpYyB2b2lkIFRlc3RHZXRBc0J5dGVBcnJheSgpCi0gICAgewotICAgICAgICB2YXIgcGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IEZpbGVJbmZvKEdldFRlc3RXb3JrYm9va1BhdGgoIlRpbWVzLnhsc3giKSkpOwotICAgICAgICB2YXIgZGF0YSA9IHBhY2thZ2UuR2V0QXNCeXRlQXJyYXkoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiByZWxvYWQKLSAgICAgICAgdmFyIG5ld1BhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBNZW1vcnlTdHJlYW0oZGF0YSwgZmFsc2UpKTsKLSAgICAgICAgbmV3UGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkNvdW50LlNob3VsZCgpLkJlKDEpOwotICAgICAgICB2YXIgd29ya3NoZWV0ID0gbmV3UGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7Ci0gICAgICAgIHdvcmtzaGVldC5OYW1lLlNob3VsZCgpLkJlKCJUaW1lc19jc3YiKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEdldFRlc3RXb3JrYm9va1BhdGgoc3RyaW5nIGZpbGVuYW1lKQotICAgIHsKLSAgICAgICAgdmFyIGFzc2VtYmx5UGF0aCA9IFBhdGguR2V0RGlyZWN0b3J5TmFtZSh0eXBlb2YoRXhjZWxQYWNrYWdlVGVzdCkuQXNzZW1ibHkuTG9jYXRpb24pITsKLSAgICAgICAgcmV0dXJuIFBhdGguQ29tYmluZShhc3NlbWJseVBhdGgsICJUZXN0V29ya2Jvb2tzIiwgZmlsZW5hbWUpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitwdWJsaWMgY2xhc3MgRXhjZWxQYWNrYWdlVGVzdCB7CisgIFtUZXN0TWV0aG9kXQorICBwdWJsaWMgdm9pZCBUZXN0R2V0QXNCeXRlQXJyYXkoKSB7CisgICAgdmFyIHBhY2thZ2UgPSBuZXcgRXhjZWxQYWNrYWdlKG5ldyBGaWxlSW5mbyhHZXRUZXN0V29ya2Jvb2tQYXRoKCJUaW1lcy54bHN4IikpKTsKKyAgICB2YXIgZGF0YSA9IHBhY2thZ2UuR2V0QXNCeXRlQXJyYXkoKTsKKworICAgIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiByZWxvYWQKKyAgICB2YXIgbmV3UGFja2FnZSA9IG5ldyBFeGNlbFBhY2thZ2UobmV3IE1lbW9yeVN0cmVhbShkYXRhLCBmYWxzZSkpOworICAgIG5ld1BhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5Db3VudC5TaG91bGQoKS5CZSgxKTsKKyAgICB2YXIgd29ya3NoZWV0ID0gbmV3UGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7CisgICAgd29ya3NoZWV0Lk5hbWUuU2hvdWxkKCkuQmUoIlRpbWVzX2NzdiIpOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEdldFRlc3RXb3JrYm9va1BhdGgoc3RyaW5nIGZpbGVuYW1lKSB7CisgICAgdmFyIGFzc2VtYmx5UGF0aCA9IFBhdGguR2V0RGlyZWN0b3J5TmFtZSh0eXBlb2YoRXhjZWxQYWNrYWdlVGVzdCkuQXNzZW1ibHkuTG9jYXRpb24pITsKKyAgICByZXR1cm4gUGF0aC5Db21iaW5lKGFzc2VtYmx5UGF0aCwgIlRlc3RXb3JrYm9va3MiLCBmaWxlbmFtZSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL05ldENvcmVUZXN0cy9OZXRDb3JlVGVzdHMuY3Nwcm9qIGIvTmV0Q29yZVRlc3RzL05ldENvcmVUZXN0cy5jc3Byb2oKaW5kZXggM2YxMWU5Zi4uYjVlOTQxNCAxMDA2NDQKLS0tIGEvTmV0Q29yZVRlc3RzL05ldENvcmVUZXN0cy5jc3Byb2oKKysrIGIvTmV0Q29yZVRlc3RzL05ldENvcmVUZXN0cy5jc3Byb2oKQEAgLTQsMTkgKzQsMTkgQEAKICAgICA8TnVsbGFibGU+ZW5hYmxlPC9OdWxsYWJsZT4KICAgPC9Qcm9wZXJ0eUdyb3VwPgogICA8SXRlbUdyb3VwPgotICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkZsdWVudEFzc2VydGlvbnMiIFZlcnNpb249IjYuNi4wIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9IkZsdWVudEFzc2VydGlvbnMiIFZlcnNpb249IjYuNi4wIi8+CiAgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iTVNUZXN0LlRlc3RBZGFwdGVyIiBWZXJzaW9uPSIyLjIuOCIvPgotICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik1TVGVzdC5UZXN0RnJhbWV3b3JrIiBWZXJzaW9uPSIyLjIuOCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNU1Rlc3QuVGVzdEZyYW1ld29yayIgVmVyc2lvbj0iMi4yLjgiLz4KICAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJNaWNyb3NvZnQuTkVULlRlc3QuU0RLIiBWZXJzaW9uPSIxNy4xLjAiLz4KICAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uTmV0Lkh0dHAiIFZlcnNpb249IjQuMy40Ii8+Ci0gICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlRleHQuRW5jb2RpbmcuQ29kZVBhZ2VzIiBWZXJzaW9uPSI1LjAuMCIgLz4KKyAgICA8UGFja2FnZVJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uVGV4dC5FbmNvZGluZy5Db2RlUGFnZXMiIFZlcnNpb249IjUuMC4wIi8+CiAgICAgPFBhY2thZ2VSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zIiBWZXJzaW9uPSI0LjMuMSIvPgogCi0gICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cRVBQbHVzXEVQUGx1c1NESy5jc3Byb2oiIC8+Ci0gICAgCisgICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cRVBQbHVzXEVQUGx1c1NESy5jc3Byb2oiLz4KKwogICAgIDxOb25lIEluY2x1ZGU9IlRlc3RXb3JrYm9va3MvKioiIENvcHlUb091dHB1dERpcmVjdG9yeT0iUHJlc2VydmVOZXdlc3QiLz4KIAogICAgIDwhLS1UcmFuc2llbnQgZGVwZW5kZW5jeTsgcmVxdWlyZWQgdG8gYWRkcmVzcyBiLzIzMDI3ODY0NC0tPgotICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik5ld3RvbnNvZnQuSnNvbiIgVmVyc2lvbj0iMTMuMC4xIiAvPgorICAgIDxQYWNrYWdlUmVmZXJlbmNlIEluY2x1ZGU9Ik5ld3RvbnNvZnQuSnNvbiIgVmVyc2lvbj0iMTMuMC4xIi8+CiAgIDwvSXRlbUdyb3VwPgogPC9Qcm9qZWN0PgpkaWZmIC0tZ2l0IGEvTmV0Q29yZVRlc3RzL1RpbWVUZXN0LmNzIGIvTmV0Q29yZVRlc3RzL1RpbWVUZXN0LmNzCmluZGV4IGIyMDdmZjAuLjhjZTkyZjUgMTAwNjQ0Ci0tLSBhL05ldENvcmVUZXN0cy9UaW1lVGVzdC5jcworKysgYi9OZXRDb3JlVGVzdHMvVGltZVRlc3QuY3MKQEAgLTEsNCArMSw0IEBACi3vu791c2luZyBTeXN0ZW07Cit1c2luZyBTeXN0ZW07CiB1c2luZyBTeXN0ZW0uSU87CiB1c2luZyBTeXN0ZW0uTGlucTsKIHVzaW5nIFN5c3RlbS5UZXh0OwpAQCAtOSw1NyArOSw1MiBAQAogbmFtZXNwYWNlIE5ldENvcmVUZXN0czsKIAogW1Rlc3RDbGFzc10KLXB1YmxpYyBjbGFzcyBUaW1lVGVzdAotewotICAgIHN0YXRpYyBUaW1lVGVzdCgpCi0gICAgewotICAgICAgICBFbmNvZGluZy5SZWdpc3RlclByb3ZpZGVyKENvZGVQYWdlc0VuY29kaW5nUHJvdmlkZXIuSW5zdGFuY2UpOwotICAgIH0KLSAgICAKLSAgICBbVGVzdE1ldGhvZF0KLSAgICBwdWJsaWMgdm9pZCBUZXN0SW5jb3JyZWN0RHVyYXRpb25Gcm9tT0FEYXRlKCkKLSAgICB7Ci0gICAgICAgIEV4Y2VsV29ya3NoZWV0LkluY29ycmVjdER1cmF0aW9uRnJvbU9BRGF0ZSgyLjc1KS5TaG91bGQoKS5CZShuZXcoMTkwMCwgMSwgMSwgMTgsIDAsIDApKTsKLSAgICAgICAgRXhjZWxXb3Jrc2hlZXQuSW5jb3JyZWN0RHVyYXRpb25Gcm9tT0FEYXRlKDEuNzUpLlNob3VsZCgpLkJlKG5ldygxODk5LCAxMiwgMzEsIDE4LCAwLCAwKSk7Ci0gICAgICAgIEV4Y2VsV29ya3NoZWV0LkluY29ycmVjdER1cmF0aW9uRnJvbU9BRGF0ZSgwLjc1KS5TaG91bGQoKS5CZShuZXcoMTg5OSwgMTIsIDMwLCAxOCwgMCwgMCkpOwotICAgICAgICBFeGNlbFdvcmtzaGVldC5JbmNvcnJlY3REdXJhdGlvbkZyb21PQURhdGUoMC41KS5TaG91bGQoKS5CZShuZXcoMTg5OSwgMTIsIDMwLCAxMiwgMCwgMCkpOwotICAgICAgICBFeGNlbFdvcmtzaGVldC5JbmNvcnJlY3REdXJhdGlvbkZyb21PQURhdGUoMC4yNSkuU2hvdWxkKCkuQmUobmV3KDE4OTksIDEyLCAzMCwgNiwgMCwgMCkpOworcHVibGljIGNsYXNzIFRpbWVUZXN0IHsKKyAgc3RhdGljIFRpbWVUZXN0KCkgeworICAgIEVuY29kaW5nLlJlZ2lzdGVyUHJvdmlkZXIoQ29kZVBhZ2VzRW5jb2RpbmdQcm92aWRlci5JbnN0YW5jZSk7CisgIH0KIAotICAgICAgICBFeGNlbFdvcmtzaGVldC5JbmNvcnJlY3REdXJhdGlvbkZyb21PQURhdGUoMCkuU2hvdWxkKCkuQmUobmV3KDE4OTksIDEyLCAzMCwgMCwgMCwgMCkpOwotICAgICAgICAKLSAgICAgICAgRXhjZWxXb3Jrc2hlZXQuSW5jb3JyZWN0RHVyYXRpb25Gcm9tT0FEYXRlKC0wLjI1KS5TaG91bGQoKS5CZShuZXcoMTg5OSwgMTIsIDI5LCAxOCwgMCwgMCkpOwotICAgICAgICBFeGNlbFdvcmtzaGVldC5JbmNvcnJlY3REdXJhdGlvbkZyb21PQURhdGUoLTAuNSkuU2hvdWxkKCkuQmUobmV3KDE4OTksIDEyLCAyOSwgMTIsIDAsIDApKTsKLSAgICAgICAgRXhjZWxXb3Jrc2hlZXQuSW5jb3JyZWN0RHVyYXRpb25Gcm9tT0FEYXRlKC0wLjc1KS5TaG91bGQoKS5CZShuZXcoMTg5OSwgMTIsIDI5LCA2LCAwLCAwKSk7Ci0gICAgICAgIEV4Y2VsV29ya3NoZWV0LkluY29ycmVjdER1cmF0aW9uRnJvbU9BRGF0ZSgtMS43NSkuU2hvdWxkKCkuQmUobmV3KDE4OTksIDEyLCAyOCwgNiwgMCwgMCkpOwotICAgICAgICBFeGNlbFdvcmtzaGVldC5JbmNvcnJlY3REdXJhdGlvbkZyb21PQURhdGUoLTIuNzUpLlNob3VsZCgpLkJlKG5ldygxODk5LCAxMiwgMjcsIDYsIDAsIDApKTsKLSAgICB9CisgIFtUZXN0TWV0aG9kXQorICBwdWJsaWMgdm9pZCBUZXN0SW5jb3JyZWN0RHVyYXRpb25Gcm9tT2FEYXRlKCkgeworICAgIEV4Y2VsV29ya3NoZWV0LkluY29ycmVjdER1cmF0aW9uRnJvbU9hRGF0ZSgyLjc1KS5TaG91bGQoKS5CZShuZXcoMTkwMCwgMSwgMSwgMTgsIDAsIDApKTsKKyAgICBFeGNlbFdvcmtzaGVldC5JbmNvcnJlY3REdXJhdGlvbkZyb21PYURhdGUoMS43NSkuU2hvdWxkKCkuQmUobmV3KDE4OTksIDEyLCAzMSwgMTgsIDAsIDApKTsKKyAgICBFeGNlbFdvcmtzaGVldC5JbmNvcnJlY3REdXJhdGlvbkZyb21PYURhdGUoMC43NSkuU2hvdWxkKCkuQmUobmV3KDE4OTksIDEyLCAzMCwgMTgsIDAsIDApKTsKKyAgICBFeGNlbFdvcmtzaGVldC5JbmNvcnJlY3REdXJhdGlvbkZyb21PYURhdGUoMC41KS5TaG91bGQoKS5CZShuZXcoMTg5OSwgMTIsIDMwLCAxMiwgMCwgMCkpOworICAgIEV4Y2VsV29ya3NoZWV0LkluY29ycmVjdER1cmF0aW9uRnJvbU9hRGF0ZSgwLjI1KS5TaG91bGQoKS5CZShuZXcoMTg5OSwgMTIsIDMwLCA2LCAwLCAwKSk7CiAKLSAgICBbVGVzdE1ldGhvZF0KLSAgICBwdWJsaWMgdm9pZCBUZXN0RGF0ZVBhcnNlKCkKLSAgICB7Ci0gICAgICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oR2V0VGVzdFdvcmtib29rUGF0aCgiVGltZXMueGxzeCIpKSk7Ci0gICAgICAgIHZhciBzaGVldCA9IHBhY2thZ2UuV29ya2Jvb2suV29ya3NoZWV0cy5GaXJzdCgpOworICAgIEV4Y2VsV29ya3NoZWV0LkluY29ycmVjdER1cmF0aW9uRnJvbU9hRGF0ZSgwKS5TaG91bGQoKS5CZShuZXcoMTg5OSwgMTIsIDMwLCAwLCAwLCAwKSk7CiAKLSAgICAgICAgc2hlZXQuQ2VsbHNbIkIzIl0uVmFsdWUuU2hvdWxkKCkuQmUobmV3IERhdGVUaW1lKDE4OTksIDEyLCAzMCwgMywgMTUsIDMwKSk7Ci0gICAgICAgIHNoZWV0LkNlbGxzWyJDMyJdLlZhbHVlLlNob3VsZCgpLkJlKG5ldyBEYXRlVGltZSgxODk5LCAxMiwgMzAsIDMsIDE1LCAwKSk7Ci0gICAgICAgIHNoZWV0LkNlbGxzWyJEMyJdLlZhbHVlLlNob3VsZCgpLkJlKDAuMTM1NDE2NjY2NjY2NjY2NjYpOwotICAgICAgICBzaGVldC5DZWxsc1siRTMiXS5WYWx1ZS5TaG91bGQoKS5CZShuZXcgRGF0ZVRpbWUoMTg5OSwgMTIsIDMwLCAzLCAxNSwgMzApKTsKLSAgICAgICAgc2hlZXQuQ2VsbHNbIkYzIl0uVmFsdWUuU2hvdWxkKCkuQmUoMC4xMzU3NjM4ODg4ODg4ODg4OCk7Ci0gICAgICAgIHNoZWV0LkNlbGxzWyJHMyJdLlZhbHVlLlNob3VsZCgpLkJlKDAuMTM1NDE2NjY2NjY2NjY2NjYpOwotICAgICAgICBzaGVldC5DZWxsc1siSDMiXS5WYWx1ZS5TaG91bGQoKS5CZShuZXcgRGF0ZVRpbWUoMTg5OSwgMTIsIDMwLCAzLCAxNSwgMzApKTsKLSAgICAgICAgCi0gICAgICAgIHNoZWV0LkNlbGxzWyJCNyJdLlZhbHVlLlNob3VsZCgpLkJlKG5ldyBEYXRlVGltZSgxODk5LCAxMiwgMzAsIDIzLCA1OSwgNTkpKTsKLSAgICAgICAgc2hlZXQuQ2VsbHNbIkM3Il0uVmFsdWUuU2hvdWxkKCkuQmUobmV3IERhdGVUaW1lKDE4OTksIDEyLCAzMCwgMjMsIDU5LCAwKSk7Ci0gICAgICAgIHNoZWV0LkNlbGxzWyJENyJdLlZhbHVlLlNob3VsZCgpLkJlKDAuOTk5MzA1NTU1NTU1NTU1Nik7Ci0gICAgICAgIHNoZWV0LkNlbGxzWyJFNyJdLlZhbHVlLlNob3VsZCgpLkJlKG5ldyBEYXRlVGltZSgxODk5LCAxMiwgMzAsIDIzLCA1OSwgNTkpKTsKLSAgICAgICAgc2hlZXQuQ2VsbHNbIkY3Il0uVmFsdWUuU2hvdWxkKCkuQmUoMC45OTk5ODg0MjU5MjU5MjYpOwotICAgICAgICBzaGVldC5DZWxsc1siRzciXS5WYWx1ZS5TaG91bGQoKS5CZSgwLjk5OTMwNTU1NTU1NTU1NTYpOwotICAgICAgICBzaGVldC5DZWxsc1siSDciXS5WYWx1ZS5TaG91bGQoKS5CZShuZXcgRGF0ZVRpbWUoMTg5OSwgMTIsIDMwLCAyMywgNTksIDU5KSk7Ci0gICAgfQorICAgIEV4Y2VsV29ya3NoZWV0LkluY29ycmVjdER1cmF0aW9uRnJvbU9hRGF0ZSgtMC4yNSkuU2hvdWxkKCkuQmUobmV3KDE4OTksIDEyLCAyOSwgMTgsIDAsIDApKTsKKyAgICBFeGNlbFdvcmtzaGVldC5JbmNvcnJlY3REdXJhdGlvbkZyb21PYURhdGUoLTAuNSkuU2hvdWxkKCkuQmUobmV3KDE4OTksIDEyLCAyOSwgMTIsIDAsIDApKTsKKyAgICBFeGNlbFdvcmtzaGVldC5JbmNvcnJlY3REdXJhdGlvbkZyb21PYURhdGUoLTAuNzUpLlNob3VsZCgpLkJlKG5ldygxODk5LCAxMiwgMjksIDYsIDAsIDApKTsKKyAgICBFeGNlbFdvcmtzaGVldC5JbmNvcnJlY3REdXJhdGlvbkZyb21PYURhdGUoLTEuNzUpLlNob3VsZCgpLkJlKG5ldygxODk5LCAxMiwgMjgsIDYsIDAsIDApKTsKKyAgICBFeGNlbFdvcmtzaGVldC5JbmNvcnJlY3REdXJhdGlvbkZyb21PYURhdGUoLTIuNzUpLlNob3VsZCgpLkJlKG5ldygxODk5LCAxMiwgMjcsIDYsIDAsIDApKTsKKyAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgc3RyaW5nIEdldFRlc3RXb3JrYm9va1BhdGgoc3RyaW5nIGZpbGVuYW1lKQotICAgIHsKLSAgICAgICAgdmFyIGFzc2VtYmx5UGF0aCA9IFBhdGguR2V0RGlyZWN0b3J5TmFtZSh0eXBlb2YoVGltZVRlc3QpLkFzc2VtYmx5LkxvY2F0aW9uKSE7Ci0gICAgICAgIHJldHVybiBQYXRoLkNvbWJpbmUoYXNzZW1ibHlQYXRoLCAiVGVzdFdvcmtib29rcyIsIGZpbGVuYW1lKTsKLSAgICB9CisgIFtUZXN0TWV0aG9kXQorICBwdWJsaWMgdm9pZCBUZXN0RGF0ZVBhcnNlKCkgeworICAgIHZhciBwYWNrYWdlID0gbmV3IEV4Y2VsUGFja2FnZShuZXcgRmlsZUluZm8oR2V0VGVzdFdvcmtib29rUGF0aCgiVGltZXMueGxzeCIpKSk7CisgICAgdmFyIHNoZWV0ID0gcGFja2FnZS5Xb3JrYm9vay5Xb3Jrc2hlZXRzLkZpcnN0KCk7CisKKyAgICBzaGVldC5DZWxsc1siQjMiXS5WYWx1ZS5TaG91bGQoKS5CZShuZXcgRGF0ZVRpbWUoMTg5OSwgMTIsIDMwLCAzLCAxNSwgMzApKTsKKyAgICBzaGVldC5DZWxsc1siQzMiXS5WYWx1ZS5TaG91bGQoKS5CZShuZXcgRGF0ZVRpbWUoMTg5OSwgMTIsIDMwLCAzLCAxNSwgMCkpOworICAgIHNoZWV0LkNlbGxzWyJEMyJdLlZhbHVlLlNob3VsZCgpLkJlKDAuMTM1NDE2NjY2NjY2NjY2NjYpOworICAgIHNoZWV0LkNlbGxzWyJFMyJdLlZhbHVlLlNob3VsZCgpLkJlKG5ldyBEYXRlVGltZSgxODk5LCAxMiwgMzAsIDMsIDE1LCAzMCkpOworICAgIHNoZWV0LkNlbGxzWyJGMyJdLlZhbHVlLlNob3VsZCgpLkJlKDAuMTM1NzYzODg4ODg4ODg4ODgpOworICAgIHNoZWV0LkNlbGxzWyJHMyJdLlZhbHVlLlNob3VsZCgpLkJlKDAuMTM1NDE2NjY2NjY2NjY2NjYpOworICAgIHNoZWV0LkNlbGxzWyJIMyJdLlZhbHVlLlNob3VsZCgpLkJlKG5ldyBEYXRlVGltZSgxODk5LCAxMiwgMzAsIDMsIDE1LCAzMCkpOworCisgICAgc2hlZXQuQ2VsbHNbIkI3Il0uVmFsdWUuU2hvdWxkKCkuQmUobmV3IERhdGVUaW1lKDE4OTksIDEyLCAzMCwgMjMsIDU5LCA1OSkpOworICAgIHNoZWV0LkNlbGxzWyJDNyJdLlZhbHVlLlNob3VsZCgpLkJlKG5ldyBEYXRlVGltZSgxODk5LCAxMiwgMzAsIDIzLCA1OSwgMCkpOworICAgIHNoZWV0LkNlbGxzWyJENyJdLlZhbHVlLlNob3VsZCgpLkJlKDAuOTk5MzA1NTU1NTU1NTU1Nik7CisgICAgc2hlZXQuQ2VsbHNbIkU3Il0uVmFsdWUuU2hvdWxkKCkuQmUobmV3IERhdGVUaW1lKDE4OTksIDEyLCAzMCwgMjMsIDU5LCA1OSkpOworICAgIHNoZWV0LkNlbGxzWyJGNyJdLlZhbHVlLlNob3VsZCgpLkJlKDAuOTk5OTg4NDI1OTI1OTI2KTsKKyAgICBzaGVldC5DZWxsc1siRzciXS5WYWx1ZS5TaG91bGQoKS5CZSgwLjk5OTMwNTU1NTU1NTU1NTYpOworICAgIHNoZWV0LkNlbGxzWyJINyJdLlZhbHVlLlNob3VsZCgpLkJlKG5ldyBEYXRlVGltZSgxODk5LCAxMiwgMzAsIDIzLCA1OSwgNTkpKTsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIHN0cmluZyBHZXRUZXN0V29ya2Jvb2tQYXRoKHN0cmluZyBmaWxlbmFtZSkgeworICAgIHZhciBhc3NlbWJseVBhdGggPSBQYXRoLkdldERpcmVjdG9yeU5hbWUodHlwZW9mKFRpbWVUZXN0KS5Bc3NlbWJseS5Mb2NhdGlvbikhOworICAgIHJldHVybiBQYXRoLkNvbWJpbmUoYXNzZW1ibHlQYXRoLCAiVGVzdFdvcmtib29rcyIsIGZpbGVuYW1lKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvZG90bmV0LWNzaGFycGllciBiL2RvdG5ldC1jc2hhcnBpZXIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjFiMjIwMAotLS0gL2Rldi9udWxsCisrKyBiL2RvdG5ldC1jc2hhcnBpZXIKQmluYXJ5IGZpbGVzIGRpZmZlcgo=